From cfca11a6289b6031a64ee856e0eb68db9c1d1293 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 27 Jun 2024 21:49:53 +0530 Subject: [PATCH 0001/1179] [mob][photos] Improve readability --- .../frameworks/onnx/onnx_image_encoder.dart | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index 5464507700..e101a34399 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -31,19 +31,19 @@ class OnnxImageEncoder { //Check the existence of imagePath locally final rgb = img.decodeImage(await File(args["imagePath"]).readAsBytes())!; - final int nx = rgb.width; - final int ny = rgb.height; - final int inputSize = 3 * nx * ny; + final int imageWidth = rgb.width; + final int imageHeight = rgb.height; + final int inputSize = 3 * imageWidth * imageHeight; final inputImage = List.filled(inputSize, 0.toDouble()); - const int nx2 = 224; - const int ny2 = 224; - const int totalSize = 3 * nx2 * ny2; + const int requiredWidth = 224; + const int requiredHeight = 224; + const int totalSize = 3 * requiredWidth * requiredHeight; // Load image into List inputImage - for (int y = 0; y < ny; y++) { - for (int x = 0; x < nx; x++) { - final int i = 3 * (y * nx + x); + for (int y = 0; y < imageHeight; y++) { + for (int x = 0; x < imageWidth; x++) { + final int i = 3 * (y * imageWidth + x); final pixel = rgb.getPixel(x, y); inputImage[i] = pixel.r.toDouble(); inputImage[i + 1] = pixel.g.toDouble(); @@ -52,49 +52,49 @@ class OnnxImageEncoder { } final result = List.filled(totalSize, 0.toDouble()); - final scale = max(nx, ny) / 224; + final invertedScale = max(imageWidth, imageHeight) / 224; - final int nx3 = (nx / scale + 0.5).toInt(); - final int ny3 = (ny / scale + 0.5).toInt(); + final int scaledWidth = (imageWidth / invertedScale + 0.5).toInt(); + final int scaledHeight = (imageHeight / invertedScale + 0.5).toInt(); final mean = [0.48145466, 0.4578275, 0.40821073]; final std = [0.26862954, 0.26130258, 0.27577711]; - for (int y = 0; y < ny3; y++) { - for (int x = 0; x < nx3; x++) { + for (int y = 0; y < scaledHeight; y++) { + for (int x = 0; x < scaledWidth; x++) { for (int c = 0; c < 3; c++) { //linear interpolation - final double sx = (x + 0.5) * scale - 0.5; - final double sy = (y + 0.5) * scale - 0.5; + final double scaledX = (x + 0.5) * invertedScale - 0.5; + final double scaledY = (y + 0.5) * invertedScale - 0.5; - final int x0 = max(0, sx.floor()); - final int y0 = max(0, sy.floor()); + final int x0 = max(0, scaledX.floor()); + final int y0 = max(0, scaledY.floor()); - final int x1 = min(x0 + 1, nx - 1); - final int y1 = min(y0 + 1, ny - 1); + final int x1 = min(x0 + 1, imageWidth - 1); + final int y1 = min(y0 + 1, imageHeight - 1); - final double dx = sx - x0; - final double dy = sy - y0; + final double dx = scaledX - x0; + final double dy = scaledY - y0; - final int j00 = 3 * (y0 * nx + x0) + c; - final int j01 = 3 * (y0 * nx + x1) + c; - final int j10 = 3 * (y1 * nx + x0) + c; - final int j11 = 3 * (y1 * nx + x1) + c; + final int j00 = 3 * (y0 * imageWidth + x0) + c; + final int j01 = 3 * (y0 * imageWidth + x1) + c; + final int j10 = 3 * (y1 * imageWidth + x0) + c; + final int j11 = 3 * (y1 * imageWidth + x1) + c; - final double v00 = inputImage[j00]; - final double v01 = inputImage[j01]; - final double v10 = inputImage[j10]; - final double v11 = inputImage[j11]; + final double pixel1 = inputImage[j00]; + final double pixel2 = inputImage[j01]; + final double pixel3 = inputImage[j10]; + final double pixel4 = inputImage[j11]; - final double v0 = v00 * (1 - dx) + v01 * dx; - final double v1 = v10 * (1 - dx) + v11 * dx; + final double v0 = pixel1 * (1 - dx) + pixel2 * dx; + final double v1 = pixel3 * (1 - dx) + pixel4 * dx; final double v = v0 * (1 - dy) + v1 * dy; final int v2 = min(max(v.round(), 0), 255); // createTensorWithDataList is dump compared to reshape and hence has to be given with one channel after another - final int i = (y * nx3 + x) + (c % 3) * 224 * 224; + final int i = (y * scaledWidth + x) + (c % 3) * 224 * 224; // TODO: is the use of scaledWidth here intentional, or is it a mistake to not use requiredWidth? result[i] = ((v2 / 255) - mean[c]) / std[c]; } From a16bf196b3ca4d05db432a3aef11a1f075504790 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 15:43:41 +0530 Subject: [PATCH 0002/1179] [mob][photos] Temporarily turn off clip embedding sync --- .../machine_learning/semantic_search/embedding_store.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index 485e1f2c91..8797667d8b 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -34,6 +34,7 @@ class EmbeddingStore { } Future pullEmbeddings(Model model) async { + return true; // TODO: remove this if (_remoteSyncStatus != null) { return _remoteSyncStatus!.future; } @@ -57,6 +58,7 @@ class EmbeddingStore { } Future pushEmbeddings() async { + return; // TODO: remove this final pendingItems = await EmbeddingsDB.instance.getUnsyncedEmbeddings(); final fileMap = await FilesDB.instance .getFilesFromIDs(pendingItems.map((e) => e.fileID).toList()); @@ -81,7 +83,7 @@ class EmbeddingStore { Future storeEmbedding(EnteFile file, Embedding embedding) async { await EmbeddingsDB.instance.put(embedding); - unawaited(_pushEmbedding(file, embedding)); + // unawaited(_pushEmbedding(file, embedding)); // TODO: uncomment this } Future clearEmbeddings(Model model) async { @@ -174,7 +176,7 @@ class EmbeddingStore { inputs.add(input); } final embeddings = await _computer.compute( - decodeEmbeddings, + _decodeEmbeddings, param: { "inputs": inputs, }, @@ -189,7 +191,7 @@ class EmbeddingStore { } } -Future> decodeEmbeddings(Map args) async { +Future> _decodeEmbeddings(Map args) async { final embeddings = []; final inputs = args["inputs"] as List; From 06774aeb611cbc85d0f6922ea9ce93e469610718 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 15:53:48 +0530 Subject: [PATCH 0003/1179] [mob][photos] Fix stupid error --- .../semantic_search/frameworks/onnx/onnx_image_encoder.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index e101a34399..c750ad461d 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -93,8 +93,7 @@ class OnnxImageEncoder { final int v2 = min(max(v.round(), 0), 255); - // createTensorWithDataList is dump compared to reshape and hence has to be given with one channel after another - final int i = (y * scaledWidth + x) + (c % 3) * 224 * 224; // TODO: is the use of scaledWidth here intentional, or is it a mistake to not use requiredWidth? + final int i = (y * requiredWidth + x) + c * 224 * 224; result[i] = ((v2 / 255) - mean[c]) / std[c]; } From f03cea7252ea33e4e090f9b8062bcafb9d0aa783 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 15:56:27 +0530 Subject: [PATCH 0004/1179] [mob][photos] Inline --- .../semantic_search/frameworks/onnx/onnx_image_encoder.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index c750ad461d..460fcc8597 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -27,8 +27,6 @@ class OnnxImageEncoder { } Future> inferByImage(Map args) async { - final runOptions = OrtRunOptions(); - //Check the existence of imagePath locally final rgb = img.decodeImage(await File(args["imagePath"]).readAsBytes())!; final int imageWidth = rgb.width; @@ -105,6 +103,7 @@ class OnnxImageEncoder { OrtValueTensor.createTensorWithDataList(floatList, [1, 3, 224, 224]); final inputs = {'input': inputOrt}; final session = OrtSession.fromAddress(args["address"]); + final runOptions = OrtRunOptions(); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; From d7e1b737d839ee0cf23ab972d133abb5e21b7fa8 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:20:35 +0530 Subject: [PATCH 0005/1179] [mob][photos] Use existing image utils for clip preprocessing --- .../frameworks/onnx/onnx_image_encoder.dart | 78 ++----------------- mobile/lib/utils/image_ml_util.dart | 48 +++++++++++- 2 files changed, 52 insertions(+), 74 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index 460fcc8597..8988913e3b 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -2,9 +2,9 @@ import "dart:io"; import "dart:math"; import "dart:typed_data"; -import 'package:image/image.dart' as img; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/utils/image_ml_util.dart"; class OnnxImageEncoder { final _logger = Logger("OnnxImageEncoder"); @@ -27,80 +27,14 @@ class OnnxImageEncoder { } Future> inferByImage(Map args) async { - final rgb = img.decodeImage(await File(args["imagePath"]).readAsBytes())!; + final imageData = await File(args["imagePath"]).readAsBytes(); + final image = await decodeImageFromData(imageData); + final ByteData imgByteData = await getByteDataFromImage(image); - final int imageWidth = rgb.width; - final int imageHeight = rgb.height; - final int inputSize = 3 * imageWidth * imageHeight; - final inputImage = List.filled(inputSize, 0.toDouble()); - - const int requiredWidth = 224; - const int requiredHeight = 224; - const int totalSize = 3 * requiredWidth * requiredHeight; - - // Load image into List inputImage - for (int y = 0; y < imageHeight; y++) { - for (int x = 0; x < imageWidth; x++) { - final int i = 3 * (y * imageWidth + x); - final pixel = rgb.getPixel(x, y); - inputImage[i] = pixel.r.toDouble(); - inputImage[i + 1] = pixel.g.toDouble(); - inputImage[i + 2] = pixel.b.toDouble(); - } - } - - final result = List.filled(totalSize, 0.toDouble()); - final invertedScale = max(imageWidth, imageHeight) / 224; - - final int scaledWidth = (imageWidth / invertedScale + 0.5).toInt(); - final int scaledHeight = (imageHeight / invertedScale + 0.5).toInt(); - - final mean = [0.48145466, 0.4578275, 0.40821073]; - final std = [0.26862954, 0.26130258, 0.27577711]; - - for (int y = 0; y < scaledHeight; y++) { - for (int x = 0; x < scaledWidth; x++) { - for (int c = 0; c < 3; c++) { - //linear interpolation - final double scaledX = (x + 0.5) * invertedScale - 0.5; - final double scaledY = (y + 0.5) * invertedScale - 0.5; - - final int x0 = max(0, scaledX.floor()); - final int y0 = max(0, scaledY.floor()); - - final int x1 = min(x0 + 1, imageWidth - 1); - final int y1 = min(y0 + 1, imageHeight - 1); - - final double dx = scaledX - x0; - final double dy = scaledY - y0; - - final int j00 = 3 * (y0 * imageWidth + x0) + c; - final int j01 = 3 * (y0 * imageWidth + x1) + c; - final int j10 = 3 * (y1 * imageWidth + x0) + c; - final int j11 = 3 * (y1 * imageWidth + x1) + c; - - final double pixel1 = inputImage[j00]; - final double pixel2 = inputImage[j01]; - final double pixel3 = inputImage[j10]; - final double pixel4 = inputImage[j11]; - - final double v0 = pixel1 * (1 - dx) + pixel2 * dx; - final double v1 = pixel3 * (1 - dx) + pixel4 * dx; - - final double v = v0 * (1 - dy) + v1 * dy; - - final int v2 = min(max(v.round(), 0), 255); - - final int i = (y * requiredWidth + x) + c * 224 * 224; - - result[i] = ((v2 / 255) - mean[c]) / std[c]; - } - } - } - final floatList = Float32List.fromList(result); + final inputList = await preprocessImageClip(image, imgByteData); final inputOrt = - OrtValueTensor.createTensorWithDataList(floatList, [1, 3, 224, 224]); + OrtValueTensor.createTensorWithDataList(inputList, [1, 3, 224, 224]); final inputs = {'input': inputOrt}; final session = OrtSession.fromAddress(args["address"]); final runOptions = OrtRunOptions(); diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 8438e5ef72..1e7133bdbd 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -193,6 +193,48 @@ Future<(Float32List, Dimensions, Dimensions)> ); } +Future preprocessImageClip( + Image image, + ByteData imgByteData, +) async { + const int requiredWidth = 224; + const int requiredHeight = 224; + const int requiredSize = 3 * requiredWidth * requiredHeight; + const mean = [0.48145466, 0.4578275, 0.40821073]; + const std = [0.26862954, 0.26130258, 0.27577711]; + + final scale = min(requiredWidth / image.width, requiredHeight / image.height); + final scaledWidth = (image.width * scale).round().clamp(0, requiredWidth); + final scaledHeight = (image.height * scale).round().clamp(0, requiredHeight); + + final processedBytes = Float32List(requiredSize); + final buffer = Float32List.view(processedBytes.buffer); + int pixelIndex = 0; + const int greenOff = requiredHeight * requiredWidth; + const int blueOff = 2 * requiredHeight * requiredWidth; + for (var h = 0; h < requiredHeight; h++) { + for (var w = 0; w < requiredWidth; w++) { + late Color pixel; + if (w >= scaledWidth || h >= scaledHeight) { + pixel = const Color.fromRGBO(114, 114, 114, 1.0); + } else { + pixel = _getPixelBicubic( + w / scale, + h / scale, + image, + imgByteData, + ); + } + buffer[pixelIndex] = ((pixel.red / 255) - mean[0]) / std[0]; + buffer[pixelIndex + greenOff] = ((pixel.green / 255) - mean[1]) / std[1]; + buffer[pixelIndex + blueOff] = ((pixel.blue / 255) - mean[2]) / std[2]; + pixelIndex++; + } + } + + return processedBytes; +} + Future<(Float32List, List, List, List, Size)> preprocessToMobileFaceNetFloat32List( Image image, @@ -225,7 +267,9 @@ Future<(Float32List, List, List, List, Size)> SimilarityTransform.estimate(face.allKeypoints); if (!correctlyEstimated) { log('Face alignment failed because not able to estimate SimilarityTransform, for face: $face'); - throw Exception('Face alignment failed because not able to estimate SimilarityTransform'); + throw Exception( + 'Face alignment failed because not able to estimate SimilarityTransform', + ); } alignmentResults.add(alignmentResult); @@ -639,4 +683,4 @@ Color _getPixelBicubic(num fx, num fy, Image image, ByteData byteDataRgba) { // final c3 = cubic(dy, ip3, ic3, in3, ia3); return Color.fromRGBO(c0, c1, c2, 1.0); -} \ No newline at end of file +} From 21483eacb46393110455254acbb71adfeacb4b99 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:22:33 +0530 Subject: [PATCH 0006/1179] [mob][photos] Remove computer for clip for now --- .../semantic_search/frameworks/onnx/onnx.dart | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index 56b53df719..95fc4b0d90 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -71,14 +71,10 @@ class ONNX extends MLFramework { Future> getImageEmbedding(String imagePath) async { try { final startTime = DateTime.now(); - final result = await _computer.compute( - _clipImage.inferByImage, - param: { - "imagePath": imagePath, - "address": _imageEncoderAddress, - }, - taskName: "createImageEmbedding", - ) as List; + final result = await _clipImage.inferByImage({ // TODO: add computer back later + "imagePath": imagePath, + "address": _imageEncoderAddress, + }); final endTime = DateTime.now(); _logger.info( "createImageEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", From 393ed91e86cfd9f18aef54ab5b13e05d4218be2f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:27:52 +0530 Subject: [PATCH 0007/1179] [mob][photos] Use centercrop instead of empty pixels --- mobile/lib/utils/image_ml_util.dart | 31 +++++++++++++---------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 1e7133bdbd..9d2f13d95d 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -1,6 +1,6 @@ import "dart:async"; import "dart:developer" show log; -import "dart:math" show min; +import "dart:math" show max, min; import "dart:typed_data" show Float32List, Uint8List, ByteData; import "dart:ui"; @@ -203,28 +203,25 @@ Future preprocessImageClip( const mean = [0.48145466, 0.4578275, 0.40821073]; const std = [0.26862954, 0.26130258, 0.27577711]; - final scale = min(requiredWidth / image.width, requiredHeight / image.height); - final scaledWidth = (image.width * scale).round().clamp(0, requiredWidth); - final scaledHeight = (image.height * scale).round().clamp(0, requiredHeight); + final scale = max(requiredWidth / image.width, requiredHeight / image.height); + final scaledWidth = (image.width * scale).round(); + final scaledHeight = (image.height * scale).round(); + final widthOffset = max(0, scaledWidth - requiredWidth) / 2; + final heightOffset = max(0, scaledHeight - requiredHeight) / 2; final processedBytes = Float32List(requiredSize); final buffer = Float32List.view(processedBytes.buffer); int pixelIndex = 0; const int greenOff = requiredHeight * requiredWidth; const int blueOff = 2 * requiredHeight * requiredWidth; - for (var h = 0; h < requiredHeight; h++) { - for (var w = 0; w < requiredWidth; w++) { - late Color pixel; - if (w >= scaledWidth || h >= scaledHeight) { - pixel = const Color.fromRGBO(114, 114, 114, 1.0); - } else { - pixel = _getPixelBicubic( - w / scale, - h / scale, - image, - imgByteData, - ); - } + for (var h = 0 + heightOffset; h < scaledHeight - heightOffset; h++) { + for (var w = 0 + widthOffset; w < scaledWidth - widthOffset; w++) { + final Color pixel = _getPixelBicubic( + w / scale, + h / scale, + image, + imgByteData, + ); buffer[pixelIndex] = ((pixel.red / 255) - mean[0]) / std[0]; buffer[pixelIndex + greenOff] = ((pixel.green / 255) - mean[1]) / std[1]; buffer[pixelIndex + blueOff] = ((pixel.blue / 255) - mean[2]) / std[2]; From 8381598944240c721d55db757dcf3d03c08d7776 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:47:50 +0530 Subject: [PATCH 0008/1179] [mob][photos] Refactor getting file path --- .../face_ml/face_ml_service.dart | 82 +---------------- mobile/lib/utils/ml_util.dart | 88 ++++++++++++++++++- 2 files changed, 88 insertions(+), 82 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 99172153b5..62cf99a252 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -9,7 +9,6 @@ import "dart:ui" show Image; import "package:computer/computer.dart"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:flutter/foundation.dart" show debugPrint, kDebugMode; -import "package:flutter/services.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:package_info_plus/package_info_plus.dart"; @@ -42,15 +41,12 @@ import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; import "package:photos/services/search_service.dart"; -import "package:photos/utils/file_util.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; +import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; -import "package:photos/utils/thumbnail_util.dart"; import "package:synchronized/synchronized.dart"; -enum FileDataForML { thumbnailData, fileData } - enum FaceMlOperation { analyzeImage } /// This class is responsible for running the full face ml pipeline on images. @@ -836,15 +832,8 @@ class FaceMlService { Future _analyzeImageInSingleIsolate(EnteFile enteFile) async { _checkEnteFileForID(enteFile); - final String? filePath = - await _getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); - - if (filePath == null) { - _logger.warning( - "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null", - ); - throw CouldNotRetrieveAnyFileData(); - } + final String filePath = + await getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); final Stopwatch stopwatch = Stopwatch()..start(); late FaceMlResult result; @@ -975,71 +964,6 @@ class FaceMlService { } } - Future _getImagePathForML( - EnteFile enteFile, { - FileDataForML typeOfData = FileDataForML.fileData, - }) async { - String? imagePath; - - switch (typeOfData) { - case FileDataForML.fileData: - final stopwatch = Stopwatch()..start(); - File? file; - if (enteFile.fileType == FileType.video) { - try { - file = await getThumbnailForUploadedFile(enteFile); - } on PlatformException catch (e, s) { - _logger.severe( - "Could not get thumbnail for $enteFile due to PlatformException", - e, - s, - ); - throw ThumbnailRetrievalException(e.toString(), s); - } - } else { - try { - file = await getFile(enteFile, isOrigin: true); - } catch (e, s) { - _logger.severe( - "Could not get file for $enteFile", - e, - s, - ); - } - } - if (file == null) { - _logger.warning( - "Could not get file for $enteFile of type ${enteFile.fileType.toString()}", - ); - imagePath = null; - break; - } - imagePath = file.path; - stopwatch.stop(); - _logger.info( - "Getting file data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", - ); - break; - - case FileDataForML.thumbnailData: - final stopwatch = Stopwatch()..start(); - final File? thumbnail = await getThumbnailForUploadedFile(enteFile); - if (thumbnail == null) { - _logger.warning("Could not get thumbnail for $enteFile"); - imagePath = null; - break; - } - imagePath = thumbnail.path; - stopwatch.stop(); - _logger.info( - "Getting thumbnail data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", - ); - break; - } - - return imagePath; - } - /// Detects faces in the given image data. /// /// `imageData`: The image data to analyze. diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 4033e29349..f440d6868f 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,7 +1,89 @@ +import "dart:io" show File; + +import "package:flutter/services.dart" show PlatformException; +import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/models/file/file.dart"; +import "package:photos/models/file/file_type.dart"; +import "package:photos/services/machine_learning/ml_exceptions.dart"; +import "package:photos/utils/file_util.dart"; +import "package:photos/utils/thumbnail_util.dart"; + +final _logger = Logger("MlUtil"); + +enum FileDataForML { thumbnailData, fileData } Future> getIndexableFileIDs() async { - return FilesDB.instance - .getOwnedFileIDs(Configuration.instance.getUserID()!); - } \ No newline at end of file + return FilesDB.instance.getOwnedFileIDs(Configuration.instance.getUserID()!); +} + +Future getImagePathForML( + EnteFile enteFile, { + FileDataForML typeOfData = FileDataForML.fileData, +}) async { + String? imagePath; + + switch (typeOfData) { + case FileDataForML.fileData: + final stopwatch = Stopwatch()..start(); + File? file; + if (enteFile.fileType == FileType.video) { + try { + file = await getThumbnailForUploadedFile(enteFile); + } on PlatformException catch (e, s) { + _logger.severe( + "Could not get thumbnail for $enteFile due to PlatformException", + e, + s, + ); + throw ThumbnailRetrievalException(e.toString(), s); + } + } else { + try { + file = await getFile(enteFile, isOrigin: true); + } catch (e, s) { + _logger.severe( + "Could not get file for $enteFile", + e, + s, + ); + } + } + if (file == null) { + _logger.warning( + "Could not get file for $enteFile of type ${enteFile.fileType.toString()}", + ); + break; + } + imagePath = file.path; + stopwatch.stop(); + _logger.info( + "Getting file data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", + ); + break; + + case FileDataForML.thumbnailData: + final stopwatch = Stopwatch()..start(); + final File? thumbnail = await getThumbnailForUploadedFile(enteFile); + if (thumbnail == null) { + _logger.warning("Could not get thumbnail for $enteFile"); + break; + } + imagePath = thumbnail.path; + stopwatch.stop(); + _logger.info( + "Getting thumbnail data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", + ); + break; + } + + if (imagePath == null) { + _logger.warning( + "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null", + ); + throw CouldNotRetrieveAnyFileData(); + } + + return imagePath; +} From 63b55f275927417ffaf2c30f112b2468884194c9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:49:28 +0530 Subject: [PATCH 0009/1179] [mob][photos] Make clip use full file --- .../semantic_search_service.dart | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 44fc961f3f..b7143b70bd 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -25,7 +25,7 @@ import "package:photos/utils/debouncer.dart"; import "package:photos/utils/device_info.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; -import "package:photos/utils/thumbnail_util.dart"; +// import "package:photos/utils/thumbnail_util.dart"; class SemanticSearchService { SemanticSearchService._privateConstructor(); @@ -355,12 +355,16 @@ class SemanticSearchService { await _mlController.future; } try { - final thumbnail = await getThumbnailForUploadedFile(file); - if (thumbnail == null) { - _logger.warning("Could not get thumbnail for $file"); - return; - } - final filePath = thumbnail.path; + // TODO: revert this later + // final thumbnail = await getThumbnailForUploadedFile(file); + // if (thumbnail == null) { + // _logger.warning("Could not get thumbnail for $file"); + // return; + // } + // final filePath = thumbnail.path; + final filePath = + await getImagePathForML(file, typeOfData: FileDataForML.fileData); + _logger.info("Running clip over $file"); final result = await _mlFramework.getImageEmbedding(filePath); if (result.length != kEmbeddingLength) { From 9610abadbeb2d13f49379c8e7cff24a746b019de Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 28 Jun 2024 18:51:32 +0530 Subject: [PATCH 0010/1179] [mob][photos] Use unquantized text encoder for clip --- .../semantic_search/frameworks/onnx/onnx.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index 95fc4b0d90..81d1df75f4 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -8,7 +8,8 @@ import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx class ONNX extends MLFramework { static const kModelBucketEndpoint = "https://models.ente.io/"; static const kImageModel = "clip-image-vit-32-float32.onnx"; - static const kTextModel = "clip-text-vit-32-uint8.onnx"; + // static const kTextModel = "clip-text-vit-32-uint8.onnx"; // TODO: check later whether to revert back or not + static const kTextModel = "clip-text-vit-32-float32-int32.onnx"; final _computer = Computer.shared(); final _logger = Logger("ONNX"); @@ -71,7 +72,8 @@ class ONNX extends MLFramework { Future> getImageEmbedding(String imagePath) async { try { final startTime = DateTime.now(); - final result = await _clipImage.inferByImage({ // TODO: add computer back later + final result = await _clipImage.inferByImage({ + // TODO: add computer back later "imagePath": imagePath, "address": _imageEncoderAddress, }); From 9b41180b2d65ebd8dfdfc759132d333b16936bf6 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 12:13:41 +0530 Subject: [PATCH 0011/1179] [mob][photos] Run clip in separate isolate --- .../semantic_search/frameworks/onnx/onnx.dart | 11 +++++---- .../frameworks/onnx/onnx_image_encoder.dart | 2 +- mobile/lib/utils/image_isolate.dart | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index 81d1df75f4..a1258edbfb 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -4,6 +4,7 @@ import "package:onnxruntime/onnxruntime.dart"; import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart'; import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart'; +import "package:photos/utils/image_isolate.dart"; class ONNX extends MLFramework { static const kModelBucketEndpoint = "https://models.ente.io/"; @@ -72,11 +73,11 @@ class ONNX extends MLFramework { Future> getImageEmbedding(String imagePath) async { try { final startTime = DateTime.now(); - final result = await _clipImage.inferByImage({ - // TODO: add computer back later - "imagePath": imagePath, - "address": _imageEncoderAddress, - }); + // TODO: properly integrate with other ml later (FaceMlService) + final result = await ImageIsolate.instance.inferClipImageEmbedding( + imagePath, + _imageEncoderAddress, + ); final endTime = DateTime.now(); _logger.info( "createImageEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index 8988913e3b..f4fe9c4c0f 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -26,7 +26,7 @@ class OnnxImageEncoder { return -1; } - Future> inferByImage(Map args) async { + static Future> inferByImage(Map args) async { final imageData = await File(args["imagePath"]).readAsBytes(); final image = await decodeImageFromData(imageData); final ByteData imgByteData = await getByteDataFromImage(image); diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/utils/image_isolate.dart index 9ebad2bb94..ce67c9fa9f 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/utils/image_isolate.dart @@ -6,11 +6,13 @@ import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:logging/logging.dart"; import "package:photos/face/model/box.dart"; +import "package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:synchronized/synchronized.dart"; enum ImageOperation { generateFaceThumbnails, + clip, } class ImageIsolate { @@ -88,6 +90,15 @@ class ImageIsolate { faceBoxes, ); sendPort.send(List.from(results)); + case ImageOperation.clip: + final imagePath = args['imagePath'] as String; + final address = args['address'] as int; + final result = await OnnxImageEncoder.inferByImage({ + 'imagePath': imagePath, + 'address': address, + }); + sendPort.send(List.from(result)); + break; } } catch (e, stackTrace) { sendPort @@ -175,4 +186,16 @@ class ImageIsolate { ), ).then((value) => value.cast()); } + + Future> inferClipImageEmbedding(String imagePath, int encoderAddress) async { + return await _runInIsolate( + ( + ImageOperation.clip, + { + 'imagePath': imagePath, + 'address': encoderAddress, + }, + ), + ).then((value) => value.cast()); + } } From f75b8b99500c90596da4de640a56ed792d2bb763 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 12:14:58 +0530 Subject: [PATCH 0012/1179] [mob][photos] Logging --- .../machine_learning/semantic_search/frameworks/onnx/onnx.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index a1258edbfb..ee69d7ecff 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -71,6 +71,7 @@ class ONNX extends MLFramework { @override Future> getImageEmbedding(String imagePath) async { + _logger.info('getImageEmbedding called'); try { final startTime = DateTime.now(); // TODO: properly integrate with other ml later (FaceMlService) @@ -80,7 +81,7 @@ class ONNX extends MLFramework { ); final endTime = DateTime.now(); _logger.info( - "createImageEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", + "getImageEmbedding done in ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", ); return result; } catch (e, s) { From 9f1ed1636433b139a59c2975a8b612860822df56 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 13:54:58 +0530 Subject: [PATCH 0013/1179] [mob][photos] Rename score to similarity for clarity --- .../semantic_search_service.dart | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index b7143b70bd..7d9844ec7e 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -36,7 +36,7 @@ class SemanticSearchService { static final LRUMap> _queryCache = LRUMap(20); static const kEmbeddingLength = 512; - static const kScoreThreshold = 0.23; + static const kMinimumSimilarityThreshold = 0.23; static const kShouldPushEmbeddings = true; static const kDebounceDuration = Duration(milliseconds: 4000); @@ -237,7 +237,7 @@ class SemanticSearchService { final textEmbedding = await _getTextEmbedding(query); final queryResults = - await _getScores(textEmbedding, scoreThreshold: scoreThreshold); + await _getSimilarities(textEmbedding, minimumSimilarity: scoreThreshold); final filesMap = await FilesDB.instance .getFilesFromIDs(queryResults.map((e) => e.id).toList()); @@ -267,11 +267,11 @@ class SemanticSearchService { return results; } - Future> getMatchingFileIDs(String query, double minScore) async { + Future> getMatchingFileIDs(String query, double minimumSimilarity) async { final textEmbedding = await _getTextEmbedding(query); final queryResults = - await _getScores(textEmbedding, scoreThreshold: minScore); + await _getSimilarities(textEmbedding, minimumSimilarity: minimumSimilarity); final queryResultIds = []; for (QueryResult result in queryResults) { @@ -417,17 +417,17 @@ class SemanticSearchService { } } - Future> _getScores( + Future> _getSimilarities( List textEmbedding, { - double? scoreThreshold, + double? minimumSimilarity, }) async { final startTime = DateTime.now(); final List queryResults = await _computer.compute( - computeBulkScore, + computeBulkSimilarities, param: { "imageEmbeddings": _cachedEmbeddings, "textEmbedding": textEmbedding, - "scoreThreshold": scoreThreshold, + "minimumSimilarity": minimumSimilarity, }, taskName: "computeBulkScore", ); @@ -464,18 +464,18 @@ class SemanticSearchService { } } -List computeBulkScore(Map args) { +List computeBulkSimilarities(Map args) { final queryResults = []; final imageEmbeddings = args["imageEmbeddings"] as List; final textEmbedding = args["textEmbedding"] as List; - final scoreThreshold = - args["scoreThreshold"] ?? SemanticSearchService.kScoreThreshold; + final minimumSimilarity = args["minimumSimilarity"] ?? + SemanticSearchService.kMinimumSimilarityThreshold; for (final imageEmbedding in imageEmbeddings) { - final score = computeScore( + final score = computeCosineSimilarity( imageEmbedding.embedding, textEmbedding, ); - if (score >= scoreThreshold) { + if (score >= minimumSimilarity) { queryResults.add(QueryResult(imageEmbedding.fileID, score)); } } @@ -484,17 +484,17 @@ List computeBulkScore(Map args) { return queryResults; } -double computeScore(List imageEmbedding, List textEmbedding) { +double computeCosineSimilarity(List imageEmbedding, List textEmbedding) { assert( imageEmbedding.length == textEmbedding.length, "The two embeddings should have the same length", ); - double score = 0; + double cosineSimilarity = 0; final length = imageEmbedding.length; for (int index = 0; index < length; index++) { - score += imageEmbedding[index] * textEmbedding[index]; + cosineSimilarity += imageEmbedding[index] * textEmbedding[index]; } - return score; + return cosineSimilarity; } class QueryResult { From 4764fddd61c0715f626df292022520ab6d881858 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 14:49:11 +0530 Subject: [PATCH 0014/1179] [mob][photos] Get tokenizer from remote instead of assets --- .../models/clip/bpe_simple_vocab_16e6.txt | 262145 --------------- .../semantic_search/frameworks/onnx/onnx.dart | 3 +- .../frameworks/onnx/onnx_text_encoder.dart | 9 +- 3 files changed, 7 insertions(+), 262150 deletions(-) delete mode 100644 mobile/assets/models/clip/bpe_simple_vocab_16e6.txt diff --git a/mobile/assets/models/clip/bpe_simple_vocab_16e6.txt b/mobile/assets/models/clip/bpe_simple_vocab_16e6.txt deleted file mode 100644 index aff3ec8f3d..0000000000 --- a/mobile/assets/models/clip/bpe_simple_vocab_16e6.txt +++ /dev/null @@ -1,262145 +0,0 @@ -"bpe_simple_vocab_16e6.txt#version: 0.2 -i n -t h -a n -r e -a r -e r -th e -in g -o u -o n -s t -o r -e n -o n -a l -a t -e r -i t -i n -t o -r o -i s -l e -i c -a t -an d -e d -o f -c h -o r -e s -i l -e l -s t -a c -o m -a m -l o -a n -a y -s h -r i -l i -t i -f or -n e -ð Ł -r a -h a -d e -o l -v e -s i -u r -a l -s e -' s -u n -d i -b e -l a -w h -o o -d ay -e n -m a -n o -l e -t o -ou r -i r -g h -w it -i t -y o -a s -s p -th is -t s -at i -yo u -wit h -a d -i s -a b -l y -w e -th e -t e -a s -a g -v i -p p -s u -h o -m y -. . -b u -c om -s e -er s -m e -m e -al l -c on -m o -k e -g e -ou t -en t -c o -f e -v er -a r -f ro -a u -p o -c e -gh t -ar e -s s -fro m -c h -t r -ou n -on e -b y -d o -t h -w or -er e -k e -p ro -f or -d s -b o -t a -w e -g o -h e -t er -in g -d e -b e -ati on -m or -a y -e x -il l -p e -k s -s c -l u -f u -q u -v er -ðŁ ĺ -j u -m u -at e -an d -v e -k ing -m ar -o p -h i -.. . -p re -a d -r u -th at -j o -o f -c e -ne w -a m -a p -g re -s s -d u -no w -y e -t ing -y our -it y -n i -c i -p ar -g u -f i -a f -p er -t er -u p -s o -g i -on s -g r -g e -b r -p l -' t -m i -in e -we e -b i -u s -sh o -ha ve -to day -a v -m an -en t -ac k -ur e -ou r -â Ģ -c u -l d -lo o -i m -ic e -s om -f in -re d -re n -oo d -w as -ti on -p i -i r -th er -t y -p h -ar d -e c -! ! -m on -mor e -w ill -t ra -c an -c ol -p u -t e -w n -m b -s o -it i -ju st -n ing -h ere -t u -p a -p r -bu t -wh at -al ly -f ir -m in -c a -an t -s a -t ed -e v -m ent -f a -ge t -am e -ab out -g ra -no t -ha pp -ay s -m an -h is -ti me -li ke -g h -ha s -th an -lo ve -ar t -st e -d ing -h e -c re -w s -w at -d er -it e -s er -ac e -ag e -en d -st r -a w -st or -r e -c ar -el l -al l -p s -f ri -p ho -p or -d o -a k -w i -f re -wh o -sh i -b oo -s on -el l -wh en -il l -ho w -gre at -w in -e l -b l -s si -al i -som e -ðŁ Ĵ -t on -d er -le s -p la -ï ¸ -e d -s ch -h u -on g -d on -k i -s h -an n -c or -. . -oun d -a z -in e -ar y -fu l -st u -ou ld -st i -g o -se e -ab le -ar s -l l -m is -b er -c k -w a -en ts -n o -si g -f e -fir st -e t -sp e -ac k -i f -ou s -' m -st er -a pp -an g -an ce -an s -g ood -b re -e ver -the y -t ic -com e -of f -b ack -as e -ing s -ol d -i ght -f o -h er -happ y -p ic -it s -v ing -u s -m at -h om -d y -e m -s k -y ing -the ir -le d -r y -u l -h ar -c k -t on -on al -h el -r ic -b ir -vi e -w ay -t ri -d a -p le -b ro -st o -oo l -ni ght -tr u -b a -re ad -re s -ye ar -f r -t or -al s -c oun -c la -t ure -v el -at ed -le c -en d -th ing -v o -ic i -be st -c an -wor k -la st -af ter -en ce -p ri -p e -e s -i l -âĢ ¦ -d re -y s -o ver -i es -ðŁ ij -com m -t w -in k -s un -c l -li fe -t t -a ch -l and -s y -t re -t al -p ol -s m -du c -s al -f t -' re -ch e -w ar -t ur -ati ons -ac h -m s -il e -p m -ou gh -at e -st ar -wee k -! !! -c lu -th ere -n er -t om -s el -ï¸ ı -wor ld -v es -c am -go t -in ter -of f -u m -ton ight -o ther -h ou -loo k -j e -i d -si on -be au -at t -el i -or t -re c -f f -st er -su pp -g en -be en -il y -te am -m m -i c -pe op -it t -at s -on ly -mb er -en g -b ri -m p -k now -b ur -b ar -in s -lo w -sh e -ro w -â Ŀ -t ro -peop le -vi a -lo w -ag a -be t -x t -f ac -ch ar -e ar -w al -s en -f am -b le -n ati -is h -n or -g ame -li ve -s co -le y -d on -ic k -b all -ver y -the se -p an -i a -at ing -c r -a re -g ir -ma ke -st re -sho w -. " -f l -u p -d r -than ks -il li -w om -st s -i g -s ur -ever y -c ur -vie w -le t -in to -mo st -n a -in di -g ar -ha d -s ou -v ed -an t -iti on -ma de -f ol -un i -it ed -ðŁ ı -ic al -th r -read y -ch ec -d ra -k es -boo k -e p -si c -mor ning -ne ws -c au -c t -w ell -an c -pho to -th an -or s -bir th -g g -ou t -ne xt -som e -en ing -stor y -ch ri -do wn -hom e -f fe -fre e -d a -b or -f il -ci al -than k -si de -le ar -qu e -l ine -t en -at es -ye ars -m y -pho to -beau ti -ri ght -n u -for m -shi p -b an -th er -d ays -g am -as on -g y -ðŁ İ -birth day -se t -ic k -e t -st ill -com ing -ta ke -ðŁ ĩ -b b -s ol -s on -d en -e p -mu sic -the m -de n -wh y -f oo -c ra -am az -w n -h ol -t ting -w r -u e -ma g -c ro -l an -c lo -b ra -a k -s ing -c al -re ad -' ve -jo h -b ab -d ri -b lo -bi g -er ic -in t -t or -tr y -l a -le g -hou se -m ic -v al -beauti ful -l itt -chec k -ne w -ver s -s w -ar i -pla y -h er -âĢ ĵ -w in -m a -con gr -sch ool -f un -. @ -he al -ic h -d el -wh ere -l on -ke t -tw o -mu ch -wat ch -v en -d ed -a st -k ed -b as -go ing -m p -e ver -w ays -ro o -de sig -l y -s ed -to p -l in -ch an -to o -it ing -d ent -gh ts -t y -sp o -ne ed -b lu -in st -be ing -âĿ ¤ -w el -l s -hi m -m ay -st ing -n a -el y -litt le -g a -n at -tom or -m c -h on -w ant -a ir -pi c -am eric -p er -le ss -wee k -ve l -a h -c ap -ch am -g er -ti m -tomor row -ne ss -st ate -h al -ser v -z e -o s -p at -v is -ex c -s in -f f -c ity -c en -an y -b el -su mm -t in -w ould -loo king -k o -ce le -fam ily -m er -po w -hel p -bu s -c o -c le -sel f -en s -ic s -th o -an i -ch o -le ad -b s -t wee -th ink -for e -ch il -vi de -di d -al e -ch i -v il -en ds -w ing -p as -' ll -v ol -s a -g s -man y -j ec -be fore -gra ph -n y -ur ing -w il -d d -bu il -f av -st ed -tr an -l ing -ou d -d ge -fi el -nati onal -st a -c er -w ere -in a -se ason -c ou -n ed -amaz ing -ti ons -cele br -n s -a th -he ad -s day -d ar -lo c -v in -an other -g oo -s at -n y -jo in -pre s -s es -s ing -an a -in ing -.. .. -c our -ï¸ ı -ac t -cau se -li ght -am s -t a -b al -f c -hi gh -off ici -t t -chri st -d ic -d ay -ra l -h or -: ) -vi si -n am -o b -ma s -gh t -re ally -t un -fin d -thr ough -por t -u t -ti ve -st y -n e -or e -ðŁĺ Ĥ -supp ort -ne ver -ev en -ðŁ Ķ -h a -y a -l d -u k -r an -j am -wi th -me di -d es -ne y -ch ing -al e -h y -k in -! ! -d y -pl ace -al so -b le -wh ich -bl ack -b li -s ay -par k -pl ay -ir e -vide o -week end -a il -ke y -p t -w ard -fri day -d in -ine ss -g ro -b en -al ways -t ball -ag o -m il -c y -pro duc -di sc -un der -ple ase -sp or -fu ll -e y -ðŁ Ļ -is e -iti es -c at -k no -u se -fo re -k er -ar t -hi gh -op en -s an -e f -our s -sh ed -st ri -d ro -aga in -i m -ðŁ ĵ -en jo -fu n -ge tting -p en -g er -c li -an y -ever y -e u -wom en -â ľ -e st -c ould -r y -" @ -th ou -sh a -comm un -b er -d ents -di s -wh ile -aw ay -di o -h am -g la -d ate -k a -mis s -un ch -w on -in f -roo m -g a -re al -ex per -di rec -sh ould -sp r -g ol -l ong -bet ter -or i -e y -i ence -il s -z z -h an -f ound -v s -â Ļ -po st -ti c -par t -m en -ren ce -ce ss -v ic -s il -sho p -ðŁĺ Ĥ -f ood -v al -sti c -y ou -s ays -e lec -st ar -o c -l and -i d -c tion -fiel d -s of -st art -wat er -fri ends -on es -ðŁ Į -f la -f ar -wh ite -par ty -in st -gr ou -t v -every one -m ent -j a -ch a -pr in -an ts -d uring -l at -l ar -we st -th en -k a -y oun -in sp -in te -we en -visi t -aga inst -re le -he ad -c es -to wn -loo ks -th re -re gi -ren t -pro jec -gir l -se ar -w o -m om -c ar -h un -pu bli -d i -p le -c all -c ri -u m -for d -per fe -fri end -h ard -ssi on -te st -pla ying -ar ound -be cause -ke ts -me et -sat ur -ar ti -wor k -j un -v en -r un -me mber -por t -su per -t wit -s am -el s -t ly -ad v -ati ve -at h -s ure -av ail -la r -s qu -ar ds -ev ent -m en -l l -o ver -lo gy -it al -tim es -m al -b ack -c oo -ma king -st ru -â ģ -it u -sh ar -g an -c as -s n -summ er -pic ture -f an -h in -christ mas -c y -pr oud -cham pi -desig n -pp ing -ho pe -c a -avail able -ma y -we d -photo graph -spe cial -sal e -sto p -er y -a we -al ity -hi story -am a -pre si -b ru -wor king -d one -d r -k en -fe at -w ood -ate st -sun day -mo vi -vel y -s le -f ace -sp ec -stu dents -b y -ha m -sp on -bus iness -d at -i e -i p -so ci -g lo -h and -re cor -r s -me e -ke ep -p ur -heal th -sh e -com ple -go d -da vi -col lec -li st -r a -clu b -t ers -in clu -th ings -pl an -â ĺ -joh n -sh ing -at ul -so on -blu e -g or -satur day -w on -congr atul -se e -âĿ¤ ï¸ı -tho se -ðŁĺ į -fin al -d ou -it h -o wn -ro ad -t our -a st -indi a -ti l -n d -f er -fav or -su l -lear n -fir e -ju st -grou p -a h -r ac -bo dy -u r -c are -à ¸ -p lo -o h -po s -gi ve -te ch -su b -c ent -er ing -y m -il ity -f ic -lon don -v ir -gu ys -b a -ðŁ ¤ -bab y -sc re -ðŁĺ į -tru mp -un der -chan ge -i an -col le -ss es -l er -ss ed -n ice -ann oun -pow er -s ar -a king -min i -s li -s wee -k ar -fu l -c ru -ac tion -a ther -) . -st and -de vel -a a -g an -le ft -lo l -re l -tran s -m ents -in t -e f -man ag -di g -gen er -do wn -p au -ti v -k u -th ur -k en -st on -f ans -tal k -twee t -t oo -sty le -pro te -se con -fr on -awe some -g l -p al -ne t -s or -la u -g on -sin ce -t ty -ser ies -me mor -b eli -fil m -di d -di es -o t -congratul ations -p ra -e ve -w oo -offici al -su c -in cre -b on -par t -pp ed -cla ss -si ve -bo y -cu l -perfe ct -t ou -d am -wel come -foo tball -h i -p ap -wa it -ad a -congr ats -youn g -exc ited -re ce -j an -v a -re d -st ra -medi a -' d -do es -le t -mu l -ill s -gre en -m el -to ge -fu ture -ye ster -vers ity -for m -ta in -i de -ch es -ki ds -qu i -ha ha -de ta -bi g -favor ite -gir ls -con tin -do m -sear ch -u al -a ir -d ers -mon th -c er -yester day -commun ity -ad e -do g -vil le -ic es -d eli -sy ste -ru n -is m -he art -c up -en ti -fe w -presi dent -e ds -un til -fe sti -o k -f lo -sa id -ol e -me d -tra vel - £ -ph one -toge ther -fa st -lo t -gam es -sh ir -bet ween -y es -th ers -do ing -m ac -at or -b and -fol low -projec t -devel op -di ffe -con fe -spe ci -ca st -y s -bo ard -r d -i al -sh oo -r am -ha ving -sh are -fol low -on e -n ame -m r -pu t -disc u -or y -c ame -ou s -s ite -twit ter -t b -t it -fin ally -z ed -su per -com pan -us ing -all s -li st -r is -sho t -g al -t ar -de l -joh n -âĢ Ķ -some thing -ra m -inte re -wh e -b it -ðŁ į -stre et -oun d -a i -tic kets -movi e -re al -k y -ta king -o pp -c c -l am -m oun -in ve -bl ack -us ed -on line -y or -loc al -gu e -c ks -o w -ge st -bo ys -illi on -con t -re ci -in ed -eu ro -no w -se en -p h -te ach -de f -sou th -su ch -aw ard -mu st -is su -ca re -fe el -p lu -l atest -spor ts -we b -te x -e ment -s k -fi c -w an -te ch -o t -bo x -n er -fre e -t al -a sh -c ase -ho t -won der -mee ting -er a -ch all -ðŁ IJ -jo b -il i -c ool -j our -th s -m o -f el -di e -mic ha -e le -te am -serv ice -st and -ma kes -p ing -ear ly -com es -e k -ho li -v ers -ag ue -s au -thre e -mon day -fa shi -some one -th ro -se a -b ad -supp or -tur n -ur y -m ing -photograph y -n ic -mar k -pre tty -ss ing -wat ching -me mb -ar ri -coun ty -be ach -fr an -cen ter -pol ice -b at -publi c -t an -pre ss -s af -s y -ge ts -ro y -n ers -y our -bu y -st ers -sho w -as ed -chil dre -af ric -in es -sp ace -sc ri -h all -pa in -ar ing -hom e -m ur -heal th -ch ed -s and -rece i -gu y -e a -americ an -re si -childre n -- - -i ri -ing ton -coun try -ro ss -le n -ann a -boo ks -b c -e ce -d om -lo vely -k h -pe t -g y -g ri -st age -off ice -ro ck -m on -b ay -t able -su n -m ed -th in -l or -f low -( @ -uni versity -stor e -fron t -goo d -z a -vo te -nor th -he y -an im -or der -mi d -with out -a de -re member -mar ket -? ? -mu s -tra ining -e duc -bu t -co ver -st an -sc en -b la -bre ak -l ou -s ame -g old -a in -o s -bo th -l it -ver n -a i -al bu -p a -enjo y -be g -ell ing -thur sday -inf o -s an -americ a -ha ir -te l -mar ch -con cer -colle ge -confe rence -ap p -h our -ch ang -â ļ -s our -ol s -we ather -w ar -p hi -festi val -secon d -cu te -pr ac -en er -str y -le a -pol it -s av -se n -o w -m i -ne ar -ou ght -z e -co ffe -w illi -d an -se y -davi d -e se -f an -de ci -the at -no v -ati on -tr ac -sc i -re view -c el -e m -u n -ju ly -or ig -ti on -d ru -form er -st ay -af ter -in v -too k -dat a -b al -tu es -d an -ev ening -ðŁĺĤ ðŁĺĤ -d ol -u res -pro vi -t s -e st -sig n -j ac -u k -s ong -ye t -bo w -in du -j ap -h oo -po int -any one -z y -i st -h ur -it al -buil ding -wom an -ch ur -j er -per for -co ach -le ague -ce ss -ne t -i mag -nati on -br it -qu e -aw ards -ag es -wor ks -c ed -man ce -l ate -ig n -mon ey -tru e -i i -t ell -pl ac -p ac -as y -wor ld -be hin -im port -read ing -gra m -gi ving -me t -h it -for ward -st om -pres ent -jun e -so cial -no on -mar t -hal f -s we -go vern -k er -deta ils -li sh -_ _ -ac y -si a -ber t -f all -! !!! -) , -th i -d iti -sp ort -k ing -f it -st af -c at -mu se -cen tr -y er -con tro -b loo -wal k -ac tu -did n -li m -lear ning -re search -wed ne -au th -h ours -k y -f ar -h en -.. .. -it ch -ri l -str ong -sk y -que sti -jam es -r on -d g -f ur -c in -do es -app ro -mar ke -tu res -ful ly -ch at -behin d -te m -fin i -mis sion -b att -fe el -he av -every thing -b ar -w ish -pre mi -i ma -exper ience -e ach -re port -swee t -tic s -spr ing -re spon -syste m -vic tor -l in -sa w -al ready -gh ter -f le -ã ĥ -br ing -albu m -- - -ell s -st an -to m -inter national -w ent -an ni -mat ch -pp er -st one -sm all -ra in -fashi on -are a -v an -ag ram -k o -thou ght -wor th -v an -m er -coffe e -it es -g n -arti st -c on -ar ch -c ir -se cre -gr ound -is o -h and -co m -bri dge -h s -x i -l ink -pu l -sp l -r ace -f li -ri ver -g as -di sco -d al -play er -f it -photo s -it y -o k -j or -tr a -ap ril -ad s -a di -sol u -beau ty -do or -me ss -up date -ali a -sch o -en ed -mom ent -sco t -sc ience -i or -ti es -ac ross -ous ly -sh es -does n -p age -wat er -m illion -cla ssi -l ic -ca st -form ation -micha el -ell o -s mo -in ts -vi sion -op ening -ld n -au str -tues day -win ner -po ssi -r ound -shir t -di t -b o -u es -il led -al ong -tri p -star ting -im pro -k an -per son -no t -re co -ne eds -c le -li e -re st -r ing -win ter -si mp -mo m -be er -fac e -tor s -us a -collec tion -ge or -se ssion -tr ying -la s -la ke -j en -orig in -stu dent -se cur -v in -pic s -ex pe -com p -gon na -e qu -b ad -le y -a u -memb ers -bre ak -w all -gi c -din ner -bu l -insp ir -r i -min d -ic a -win ning -tal king -t ren -s is -t en -wonder ful -s now -he ar -th om -no thing -gu i -st in -blo g -fe st -b un -le e -war ds -ch ance -dre ss -re n -pau l -p es -tech no -ru ssi -c ard -e ast -mar i -w ine -t i -la w -str ic -k i -ap e -au gu -pro fe -as h -cour se -ma il -ren tly -d un -m un -lo ve -is land -dri ve -s l -end ed -ma in -lo st -nat ure -âĿ¤ ï¸ı -ch ic -re por -p in -pr o -st ation -ce p -ta kes -compan y -go es -on d -ma ch -ra dio -d ad -ro ck -j a -p ay -champi on -e e -in de -tt a -ati c -t ab -beli eve -ener gy -z i -t at -wor d -on ce -re sul -y l -and re -an o -inst agram -clo se -t am -cu stom -w a -con om -sho ws -li fe -k in -ro b -t age -n ation -al most -list en -sa ve -re li -ac e -mar y -tre e -for get -j ack -wa iting -direc tor -h ill -bor n -te mp -f l -st e -on a -sing le -wedne sday -un ited -in o -@ _ -ne l -celebr ate -en ding -de al -j i -can ada -hu ge -tr ack -âĢ ¢ -f y -fan ta -an g -yor k -rele ase -p un -ep iso -wor ds -t our -p ack -i gh -classi c -perfor mance -ke t -after noon -recor d -win s -pro ble -âĿ ¤ -f our -b ed -ban k -d ance -s la -cal led -mi ght -a p -pa st -ðŁ ļ -diffe rent -it e -gi ft -ssi ve -chur ch -c us -pro gram -ho tel -ic e -ma d -secur ity -en ge -d c -en ough -st a -e ty -de ad -g un -he ar -m ir -hu man -gre ss -oun ds -pi ece -bre aking -gar den -fi ght -vie ws -f ish -star ted -run ning -gre en -ser i -s m -as k -d or -de ath -e conom -er i -ir d -s er -l unch -âģ ¦ -bo x -nat u -ba se -b an -f al -glo bal -wil d -wo w -out side -mo ve -le ad -an al -muse um -on g -ha w -pow er -than k -b ac -char ac -cam pa -dig ital -r o -op er -de v -w ol -p ati -f a -m ale -pap er -ill ing -c s -â ĥ -educ ation -ta ken -e ffe -m ou -s ad -" . -bas ed -staf f -inclu ding -li ving -a c -ch ina -mo b -stor m -lu ck -ph il -o o -y n -tra vel -k el -ti al -pr ice -boo k -import ant -bi o -p ool -ny c -f ab -lo ad -? ! -chall enge -cr y -ser ve -we ar -bu s -ta in -nu mber -ro r -k at -i z -th ough -ho sp -m m -fa ir -ut es -ho t -po p -fi ed -cam p -develop ment -li br -c ali -em s -âģ¦ @ -b ol -is ed -stand ing -mo del -it a -g le -bro wn -ima ge -ve red -for ce -o il -par tic -sh u -da ily -la w -se c -cla ss -cam p -holi day -cl in -k ers -pres ent -gam e -incre di -er ship -inter view -b ill -du e -and y -ab o -in nov -ke y -ac ade -p il -mo der -st ars -br and -f er -wee ks -con si -pr e -sa fe -wr it -di um -la unch -marke ting -ann ual -as si -cour t -la dy -c ted -and a -in side -chil d -opp or -sm ith -centr e -gu e -âģ © -f ren -st y -for t -ent ly -is n -ke ep -to ber -on y -bo y -al d -col la -de mo -le vel -com pet -ad o -b our -fanta stic -m ate -s u -sou th -oppor tun -vers ary -lat er -bu d -face book -la un -ster n -p it -! " -ma j -gr am -tb t -fi re -happ y -a ks -wh ole -actu ally -ill er -ell a -lo ts -al ex -an ge -lan ds -ðŁĺ Ń -en ter -r ou -episo de -p ed -in ten -sh ire -wh o -pl an -h o -ca ke -we st -mag az -fre sh -c c -n ar -ch ris -wr iting -w er -n om -l o -mi dd -dre am -o l -ti onal -de b -> > -be come -s i -gr and -all ing -hi stor -ri de -i red -saf e -que en -ci l -in tro -vi l -d ani -.. . -ar tic -st at -sh ort -or ing -sel fi -mis si -do c -b it -g all -b om -i re -se lec -d ition -ðŁĶ ¥ -fri end -be at -gh ting -ðŁĺ Ĭ -pe ace -ex hi -ant a -ab ility -il lu -j on -qu ality -tri bu -m es -play ers -fa ir -cu t -c ab -suc cess -b i -su s -pro mo -sch e -an ge -ic o -comm it -cat ch -ill a -kin d -feel ing -qu o -s ay -anni versary -spo t -mo ther -an e -p end -your self -op s -app le -min utes -p o -gr and -ri es -ha ha -care er -ed ition -de c -ric k -am i -concer t -iti ve -ge ous -d ly -t te -adv ent -i g -li ghts -ak er -sk y -âĥ £ -r ay -fini shed -w ay -s d -ac coun -ðŁĴ ķ -ck y -ch el -lit er -pain ting -lo s -st un -techno logy -n as -ma r -b il -afric a -ki e -ey es -gol f -plu s -ni a -it ec -serv ices -wed ding -kno wn -te le -.. ... -star ts -pa ren -w ants -ati onal -mon ths -win do -fav our -er t -magaz ine -ex clu -re ve -b c -origin al -e ss -n al -an ti -st ro -t ice -stu dy -à ¤ -v ac -nation al -fi ve -ra in -ve ment -u te -ver se -em er -ar my -possi ble -gue ss -val ley -ther n -cro w -m r -col or -on to -pic k -cle ar -dar k -t ac -wan ted -it ting -can cer -govern ment -di e -ri se -z ing -col d -f oun -stu dio -str ation -bro ther -a head -sh el -mic ro -ic ally -d au -sig ned -vi ol -a x -as se -i o -w re -spl ay -ch ick -augu st -pl at -ti ps -sp i -hu man -e asy -lo gi -mi ke -gro w -ag re -w w -sh ad -mo tiv -wi de -tur ns -om g -v ar -de fin -su g -j im -ðŁĶ ¥ -t d -campa ign -nam ed -re tweet -co p -t v -le av -k is -dou ble -s mar -issu e -vil la -in formation -li es -sto ck -n t -di stric -sh or -mi x -er o -se p -me x -see ing -li ve -re min -co de -g ur -s c -wil d -l un -h ood -spo t -fa ther -fore ver -up d -tra f -f ly -ne ed -gra du -tra in -ma ke -s ab -be y -si ze -lead er -tal ks -e u -lo g -fo x -gor geous -le ss -le ts -sur pri -my self -no te -li ves -f ru -lo ved -se ver -de m -j i -so c -h old -do gs -n i -â ŀ -lea ve -air port -ben ef -ex pl -shi ps -comple te -ach i -gre at -vin tage -j ack -ro c -woo d -pri v -off er -ey e -ver sion -te a -co ach -off ic -w ell -g en -s at -h h -you th -o x -? " -m t -mi x -g g -d le -natu ral -buil d -break fast -thin king -theat re -mo on -ber g -go als -geor ge -en e -exc ell -il ing -tun e -y ed -g ate -m it -net work -jo e -h ello -f b -tu be -we aring -ath le -stru c -har d -gla ss -g ers -thro w -g es -b t -indu stry -manag ement -ali st -go al -stre am -y el -a vi -ici ous -o thers -s ki -chri sti -bir d -e sc -m in -tr o -l t -j an -im p -ri ghts -sh a -or gan -cent ral -ar a -ro ll -favour ite -che ster -el se -p ay -car s -m ine -ste p -prac tice -maj or -h ang -ðŁĺ ĺ -n on -v ari -eng ine -vol un -di a -i led -arch itec -p ink -d s -th y -wa sh -web site -ba g -contro l -el li -f ra -an sw -d ence -y u -r on -ol a -g in -dr in -li c -cou ple -sp ar -g on -cre ate -c t -celebr ating -de ep -e at -te e -vo ice -dro p -vis it -at ors -sta dium -f t -w is -ro l -gra de -fam il -po ints -re pre -w as -traf fic -jap an -or g -hon or -tex as -man u -âĻ ¥ -safe ty -re r -b ag -em plo -rele ased -re gu -ak a -n av -ro le -sen ior -spec t -cro ss -lin es -be st -p ack -s in -ti e -mis sing -sun set -li ber -is ing -j ay -sk i -champion ship -ac tiv -la dies -play ed -y y -pu bl -al o -pri de -s r -pa ki -lu x -sur vi -ck ed -e ts -cho col -austr alia -par is -mi les -h at -ment al -al a -me an -mob ile -en a -in si -f ound -chi ef -t ag -incredi ble -re turn -à © -goo gle -fren ch -cre w -hal lo -ali an -j az -ch er -sil ver -nor th -eng lish -base ball -c af -lim ited -follow ing -app reci -ear th -k ir -ve mber -w ed -p tion -g ed -oc tober -fl ori -c r -en cy -ga ve -lor d -stu ff -ber ry -po st -sm ile -bro ad -st ate -gg er -me ans -ic y -gu n -y o -ma ster -bur g -han ds -ni e -/ / -uni on -brit ish -big gest -distric t -am ing -h il -o ce -per son -pas s -en vir -scho ols -arri ved -anc es -insp ired -ex pla -be n -libr ary -bo tt -am p -ste ph -cont act -b ang -m s -cali for -t old -batt le -b b -chic ago -âľ ¨ -str ate -sh i -de ce -- ) -ad d -la b -j ones -leg end -cast le -ing er -st ance -be l -ur a -re fu -lead ers -po t -se x -h ic -artic le -ki d -fr ance -x x -ex e -gui de -volun te -pr int -al i -ce o -twee ts -w x -scen e -vol u -ant i -h an -as soci -shar ing -ro se -mini ster -sh er -in ste -cle an -demo cr -po ster -sk in -p sy -pro per -cra zy -i am -o re -in i -any thing -po d -mo ving -cl ick -ex plo -com b -cra ft -f i -bloo d -is ra -publ ic -d ent -ol ym -eng land -a si -ch er -fac t -envir on -har ry -g one -me dic -enjo ying -just ice -j r -indi an -wi fe -s ound -t es -dra wing -p al -ide a -cr it -ju li -il er -war m -cl ar -thou ghts -def en -coun cil -intro duc -di ed -jan u -an i -s end -li er -m l -intere sting -tra de -win d -b ay -s ac -anc y -sour ce -b es -org ani -ar ly -lar ge -ff ici -ta g -u t -de sp -o es -tit le -sy m -pic tures -op en -wom en -sho wing -ri a -le ast -lead ership -cur rent -elec tr -val ent -list ening -c key -gener al -de ser -du ce -; ) -c ent -ðŁĺį ðŁĺį -sco tt -po or -selfi e -ev ents -i on -wr ong -de v -h ill -sep te -cul ture -l ine -sor ry -s ent -si ster -ce pt -k ri -no vember -ar i -announ ce -z ation -br an -g ent -d u -l en -per s -f m -mart in -o p -e mb -om e -midd le -suc cess -pe ter -janu ary -f lu -rac ing -d av -bi ke -ðŁı » -pe t -shoo t -profe ssi -feat uring -septe mber -now playing -sta ur -z a -on ic -qu ick -bas ke -spe aking -mil it -z er -chick en -b ell -s ad -co ast -lo ving -y ers -d j -pan el -ver age -s wit -ic ks -b ou -califor nia -s am -paren ts -er o -k illed -ph ys -jo bs -mi gr -an th -e mo -hallo ween -and er -c m -compet ition -e ag -s ket -sp ir -may be -exclu sive -app e -jour ney -scre en -for d -i o -h ate -u g -sou l -her o -soci ety -sy n -gu it -n h -d j -as es -im pre -ti me -sal es -d d -f ts -summ it -stun ning -om s -tur ned -cle an -sof t -be at -re staur -de red -en ces -ma gic -di o -sh ine -gu est -health y -exhi b -stor ies -po pu -n is -el a -bel ow -fun ny -resul ts -s ne -cur rently -ar d -down load -f light -m al -f ine -p ad -ch u -ent ed -h at -ðŁij ı -ste ve -j o -mar k -r at -b all -p c -p on -b by -o li -ar ts -as ure -bow l -att ack -mi c -de ar -ran ge -en ter -chocol ate -br illi -ac cess -, " -? ?? -ch ap -con st -t n -mat ter -blu e -gall ery -em p -work shop -lead ing -y ours -baske tball -w anna -th u -_ _ -mar ri -sle ep -bi a -ch e -ma d -imp act -o wn -si r -chan nel -euro pe -e sp -k itch -hosp ital -w ra -roy al -f s -ne u -qu ar -ne y -ac ks -ch ase -pp y -st al -at ely -ti m -dece mber -r are -per form -cre am -we ight -ch oo -ni ght -ha ven -fr anc -kh an -buil t -hel ping -tru st -ty pe -gol den -ta x -s now -s wi -di sa -questi ons -ve y -li ght -c n -cl oud -thom as -ag ed -sh ou -te ams -gr an -re ason -a a -you tube -v p -pi zz -manag er -bur y -cre dit -tre at -ma x -i k -ma in -g ing -de ad -pro bab -ye ah -ã Ĥ -br and -so li -pl ant -ta yl -gir l -ðŁĺ Ń -nam ent -au to -mess age -ko re -n ur -ter r -ag u -ma p -sen ting -lo ves -gi ves -g ab -z en -ro bert -con fir -w ars -o m -sta in -cam era -and er -won der -a b -ca p -s old -su it -wal king -contin ue -effe c -dau ghter -d anc -cha in -mul ti -ki d -y an -champi on -v o -ta ins -ho st -min i -mis sed -re sc -ly n -fin ish -del icious -s as -tayl or -i b -pro mis -produc ts -moun tain -flori da -regi ster -tre at -rec ent -fe male -boo th -mat t -ve hic -s op -mo tor -suppor ting -phi c -ex tre -dr ink -lan e -th ird -p s -con stru -ce re -far m -ðŁİ ī -tu red -ðŁij ī -c ats -a j -gi e -shoo ting -as ked -paki stan -am e -m b -g il -leg al -squ are -in vol -dra w -oo oo -!! !! -opportun ity -p y -e i -b ts -teach er -charac ter -john son -br on -ly wood -ch ine -c ing -c ine -d ge -gam ing -russi a -ci a -quo te -ric h -go v -flow ers -sp iri -st in -grow th -ðŁı ¼ -comm er -j uni -mu m -r an -s na -a ren -c b -ac tor -col or -si t -pa ir -ch i -bo w -acade my -hel d -r ang -me tal -y l -ac tive -probab ly -t ch -need ed -spe e -cho ice -ital y -ry an -ðŁĩ º -flow er -v it -m n -found ation -b ak -si ons -ne igh -f loo -he ard -re mo -fre sh -ing ing -re f -to wn -cl ou -je sus -spiri t -cou ldn -z es -ðŁĴ Ļ -willi ams -pro ce -moder n -pro cess -sho es -cre ated -tri c -issu es -ann e -att en -de but -h r -n it -sti g -a po -e ps -z u -ã Ģ -si x -car ds -lan gu -fam ous -tour nament -se l -e bay -y n -st on -k ick -announ ced -k am -vo c -brilli ant -hou se -che ese -war ri -mus ic -ho ckey -ðŁĺĤ ðŁĺĤ -sk ills -au tom -smar t -med ical -mon y -e x -gu ar -gi ve -pers onal -ven tion -al li -pre ss -flo or -m c -victor y -hi m -simp le -th or -ðŁĩº ðŁĩ -ta il -lu cky -ale x -qu ite -bo t -ssi ons -chall eng -c ann -amaz on -h ell -b ought -) : -ed y -secre t -produc tion -inde pend -de fe -ad ded -p r -p ag -be d -gre atest -with in -j ay -ðŁ ¥ -ire land -re ly -s d -te xt -dri ving -pro gram -spe ed -col um -str on -à © -fore st -â ĸ -mach ine -co in -sc ar -oun t -bi e -¡ ï¸ı -por tra -comm on -wre st -recei ved -kno w -inve st -pl ans -ac cor -ad op -ter y -re ali -p p -k al -art work -me an -go d -inste ad -an ci -motiv ation -as ing -inspir ation -up coming -polit ical -euro pe -m ers -heav y -ðŁij į -fe bru -scot land -ou gh -b t -bo ss -sche du -spe ak -n ick -u red -in o -e k -ri sk -tor y -pres ents -b on -ru g -st ates -exhib ition -il o -m ill -br ought -: -) -tou ri -com e -offici ally -champi ons -do ors -re p -po se -ex tra -k ings -soc cer -squ ad -app lic -at a -some times -t ari -excell ent -ðŁĺ ĺ -stra ight -car ol -ri p -âĢ į -gra phic -m ol -elec tion -febru ary -as ons -l i -di r -m t -n ick -u su -m rs -com ics -inst itu -cor por -v i -ðŁĻ ı -tu ral -di se -ac ci -we are -am ong -sho pping -t ill -wh at -cha ir -sp an -chine se -innov ation -jo y -k it -cent ury -ob ama -ph ili -f c -re ach -c iti -ul ous -n on -d ang -happ ening -bur n -p el -or ange -d v -k ick -cla im -ing ham -ph y -no v -pod cast -wh i -ni ghts -ear lier -be ar -la h -exc iting -or a -gi ven -s lo -memor ies -contin ues -produc t -gh o -c d -kno ws -ðŁİ ī -publi shed -discu ss -y ard -i phone -tri es -w all -fe b -are n -tru th -win ners -tu re -diti onal -milit ary -proble m -m and -do g -lo ss -c ric -can adi -ve ter -villa ge -" , -y r -un g -don ald -ag ing -bir ds -sci enti -le s -th is -regi on -tic al -itt en -il a -ðŁĺ İ -d ad -di am -abo ve -st ren -li t -p ir -la b -fo cus -bus y -d ur -app ly -s ma -auth or -ac i -exe cu -dom in -re la -jack son -at o -wash ington -ðŁĻ Į -k ill -popu lar -ce ment -ro ad -e ating -loc ation -v ent -ar re -n an -cu sto -advent ure -or din -spor t -ul t -lo ck -questi on -dri ver -land sc -on i -k ins -p d -jor dan -te red -k k -a f -chil d -s p -just in -en i -s elling -z o -wh it -bo ston -partic ip -sig ning -happ ened -he at -m am -dre ams -lo ws -gra ph -the day -head ing -br o -ble ssed -vi c -ve gas -h d -in ning -ro man -and ro -den ti -u se -c it -pro gress -writ er -bo b -ff s -gro wing -b ly -aw are -ex am -sp ent -be t -sc ore -bey ond -do cu -ad el -s f -cou ra -colla bor -in c -priv ate -bo at -* * -z one -p ha -b ill -to tal -plan ning -to wards -plac es -pre view -cre ative -dam n -ide as -se ems -po ten -say ing -di splay -s w -a qu -lou is -by e -li l -e mail -we stern -ger many -ell er -re s -f ant -ment ary -de als -ric hard -jer sey -stren g -ra d -pizz a -mon d -w are -l ac -g i -ar chi -c d -yel low -rec ently -re ach -à ¹ -kitch en -desig ned -tr y -g al -restaur ant -at ure -w w -j as -l ma -ðŁij Į -pa in -av o -min ute -sch ol -ther ap -tic ket -d ry -jap an -diti ons -ter ri -sel ves -happ en -t up -ma g -cop y -sh er -free dom -f ile -speci ally -tor onto -lo ad -g ary -re y -answ er -lo y -cau ght -pri ze -u ne -fic ation -ni ger -sy d -tou ch -feat ure -jaz z -recor ds -him self -di sh -ro ber -spot ted -ma ster -wa ve -fin als -bu ll -for um -al d -re comm -ch a -a e -d oo -inst ru -tru ly -l g -in k -bro thers -de st -j im -m it -clo sed -is on -tri ed -s anta -af fe -w an -hor se -g row -camp us -rel ation -nati ve -jour n -go v -o ct -k it -b ound -part ner -re ma -crow d -! ) -c alls -ra il -qu ali -solu tion -con test -con vers -sn ap -b ase -in iti -ta x -y e -ent repre -it or -constru ction -foo d -present ed -n ings -cli mate -k m -mo del -b j -blo ck -present ation -dre am -fi x -c alling -bus ine -con gress -under stand -we b -val ue -ï¸ı âĥ£ -mex ico -it ely -ki m -char ity -ref lec -bl an -fl ying -anal y -famil ies -b and -reci pe -celebr ation -ac cep -ar y -to t -g b -intere sted -cap tain -âĻ ¥ -ti p -ab sol -bra z -inve stig -o logy -de c -tru ck -ver ing -c lear -don t -go tta -ad vis -beg ins -ma ss -de scri -blo ck -k im -davi d -son gs -memor ial -feat ures -su stain -' . -gra b -jo se -v a -con serv -se ts -man chester -fi ghting -de gre -ag a -in d -sle ep -pos ition -ha ir -sig ns -pol icy -it o -al ert -st am -sp end -w y -absol ut -d m -anim al -my ster -success ful -proble ms -ro bo -k ay -gar den -p d -may or -d ale -t ol -off ers -vis iting -friend ly -tre es -offic er -accoun t -ke vin -ðŁij į -gi ant -contin u -con su -tr act -n fl -ðŁĺ Ĭ -h q -b ility -a ar -dis ney -te en -on ed -wh ite -tra iler -de dic -al one -absolut ely -dig ital -willi am -in ation -s wa -e e -enti re -ger man -ro ll -h its -co st -st ay -th a -ali ve -accor ding -co t -liter ally -her it -re ti -haha ha -exper i -li kes -g t -ste el -__ __ -ch air -christi an -to wer -diffe rence -m d -tre ss -mi d -prin ce -afric an -fe der -foo t -car ri -ser ved -r ice -sh all -feat ured -ck er -rec ru -po e -sen se -ni fic -com edy -cont ent -f at -po sted -con tribu -tim ate -li ver -mb le -inter net -ag e -europe an -cl ing -gla d -ff ic -sc o -ak es -el le -ter min -ton y -p ale -col our -seri ous -pat ri -movi es -b m -professi onal -ad o -al u -br inging -f alls -isra el -ter m -langu age -bro ok -man n -commun ic -can not -ac ti -p he -y an -entrepre ne -tur key -log ical -lon g -ar m -ur s -work ers -ing ly -gg s -ri c -tu al -recei ve -op ens -ge ar -soci al -fe et -c king -ad ver -fin an -fe els -sp la -h r -ea ster -bra in -ã ģ -fi g -le dge -ne arly -prote ct -ma ssive -e th -aw a -ðŁĺ ģ -y rs -aware ness -defin itely -k n -imag ine -k u -syste ms -ðŁij ı -f as -li k -provi de -am o -disco ver -inf lu -ma ker -g az -fit ness -stre et -er s -te d -w c -ys is -pos itive -hel ped -que st -andre w -bra d -b in -hang ing -l ing -bri ght -se ction -ma ss -ðŁĻ Į -follow ers -ho sting -tem por -fla g -a ve -let ter -k ur -re qui -of ten -cry p -su ff -âļ ½ -russi an -treat ment -al le -ha y -l an -keep ing -hol y -power ful -pre dic -fun d -e specially -windo w -je wel -il y -ðŁĴ ľ -gener ation -app a -seri ously -o d -ðŁĺĤðŁĺĤ ðŁĺĤ -cer ti -iri sh -ðŁij Į -mi ami -be th -v ity -se cu -che f -cri me -graph y -ma x -arti sts -re volu -gu ard -spee ch -u c -upd ates -fac es -st ant -chang ed -repor ts -low er -pe ar -n c -k il -loo ked -spe aker -s f -re spect -ok ay -oce an -s itting -architec ture -tra il -se at -i ra -le g -japan ese -d am -u lar -sw im -polit ics -finan cial -ol d -mou th -at temp -de stin -fi shing -atten tion -me m -chang es -deci ded -reli gi -g in -c av -z z -ad am -ma c -wr ite -beg in -sc ul -al ter -is s -ath on -imag es -m oo -jo ined -ðŁĺ ī -âŀ ¡ï¸ı -pas sed -mu sli -h ir -lar gest -cam er -com ic -gh ted -rug by -bur gh -gg ing -te sting -pre par -lau gh -al ed -impro ve -beli ev -adv ice -sha res -he art -tur ning -s b -t el -caf e -n es -dani el -pat ter -t z -se tt -par k -c and -st ick -happ ens -bri an -ne west -e pic -ad or -ki es -war ning -anim als -custo m -ar c -di an -gol d -cor e -t f -c ity -pan ts -re ality -con fi -in ju -fo x -gu il -k new -âĺ º -cor rec -itu de -d den -. # -re duc -pas s -f on -y a -ow ner -re turns -n c -e ast -ap ol -in sur -th o -si m -juni or -be e -ang el -att le -elec tric -hor ror -cra sh -e ye -pat h -sou thern -emplo ye -ge o -t an -ha z -r ally -ðŁı » -proper ty -was n -enjo yed -gre y -g as -bre w -nor thern -hol ding -g p -ta ke -ch art -ly n -dr ama -z o -pa id -throw back -cu p -discu ssion -down town -w ill -le w -b is -t ary -bre ad -up on -r ate -teach ers -it ation -anc ed -cy cle -choo se -d c -ir an -co w -da ve -ra ise -prin cess -fa ith -- > -indu stri -sp ain -guit ar -fac ts -m n -sp en -cour te -go tt -projec ts -au di -o sc -pe ter -s and -intere st -happ iness -ven ue -sol di -surpri se -poten tial -per io -custom er -i i -g ni -manu fac -e co -bro ken -sing er -vel s -wal es -hu s -in j -f our -tal ent -d ying -mat the -fil m -jo ining -s ell -j ar -lma o -sur ger -bb c -sour ces -au stin -ni k -char les -f am -prin ci -ange l -cas h -lo t -o red -pla ys -pl ate -don e -memor y -br ings -n ba -solu tions -teach ing -gr ace -cir cu -hel ps -foun der -mar y -expl ore -de cor -par ts -ch o -inte gr -ha u -is es -pu tting -in er -r it -v y -mic hel -blu es -every day -for ms -bi o -ye ar -p in -t ter -spr ing -) ) -po t -al ing -perform ing -sh an -plan et -mus ical -head s -it alian -stru gg -âĢį âĻ -w ings -pu mp -h h -tr ou -a id -pri me -ear th -pa int -mon t -am y -bb c -fab ulous -fru it -andro id -bour ne -cere mony -enti al -? ? -deb ate -on ing -dra ft -sol ar -t x -j am -cor n -!! !!! -bro o -mil k -po sed -o hi -mo vement -b ren -part ner -p g -et te -ar ies -sh out -n g -leav ing -t ells -sen s -ta ste -kel ly -wor l -gy m -ric h -e gy -pi d -ma s -â Ĥ -courte sy -fran k -incre ase -wr itten -pp ers -re l -ha i -s as -s ound -tt i -w ich -ri ver -.. ." -a g -fel low -ro me -sm all -gen cy -ic an -lux ury -pro of -me t -wild life -mom ents -ra ther -cor ner -com pe -canadi an -lik ely -therap y -li am -econom ic -indi e -rou te -fi ght -ho pe -se tting -ant ly -cro ss -fant asy -de e -sket ch -comp li -ym i -ru les -engine ering -fig ure -ro w -. , -f w -syd ney -w ou -t ation -dre w -us es -the re -sp read -struc ture -pat rick -appa rently -ro s -h ills -w we -ann y -com mission -di v -f ying -con sul -anal ysis -ex i -ten nis -vehic le -ðŁĺŃ ðŁĺŃ -as s -high ly -op ened -b ann -ðŁĴ Ļ -mp h -wi shing -v or -fi f -give away -r r -ra y -je ss -g at -ic ymi -x it -high est -yor k -pi e -invol ved -high er -ri e -mal ay -int elli -desp ite -che e -sar ah -be an -reco gni -ar sen -tal ented -pas sion -ic h -ab c -lead s -dise ase -v is -se c -pre senting -m illi -hol e -sho ts -de part -surger y -gov t -b in -du al -e vi -lon ger -ev ol -scre en -portra it -et c -lo se -ch at -p en -p i -om a -s ick -er c -compan ies -en try -plan e -gr y -ven e -liver pool -premi ere -sha red -a red -fil ms -ir a -holi days -cric ket -ici an -v ing -. ) -ul timate -di vision -con duc -se pt -for ces -mon t -s mart -disa pp -sun shine -in d -b less -ma de -col ors -fran k -ir on -bott le -s go -m ood -j ason -er ic -bir th -te en -respon se -tar get -state ment -fe ar -th el -al um -ar ab -bl in -direc tion -ste ps -er ial -wor ked -at l -ðŁĴ ķ -fel t -pol i -scen es -hom es -b ell -e at -ate ful -t in -l ace -fol ks -p se -an n -wis dom -fa v -but ter -s r -are as -sm oo -bi z -dg es -app o -mo re -the m -effe ct -windo ws -sun ny -cap ital -tot ally -c ities -gr ant -mb ers -s low -au tu -il ities -w ro -ri sing -st ics -viol ence -i gh -qu ot -h it -t c -herit age -bu ff -ne s -z ar -den tial -ex ac -ed ge -de ep -aren a -be came -benef its -mar ks -mb er -a z -am es -pre ci -dra gon -re g -d ings -do s -ðŁĴ ª -n el -s ity -me al -di st -leg end -pur chase -pic al -st ick -f at -du ba -profe ss -car to -pro f -coun tries -respon si -se qu -fa b -tribu te -hon ored -prac tic -pur ple -an ton -pa red -t ough -summ er -environ ment -s ons -ðŁĻ ı -m ps -gi es -her oes -t elling -hen ry -f en -know ledge -Ģ ï¸ı -f r -ne g -u re -ac king -hear ts -s oo -hol lywood -ju mp -sau ce -schedu le -tur n -yo ga -cre ating -c ket -cre ek -â Ń -custom ers -ma dri -gu l -asse mb -moun t -c ell -to p -st al -dav is -t wi -sig n -premi er -iti ons -he aring -un k -pati ents -app ear -heav en -al ty -doc tor -a e -plat form -je ff -ðŁĵ · -regi onal -bi d -box ing -ex ten -or ity -a w -w ise -il le -sever al -bi e -s itu -sy ria -âľ ħ -remin der -enter tain -li on -part ners -in n -ph ar -f au -pl s -expe cted -sug ar -deci sion -s b -ch ron -associ ation -leav es -vis ited -sh ap -ðŁĴ ĸ -fur ther -h ann -w i -run s -l er -fun ding -fil led -.. .... -tin y -han g -or g -co ol -se min -ðŁı Ĩ -spon s -nav y -sa int -dru g -d al -r oun -co vered -tra ditional -invest ment -de te -al ism -f low -n is -sun rise -fe at -f ted -we ird -je re -ve gan -medic ine -an o -ac cu -deli very -temp le -chang ing -wil son -phili pp -re fe -n d -is er -g ay -r and -ati ves -t ely -p and -intelli g -g are -am bas -de mon -commit tee -strate gy -refu ge -bud get -prote c -pi er -ex press -nom in -econom y -al low -ic on -gal ax -o h -indi vi -dem and -vir gin -lu ke -ali sts -man i -s mi -ju dge -ent y -mic hi -resul t -am ed -spe aks -' , -hou ston -sh in -b ing -fl y -ch em -au to -v as -ge t -ar m -thank s -d in -gan g -x x -si on -loc ated -p l -jo sh -in fo -jo ins -adver ti -ot d -el d -si e -re asons -v ent -ðŁĩºðŁĩ ¸ -â ł -convers ation -stu di -ðŁĶ¥ ðŁĶ¥ -go s -s ounds -un it -mu sc -ge l -ack ed -pac i -co s -de re -u u -a o -la m -inspir ing -ar ms -tw are -mat ters -ad dic -du de -ex t -cri sis -b ath -me et -sing h -expe ct -del hi -resc ue -wor st -au g -shi pping -ser ving -st o -dar k -ac es -histor ic -landsc ape -desig ner -b illion -gr ateful -wa ke -e ve -m iller -hou sing -dy nam -is co -be ha -sh op -pr ou -e as -a sia -e ding -k on -depart ment -aw ar -mar ine -in ci -photograph er -ta pe -lo go -r ings -d it --- -- -vin yl -w c -vo ting -se ven -ambas sad -dal las -t u -com ment -k ra -b les -w ag -u d -au dio -stri ke -offici al -o ts -me tho -to ols -ra di -al an -hun t -wat ched -a ke -fa ke -drin king -mer ry -m l -b day -ri o -ni ke -c ant -re pe -co stu -mur der -ak ers -ch ers -ou ts -beg inning -so s -ad es -n in -not es -wro te -sol o -c i -li ghting -ur ban -bre xit -att end -shir ts -pla yo -ac tress -pl ic -stand ard -quot es -par ade -anci ent - © -tur ing -re e -pri mary -fla sh -citi z -mat es -ste in -z i -clin ton -sk in -gen e -hu m -g ar -t le -y i -fo cu -de an -pl ants -cy ber -b u -om e -ho p -ad dress -ti x -gi fts -relation ship -sub scri -fe ed -exac tly -haw ks -ex o -stre ss -s n -arre sted -an e -sof tware -z ero -the me -mu mb -im migr -mi a -make up -ple asure -uni vers -har b -eng ine -ap er -r in -br a -institu te -le ather -al th -sing ing -co s -gh ty -me as -st ic -si de -insur ance -co t -pit ch -moun tains -cri min -su pre -valent ine -at er -wou ldn -sc ale -rel ated -re gar -star tup -pack ed -mi ke -week ly -p ts -coun t -ha r -gott en -min d -ber lin -con ditions -swit ch -cor n -sa ve -g li -emer gency -tun ed -sto ck -discu ssing -every body -s day -whe ther -wrest ling -ec es -gen der -ch en -ðŁij Ģ -madri d -mar athon -e gg -i er -th x -as king -kore a -wol f -ay a -g m -g au -at ory -v r -gra ss -k illing -b ble -ur o -un i -e th -sh ore -th en -re ale -bot tom -ex erc -k ar -or ies -ad ri -san ds -se x -. ' -volunte ers -per form -par liam -inclu de -deli ghted -execu tive -fu el -kis s -ã ħ -char ge -h u -ca kes -ve t -g lu -agre e -pr ices -n au -h l -g ru -ra j -streng th -b ic -sp ending -al es -av en -b last -: ( -yo f -nor mal -si x -qu ick -se a -d aw -mee ts -lo vers -upd ated -po tat -comple ted -coo k -opportun ities -p ure -organ ic -tem per -c am -avo id -par king -duba i -and o -di stri -to y -comple tely -don ald -tri al -bas s -b oun -back ground -v as -mar vel -lu m -ru s -t ool -com missi -throw back -fin ding -is lam -! ? -st op -e vil -or al -resi dents -i denti -o ak -ðŁİ ¶ -l il -span ish -chap ter -sto pped -direc t -ho sted -pic ked -lab our -lew is -defen se -à ® -health care -wh is -mat h -pe ak -ra ised -fi x -bu ll -th ir -chel sea -fol k -tr e -can di -pau l -ei ther -ad am -poe try -jewel ry -ðŁ ¦ -pr ay -Ø § -g c -o z -wi shes -fore ign -sun g -lear ned -en e -n ing -micha el -illu stration -legend ary -w av -b au -ðŁļ ¨ -cal end -stre ets -â Ĩ -mon ster -bu ck -g r -scho ol -ba th -wa ste -ne ck -ha wa -be ach -re plac -jec t -on er -fac tory -coun t -ðŁĵ ¸ -mor gan -der ing -se an -steph en -de p -no vel -vide os -ic al -press ure -arsen al -ex pre -ir s -tren ding -ss a -fla sh -re sear -thr ough -profess or -scul p -to s -gg ed -mm a -be e -a pe -hun ter -am i -he i -pla stic -bu cks -uni verse -le gen -niger ia -ple ased -ri s -thin ks -autu mn -i ds -d is -anth ony -ðŁı ½ -ak ed -gla sses -fin ance -z er -k as -con tract -nu mbers -sh aw -partner ship -t il -laun ched -s al -victor ia -theat er -usu al -nam es -perio d -eli za -i th -bar cel -ro cks -bag s -mat e -distri bu -j on -di ffic -ali zed -cur ren -sco red -b ha -du blin -ro se -in ted -soli d -beha vi -wal ker -simp ly -garden s -head ed -in i -ohi o -we ap -f o -gl en -e state -ran dom -th under -thr u -k ill -jac ket -it i -entertain ment -thanks giving -ent al -en coura -el o -a ther -tan k -high lights -f ting -ru le -model s -bor der -bj p -hus band -in done -ken ya -be ars -al o -n inten -pi x -str o -or ders -sal ad -ro ads -n or -l ation -sop hi -ðŁı ¼ -pi eces -b one -min s -inclu des -nu tr -phi l -s ent -fun dra -ga in -bor ough -n ad -mon day -activ ity -it ems -be coming -ken ne -de tro -car di -gue sts -u x -world wide -sever e -new s -thank ful -fic tion -ve ge -m all -si an -er al -inj ury -le e -men u -danc ing -scot ti -exam ple -( # -na i -studi os -ba i -ðŁĴ Ľ -j av -diam ond -vin ce -ric k -prote ction -lin col -cham ps -appro ach -d ar -m ile -clou ds -je ff -in fin -l ers -p les -pe ace -go p -âĻ ¡ -tech n -str a -a verage -ef fort -introduc ing -di versity -austr alian -am p -boo st -s ke -pati ent -appreci ate -ici ans -pu r -f ell -woo ds -illu str -ðŁ ĸ -ag ency -ac tions -brit ain -under way -se attle -el and -ag o -f ill -stre aming -pro test -challeng es -ky o -et sy -coo king -exper t -ru ss -rain bow -commer cial -sp in -be ats -c ry -val u -el i -th row -gr ams -le vels -michi gan -c ad -ador able -const itu -w s -pu b -mid night -th at -net fli -braz il -die go -regu lar -jo y -âĤ ¬ -li qu -ea stern -k ni -fl at -n p -bro wn -w er -se y -tt ers -ac ting -v anc -cy cling -program me -ra w -comple x -tat too -throwback thursday -se ssions -ro oms -si ght -speci es -bom b -lau gh -ke eps -mo on -offic ers -con ver -t r -ha sh -t ack -ri ous -ad ap -a j -reco gn -ex po -sug ge -confir med -rol ling -dre ssing -ic t -fri day -ph ones -ri dge -con cept -ro y -ke ys -ef for -c ate -k ne -ev en -l ay -commun ities -mo d -n az -every where -al ab -bit coin -ban ks -out door -feder al -sto res -h p -c al -m ely -sig nific -be ar -re public -clo ser -al lah -pic k -x d -pal ace -ch ill -b am -er ous -un a -al len -out standing -olym pic -supp ly -fi gu -v au -l p -char lie -un es -> >> -legen ds -ici al -co ast -benef it -mul ti -f its -far mers -am ount -si sters -har ve -hon ey -que en -b ers -pl ann -âŃ IJ -m u -barcel ona -al ber -stat us -re main -ex tra -c andy -vi ous -âľ Į -o v -warri ors --- > -ju mp -am ar -x mas -stu dies -i ors -k or -don ate -pre p -fi sh -im a -pain ted -ad mini -co splay -spor ts -dro ps -fi ghter -evi dence -ðŁĴ ª -la ke -ro b -cine ma -pro file -à ± -stan ds -leg acy -sh ape -ro of -ci vil -i ans -sy l -sh am -vo ted -re tail -ph illi -li sted -du ty -n b -th es -f are -au ction -ffici al -stor ms -d p -l oun -sh ops -al y -ani me -multi ple -ðŁĺį ðŁĺį -psy cho -je an -ap art -candi date -gg y -con f -jose ph -w ick -me at -fr ame -c l -for got -ph y -f ing -li ed -re p -se ed -f all -u fc -nu t -lin d -mo de -fiel ds -en ce -s ley -ðŁ¤ Ķ -ch ill -follow ed -announ ces -cor ru -tro phy -them selves -ac le -al du -k ong -l on -s v -bro ke -ander son -ta i -stor y -tempor ary -activ ities -k ati -ari z -cry stal -spo ke -extre mely -tra ding -ðŁĴ ļ -à ¼ -in ch -ed in -out fit -equ ip -ma di -form ed -be ef -po p -ti ger -this day -ti red -neigh b -re tro -is a -un t -t as -kan sas -de st -secon ds -ta y -hur ric -o u -galax y -dad dy -bro w -bur ger -en ced -de sk -ac cur -secre tary -el ite -k ab -ch in -touri sm -bud dy -ici de -dre ssed -u d -vac ation -che ers -com for -charac ters -j et -bu ying -l ins -n ap -reale state -li e -af c -i ii -f ame -n r -b at -ag ent -ma kers -âĢ ¼ -sec tor -op ti -le on -di et -pra yer -hi p -mi r -le x -br y -an a -pas sing -w en -reco very -ak i -po pul -res ort -mar ia -stu ck -read s -ti er -perfe c -netfli x -p oo -cham p -o c -re duce -we red -comm ents -cla im -acci dent -s ag -h ack -sal t -kin da -k iller -i os -z y -ex change -lec ture -eng er -ic king -t au -reve als -pri son -z om -gh an -u l -jour nal -i ot -tr in -jon a -govern or -cap e -quar ter -spec tive -impre ssive -bab ies -t x -m ill -o y -har ri -jo int -su e -collabor ation -tren d -revolu tion -re new -alum ni -ge tt -sh ell -sun day -ent u -ni c -donald trump -block chain -paci fic -expla ins -sp y -ad voc -par adi -to f -star ring -p av -fe ed -br ac -smo ke -ham p -y am -to kyo -si mon -d h -e ffici -phys ical -n j -ell i -s low -gradu ate -americ ans -ti fy -f red -ap ore -fin ds -rob in -we t -not ice -se mi -un ve -k om -pil ot -scre ening -da ily -ðŁĴ Ĺ -roy al -sp a -vo tes -n ag -wh ate -att ending -exper im -ad dition -k ate -sto l -m ali -foo t -chri st -ch an -de e -lic en -glo bal -mo ore -ti a -bri gh -myster y -y ay -âĿ¤ï¸ı âĿ¤ï¸ı -cre ati -me chan -clo ck -di c -âĢ Ķ -pp er -al ph -through out -al low -re sources -selec tion -ham il -bb q -aa aa -virgin ia -dis ney -en g -so red -drin ks -f ancy -consi der -end a -jan e -hand made -du l -on tari -i us -s ville -color ado -whate ver -whe el -promis e -ne ver -desig ns -ab ly -sex ual -vanc ou -at i -con vention -cul tural -sing apore -pro mo -load ed -gla sgo -pp l -n oo -ke e -ste m -men tion -i do -cru ise -ri ding -be comes -be y -âļ½ ï¸ı -tw in -dedic ated -na sh -de si -work out -jen ni -i v -grou ps -rela x -pho eni -li ft -mix ed -m ck -p c -mu st -me tro -ci es -y ar -a im -ang er -i e -rec y -marri ed -dro pped -eng ag -le st -ambassad or -op h -de s -w ick -assi stant -nat ur -fa il -l td -shor t -k ap -sha w -bi gger -rema ins -crit ical -sur vey -co verage -er son -win d -n b -bil ly -let es -ac ts -jim my -at lan -al and -t c -import ance -dam age -f g -stor age -tw t -bon d -bal ance -cr ying -pu ppy -vo te -pu sh -ðŁĴ ľ -pol y -me l -lon don -terr ori -effec tive -corpor ate -atl anta -jac o -nas a -gre ek -sen ate -i sh -ev a -intellig ence -effor ts -al co -k un -h all -di ag -claim s -fir st -h b -ba e -v ul -pu ll - ° -se par -spe ed -vic ti -on thisday -audi ence -r ates -te ach -fil ming -bu sh -son g -y um -br un -ra ine -aw a -par ks -ð Ŀ -ra bb -ra ch -ra id -reach ed -ra il -mo ves -selec ted -fr i -ra ising -om y -st ones -su k -franc isco -cas es -cap it -con fu -w tf -po ke -equip ment -gre g -ess ential -off ering -ne x -pi es -be c -cre ation -chair man -cro wn -w al -john ny -shi ft -ne ck -ban g -bir d -ðŁĺ ı -du ck -re serve -de pu -ma sters -over all -no tic -ju ice -sne ak -che er -cla sses -eag les -n ca -car pet -ci vil -coach es -har ris -u ps -b alls -dec or -mar tin -ro s -v ice -announ cement -who se -ti gers -ste red -c ts -dr am -ste el -youn g -inst all -supp o -recor ding -de ck -se ats -l der -ang le -bo t -sty les -elec tions -for tun -n ab -but ter -ari an -ka sh -in ner -ou red -be ast -we i -ic onic -exper ts -ne cess -b eng -jam es -li a -gre ece -ðŁĵ · -ðŁĺ ģ -good bye -m itch -tw ice -mumb ai -ste am -ru sh -med al -ne tt -fashi on -t ar -r s -sav ing -ric ul -l m -sleep ing -brook lyn -mis s -sen ding -disco vered -sp here -of theday -k icks -missi ons -w right -er n -ght ly -i ous -mel bourne -star tu -mo ved -car ry -d ak -ag ues -bel gi -e ma -way ne -do t -er ie -pe l -it unes -matthe w -no body -est ab -cal m -win ds -lu c -prep are -tren ds -exerc ise -adv ant -ðŁĴ ¯ -athle tics -app s -c tions -adv ance -laun ches -litt le -real donaldtrump -eliza beth -carol ina -hu b -hi dden -n w -us er -pol l -great er -mo st -f ed -p at -life style -s ati -sco res -marri age -l r -aven ue -de serve -ri f -ðŁ Ĺ -wat ch -champion ships -gr ay -en ni -cot ton -g om -whe re -pack age -su m -ab solu -new ly -foo ds -ty ler -assemb ly -musli m -ban k -re memb -op tions -produc er -land o -fun ds -u pper -shad ow -pro gre -co p -ing e -leg s -detro it -hill ary -jo se -gi ants -sou p -sustain able -t us -clo thes -roc king -n z -min ne -mat eri -bru ce -ear t -ca sting -independ ent -thou sands -ta h -de cl -veter ans -li ons -wra p -âĢ ¦ -de ss -bl ing -st ine -e ggs -o on -clo sing -z ay -at t -bac on -fa il -ariz ona -de pre -gho st -new sp -w ers -vi p -li ked -id ent -volunte er -ad ult -pu pp -cir cle -mat erial -degre e -gro wn -boo m -calend ar -su r -vie wing -ath letes -ch and -re ll -asi an -en tr -vol ley -victi ms -bo dy -m ama -trans fer -ge ek -in dic -sav ed -ma i -g ent -it s -loun ge -k ol -the ory -situ ation -is lands -ar th -z oo -floo d -vi ously -show ed -parliam ent -ch ev -el ine -at trac -ab ad -ta il -h rs -lu s -por tu -gor y -provi des -to ys -de ath -in fe -an ce -g le -li am -lo ver -hu d -dv d -reve aled -g w -re ment -ca the -l ying -ra dio -der by -stor s -che mi -hosp it -âľ ¨ -' : -ilo ve -le mon -re public -s ni -ne ss -do or -re action -pre gn -fla v -schol ar -spo tify -is ation -vis ual -aw are -spon sored -jo ke -less ons -leg is -lo ck -si mil -ðŁĺ ĭ -kin d -la y -ma h -ho ping -vancou ver -as er -clean ing -gal a -thre at -la p -ach e -ro mance -ex pen -re post -z am -e pi -mir ror -o ak -ad ul -bat man -s lu -l c -vie wed -re views -d ates -indone sia -acti vi -off en -lea f -i si -ag ricul -costu me -s ites -spir itu -appear ance -ir y -st air -applic ation -spec tac -ic ity -ski es -hand le -pun k -paradi se -t n -de al -provi ding -do c -recei ving -bre w -micro soft -à ¶ -fer r -me tro -th ail -y um -car ter -à ¡ -gent le -bre aks -coo per -show case -cu tting -egy pt -bab y -semin ar -gl ori -ss on -fa ve -re hear -lo tte -la dy -al as -pre p -deli vered -nu clear -ir o -engag ement -at ta -con ven -z an -gl ory -hol ds -busine sses -str ange -sch e -it self -gra d -mar kets -f alling -st ats -ge on -bu dd -li s -she et -thi si -co lo -deser t -regi stration -ig n -expla in -inter ior -la ws -writ ers -spr ings -k r -fri ed -blo om -inf ra -a o -cre d -pa st -line up -bo o -bre a -boo ts -celebr ity -att acks -bro ok -ev es -ex cu -cher ry -oo p -fas cin -boy friend -se as -n ine -effec ts -po wered -k ha -ðŁĺ Ģ -sh out -con dition -i j -her o -enter pri -win ter -applic ations -sho e -g el -batt le -pro grams -w art -ðŁĴ ¥ -ra p -ho l -dang erous -di a -coun ter -ric s -i or -k night -co at -emo tional -at ures -d as -whe el -fore cast -tran sport -glasgo w -king dom -prepar ing -im medi -ff in -awar ded -prin ting -ro man -fight ers -any more -bel t -p ine -win e -x i -employe es -logi es -al led -de mo -birth day -ange les -lo g -dri vers -neck lace -k ath -s it -athle te -ef s -s burg -pur pose -resi stance -rele ases -t is -vari ous -deli ver -ch al -s anc -opp o -cra w -neu ro -dr a -suppor ters -sna p -diffic ult -swe ar -logi st -pa th -attemp t -à ¥ -swim ming -ste ve -hur t -inclu ded -b ap -wa re -ðŁĴ ĭ -end ers -ja ke -le eds -cli mb -l b -im ple -li sa -clo thing -ðŁĺ İ -d t -com pla -sw ing -stra w -v als -k le -us ers -stor m -cu ts -ontari o -p an -hand some -i ow -ar gu -chec king -scotti sh -Ķ ï¸ı -si er -em ma -po d -patter n -de sh -en h -ed ward -t ing -k h -hal f -lincol n -mo ther -al leg -r c -volley ball -d n -g ay -all y -le ton -gro ve -l oud -adv anced -re spec -cli ent -supre me -thail and -ho w -gi g -to i -do t -dol lar -ðŁij ĩ -p it -r b -h n -produc ed -gg ers -âĨ Ĵ -ml b -can vas -fin eart -us d -in the -p son -actu al -s l -t b -ip ad -en sure -u mb -w d -sk a -mar s -k end -f eli -th ing -count down -absolu te -r out -dra l -p y -inju red -min t -hun ting -mm er -s age -li gh -ac ity -ex pan -mur ray -ar o -sec ure -four th -eag le -reli ef -st akes -industri al -clar k -under standing -see m -pl enty -sil ver -cla u -thre at -sa il -pro duce -ab str -is is -b r -eng ers -wor ry -bie ber -s j -just in -reali ze -ky le -esp n -fil ter -s ch -ty pes -game dev -d ing -twit ter -soldi ers -p om -car bon -y ards -child hood -ri ed -ke l -ele ph -t ons -key note -qui et -wi re -po sting -is sa -repre senting -bac ks -alex ander -celebr ates -ta ining -| | -ch or -esc ape -pe ek -ti ves -fiel d -ssi e -im pac -spons or -r c -we dd -cann ab -si des -trac ks -com par -con trac -techn ical -bi ble -expl oring -sh are -tra v -n ate -ill o -sc ru -m ingham -gun s -of the -sh ame -se es -ca tho -ac cess -ce l -repor ted - » -mari o -p ad -hope fully -ou se -y on -disapp o -ol o -p itt -pa c -ga p -cru sh -s g -k le -ge m -emp ire -dir ty -a is -avi ation -ze aland -fac ing -high way -d anny -spi der -ot ta -ðŁĺ Ħ -w y -col ours -in fl -co sts -olym pics -au s -h m -ho ward -pas ses -lau ren -mu sh -op in -r ho -disc ount -oper ation -em ily -mm m -cham ber -d il -to yo -shi p -sam u -pic tured -un ic -po l -keep er -carto on -st en -ig nor -n ations -n l -ta sting -deta il -offici als -mo tor -franc is -ed itor -ðŁij ĩ -pe ts -rang ers -t g -r n -w ri -nic hol -i se -spo ts -ani e -chec k -tri ple -ku mar -spe akers -ic ing -pre pared -ab use -friend ship -mon th -swi m -air e -sc ent -hamil ton -indi an -j es -yum my -te ars -da wn -i zed -worl ds -ðŁ ķ -b illi -st one -n hs -ba sic -p or -st le -ir on -ol der -cle vel -e ing -ðŁĺįðŁĺį ðŁĺį -prin ts -fir m -air craft -fin est -devel op -aar on -t z -gra ham -own ers -fo li -less on -qu es -bab e -cra ft -ph en -ju n -bir mingham -v ine -ll er -i an -fineart america -evol u -st ab -im per -war d -com ic -wi z -inv ited -du ke -mat ch -por ts -ro ger -diag no -ke pt -te st -vis u -r hy -so c -to x -b aker -sur face -co vers -man s -b its -x box -ff le -n an -gar d -h art -wat ers -v illa -re tro -light ning -catho lic -democr acy -neigh bor -pen n -cr an -jona than -la ura -vi bes -su b -coach ing -clear ly -uk raine -bra ve -commit ment -t all -mar t -ra p -mo di -sco tt -bro s -show er -ðŁı ¾ -âĺº ï¸ı -cou sin -appro ach -br e -com pos -hil ari -phil ly -g ad -quick ly -ri an -t m -vir tual -hou ses -k t -phoeni x -w ire -ff y -b unch -anc ing -tal e -snap chat -star ter -h t -k icking -ap art -th y -) ! -blo gger -it z -com fort -ang els -w ash -" : -ar gent -re quest -hon est -mi ghty -bo bby -k g -ro l -thou se -ex po -h c -tab les -mag ical -po sts -de m -n w -or lando -ab er -* ** -ðŁĺ ľ -environ mental -trans formation -mi le -w ic -hir ing -ma ine -bo ar -r ying -ti s -nit ure -twee ted -anton io -opin ion -fin ale -di y -f is -th in -trou ble -le go -fi les -qu art -sp a -curren cy -cli mate -fan art -rail way -sp ace -ban ds -dani el -mo tion -l eng -hol der -oc cu -mar ie -cathe dral -bu zz -bi es -nas car -bm w -bat tery -char lotte -doc tor -zz le -se ven -in san -d dy -st en -lab or -thr illed -se ren -docu mentary -wav es -cer tain -can did -allow ed -ninten do -star wars -ta p -home made -d les -ther ing -bre e -emp ty -pi ano -pos iti -coun try -por k -pu ts -per ry -m atic -spot light -ti st -or ities -we alth -c p -bar bar -commit ted -as sau -pro fit -e ight -hu l -fini shing -run ner -ss o -insp ec -char ged -christ op -lo sing -co al -ho o -ele v -de le -mo ham -don ation -c able -clin ic -j in -manag ed -ter ing -â ¬ -ur ban -depu ty -bb er -bur n -acade mic -o tt -sta ke -it er -sto wn -ack er -advent ures -ad ams -gre g -pro m -vo l -ac qu -con gre -pa int -citiz ens -c all -af ford -v c -as ks -the tic -independ ence -â Ľ -h itting -bl on -fu ture -â ı -in no -gen e -bo ards -di stance -se t -re mem -th al -pre vent -l ang -ob jec -su sp -mat t -in duc -bor o -pi one -re di -vir tu -prin ted -sco pe -shar k -suc ce -a stron -il legal -j ag -c ting -ine e -at o -rob in -nutr ition -b f -du tch -b n -fur niture -for gotten -at ar -ru p -hy per -bran ch -communic ation -degre es -on ia -un cle -promo te -or che -wi i -j s -but ton -ma jor -c bs -bri stol -premi um -ordin ary -e dit -m g -we ed -st even -: ' -gu s -te s -cap tured -dru gs -do w -wr ites -bi shop -whe els -ali zation -disco very -w r -rach el -ne il -hy dr -cu test -entreprene ur -kore an -ore gon -ul ty -perfec tly -suppor ted -histor ical -t wins -ell y -we l -de vil -in come -scienti sts -de leg -h en -on i -ic ed -gi o -cur ry -reve al -e g -buff alo -n ol -op era -camer on -haha haha -j ab -gradu ation -cra ig -r al -i f -organi zation -le ge -g ang -su d -edin burgh -l ack -fli es -g ate -thr ones -q b -the real -e leg -pp in -c les -jam ie -tn am -cryp to -ou l -p ages -a se -roo ts -stu pid -a did -boo t -prote in -s ap -si um -su s -end or -fun ction -don t -en na -ch y -squ e -wor ker -m tv -e a -k an -ðŁĴ ļ -mu s -professi on -t to -oper ations -al lo -c tor -inv ite -sc and -ou th -z im -lin ks -cli ents -sam sung -discu sses -n ell -ul tra -some where -ste wart -ine t -de z -b out -fac tor -ti an -tr ans -jere my -d b -ðŁĩ ¬ -or n -develop ing -spo l -coo per -ma u -rememb ering -tre k -famil y -sen iors -fo ster -att ended -w ing -trans form -ele mentary -hor iz -li sting -malay sia -it ch -warri or -philipp ines -russ ell -m end -initi ative -cre ep -to ps -br iti -a ur -shar p -adverti sing -ug ly -achi ev -materi als -bu g -dev ice -bon us -fac ility -col e -nh l -y as -plann ed -pol e -excell ence -tr ick -con fl -r p -achi eve -lo an -swa g -jess ica -ho we -p our -sc u -z oo -r ated -dre sses -re bel -mex ican -co ordin -me ss -atlan tic -t l -osc ar -wal ks -phar mac -investig ation -... # -cc i -eas ily -monday motivation -y ment -au ti -for ced -ar med -colle agues -pap ers -pro per -sha ke -bu c -le an -exhi bit -e vement -co tt -bi z -sp er -k ent -sw an -/ @ -girl friend -haw k -âĺ Ģï¸ı -mon o -ðŁĴ Ľ -stat ue -ðŁĺ ³ -ra s -te eth -preci ous -t ile -p am -swi ft -v ali -no se -dr unk -experi ences -come back -gen ius -wor se -sh ef -ra d -ed it -hon our -au spol -lar ry -h ire -gor don -achi evement -.... .... -su icide -alter native -su p -sur roun -sha ke -ke ith -pe pper -tur k -crimin al -be ck -su m -w alls -cn n -an tic -of fe -col li -win es -high light -hawa ii -emb ar -l fc -ðŁĩ ® -m v -> > -at mo -wor d -car l -shout out -bre wing -ì Ŀ -do f -s ic -hot test -col on -hh h -shu t -low ing -volu me -apart ment -agre ement -de stro -we e -religi ous -iow a -ro d -land ing -re present -ðŁĵ· : -la s -usu ally -h l -c ac -sal v -al ong -laugh ing -be ans -remin ds -pha se -some body -ma sk -ran ked -dest roy -sc i -â̼ ï¸ı -gab ri -le o -ro a -fa iled -si l -refuge es -re vi -r ing -ber ries -coo kies -y y -conserv ation -sh ab -human s -de termin -a in -ni all -as su -mb a -fro m -extre me -vic es -commer ce -ght ful -or dered -suppor ts -re cap -v or -dro pping -correc t -pay ing -mean ing -n j -qui z -" # -busine ss -ðŁĩ® ðŁĩ -indi gen -du st -box es -bl ind -x xx -zz y -ðŁĩ¬ ðŁĩ -ss els -s ant -dd le -hilari ous -desig n -wonder ing -vehic les -k re -ju d -rece ption -par ker -Ã Ń -pri vi -hy dro -sof tball -pol lu -lo cked -ba h -e ar -scri pt -di vi -br ace -geor ge -the ast -bel o -j al -tion ary -dent al -roc ket -pur ch -sh ak -manufac turing -e z -it is -con cep -tb all -ch s -direc ted -pra yers -oo k -phil os -vari ety -che ss -ser ver -g and -bal ti -ðŁĵ ¸ -sel y -cru z -spectac ular -bur ning -re present -i z -t one -mer ce -h ell -bed room -estab li -bo l -com mon -ãĥ » -ab or -kit ty -hei ghts -re pair -willi am -qu ake -alab ama -popul ation -re v -re tt -i sts -n ite -le m -a ha -clevel and -r m -po ver -ob se -mon tre -man ia - ® -con ne -car ni -sh ah -f y -u a -sc or -strugg le -bo b -' ' -appro pri -deci de -ff ed -ca ster -s ort -hun gry -dra g -ا Ù -gr ounds -d w -sli ghtly -car din -dead line -bron ze -web in -bar ry -sil ence -e uro -op tion -ear n -ðŁĴ ĸ -howe ver -na ren -na ils -bath room -v ine -ph d -min ing -gar age -( ) -shou lder -defe at -di r -o v -liber ty -ple as -x on -com pre -a v -j in -ab les -sil ent -fam ili -vis its -di pl -ha bit -milli ons -regar ding -innov ative -sen ator -r ts -v on -k l -wh il -requi red -âĿ Ħ -lu v -presi dential -po cket -hun dre -sho wn -fro zen -to ward -fa st -confi dence -r ough -indivi dual -qu et -ðŁı ½ -dom e -fi fa -engine er -z en -re mix -ðŁĺ ĥ -pl ant -min or -robin son -as y -pul led -cer tain -potat o -( : -pre s -oc ca -w it -it em -si e -d ating -thom pson -own ed -an u -vi e -te dly -good night -ex cept -ðŁĮ Ł -ira q -ki e -ren ces -li p -simil ar -sau di -vi g -arth ur -pic ks -mil an -hon da -ma xi -o g -ste st -ar ch -analy tics -ba sti -pear l -ter ry -hor se -ast ro -ac ce -laun ching -inter national -s no -ta sty -den ver -ir l -pe te -tor n -advant age -var sity -" " -sol e -g c -lan g -demon str -ol ds -un ity -ne ts -insp ire -cre te -nash ville -nel son -e ter -wal k -hy un -m ack -tre as -see king -ra ge -bru sh -ab and -whil st -co con -h ong -shel ter -i p -possi bly -so o -it ed -â Ħ -rac es -war ming -qu in -tele vision -mat ches -ra pi -ment al -pal m -jenni fer -rol ls -indi ana -b ars -cat ching -resc u -candid ates -fa re -âł Ģ -se o -vie tnam -alph a -michel le -visi ble -re gre -wn ed -app le -li p -f fe -li z -york shire -ha il -se asons -be gan -m d -k c -la p -fascin ating -hel p -ur y -u ms -nu ts -se m -along side -bri dge -ori al -o ve -world cup -briti sh -comfor table -i ve -hot els -fair s -hor ri -so x -d ining -stre am -bar ri -ss y -w im -ter ms -v u -pe re -l ens -wal ked -r or -l ars -shi eld -dou bt -pro to -cro ssing -me ant -medi um -ad ding -e b -che ap -fun c -pap er -bran ds -ry an -feed back -col lins -un known -tro pical -sand wich -fal len -for mu -selec t -lo ads -answ ers -or i -mag a -d or -du o -ali e -dru m -ur i -de er -sou l -sh ut -âĺ º -sto len -don ated -bu zz -patri ots -ha l -na sty -nomin ated -mon te -ki a -th ri -ing u -te sts -pe tro -ðŁij ij -ho sts -ne st -to pic -pat ch -m my -hu gh -ab ilities -ma the -s miles -g b -ag enda -insi ghts -chi p -ph an -fail ure -dg ers -ha i -signific ant -sho ck -ru ral -gl am -figu res -pot us -o ta -mini stry -appe ars -fe ar -r h -americ an -h att -son y -fi res -e di -n ou -e qui -wh en -univers al -mad ness -i x -sculp ture -b ach -t to -swe den -et a -en to -develop ed -month ly -ma ps -ra h -le d -del ta -sa ints -is lam -ben ch -fif th -v ard -so cks -wel coming -j e -tur ner -v b -ad i -nor way -ad y -hurric ane -por sche -tra dition -ex am -newsp aper -lu ci -a ver -ide al -d na -madi son -ðŁ § -wit ness -ac ou -insi ght -si mon -robo t -sna ke -n bc -ac o -ro ss -sh ment -religi on -ch ann -in su -camp bell -inst alled -we ather -hor ses -ol i -rober t -k az -ðŁı Ģ -veter an -th read -quar ter -ea sier -cap ture -hi pho -law rence -roman tic -pas sion -cl ay -ox ford -th ai -stu dying -fi a -elec ted -most ly -c b -tu mb -âĢįâĻ Ĥ -x l -sh an -fa ster -ev ans -sli de -sh ri -see k -mi es -chemi stry -pump kin -tu m -, , -ro om -fi red -li ps -pres ence -af f -brew ery -arri ve -sw ag -photo graph -pen gu -chi ps -at tor -val ues -accur ate -con temporary -princi pal -cannab is -ari o -any where -gi a -democr ats -buil dings -li ved -ap s -neg ative -m are -bal lo -li on -diam on -loo k -re form -tom my -il la -tre ats -hundre ds -port land -wor thy -ex cep -ar ia -ido l -be er -cd n -y u -aw k -ðŁĩ ¨ -c ells -à ³ -ident ity -dra wn -de vil -f inger -th am -ðŁij Ĭ -ear ned -fin tech -dol ph -twee ting -evolu tion -ðŁĵ į -est im -m vp -n one -ðŁĩºðŁĩ ¸ -toyo ta -au x -mar in -b old -l bs -ste ak -mur phy -it able -lou is -sol ve -pi a -sk ir -ill ino -webin ar -ban ana -lo v -th on -vo ters -afford able -defe ated -lm fa -air lines -super b -any way -deb t -bo red -ver si -me tal -responsi ble -m k -s se -f ay -cau sed -f p -recomm end -pla za -spor ting -alli ance -au stri -n n -t ours -surpri sed -arti f -th under -sur ve -wor e -bri ef -necess ary -z ie -ash ley -dra ke -r t -kni fe -im mun -char ges -a the -bri de -rep ly -g av -broad cast -pu er -brace let -cap acity -harve st -id k -perfor man -d ding -il ers -par a -jam a -pro vince -ch in -id ers -har i -te aser -ch en -re stor -r at -fl at -col om -ðŁĴ ŀ -ðŁĩ¨ ðŁĩ -smoo th -r t -p itch -stay ing -isra eli -t cot -per spective -do ck -open er -lo vel -x o -class room -l ington -go al -kenne dy -sh am -sp aces -mitch ell -home coming -uk i -claim ed -recru it -ing o -mu fc -mon it -g roo -resi dent -per cent -per man -otta wa -int ment -an xi -stand ards -wor ship -sche me -f x -pot ter -bi an -athle tic -af gh -s se -sat ell -par ties -âĿ¤ âĿ¤ -infra structure -rela x -mo du -wor n -smo king -y ach -practic es -wc w -am b -dome stic -tay lor -k entu -provi ded -mo di -ve g -" ... -ob serv -ðŁĺ © -be ard -m our -an gry -ðŁĺ ± -startu ps -woo den -di ve -na il -anti que -ro ses -torn ado -m at -^ ^ -su spect -far m -de vices -me ga -tu l -scholar ship -ge e -disa ster -arri val -po in -mar c -kati e -bb ed -fal se -deser ves -ric hard -ju ana -fre y -tion ed -hy bri -r w -sar ah -ach i -c ure -o le -mor ris -ch ic -broad way -la bel -pa k -pover ty -gol f -e red -f u -er ies -be es -alo gue -st el -wire less -je wish -ti de -blo cked -life time -b har -sp lit -am ster -th i -jo shu -br unch -ha ps -s for -oo ps -ka poor -hi king -suppo sed -ro of -re as -tra in -ti ght -tru mp -bas ically -r r -ea red -see ds -entr ance -c p -wi e -son ic -vic tim -he re -e h -ear rings -sal mon -arc tic -an ne -dou gla -corru ption -hann ah -ha sn -vo ices -con ce -att a -fle et -clin ical -democr atic -ton y -st ood -le f -twit ch -a il -honest ly -incre ased -dro me -don na -accep ted -visit ors -ap ar -ad or -p ar -jer ry -ra i -brand on -ab u -!! !!!! -me me -in gh -glori ous -b hu -pu mp -j ol -li ke -fi sher -ma z -ag an -destin ation -play list -le tters -gen u -br ace -celebr ated -bann er -r he -dra gon -ðŁĺ ħ -sig nature -gre y -âľ Ķï¸ı -al ice -be red -ph er -ber n -ca th -ga thering -sc oring -influ ence -sm iling -de pt -lo cal -a x -ac u -reti rement -hon or -her self -chem ical -asse ss -y all -fre qu -appreci ation -ac a -cho ir -cu z -so il -c il -repor ting -u h -enterpri se -gr at -jaco b -ru m -fe e -j ak -sp in -bi kes -phi a -ste re -p is -bloo d -t att -ra ft -war ren -sh eri -back stage -mar sh -hash tag -ther ine -re in -game day -guar an -reci pes -min ds -stron ger -issu ed -bic y -n ak -ment ed -sc ary -u x -pre vious -tt le -th ats -ac tors -u ma -tin a -bun ny -promo tion -u ss -oli ver -montre al -what s -appreci ated -la kes -excu se -kno wing -pri zes -musc le -shad es -sco t -ing redi -electr onic -ju an -comb at -s ri -e h -turk ish -l om -stri kes -pri son -re e -po pe -vi d -ol dest -dol l -sw iss -certi fied -cli p -re turning -lat or -le igh -tt es -wat son -heal ing -el im -per haps -ha ss -k au -d der -mou se -new castle -indigen ous -wel comes -co le -tau ght -no ise -appe ar -jo e -can on -wedne sday -u tah -c tive -dri ven -i v -c ell -stri p -ac c -focu sed -ar rest -sto cks -wo o -â Ĺ -notic ed -shad o -di spla -ter ror -bor ne -secon d -que ens -wo ke -ja il -no tt -cam bridge -har t -se af -fa x -ac cept -âĺ ħ -goo ds -k at -t win -h s -thou sand -s ins -su ite -amp ton -ar n -rele v -ric har -hoo ps -n bc -class ic -p ab -soldi er -de plo -le ans -install ation -cla sh -le ban -ee e -ti re -belo ved -fu sion -travel ing -ne i -coo kie -glo be -phys ics -s q -co l -wol ves -d l -ex it -" - -foo tball -le af -ster ling -hi de -minne so -fresh man -natu re -indi e -supp lies -bri s -iri sh -ink tober -doo dle -ic op -mess ages -adul ts -recor ded -fix ed -ar do -offe red -under ground -dr one -p ine -ma inten -and re -ham mer -s x -r ound -hi ke -bra d -ro me -fu ll -on ey -ro ws -colum bia -archi ves -appro ved -bat ch -illino is -recogn ition -shou ldn -fo g -nca a -ke vin -human ity -al though -pow ers -p ou -s ar -pe st -alco hol -con sci -phil adel -en o -t m -ok la -cate gory -particip ate -accu sed -bri ef -po em -clu bs -consul t -ja b -big data -amster dam -ac ing -certi fic -n u -d at -impro ved -and y -campa ig -pale stin -p ace -mo bi -feel ings -wol f -bra in -pro pos -inter active -prin ce -inde x -c is -cha e -peace ful -co vering -ac o -cour ses -mon key -re place -b l -bloo dy -tal es -brigh ton -neighbor hood -g ates -spiritu al -af raid -bre ast -b ones -ðŁij ī -vide o -w au -tou ch -inju ries -car l -ri x -une x -âĢ ¢ -fre d -consi dered -thu si -an ch -on y -u sa -graph ics -ac re -ðŁĺ © -com memor -com mod -go ti -guar dian -star bucks -pre vention -haha haha -admini stration -portu gal -fac ulty -bet a -ul a -al bert -bre ath -er i -le tting -tr ic -ment ation -incredi bly -ten nes -v d -ðŁĻ Ī -ed die -br ick -gr ill -bt w -wat ches -resear chers -t ney -ni e -p as -a ster -vi br -poke mon -ch rome -go at -pitt s -il ly -festi ve -y d -can al -ðŁ Ĩ -fi es -car los -re que -partic i -tra ins -sam ple -temper ature -sym ph -pic king -in door -z ers -playo ffs -____ ____ -ap es -ly rics -islam ic -performan ces -d ick -spar k -se as -hom a -gr ound -disc i -employe e -com mu -alas ka -al an -fe ast -dg ing -ban king -manu el -slow ly -tru cks -mc car -oo o -sc rat -orche stra -indivi du -m x -bre ath -stair s -equ ality -bla ke -loc ations -cocon ut -balti more -aa a -l c -ðŁı Ĩ -har vey -resi st -immigr ation -adid as -fil i -re f -lg bt -mo s -pp i -ken ny -terr or -ban e -apol is -s g -social media -ka i -hon est -as sas -bol lywood -âĢįâĻ Ģï¸ı -ferr ari -hor n -cryp to -bo om -mainten ance -i di -s man -w l -ext ended -in sul -ve s -go sp -tr i -pi g -tar ge -cel er -st ati -sm h -ri dic -appe al -? ) -con clu -cos me -she ep -christop her -en thusi -po lish -me ts -oun ded -sustain ability -creati vity -con crete -ra i -ali en -ble ss -te es -clu b -ro t -bo s -ex ist -perfe ction -lu ck -rock y -expen sive -mean while -happy birthday -pre t -thr iller -ca ve -playo ff -som er -l u -le x -def ence -am writing -home less -pro phe -ch et -past or -ðŁ¤ £ -land er -ww w -Ģ ï¸ı -tic a -! # -o tic -rad ar -po sters -pow der -po li -ha un -tra p -bl in -assau lt -shor ts -re y -sh y -squ ir -rac ist -gar lic -fu r -remo te -sm ell -impre ssed -fing ers -âł Ģ -din o -le ment -s nu -promo ting -str ing -produc tive -b age -ma son -ra z -direc tly -j k -ev al -ðŁij Ĭ -doc tors -co w -ri der -st v -re move -w u -na than -ro d -n r -= > -affe cted -inve st -mp tion -g inger -o d -agricul ture -s que -mu g -coun ting -ke e -mag nific -coo k -ani stan -roo t -plac ed -sym po -gh ana -un d -che er -thro wing -secre ts -f illing -opti mi -butter fly -bu bb -ðŁĺ ī -terri ble -d g -sil k -obse ssed -lo u -ai de -sal ute -mon u -philadel phia -scienti fic -i st -u ae -dess ert -bott les -can yon -ðŁĺ Ī -car ib -o ther -w ich -re source -guil ty -un d -le on -e ss -kan e -el e -tra iner -he im -an te -man age -roo kie -tre ated -po ses -rs vp -cau ses -aw ak -je well -le tt -on ics -tit les -cardi ff -g aga -bu mp -use ful -? ! -loo se -bb ing -: : -argent ina -de bu -cy cl -wh el -dis gu -j el -k ills -bio logy -ex ter -tra sh -bo dies -tr am -circu it -expe ct -la ds -w ells -sho t -ge e -naren dr -fa stest -b ent -b ills -mar shall -h ats -intro duce -citi zen -im possible -gi b -az z -net working -r ant -thin k -in dy -st ops -f theday -bri an -* * -amo di -dom e -coura ge -pac king -af fairs -g n -si zed -ent ary -pol and -swit zer -afgh anistan -w u -ten der -subscri be -mo sco -att end -republic an -hon ey -âĢ ĭ -si mul -we ster -foo die -or o -midd le -ab t -co pies -ma je -narendr amodi -ty pical -inspir ational -vit am -wis con -cu bs -tiv ity -h ali -e ars -k ay -d are -mari juana -cu rious -an ia -tom ato -re mind -ðŁĩ · -sc ared -cou p -po et -land ed -ri d -wra pped -mor ri -climb ing -e ws -fe eding -con tra -tho logy -gri d -ti vely -read er -la ser -di ving -di g -lat in -ti ed -shake spe -o ci -ad m -show ers -chu ck -mar cus -oo s -kne e -o live -ow l -dy lan -an no -g ym -deci sions -well ness -arri ves -sati s -chri s -thur s -ðŁ¤ £ -inter views -thank you -switzer land -over night -journ alist -ser ves -vol can -.... ... -plo t -nic ol -car rying -mag ne -tre asure -ex p -be ver -ðŁĺ ¢ -mar ty -mo le -don ations -recogni zed -b h -du s -sh ann -al do -success fully -ent e -ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ -cab inet -cu is -tit led -d as -so l -strate gies -deli vering -ad ds -ani an -ne ther -ðŁĴ ĥ -con tain -su its -pa irs -to dd -rel la -ro pe -ci o -cro p -paint ings -su z -re jec -bu st -d h -fra ud -m h -contro l -je al -destroy ed -al lows -wo ol -minneso ta -om en -j u -sympo sium -d af -lim it -accoun ts -load ing -inter n -re solution -hol land -qu al -meet ings -gra ve -cam ping -v am -re nov -liber al -am ber -gre e -hu mb -fe ver -el ing -broo ks -à ² -be th -ad ed -al t -ro e -perform ed -jo sh -frank lin -nic ole -de ss -bb s -m g -net works -min im -al t -weap ons -gu y -jas on -g ha -harb our -at on -pra ise -kentu cky -bel fast -st icks -blo ss -ho pes -an thro -famili ar -wa it -ch ile -depre ssion -la x -je ts -le ice -recei ves -si er -an k -de x -inde ed -fle xi -fab ric -lam b -hel icop -am anda -âĢĶ âĢĶ -compe te -sn ack -techno logies -sy rian -mom s -mu ham -cho sen -an at -dev on -shar ks -re t -fundra iser -selfi es -st ations -communic ations -tennes see -tu tor -ro t -valu able -dynam ic -nur se -i ed -earth quake -deser ved -a ve -sar a -stre tch -dougla s -ne pal -à § -ob viously -d ame -ra pe -any body -k w -pat rol -hol ders -h anna -info graphic -ec o -be ating -stan ley -bo ats -ri bb -e z -wit ch -inv a -ac id -boar ding -- @ -gi l -da ve -care ers -opp os -l loy -in ter -do pe -re su -j agu -sh ade -in dy -on ist -rel ations -ag en -ab le -inci dent -me ter -shar ma -id r -pro ve -immedi ately -tro ops -am an -g low -gaz a -blo cks -person al -chron ic -all er -si d -sh r -whats app -lu cy -ar chae -ho u -journ alism -our selves -go t -the med -shap ed -we ak -cas ual -leng th -sla m -ab bey -e v -coun ter -est a -reci pi -cha pel -expan sion -sel f -suff ering -sp ice -n z -sp art -desp er -boo king -quart ers -y on -ðŁĴ Ĺ -p k -continu ed -- # -man hatt -tal ked -sh en -com bo -hybri d -je ans -liqu id -se al -re tweets -ac celer -collec tive -t as -: )) -profession als -ra w -o tt -su san -ir ing -okla homa -re ven -survi val -cre ator -tran sit -st ac -sur f -i k -ed iting -ch illing -bai ley -ste al -ra ble -pa rent -hun ger -sn app -collec t -philos oph -dedic ation -c f -c m -le ep -repe at -re ha -un fortun -a er -a ero -abstr act -mon itor -ag ents -bu l -sci ence -harb or -drag ons -floo ding -ac compli -d ash -juli a -the red -tues day -cy ber -b low -ta ined -le m -refe rence -pp o -ne goti -char le -con nor -au lt -access ories -commissi oner -rain y -re ar -advis ory -luc as -ma id -co al -k av -pol o -ðŁı ¾ -tran sport -mar gare -straw berry -bur ns -gre ens -ne v -partici pants -col in -belgi um -col our -in form -d ell -br on -cal y -kick off -strate gic -re union -hon ors -li b -egy p -âŃIJ ï¸ı -hy po -si zes -regi stered -bet es -relax ing -bloo m -inten se -valent ines -insan e -w wii -p x -tri o -bla de -wiscon sin -con e -plat in -ali ze -ra ven -incre asing -indi ans -il ian -bl u -rabb it -exten sion -je f -au di -fer ry -s ell -a day -us b -swe at -cham pag -metho d -mem ph -assi st -s by -ca pe -remo ved -mag n -v t -r ams -f bi -tack le -phe w -h on -motor cycle -su spec -eleph ant -sub ject -let te -da iry -whe at -awk ward -ac t -tro l -mit ted -zay n -sheri ff -ene my -con s -ke tt -bul ls -ev alu -bt c -satell ite -ho lo -por ter -dia betes -bet ter -rele asing -sur f -: - -se basti -collec ting -en cing -e thi -go ds -al ley -health y -m ills -sma sh -co pper -cr ack -read ers -sp ac -licen se -bas ket -bang la -en tic -om i -m ere -si vely -anim ation -lan es -dent ally -chill in -fi e -k aren -dep th -li pse -n g -ri p -mel o -sand y -ðŁijı ðŁijı -vin cent -nu t -hu g -who le -cre ates -? ??? -âĿ¤ï¸ı âĿ¤ï¸ı -bak ed -up grade -rober ts -har a -carib bean -auth entic -mb s -mosco w -attor ney -wi ki -ch lo -hu ll -cor k -" ! -sty lish -ðŁĵ¸ : -di ary -impro ving -ex pand -bri ght -pollu tion -k nights -person ality -chec ked -fac ilities -z el -bow ling -gu er -ðŁİ Ĥ -on going -un its -hoo k -be ck -confl ict -to dd -far ming -educ ational -k ak -cla y -stro ke -bel ly -explo re -mill enni -th m -loo p -sm s -consi st -cir ca -br yan -d ab -youn ger -soli dar -pp a -experi enced -b ella -bo ard -shef field -steph en -consu mer -sub mit -spon sor -t ang -ag gre -comb ined -trac king -sand ers -b az -survi ve -fer red -equ al -se p -re ed -str ong -priv acy -st ap -un g -ac ry -pa sta -pir ates -ag er -fair y -du p -introduc ed -wi p -let s -spr ay -ðŁĵ º -gre w -a sts -pitts burgh -new york -jo ey -lau ren -tra de -ch op -pi pe -cla ire -behavi or -v ap -cre ws -lap top -ðŁ¤ Ĺ -che ster -disci pl -d f -out doors -k s -go ver -super star -cas ino -far mer -; -) -re turned -ðŁı Ī -ma il -roa sted -co sta -v ill -pe z -gard ening -distribu tion -sh ining -inve stors -ra sp -dec ades -reali zed -bar n -p ti -st able -ut d -pan thers -m ens -b n -ca de -bu cket -yn n -when ever -wa ke -da is -ber nie -lo dge -ju lie -atmo sphere -ðŁĺĺ ðŁĺĺ -major ity -par ti -exc it -cu t -me h -musli ms -be gun -fli ghts -vene ss -ce me -po sing -so le -g ou -dark ness -pe ach -cel tic -auth ority -grand ma -ful ness -smi th -speci fic -gar cia -co ins -good ness -aldu b -recru iting -den nis -gar y -sle eve -weap on -pl z -disco ver -harri son -recruit ment -ja i -ch im -com pared -tom s -mo thers -am y -archi ve -t ask -ben jam -se g -law yer -al um -inve sting -mi e -che z -j p -a ke -fl am -wall paper -âĻ¥ ï¸ı -t ton -che st -favor ites -we igh -coo lest -r ating -relev ant -lo gan -ma ple -run ners -pri or -peop le -ma ur -terrori st -te sted -carni val -su spen -me asure -m v -cyber security -app ren -terror ism -o z -v ital -ni es -gon z -fun ded -twi st -assess ment -die sel -en for -colum n -ad dressing -ca sts -pay ment -x ton -fi er -, ' -la st -ne e -un less -clo se -sk ill -cuis ine -fun eral -ti les -a un -k ru -relation ships -ðŁĴ ¯ -ev ent -âĢįâĻĤ ï¸ı -kind ness -pro posed -acou stic -a es -defen der -dan ce -h tt -w at -vo y -ðŁ¤ ĺ -au s -cli ff -sear ching -beauti fully -in qu -at l -speci alist -ðŁIJ ¶ -da i -tra ils -class ics -inst ant -v ous -re venue -mar ch -kir k -fr inge -fire works -tri via -âĺ ħ -tr action -wal ter -mo to -l ily -att itude -cli mb -sc an -sav ings -c w -fa ith -cred its -ab led -gra ff -auto graph -he he -ran ch -ha d -ro gers -ðŁĮ ¹ -f in -re qu -fol k -ad ditional -lyn n -u ber -dol lars -lo gic -wor th -so m -the sis -p ound -bi c -st ur -cer am -spen cer -en tered -v amp -organi zed -âľ Ī -pp s -tr on -merce des -no ti -compet itive -do w -ous ness -vic tor -gr illed -na i -pu tin -ab ra -bl ame -alex and -anim al -dec ent -p ent -inter ior -:' ) -but ler -bal let -ðŁĴ Ķ -albu ms -down s -la d -si r -pla in -p ers -blon de -dis c -paki stan -se ment -ga a -w age -ch as -man i -co ps -terr it -lo l -lau ghter -ri vers -magnific ent -lam p -w b -new sle -char ts -ble ssing -p unch -lon gest -fl oral -cu tie -fare well -sto pping -mb b -bu d -chee se -de cla -si m -mc donald -de ter -you th -t ch -fre der -kin dle -fer n -at or -as leep -p ond -spr int -p ounds -la zy -gh e -fundra ising -dead ly -gran de -dou g -he y -lin da -consi dering -i um -gol den -vi k -auth ors -di ss -u ally -appropri ate -mor ning -y le -hon oring -foli o -be c -re bec -fin land -formu la -corn wall -sh ay -cau sing -bl end -sig nal -t ent -kash mir -nation als -har mony -sc out -acce ssi -he ight -medi eval -impro vement -ke es -prac tical -car d -de par -hu n -om ing -cal gary -ste l -bu bble -gur u -ma h -unex pe -n h -ed a -me at -i ge -si o -god dess -in ches -tun es -br itt -sti on -ra j -âĻ « -mer cy -ðŁĴ ĺ -sen ds -i est -pol ici -val e -reduc ed -as ap -vi jay -defen sive -celebr ations -ri ders -med itation -har mon -g ing - ¡ -program ming -in au -sud den -m h -replac ement -sk u -j ar -gra des -ta st -k itt -brand ing -k aw -boo t -f ought -p ays -g f -iz ation -ho p -k k -activi st -v end -coast al -cha os -ðŁĶ ´ -se me -bill board -li fting -cu mb -sc al -ðŁĸ ¤ -stru ck -l v -indie dev -beat en -jun gle -al right -destin y -m ing -k c -ch ances -om an -q atar -cra f -tra ined -pri x -char m -o tive -s mu -e c -and ers -hand ed -al ban -certain ly -arri ving -i ze -sa i -tr ack -pain ter -hu mble -appo intment -head line -manag ing -mo d -as pe -andre a -à ¤ -ethi op -un ited -exi st -bal i -k ad -n t -d red -re x -recogni ze -tam pa -be ers -ati a -he els -no te -transport ation -tur tle -re de -hipho p -sp icy -sp urs -⬠ĩ -cor p -ther n -to ast -hur ry -proper ties -ma ge -mar co -ele ments -bou ti -syn drome -ms g -develop er -gra ders -he im -re sil -off ices -del ay -di men -vin tag -barbar a -ðŁĺ ± -vene zu -cu lar -fac ed -bar n -ðŁĺ Ĩ -survi vor -wor m -confu sed -passion ate -Ø ± -identi fy -electr icity -sou ls -brad ley -repor tedly -lun ch -shel f -eli a -swee t -smoo th -emplo yment -am el -manhatt an -ste am -oun ts -ye p -li ving -un e -descri be -ca res -man ila -sha wn -ac ted -bas h -st even -re st -pet ition -div ine -wel sh -rac e -platin um -ðŁĮ ¸ -p b -extra ordinary -solidar ity -m all -on ion -schedu led -game of -fer gu -de ms -nor m -p k -tri als -polici es -publi shing -st ole -fron t -charac ter -van ia -ex ce -sti e -sc a -resi dential -sa iling -ðŁĶ¥ðŁĶ¥ ðŁĶ¥ -spons ors -th ick -champag ne -she pher -continu ing -ven ice -per th -na p -a ster -y ak -un limited -cho ices -ne o -hi v -repor ter -bru ssels -f old -dy s -se mi -la wn -it alia -wi fi -as k -em ed -fr ame -monit oring -ste ad -i da -gr in -is a -fli p -re stric -offen sive -atta ched -di sh -wh y -philli ps -gre et -p als -mix tape -v ou -fiel der -spar k -alber ta -g len -ca sh -s ri -u ri -ro dri -entreprene urs -climate change -p sy -d le -em ents -lin ked -nether lands -acci dentally -oppos ition -vel vet -ra ys -c w -om o -m f -lmfa o -newsle tter -: ) -toi let -liter ature -di sp -phili p -uni form -sudden ly -head er -cool er --- - -prou d -bri g -nis san -scienti st -j ah -con centr -pac ks -appo inted -so ap -eng age -cho se -âĻ ¡ -se tup -jeal ous -har ry -g ation -tun nel -te mp -osc ars -dec ade -recomm ended -child ren -ab a -anxi ety -ve ments -sal on -pho too -organi z -mach ines -ab s -vil le -hy pe -ti ff -emer ging -av geek -[ # -contribu tion -bra dy -re sto -g mail -fit z -photo shoot -hel met -h t -eleg ant -ug anda -nur sing -or leans -pen n -na h -foo tage -em a -w o -w ad -concer ns -ve re -re mark -who ever -str ang -p t -qu it -sh ang -histor y -s ick -perman ent -ill ness -col d -visi on -he m -ar row -con vic -pin k -oc cup -bal d -ex hau -u of -am o -on t -ãĥ » -adop t -la id -smo ked -inter pre -ess enti -associ ated -b d -bb y -fi er -inst all -dipl om -con diti -c f -w ak -any a -gr aci -fi sher -s ss -ap r -il it -mus ician -symph ony -cor d -h ack -le gi -l v -bless ings -hum or -sc ra -e ti -min ster -trav elling -bu sh -jewell ery -li me -!! ! -pregn ant -pe e -lo b -cap ital -ip a -pen cil -la bor -duc ks -prou dly -wedd ing -dere k -m w -pe g -valent ine -an gu -re treat -pro spect -dang er -vul ner -up set -, # -sr k -x im -thur sday -n fl -kis ses -re ds -cr ack -re ward -c u -ko k -me te -aband oned -it t -me als -sp ell -stan bul -del ays -ru m -le op -gu m -no va -super man -ch ick -m is -dram atic -inno cent -r ounds -re c -auti sm -bangla desh -mor al -mo vie -sp oo -k la -âĥ £ -ou ting -mess i -ab road -loo kin -a im -q i -st ack -colla ge -à ¯ -hud son -sc an -ho e -ch au -oc cur -comm ander -ho les -ðŁİ Ħ -bi as -v on -stick er -ma k -responsi bility -colum bus -sa int -ed mon -rac ism -far ms -w en -gul f -may o -!!!! !!!! -corpor ation -ba chel -el a -inter nal -je ep -fol lows -di alogue -de rer -smart phone -he len -rich mond -equ ity -s land -b g -ne ar -av i -memph is -we ir -discu ssed -bad ge -p up -mi stake -phen omen -un ite -ðŁ Ľ -de pic -ri des -in augu -n at -sof twitter -comb ination -gosp el -âļ ¾ -ad mission -retro gaming -ðŁIJ ¾ -sch u -mb o -jun ction -al arm -à ¦ -gr ac -kh ali -k ul -m ale -cap tion -wi sh -te re -cor ps -ru bber -play station -er in -effici ent -l or -jo kes -in ary -nor man -lu is -inaugu ral -ch ed -âļ½ ï¸ı -di p -to e -str at -aa c -am u -pi er -co tt -comm and -tt en -sn oo -cu be -clo ses -class ical -s word -expre ssion -reach ing -n app -co st -affe ct -ric o -gi f -brea the -tri be -or tho -h ay -l g -fri es -n m -hi ding -richar ds -en de -mic ro -capit ol -cop y -ro m -regi me -mary land -tax i -di al -embar ra -un believ -ch t -v s -elim in -o dd -pen ny -sound track -l ings -trans ition -rema ining -a is -mali k -? !? -rand om -def end -ul tra -tru m -danc er -st ol -dri ve -a ver -ro ast -defin ition -se an -excit ement -partic ul -su rely -sh av -ber y -di shes -com m -is ol -i am -ob li -gho st -hugh es -chi efs -b as -conserv ative -speci al -fe min -sh ri -n ancy -inte l -tu ne -ðŁĩ ª -jo el -gg le -mo to -ðŁĺ Ķ -bu ck -d ag -antic ip -mont ana -gu id -fro g -ec raft -op e -dri ves -nu mer -x y -color ful -wednesday wisdom -illu min -bey on -inau gur -deep ly -pre fer -for tune -coo ked -ti ble -âĺ ķ -swe ater -it ter -tt y -u i -gi e -com plic -~ ~ -tax es -cu ps -di verse -sam anth -âłĢ âłĢ -ba king -sy mp -wa i -be half -mer cur -travel s -ðŁİī ðŁİ -or ia -eng aged -jump ing -reti red -n aked -p uni -speed way -sci ences -rehear sal -on ym -dy ou -pl ates -r ati -kri sh -jaz z -car ol -ra f -pen alty -tim eline -ru by -engine ers -ra f -bel le -do se -che on -esc ap -me g -ran k -or d -me gan -mer ch -ec lipse -âĺº ï¸ı -ple dge -kir k -per si -leice ster -sa k -w k -saf ely -yy y -je t -promis ed -j c -en ne -no ah -re no -re a -ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ -tra il -ðŁij Ģ -f d -soo o -ri min -w k -ภ² -i al -x ox -bis cu -d ale -fan dom -particip ating -fla g -privi lege -pe ach -mach ine -bo ston -gro ss -o g -mir acle -adop tion -u ss -mon sters -be ij -clar ke -pu shing -pra ying -ar o -d n -ell is -apol lo -od ds -refuge e -to w -b p -ðŁĩ¬ðŁĩ § -h end -app eared -memb ership -pe an -du m -viol ent -v y -potat oes -aw w -greet ings -t ts -ac on -sh ane -photograph ed -cra b -temper atures -cu ba -c fc -wel com -he l -in nings -m k -co de -kno ck -gra ss -swe dish -p ta -ick y -v at -lin ing -s q -sa p -ar c -announ cing -sk ins -cit yof -br ing -co x -gam er -it arian -i da -h d -ros se -sad ly -ge o -âļ ¡ï¸ı -tag s -fa ther -chan ge -l ance -whis key -adel aide -te c -stick ers -marke t -class y -bad ass -flo rence -lin er -fro st -k ate -ac on -scand al -es sex -ðŁĺ ı -vi vi -dr ill -blo ggers -recomm end -d ha -ac res -ro ma -bu y -gro cer -er ia -ma har -ff er -patter ns -ver i -com pu -st ev -ang a -ment or -do o -it ali -cdn poli -on ly -conduc t -elec tro -de f -wh ale -prepar ation -bicy cle -vi ral -turn out -bra ss -qu ad -hospit ality -pack aging -den cy -ceme tery -abo ard -dre aming -pic ture -t all -inv ent -ad mi -o e -tem ps -qu an -fun dam -pro mp -resi dence -mu d -sour i -âĦ ¢ -graff iti -gi f -d nd -com p -s war -pe eps -pale stine -devil s -san g -assi stance -bi ke -missi ssi -inter viewed -ne phew -dru ms -v and -gentle men -n sw -inst a -leban on -ee ee -oli via -ver y -rou gh -industri es -m ation -ðŁĺ Ĵ -bar rel -n ay -po ps -moder n -ill y -are st -on ents -protec ting -v ans -e o -vi kings -restaur ants -re ck -jac kie -andre w -w illing -he ath -citiz en -disc rimin -à¹ Ī -stu art -m ys -hi p -tran sp -" ? -te x -su shi -ke d -cro ssed -dist ur -pe dia -f ate -some how -mo th -proce ssing -is s -r in -u ts -yy c -ver t -lg bt -re id -on to -arab ia -habit at -= = -stre ak -simp son -addic tion -wim ble -deli vers -challeng ing -ðŁİ ¶ -fran ch -e du -s me -ai ds -hur st -th am -tari an -remem bered -palestin ian -fe es -tru m -sket ch -ur u -fit ting -jes se -ðŁĶ¥ ðŁĶ¥ ----- ---- -ba ch -ici a -colo red -da h -associ ate -int el -s eller -p u -stu ffed -ac s -b s -sh in -cooper ation -certific ate -ab u -ingredi ents -re v -in ge -el der -christi an -bun dle -th ic -dir t -beij ing -comm it -ted dy -ed u -to day -s field -w yn -confir ms -lo o -j v -ene ss -al pha -vir us -ari um -gr ind -bri dges -introduc tion -pol ls -bac ter -z ach -termin al -ra iders -fla vor -zom bie -vo d -sp reading -gameof thrones -effici ency -lat ely -ale m -twee t -cri mes -cl er -de y -dg ed -hy un -pay ments -cir cus -ðŁĺŃ ðŁĺŃ -mis souri -lu b -episo des -c age -po s -mat ching -tumb lr -lin ed -ge st -am bi -nar r -ing ton -regu l -blo wn -is le -co co -on don -joshu a -tour ing -sm a -sau sage -best friend -bo eing -desi re -sav age -ra pper -de vo -te ar -take over -cow boys -po ker -par ag -pp e -h int -we ars -se th -ro les -l anc -man ga -form at -fl yer -c ay -mo or -ba ke -spla sh -v ad -ker ala -proce eds -sil ly -reflec tion -di str -wi d -su it -ci vic -yan kees -by n -migr ation -di stin -or ch -fe mini -quali fying -tu ri -o be -hun dred -cra p -wan g -mathe mat -bu re -expo sure -fergu son -seme ster -re serv -pl ym -a hu -fac ial -wa x -wor ried -ca b -vi o -as a -co d -to pics -p cs -hal o -rescu ed -horiz on -ar k -âļ ª -hol ly -el f -ul ti -pu p -quali fied -attend ance -ati vely -destro y -y c -for th -photoo ftheday -c ents -ic eland -meas ures -de sk -port folio -artic les -direc tors -dat ab -e w -creep y -oun ding -hon oured -mi st -j it -men tioned -port able -iti c -d ann -friday feeling -am id -ti ger -scri p -helicop ter -hard ware -expl or -work place -austri a -beat les -ber nar -spi der -disc o -cul t -lim its -shor tly -fin al -nin ja -lu ke -le bron -wal mart -o il -van illa -shi re -ye g -ak y -c s -bl er -collec ted -t g -rol led -speci als -b ff -pier re -sh im -vi er -flash back -restor ation -individu als -pro d -fre aking -tu rer -o a -re fre -mor oc -gre et -re yn -care ful -our ing -u sh -is d -g ill -vie w -thunder storm -b led -pic nic -guar di -pi g -ar k -syl vania -bann ed -u cl -vi jay -ori um -av engers -believ es -eu r -monu ment -concer ned -la bs -ber g -a ap -vi sh -sing les -can cel -z el -ar ab -ru th -too th -ar ta -sh af -chair s -r ack -dise ases -crow d -cl y -fle x -christ ma -artif icial -tom at -fin e -dra ws -advoc ate -fran ce -Ù Ĭ -ðŁĺ ³ -heav y -s our -compre hen -no ble -aa p -hin du -cor al -g ars -ow en -n l -st all -yel low -mar ina -in ver -suppor t -tou gh -promis es -pi e -master piece -sco re -for ce -mor tg -crypto currency -o x -r ors -rock in -pro vin -ho g -no stal -oak land -pat rick -inclu sion -tra ffic -ah med -a ha -lux ury -con secu -de mon -âĸ º -b lowing -st ag -: " -encoura ge -ben e -sku ll -do dge -bu ster -kin son -wit ne -er ror -lo west -fel low -à ° -sh re -bl ur -vir gin -compos er -sli p -mor nings -ga ins -tab le -gra in -ari st -braz ilian -w we -tu es -ribb on -an ag -di st -sac rif -em brace -entreprene ur -af fili -de o -t ali -touri st -fat al -ì Ĭ -autom atic -ðŁĩ µ -we ak -wel fare -confir m -benjam in -fi ghts -alleg ed -me ad -strugg ling -pro secu -che f -à ¨ -propos al -er n -ðŁĺ Ħ -dy k -on gs -hon g -m ack -mel on -on ent -ru sh -d ap -tol er -pro pag -c ze -trans lation -wal let -cott age -sa il -constitu tion -ðŁĴ Ģ -mun ici -fav or -storm hour -i h -ðŁĺ Į -approach ing -pin ned -j ed -niger ian -n ach -sh at -particul arly -mc don -camer as -anni e -admini str -he at -electr ical -char ming -gib son -bouti que -ex posed -ac tor -pil low -beach es -genu ine -margare t -ben nett -lou isi -pos itions -el y -shin y -ten tion -architec t -ren tal -ac qui -goo gle -sub way -mom ent -ðŁļ ¨ -ri m -metho ds -cy cli -nor folk -Ù Ī -over whel -ra pid -we ar -happy birthday -progre ssive -ðŁĴ ¥ -co gn -pap a -f ool -philosoph y -pol ar -jim my -wi g -ðŁĴ ĭ -oper ating -reduc tion -ph i -fla gs -to the -o di -a res -k oo -k ang -ar kansas -ash ton -wimble don -sci fi -attrac tive -mississi ppi -logi sts -ral ph -la bel -gradu ates -ma ha -home town -âľĮ ï¸ı -foun ded -on the -li z -trans l -mini mum -pre sti -ta m -gener ations -re bel -journ alists -par am -mc m -acry lic -death s -tes la -w t -bry ant -jer us -i stanbul -muham mad -ri ley -k ris -work shops -is o -coun ts -stre t -prote cted -trin ity -man ual -r hin -r il -pleas ant -le mon -ner d -har der -dar ren -bur y -ra h -bas is -mi gu -occa sion -li sts -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ı -e b -de cre -hamp ton -ìĿ ´ -tra vis -trans form -puer to -nh l -av oc -tri ps -unexpe cted -ve t -di dyou -bar ber -st ages -m son -re presented -for t -l al -pp le -nic ely -ignor e -qu il -qu inn -h k -carri er -remin ded -am ong -pass enger -el len -gue z -sc ape -mu ral -youn gest -ma sh -d ill -rout ine -stain less -jack son -gand hi -th al -on ers -edit orial -convers ations -sd ale -autom ation -i ke -า ภ-ðŁĩ ª -hau l -la ying -men tions -am en -abor tion -i bi -coun ties -ca therine -man ds -jam e -roll er -au t -n am -o logical -cep tion -ran king -tox ic -sn acks -victor ian -bang kok -psycho logy -re g -ang ela -respon d -sty le -sophi e -dak ota -achiev ed -mar ked -imper ial -in as -glo ves -sli m -confi dent -att acked -gg er -lon ely -valentine sday -re b -craft beer -orig in -zim bab -ce iling -te ens -other wise -w b -f ers -day sof -advis or -y ah -âĻ ª -en der -republic ans -av a -skir t -pi pel -chi e -jan e -ja x -ðŁĺ ĭ -âľ Ĭ -j ays -bre tt -bal o -cru cial -d har -as is -de au -lloy d -chat ting -âĿĦ ï¸ı -rel ay -remark able -n s -we t -bris bane -ðŁĶ ´ -tion ally -f k -la yer -house hold -consecu tive -es is -pend ant -st ir -crit ic -su gar -photo shop -pa res -arti stic -do dgers -c un -cra fted -am end -bo at -âŃIJ ï¸ı -egyp tian -sa w -tra ge -small er -ox y -pa ired -nex t -i res -tac o -o y -u c -st i -a erial -: // -dr o -dot com -gg ins -r pg -ay e -le an -stri ker -lo bby -prote sts -pri ority -congre ss -am ate -inv it -r ington -mom my -th us -allow ing -pione er -enfor cement -g ori -tal k -dra g -du mb -bul let -san ge -er y -tar gets -ðŁĩ ¦ -he ather -consi der -seaf ood -ve st -ris ks -% . -p g -sac red -he ating -kick ed -tto t -. - -chan di -co ven -po ol -pul se -i a -ro ster -shakespe are -es a -car go -pean ut -tro op -ac tion -tab let -home work -cast le -stru ction -mus icians -free zing -bu tt -justin bieber -j j -bah rain -an them -au dit -didyou know -na vig -guid ance -âĸ ¶ -tur f -n un -fic ations -ye men -char ging -x c -bron cos -su bur -p ale -bor ing -among st -for the -em per -om fg -p j -expe cting -ðŁĴ « -st l -ad min -expect ations -sw an -shoo t -oooo o -min ent -ãĢ IJ -wall ace -stan g -satur day -adop ted -dou bles -hom ie -ome z -d han -vent ure -surroun ding -fi le -mob ility -de es -w ski -broo ke -emb ro -re members -kar a -test im -bo tan -m tv -sacrif ice -jerus alem -d l - ´ -proper ly -ili on -as i -leg it -co pe -m cla -recy cling -lar ger -ðŁĴ ĵ -pat ric -gener ous -ja red -p f -mol ly -thom as -ju dges -h b -sor ts -bl vd -o ven -enter ing -plan es -be et -integr ation -boo ked -fre ed -ver n -ash es -to pped -de pot -welcom ed -ren a -m ick -d and -see ks -gam er -ran kings -ren e -mu t -whis ky -fire fighters -gu es -ga ther -tour ney -de men -y ang -new ton -autom otive -back yard -deta iled -mi st -to bac -fi ber -un usual -grat itude -sp are -ne ys -: * -per i -flo ating -fin alist -don ating -dre ss -bro ad -be the -econom ics -tai wan -ed wards -plu g -pra iri -val en -bab a -f ad -an as -har per -dis order -app lied -p att -bi kin -li ver -cu ri -carol ine -ann er -juli an -wal king -mal col -screen shot -co ding -skin care -activi sts -myster ious -ex act -blo cking -mercur y -bat ter -du mp -âľ Į -en se -li sh -ridic ulous -prote sters -ðŁĻ Ī -lu st -swe at -as s -ali ke -co dy -re ments -win ds -as pir -vi enna -pra y -.. .@ -bo i -cand le -assi sts -te e -der son -p ony -f ence -con spir -âĺħ âĺħ -oo th -e pic -ba rely -a unt -b am -diamon ds -end less -scre ens -can cer -gr o -p st -pro spec -mo sque -help ful -ou ri -bro ther -gu jar -cri sti -ine z -to wers -ad dresses -gra y -bur ton -re tweeted -ðŁ¤ Ķ -n ity -du ck -super vis -jo an -kin der -sanc tu -pi ed -âı ° -ł ï¸ı -m ati -reven ge -ce ster -eli fe -desig ners -back ed -bo li -wei ght -cou ch -su res -s its -shri mp -la gos -auth orities -os ity -hol ly -compu ting -fac tors -ab e -pan els -ram ad -sent ence -missi on -hol m -r b -d ads -shang hai -mon ey -she ets -sk ate -thre w -cup cakes -infin ite -l is -practic ing -ess ay -ka i -as ci -mo b -u gh -hol mes -re gg -ik h -mo ck -collec tions -pe p -o va -sal t -nan dez -co y -thre ats -tex ts -cin nam -pregn ancy -pen ding -stam p -flow er -g is -agre ed -pay ne -ro ver -ph ra -sof t -f fin -fa thers -pass engers -aw ays -al a -h es -li van -in s -samu el -ingu i -h of -j j -chen nai -cat al -om ic -he ath -ni ece -pump ed -integr ated -are l -no m -produc tivity -wan ting -vis a -di ana -tw il -it v -cam ps -ro wing -d ley -black and -gu ards -b ells -re verse -vi be -ric ky -mo ss -ny t -âĺ Ģï¸ı -el le -tro y -cu dd -ev an -women s -fo to -mi stakes -wick ed -mi l -c led -me mes -co smo -schol ar -ren o -ðŁĺ Ģ -v ents -# â̦ -terrori sts -ca sey -cardin als -ðŁĺĬ ðŁĺĬ -venezu ela -bol a -liter acy -t w -en o -con tains -au stin -fin anci -ev an -har vard -origin ally -chev ro -her ald -nott ingham -manag ers -âŀ ¡ -accep ting -wal sh -tutor ial -entrepreneur ship -yach t -requi rements -glen n -pe de -unfortun ately -ach ing -dais y -gi an -night mare -âĿ Ĺ -r ina -b art -ema ils -oppo site -who m -sa ke -pu zzle -da shi -par ty -blan ket -bus es -lo re -beau ty -reas on -pun jab -winds or -func tional -exi sting -hel lo -gli mp -con vin -la k -scre aming -rebec ca -bli ss -north west -infin ity -cosme tics -pul ling -coffe e -pl ing -op ho -colom bia -interior design -( + -emo tions -sa c -sun glasses -sav es -d f -six th -al y -ðŁĺ » -de en -dev ast -polit icians -lac rosse -g u -pe i -jav a -comb ine -coal ition -er ts -survi v -ch ad -stri an -n n -de vi -coun c -concer n -contro ller -bre ast -j ury -tu m -introduc es -la di -mobi le -al z -ste ady -nur ses -h acking -on line -oce an -ðŁİ Ħ -a am -ju ven -ic c -louisi ana -ar te -street art -is on -wn s -fr m -p anda -no ir -main tain -del ay -symp toms -thor n -ge ome -ter n -carri ed -p ru -pan or -as sy -per u -clou d -sp ra -pe di -e ste -tag ged -ðŁĺ Ŀ -shado ws -naz i -ا٠Ħ -cor ri -âĻ¥ âĻ¥ -j ad -ðŁĩ « -form al -spo ken -ðŁĮ ŀ -enjo y -lo pez -out look -in ho -w ander -Ù ħ -ma ya -pe e -d ine -ãĢ ij -brief ing -suppor ter -ar ily -ght ers -natur ally -doctor who -j en -v ar -new year -re se -si mm -re x -con sequ -tomat oes -bur st -bra vo -bur gers -cr acking -nor theast -bi om -mush room -mar que -dou ble -ni er -v ag -tw enty -key board -win ni -jama ica -par ish -: - -mental health -ali zing -ren der -wa king -ðŁİ Ĥ -g ly -na than -wa shing -mel issa -jun g -loy al -chil i -song writer -guit arist -bo wie -neighb ors -onym ous -as set -ta i -head quarters -ðŁĮ Ī -i hear -ci gare -sur g -) " -re pl -dar ling -ðŁĻ Ħ -z ak -sa re -ãħ ĭ -mic key -ware house -mass age -ine es -did nt -i w -hur ts -eng aging -mag ic -women in -k itten -mor s -c art -tit ans -colle ague -compe ting -er an -k hal -mar ble -dem and -del ight -et ary -bli zz -lou ise -m ls -fini shes -experim ent -conduc ted -electr onics -itt ers -car ing -wh ats -sym bol -jun g -e cu -pi x -con text -char ger -ðŁĺ ĩ -re ig -fra g -ë ĭ -ch ad -tru e -ker ry -def ending -a int -au ton -check out -bar nes -less ly -d t -m me -clou dy -second ary -are z -_ : -app a -const ant -" ) -ve ts -jo b -i ent -ðŁĺŃðŁĺŃ ðŁĺŃ -m j -fren ch -di ver -davi es -hh hh -e book -๠ī -mar iti -bree ze -susp ended -mat o -vi et -ra hu -se i -bol t -en ary -le is -kar l -fr amed -expla ining -ab c -de aling -nat o -ja ke -exp and -leon ard -establi shed -du b -ar men -el led -voc al -nichol as -ori ent -k yo -illustr ated -ah h -danc ers -milli on -ge ta -po pp -as u -mur dered -gi ble -sto ked -gri ffin -maxi mum -adri an -en counter -ther o -david son -ðŁį » -holi day -ev o -asse ts -car son -memor able -âļ ½ -ob am -represent ative -cb d -tr icks -vo gue -vo ice -mm mm -sebasti an -cli f -ath y -par alle -ðŁ¤ · -pa k -ev acu -e ats -ا Ø -tou ched -organ ised -spir its -can ad -gui ded -frame work -ðŁĮ Ł -pe d -natur al -ag ar -replac ed -anch or -ti t -sha h -organ is -super ior -r n -ch ro -eric a -st ill -cor on -chu ck -loc ks -or gan -ro sen -sc am -ben ed -/ # -ke en -tre vor -vamp ire -sor ted -! ' -af ford -in tro -gr ace -ðŁĺ ľ -sau r -kick starter -influ en -v u -y up -po c -ðŁİ ¥ -a ar -s ang -tre k -et sy -tb h -scre am -chevro let -pix el -shepher d -an or -gabri el -tw ood -sd cc -me ters -develop ers -clo sure -v w -twit ch -ì Ĺ -se oul -pr ice -ho g -n ish -hill ary -scrat ch -in cen -wag on -dis ability -pan ther -ch ats -g d -wit z -sus sex -l ate -den mark -ger ald -cancel led -net te -i x -nav al -bap tist -te t -y ad -ma th -ho y -r andy -po int -intel lec -fru its -w ool -gu in -pr on -the ft -con dem -mar ry -n ola -architec ts -cin cin -roc kets -gentle man -ex plan -t ate -do e -ra ises -wild life -w l -insi der -blan c -w p -for sale -ny c -po well -unbeliev able -pen s -goo dies -mu stang -p ens -st ays -squ ash -xox o -near by -ever ton -co co -le agu -k han -stu d -south west -con struc -s worth -cro atia -le a -su ms -aim s -e an -van ess -iti ous -pa thy -arc ade -b end -sugge sts -sac ram -roy als -ri er -em ir -in cl -an k -clar k -ri ght -vac c -ठ¾ -tan e -li b -u sc -sal es -hu h -s ally -ver a -p ga -gro ws -dru m -tre e -eth ics -sug gest -is ab -se aled -pre viously -anim ated -ab du -ri ses -glo b -pre dat -scar f -del ic -om ar -ll i -sx sw -py thon -ne bra -fun k -reflec t -pav ilion -tic ally -ch asing -bak ery -inva sion -ko h -believ ed -co hen -con qu -cra fts -nat i -cle ver -govern ance -sam ples -fa ils -â Ķ -ti mo -r itu -stri king -inclu sive -sho cking -can t -requi res -dra wings -à¸ Ń -purch ased -du m -z ach -war ner -con sole -man sion -foun tain -circu m -e sh -is land -mil k -pro fits -hali fax -ri val -âľĪ ï¸ı -jen ny -sand ra -ny e -k elly -y al -qu ad -no s -inste in -fin alists -mid fielder -cu e -excep tional -a an -sa pp -gett in -sa a -f ati -sl ice -vol k -s wal -la sting -sum mary -it as -sm o -s z -âĺ Ĩ -ip l -fl ames -ene ws -ha v -hoo die -pitch er -win dy -re vol -centr al -ton ite -ðŁİī ðŁİī -sol ved -mil wau -organiz ations -wee ts -re fin -s th -ãĥ ¼ -el in -ton a -cinnam on -ðŁİ ¨ -ðŁİ ģ -ron aldo -pen insu -ome ga -el ds -desig ning -e igh -blu et -ben z -nu g -ash a -robo ts -su dan -choo sing -en do -ser ge -clo sely -hand y -fing er -be ing -ar te -survi ved -fl ame -mile stone -gu t -d war -fu tures -é e -el o -fri dge -eli c -ou ch -u b -p v -tit an -col lar -st ation -nev ada -aur ora -r d -dun can -âģ ł -bri en -mar sh -Ð ¾ -to tal -ch ry -s ers -su ffe -ra chel -colle ge -to days -cour ts -ch it -re united -gym na -gen esis -be side -re presentation -ch ant -collec tor -ra k -ath ens -ni gh -mun ich -langu ages -fl u -particip ation -__ _ -c v -spec trum -so da -co ver -refe ren -ab bo -ap a -public ation -ed m -mon ica -ar my -ðŁļ Ģ -div or -dr y -stre ams -robo tics -ci der -bull ying -appro val -sto ke -plat forms -sier ra -ex tin -i b -ha yes -succe ed -suff er -at ically -da i -lyn ch -h ound -del ines -ack now -d ated -exclu sively -he res -fac ilit -dam aged -char ter -la kers -fal con -unve iled -wel ove -e ase -pati ence -l one -gent le -gene tic -produc ing -g our -shann on -bil ities -zimbab we -p int -dau ghters -liter ary -bel le -cl am -surroun ded -k any -ne il -pir ate -rang er -hb d -nat alie -bel ong -olym pi -emb assy -sc ol -en er -ak in -lo ren -b h -: / -di va -den im -hi pp -ðŁĩµ ðŁĩ -arn old -? ' -we ren -em power -dis abled -man or -rasp berry -b af -aw ful -dru mmer -kar dashi -n ash -machine learning -ch u -rebel s -tim ing -mon roe -ton gue -ran ge -pup ils -re ss -amaz on -b z -har ley -pal mer -ballo on -s ings -ic ec -j b -c ers -g ps -whi st -ri se -l t -oo oo -c attle -shoo ter -vod ka -uc l -mt g -le sli -jon as -di spo -at ric -ste in -vintag e -fir ms -flo yd -cow boy -soo oo -is aac -war craft -disney land -beauti ful -be am -franch ise -bu n -k ag -an on -tur bo -swee p -made in -kar achi -dete ctive -penn sylvania -contro versi -vitam in -a side -chron ic -descri bes -remo val -ha h -ap er -ten ed -u to -bad ly -mir ac -f ry -ye a -in jec -ther mal -comp act -th or -te ed -ur gent -l ite -g illi -sop hom -ic o -che m -p m -for k -fre ak -ch ak -recipi ent -i y -ni k -model ing -c ans -ðŁı Ģ -del ux -se am -surviv ors -rad ical -investig ating -reli able -f m -tur t -ligh thouse -to ol -go wn -) ) -bo ts -auto graph -a id -bu ffe -h mm -horri ble -ssi onal -ann i -à¹ Ģ -k its -sch i -eter nal -hu ss -sens itive -r u -tast es -chec ks -im o -por tion -sk ate -e den -half time -fri ed -ri hanna -ti se -fl ick -ca in -s gt -âľ Ķ -sh au -sta ined -ra ffle -dro ve -sal man -princi ples -sh o -ar u -je ss -gu ine -gar bage -my an -jel ly -dis ru -z ia -q ld -ent ries -la v -fle w -ad mit -objec ts -comp are -ny times -cann es -p n -suff ol -ro c -d ana -e gg -hi st -coun sel -' ! -phy si -imag ination -ad just -explo sion -plym outh -hor ror -elli ott -bour ne -de x -bre ed -au dio -lob ster -disappo inted -nation wide -( ( -incre ases -austr ali -ce dar -star ing -rac ial -e is -g mt -visi ons -stay ed -discu ssions -de an -cur tis -mai den -stel lar -happ iest -h wy -pre season -car av -mon days -hospit als -glimp se -schol ars -ja i -ter race -ann a -goo se -gra ded -lot us -hun g -grocer y -stam ps -emper or -sc oop -in ser -c as -exist ence -he al -fal cons -mar vel -reduc ing -terri fic -magne tic -perfor ms -bar re -p us -tre ating -ic on -w h -decla red -tra uma -do d -come dian -nik on -bu gs -as m -mont gom -ibi za -comprehen sive -ha s -san ti -fellow ship -da sh -p sal -louis ville -sp y -fau lt -d the -fi led -vi sta -de sc -fe ars -you tu -sp s -es p -ri g -cri me -ber ger -wonder land -k ent -in formed -stev ens -my th -ast on -ir i -visit or -at ri -produc ers -al la -person ally -separ ate -agen cies -af ri -il an -spo ke -n ina -squ ad -di ves -de pend -li v -fier ce -enter taining -cha in -sc at -bor ders -pal ette -sp ro -os is -der by -tobac co -zi o -willi e -ju vent -zoo m -hol y -enti rely -af e -mart inez -be ds -pe a -bull dogs -ðŁĩª ðŁĩ -ib m -ne on -ethiop ia -team mates -plan ting -tw er -any time -for bes -ó n -run way -ner vous -ro ger -p ile -ch anc -apo caly -u w -o i -dr ought -territ ory -br ick -cre atures -go in -w aff -gre n -sou theast -je an -am bul -ed ited -stra p -c v -aar on -ãĥ» ãĥ» -t su -descri ption -kin dly -clu tch -im mer -en or -women sday -or ange -ra g -ob vious -hy der -chann els -man go -me yer -ra ining -ge tty -pil gri -coordin ator -up load -ninten do -don uts -san chez -app arel -j r -zz i -, @ -jeff erson -accessi ble -great ly -e id -initi al -budd ha -par is -ma scot -â¬ĩ ï¸ı -sch war -si ri -sp inning -mortg age -e cho -end ange -ge dly -chlo e -enh ance -kar nat -k ry -explo res -ðŁĴ ģ -af fair -ic als -all a -dar t -dolph ins -diffe rences -squir rel -au gh -dr ones -ell en -re store -pa w -un for -pi ke -hil ton -colla b -consu mers -co inci -out comes -pp p -a q -coup on -li est -si ms -k ho -av es -spo on -pu dding -cor byn -hat ers -ex ams -sla ve -. ! -p sa -app les -tam il -se d -co ke -zz o -lo sange -car bon -cla ir -... ) -k hu -cra ig -explor ation -sanctu ary -su e -al way -demen tia -won ders -super hero -pakistan i -brown s -bluet ooth -lo cker -mar c -ev entu -delux e -rodri guez -âĿ¤ âĿ¤ -ro bb -ðŁĴ ¦ -lin ux -ten s -intellig ent -se ed -vo ter -s ler -pe aks -inter n -teen age -peninsu la -hand ling -ti e -cou sins -wen dy -me e -à¹Ģ ภ-din o -ðŁĴ ° -ðŁĺ ĥ -ze e -s bury -trage dy -b k -bo re -z in -war ns -idi ot -tou ching -contin ental -tac os -saf ari -wa shed -po dium -morri son -fore sts -c bc -al on -partic ular -be ads -inv ented -lo ch -li ghter -where ver -i de -docu ments -a we -k r -no where -min er -st it -ro x -contribu te -har dy -cl an -ob ject -ca it -ðŁĴķ ðŁĴķ -happ ier -vege tables -t art -g ag -nom inee -heav ily -pan ic -j d -there sa -at m -u ph -s fc -su ri -drin k -n al -re vel -k l -avoc ado -nom ination -ma donna -shar on -malcol m -control led -sh ers -revi val -legis lation -shoo ts -n in -comm entary -pro s -human rights -str anger -mit ch -pipel ine -leg ally -th u -gil bert -tol l -gran ted -gh s -ir anian -refre shing -du k -ab i -pri me -jose ph -mo sa -stati stics -produc tions -mer ry -pat el -sa x -human itarian -struc tures -e missions -town s -fre el -ster ing -rat ings -alle gedly -cab in -st l -w ade -fl yers -tri m -promis ing -z u -bal lot -compar ison -free ze -ou ter -great ness -as sign -snow y -r ale -tor ies -med iter -kno ck -consult ant -cincin nati -analy st -sc oo -je ws -appro xim -pu re -portra its -cy rus -ation al -lo ans -acqu is -el u -accep table -uni on -water color -ru st -batt les -per fu -seas onal -ser ial -mind set -ri ot -fel d -enni al -clo set -pri est -tan ks -int l -scre w -bu m -ab dul -ou x -expla ined -ric a -imag ing -law yers -bu ried -ãĥ»ãĥ» ãĥ» -ear l -âĢ ķ -l ton -resto red -stri pes -fo ss -de mands -ste aling -alex is -mun d -ak er -ur us -war dro -hu gs -gen re -e go -Ù Ħ -particip ated -bab es -ban quet -ti ous -he mi -ds b -lo st -milwau kee -jen ner -ge m -ou tra -lo ses -id i -re ps -ðŁİ § -regu lation -fla w -f ang -vibr ant -ram p -ra ins -well being -so viet -vie wers -de po -libr aries -bi go -ser y -g ill -de struction -co z -c x -bri dal -al ds -plan ted -amate ur -lu d -che ering -show cas -pro file -i u -ver tical -pack ers -wiz ard -ski p -s light -be au -air ways -mu ch -re ra -ðŁĮ Ĭ -ab sor -pati o -pack ages -s ells -ment ally -ðŁĺ ¢ -reyn olds -k are -tri bun -wal t -kn it -ta ste -sur rey -boun ce -cre ature -b are -bet ting -su re -mi ley -laugh s -al ore -cy n -t l -arti st -ann ah -war mer -dynam ics -lunch time -mariti me -vulner able -ðŁĴ ĥ -wol ver -dur ham -const antly -am in -si bl -: @ -bul let -k ach -angel o -wil der -doo m -desk top -law suit -k ca -hen derson -inv iting -bet ty -ta wards -ra fa -le aked -and i -ge ms -af l -vel o -mediter ran -pro be -to tten -steph anie -sn ation -com be -q s -over come -assas sin -ra v -fil ip -winni peg -sh il -determin ed -k as -ou tre -regre t -gui des -aa a -ðŁĺ Ī -wi ves -mani fe -er ly -sm y -sh ima -x ing -pix el -jac ob -ac commod -to y -on o -po o -ti er -an swe -ðŁĴ ģ -ro sa -le ase -bel ongs -th ar -eventu ally -nei ther -go a -ski ing -at ra -ag h -broad casting -f ury -py ram -d ice -volk swag -wom ens -provi der -bom bs -miss ile -whi p -d ick -nor we -back up -el der -mat ure -concer ts -gi ous -sque e -good morning -bra ves -^ _ -au ssie -lun a -mal es -he ck -for tn -rome o -steel ers -p n -pe er -re presents - « -kat y -migu el -requ ire -cha ins -l ur -immedi ate -ti mber -âĸ¶ ï¸ı -advoc acy -ex port -an z -tiff any -auth or -ðŁİ Ī -du des -chil ly -hi d -har m -bu g -mon ster -terri er -tu c -story telling -ta k -in ti -immigr ants -b is -reach es -com passion -john ny -contribu tions -ðŁIJ ¶ -mechan ical -impre ssion -ran ks -ko be -men ting -bloss om -pab lo -buil der -bom bing -tw el -sul livan -om o -pe te -de mi -ku dos -w bb -t gif -mass ach -neighb or -che fs -eng ines -pun e -ga ined -phan tom -s days -ext end -gr an -cent ers -jac qu -dat asci -sleep y -el vis -answe red -s lot -con y -flexi ble -ti ally -le tics -% , -andre ws -si ble -mom ma -vin o -do x -invit ational -twil ight -j ade -ill ery -joh ns -f ou -p v --- -> -break down -billi on -prin ter -mon d -c bc -mag gie -legi on -du b -kur t -po or -paren ting -regi ons -bikin i -be ware -si onal -au burn -kid ding -amp les -sp an -con tempor -c ic -ha bits -ak o -pre fe -bud dies -it z -em ily -person nel -moun tain -ver sus -ðŁĺ ¬ -ear ning -s ink -dar i -u u -s win -i ster -bru tal -n ac -kat a -clo th -am and -ðŁĶ Ĺ -ne o -alu min -week ends -nebra ska -co des -delay ed -brun o -pro ven -in c -i ght -fl an -or o -lam bert -regu lat -w f -massach use -kardashi an -bern ard -fi esta -volcan o -grand pa -anc a -d re -st itu -mean ing -fo am -au ck -at ed -r l -hot el -pers ons -dy nasty -ell or -ma i -am ne -sty ling -avi er -e g -vege tarian -, â̦ -foun ders -sta in -g d -cy cles -sky line -trac tor -exi sts -tra l -kid ney -mar il -inst ag -se tte -addic t -tri angle -flash back -controversi al -z on -p ins -i as -tr ay -town ship -deleg ates -sp am -h ms -cr ane -peop les -o lo -fac tion -but es -on ica -deleg ation -new profile -eli er -mc a -w and -g ely -losange les -ber ke -ti ve -dis rup -zz a -cas a -jor dan -ford shire -ga thered -ic hi -atten dees -à¸Ń ภ-pe ppers -co in -bour bon -ern ity -ro tary -behavi our -jere my -team work -compli ance -tre mend -ðŁĩ § -bu hari -cam bo -bu yers -ha gen -bu ds -bay ern -mon te -sm ells -an za -ath lon -descri bed -work force -gi ving -ap i -invest ments -da il -sel ena -datab ase -th um -mor tal -stu dent -bu yer -do ver -gar ten -att le -loy alty -gen oci -holo cau -theat ers -ru ling -ven us -pat ent -ch un -ab by -awa ke -mass acre -bang alore -break ing -simm ons -ju sti -hal e -ed chat -gg les -haw k -mar king -head lines -stro m -co ve -breath taking -med als -hair cut -christ ine -tele graph -gujar at -ju ra -can e -sho re -propag anda -mu eller -.... .... -sa vi -stom ach -thro ws -ta b -war m -j ong -reno wned -hi r -ra is -mush rooms -guaran teed -bo a -m j -revolu tionary -certi fication -bru ins -jo in -w es -pas sport -c g -sex u -cap able -w v -ton es -jac kets -ac compan -spin ach -fore ver -bla ir -wat ts -g l -cou ples -prairi e -newprofile pic -logi stics -massachuse tts -jagu ar -o id -we al -under water -mo z -y i -ma ths -myan mar -pre ps -suffe red -tr ace -wal i -ah hh -bor g -st itch -cu lin -real ise -infe ction -discrimin ation -sh ame -an kle -hu mid -y t -brac ket -tru ck -tri u -ea ster -commun ity -post card -invol ving -ty ler -car amel -over view -ex amples -integr ity -base ment -instru ments -ani um -at us -gh er -laun dry -achi eve -gen eva -pr icing -hyder abad -beli ef -me ta -j aw -accoun ting -lead er -cristi ano -cou ture -cy p -vis ed -, ,, -k nu -h ick -break er -br am -ra b -mo or -ham as -gradu ating -pupp ies -ak h -ta h -ach es -ri e -op ini -g ta -re ign -tra gic -re ver -p ill -pine apple -tou ches -da re -le ys -il o -inter iors -sc outs -bar t -en zie -don o -bro ck -christi ans -ense mble - · -cine mas -new port -air line -win ston -le igh -cont ents -pre scri -ur ge -tr out -fic ally -il ia -sub si -are r -âļ¾ ï¸ı -w ounded -ðŁĻ Ĥ -pe pper -ðŁĴ ŀ -fit ted -af f -re sur -thursday thoughts -z ero -archae ology -di v -je e -i on -awa iting -co zy -beauti es -bal d -dat a -gri zz -stal k -kin ds -cle ared -jess ic -regu lar -ali ens -plac e -bo s -bi zar -thisi s -ðŁĴ Ģ -totten ham -ma fia -s lam -ari ana -car roll -back pack -care y -uni v -r g -pe p -dig it -tatt oos -ag on -volunte ering -diffe ren -consu mption -ka thr -head phones -t shirt -o b -ele ment -re tail -sh ru -al gori -contain er -consci ous -fi l -com ing -ra sh -u rope -def ine -gi or -femini st -flow ing -rout es -gl aci -fer t -somer set -ant es -twee ps -$ $ -h our -endange red -year sof -ro h -po pped -bac king -ba sil -bra ke -mon aco -lgbt q -pra gue -ut ility -cas si -gate way -haun ted -sch ul -ðŁİ µ -shou ld -walking dead -comple ting -dann y -montgom ery -pengu in -ss i -mer chandi -ðŁij ij -chur ch -h ates -cap tain -brea thing -ce t -fair ly -approach es -compan ion -surpri sing -kany e -pe y -hin di -targe ted -lor ds -de ut -di gging -ger man -ru t -ener gy -close st -y un -apo logi -ภ± -s ack -ru p -dd y -port al -d ough -b ats -ðŁĵ ° -at ur -graph er -pi res -mo tors -ðŁĮ ¹ -j c -dan g -tu k -clu e -us c -pag e -d less -bro ws -ju s -ad ing -re marks -oo m -car dio -ste fan -arm strong -âĢ¢ âĢ¢ -ni est -belgi an -bi op -so y -lo f -í ĥ -q t -flashback friday -ce e -ģ ภ-wre ck -mar ines -amend ment -wardro be -vo y -bur ned -guit ars -ra inf -li fel -ssi l -oun ce -exter nal -c key -me sh -she ikh -inv itation -sugge sti -pop corn -phenomen al -an onymous -tun a -chic ago -o val -del y -loc als -( & -pro f -no vel -fin der -spar ks -la ven -in fu -nic ks -qu ant -ra e -exe c -dist ingui -st ances -mu tual -sh al -unve ils -edmon ton -zan ia -a dio -vie wer -brad ford -audit orium -qu is -re act -htt p -l ero -chee ky -impac ts -ta k -ed t -desper ate -t ay -ì Ħ -sett le -bar gain -resu me -un ite -thro wn -ke st -se ys -mar ching -am it -decl ine -sch ar -me tr -stan ford -lin ke -ber ra -dol ls -rug by -jam i -b or -road trip -dino saur -mi k -sun der -re m -b k -over seas -nau ghty -imple mentation -iam srk -lun cheon -fir ing -mi ami -pere z -the e -z on -gi fted -con version -ceram ic -¡ ï¸ı -pe dro -ì Ĩ -v ick -! @ -he ed -si d -b w -docu ment -pl un -gr ants -fant asy -predic tions -vali d -car ved -gradu ated -ðŁijį ðŁı» -nation ally -ch y -af l -re sso -blan k -ri vals -j ig -e ties -om ics -une mp -b ound -sk o -inspec tion -par al -high s -cri sp -b ans -ob a -[ @ -co spla -costu mes -rec all -mou th -ni gel -b ts -ter a -ko v -do cs -west minster -dic t -gra vity -kar i -ro gue -t ted -war k -ida ho -w end -aw i -queen sland -proce sses -cli ffe -m ick -com pens -op ol -the y -cl ari -wiki pedia -salman khan -haz ard -pre ston -swee test -pd f -che es -tr ilo -south africa -bur nt -( $ -con tain -t p -sub mitted -sound cloud -at u -re z -word press -corru pt -n f -ma ker -í ķ -par as -adv ent -ri al -ca fe -fo ssil -!!!! !!! -co ws -c j -sp ur -institu tions -land mark -ent it -re ut -h is -alz heim -we mb -regg ae -mo squ -st at -identi fied -deal er -re am -re land -ten sion -ðŁĩ © -wra pping -deep er -fr at -red dit -ar is -moroc co -.. " -b low -ma pping -pri orities -ing a -swa p -re wards -conspir acy -creati ve -c j -congre ssional -vau lt -ple x -sophom ore -shad ow -ele ss -ðŁĺ ħ -dar ts -aldu b -anno ying -pro ps -n as -alumin um -h bo -offen se -j ill -oni ons -la ur -ta e -har dest -sh ro -ga ining -meas ure -ed tech -cyp rus -tar a -ang eli -car lo -go on -all i -im plic -ju pit -resil ience -ha il -bal anced -) ... -joy ce -gr a -th eli -defin ed -shi pped -main ly -min a -l m -sac ri -o ber -p im -claim ing -ent ers -co rey -bo k -cri ed -cool ing -dani elle -pharmac y -thor ough -ca ke -k lo -outre ach -z ens -digital marketing -val ent -sn p -her b -mr w -caf é -cap tures -no tre -triu mph -pan cakes -cu mber -spi ke -d ation -bi gg -sp er -crit ical -am al -too th -foun ding -a stro -' # -quan tum -th ames -un c -pri de -air bus -kno cked -un defeated -mediterran ean -cal cu -clo wn -sens or -ham mer -for give -cu shi -ber ry -maje stic -elec t -polit an -g ta -k ari -bur ke -sea hawks -volkswag en -re i -landsc apes -cas u -grand father -list ened -/ / -star trek -rainf all -fur ry -vi er -star k -rif le -ff a -leg es -hillary clinton -min us -correc tly -architec tural -pre ce -up side -box er -ðŁĻĮ ðŁı¼ -is ai -de t -pro vo -tis sue -spoo ky -ve led -re con -prospec ts -que bec -âļ « -ig no -anat omy -shap es -w p -p interest -hor e -an es -pick up -ti p -pra desh -hu gh -co e -po k -gram my -well ington -sti gate -ri gh -lea p -king ston -scen ic -go sh -v ani -au g -s ary -zi er -bure au -lin son -con te -fra gr -all an -g aw -lan a -colli sion -surve ill -ren ais -ar range -s ali -do in -br ance -bren dan -our se -in coming -suspen sion -à ´ -l la -educ ators -in tri -da e -bio graphy -bul gar -villa in -go thic -rw anda -e w -may or -meet up -democr at -mor gan -su dden -te sco -car rot -bom ber -mck in -re ne -fun day -agricul tural -haha h -show time -form ing -col a -scor pi -quo te -po ppy -s life -d az -tu b -ne n -mo t -ðŁĺ » -s ore -elder ly -o ve -skin ny -um i -anc o -man ship -we re -g v -k ah -fol ding -ne at -samanth a -dan ish -uk rain -humid ity -nu tri -jak arta -cand les -oooo oooo -at ile -streng th -i bra -bap ti -charle ston -fr ames -girl s -clear ing -glu ten -# # -super natural -ju bi -ph one -he in -dr un -le ak -invest or -y er -dom ain -ball room -mi sh -app li -off shore -bla ze -dor o -âĺķ ï¸ı -win ery -shar if -ad ore -n ir -saf er -si gh -as cri -strong ly -trac y -ck er -ol l -faith ful -ey ed -deli ghtful -vis m -karnat aka -tit an -wh ar -jer seys -re fur -heav en -gri p -pan ama -pre li -glu ten -o dd -cont ent -pon ti -tion ing -e commerce -feder ation -flaw less -ge ar -ti res -by r -pol ice -cu ban -tri butes -tic ul -chur ches -nur sery -di aries -muse ums -snapp ed -i van -wi ght -touri sts -ramad an -t rent -prophe t -won dered -focu sing -hi d -ic ons -i q -ambul ance -pi st -fun niest -time less -sr ilan -bu ys -ki ds -colour ful -a shi -ch ir -mu m -ðŁĵ ļ -let ter -x en -reut ers -pre serve -in ting -ste p -fu ji -uni ver -i u -show down -po ems -surveill ance -suspec ted -ta e -sol ving -tom b -mother sday -car pen -recru it -pil ots -bro c -mix ing -fri days -ty r -represent atives -tra pped -abdu l -free style -clu ster -âļ łï¸ı -k d -sk ill -pit t -ex o -commer ci -muse um -loc ally -g ina -no bel -immun e -fr ac -cap su -main ed -attemp ts -bull dog -be spoke -sing ers -sp elling -seg ment -nat ures -tic k -lip stick -clean er -gett able -preci sion -â̼ ï¸ı -th ood -re ef -no pe -bill y -di gi -mu si -ri val -figu red -tal ity -sun ny -ber k -aw ww -awa its -un real -co pen -asy lum -ex otic -bu en -mo ck -en able -arch y -fr a -pla stic -al mond -amp li -displa ys -abbo tt -s me -x p -ðŁĻ ĥ -graph ic -i ved -mar a -cau tion -lea ks -en berg -ul u -unic orn -cann on -appren tic -ðŁĺĺ ðŁĺĺ -b ball -wil low -at ics -am as -manufac turer -campaig ns -port ers -flo ors -l su -ty pe -ke j -honor ary -it im -to le -min ecraft -d x -ma sh -ri o -consequ ences -ron ald -go ssi -suffol k -mu se -r bi -live music -i van -ðŁİ ¤ -le u -patri ot -man it -lan ca -home decor -de ar -sig ma -ti de -str ings -v ita -sequ el -try na -inve stigate -bor is -ve gan -barri er -mind fulness -web b -hu stle -in da -tan zania -str ay -tex as -c ag -diagno sis -wom an -g w -ob session -l ative -nu fc -fl ynn -moment um -sof a -wal d -vege table -tu cker -supp er -se ab -ar ro -se ag -ven ting -counc ill -sp lat -cal cul -.. # -com fy -odi sha -sto pp -war fare -ca es -à ¨ -co y -price less -in sec -ðŁĺ Ľ -contro ls -empower ment -datasci ence -per pe -gen ic -e res -tru deau -man o -sla very -expand ing -ma he -fa iling -s aga -photograph s -cre st -re on -surf ing -hi e -ðŁį Ģ -ja e -fel lows -south ampton -sol om -ce ster -tab ility -hor n -se ct -he e -cole man -at las -explo rer -consul tation -copy right -organi zing -den ied -mon keys -noo dles -br is -fl or -dou gh -bon ds -sho cked -eco system -care fully -w m -apart ments -cur ve -san diego -must ard -comm en -cere mon -e ch -ru th -ðŁĻĮ ðŁı» -hawa i -fil med -te ar -as ingly -ca ir -wat t -instru ment -ou tta -ye ol -river side -ë ° -. : -nor wich -alo g -migr ants -new man -ri de -spr ink -targe ting -beli eve -tor ch -reflec ts -per mission -ff man -ene mies -bas ics -se ized -sun days -le i -hass an -en do -h c -st ad -le ments -kk kk -nan o -shar k -man a -on ic -treat ments -ear ly -collabor ative -shu ttle -bran ches -mis ses -mained cm -ap ers -ky le -carri e -leis ure -sh et -bir ding -adv ances -ðŁĵ Ŀ -popu lar -di ane -a be -re war -neigh bour -k pop -remem brance -play ground -ru b -krish na -e bola -inqu iry -ep a -lu min -organ isation -abra ham -norm ally -pre ten -jan et -w t -ðŁĴ İ -encoura ging -a stic -bu mp -syd ney -s z -ss ss -gar rett -ðŁĵ » -consul ting -roman ia -spo tting -chanc ellor -ar ma -presti gious -ðĿ IJ -t ad -cry st -compe tit -rati o -cat aly -bro w -j ur -vi king -commu te -y day -la yers -du mb -esc al -genoci de -f ill -gu pta -ste pping -se i -fo to -wild cats -col i -projec t -ear nings -st r -ge ons -comple tion -b m -decor ated -craw ford -af ghan -sc are -visi bility -hi b -direc tion -stro ll -christ ina -alter nate -cl are -sty list -be hold -s ance -leop ard -acqui red -narr ative -ash i -the a -?? ?? -pe as -at ch -sli des -le en -renew able -eng lish -qu ir -co aster -r x -fo ols -match day -mis m -amaz ing -z ig -ke ting -won t -to wel -di ab -sta ke -n m -mel t -e than -gra pe -polit ician -sm en -í ĺ -re o -wedd ings -cat cher -or acle -me mo -ðŁĮ ´ -ec k -rob bie -norwe gian -oper ator -am or -se wing -ju l -x ie -u v -fif ty -me ga -tatt oo -liber als -u pri -traffic king -richard son -su v -ki p -mess y -tremend ous -gl ou -cour tney -la d -stere o -my ers -i dio -^_ ^ -man ning -dy e -w d -thr one -jun k -as u -provin cial -k ook -wr c -fine art -hamp shire -renais sance -b red -fall out -s j -sn l -al am -tor ture -fy i -sh ines -pa w -ch ar -hen ry -c row -aci ous -di an -pa ige -ba re -stock holm -scen ery -ðŁĩ · -jef frey -pu sh -decor ation -ne d -cu te -brig ade -laven der -inv ites -e sports -vo ir -dri ed -tran spl -sur geon -no vels -pul ls -son y -lun ar -man e -i vy -fru str -dor set -sa i -tor res -ssi on -shut down -suggesti ons -writ ing -e o -battle field -u ga -ðŁIJ ¾ -vac u -spl ac -g it -u g -high land -% ) -mer maid -sacram ento -ta ils -p w -ka h -t ell -enh anced -ì ķ -auck land -cru el -ðŁ¤ © -au dre -sail or -gram mar -g love -de on -infl am -fresh ly -k ell -zi p -christi e -mil d -di xon -instru ctor -g ence -ãħ ł -sub jec -constitu tional -crow ds -in visible -ru ins -da k -si p -pla que -p ouring -comple x -z ine -ste ad -f let -trans mission -lo way -ar un -incre asingly -au d -transp aren -cro wned -sc oun -blizz ard -lux u -fi ers -achieve ments -hun ters -rock ed -bas in -vio let -pro ves -achiev ing -pro sper -se ga -flo at -vi an -xi v -pol ic -tur a -approxim ately -wander lust -keep ers -geta way -co d -pol is -br yan -col ts -tal ents -yo gur -gluten free -wri st -gr y -cze ch -ðŁİ Ī -ev ille -ðŁı Ī -to x -dani els -am er -bi ds -weare one -me tab -g t -boy z -pd x -pos session -pu shed -shr ine -reali stic -tri gger -na vi -ru mors -n af -jen kins -tr un -comm uni -Ã Ĺ -gam ers -arm or -moham med -bal cony -y ah -stron gest -rhy thm -unfor gettable -k p -ho bb -custo dy -greg or -r ita -aes thetic -il ation -sponsor ing -n ay -kid napp -sh s -ra jas -me g -signific antly -butt ons -la c -ver sions -essenti als -opini ons -k ro -d printing -wi dely -d k -ur an -y al -reque sted -c n -cur ric -plu m -gr un -v m -dev on -m yo -rel ation -juvent us -rou ge -min ority -min es -jupit er -n ine -oxy gen -fran kie -une sco -fab ric -disgu sting -sal man -dete ction -lan ka -d ac -ðŁĩ« ðŁĩ· -argu ment -shel ves -cel tics -rober to -pi gs -he dge -fau l -pow ering -butter flies -fi r -re make -att i -com o -emp ha -kend all -poke mon -se ating -d ans -bald win -ðŁij » -lesli e -one direction -ti mber -im an -fon t -e der -di on -ste ph -for mat -gre gory -pro p -he x -ru in -sor y -inf er -n aw -bar ak -sd gs -kar ao -lu sh -v ander -end ent -g is -a fro -soc cer -ay an -t uni -lun g -da yof -alex a -mar ath -addic ted -ag ile -hy gi -light weight -ì § -mand ela -jo ey -anc y -hu m -bi r -memor ial -jim in -ging er -v ak -jav ascri -cro ps -orig ins -d ari -pi per -im port -aggre ssive -predic tion -re pairs -cr acker -voy age -ni ke -mu mmy -linke din -country side -bor der -gla ss -per t -s als -sho e -autograph ed -wal nut -colle gi -sal ary -pa iring -ðŁĮ ¸ -cath ol -swee the -defe ats -streng then -roof top -impro vements -barri ers -ur u -t ally -ru led -ðŁĨ ļ -nai ja -emo ji -per cent -gi o -pro bs -on ce -adm its -pa ths -li ar -day tona -pe ters -cal i -cal li -mu g -o sa -ap h -ab y -hy de -eth nic -pla ins -ol f -haha hahaha -holi c -?! ?! -su bli -bl acks -mo t -gh ton -lo vin -b rent -bar u -l ati -de w -ate au -q a -pain ful -bu sters -st atic -ðŁĩ¨ðŁĩ ¦ -note book -out fits -si es -r f -floo ds -Ñ Ģ -thro at -su ici -ro vers -beng al -pre pares -blo g -mini ature -Ø ¨ -am phi -com b -r sp -in timate -green e -Ì ĩ -al tar -surg ical -ves sel -... ? -gav in -g ator -threat ened -z ar -rob bery -di er -promo ted -y g -x s -su bs -inter viewing -threat ening -do zen -me ado -water fall -nintendo switch -cal um -mini sters -dro p -univers ities -war ned -tac tics -ðŁĩ ² -refu se -ad ju -v ast -ðŁĺ ´ -mc fc -lib ya -no filter -distribu ted -re ser -ron nie -de co -javascri pt -mon k -intere sts -fle x -mar tha -sti es -oo d -ðŁ¤£ ðŁ¤£ -e un -b ali -g omez -sti mul -moder ate -d ity -ir is -stra w -consist ent -direc tions -adop t -sal sa -cro o -reco vered -black friday -lan caster -accep t -weareone exo -buil ds -free man -air plane -diti on -bel ong -jam ie -pit ching -li f -om in -cri spy -pre pping -ve g -chan g -accompli shed -graci as -dolph in -elec tor -culin ary -super bowl -wal a -pur suit -black berry -be an -cardin al -pro ved -immigr ant -stric tly -holocau st -pass age -ha us -cou p -pur se -har ass -< < -le ed -ado be -st ad -legis lat -par ked -pri yan -sil va -kri st -s the -fun ky -ig a -sett lement -ph s -t mrw -stre ssed -hun t -ho ckey -treas ures -cham bers -ol u -hu t -mar ley -tex ture -wilder ness -mm ing -poten tially -om aha -ju dy -to es -spo iler -distingui shed -feli x -ah u -recommend ations -zom bies -hit ler -tri ple -colla pse -motiv ated -ulti mat -gg ling -so y -ci gar -fo ren -vine yard -gl itter -fin dings -colon ial -hun ter -eri k -den s -beet le -lot te -sub tle -s matter -tru sted -experim ental -nam ents -ðŁĺ Ĩ -regi on -acquis ition -bre eding -quarter back -am reading -oo td -ru de -initi atives -st out -hy ung -out come -al fred -mic s -exper tise -bacter ia -pengu ins -jump er -valen cia -bar k -ing day -sell ers -contrac ts -hou ston -commissi oned -adap tation -swan sea -santi ago -common wealth -ju dging -sub mission -sco rer -tom my -ñ o -ex quis -fil ing -explan ation -alli son -wemb ley -ri dge -chev y -san tos -own ership -cogn itive -favour ites -sh ed -phil anthro -dele ted -go dd -s nor -gui delines -ff ing -je ep -cli ps -sw amp -an or -guil d -bol ton -spring field -munici pal -goal keeper -ye on -ðŁĺįðŁĺį ðŁĺįðŁĺį -ãħĭ ãħĭ -water front -gra ve -contempor ary -ar ity -ÃŃ a -sle eps -sy rup -al am -pi re -co yo -moto gp -ty son -kej ri -cir cul -sing ly -cr unch -complic ated -nostal gia -k op -mo ve -k ale -mac ro -mid west -h ans -tri bal -nu de -௠į -bey once -congratul ate -cat er -leagu e -ðŁĻ Ĭ -la dder -cra shed -tech nic -karao ke -harass ment -ro ts -experi encing -kri sten -ðŁĩ ³ -ðŁ¤ Ĺ -reflec tions -guin ness -illustr ator -ðŁĻı ðŁı» -cen ter -nar row -comm ons -regul ations -Ù Ĩ -har m -cro ft -cu ssion -hong kong -st ical -intern ship -zo e -cho p -hoo ds -estim ated -batter ies -berke ley -smooth ie -shau n -cro s -~ ~ -cam pe -hu mp -b g -proto type -cl ick -shaw n -re viewed -tem pl -p f -jed i -blo gs -ray mond -as th -ba h -av ail -scot ch -leaf s -nik ki -to k -hol low -ur ges -of t -un like -lat in -u e -cat ering -mil i -alter nati -ma ver -Ð ¸ -ag le -pre order -lu x -cu cu -ðŁijı ðŁijı -t art -âĿ¤âĿ¤ âĿ¤ -arab ic -rapi dly -ar rang -all en -travel tuesday -pa ws -flo ws -st ability -flu id -ca pp -can berra -uu uu -sp ani -demon stration -m la -plac ement -m w -presi dents -awe som -bever ly -ani st -ne al -father sday -referen dum -la hore -o aks -deb bie -half way -gho sts -de bor -matthe ws -fi at -t fw -pre sen -rob i -de d -bro ck -laugh ed -am ounts -bam boo -kinder garten -eat en -mtv hottest -break out -u sic -fra ser -legis lative -p ang -modu le -sam my -go ver -ear ns -expe dition -gar h -concep ts -char lie -la va -bachel or -veg gies -deter mine -el lie -un locked -fru it -dal la -cou pe -wash ington -depo sit -iv ory -pau la -chic ag -gu cci -ðŁİ ĥ -cul tiv -pier ce -li fted -stu mb -re cover -musc les -conduc ting -cb s -mcla ren -sophi a -cel lu -oce ans -up loaded -game play -mal dives -kim ber -avo i -rac er -ca ine -cav s -h ana -li ga -ra ven -inter vention -inaugur ation -oo h -at traction -merchandi se -tune in -li king -juni ors -int ended -att acking -aqu arium -i wd -comp onents -sur ing -cent u -yogur t -ðŁı ĥ -show room -op tical -ty our -ju dge -yi eld -an to -pl c -transparen cy -recy cled -chi ef -ar om -ambassad ors -plan et -âĿĦ ï¸ı -om ed -vaness a -cour t -mar gar -hal ey -v r -reg ina -pd ates -hi span -live stream -âģ £ -ya hoo -gal la -secu red -w ir -bene ath -off l -n il -am b -ye g -out let -u te -pe ep -lind say -bent ley -... ! -he el -trilo gy -vo s -ty re -there fore -tor onto -ab i -simp li -ja e -exten sive -eleph ants -s or -orient ation -im peach -re play -constru cted -peter son -pa is -por ted -custom s -colla p -ad u -high lands -sal em -shel by -ko vic -stra in -ro sie -sen ators -snap s -bo bb -suz uki -bla des -k p -lo lo -gener ate -si ght -ma e -struc tural -predic t -jump ed -ah mad -sun g -just ice -gla m -vol vo -jubi lee -de tention -lo sses -pu ri -every time -Ð ° -ra o -ed ge -li mer -rese mb -har old -re tri -sacri fic -surpri ses -am c -srilan ka -bar bie -men s -fin n -ag s -ukrain ian -em brac -î IJ -flav ors -hom er -lau re -ou th -pr iced -ver de -fir m -ah s -cu b -tre y -par anor -pro fit -in dv -who a -har sh -al ot -crit ics -hu bby -fi gur -gi ra -ca stro -chan el -in put -origin als -ten ant -yy yy -ture rs -lincol n -co on -lear n -ch ou -ac are -o les -din er -hy p -bizar re -mc r -let sgo -decor ating -ðŁĮ İ -al ison -ar vin -f d -reha b -mccar thy -lot tery -da h -minne apolis -eli gible -diagno sed -emer ald -destin ations -s ans -or y -bla zers -n v -ba il -digital art -no c -mal ta -sol ar -pi pes -alleg ations -no ck -po pe -bri d -premi er -n x -present ations -ef a -bo ws -val ve -opp onent -Į ë -visu al -ing le -cate gor -e ter -po is -dan i -at tract -neu tral -th ene -cra shes -fred die -ut ili -c st -awak ening -slo ven -quali fy -pro of -fair y -le v -fre ight -enjo ys -cup cake -flav our -â ķ -protec tive -ðŁijı ðŁı» -is u -ad mir -h mmm -continu ous -ai res -rap tors -showcas ing -y uk -pa ste -follow er -instru ctions -sp ru -@ __ -the o -debu ts -ve tte -sto w -es of -ach ed -sul tan -sand wich -som alia -franc o -car ne -flu ffy -al pine -jas mine -he ated -viol in -ple ss -divor ce -per former -phi es -port sm -dar a -kir by -lo p -chill i -for th -sky pe -ðŁĩ®ðŁĩ ¹ -celebr ities -ed y -ve e -po ison -ey el -gra bs -ssi c -un o -wester n -rail road -am er -numer ous -s v -fo w -fi st -âĢ ĭ -reque sts -mar tial -em my -accept ance -lau ra -ภ´ -er up -hyun dai -out lander -u tt -wrest le -esp resso -demand ing -g dp -geo graphy -sas kat -tro ll -confe der -su es -se m -be ts -t ful -to sh -teach es -col oured -gal way -mac y -dis orders -bb cra -at em -fen der -lit ter -e sh -provi ders -renov ation -nomin ate -ps g -nomin ations -jen na -shar p -some day -z ur -bra ins -che shire -pre y -hu go - ¿ -to ken -r v -car r -tac tical -zel da -kay la -fern ando -photograph ers -j our -umb rella -woo dy -congress man -du mp -le vy -ju an -d azz -sign als -la in -an u -mic hel -por ch -al den -sibl ings -y ale -pe el -sw ick -gg in -ll c -k ale -s con -il d -pat reon -re el -qu in -wit t -mar ty -moo dy -ton i -der y -g ators -speci fically -dd in -ly on -tr ick -meado ws -p j -bor gh -vi k -tu r -bron x -pu ff -lan tern -ðŁ¤ ¦ -g ently -be stie -fac t -refu sed -fas ci -mp y -ðŁĶ µ -cross over -mead ow -indian apolis -duc ation -sle y -loo m -mix er -new music -film maker -prosper ity -li m -week end -cre amy -neu tr -lu ther -h v -nor thern -tw o -h ra -cat ches -appear ances -ha bit -kitt ens -n v -illa c -inf an -regar dless -liz ard -dun k -cur tain -ac om -in tu -ve z -e min -fl ats -calend ars -em power -ru ined -hun gary -vi d -we x -u lum -aber deen -o sa -k t -ma ssi -se emed -s den -' ? -tele phone -de fi -insp ires -me ow -z ones -bl ind -pl y -tuc son -advent ure -ge d -oy ster -ðŁijıðŁijı ðŁijı -out put -tt t -metal lic -sma sh -ucl a -sco ts -perfe ct -lu cy -regular ly -sp ic -rel ative -ath ers -mis e -batt ling -deci des -mat a -occu pied -random ly -cat softwitter -gi an -ball y -al ties -al lies -im men -sy rac -ðŁĴľ ðŁĴľ -l lan -au r -k ut -lam ar -affe cts -n ra -star war -ðŁ¤ ĺ -sc ram -en chan -pro cess -luxu rious -ar ray -sher lock -comp ati -dor f -stre ss -m su -s with -sal a -sof instagram -fo il -under stood -qu ay -r p -c ade -ja w -en ab -en coun -ðŁİī : -do ck -satur n -mu ll -lay out -ra rely -happ ily -fix ture -or ph -over looking -her bs -m itt -pil lar -nol an -pe tty -str y -u i -mu k -o res -o vers -á µ -re creation -we sley -ri t -kejri wal -sto cking -g v -subscri bers -moo se -ma e -ber t -opp re -assign ment -u ro -high lighting -cal vin -we igh -cambo dia -av on -ke m -dis abilities -read y -char gers -p ads -iz ing -illi an -tru ste -col leges -associ ates -alban y -mil ton -cr on -bu r -har dly -si ghts -anti ques -e cho -surpri singly -ha iti -cap t -ph p -op io -ine quality -equ al -ken y -sch mid -autograph s -ren t -qu er -cit rus -challeng ed -te c -epi de -fe st -z hou -li me -citizen ship -cry stal -convin ced -mess enger -copen hagen -âĿĹ ï¸ı -war ran -develop ments -ï¸ı âĥ£ -fore x -hi ro -sne akers -xi de -vi va -stere o -bat ting -ss el -ho st -beng al -critic ism -q c -cr un -attemp ted -ry e -determin ation -cre ations -d read -label s -pos se -anc er -joh an -si ster -partner ships -les bian -k st -guaran tee -bar o -fix ing -ma son -m ous -chem icals -t less -bio diversity -par o -bhar at -ac ol -refu ge -en te -t iti -dys sey -respon ds -lef to -in er -se vel -rahu l -ol ine -frank fur -cho reo -enjoy able -c to -strugg les -wood land -heavy weight -gen s -rece p -ac cred -ðŁĺ ¡ -trans formed -list en -at op -n k -sur ge -be re -gover nor -prison ers -clau de -t ill -mu lator -emo tion -water loo -star t -ðŁĩ º -clean ed -grand mother -fear less -afric an -astron omy -ðŁı ģ -à¸ Ļ -the world -su itable -anth ony -k and -tt en -meaning ful -disc lo -jaco bs -à ¸ -tom linson -ghe tti -ty pho -sub stan -as co -te k -nag ar -mu d -am on -vacc ine -f ty -fle sh -no el -infl ation -portu gue -glam our -tra m -v re -te qu -roun dup -w yn -rejec ted -mosa ic -si ghting -cal f -o ta -com position -go pro -gonz ale -e ed -b ard -tu e -effec tively -we en -al to -ri bs -rel ate -thir sty -fu rious -di m -ch ard -perfu me -s ny -chur chill -k of -master class -wa ve -ðŁĶ µ -er in -own s -to be -sk illed -te m -go f -en i -tor i -cra zy -l ick -resi stant -ici al -ag ar -! : -g ali -del aware -bl itz -koh li -pu ck -avail ability -hi malay -influ ential -cro chet -victor i -read ing -ho bby -vie t -j as -en gra -sk ul -ðŁĩ² ðŁĩ -educ ate -tech no -distric ts -blu es -se tt -seven th -lear ns -ee ee -apocaly pse -hang out -cru el -mu tu -bru h -hel en -she er -c tion -kle in -tex ans -ce real -sh ine -ne red -gra s -am bro -f ella -hin du -matthe w -li ma -mir anda -je wel -so ho -euro vision -neighb ours -chand ler -be sides -ðŁ¥ ° -ast ros -thu mbs -ren ault -ra ve -hi red -ðŁĸ ¤ -it ary -z or -bla zer -k ine -ea u -kat y -dc comics -pe c -ro dgers -water proof -kill ers -super int -pre serv -as so -brew ers -promo tional -sc am -villa ges -sket ches -ju icy -for life -au dit -so lo -fundam ental -len e -philipp ine -t end -conserv atives -sponsor ship -dd le -a ine -h tc -os i -hul k -w af -à¸ Ļ -evalu ation -ant ine -sle e -robert son -roo sevel -ag i -sophi stic -emplo yers -bubb les -ko wski -inter action -sh u -bou le -ic an -j are -han k -leg itim -k nicks -kar ma -recei ver -per ks -u h -sta ir -sun i -labor atory -gra ves -voc als -oo t -c ture -thri ve -tic o -ãĥ ³ -b w -carto ons -mcdon alds -dra w -y ung -pl er -li d -eth ical -groo ve -ent a -international womensday -pat ron -wor ries -ðŁİ ħ -ðŁij ĭ -ka therine -di az -tor i -bach chan -tru st -min eral -ic om -buil ders -bor n -col oring -lat te -ca se -revolu tion -tra der -ox id -chi pot -inst antly -sou thern -se hun -pro b -her nandez -lis bon -hu awe -p ong -me a -ro oney -wheel chair -ke en -be tt -cor in -regulat ory -di splac -ka ren -sch em -sun sets -wh ales -remin is -he p -hi de -mar cel -pand ora -do yle -th fc -ot to -no kia -trans gender -ko v -hawai ian -sha ve -so vere -exc er -nick i -pu g -st or -ro th -wee t -leg al -dig nity -po w -hom age -ðŁĩ³ ðŁĩ -s re -can on -la x -wo ah -quart z -ñ a -gree ting -flick r -nai robi -advoc ates -an c -vi i -eu gene -th ra -c re -el an -pen sion -th letics -ton i -re agan -x v -sto re -ben ch -har lem -todd ler -sent enced -âĻ¥ ï¸ı -glob ally -che aper -u f -ma m -nic o -ik u -tho u -ni st -dam i -th ala -rho des -sal e -bow ls -â Ī -las vegas -sanc tions -adm ire -mat ched -un able -travel er -ele ven -straw berries -âĢĶâĢĶ âĢĶâĢĶ -stu dio -jac ques -im s -valu ed -s no -cheese cake -n xt -e os -s x -f x -ton ic -hat ch -chic ks -gra ds -hand ic -r ory -as p -ri pped -denti st -n en -lu fc -âľ Ĭ -di ge -hop kins -sher man -f da -for all -ash ley -str and -h y -liqu or -buffe t -ess ence -phar ma -suri ya -ðŁĴĻ ðŁĴĻ -festi vals -z an -re fresh -pur ple -uni forms -kenne th -= ) -as an -hel sin -transform ers -k ali -person alized -chal k -bo bby -â Į -the mes -depar ture -prin t -illustr ations -qui et -agre es -gri ff -Ø ³ -m iti -toge ther -conven ience -ab ar -car lo -turt les -info sec -some what -ar lington -scholar ships -emir ates -mu ms -st ella -auton om -fe ather -g ore -nom inees -fragr ance -Ñ Ĥ -w ong -thea stern -gr e -z illa -is i -bump er -go o -do zens -ab duc -âļª ï¸ı -o ils -don ors -sil icon -i pod -fortn ite -ðŁĴ ¨ -tor o -spark ling -consci ousness -pal a -nu m -moun ted -ffin s -thi eves -team mate -pra b -om er -ta pes -bo d -mit su -ste w -e re -p bs -tu sc -lo we -ra de -parliam entary -h m -ed gar -ðŁijĩ ðŁijĩ -to a -a gh -hon i -s late -ge ek -ap t -hard t -ta p -horiz on -grow th -make over -hi l -paper back -id an -reha bil -gi u -possi bilities -let tu -fran co -bo ss -ach er -does nt -mo e -ta ker -huss ain -ml k -di l -th ia -ham a -real ised -raven s -curric ulum -m ith -k night -ted x -r v -isai ah -cumb ria -birth days -f ing -pre z -mu barak -exquis ite -clear ance -y en -par i -ev o -à º -modi fied -app lying -imple ment -disco vering -chap man -indie game -dis k -crowd funding -mach in -li vel -sty led -âĿ Į -ma king -rehear sals -nutr iti -subscri ption -and ro -cre ators -car ries -ky lie -cam den -appren tice -tax pay -c ca -tuesday thoughts -pis sed -er man -dete c -freed om -mer i -.. ! -psal m -sun light -per spec -be ings -book store -rock star -fun ctions -p ence -fav es -z n -obam acare -sp ill -coven try -pi geon -pi vo -ba it -kol kata -av al -don or -wa h -privi leg -tra ditions -rajas than -ten ess -portugue se -yn es -tack les -de fic -tor n -pol ling -thor ne -in a -bened ict -bar ry -cal ories -ver dict -save the -nor ton -off ice -main stream -impro ves -fr on -respon ding -real tor -scotti sh -de clar -r l -shi v -supp lier -re sting -swee ts -qu i -. â̦ -whit ney -startu p -thank you -teach er -h alls -ha ve -hand made -pro ving -quar tet -ro chester -li an -virtu al -mend es -of icial -mid lands -x box -meas uring -o vo -accommod ation -bri des -collegi ate -intellec tual -in car -ni ag -ðŁį · -sf w -coco a -co ats -civil ians -presi dency -mat rix -sweethe art -tri athlon -wag ner -ra dic -plann er -the o -execu tion -k um -the walkingdead -sc ar -ro tation -blo gging -bom b -re son -bb les -st are -assi sted -e do -brand ed -war nings -thor pe -acknow le -satis fied -sho res -ri d -dor a -phys ically -bi gh -appro ves -ha h -ric al -vers atile -pret end -lu m -ab hi -ye e -sp it -ãĢ Į -dj s -ash tra -j t -ven ues -gram mys -cy clo -tr acker -over watch -repl ica -el yn -nr l -lind sey -hom o -ballo ons -kitch en -si s -am os -ende av -ðŁĴ » -a rec -thu g -hoo ked -hr c -new york -bur gh -americ as -patric ia -ug u -ap athy -ha st -psy chi -cor k -petro l -ðŁİ ¬ -ak u -po pping -psycho logical -au x -g ma -cad illac -wa ste -auth ent -bri stol -nam e -que er -to ber -jer ry -com in -ch ant -privileg ed -op ar -lo ser -tex t -mar ker -stri es -equ ally -ak i -christ mas -gare th -ble w -em ma -imag in -se als -che at -conditi oning -j ana -ren s -dar ies -o asis -disc ounts -coun cil -i ka -shir ley -vou cher -al ps -w x -q r -dri ft -attemp ting -ut c -Ø ª -gonzale z -m f -jo ker -paralle l -pa re -aspe cts -proce du -n p -am a -rale igh -bright en -gu ire -radi ation -cre scent -ho b -il le -str and -v ore -n ard -che st -di wali -av atar -al der -d ling -pa thetic -ðŁĴ ĺ -spir it -jor ge -film making -ðŁĻı ðŁĻı -challeng er -b j -down town -ht ml -ade qu -twi sted -in ely -( ' -wra ps -oper ational -y ne -n us -mag net -market place -health ier -snap shot -dam on -inter ven -fe derer -ow ls -biscu its -j p -ro deo -blue berry -lec tion -fron tier -summ ers -re yes -pede strian -go l -caf fe -refur bi -bou lder -me ghan -speci alty -la ss -e i -suspec ts -appro x -rr r -ra th -st im -cru shed -he d -wh un -lo af -cr ore -river a -gene tics -so ck -wa sted -ny pd -answ ering -do ve -bel la -ol in -du n -fi ji -pre tty -spar kle -y un -j d -euro pa -li fts -am ber -mu r -te k -boy d -roy alty -in do -ri b -go tham -ti est -inst alling -ke mp -the photo -cos mic -) )) -whole sale -loy ment -eas y -su ing -sett led -af p -pro ver -suppor tive -re es -ne ath -deli ber -c é -wel come -pic oftheday -new born -pat ty -sun s -si est -fl int -diffe rently -spo ilers -troop er -g ins -cor y -look out -equi pped -ta pe -to by -resear cher -u sh -ke yes -al ma -induc tion -k w -k har -sl ick -bri de -e ur -cra ving -book ings -ch es -tr unk -vern on -sp her -cryst als -rel atively -pom pe -uni ons -val ley -par a -w ant -ok c -de af -ser gio -len non -sh ay -cr a -v at -he e -t we -liqu id -pol y -ðŁİ ģ -b ent -be aring -motor sport -bar be -te sti -han i -fin ancing -astron aut -water colour -ri sh -comic con -gar t -wr ong -ber n -it an -ste pped -fil ters -c low -me x -dem ons -all o -expand ed -comm and -et ers -go ats -si ri -y r -pot tery -mari on -i le -el an -san to -person a -du ke -hom eless -li ghted -wheel er -chang er -cab bage -sur real -ham burg -sma shed -str an -k not -i art -ob i -be dro -di al -th ick -b ingo -fu s -vacu um -con ve -ati ve -accur acy -accoun t -re fer -ri z -spider man -ban a -r ite -u b -ab s -medic al -lin k -si em -> >>> -be tra -g lowing -re actions -pupp et -spa ghetti -ang s -re medi -pray for -roy ce -char lotte -£ ï¸ı -gh et -affe cting -ro de -soci alist -mo ses -az i -o it -re porters -cd t -ap ing -s nat -minim al -wa ist -sie ge ->> >> -ri g -schmid t -h are -ec a -thor n -he mp -es the -cly de -th a -don ut -moham ed -ling erie -le gg -carpen ter -perform ers -de a -imag ined -cur se -la sh -ct r -agu a -ro ar -gr i -ro le -j fk -resur rec -roosevel t -maril yn -sm alle -will is -wa ited -char ities -the res -li k -origin al -car i -c ough -cru ci -la gun -contra st -k ou -arm our -re moving -t ent -maz da -bri ghter -thi ef -cor ner -tequ ila -buzz ing -al bi -p am -az ure -disc oun -pixel art -possi bility -ham ont -tra des -bu da -hi ve -vers y -fin ch -tran spa -em i -terri fying -in qui -g ba -sub stitu -collec ti -plac ing -cin dy -k ann -pa tho -diamon d -mour inho -guine a -anthro po -air s -pu mps -ì ļ -pas o -cur ling -an ita -resi dency -ne wh -jo on -cigare tte -que ue -ex trac -gam es -spl en -ex press -public ly -bon nie -tribun e -ba ek -reason able -c or -timo thy -she eran -Ä ± -f dn -su tton -concentr ation -carav an -x avier -al ger -cy lin -freder ick -ner ve -pe ak -lettu ce -j ail -pre game -kav an -up graded -eco logy -squad ron -gra pes -goo g -pa stry -ðŁĹ £ -ãĥ¼ ãĥ -mil ano -awa z -presen ter -ðŁĮ ¿ -her d -king s -tem plate -fl our -h v -k ley -i ya -spe c -at er -frankfur t -co ch -tex ting -del i -communi st -regi ment -ele anor -anticip ated -ðŁijĮ ðŁı» -thephoto hour -ran o -survi ving -simul ation -daw son -ar in -aqu a -m or -â̦ . -cin o -ira qi -sh az -dun dee -we s -dra u -hann ah -s news -occup ation -ste en -x m -ang les -sett ings -gur u -kno x -or ca -shap ing -w ent -dr illing -zz ie -br i -kis sing -fin d -ma ine -âŃIJï¸ı âŃIJï¸ı -ðŁĮ į -lar ry -bu sted -ta vern -acti vely -- " -replac ing -no d -un lock -. " -âŀ ¤ -affili ate -to w -l n -happy newyear -di f -j m -green wich -contro versy -daw g -con dol -sav annah -compens ation -touch down -te o -amb itious -embro i -convic ted -iart g -bar ack -tr ance -testim ony -au dition -thum b -my ths -be x -que z -orch id -den y -entit led -hoo d -gr ant -in box -blue jays -r illa -smalle st -bur den -in famous -divi ded -boun daries -t ter -el t -wy oming -be verage -me sm -one ws -budd hist -y ana -as sad -is ms -bar rett -predic ted -back to -tw it -e there -cap tains -escap ed -ay o -lam borgh -gard ner -la ps -k al -adverti sement -insec ts -na po -am en -ac y -r and -g k -te h -k athle -tri dge -pan cake -at ro -pyram id -bu la -paral ym -gau ge -en cies -tom y -biscu it -but cher -quali fier -coun ty -ke i -po ols -dar ker -should ers -ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ -sp re -( " -writ ers -g m -ðŁİ ĵ -k nit -hu ff -mt b -philli es -o st -den is -g art -licen sed -inter face -ex cel -d well -from the -co fficial -az zi -appear ing -fore st -n ana -ke ith -manufac turers -beck ham -) ? -e se -col ony -delic ate -ut ter -mc in -transpl ant -pre ferred -par d -ari e -hu b -po ds -perspec tives -pic t -del u -app er -be than -p mo -crimin als -femin ism -sh ack -circum stances -fel las -prote sting -wa x -sugge sted -t ator -dre w -om ni -fa ke -kath y -re b -del ine -ber ni -mi sty -ðŁij © -er able -break through -men swear -millenni als -chan yeol -la z -inser t -rep lies -phra se -n x -ihear tawards -audre y -gran ite -rac ec -ori e -ter ra -innov ations -britt any -at eral -pe ar -bio logical -sh ments -institu tion -m sn -frequ ency -d man -neg lec -t f -ste fan -fox news -ty po -comm s -sequ ence -car men -wh ites -econom ist -exe ter -se um -re sorts -cas ually -bun de -divi de -Ø ¹ -ga g -cre ed -reti re -cau cus -rapi ds -wrestle mania -tul sa -sunder land -fundam ent -o di -yam aha -v ary -intri gu -el se -be acon -an gie -tra ded -tran sm -g ents -kn itting -gal ac -ðĿ Ĺ -u to -sea side -hol t -re rs -far go -train ers -mon soon -b ale -sou ght -mad die -h w -co li -fr an -fav s -ðŁĴ Ķ -int ent -r ally -s bs -lemon ade -barack obama -bre ad -stick y -explo sive -chel ten -t j -as soc -ram en -hom ies -v log -mi ster -lor d -âĢįâĻ Ģï¸ı -aly ssa -sketch book -ru mble -cat ch -migr ant -discipl ine -un likely -chronic les -fl ora -sl ams -am id -s boro -coo p -ju mps -tran qu -mel is -sof ia -en ri -gab e -sy ri -nicol as -cha i -w v -be cky -foo ty -ta o -suppo se -ðŁĺįðŁĺį ðŁĺįðŁĺį -plu sh -ri sh -ðŁ¤ ĵ -k ha -satur days -ac cent -he c -lim it -carl ton -wi red -taylor swift -ðŁĺ ij -sq l -har ro -recipi ents -g at -go p -th of -amaz ed -gh an -ðŁıĨ ðŁıĨ -por to -cla re -di stant -na c -ohi o -ðŁĻı ðŁı¼ -mt n -anti bio -dino sa -me sa -par tial -b v -lear nt -lov ato -questi on -ex tract -gossi p -gi bb -niag ara -ðŁij ¨ -displa yed -so oner -ste vie -nug gets -ml n -bro m -tur b -give aways -stu pi -bl ink -c ili -conven ient -mo h -vi ve -f ric -cau se -cham ber -cu les -ne arest -is se -small biz -t j -canadi ans -smar ter -bra sil -ra re -que tte -w ha -cand le -at omic -ðŁijį ðŁijį -warri or -relax ed -stri ps -ne ur -k ka -r fc -jen sen -reco vering -respon ses -sal am -ortho dox -acti ve -ell ers -n it -âŃ IJ -metro politan -centu ries -vi da -gra ding -transpa rent -sim ple -do ts -superint endent -elev ator -autom ated -red skins -ima m -summer time -jona than -ge aring -michel le -confl ic -m ice -to te -publi sh -pa x -) - -na iled -á ´ -tele scope -ser bia -ba b -ape u -st ically -sen ti -r ats -isol ated -grou p -hat red -paranor mal -stan ley -ali on -safe ty -l s -ठ° -nex us -alexand ra -mas ks -+ + -tr on -au k -brother hood -brow se -mix es -sim one -mu sk -appro ve -lo la -ex p -per th -fu turi -un seen -d m -chel se -sc outing -o we -portsm outh -k ram -mi ze -di spen -su p -d lc -adver t -tere sa -is le -cy cle -met all -shi elds -marin ers -ra z -ing en -fun d -an go -jon es -o ka -mad den -broc coli -domin ic -situ ations -mer o -cric ke -puni shment -d b -sha king -ðŁĺ ļ -m q -ari ans -le h -cla w -we ds -d ure -ni el -j elly -gour met -tra ders -le vi -w ages -kne es -wi se -heaven ly -avi d -melo dy -z ack -ban anas -apprentic e -pro p -fun ny -o de -respec ted -me gan -fe wer -dra fted -med it -gra pe -us army -cru sad -vo cali -prepar ations -non sense -us age -th r -ro th -wiz ards -insi de -promo tions -mon a -red sox -si g -eleg ance -ch ia -univer sal -ãĢ į -ra ja -un ga -pol lin -filip ino -ak a -t sun -ik on -bi king -decor ations -z ac -cade ts -hum our -ag m -re ppin -vac cin -elo ve -u w -dia be -galla gher -az er -do l -a while -pro minent -wel sh -t ann -' ) -bi en -wa g -in al -c wc -wic ket -ur st -q anon -x e -out door -dun n -star r -co logy -ric ky -u efa -reb ounds -s music -inf ant -ðŁĻ ĭ -so p -u mber -hand ing -beg in -sor ting -ha sh -sp ati -re k -buda pest -black hawks -dele te -ro m -can did -auth ori -de bris -spe cul -inter section -marri ott -im ran -ðŁĺģ ðŁĺģ -cru ises -ram sey -rafa el -aware ness -vas cular -beyon cé -ru g -ðŁĺ Į -festi v -ar am -s able -bas il -p ill -flo oring -un beaten -implic ations -u f -w ound -for ge -poin ting -po ts -popular ity -ðŁijı ðŁı» -mani pul -s lots -deb ates -abs ence -ver mont -never forget -wri st -gl oria -ren ce -hu sk -mel ting -ðŁİ Ł -br aces -tim ely -transform ing -am ps -ma k -po e -ah an -gener ally -nd p -ale ppo -unic ef -pro fs -nor d -ma sk -jackson ville -v v -sh ells -bloom ing -oper ators -char coal -ne ville -ma gi -chi p -sam a -ir an -re forms -accu mul -ru e -æ ľ -web sites -ga on -devast ating -sto s -glaci er -ra pp -chipot le -pr a -or ous -rom ney -seas on -decor ative -c isco -dit ch -compla in -ll o -assu me -ðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤ -n els -cent ric -ft w -car rots -tat a -can ter -per ience -li ers -demo s -bl unt -oper ate -reserv ations -le ah -sub stance -di son -an te -elec tion -v ue -squ are -non profit -ca a -f su -y am -ãĤ ¤ -v ladi -comple tes -mar i -philli p -ne ill -er as -ka it -men do -mahar ashtra -g p -dan e -provi dence -ther apeu -juven ile -me mo -in corpor -aa aa -seven teen -teen ager -à £ -or ns -wi de -cu teness -tw d -ff les -bar a -com edy -over time -y az -bar on -unemp loyment -ðŁij ĭ -exter ior -den se -cent res -match up -history month -artif icial -qu it -e sk -war n -cr itic -j af -ðŁĵ ² -inform ative -fu els -recy cle -nam ing -stri pe -sol ic -mole cular -dee pi -con vo -s sel -na e -de scent -ti z -accoun tability -ter ry -r ito -sl ay -em o -dem ol -sens ation -co v -tor e -round table -y ol -excu ses -ॠį -tur quo -hh hh -pod casts -cele b -me ssi -li o -man n -contribu ted -u z -gener ator -ele ts -veg gie -indu l -en suring -detro it -pun jab -tran spor -instru ction -ad d -por cel -pan eli -cir cles -persi st -clay ton -sp n -dog softwitter -is nt -sp r -retail ers -p w -hun gar -el ena -mon aster -gu atem -je ssie -an z -ra shi -fle e -car ving -fau x -l al -hen ri -d jo -du ll -s ana -lar a -glo be -cri mson -com pass -pau se -na b -lion el -ba ths -u fo -invent ory -sin gh -sat an -ðŁĩ ¸ -ce ments -in form -gener ated -bi den -av g -tas ks -de er -sa u -ja iled -pa stel -sc c -na il -steel e -per is -lamborgh ini -pur sue -mar gin -u ch -bo sch -dra in -cl ara -bo m -lat ino -web ster -rose mary -r ha -s oun -billion aire -not ch -percent age -con or -' " -hom es -earth day -h ort -big gest -di sin -wal ton -edit ors -im ma -om ar -equi valent -pharmac eu -ah med -cam eo -han ni -under rated -ge ment -micro bi -v oo -honor able -obe sity -âļ ¡ï¸ı -limer ick -invol vement -st agram -boule vard -bur g -blackand white -liber ation -fi ve -inter im -sm m -rival ry -cap abilities -stat ements -thu mb -ve d -sw ans -bar ber -e que -seren a -hel m -noo dle -sam pling -n awaz -sing le -thunder storms -sh on -in ev -ë ¯ -to pp -orch ard -bi an -ðŁĺ Ķ -door step -salv ation -marke ting -r ons -cle mson -ra vi -in take -stand with -sin a -ha iku -ple y -elector al -ph illy -la ys -electr ic -cap turing -u pp -er gy -believ ing -cul tures -es day -inva sive -ed ed -spee ch -end ur -viet nam -boy cott -pe de -deli ver -ðŁĴĸ ðŁĴĸ -mer chant -st ir -den ies -poc kets -o ti -cu ddle -ro land -mm ed -den ed -lear ners -hoo p -sour cing -h acked -di m -environ ments -ben son -jud icial -wor cester -pear ls -govern ments -arri vals -cor ners -tun ing -la bour -y m -or dering -le wi -i fe -hygi ene -thou ghtful -indone sian -campaig ning -princi ple -assau l -ru bb -at v -wil ly -en tre -il i -ph on -du ties -âĻ¥ âĻ¥ -sn akes -lo op -am ar -conver tible -bon ding -ment oring -max well -ethere um -destro ying -ax is -ca iro -fin nish -sho ck -ðŁĺ IJ -cal eb -com a -pe dal -co re -contin ent -el son -temp o -helsin ki -ac p -tack ling -st ated -bl a -dou b -sma shing -a ja -camer on -disru ption -warm th -being salmankhan -bullet in -o de -syrac use -ar an -mc gregor -bul k -an ton -confir mation -sp ine -im ran -instru c -jac ks -chi o -pal m -str e -embarra ssing -un t -elimin ate -to ss -c ise -a ws -oni sts -sh inee -jo s -ho se -li vely -opp onents -mo vements -recogni zing -sandwich es -sh akes -exerc ises -se at -profe ssion -merry christmas -lu gg -adopt dont -mar vin -byr ne -un le -he t -ku wait -rah man -aspe ct -humb led -gen es -f and -long time -) ; -cam pu -an gus -ðŁijį ðŁı¼ -q uran -sle eves -s lic -¸ ë -twel ve -your e -i ke -go gh -b st -dic tionary -reflec ting -to on -yar n -em bed -ðŁı ´ -re serves -floo ded -ver iz -du sk -estab lish -pro li -au d -ritu al -or bit -declar ation -recor dings -cam o -cas sette -good luck -cu tter -bo p -b ho -che ating -paci fic -ma res -tim er -col t -tr ous -tomor row -han sen -ci e -w ang -ban i -circu lar -ac ute -far mer -co ys -p se -ir ving -w j -haw kins -b ison -ur day -cru ising -o te -k ath -whi stle -your selves -ant is -sla sh -thorough ly -ke sh -ser ie -ex em -en ig -guil d -sh red -ho gan -ap o -ä ¸ -pu zz -ne tball -au ssi -panor ama -ws j -av is -ar ming -hum ph -brow ser -cri es -fo ggy -mat te -ðŁĮ » -it er -tal lest -by ron -cap tiv -je su -any ways -flag ship -p ton -we y -fay ette -financi al -f oul -solom on -jenni fer -cucu mber -ar gue -tex tile -wrest ler -john ston -pa stor -ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃ -cac tus -edi ble -re served -ric hie -met res -ingredi ent -h ella -un to -ch ol -cele bs -po ets -gra ham -hay den -coinci dence -b aw -communic ate -flet cher -/ - -tole do -ecu ador -coun sel -s laughter -line ar -at p -os u -jo el -ev ed -conqu er -ru stic -plic ity -recogn ise -room mate -cr acked -jas per -ph er -ðŁĮ º -wo ven -mo ist -ff c -ste ering -ni sh -stand ings -frequ ent -ar di -haz el -as msg -bau m -d art -si dd -nat h -ch ero -card board -c ss -n sfw -pa ir -ðŁĺį ðŁĺĺ -occur red -homeless ness -mal one -ph e -xi a -pad dy -decl are -theat re -b f -per sian -ta d -ax e -susp icious -lam b -mu cho -sen ior -st as -k ite -st ing -gra d -k af -wat ering -Ø ¯ -spi ral -th ms -educ ator -jer ome -of c -clo ck -su l -pe mb -.... ..... -park way -de aux -restric tions -m ons -need le -e j -le agues -water melon -am an -pl enary -max im -w ab -coming soon -bry ce -vi gil -super market -fortun ate -turquo ise -presi dent -li v -inter ns -feel in -fix tures -stun t -st aged -premi eres -lo k -prac titi -shor tage -log ne -ve c -con cor -roc ke -li g -com posed -syn thetic -di p -cam ila -ch is -j ou -su san -eye brows -supp lement -satis faction -moham mad -ti bet -house of -pu n -as sam -shado whun -psy ched -se duc -mand atory -her bert -sc allo -stream ers -proto col -block buster -produc es -sch nei -lau rel -tri be -time hop -pl a -mod elling -tv time -mtv stars -wi dow -me tric -ch am -con do -flow ering -ale c -d ms -inten sity - ¨ -mccar tney -islam abad -k b -f fi -ph al -anal og -f ond -h acks -positi vity -treat y -sub marine -conne ct -sel en -categor ies -cu b -organi ze -si k -quote oftheday -remin ding -am or -loc king -ðŁijı ðŁı¼ -comp ound -et te -b out -rec ur -fe rence -mi zz -tren d -hip ster -for tress -forth coming -preli min -o dyssey -ang p -del ici -even ings -ðŁĶ ¹ -i q -d w -da ir -kathr yn -christian ity -moon light -ha b -wh oo -f bf -se th -genu inely -pa x -char ity -deplo yed -b nb -bu cs -ju dg -con ge -plant ation -im press -car a -sc lub -sco py -land ers -compla ints -b ama -re build -x y -real ism -sh our -le in -brac elets -mer a -assas sin -an chor -ðŁijĮ ðŁı¼ -lin en -con fron -chronic le -comm ent -cat alog -il les -gor ge -me try -jung kook -love my -sent in -se em -fit ness -alli ed -ts man -digital transformation -pr an -lo ft -min ton -alden richards -en vel -cher ish -certain ty -zz z -rhin o -per kins -en rich -cape town -ome ter -sec tions -ske leton -def enders -ðŁĺ Ŀ -pen c -bri t -ja h -capital ism -ðŁ¥ ĩ -baz aar -re me -ex t -kk k -conver t -stor my -b ye -kar an -chry sler -ad os -pre ssed -syn c -ation day -dang er -bad ges -refu ses -em powering -ly m -ex ports -adoptdont shop -ðŁĩ ¯ -th c -awa ited -focu ses -fin ed -o at -haha hah -âģ © -n family -fi ona -luck ily -thr illing -ty ping -out break -di es -he u -craw l -ne sses -o ath -scri pts -gee ks -ðŁIJ Ŀ -p b -mathemat ics -al is -________ ________ -gymna stics -acti vism -recommend ation -gre n -wa in -cour ty -n apol -cau li -hor nets -g als -jo ckey -dir ty -at ar -enor mous -pe st -greg ation -an os -ii ii -def ends -black historymonth -at x -mb c -lugg age -wit ch -co b -la sts -cu m -gg g -ba thing -n ar -ce bu -ðŁį ĥ -navig ation -min e -re jo -ðŁİ Ģ -gif tide -re ta -use less -pu ll -defic it -al lu -ati me -it v -tr illion -pu e -ac ies -proce dure -l ori -jen ny -c ad -ul ously -dr ac -promo tes -ing the -can u -woo hoo -na omi -zar dari -ts u -be ir -sd g -le ver -we ber -ab ud -lun d -crow ded -deplo yment -ter rain -ken ny -ho f -witne ssed -lo ch -j k -bul ly -w ren -poe try -do ff -ww i -mo red -din i -cul ture -promp t - ¥ -maur ice -to pps -r m -cor respon -ab out -jewel s -gi br -eag le -ðŁĺĺ ðŁĺĺðŁĺĺ -l ending -sou ven -ç Ķ -contemporary art -establi shment -j ong -â̦ " -gat or -patri otic -mc coy -v ape -human e -feli z -coach ella -re posting -ste als -fu ller -n ering -at ra -( - -bla ke -he ather -wor ms -discipl inary -rede mption -y ard -am in -" @_ -d nc -t ds -k appa -ne wark -comm its -spe ars -j ams -t and -msn bc -inter medi -aim ed -at ic -teen th -observ ation -kash mir -kavan augh -ou l -san francisco -re u -bel ated -cho w -pass word -st ills -deta ined -sar i -day ton -dar ren -itali an -ar th -amu sic -ar bit -w m -v m -he m -dou g -my r -a sho -pre v -vin d -bra h -sta g -ภµ -pre views -gu k -con taining -leon ardo -sad dle -ru shing -st av -lon gh -gam bling -ve gas -reserv ation -end ale -bal a -fl a -vari ant -he dge -bulgar ia -nat ali -we aver -sol st -encoura ged -ap c -as parag -ne st -cycli sts -fe l -ìĬ ¤ -overwhel ming -pey ton -j it -a post -mb le -ble eding -neighbour hood -a very -expre ssions -mac donald -gi gs -mon ds -illu sion -n ct -cam ero -over head -my th -ol y -vi o -et v -lau rie -unve iling -pri or -con n -iron man -di ff -day in -crit ici -con go -re vision -wal e -direc tor -p ines -black pink -gar ner -cur ated -manit oba -h ac -common ly -bar ton -.... # -mor tality -live smatter -philos op -shor ter -con vince -fre ak -vend ors -insi ghtful -el ly -sens ors -e led -s berg -weight loss -u kip -sp ur -priv ate -qu a -ss c -, ... -supervis or -advis er -amaz ingly -less er -at es -mah on -oooo oo -sar as -pmo india -waff le -un ders -toler ance -sculp tures -her sh -kno cking -smo ke -cathol ic -gri m -tra veled -fli p -ge off -dinosa urs -sle pt -scar let -ok i -compla int -ob sc -nam i -la g -cross fit -u fc -mc cain -refe ree -sad ness -pen ny -li eu -mo de -ki er -vol s -w is -el on -she a -ba o -son ia -cla ire -em manuel -moist ure -di gest -vi ii -t eller -ch on -access ory -night club -foss il -aw an -hu sky -ab original -brand on -ffici ent -cou gars -ste d -ad mitted -igno red -content marketing -ag as -v ase -execu ted -negoti ations -she ad -n and -tab lets -go th -ts al -d fw -on ep -protec tor -sp ho -gaz ette -andre as -ss er -comp ilation -ha v -contain ers -bro ker -soc al -porcel ain -hy uk -air ing -ðŁĴ ° -publi sher -scen ario -spart ans -re viewing -itu des -ed el -pear son -ba sh -mau i -a ad -ðŁĮ Ĭ -li u -ul ate -program mes -fav our -web design -real ty -motiv ational -cro sses -' ... -bus ch -adjust able -ar jun -mist ak -dimen sion -pi stol -weigh s -en y -unve il -indy car -gor don -f ade -fran ken -qual ities -bet t -loc ate -ker r -sp c -confu sion -ne e -luck y -bas es -dep ends -fire fighter -ol a -re t -mar oon -ðŁĶ Ĭ -w am -defin ing -whe at -bi l -é s -b hai -psy ch -ta u -ic ans -thi k -ob ile -inspec tor -ìĨ Įë -ill on -go s -ev angel -fa i -si st -voc ation -bur ge -chi stan -renew ed -enthusi asm -en ting -ag ri -ike a -m sc -aero space -sens iti -memo ir -hosp ice -co caine -der ry -mechan ics -Ħ ภ-tin o -reduc es -collec tors -in justice -supp re -v ana -ab un -nap a -su sa -os lo -e ff -en core -lic ence -ched dar -z al -moun t -ðŁĴ IJ -threat ens -!! " -archi e -fu tsal -scu ba -jo s -gn on -se xi -s official -compar ing -domin ant -tof theday -fa it -propos als -gi ft -y as -cn c -l r -ha b -reser voir -beli efs -gener al -mar ti -t d -est e -ì ł -wi l -ðŁij ¯ -ðŁĶ « -sp x -et work -excer pt -e instein -hir o -sil hou -team ed -per ception -corri dor -mental health -hin ts -ben ny -induc ted -sw x -wi desp -spe ak -cher yl -dru g -ðŁĺ ķ -h f -asparag us -myster ies -fitz gerald -off er -therap ist -care er -dam aging -ts d -per u -wei bo -y ay -phoeni x -disc re -mac book -bar ker -stig ma -sp read -roc kies -kang ar -bri dg -pa i -bi shop -ta iled -capsu le -ðŁĴ ĵ -ge of -roy ale -short listed -o ste -ash amed -ch app -key e -cl a -screen shot -austri an -nati ve -en ight -juli et -michel e -ðŁĮ ´ -travel ers -pi l -football er -win chester -ðŁĻ Ħ -azer bai -gold eng -organis ations -interpre tation -predat or -ofthe week -lo gan -pok é -mari e -cal la -t nt -cin de -ge tic -fit fam -gra v -ow ens -ðŁĮ ± -shoot out -sal is -commissi ons -co he -p tic -ni xon -hi a -amb ition -mar ine -cruel ty -t k -cru de -sal ty -jim a -mon go -ir ony -on wards -arre sts -strang ers -ig er -cycli st -ra g -exten ds -tra dio -bour g -mo i -el la -e able -lex us -au l -der a -histor ian -mor ton -ti ff -man ner -ko t -d k -po inted -mar qu -a an -en ey -du blin -on poli -em ili -secre t -fl o -âļ ¡ -ba j -ste ep -accompan ied -rum ours -dev i -purch asing -fi g -pu b -sch oo -autonom ous -go alie -x ia -autom atically -re vers -ter o -fu ku -titan ic -shoo k -sand als -see kers -exc av -nor dic -bigo live -ba ke -r att -z ak -ne p -ðŁĺ ¤ -cand y -billi ons -book worm -pp et -à ³ -sur faces -sc ars -phil ip -do gg -ci gars -co te -transl ated -cur ator -sin dh -han gover -bre wer -on es -el ton -ðŁĴª ðŁı¼ -mar cu -elli ot -righ te -di oce -ru ss -rail ways -grand son -as cen -apo logy -awa it -mob ili -re spir -parti san -oli vi -stri ke -yo o -white house -expre ssed -pu ps -bed ford -cul tur -fro gs -fly ing -cav ali -c ds -fri ger -street photography -re solve -tali ban -kan g -cru shing -ju m -ðŁĺ Ĵ -william son -tan g -cur ly -t man -veter an -fa ire -artificial intelligence -un anim -pre n -back drop -fr ances -oc cer -doro thy -work ing -ar thr -conver ted -day light -serv ant -pad dle -compla ining -thir ty -nad al -ak u -ibra him -ad dressed -p iss -green house -batt alion -si mulator -out lets -embroi dery -ðŁĵ ± -fis cal -ger ard -sas sy -ðŁİī ðŁİīðŁİī -vent ures -mer it -public ity -ðŁij Ī -sophistic ated -c tu -conven tional -condol ences -isra el -tra dition -ar an -te ss -gla d -ðŁĺĬ ðŁĺĬ -correc tion -ge on -am d -or ship -be ast -ch ment -ì ŀ -nic o -wk nd -wel s -cushi on -beli e -vo c -idio ts -under neath -pu ma -corn ell -en ation -lu l -swa ch -ab ig -u rer -mi e -form erly -ca f -er nal -chor us -juli us -sen ator -âľ į -wh ir -salv ador -ph d -uni fied -boo ster -graph ical -w rec -son ny -mi z -dere rs -s all -ven s -tusc any -wi d -y ong -kur ds -w az -trol ls -mac ro -cat urday -pre ssing -sa sha -cent ennial -gu sts -em c -be fore -den ise -cu st -ðŁĵ ¢ -lo oo -base l -eng land -y olo -ar du -manife sto -do ha -ì ľ -kni ves -bourne mouth -bi bl -bar b -al icia -Ø © -com er -cycl one -g it -ane ws -character i -vent ura -in tra -sf giants -hu t -be a -dar win -ell er -al v -re ese -bl y -kar an -conclu sion -man ny -fla kes -unite blue -nad u -co pp -ed ges -lanca shire -i als -o tta -philipp e -l ent -che e -ment ors -festi val -an ism -compli mentary -r j -pu g -d ine -we i -cli ffs -sar my -ti veness -treas ury -il and -after math -rabb i -ou n -bou quet -herit age -zi on -sur render -shen an -in ks -kar l -gh ty -pol icing -exam ination -ce y -per su -measure ment -hydro gen -lu han -âłĢâłĢ âłĢâłĢ -war i -о Ð -j y -fow ler -mis h -al fre -âĺ ij -bb naija -cat alogue -recogn ised -sa ver -hu skies -col in -mun do -si va -p ng -discoun ted -man utd -fre sno -de vin -prelimin ary -tro phies -pla stics -du g -pro cu -indi go -g ard -dy lan -pit ches -ground breaking -in son -bl ac -an thology -f h -expl ic -r ard -admi ral -so chi -la shes -splen did -en vy -ad v -sex y -festiv ities -stic king -bi b -thr ill -op p -ari el -botan ical -endur ance -fe males -br icks -vat ican -black pool -ber mu -br ough -roll er -bi d -sue de -sloven ia -mm ing -ml b -med alist -di ans -rehabil itation -ne on -s go -li thu -ram os -z ed -pi anist -inten sive -broad band -stu dy -peter sburg -lu ca -ah hhh -phys ician -dill on -tele com -gri ef -mu n -ac ro -si ded -s ly -blo ws -classic cars -tri um -ar gy -? : -h ri -marsh mal -âĢ ĵ -to pping -war saw -tran sc -preserv ation -b av -re friger -experim ents -ä º -gl it -sli ga -g age -fac tor -flav ours -br ony -sp o -cook book -carri age -aw ay -ny fw -on ian -w g -simp sons -ro lex -ðŁı ¿ -cro sby -ãħ ¤ -cre di -syn dic -pu bs -ali fe -poor ly -mac ed -ðŁĺ ŀ -behin dthe -w enger -n ats -ðŁİ Ł -rubb ish -procedu res -typho on -opho bia -er do -fu el -vi era -bu mps -millenni um -new zealand -lec tures -it on -mil ky -respon ded -ê ° -landsc ape -.. @ -bo ther -âĸ ¶ -z hang -huawe i -tu ition -s worn -in u -y or -pa olo -au ditions -ab il -malay sian -ho ps -fe athers -mp le -au ts -ã o -boun ty -ic he -ì ĺ -sh q -pin ot -ge ars -disapp ear -video games -t na -alzheim er -ðŁĮ ŀ -a ji -under wear -swit ching -sign age -o scar -ec on -dro w -cl int -pl ated -gun dy -emb lem -ho es -ici st -nel ly -juni or -road show -miner als -at le -alexand ria -ac claimed -v ell -shi va -ad he -en ne -amne sty -h ounds -councill or -ðŁĴ ¦ -aes the -part nering -influ enced -mag no -fl are -extin ction -civil ian -maje sty -va il -law makers -rac ks -mc c -ori an -sp ices -er rors -may er -co ca -pa i -s ooooo -reti ring -ba thro -ðŁĻĮ ðŁĻĮ -âĸ ª -su f -endor sement -buil ding -broo ch -pal la -arvin d -ag ent -kar ate -r hi -c tv -ta ine -um m -ba x -reig ns -uni of -enterpri ses -adel e -fla ke -at tire -bru ce -ba hamas -gra vy -sa in -che ek -tri vi -lo v -e en -bb lo -lady gaga -itt a -. "- -du stin -observ atory -eigh th -bloom berg -kh s -f cc -gi st -commemor ate -ve er -sexu ality -ed c -nic ole -vac ancy -u ser -son a -:' ( -dipl oma -t end -up grades -Å Ł -jura ssic -cardi ac -dr s -widesp read -à ł -dail ies -vend or -sim plicity -wi der -len ses -supp lements -de pos -ob served -vin es -parti ally -renew al -collabor ate -ali g -fin ity -ph u -zz y -pe tit -ðŁĵ ħ -z in -i gu -sm ack -fall on -ðŁĵ £ -back wards -comp onent -o so -compati ble -bin ding -zur ich -thom e -w ounds -ly ric -fresh men -sne aky -fi bro -di et -emplo yer -in sect -h ated -sch er -raz or -n sw -boo ker -califor ni -av fc - ° -preten ding -pep si -al is -un titled -k art -grand parents -e the -o ck -lux emb -visu als -small business -abdul lah -min ho -su baru -h ra -reve aling -heart breaking -clar ity -am g -sl r -** ** -âŀ ĸ -recor d -ici ary -min ded -ye h -exce ssive -knu ck -icec ream -tru th -ev ic -ta stic -ant arc -ren dering -, , -mit t -loren zo -st patrick -bound ary -zi g -vo cab -osa ka -fur n -tu n -gu l -s ounding -blo gger -utter ly -g af -adv ancing -l cd -mar gin -lifel ong -solst ice -sh ra -wa its -ple ar -bre ach -en ligh -ad er -itt le -c ation -ho on -stu died -?? ??? -k ash -ev angeli -ps l -wei ghts -met als -ty res -tur no -wi e -car b -g ale -se al -sun ite -am ic -patter son -á n -eu ph -up stairs -quali fiers -khali fa -apple music -ìĨĮë ħ -vau ghan -al ter -cru iser -mu a -t ana -kat rina -id ols -spo iled -secre tly -fi bre -part nered -um es -gi ov -com et -screenshot saturday -k eller -fil tr -fe t -con way -pe u -bad minton -gi d -m ound -don key -bu ff -lea ther -lar gely -bro ch -int ments -am use -r k -sto ve -impac ted -con t -cr acks -prison er -bar i -contrac tor -ori oles -domin ate -pol ar -am elia -dr c -ðŁijĮ ðŁijĮ -vi st -su arez -injec tion -blo oms -ðŁļ¨ ðŁļ¨ -sti ff -pay pal -sno wing -thur sdays -goo se -we dge -educ ated -weak ness -de cker -abud ha -bree zy -Û Į -hope ful -o bi -rai der -gh am -de u -se ve -par tly -fu t -infu sed -mer ri -than e -some time -hu e -me in -cre dit -sli ding -ran de -cher ry -dead pool -sh ol -ar am -under wood -sky e -distur bing -m nt -poli shed -guardi ans -ha dn -pic asso -ari us -ak shay -ir ri -j h -happ en -la kh -dal ton -at the -s well -mar sha -re h -cour s -j kt -top us -serv ice -r ink -hack ers -dono van -hor o -tc m -may hem -cha se -dev ops -ken sing -sc up -sh ere -quali fication -c live -ton g -n ancy -mar is -der dale -ber man -cinde rella -jol ly -ci c -loo t -collecti bles -hom icide -g ge -epide mic -su ites -mu ddy -gi mme -e rec -- * -tal la -lis le -embro ide -ðŁĩ© ðŁĩª -veriz on -ve ctor -be anie -arti san -ga in -flo res -vi gil -u so -ðŁĻı ðŁı½ -grin ding -gh er -air ports -respon sive -shaf t -can cel -ceremon ies -e me -at ari -bru shes -eag er -bo hemi -children s -yan kee -ma a -suspen se -mor an -mac ar -sun flower -cre w -vo id -ke ar -fashi oned -jen nings -sunday funday -sub missions -me ad -her man -wa i -crit ically -le um -baek hyun -for cing -co bra -ãģ ® -acqu ire -al k -ge ology -pri mar -import antly -ire z -bunde sliga -curi osity -sen a -stric t -con soli -win ters -ven om -chelten ham -ðŁį º -cen a -t at -ba in -glo ver -under cover -as ses -car n -memorial day -am eli -i rene -ch on -syn thesis -spe edy -mitsu bi -sla yer -compos ite -under stands -pe w -inter rup -hen ri -mor row -an om -thof july -g lee -thre e -ðŁĺ ® -and hi -ch att -renew ables -ye s -trans fers -!!!! !!!! -bab u -du ter -lo ops -pe ers -o ilers -pau lo -ic ation -h mu -war a -mer cer -hom eland -fu ji -ale y -year book -re m -re en -ab sur -bo is -] : -caes ar -shot gun -kur dish -o ren -ra e -anci es -ty pic -f h -def ault -re plic -lu k -trans actions -r ys -infan try -ðŁį ¾ -cho w -chick ens -ba gh -wy att -ay e -gg i -bre ws -ed itions -mi ra -commen cement -pre su -peris cope -ic hi -guatem ala -zam bia -pain ts -wit ches -wan i -un dere -cro y -vo ws -us mc -hear ted -theat res -shu ffle -le vel -mul tic -squee ze -fer n -app et -post al -mal t -on board -ld nt -co o -s sc -k ac -ðŁĺ ĩ -sc rap -mar cos -deal ers -ann u -mill er -co ve -ul ary -vladi mir -be ef -th ur -pick led -se same -bengal uru -mo tt -kathle en -hi st -no tor -dr ank -du chess -snow fall -e ff -tin y -j n -sy our -speci alists -scot us -bay lor -eve rest -mali bu -pre m -harm ful -l ali -b ates -g ye -differen ti -and ra -geome try -el over -black out -== == -ko ta -inter act -asi an -la yo -samu rai -fi del -exhau sted -gla di -pd t -spher ic -anti qu -guit ar -stu ri -ho pper -ang le -f ills -sla p -mi th -rod ney -ong i -in som -pre venting -cassi dy -ap ho -ore gon -lo in -ham mond -contribu ting -f n -gar ri -ori on -comp elling -escap ing -aim ing -plu mb -bi stro -be asts -concer ning -bo e -do pp -shop local -stumb led -âĤ ¹ -naz is -âĢįâĻĤ ï¸ı -gest ure -war ts -us open -hi ggins -char li -hang s -bom bers -° : -fe eds -c ch -st il -nic ola -ðŁĵ º -clam ation -tro pic -af ro -ou k -expen ses -der rick -al ine -fa w -reg ard -im er -sat in -thi um -ry der -pear l -te ss -mm mmm -sen ses -ðŁĩ ¹ -positi ve -exhau st -occu r -nor ris -lil ly -is les -direc ting -yo fficial -count less -sam ar -on stage -flo ck -mir rors -arch er -mo i -k d -vi v -in os -si kh -le i -sen sory -br its -kno x -chest nut -op y -coli seum -z af -di vin -adap ter -:) )) -tem ple -ku n -hel mets -t df -gu ide -m old -o ids -lu ther -he is -monaster y -sp ree -k lu -brit ney -jagu ars -gre ats -c cc -ky rie -machin ery -cric ket -re ro -ab o -aspir ing -semi finals -ale ss -sig natures -var d -me th -her bal -hol den -king dom -ap or -reg gie -ore o -palestin ians -em mys -sec tional -ro i -ney mar -qu el -cu ll -l ka -haz el -estim ate -ul ties -go w -be a -purch ases -bel ts -protec ts -m é -gue ssing -bb o -clau dia -fr acking -jon ny -el k -cel tic -al mighty -ra je -courty ard -ig i -can es -ðŁĴª ðŁı» -bank rup -le thal -âľĮ ï¸ı -graphic design -vad er -penc ils -rough ly -dan te -m fg -const ell -cam el -j b -bloss oms -en to -balo chistan -cine mato -ill ard -jer sey -con sent -dent ed -con templ -sch er -hol i -lou gh -st our -a yo -begin ners -cur b -v hs -a jax -du ff -av eng -dom est -commit ting -ai red -cha p -hedge hog -disappo inting -freel ance -in land -char ms -ðŁĺį âĿ¤ï¸ı -ai sh -m x -buck le -ti dal -per mit -bo ating -ra cha -kend rick -b ello -b hi -ple a -estim ates -l b -apo logies -jay a -bb l -ast oni -inter state -main taining -el bow -mu p -ep it -ðŁĺ ¡ -viol ations -def end -be h -sl c -am ir -pur i -ti um -fi fa -blur ry -scri m -ðŁĻı ðŁı¾ -ma ple -rel atives -âĺ Ŀ -cho c -con nor -⾨ ⾨ -whi sp -list ings -ma ze -than king -ri dd -grass roots -shi fting -desper ately -gor illa -den i -ju les -stra th -g ley -ja in -bu ick -t anner -ðŁĴ Ŀ -ga e -pri m -it ors -n ano -separ ation -armen ia -bor deaux -ðŁ ħ -pj net -bu rial -e bon -glo ss -re new -gri er -spe eds -comic books -sym boli -pur poses -ãħł ãħł -spati al -no table -ci on -n ps -ho ffman -nor man -rt g -du sty -situ ated -tr an -k fc -em en -nic kel -hast ings -sett ling -gr it -l ena -w aw -art s -gu m -ca regi -le wis -sapp hire -rememb er -embed ded -t lc -bl at -serge ant -el sa -boot camp -bow man -photo graphic -pill ars -direction ers -classi fied -no is -ve er -barre ls -wh oop -ðŁĺ± ðŁĺ± -fe male -petro leum -medi a -e fc -poké mon -ठķ -enthusi astic -var un -pro files -pedi atric -acci dents -con rad -jan g -jo jo -ac or -ob server -l f -live stock -for gi -fo s -el m -an and -go e -c ere -avoi ding -gri t -om an -thank fully -scat tered -nick y -cylin der -chees y -di ver -mahe sh -cav es -ear liest -qu inte -subjec ts -b end -gul f -vocali st -glu e -pat ches -un stopp -sny der -demonstr ating -pi o -hor ns -wic kets -and the -r ama -yo on -stra ight -bed time -or ang -bul lets -sa urus -min ers -inci dents -! ... -ðŁİ ¸ -ag ers -hand les -stat es -in ity -d ons -incredi ble -emin em -avi v -ru dy -moz art -folk lore -appli ances -mt l -fre y -di as -hu a -page ant -stri ve -im prison -bul lish -r ana -al erts -bb mas -hy per -derby shire -re cre -re dd -debor ah -cosmo s -law son -mel anie -psy cho -ho or -doo dles -sni per -shad y -man tle -canadi an -new year -inter actions -separ ated -cor ds -spiritu ality -ap u -it o -p ct -pel osi -rebel lion -se iz -wor cester -sec tors -ul i -san ta -Ð µ -ðŁĩªðŁĩ ¸ -bi ased -class ical -gam ma -dee plear -emer ge -back er -sur ance -hand crafted -ðŁİ ¥ -franc is -mill an -ic i -cro wn -wo w -stri ped -un fair -relax ation -³ ï¸ı -embrac ing -she alth -pale o -martin i -dist illery -wr ink -or k -na th -hay ley -cour thouse -si ber -sa di -quiet ly -mel t -m sm -me h -smart phones -rel ent -pp ing -war wick -co logne -gli a -cot ton -pro g -lon e -ip sw -star ters -expan ds -u mp -su ed -ski pper -infe ctions -ing le -à ¡ -cler k -demonstr ate -ac ar -ðŁĺĤðŁĺĤ ðŁĺĤ -ti bet -bun s -alo m -demol ition -ssi a -g st -[ ] -so ar -âĺ Ģ -ðŁĺ ª -ðŁĵ Ĭ -dee pest -beyon d -are t -att ends -activ ated -di mit -âļª ï¸ı -high lighted -magaz ines -rum or -az za -steph ens -dol ph -sho ckey -mat s -we av -mel an -serv ers -tra um -ku sh -æ Ĺ -bab ys -pa z -a al -la use -break ers -canter bury -ul ture -mi ri -euro s -tane ous -impre ssions -du tch -il d -gh i -pur due -adequ ate -l p -sy ner -ang ler -du rable -gal ore -ro wn -mg mt -ðŁĵ Į -lu cia -âĺij ï¸ı -zay n -bor row -. ( -north umber -cru sh -eng a -su sh -extra vag -t out -ma hal -ali stic -ther mo -gall eries -es se -chi bi -attrac tions -lex ington -legislat ure -docu mented -resi den -brow nies -w f -st ool -plan ets -sho ppers -conduc tor -ms p -tr icky -fru ity -end ra -feel the -whi pped -hair style -re fer -oo k -oc topus -audi ences -ku mar -after no -op tim -c fl -ni p -gen i -alpha bet -ann ab -lam in -accep ts -l ng -ðŁĺ « -t ine -ac om -cheer leaders -t k -gr on -v g -k ung -ja x -dha bi -r ss -mack enzie -beir ut -clean up -gy psy -st ell -bur ger -hurric anes -educ ation -st ina -âĻ¡ âĻ¡ -unfortun ate -jere mi -bad ger -at ers -: â̦ -ter ra -subli me -stu d -y mca -mr u -duter te -bren nan -bul b -mel o -yl on -hack er -c red -gu d -as an -pad illa -embroide red -vietnam ese -pione ers -projec tion -re boot -id c -an ey -pri mer -suff ers -win ding -p on -sto day -mor n -u ch -all in -adid as -eliza beth -tu ck -o graphy -ðŁļ Ģ -be g -os borne -ghet to -r h -cn n -ir ma -ma kin -cab les -mur ders -oc ks -inst a -al as -si k -cu ff -la re -foo dies -o vic -at om -geome tric -em pathy -ภµ -cent enary -newsp apers -administr ative -ðŁİ Ĭ -sti ve -contrac tors -le tt -tas mania -awesom eness -den sity -ve en -prince ton -frequ ently -re ject -gh i -modu lar -ceram ics -sh ag -ki wi -can vas -sweat shirt -an j -ti mm -napol i -il er -appe als -hamil ton -ma yo -we ave -arrang ed -whar f -occu py -b vb -as aki -ot ter -nor m -vi es -de tox -tion al -dere k -id ad -ad missions -constitu ency -u pper -woo t -allo y -se ve -lu b -un comfortable -ed win -ab re -d wight -ar che -virtu ally -sp ol -pri e -ai i -er r -swit ch -bar ack -se ok -cou l -wn t -pou l -o live -caffe ine -cardi ff -notor ious -de mp -ex cess -bar r -t ford -a jay -bump ed -my thology -shel ley -fal con -shakespe are -must angs -no ted -bon e -civil ization -sy d -par sons -un official -hy ped -sp ends -oppo sed -v ings -space x -noti fication -deci ding -bio tech -out si -sal ah -! . -fe d -ss y -c ms -bad gers -cr o -ela ine -n ba -dy our -n ant -honey moon -climb ed -conom y -ath a -m ell -ne bula -nature photography -juli e -bm x -inve sted -mon o -lieu tenant -wat kins -techn ician -o se -ka e -ì Ľ -mc queen -pre ach -trav eller -flexi bility -ze bra -reta iler -p ant -ben der -brand t -squ id -war rant -veri fied -cas s -pier cing -hon ours -t ying -mor ris -kis sed -op rah -panor amic -me i -splat oon -wich ita -ari as -gal li -indy ref -good times -athe ist -confe ssion -ow ski -re pping -ad ditions -mechan ism -z im -j ans -su f -cho pped -beg innings -vitam ins -ãħ¤ ãħ¤ -or th -po les -ru b -antarc tica -indie film -web cam -ket ch -bre tt -cle ment -her on -defe ating -hydr o -buc ket -wand ering -sid ney -future of -b inge -on ies -knock out -administr ator -syn the -l ent -jan i -bar ley -premier league -ner ds -cr m -bra s -bot any -evol ved -rot ter -ro wed -tum or -weal thy -Â Ń -mon arch -li shed -da hl -ðŁİ ĥ -bu ch -ken yan -Ø § -red ness -assemb led -se mit -hud der -shro p -ran i -lear ning -mor y -iti a -geo graphic -worl dof -f b -pho sp -boo gie -am ped -? ... -che w -dwar f -ar us -s sen -ru sty -recru its -h k -gar de -app lause -vol umes -invol ves -ta c -hand bag -trans late -ffe l -se ym -aqu atic -trans fer -zo di -and r -acade mia -cr ater -te z -ar se -adap t -col oni -snow man -mal i -hang in -di schar -oy sters -pho e -colon el -w ba -hispan ic -thri ving -sh y -ag les -sales force -cre me -so les -la fayette -â ī -ter ia -ach a -sp erson -go go -car ly -the ore -am ore -vo x -af t -ãĤ ¹ -stap le -mu ffin -di agram -ino x -su stained -av ent -me ta -arbit r -dec ay -ado le -Ð ½ -ec ol -ph o -n k -o cu -gr anny -ç a -luxemb our -stad t -alber to -le vit -am as -d x -or phan -co bb -as c -lo gy -immen se -chan ts -off line -p ent -bre x -w inger -plan e -i el -nichol s -ca thy -nar uto -low ed -/ // -ignor ance -cat astro -you ts -sch en -buil d -haz i -s ine -critical role -du g -dete ct -lo gs -en amel -stpatrick sday -ed die -co pa -cigare ttes -ho ff -kay a -la goon -ra pha -air borne -choo se -puer tor -ke v -gui ding -fro sty -bor ough -mir a -ðŁİ Ĭ -cade t -anu sh -yo gi -e ger -fl ing -slo pe -nin th -we ston -foot wear -f n -may weather -a am -pla in -stair case -witne sses -work outs -ro bust -dex ter -co hort -ðŁļ Ĺ -sp ell -ha ze -o om -organ ising -wild fire -cont acts -av on -min o -upd ating -ðŁį » -li thium -ing ual -k is -au ga -lo com -de duc -u da -th ak -boy le -mp er -hot tie -eri k -re vised -is la -travel photography -oo za -en qui -confe rences -clo ver -g room -cur ves -live on -per f -displac ed -bo log -xx xx -ðŁĺ© ðŁĺ© -te al -ve ssels -rain forest -cal ci -pan ther -gira ffe -ta sted -imag ery -pad res -day time -bas s -ri pe -opio id -nu e -vin yl -invent or -sen s -process or -mu t -gad gets -bibl ical -shann on -jacqu eline -car y -the resistance -ali en -n vi -co sy -bi har -fo ley -ren d -mu gs -fa ken -cl one -ni allo -gra bbed -chi hu -power house -n tt -chero kee -spon ge -imple menting -rh ine -le one -ðŁį Ģ -pret tiest -infra red -impro v -swit ched -tu bes -con tr -bl k -projec ted -be aver -yo t -bbcra dio -thi gh -per secu -apologi ze -w ack -po ster -oli ver -az a -lou d -( ?) -f the -women shi -spar row -blu sh -us able -sc ales -it ative -peu ge -ne eding -legg ings -glam orous -mat ur -c z -wat t -da b -tam ar -et sym -bau er -heart felt -h n -else where -bir ch -alu mini -hu ck -e me -j l -traf ford -d z -por tions -ana sta -arthr itis -esp n -ber gen -viol ation -yo shi -c z -northumber land -clo sures -ðŁĩ¯ ðŁĩ -smi ley -r w -tel ugu -inten si -gre gg -ve ga -dun geon -south bound -ba il -domin ican -semi final -chap ters -h itch -van ity -trans iti -recomm ends -sati sf -bar ca -queen s -( ( -de struc -stra it -ra vi -dess erts -in tru -har am -k os -fo e -fat ty -pais ley -magn itude -dri dge -com ey -schem es -vision ary -our t -down loaded -ðŁĻĮ ðŁı½ -gd pr -lan i -p wc -gu ad -nic est -stake holders -re ferred -george town -arvind kejriwal -schnei der -in doors -all star -strand ed -gen der -ze pp -ma sses -ðŁIJ ± -pati ently -bl dg -z ab -we arab -vi vid -he ck -d ella -sy mb -je opar -la ger -à ª -comb ines -ne c -br ay -flo p -tx wx -jo ys -pon t -pro found -sur round -mad hu -ma ble -ay r -te as -n sa -open ly -er nest -ãĥ © -to po -g na -anti oxid -ti an -e tr -c ello -ma thi -gener osity -b iting -man ic -kel sey -chee ks -ten der -w th -pron oun -ultimat ely -gu sta -ari anag -ger ry -ble ed -red dy -mic h -mitsubi shi -oper ated -sex ually -ma u -cl lr -vi ds -co c -mel ted -ðŁĮ Ī -q ld -ite ch -instru mental -end game -ðŁĵ ĸ -ener gi -brow nie -tam il -at in -domin ated -pra ises -fire place -sens ational -men a -k arti -un prece -ru pt -ori ental -mc cor -tour naments -scen ter -re eves -prescri ption -sam e -fra u -tru ffle -em bo -roman s -bla sts -techno logical -pr at -b sb -y ar -tren dy -ac l -al ad -ðŁį ģ -o hh -bankrup t -tho ven -regar ds -is er -war wick -vine yards -real m -niallo fficial -do ta -ge mini -to do -v able -¨ ¨ -la u -wre ath -ju ve -nat asha -le ver -lor i -hor ser -cc tv -air bnb -es anders -sin clair -ema biggest -high school -con test -optimi stic -t te -ðŁĴķ ðŁĴķ -ss d -ye e -hel ena -con sen -ric ks -jes se -an ic -ðŁİ ¯ -re acts -ro be -independ ence -vol tage -m ington -s ant -à¸Ļ ภ--------- -------- -sentin el -ke tt -rehear sing -aaaa aaaa -sof the -stir ling -sear ch -wi gan -stand out -sna il -pent agon -Ä ģ -ch lor -cru st -net any -chemi st -disapp eared -ric ardo -sp iders -bo se -war ren -me ssing -bann ers -gu el -par ach -ma id -coun ted -epi le -bon fire -speech less -se tter -meas ured -rejec ts -nik ki -le ster -foren sic -fab rics -alo ha -pre served -wat ford -deta iling -dar th -bo u -car ly -... ' -tail gate -noti fications -å ¤ -pas sive -trous ers -balo ch -ro ther -typic ally -à ¥ -sp it -wi z -sic ily -technic ally -ex pose -st age -hu bb -cre am -cap s -po ke -sle ek -ju ne -tempor arily -de z -awak ens -l ame -_ - -ji ha -tues days -advis ed -advis ors -exi sted -dis agree -news room -lo sers -world tour -dr ying -al di -har ness -foot print -hobb it -p mln -i ro -que red -asse ss -gaz e -sa b -th ian -í Ĭ -ti f -ob serve -ev il -dra wer -swee p -cor y -co dy -kyo to -cal lum -n inj -lau rent -be i -sket ching -custom ized -du r -regre ts -knox ville -ìķ Ħ -mess aging -grac ie -abun dance -bi dding -bre wed -fl ouri -therapeu tic -alt itude -ho gs -bur ner -elec tro -wonder fully -he ater -post pon -li very -r all -ad as -a ac -sau l -brook lyn -play house -âĻ¥âĻ¥ âĻ¥ -char itable -in y -z ah -compet itions -be av -plu gged -o is -do om -astron om -speci alized -max i -ta ps -cellu lar -depre ssed -folklore thursday -cri b -e mul -ë° © -fi gh -ru z -car lisle -spe ar -side walk -de i -depend ent -lac es -nh s -ðŁĮ Ļ -reali zing -net work -ric he -re gin -re fresh -st ral -pa thology -pla id -psyched elic -hin d -u ka -algori thm -lin king -progre ssi -fe y -d ade -hydr ated -b ant -fam ed -cot sw -bo ise -as c -rac ing -ja vier -ww en -mar lins -poo p -swe pt -toni ghts -we f -ani me -slo vak -âŀĸ âŀĸ -cla us -lem me -cli ppers -re ls -arianag rande -r te -ko t -thal apathy -hungar ian -zu ma -y von -is u -jour neys -clin ics -be be -ww f -n ws -super heroes -er it -sle ague -identi fication -mo tto -ba i -sour ced -ill er -ap i -pri se -unprece dented -dam as -tuni sia -dra in -undere stim -e ther -quarter ly -rewar ding -al ham -wolver ine -cab ine -hyp no -nad ine -hav ana -da e -ðŁĵ Ī -dr on -read ings -b ati -pic o -mer ci -iti an -wal kers -el ope -mi key -god zilla -bur lington -abu ja -social ism -at ility -sh ell -harry potter -g no -ab ur -re leg -fel ici -ro gen -neuro science -inst in -ath am -vou chers -j arre -fu se -def ici -monte rey -de port -mid day -pp ard -fre ed -ame ter -wil t -n ingham -pr att -liber ty -slo gan -o to -pr i -co ated -c pd -ne tt -il las -mal awi -evol ve -accessi bility -ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ -or nament -b p -el is -son line -chi ro -fl ick -ib m -ar ak -en ables -gar land -san e -cu ties -tri p -rotter dam -n ys -lam ps -lu cas -bo g -ra ils -travel led -hic ks -en u -sab ha -scru b -hi er -hart ford -fo o -fer nandez -tre vor -mat tress -appo intments -ale j -fe i -o logist -saf ar -oc ta -sr c -sha un -ambi ent -dri c -bi ker -she e -must ache -h ta -bo one -her ty -car dio -bra kes -rec ital -consi sts -overwhel med -cau l -robb ins -im it -al th -ur l -bi bli -on ne -black livesmatter -diffic ulties -tel ang -tall er -ðŁĵ Ĩ -deb ating -bur rito -mo vember -strength ening -bo e -te stam -mirac les -base ball -re nee -ðŁijī ðŁı» -al fa -âĺ ĺ -unstopp able -ec s -g mo -giftide as -path way -fen cing -ðŁİ ¤ -b ham -ra s -sk o -d led -thel ast -magn um -bin ary -wil de -wil der -wh ati -barbe cue -h ism -can oe -kur di -eli ve -advant ages -mad ame -bi er -mis sing -enter tain -air force -y ama -c is -hash tags -j is -ve il -dream y -ten se -may ward -ch ateau -hunt ington -âļ ĵ -v all -up on -bl ouse -dun es -ðŁĺ ´ -fert ility -m ole -curren cies -st u -ber lin -toa sted -div as -wal t -lar k -por a -hit ter -um er -chil led -bal ancing -fa is -y in -or tiz -east enders -h ate -ur al -ap ril -tim el -à ± -per o -sto cked -respec ts -th t -best friends -giving tuesday -be ad -inv ent -im i -nap les -comb ining -tok ens -thir st -ma sc -par rot -sp u -dent on -* -* -t res -subur ban -wid th -si ve -con tender -siri us -lo k -troop ers -outra ge -tur bo -frag ile -me ssed -do h -disc ord -netany ahu -re sign -forgi veness -mo han -mun ch -cam ou -identi fying -enab ling -hot ter -thorn ton -jai pur -ar ya -ðŁı» âĢįâĻĢï¸ı -mu staf -maj ors -o ke -du ffy -roh ing -til t -ðŁĩ®ðŁĩ ³ -rock star -she ep -hend rix -ra v -in vention -do u -lagun a -gru mpy -sw is -im pe -) ' -you ths -bun ker -st ache -oppo se -indi es -acceler ate -ml p -ed en -w ann -k ail -akshay kumar -su pt -pol ym -midd leton -extra ordin -wil son -australi an -alumini um -way ne -alum nus -mat ics -gri m -er nie -opp a -competit ors -rand all -h ence -decla res -pre aching -sha he -can e -sustain able -stap les -le dge -ad ena -doctor al -bur gundy -decor ate -ren dered -ri sen -pr ank -di or -bee thoven -flo or -ac com -to t -ho dg -touri sm -say in -objec tive -mar kers -premi ership -en abled -camou fla -gi ant -Ñ ģ -smo key -ric ket -pan g -de pending -s ation -evol ving -inter cep -cen sus -tof the -re en -mendo za -trum pet -marke ters -an it -ðŁĻ Ĭ -north western -v la -foto gra -blackand white -che wan -wi g -tro om -ginger bread -k n -ro mero -n fc -or chi -fun ko -sour ce -f s -ra ped -o st -tar ot -ann ually -ðŁĺ ¬ -r ill -del av -.. !! -se s -can n -medic are -ph el -ape x -guardi an -rema ined -r pm -a ñ -story month -instag ood -neighb our -p ing -sem ite -my stic -as cot -mat er -hand ful -dang ers -ti d -ana heim -opol y -sh allow -nami bia -tor ia -procu rement -big bang -announ cements -prosecu tor -beng als -sal le -en roll -ga stro -sugge stion -ba k -ha ul -budd hism -berni esanders -flu te -fati gue -cyn thia -cho i -ir win -gu a -str ous -h p -ba p -satisf ying -play a -ðŁİ ¼ -inst ap -al ice -t p -irri gation -ðŁĩ¬ðŁĩ § -in tric -clu es -ple x -sa x -he pat -dump ed -signific ance -by u -medic ation -pro v -tough est -corn ish -âŀ ľ -kel ley -u v -si zz -si bling -me st -di stor -diplom atic -aun tie -b hat -son ic -bren da -pump kins -ro ch -black burn -ur ged -shi a -arrange ments -floo d -sa unders -lec turer -nou ri -popul ations -diplom acy -consist ently -ðŁ¤ Ļ -t mund -cauli flower -l ily -vocab ulary -vari eties -coo ker -up town -qu ent -mo sa -re inde -velo city -spru ce -social medi -i ber -volun tary -proce ssed -bal tic -y ang -leban ese -d p -dol ly -arrange ment -y uri -cran berry -kal yan -elev ation -cli ff -pu shes -ìĬ ¤ -sil ic -co wx -eter nity -sla ves -vine gar -glou cester -con tained -breaking news -aga inst -renov ated -norm andy -hero in -ys m -mo ds -gre ek -un di -tren ch -v h -encoura ges -head ache -gr ange -: ' -ever green -Ù Ĭ -reck on -ab used -th ru -cho ice -ti dy -col der -scho ice -ha in -bru m -li ars -bre it -yor ker -sh ack -he idi -micha els -sco pic -fasci st -play ful -ca c -yas ss -sh ad -.. ? -qu en -ram irez -clif ton -pr s -best fan -âģ ł -gener ating -head set -disappo intment -abstr act -bo iled -paren thood -azerbai jan -exhib iting -bom bay -oli vier -ko so -un lea -mat ernity -iz er -si ves -r hu -col l -saskat chewan -fre akin -de k -na g -stab ili -ðŁį ķ -organi zer -bo sses -ar u -u va -at able -ta un -after wards -fert ili -ver ge -az i -mor ph -๠ģภ-jer k -cosme tic -ko w -stru st -ap ache -post cards -for mul -ì ĭ -spin al -jack pot -elec tri -Ã Ń -lo y -gra der -diab lo -ar di -he sit -f w -arch ery -pa sh -the ories -repe al -re live -per cy -âĺ Ĩ -im in -syn chron -sham poo -coup ons -o to -la i -thou ght -luxembour g -mo v -ðŁĺ ¥ -ge mma -se ated -m ga -strat ford -un certainty -shi fts -est o -fo ol -fire arms -cor rie -ki ki -appa rent -p ills -olym pia -fi d -elev ated -de cks -ignor ing -av alan -ro v -whist le -p tsd -milit ants -robo tic -pac ers -quil t -bankrupt cy -lic h -per cussion -celebr ity -al s -( ; -su t -pokemon go -h g -off s -gibr altar -scre ams -billi e -gen ome -mar in -be ams -arch bishop -em in -bedro oms -g ated -ol ly -warran ty -at own -cudd les -gun na -k ic -vi ve -cy mru -nar row -pro b -le o -refe rences -manufac tured -cho pper -brun swick -sem is -don ia -r ye -man o -hur ting -? # -hol li -investig ations -c els -ðŁĵ ŀ -le ster -temp les -sto rey -mc mahon -toi lets -wo of -ï¸ İ -le verage -at om -night mares -victor ious -haun ting -custom er -ag i -yo ongi -mon ty -ver onica -w ur -inti mid -blan kets -volu tion -j m -âĺ İ -am on -jud ith -ðŁĺİ ðŁĺİ -distr acted -dri p -hurric ane -and es -revel ation -tro op -ab leg -col lin -tibet an -wor rying -inter nationally -eat er -camero on -brad or -y uk -ðŁĴĹ ðŁĴĹ -tra k -slo pes -ci er -ne a -ol er -ta ka -albi on -volcan ic -am n -a fi -ob stac -face time -ger ing -n pr -metall ica -organ ic -ðŁĴ ¡ -ki dd -d ances -pemb ro -wash er -m its -om er -emo tionally -tan go -ip o -do cks -scan ning -spec s -tho m -the ology -emer gen -om i -g pa -selec tions -un necessary -ima ge -ter s -induc ed -gi gan -rent als -supp lied -m fa -shan kar -lat er -pa jam -cla ve -Ù ģ -ma hin -carl son -avi an -ano va -kati e -aj ith -design ated -chocol ates -investig ators -gla zed -prin cess -er ry -ra gn -ou rable -hr u -sun dance -peuge ot -steam punk -gh lin -gre ase -hi res -z ap -per ce -j ill -tom e -he hehe -joy ful -mae stro -ni shed -gene alo -v ich -p its -fox es -good man -emer son -lo bes -con verse -o ats -thom son -ra him -mal ware -ah i -man kind -re sin -im g -sw ood -kin der -sc roll -ar a -sak ura -ro bbed -xi on -ny a -c ism -ce dar -be in -mour ning -tor to -heath row -done gal -bar b -hydr ation -k or -elim ination -su pdates -hill s -appe ti -star red -ko m -gw en -dd d -cra y -sc anner -personal ised -seren ity -re design -meta ph -box ed -judg ment -no se -ë ¹ -er ad -ac ne -supp liers -ener getic -v om -as ap -ðŁĶ ¸ -ir vine -hat ch -la ss -ad ren -waff les -accur ately -ici o -itt le -se un -occup y -web cam -thene w -ent es -ga i -j w -accoun table -vis or -ir rit -licen sing -hudder sfield -gen ie -ðŁİ ¾ -atmo spheric -ten sions -spart an -clif ford -ol an -north bound -ame en -cen sor -u el -ster y -$ $ -far rell -hy ster -cl t -se dan -rep lied -descri bing -micro wave -sla b -pro sp -assi sting -ru bio -e than -hh hhh -gu ay -z man -ra ise -roll ing -o e -n ile -ambro se -scar borough -hero ic -coo ks -mor t -chop ra -ðŁĮ · -to b -shav ing -stac ey -dor m -motor sports -wi ki -fol ds -sp iced -stress ful -liter al -fu dge -pe ggy -wa ite -tre sses -se sh -pr ic -ðŁİ ħ -fri ght -r va -mumb ai -po m -tt v -cel lar -tom e -andro id -dor is -tsun ami -tin der -o ec -m wc -dor tmund -no thin -l iti -so u -believe in -at u -kno cks -mag ni -ss sss -ro hit -ine ws -ang i -m andy -ke ttle -intermedi ate -av ant -cur l -endor sed -ori o -ur t -consider ation -wi res -shel ters -b ino -vik ram -imple mented -ly dia -bu k -paro dy -c news -under graduate -canu cks -sam i -polit ically -ro tten -gh z -tex tiles -over load -moder ni -recre ational -fli r -bat on -typo graphy -ov ation -intrigu ing -pilgri mage -al ge -ad ays -tcm party -sp elled -cur ls -boo ze -ste m -ann es -ir ls -spon ge -sho pper -sig nation -bra ss -mi stress -le ah -beg inner -lau derdale -augu st -pre school -ta ping -tai pei -execu tives -b d -rhe tor -esc or -immun o -deeplear ning -stat ues -it us -manu script -ly ric -cor vette -mol ly -la ge -de p -cn bc -le st -je ssi -fi fe -griff ith -oppo sing -ran g -dr ills -respec tful -p ity -d ell -har ding -play boy -blo ke -shut out -k ili -o sp -se attle -bc poli -mis es -journ als -team ing -es ther -fre ddy -Ķ ï¸ı -metr ics -no tre -gar ry -for ty -navi gate -perio ds -bened ic -j id -da w -ance stors -restor ing -con g -aller gy -tit anium -c ence -lean ing -ab bas -v ast -uc f -roof ing -e man -seve rely -vo gue -ve au -in bound -d z -tane ously -stret ching -man chester -dr yer -dav is -kan th -the game -it ted -re tain -el les -conge stion -frat ernity -ol lie -lo ki -fre ely -cho o -pon y -sc ep -tab ly -bal t -rock n -di me -lo gging -ðŁį · -ad u -ha voc -water ford -char is -swee tie -run ning -ner d -erdo gan -z ara -weigh ing -fif ty -pre cise -low ell -kurdi stan -r yo -or th -syn th -lin ers -phenomen on -art illery -il legally -constru ct -nostal gic -gar th -al ta -shel ton -a sean -w ander -dur ban -di versi -bon o -cl on -le man -sh un -obstac les -appet ite -fe eder -respir atory -di xie -formu la -an to -so ber -extin ct -au c -ing les -legitim ate -; ; -min nie -ipsw ich -dram atically -ðŁijı ðŁı¼ -ingh am -milit ary -mon et -us navy -for k -dun no -play er -q otd -st oo -ex or -ethiop ian -film fest -pe red -c ate -sau di -in ner -sin cere -tion ality -ale e -de eds -cooper ative -ir onic -cro cod -br ary -post season -cam per -can ary -e in -exten sions -nb d -sher wood -spo kane -hu mp -jit su -ê ¹ -dar yl -p si -stab bed -offer ings -expe cts -cav al -body building -fr aming -f ca -ye arly -bom bed -sk il -resear ching -jud iciary -gree ted -tu dor -mil o -innov ate -ðŁĺ Ľ -r hs -ru by -contribu tor -fam er -soci ally -m lin -fi ery -ut ter -beau t -it os -de voted -rain bow -bar ney -pe ren -ar jun -r na -gab by -ut i -hann ity -pick le -ser v -qu akes -pp e -fe m -wh itec -j n -victor ies -ðŁ§ ¡ -gol fer -congratul ates -resul ting -mechan ic -ur ve -cen tered -kie v -an s -in cub -< < -c mo -bestfan army -dap h -en ham -on cology -ku sh -t xt -ori ented -fashion able -c sr -sa hara -r ack -pd p -han son -ภĩ -ti ers -ra r -pan am -in sky -sa hi -testam ent -asth ma -in her -fisher ies -or der -ho we -gall on -ep is -suz anne -drow ning -paneli sts -ðŁĺ ² -ë ¦ -al ach -commemor ative -at tribu -ðŁij » -mo o -visi onal -week sary -gu st -ak in -poin te -ee e -di spar -ni pp -dent al -st all -pi an -bor e -ul ster -tic k -ir r -tae hyung -micro phone -bermu da -ga ard -el er -plumb ing -hu gely -âļ« ï¸ı -race way -cam bridge -mar cel -burn ley -to ast -holly wood -fa sting -me red -hib ition -ca pped -benef icial -ow ning -cont amin -arab ian -to on -cap ac -hul u -sm ir -nutri ents -se in -graph s -con ditional -ðŁij ħ -or ac -play in -nor the -tor nad -mar ian -ju mbo -lex i -incredible india -road to -uk one -confu sing -sp h -shan k -pi ed -mq m -positi vely -sher ry -path ways -consi ders -tof u -argu ments -resil ient -che tt -with dra -ter o -ated ly -sw ana -he b -fli ght -har ley -decre ase -kind le -book shop -³ ï¸ı -marty rs -sm ur -mc cl -concer to -sti me -rejo ice -app lau -cle ment -mer kel -jai me -im mortal -isle of -mar co -youtu ber -stal king -me too -st ack -sp ouse -u st -lu v -âļ¾ ï¸ı -eque strian -ev ing -fl in -nick name -the big -as ar -st acks -wal ker -bor a -kidnapp ed -hur ling -humb old -rec alls -co pper -ann is -se o -mer ger -mu ir -ad dy -ðŁĴª ðŁĴª -be x -cr acy -con an -congratul ation -mid st -âĻ ¬ -for bi -op tic -cr ate -crocod ile -mad agas -secur ing -ast on -o gue -savi or -salis bury -love it -fuji film -cast les -as st -ar rows -sp acious -tr s -poly vore -progre ssion -m ri -nel son -bi m -indic ator -o da -pe pe -re signation -gu t -sne aker -log ically -az y -are lla -te aring -jo shi -ssion ism -q pr -mari ah -p x -ble ed -mi an -med ley -we iss -ker ry -gat ory -at al -madi son -av enger -nab y -pl and -gi les -fresh water -d ington -ta j -demonstr ates -n tv -bul bs -sunday morning -pe ake -souven ir -wa h -ton nes -m kt -complex ity -con den -ross i -b ing -y ds -su k -n go -mid land -ol y -life is -ri pple -mo reno -dd ers -tu s -á ĥ -bou l -x a -hol dings -wn y -shadowhun ters -ke i -asp ire -m ous -ow en -so ak -skir ts -moun taine -stor ming -ch rome -ri ots -sar ato -amaz e -less ness -nav ar -crit eria -ra fa -indul ge -ay er -por to -nam o -........ ........ -yi elds -val le -j h -mac ron -sa ins -dur ant -tra ilers -wo t -confeder ate -sh rin -id ol -form ally -ten e -motor cycles -than g -no de -bang er -dal y -p ats -enroll ment -au ctions -at al -ar bor -lo gos -de arest -trans action -dom ingo -fle a -ser mon -de ck -sin cere -questi oning -juli o -was p -pre tz -armen ian -k ham -inflam mation -picture sque -acci dental -film makers -ðŁĺ ļ -ðŁĴ į -ca sey -so b -yee zy -good will -parag ra -ss ly -fe ather -dy ed -assassin ation -na de -b cs -app lies -femin ine -fe u -ext ent -depu ties -l ack -psy chic -go i -kill ings -pse u -ðŁ¤ ª -un c -mar l -tan e -mck enna -sur fer -influ ences -free way -hack ney -mal aria -el and -te au -rema stered -Ø ± -raz or -gg y -cor ro -lak sh -fla ir -honest y -hoor ay -de pp -am c -wedne sdays -q a -ed its -- $ -se villa -dou bled -human ities -c cot -som os -r ine -af a -si oux -re construction -wel ding -th reads -am ish -encoura gement -po der -bo ck -bal m -p tions -stand up -accompli shments -guar ding -convic tion -ac ion -napo leon -depic ting -att ack -su i -wear able -âĸª ï¸ı -pot ter -esc ort -vis e -to ts -bo on -event profs -angu lar -womenshi storymonth -bar row -sch i -ac comp -ti k -l end -kensing ton -wol fe -st acked -cra shing -exhi bit -wing ed -sab rina -ma sa -k ms -alway s -et t -pla sma -counsel ing -pick les -nfl draft -mr s -inev itable -coura geous -staf ford -writers life -ho s -e j -gh yun -trade mark -adri an -influen cer -coron ation -ra ging -explo red -usa f -excep tion -eu x -tan ker -sw ami -pac ket -ðŁij¨ âĢį -f en -she en -a ero -j l -re gal -nw t -au ster -meh ta -char ge -a ste -b ate -inf eld -racec ourse -collap sed -fle ece -z il -al lie -alternati ves -geor ges -ðŁĵ į -quir ky -fc b -nat geo -philanthro py -bra i -every day -ðŁIJ ° -ach ers -ja an -fin es -q i -fisher man -distin ct -gri mes -nation alist -comm ence -ro wn -âĢ ³ -z ing -f ter -hr w -baro que -bl ender -kitt y -hoo ks -c ited -w anda -consen sus -reinde er -an and -supp ly -me ds -v n -ol ph -rat chet -shel don -secur ities -ë°© íĥ -cro m -mosqu ito -j eric -im mac -dimen sions -â ¤ -di ssi -sponge bob -dami en -steven son -jo anne -del ish -yi kes -than x -surve ys -postpon ed -alco holic -al ised -ðŁĻı ðŁı» -do ch -sen tim -mered ith -com pares -b ago -happy days -mo ss -ãħ ĭ -ne c -gn ment -frustr ated -comb in -ri v -ec lec -col lo -compli ment -actor slife -ct to -nic ar -op hon -apar the -man t -ja de -trol ley -optimi zation -eye on -eco logical -qui st -ep he -ॠĩ -cin co -appo ints -old school -c pr -behavi oral -min aj -:- ( -tag ging -ev al -jo aqu -ðŁĺ « -ha k -de me -jama ican -so s -hy att -hand book -libr arian -hanni bal -pump ing -ch om -f man -ga i -hu ll -respon ders -green ville -n us -vau gh -ðŁİī ðŁİī -ta xi -gold berg -man tra -te ase -forbi dden -metho dist -ati vity -* *** -ec t -mc gr -Ħ ëĭ -se b -amid st -disapp ear -thy ro -phili ps -er ina -v icious -stream er -million aire -ma p -str ick -hack athon -gh a -ed ic -mi ka -pe ck -ill i -anto ine -ar ca -op tic -ma ure -ðŁĩ¦ ðŁĩº -cla shes -man ly -âĺ ģ -al var -and res -me i -el m -ww ww -al tered -l te -ê¹ Ģ -mo jo -for rest -thal ai -non t -spee ches -acknow ledge -ign ite -x factor -ðŁ¥ Ĥ -mead ow -disru pt -debu ted -scrim mage -pharmaceu tical -fi dd -found ations -philosop her -et al -publi shers -bo ys -c ke -ru gged -opti mism -re be -phil harmon -nar cis -ral lies -lu is -go blue -fol ded -un acceptable -optim al -li sa -pol aro -+ . -en za -âĿ £ï¸ı -mon opoly -grace ful -dair y -du a -diffic ulty -judge ment -o si -mer sey -flu x -new found -ter ns -dimen sional -in vic -al ba -am it -abudha bi -alger ia -autom obile -the ad -lo tion -acceler ator -vac ant -iti on -lu f -al ic -pl l -bla zing -ba z -sen e -ðŁij ¼ -villa ins -direc tory -eis en -to ck -broch ure -ri pp -hb d -zayn malik -nic he -lo lol -certific ates -mor se -fac up -x ham -un wanted -im ports -carne gie -fan sign -mo u -r alph -destroy er -sw ing -trek king -cili ation -pit bull -g aps -ho well -defin itive -mc le -f ps -et z -bol ly -lyn n -gan o -at ure -fur suit -co il -na v -but ts -tro jans -eu re -en ko -sch umer -horri fic -install ment -br b -subur bs -a bel -vi r -de sh -cun ningham -ðŁIJ » -span n -sch we -ke mp -tr u -ste alth -qu es -le w -deli ghts -ko ch -hu mili -cr iti -il t -sp ells -mi ley -car ic -ðŁį ´ -lc fc -substitu te -oun g -? !! -af fir -predic table -class of -er r -cy press -chand ra -age ing -__ __ -ther land -don caster -el in -yo shi -sail ors -har ris -jo anna -niger ians -h ers -pla gue -pro cra -k no -can ton -busine s -un h -pra kash -c in -bow en -co ating -m als -be gging -smith son -ponti ac -sp ies -dam ian -pl ine -und ant -al ta -one ss -shame less -da q -bb m -wal es -stam pede -ser um -Ù Ĩ -cataly st -x n -ab sc -free zer -ch un -ari os -mc cre -fore head -he ars -damas cus -tac oma -ardu ino -encoun ters -stan ton -lg b -ab as -" .. -ke te -drac ula -ele m -g ne -zepp elin -la brador -pul p -op tional -or n -russi ans -san itation -hil ary -etsym ntt -pen alties -au st -ig ans -olympi an -medic aid -vers ace -va pe -re stra -pe ep -sexi est -st alls -di le -the a -punjab i -pupp y -tuesday motivation -ðŁĵ ļ -the flash -roc ket -mo dest -chihu ahu -on na -k sa -hur dles -ca ve -fail ures -sp lit -bo ho -gur l -disappo int -ho ward -nug get -fran z -stal ert -kaz akh -for getting -sch ri -ag ate -am at -eve rett -du et -veter inary -juli an -ch ills -bra ve -ghost busters -lan do -gre ets -profit able -d é -ti r -ze e -om en -pd x -gray son -har i -fix es -stab bing -swim mer -symb ols -compli ments -po se -func tioning -th nx -gi r -corpor ations -bar low -lo e -off season -distin ctive -marvel ous -nik on -enri que -ky u -ja ws -amo to -lom bar -travel blogger -fa h -ouri sm -tri stan -so e -ce ase -ðŁı ħ -z ac -mck enzie -taxpay ers -swim suit -bl o -les ley -kan sas -w ks -ki el -provo king -my les -str ing -kangar oo -galac tic -fif th -s ke -we ir -ll is -mat ory -ðŁĩ ¿ -un ci -re productive -roo ting -ti des -gad get -.... ...... -alex ander -bow ler -scre w -apo log -eri ka -wal ters -shet ty -lan e -ban ter -as ant -me so -v ain -" "" -us i -fer din -accomp lish -man sfield -bom bar -collabor ating -cla p -it ure -s da -smo ky -na k -im person -car la -com ra -bur gl -lo co -ti es -in hi -trac ey -se is -diss er -rr rr -dra y -prote ct -cor ona -hun ger -ck en -c eli -trou bled -predat ors -fic tional -shav ed -riche st -metab oli -ful ham -gro oming -mono chrome -wa sting -as co -ast e -ti sta -remedi es -ung soo -south end -perman ently -bu mble -procra stin -ident ical -practic ally -ma scul -su ke -assu red -val erie -devi ant -grizz lies -thi er -pur a -ne pal -not ts -bil ateral -spo il -car mel -cine matic -ph l -ni fty -ma o -hypo cri -la ser -pan try -mathemat ical -el isa -coordin ation -bel mont -a it -radi ant -bo iler -man g -f ag -cr c -h ams -br in -â¬ĩ ï¸ı -famil ia -âĿ £ -sab er -ru pert -gg an -rit z -mic h -sal ford -le vi -gra l -ðŁĴ ¤ -n ino -ce d -business man -ul tr -sim ply -compre ssion -pa ins -hal t -ë°©íĥ Ħ -landsc aping -n f -croo ked -er d -itt in -ddle ston -sur passed -ino a -da g -bl en -exten ding -at ing -al gae -ball er -u mar -snoo ker -col lu -flo wn -thu b -ridic ulously -ki sh -op le -di re -as ser -ari sto -sc iss -h ating -trou ble -syl via -suc cul -plo ts -sincere ly -al er -laure ate -br ack -att n -rif les -me to -collec tible -cu omo -conte stant -consist ency -ant z -rang es -abig ail -de b -mini ster -grow ers -an oo -hoo ver -dream er -nu cle -resear ch -mi y -sha hid -ma v -d honi -cin i -do j -hin dus -part ying -dal i -alon so -inform al -clark son -it ton -ki an -cit yo -mor i -la sted -as pen -libr ary -susp ici -qu at -den ial -fol der -ch ori -swee ping -eni x -ðŁį Ĥ -Ø Ń -nas car -handmade hour -mou l -heat wave -em er -exam ine -ib n -gr ind -po v -tion ist -m bo -she ila -integr ate -om es -take away -cer v -con nie -tic ket -ce led -bi en -visu ally -madagas car -sor ry -gu i -park run -tra its -la be -pois oning -à¥ Ģ -vi able -bohemi an -denti stry -bad os -spr outs -mask ed -te ddy -ðŁĺ · -sa f -sa as -ji ang -ti ght -spe aker -withdra wal -bc n -as signed -class rooms -fle ming -ðŁĴ « -super girl -tot als -table top -e books -horizon tal -cra z -flu sh -j ard -c dc -er son -ãħ ł -green wood -ni h -co x -ad a -lit re -go ing -v icky -cur ved -lou ie -gra ins -hy e -lon ge -reme dy -tra inee -san jay -super stars -ma ser -man u -s age -wh l -ðŁĺĤ ðŁĺŃ -ðŁijį ðŁı» -m sd -en z -rab hu -j oo -gh u -ac er -e po -resurrec tion -justice for -bl ended -mo da -avalan che -france sco -re spective -g s -ye ast -wel ch -devo tion -ge tin -athe ism -am ic -carol yn -lo c -ld nont -ave c -us da -le gged -bra very -b lower -cow boy -he h -sti ble -buff al -chann el -run chat -âĺķ ï¸ı -ide ology -best seller -y oo -pe anu -bon ne -fel ic -edi son -fr actu -naren dra -pp ets -seym our -ri viera -he ctor -necess arily -bi anca -soci eties -the best -w g -sent ences -win k -vacc ines -pal ooza -jam ming -as f -mp us -agre ements -ec k -ba c -hon ore -com pul -wild cat -im posed -yo ga -hud son -can celed -l ich -fu zzy -es que -ch uk -w vu -se k -fli pping -r hon -wi shed -wh a -cap ability -len ovo -ìĨĮëħ Ħëĭ -vi vo -tv d -nor a -sil k -pas adena -yo semite -valu ation -clo cks -u ber -mr c -dar kest -au bre -ss o -bell y -wrest lers -kill in -lou der -buck ley -ge el -ad on -un s -appe aling -ðŁij ¯ -semit ism -list ens -fit z -ãĥ³ ãĥ -ny lon -ar ty -seem ingly -hal a -su ited -et y -she ds -mu ffins -ap ric -um ents -u ta -jam mu -chelse afc -star z -yo ko -roo t -clean sing -di ar -pione ering -ihear tradio -dig iti -fin dyour -can o -ðŁĴ İ -z ol -spac ecraft -six ers -moi sturi -b ile -ti sts -hor ton -rang ing -colum bi -mete oro -senti ment -ep l -foo th -text book -drain age -r ly -sc ue -imran khan -ðŁĴ ¸ -margar ita -ed dy -predic ts -gamer gate -advis e -growth hacking -love you -ug and -v f -beng hazi -s later -ne wor -ch el -independence day -p np -cul len -hoo dies -num bered -brit t -t sa -kl tu -s ages -mom o -onep lus -col l -gu ts -w ta -mesm eri -enh ancing -chiro prac -j is -teen agers -m one -constell ation -sweep stakes -e ze -slovak ia -la ye -pear ce -wa ver -po gba -k ron -sur geons -mar x -ti d -gg a -desc end -p ours -upri sing -wal la -sab bath -bachel ore -mack in -k am -peter borough -hor a -ðŁĮŁ ðŁĮŁ -think big -r j -hy drau -sp al -univers it -ðŁı ī -mail online -league of -ten ants -w ally -lan ce -heav ens -dd r -bol ts -am ir -i phone -ci gar -en du -re i -el abor -r inging -john son -characteri stics -sal oon -algori thms -tal kin -m tn -di ve -region als -ff ice -hat i -deviant art -so tto -shir o -l ama -k we -f aded -por ting -tu mmy -est ates -buen os -ðŁ¦ ģ -beli ever -pen etr -dar n -sp ite -can opy -fashi oni -t illa -pet als -eli jah -bra wl -marty r -ë°©íĥĦ ìĨĮëħĦëĭ -mid town -eric h -d apper -sm town -me gam -ww w -le le -on s -cat fish -fir th -fossil friday -ball park -th aw -pot ent -illi e -cre ep -car p -so ap -gun dam -infe c -yy yyy -ठ¨ -z ag -rit t -calcu lator -bo ca -ok o -to ad -threat en -refin ed -olym pic -accompli shment -bacter ial -a ji -tat um -feli z -she ed -j at -th ic -jam al -ðĿ ĺ -lin a -ðŁIJ ¯ -jo king -yot po -pin ch -ak ron -her b -motiv ation -li a -ho stage -cre ek -gam ble -russ ell -patt i -fo tos -c pc -bro ken -back the -cla ys -u mm -stock ton -mat ernal -ü r -la kel -cent ury -be k -infe cted -ภ¡ -smack down -man ned -ta hoe -sm es -bas a -su la -augu sta -. * -rohing ya -gre ed -counsel or -silhou ette -gra vit -cla use -' - -bo bc -occa sions -now adays -dic tat -be ard -n ally -brigh test -kab ul -inc india -dhan ush -archae ological -che ape -mizz ou -d hi -ov ski -bax ter -asse mble -à ¢ -gi gi -ac am -wis ely -haz ard -north ampton -âľĪ ï¸ı -me th -bla sting -re unite -mu lus -ali zes -t read -mil a -ed ward -ko va -pe sto -ðŁij ¶ -vit z -hydrau lic -refurbi shed -mo tel -isab ella -hom me -sever ance -uph ol -mis erable -f ari -lat ter -ef er -crack ers -es l -ac io -yy j -in an -ec b -z ind -pan as -tru cking -re ed -sh aker -burge ss -em pire -ag nes -n ington -art works -fr s -ti le -bi ome -eu n -ch ong -americ ana -god father -go blin -i shi -! ). -temp ted -gen omics -mand ate -ck y -ðŁĴĻ ðŁĴĽ -som ali -br andy -in ven -spoke sperson -pc b -yu an -h g -fa z -starwar s -ro wan -blue grass -don g -d day -trin idad -er ton -ban ning -re tention -cu red -tober fest -re set -we is -deta ched -behindthe scenes -immun ity -ph a -bra y -ðŁij ½ -ran cho -ram say -est onia -nd tv -] . -cab aret -tar o -d v -show cases -plu m -ðŁij ¸ -son oma -pre pa -memor ab -e stu -drive way -u les -magn us -x r -nn n -much as -en ge -stre amed -fore stry -audio book -tro y -reck less -kil om -ru ler -ra k -proce ssion -i ons -po ole -noc tur -wh s -farm house -per a -par me -hypocri sy -s ics -v ant -cas k -holi stic -au st -Ð ¿ -in do -ðŁij© âĢį -di so -disp atch -ol sen -make it -en nis -cent re -ar range -ðŁĮ ¼ -sal ted -ea siest -f ate -reg atta -mo zz -ac an -sin i -g ically -ch ops -chick en -work in -ha gg -invol ve -wee ds -book day -wake up -ky r -michel in -fu ss -re juven -vac ancies -incar cer -m st -sc ents -sovere ign -kick er -à § -bo d -âĢĶ > -sa h -mob il -shrop shire -oph one -dress er -mis suni -hep burn -i mo -foli age -diagno stic -as san -cycl ing -guil t -c sa -puertor ico -win elover -wake field -do ggy -k he -pa pp -co g -al lot -cu ck -poe tic -mi o -re vit -mag ician -ç ¥ -ant enna -west wood -mber g -lux e -oat meal -Ø ¬ -te at -ffe e -sear ches -l ly -plu to -el on -let tering -inno cence -fa i -ann on -telang ana -ma it -neu ral -can ni -ar oma -a stor -fe x -co cac -mon etary -f ent -un sure -' @ -indi rec -teh ran -isol ation -li bs -make up -merce des -ff y -he tero -de o -sco m -cur sed -veteran sday -franken stein -shre ws -de co -ge ese -lefto ver -ha did -vari able -acade mics -carol in -under going -vari ation -na h -ssi er -gamer sunite -pur suing -emer ged -ll ers -control ling -ro aring -mete or -vol t -daw gs -be aver -is life -bathro oms -aci onal -pre vent -lake district -in als -y ani -gra bbing -sac ks -le z -sw ay -k ool -time s -klo pp -la de -con cord -resul ted -revi ve -recon ciliation -ol and -az z -gir o -mand arin -de en -nutriti onal -is coming -van i -aw www -der ived -love your -stop the -shou ting -nov ak -ðŁĻĮ ðŁı¾ -lo af -displa ying -sunday with -ma guire -ch eri -ðŁı Ł -re match -qu ic -Ú © -y in -ðŁĺ ¹ -ili ve -z ip -our ke -down loads -sw at -missi ss -care rs -t ment -proper ty -hahahaha haha -gi bbs -sur rey -ar ise -tic ism -sti a -ir ling -fro g -co se -bas sist -fore ig -lea u -pil lows -hol la -eli e -disclo sure -peanu ts -inte ch -ww c -plun ge -trium ph -cor i -sli ppers -ðŁĻı ðŁĻı -neutr ality -ma re -hair y -gang ster -hu mming -cust ard -mer lin -ale a -s by -dam p -mo han -ver bal -j st -gu tted -b jor -un finished -ðŁĩ¯ðŁĩ µ -un happy -âļ« ï¸ı -by pass -at su -fis cher -sa v -afric ans -re use -mid way -demo lished -ger rard -her cules -Ä Ł -medic ines -cl icking -sur round -jo ong -wav ing -tri bes -wet lands -offici el -argu ing -l le -do va -su zy -club house -ne gro -ob tain -ga o -gl ance -assi st -ch os -ãĤ ¢ -âĺ ķ -adri d -occur s -st ans -par don -livel i -emplo yed -re visit -ff xiv -bb le -ne aring -min er -ðŁĺ ¹ -giov anni -up to -mar vell -mar se -to wels -cb n -engine ered -y elling -spart an -si ans -ðŁĻĮ ðŁı¼ -se v -coyo te -sta di -t cm -app en -shenan igans -open access -so aked -ma squ -le vine -stro kes -l k -aparthe id -hipho p -char don -may may -ha asan -stri pped -fr o -scri ption -f ton -h f -pri sons -marsh al -ķ ãĤ -an cho -com promise -classi fication -buzz feed -bblo ggers -deser ving -) / -s way -ob o -camp ers -poder nfamily -p oured -bri e -squir rels -se ize -: # -le k -ti mb -st acy -nas daq -repe atedly -br at -mi ghty -competit or -mah one -de si -o ke -bm w -shi e -f cb -cheape st -minim alist -par amount -n ate -har as -insan ity -lat eral -ment ality -mo zam -ta pped -yad av -u sp -b way -the od -bil t -ra ids -em press -adap ted -pat ron -nut shell -ag ra -be aded -sundaywith marsha -vi king -proce ed -main tained -thinkbig sundaywithmarsha -sn es -mus ica -to wer -ch ab -bo k -sm t -insul t -harve sting -windo w -ru ther -be ige -dec al -indic ate -ma iling -ri ft -po le -ander son -ch oral -sp ride -l ili -ev elyn -imrankhan pti -.... " -ke red -un dp -water falls -se ars -le mans -world series -ri el -ani e -app ar -score rs -lam p -a than -phys icians -qu inoa -refu sing -vu itton -unle ash -s la -pat i -shou ts -inten tions -fo amed -europe an -neighbor hoods -me er -man son -du h -br at -con es -bow l -kazakh stan -ठ¿ -in appropriate -del hi -ketch up -ful ton -s ys -consul t -gar field -to go -f ml -f led -b ds -facilit ate -ree bok -selfi e -elev ate -activ ate -bi ble -ca wx -b ys -cam ille -sy ou -sk ool -her t -w bc -ple dges -recor der -po sh -ac re -so aking -mat il -v sco -shoot ings -pla r -e con -ðŁĻĮ ðŁı» -rashi d -u bi -ðŁ¤ ¤ -sw inging -wi pe -rap tor -m su -music video -dur ham -at tic -apar ty -fe tus -activ ation -aa z -motiv ate -ðŁĴķ ðŁĴķðŁĴķ -j al -ठ® -ag on -sche er -stal ker -fo ster -az zo -tele gram -vi gor -s laugh -screen shots -entrepre neu -kri stin -inten tion -ch illi -fr action -don a -ge a -tc u -s ite -la k -em il -d nt -bor o -wil kinson -re cu -ato day -t anya -bl anco -cd n -brilli antly -g cc -ac c -evacu ated -ther ine -den ny -cait lin -she pard -pou ch -hand held -sou theastern -ha a -à ´ -re solutions -led ger -sr in -r ar -shat tered -chim ney -im with -mete or -hand led -ra ke -town send -en han -shi py -duc t -tw x -inflam matory -war hammer -theat rical -gro s -sk ar -sco tty -ni el -tit o -tin i -conne ction -_ . -goldeng lobes -sha q -ðŁı ³ï¸ı -hall way -fron ts -effec tiveness -gla ston -d hs -ex pi -to h -c pl -sc s -re o -ha g -resemb lance -hor an -abu sive -qu er -virtu e -cho lester -a q -shan e -m ce -carri ers -di stress -re wind - ¡ -voo doo -int act -ann o -ðŁĺ ¤ -pi led -adi a -ãĥ ³ -en ow -di gs -light ly -goo fy -turb ine -governor s -con te -re open -pa h -i ve -cra fting -swee ps -jo di -an de -zu cker -kaw aii -o ko -v ai -out line -kri sti -ts n -insp o -qu int -fil thy -lyn ne -listen ers -depar ting -or d -t weed -, & -ale k -sel fish -nor ther -recogni zes -i ps -be s -a ed -w ills -pe at -surround ings -mon uments -ais le -be cker -la v -quant ity -v ah -helicop ters -tu cked -alv arez -sha pe -o bey -ad diti -road side -m ite -bl ers -ep age -j au -ignor ant -b ins -lu lu -x o -c fo -ee eee -apprentice ship -shef fiel -to i -ho k -faken ews -deplo y -aid an -husk ers -ãĢ İ -west brook -mi ster -confi gur -car r -fic a -proceed ings -ha w -ste ak -mur derer -pay day -a jo -p vc -don ates -bi af -nom nom -be it -k ali -x rp -ahmed abad -se mic -che y -x tra -an twer -head lining -squ ares -roun ded -flu ore -bol d -disa sters -am oo -gener ic -cran es -brief ly -gi g -auster ity -anticip ation -for ti -treas urer -cann y -ce cil -dete cted -check list -ภ§ -pam ela -bar bados -an field -hear ty -tx lege -peren ni -arro g -ing ram -âĹ ı -ty ne -spo on -r ation -am ba -m be -cam el -h hs -york shire -reflec tive -fre aks -to k -ju do -partic les -du bs -ban jo -accred itation -prover bs -over dose -inte gral -gu ang -mc s -super car -af b -al vin -ail s -x tre -st aging -tw ent -rabb its -mar o -inste m -dol l -cr ay -sant ana -ble ach -mini ons -che ap -man t -di vers -catal onia -lo is -mat ri -cou gar -kay ak -e gre -p so -a ia -å ® -char lton -tr acked -sc ari -pe tt -f wd -x in -gra vel -br ic -bigg boss -ar den -hu gging -pal ms -st v -li mb -the movie -handic ap -ri me -z ai -stu b -indi a -lithu ania -rhy th -p ita -maced onia -high ered -brid get -schwar z -ske let -hi kes -ant arctic -c ps -mash up -Ð ° -n ell -chand ra -he ir -an us -sher idan -mi mi -muse u -bec ca -an ir -bar rie -dioce se -compar able -ðŁı³ï¸ı âĢį -yuk on -me p -hor mon -mer ic -al f -con quered -christ church -ðŁĴĻ ðŁĴĻ -hazard ous -poo h -cont ing -retro spective -par ame -na ir -con sor -ho tra -astoni shing -cater pillar -u man -ti sm -t vs -serv ic -croy don -mor ales -c g -cu m -te ur -scan ada -s all -magno lia -el ise -th our -à® ¿ -ag omez -phel ps -ë°©íĥĦìĨĮëħĦëĭ ¨ -wh os -weav ing -si sd -pro poses -cro ws -pre sale -econom ies -bernar do -sha hid -air show -mc cann -hor ticul -nr l -du el -mongo lia -tou lou -requi rement -struc tured -ed i -o lives -he a -cu ter -Ð º -enthusi ast -harri et -domin ion -sub mer -ðŁį ĥ -sa ab -nes burg -mo ff -def ended -bur t -rewar ded -gold man -op tics -khali d -house holds -buc kets -ce cil -che ss -substan tial -ef l -oper ation -evalu ate -st n -rece ssion -l ll -tom as -tru ths -ak bar -s words -p act -embarra ss -ha o -ay urve -scrip ture -ny cc -op t -di ameter -sc ented -organi zers -re lat -ha e -dream ers -de se -ðŁĮ » -restric ted -n ale -r hp -dol an -mun ster -ha ired -consult ants -jo ints -hu mil -d ill -relent less -t é -af il -ut ilities -japan ese -condem n -pet ite -colli de -q f -peach es -cou rier -l ore -âĺİ ï¸ı -reli ability -ch uk -ðŁĻ ĥ -stu res -ge ther -ho stel -bi er -- _- -â ĩ -e ze -ta ilo -di ent -blu ff -chu ffed -pil ip -mon arch -e em -bu chan -b ick -op au -ku ps -ภ¢ -pist ons -sp ins -m and -ce st -bur ne -v ile -cher ries -bec kett -need les -pan ch -ë Ĥ -haha h -trou bles -insi sts -do you -g mc -mor tar -deleg ate -in n -g anda -sin atra -ठ¤ -spee ding -pu pil -pre mises -ali gnment -pi kach -as us -j alan -Ø µ -lime stone -fol kl -parme san -ce il -mo y -shawn mendes -ac up -hu st -ot es -med ina -ma di -gta v -censor ship -ar g -swe eney -sy kes -col o -foot steps -cann ed -adv ance -gta online -healthy living -ðŁį ¾ -a ig -p ality -oc s -he brew -im minent -berk shire -jeremi ah -out going -bak er -entr ata -ma ids -gro ves -bo c -a del -m fw -con science -arm ys -nut ella -conte stalert -novel ist -la h -ban ker -marque z -ðŁı ¡ -to ff -out age -gr p -ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃ -musc le -du dley -nvi dia -mi di -m uni -ess ays -dat ac -car ter -ภ£ -t ans -i ves -public ations -al er -ok wx -il u -cu tt -har p -out law -luther an -br ill -bo lic -do well -green land -be sties -path i -pay ton -gue st -har den -ðŁ¤ © -ann ed -evacu ation -po ised -mc der -b han -o i -envel ope -ci d -ca vi -ta pas -book review -grey hound -âĻ ª -fe ud -lun gs -for te -rai der -ff er -oni x -dep end -yn wa -rel ating -de vs -ðŁĴ IJ -acqui res -d ha -j yo -priv ati -can ine -k b -cra b -sar din -imag ining -k j -em por -down hill -ne z -ta eyeon -nick imin -gb p -à µ -w ap -sec co -ma shed -ðŁĴ¥ ðŁĴ¥ -augu stine -diss ol -dic tator -â ĵ -vi per -ed fringe -vau x -hard work -book let -no x -chi ff -ðŁĴ ¨ -observ ations -xbox one -u sher -ke er -lu p -dal las -cal gary -ma dra -di ous -k bs -wood ward -hero ine -lu mber -sea world -o ws -mc ke -maver ick -gu la -cross roads -fan g -s ade -nik ol -chee tah -me c -pp g -er ick -ðŁİ µ -tox ic -bj j -viol a -sp ire -ch ino -tra vis -institu tional -ha as -low ry -w ac -ea e -hu mid -mp ton -ru ck -je w -c ine -zim mer -se f -bhar at -fre es -aam ir -ðŁĴ ħ -z inc -wan e -multi player -royal wedding -e el -preci pit -qu ery -kimber ly -isa bel -ful fill -ig an -vau l -pan e -sc y -dig it -gun n -u tah -dog day -fi on -xia omi -da c -el ast -cha vez -ro blo -g ine -ten th -ab h -ke to -hur dle -na dia -memorab ilia -ha bs -qu an -h w -hv ac -pix ar -ec cle -kram er -accu ses -ðŁĴļ ðŁĴļ -per se -mean time -wa hl -atle tico -âĢ¢âĢ¢ âĢ¢âĢ¢ -ott oman -no vo -k us -conne cted -tru sts -d mv -spen cer -rahu lg -do ve -sto kes -bolog na -enthusi asts -à ª -rockstar games -ted cruz -du ras -s acked -late x -immer sive -cer t -lu cin -princi pals -fa res -sa ils -far n -am ent -saf fron -quent in -check point -fer ris -ex cur -ðŁijī ðŁı¼ -bai ley -se h -ter re -mad am -s band -wan derers -cumber batch -yy c -digit ally -blackandwhite photography -roll in -moroc can -ðŁĮ ħ -din ner -d well -to om -m ye -ez ra -cp fc -war hol -me er -jon ah -no aa -s gate -so on -secu lar -g ating -ti o -dri ver -si ssy -assan ge -ta th -ed mund -bobc ats -ra ji -po stage -stu ds -m gm -kat o -edin burgh -meet the -shir t -fa a -mens fashion -sp reads -wi m -car ts -phoe be -j ars -bot swana -Ù Ĥ -ed war -sk ar -ri ve -gu sty -c tv -ferdin and -su therland -nickimin aj -k v -si us -bee ch -re z -desi res -on ial -camp o -quar ry -lor raine -gil more -ig gy -µ ï¸ı -ho pping -avi z -ðŁĮ º -uni sex -dedic ate -att itudes -ste er -jun kie -rail way -y b -whi sper -key an -k us -ju g -di x -a ins -sum mon -ov ich -sy ed -her ald -ma ison -me ded -wild flower -main land -ri sky -ru kh -over looked -ki c -destro ys -nam an -ki p -z ano -champion sleague -ban dit -quin cy -smi le -cal vin -open ings -ta pp -ol ulu -spec tro -accred ited -ap k -pra ised -bar nett -pol len -premi ered -selen agomez -tou red -screen ings -uu u -mis o -en se -adam lambert -guel ph -har yana -hu tto -le ar -l tc -po ached -brex it -æ Ŀ -tt c -pa vement -mon gers -ro e -ad ers -ling ton -particip ant -ca red -ga il -y ates -lan tic -dash board -jo o -feli pe -ssi onist -bu m -s end -a eri -thu gs -luci fer -a he -dete ctor -fil ly -gas oline -ham per -hump day -the ta -the band -fore casts -o hhh -lo bb -hol l -cp u -az u -ad ar -hai ley -bu b -car t -quo ted -an archy -pan cre -twit art -al den -st ash -the less -or ni -belie bers -mor mon -partic le -avi ation -⬠Ĩ -webcam toy -sad dened -cru is -ham let -n ct -roll ins -marque e -saw yer -reli ance -a ura -di ec -soo thing -sig nings -ak is -à ³ -at kins -aer op -ðŁĮ ¿ -y ab -sh ari -con nol -du bbed -manufac ture -convin cing -feelthe bern -ra u -pu lit -on ec -gem stone -ur ging -bag u -ga h -aci ds -fi anc -zodi ac -sn oop -her rera -initi ated -ven ge -profess ors -pro di -stron ger -e mission -bb a -hal le -ta pp -haw an -wh im -compe ted -myr tle -ir port -cold play -ach e -ske p -m son -ss ic -calli graphy -swim mers -me y -pp c -thri ft -po c -re places -commu ter -âģ¦ âģ¦@ -go ers -lo gue -para dig -bas kets -sensiti vity -joh an -atl antis -& & -suit case -anxi ous -l h -str i -gal loway -stre ad -war den -gr ounded -ffici ency -li feat -reli c -disgu ise -island ers -f cofficial -classical music -b mc -en field -bi que -oak ley -bat man -sla ying -ner ves -mul tit -calci um -projec tor -scott sdale -ant ino -gri ps -kim mel -des mond -prote stors -hi atus -metaboli sm -conclu ded -press er -ti pping -sli de -e to -hun ting -aus open -ri k -pp ery -innov ators -pitch ers -ag ger -fun gi -z ad -proli fic -rockn roll -bl ames -ct ar -stam ford -q ad -mozz arella -insan ely -den ver -ph ouse -nom ad -ï ¿ -s ris -pro du -hen ley -pag an -am trak -ru bi -in cl -tu tor -sco tia -wo es -sing apo -fun nel -turn bull -know ledge -gri mm -real madrid -we are -missi les -con sol -emo jis -sne ak -smi ths -ru iz -br ou -i el -ha ver -ðŁĮ ļ -kin gof -basil ica -circul ation -prin ters -ta pping -ri dley -dra gged -ha j -writ er -fundament als -personal ities -me tre -stereo types -bur le -best of -n ffc -ha th -mini stries -a ali -trac ing -pav ed -ł ï¸ı -g ic -insp ire -tu g -ha re -repe ated -ex pon -lol li -rho de -pre cin -install ations -instag ram -az ar -i es -sole ly -du kes -mission ary -van guard -fursuit friday -on d -pol ari -ma st -har an -jos é -jack ed -ec oun -al ities -ne ph -ra vel -moder ated -sco w -s fb -uru guay -as o -ni g -au du -p ints -lat ina -ben z -m itting -char ted -mat ology -cit ro -biop ic -ðŁij Ń -djo kovic -fox y -agu il -so to -an ada -sin king -sc rap -hair s -bethan y -fact friday -ðŁIJ IJ -unlea shed -) ( -contra dic -ram on -coast line -y ong -sn sd -li gan -p ome -mit age -ge tt -wat i -ri sk -so aring -bru sh -f pl -av an -å Ĩ -lar son -sh ear -mul til -blu r -multi media -chun ky -par i -n ani -weir d -cholester ol -char les -dream ed -tan ning -puzz les -fr am -hand ball -ch ag -beli ze -al u -bang s -Ñ Ħ -detec tives -mc g -ish q -bo thered -saf c -mp ing -ten eri -g ays -sail or -an gi -mul ticul -gue ssed -ros é -high ways -bro om -chatt anoo -- ' -see ker -on ed -at f -lu c -> < -bar i -per cep -jewel ry -as ph -sor row -sl ing -mam moth -jac kie -ë § -wilt shire -sa o -can cell -im paired -tor ial -bre ed -guy en -jud ice -tit le -pro spective -applic ants -ðŁį Ĭ -epis cop -e id -b yo -stock ings -ðŁĴĥ ðŁĴĥ -ll p -sna g -keep it -l ough -ol son -matur ity -!! !" -cop ter -i sha -bl i -wil mington -tr youts -th ai -ðŁ¥ ³ -pe bble -kra ft -f p - º -ssi vely -li vin -contest ants -tex tures -jo an -h dr -film festival -prov ence -wi do -op end -c si -sto wn -cro ati -ad just -host ile -analy sts -il an -cu ppa -bru m -newfound land -good win -me tt -mall orca -plu gs -bu k -bb hutto -wrest le -sa ire -sho pped -for za -le head -vi vo -ba st -ro xy -reg is -hard working -hon olulu -desp air -young sters -ni g -impro mp -roll tide -de emed -tre ason -ru shed -for ged -ff f -pikach u -bri ggs -do it -ac cent -la us -gla ze -compet ent -a ho -photo g -mid field -le go -har vard -min orities -re illy -slic ed -once upon -initi ally -financi ally -landscape photography -har dro -qu o -mm ers -par kinson -smu gg -read iness -bru tally -glou cester -mp ed -bbhutto zardari -mur der -ye d -dat aviz -sr t -dow ning -bi ans -m ü -fle ck -fli pped -s ly -brilli ance -ri m -k um -bubb a -ko i -knit ted -sor g -ma is -ðŁĮ ² -ti ss -su stain -sen su -ak han -zi est -exam ines -chardon nay -user name -short list -re bs -on o -dar ing -hard wood -che que -righte ous -light ening -dir k -shra dd -du ra -down stairs -sh al -ami gos -ru ff -s law -ri es -red nation -man us -ðŁĩ§ ðŁĩ· -distin ction -u bun -dur an -mi gra -thi ans -la ver -domest ic -k x -jaz zy -justi fy -belong ing -insul ation -color stv -drun ken -chann eling -qu and -xi ii -enligh ten -kan o -fati ma -teen choice -terri fied -p ba -as ley -met museum -dun e -pack er -ki o -ðŁĴľ ðŁĴľ -bo iler -fas cism -ar mored -back grounds -in mates -embarra ssed -defin es -th d -we go -silic one -lo on -el ding -bor rowed -he mp -ak sh -kaw asaki -br y -de af -kill er -dispo sal -ðŁĩ ° -glaston bury -un covered -o xide -po ff -d ant -k j -ku ro -dri zzle -peop les -fe e -pro pri -dd lovato -pi ggy -ot is -aller gies -u bis -pengu in -ser a -vi z -prosp erous -ici des -tornad oes -sene gal -web cast -sto red -enchan ted -bb cone -bay area -entrepreneu rial -rednation rising -experim enting -ang an -lot to -they re -por e -er p -seren e -east wood -bro kers -bar ge -stal lion -timber lake -tailo red -dy stop -b ate -lat ors -di xit -bran son -dynam o -ky lie -shame ful -bt wn -spring time -mix ture -s ounded -lu ton -dad es -mal a -op ra -en ic -rahulg andhi -se wer -~~ ~~ -ky u -nor theastern -ca er -bc u -nir vana -kitch ens -ous y -al m -river dale -hid den -fl int -sp d -pat rons -katy perry -au gh -exhib itions -sm c -shu ts -at ore -da in -some thing -ber th -bo g -por ter -gen to -con cussion -ang lic -ro we -gr illing -scar lett -master ing -mor nin -comm ented -si me -si zing -christ y -ce os -st m -at ry -tari ffs -vac ation -pre judice -p su -paren tal -far age -can a -cap com -koso vo -you re -men stru -stal in -grape fruit -br an -che sa -dav en -exc el -!! ) -๠Į -distribu tor -ce a -bride sma -millenni al -wa in -ob serving -mis ery -plan etary -expo sing -bra ised -comp ton -don gha -q l -spring steen -th ul -syl ve -cab o -pal ad -niel sen -gaz ing -ba ja -r oud -orchi ds -johan nesburg -se man -d ji -oper ative -affe ction -eclec tic -at c -mut ant -aw x -nic e -mel bourne -indu lg -tu lip -dias pora -wel p -big gie -mississ auga -retri ever -or an -tam my -c ta -hipp o -seas oned -ger mans -eng v -marvell ous -im f -rela ys -mon tan -maur iti -me ister -as surance -reig ning -su fficient -han e -no thing -pos se -nav y -in love -brigh ton -en qu -ch ung -sweat y -es c -cal ed -man s -nicar agua -sl ices -mo cha -washington post -bb n -dam ned -grow ing -en burg -lo an -me s -wh oops -believ ers -spi el -vo daf -l at -s led -cricke ter -brown e -golf ers -bar ra -wat chers -lu igi -sw amy -mom s -pit ched -san tor -cr s -si re -sc amp -bo de -ste war -jon ny -ent ity -pac qui -mind ful -min india -bear ded -temp t -scorpi on -eat on -authori zed -ar to -s vp -op athy -cch ini -house music -disney world -âĢĶ @ -pro pose -di y -expen se -ten g -pupp ets -sm el -d aca -per ry -fin n -boo sting -lefto vers -cou gs -satell ites -man y -az e -g ong -fi e -metho do -fer ries -ðŁ¤Ķ ðŁ¤Ķ -explore rs -load er -attrac ted -il ton -godd amn -pi azza -doc tr -sav ing -paragra ph -visu alization -may ors -work flow -ack les -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -ठ¸ -twer k -clu t -lo ver -te ases -si an -o te -deter ior -accor d -l fw -swar ovski -nat al -tra ps -k ina -analy ze -laye red -bever ages -un it -ran som -pe shaw -dest ined -astro logy -si pping -miley cyrus -cam ino -marshmal low -bli ss -out back -fa q -int oler -humil ity -po ppin -hallo ween -mon tene -op hy -nu n -tattoo ed -a as -ðŁĮ ³ -dale y -qual ity -du sa -fisher men -swi f -ter rac -st au -le in -trol ling -ship ment -garden er -march madness -head band -gr t -bur nett -w and -!!!! !!!!! -gh e -du x -hu d -war ner -ðŁĩ ¦ -ex ile -rescu e -rat a -d han -duc ati -dro wn -bl ends -spi e -alli gator -simul taneously -broo ke -u ke -k har -comm union -ri ka -ford fc -chin atown -you rown -me y -can al -syste matic -de pri -ox ford -an il -w ut -equ ation -be z -fle ur -the good -lang ley -ad ity -ed ith -al fie -о ÑĤ -en cry -br ill -ex emp -ce sar -mb ling -ab ri -sc icom -j ing -school ing -mi ka -mechan isms -impromp tu -rhe a -moo re -crime a -be sto -wri ght -el ders -ro ds -kam al -folkl ore -be et -mini on -reli eve -thr o -team usa -pas cal -made with -boli via -itt i -free bies -desi red -best selling -l iness -la den -ke ane -mi sts -hipp ie -atta chment -@ / -se w -flan agan -âĿĹ ï¸ı -supre mac -stl cards -si as -q u -rh ys -ste ep -val leys -v w -pav ing -disp at -al ison -por te -id u -new sc -soc ket -mo s -co star -re vo -prote ins -stanley cup -m cal -ear ring -se cs -mc lean -cap ric -nick elo -ad en -v c -shou se -adap tive -maxi mize -entertain er -pro se -gri ffi -six teen -lam ar -mi rage -saudi arabia -awe ather -ru st -in filtr -fashion week -ðŁĺĬðŁĺĬ ðŁĺĬ -selec tive -bubb le -a den -fen nel -deci sive -m ta -mock ing -mb les -st amp -mu le -bernar do -gr in -po tt -j ingle -vet tel -colom bian -cam o -motivation monday -ba han -p ly -dh ary -k ami -x men -sleep er -gar a -my sti -confi dential -conflic ts -p neu -ce s -insur tech -clean se -me rely -va is -tu x -the great -shar on -ma j -hol a -eco systems -aj ay -aa j -hu sh -har mon -backto school -wiki leaks -reflec ted -ðŁĺ ĵ -commemor ating -ac et -buck ingham -messi ah -tu ous -hor net -to be -d q -he ine -mi g -pl ate -nichol son -sp ie -cumber land -nor mal -pho bia -happy halloween -city fc -mc el -gilli an -ke to -lu de -de mise -su ga -str ate -mcgr ath -visit scotland -foo led -cb r -gc se -col ori -po td -missuni verse -fin ances -ma poli -for ks -Ø ´ -cann on -medic inal -ðŁĹ ĵ -kh o -wre ck -pan to -bag el -gu ll -syndic ate -ic y -pr c -ki en -zi ka -ti sh -pe ta -c co -li za -ch ut -ex traction -el g -gl i -fu eled -pos it -respec tively -leice ster -br ink -vulner ability -im ported -e sha -ðŁ¦ ħ -r ural -re ll -gam ing -atlan tic -aband on -no ah -re solved -pro state -aller gic -ps d -âĺ ¹ -dun geon -fang irl -illumin ated -m hs -white sox -d ently -ck o -endor se -over ly -dazz ling -prior iti -night life -ut il -be have -flam en -east bound -ðŁĴ Ł -ilove you -gov uk -mozam bique -alle gi -dr i -testim onial -ath s -ì§ Ģ -mm y -shab by -pro secco -friend ships -cal am -dam ages -off set -jura ssic -jun o -arre ll -ðŁĴ © -interven tions -dare devil -car ver -run away -ran e -truste es -ha ute -dep ths -ðŁİ Ń -me in -sacrific es -con cier -ne sting -i zzy -me tam -ilove my -ur ine -du lu -mal hotra -ve ins -night ly -co at -an di -he witt -lon el -ci ble -wr ite -jen nie -sant ac -ĸ ï¸ı -str ato -singapo re -sop rano -kri sten -cheer ful -flee twood -fa iri -m eli -wa st -tur nt -sfor sale -sc rolling -angel ina -ren dition -jeric ho -nick y -or b -fla vo -patri ot -ash eville -sick ness -re fund -aggre ssion -b pl -ãĥ ĥ -elu sive -thi story -hang er -bu ffs -vil las -at kinson -sp h -ja it -decl ined -wo k -supre macy -oo tball -ey ang -ðŁİ ĵ -s ford -ath i -consu me -road ster -e so -u pro -reci pe -au f -uc i -ar on -oo oh -cs go -re ich -mc d -min ute -ladi es -pun k -rut gers -mee k -ariz on -ta j -land lord -de gra -autu mn -lyn x -us f -b hi -fairy tale -dongha e -bet sy -explo ded -chen nai -op a -pro tag -br ant -ðŁĵ °: -g f -pal li -ðŁı¼ âĢįâĻĢï¸ı -su t -ill ini -colum nist -shir tless -de centr -sear ched -ec or -bu ggy -s ack -ðŁĺĤ ðŁĺŃ -de t -ther i -or naments -bring back -to v -quarter finals -ic he -con stra -gi er -buchan an -vi x -kay aking -mu stread -swal low -mel b -sc af -op al -may oral -har at -ðŁ¦ ĭ -schedu les -id f -ha gue -ro z -a ah -d mc -du plic -ca che -orph an -frac ture -rec on -ch av -bun nies -al ain -mustaf a -ðŁİ Ļ -vac ations -dynam ite -tex ted -broad caster -ðŁĴ £ -ste amed -rock er -di etary -luxury travel -inaugur ated -sa wards -vaugh n -lincoln shire -click ed -kra ja -f anc -remo ves -layo ffs -mc far -bre eds -win nie -jon ghyun -incen tive -vari ations -pat ton -atur day -persist ent -pr un -pi ers -dal es -æ ĸ -breast feeding -r ance -ta wa -Ĥ âĸ -mur doch -cap tive -thi stle -nic a -commod ity -cou ldnt -board walk -graci ous -practiti oners -n gc -scru m -ner o -camoufla ge -col on -he i -phys icist -saturday morning -ten er -si won -colum ns -bru ne -y vr -ba ir -reti res -hal am -cab er -shaz am -min u -cas cade -milk shake -gri d -d ren -vin cent -so dium -plat ter -cheer leader -chen ko -y ak -elimin ated -ty po -y man -re think -âĿ Ĺ -ts ville -bernardo kath -ex tr -ðŁĺģ ðŁĺģðŁĺģ -ta o -re per -mo ths -em powered -c iting -transpor ted -mon ks -san at -cle ars -bachelore tte -camp bell -racha el -har le -hand ler -climb s -inter ference -rele ase -sh and -r bs -hr h -ãģ ª -val le -r é -sli me -w akes -chu bby -slo an -el ves -ath en -attor neys -micro scope -ston er -sc aling -o be -c out -se man -mid week -bal sam -ðŁĺį âĿ¤ -ti ful -v ish -lo tta -ri pping -re mn -ti re -le ap -ha vent -la by -hi mach -whisp ers -we in -ðŁİ ¸ -wild flowers -se le -u cc -li ability -az ine -sw ings -k ya -ta ir -re main -e do -flo ps -poc ket -grand ad -exam iner -gr is -ffe ct -ðŁijĬ ðŁı» -stud ded -heart beat -de acon -firm ly -infec tious -ste f -out lines -le asing -cla ws -sen se -tab s -hoo t -mo sul -spa wn -co a -hog warts -ve in -alban ia -manu el -b ino -vaux hall -scot land -go bucks -mat ty -phy sio -tor ino -const able -investig ated -s lower -mistak en -bay er -wild fires -vo ic -x on -time to -chas sis -bar ric -pi on -bald head -woo k -regi str -dra fts -b hs -li gue -l ick -staf fordshire -baf ta -dar ry -je anne -ven ding -cor p -⼠³ï¸ı -kid dos -fen way -ca o -west bound -ðŁĺ Ļ -dv r -quick er -bla h -goo die -ðŁĴĭ ðŁĴĭ -vo x -esp er -fac ade -cor relation -red bull -rou p -decl ining -chi ve -mc gee -tur o -in der -f eller -fu g -il ysm -mar di -peshaw ar -ki eran -ine ma -meat balls -pe ck -depre ssing -sen sing -gi z -dd ington -spring watch -ro aming -yellow stone -horse shoe -am man -week day -ol or -ðŁ¥ ° -boo sts -spr int -scar ves -je e -bee tro -cl an -all the -ìĦ ¸ë -enlighten ment -ado be -re generation -? @ -cont ag -yach ts -to u -mor a -en voy -r ani -go li -dhanush kraja -wood working -streng ths -se di -disc s -ar ina -sc on -lit e -ano ther -ðŁ¥ Ĭ -ye men -gu ern -sav vy -lo yed -biom ed -heart break -comra des -milli e -pat ch -un f -jar vis -bl aming -commemor ation -ge y -å ¥ -cardio vascular -alig ned -docu ment -. ? -aesthe tics -em u -the irs -le h -ps ic -si f -pl ateau -ex pend -domin ating -rob es -mauriti us -excep tionally -hom er -discover ies -bra un -ten nant -insul in -ðŁİ ® -car bs -te as -? !" -zi e -franco is -brow sing -th ol -cla rence -hel per -ob tained -cas sie -le es -! , -pome gran -hu bs -presti ge -] [ -mach er -bott led -pun ch -pi pe -o ch -gall ons -deliver ies -u ra -un day -mon de -depic ts -re gency -outra geous -khal ed -car o -he arti -za g -develop mental -over coming -stati stical -flavo red -for ds -cre atives -lau rence -di as -sun screen -in ked -pre acher -n ul -impac ting -auti stic -âļ Ķï¸ı -o ss -pel icans -cele ste -v b -ru mp -mc gra -fair fax -hu mor -bbc news -row ling -cal der -seam less -ag ne -p ti -mix ed -t shirts -mer ci -b tob -women instem -genealo gy -pre ven -l our -cra dle -gi use -Ð ¾ -chron o -fair ness -chocol ate -tor y -as da -pre scott -stret ched -al man -u il -re charge -in tre -ob st -hosp ital -hay ward -teneri fe -fried man -vap ing -confe ssions -ye ah -bal li -luck now -cor pse -sculp tor -amp ton -t pp -indic ates -sur plus -tru man -ðĿ Ļ -sin ha -in vo -sovere ign -ke v -establi shing -engra ved -assu ming -ðŁı ģ -sou za -fab i -ton ed -oun ge -del oit -dow ney -no ble -om or -car tridge -ðŁı IJ -u hur -hol loway -succe sses -r sa -âĦ ¢ -ma zz -tw d -disc ourse -. < -y at -satis fy -com pri -ठ¹ -graph ite -disser tation -ar ter -í Ķ -b ally -zom bi -ly ons -a ic -u bc -pra da -e il -da x -cla i -grand daughter -extravag anza -chall enge -ðŁ¤ ŀ -po ver -primar ily -dad dy -man a -bi kers -inqui ries -da un -fel ine -gener ative -he f -benef iting -lind sey -pol ka -demonstr ated -al le -rand y -o su -low key -weir dest -red bull -our y -n ous -wood stock -cre denti -nic er -g ado -aly ss -ap h -prepa redness -station ary -incorpor ated -dy er -sarato ga -cele sti -: " -antibio tics -or gs -inde fin -ap ron -и Ð -fif teen -no f -ðŁĶ Ŀ -ph x -te ga -m z -organiz ational -on air -band ung -pleas ures -mor i -secre tari -rac coon -ca shi -pil ates -k on -geof frey -la o -kam p -depart ments -back packing -an am -à « -crack down -aun ty -on do -li zzie -ph ers -cu n -ðŁĩ ± -k pop -pu t -inten tional -connol ly -bar clays -hs fb -swin don -u ku -s ally -a int -âľ ħ -pen ang -up lifting -epile psy -inter ro -bun gal -go ku -blue berries -ठ¦ -u ssia -sil ky -mou red -i stic -bri efs -me ats -go b -ch aser -state wide -pra sad -gl itch -ar in -ban ff -memb er -ðŁĺŃ âĿ¤ï¸ı -lo ving -hall a -ภ¡ -smo kers -yak u -scicom m -physi o -sw ol -lem ons -gel ato -ch ool -capit als -ki stan -ti ghts -spi kes -trav ellers -ik lan -commissi oning -ar ine -emabiggest fans -empha sis -front line -pad dock -destruc tive -ba ha -l inger -je wish -shet land -mc gin -mon key -ko z -s one -raj ini -te h -y en -c vs -masqu er -gir ly -we sle -was nt -bro dy -termin ator -gil le -mag gi -bir die -jeopar dy -cu bic -vm ware -intric ate -an up -to pia -east on -sab res -investig ates -bu sting -bil ingual -valent ino -in format -fer re -advent ur -hydr ate -for sy -az iz -san to -e de -whist ler -continu ously -d ham -un used -ji had -addic tive -vi dy -do b -i do -fi ed -ni versary -n one -fu er -ðŁĺį ðŁĺĺ -coven ant -prin table -immac ulate -o em -cl t -serv ants -consu med -un released -sc um -pack aged -me re -ìĦ¸ë ¸ -to by -ta f -spo ons -me al -f ball -fair field -jan et -silver stone -dart mouth -follow me -voy ager -kom bat -anni ver -ene w -mag dal -ho ve -sa th -grizz ly -car di -gart ner -sand y -kan ye -post ure -po ign -im pulse -radio logy -horiz ons -si am -aish war -= => -no che -tr is -el yn -com me -du i -ce c -councill ors -cudd ling -creep ing -loc ke -manag es -trans ferred -ne cks -di er -dan o -v ick -lun ches -d he -en sures -cri ss -ul ster -bann on -cont enders -sp am -sweet ness -med al -hon duras -arc tic -ultra sound -in fr -disco vers -ei ffel -ca sters -ru ben -du st -awe ed -atri um -lest we -se ared -ðŁĵº : -ty ne -ex changes -little mix -l le -astron auts -hersh ey -work day -kno b -so v -re signs -today show -der man -an th -af c -ta ster -sw oo -sa eed -per ing -narrow ly -rn li -best buy -panas onic -obst acle -farmer s -ðŁİ Ļ -pa wan -ki est -ang ers -absur d -oh my -sin o -pist achi -sp ice -giu li -prime time -ko w -k ens -ex agger -! ?! -u ba -midd les -ju dd -e jec -slam med -pen sions -of a -re create -b hp -xx l -liver pool -thre sh -pur ity -ni eu -hol ics -wr ath -ra do -gli o -am ma -dile mma -cr u -lets go -.... @ -âĿ ĵ -sugge sting -tru mps -hor us -f v -ic om -refer ring -predic tive -tar ts -ge tte -so ck -glo ssy -pin ky -al ec -thy me -ou ra -thero ad -pe tr -cr am -p fi -dv n -me ier -incen tives -tun nels -mobi l -rec ap -extra s -upri ght -rev amp -per severance -, - -ot p -mir ror -ar wx -ger ry -ma her -g or -hom epage -am is -ag ra -made le -best friend -sirius xm -bun dles -admir ing -t dsb -ðŁį ģ -ch as -slow ing -ro h -wall papers -â̦ / -tek ken -gang s -tal a -lind say -shou l -line backer -tool kit -ur anium -caly p -ab rams -mat thi -ðŁı ¿ -hon ourable -da yo -ver sail -tan k -st c -fr itz -spl end -pat ag -anno yed -on day -devast ated -chattanoo ga -national ism -mas sey -jen n -tail or -dev gn -org ans -zu cchini -on fox -sat ire -wex ford -dis grace -no to -vol ta -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ı -à ¶ -home owners -poin ter -m cr -au sten -day sto -mo ons -pal ma -gra zing -e so -influen cers -shahid kapoor -compli ant -measure ments -develop s -y d -par l -p vt -rand olph -tor tured -ger ald -eli as -deepi kap -war mup -hick ory -g ap -co ffin -am our -re neg -moun ting -seven s -ig le -hi er -dec ad -tri ght -esc apes -wer ner -t fl -ful filled -ni ger -sour dough -re aper -choo ses -spin ner -week nd -fil tered -sh uk -kat i -old ham -open source -kh anna -at elier -conne c -opho bic -gla s -complic ations -ar son -counc ils -sm ol -as sy -lur king -ling ui -han ks -e in -Ù ħ -ru gs -n guyen -nou veau -men ace -le v -alad din -ru ining -round about -k m -con or -shoo ps -may day -traum atic -prab has -ka iser -k ita -rou ter -pe dro -re tar -stun ner -spani sh -distur bed -acade my -e learning -wit ty -sen g -fer al -av y -sta b -ke aton -ur du -ko to -hu i -coo ke -ari an -the personal -u ma -se ap -a sting -rhetor ic -hand writing -munici pality -consor tium -ðŁIJ Ł -glasgo w -ra ya -eli za -polym er -bro th -prac ti -correspon dent -addic ts -gay le -ail ing -o fe -p li -hear tw -st itch -sight ings -prie sts -sam o -slo th -good wood -roc co -sab c -summ it -l ace -pres ley -itt en -cin cy -thepersonal network -s week -pe gas -af con -regi stry -ci m -le th -dic ap -cand ice -flu ent -sm ack -pede stri -al oud -car ac -priyan kach -p gh -ir ons -dol ce -lat via -dece ased -thero ck -cla p -cen e -fo am -morris sey -gre t -essenti ally -com cast -be agle -argu es -ing ed -- â̦ -sa g -ha san -ðŁĻ Ĩ -ðŁį ° -nh ra -kann ada -indic ators -on er -bri xton -at as -screen play -sor ority -sha heed -he em -class mates -tain ment -es i -breast cancer -zucker berg -aur or -en cia -ref ers -kae per -vor tex -com part -lym ph -photograph ing -ste ff -rest ling -par sley -mom ento -th man -lac king -du tt -ocu lus -fin o -fren zy -ra sc -der n -dis missed -noo k -met gala -sh ill -rapha el -maver icks -exhib its -eag erly -c pa -amen ities -. âłĢ -exo dus -ern st -lit a -deal t -womens march -i ain -score board -campe ones -c en -ti ki -garri son -fidel ity -bra g -road map -psy chop -lo e -ble u -ðŁijĬ ðŁı¼ -sau vi -spr inger -temp tation -ru dolph -ac ura -wic z -parach ute -stro l -len ny -zi k -dom s -nb af -al pac -vivi an -ro ve -pre et -perpe tu -sna ke -air soft -infl atable -prin ces -ati e -ffe y -pati ent -m ire -chel le -sl ack -groo vy -# : -up loading -!!!!!!!! !!!!!!!! -siem ens -provi sion -v fx -need y -f ats -to poli -bhu tto -sa thletics -alu ms -t winning -south western -adop ting -last night -man ne -la ga -tw ell -ac ia --- -- -eye wear -hur ley -fle e -sa ch -pe cker -cost ly -is k -cr ates -polic y -ero sion -in go -wer k -ðŁIJ į -torto ise -therap ies -inter net -chihuahu a -ri ps -fre i -ed or -tai ji -t fc -do d -demp sey -christ in -chen g -hi ps -gra eme -com passionate -cavali ers -histor ic -soul ful -crimin al -ja c -vin ci -expi red -sur at -turi smo -k ona -se aweed -ber ts -le ica -expre ssing -a al -wor t -break fast -her ring -am used -rhu barb -mar tian -cospla yer -y ash -stri al -ra ul -refer ral -dw ts -j w -ad ler -cur tains -gu r -val ence -tyr one -sw fc -coach ed -re born -diabe tic -cho ke -nor folk -investig ative -ðŁĴ¯ ðŁĴ¯ -z id -v mas -phi e -objec tives -âľ ĭ -over due -di vers -mat su -ðŁİŁ ï¸ı -casu alties -ภ§ -al k -stand ardi -re alist -arti facts -pand or -ke x -in vin -( !) -ine y -par aly -mr t -fay e -the voice -on ga -de ed -skin ner -az wx -speci men -priyankach opra -nu evo -bar kley -toulou se -resu mes -football ers -cit i -fe tch -è re -lestwe forget -ðŁĻ ĭ -ch unk -dri fting -manipul ation -equ als -pu tt -ky ungsoo -âĿ¤ï¸ı # -ela stic -par ano -fo y -do ping -cin cy -ss ler -interrup ted -al ay -ado res -ame thy -con voy -ãĢ ı -Ĭ ãģ -black list -gener als -sa chin -bru shed -oun ces -non stop -illi ams -bt sarmy -u av -ru ff -bur ma -bi k -defen ce -schul tz -bo asts -lonel iness -go re -trans forms -alum na -@ @ -ra ppers -ne hru -car o -himalay an -wearab les -ge h -pepper mint -re development -flam ingo -cos by -big baldhead -ag ri -bare foot -sco pes -re gram -gh ana -ðŁİ « -i heart -sa die -carri e -microbi al -ku ala -sk ater -quer que -âĻ © -gen res -reas oning -ch ased -as o -sli pped -en can -vam os -ker s -ad verse -mo il -commod ities -with you -sil ent -hy pe -an de -am ination -whi spe -lit z -âļ½ï¸ı âļ½ï¸ı -ri ff -pp y -lam bs -gan esh -ab sent -regu lator -marse ille -en roll -par cel -wa p -by rd -ðŁĩ Ń -tu ber -country music -par l -contro llers -responsi bilities -we y -ch ate -montene gro -chic o -mil an -l ms -tra inees -appropri ately -un certain -popp ies -ed sheeran -nutr itious -gar o -deut sch -awe some -ãĥ ¼ -comfor tably -land marks -et i -re usable -daniel le -ro sal -co les -just ic -c cs -f anny -ni m -mc u -clin ch -at ene -mer ge -im db -ang lo -uc cino -pan ini -an not -bur berry -feat ure -predic ting -fashioni sta -s ask -imag inary -mm o -south sudan -spe ar -hu bble -jo inthe -coyo tes -sli go -ko dak -sit com -polaro id -roo ted -corru p -ðŁĻĮ ðŁĻĮ -bris ban -at z -ah l -re my -tal ent -aval on -ra da -pau line -locom otive -go ons -ne mo -maser ati -ic u -stu tt -histor ically -sm b -pres by -avo id -so oners -rhine stone -w ad -ri sing -tro t -mo des -reg ent -optimi ze -re ece -sm u -ver ti -newyork city -cor tez -ra c -in case -sin c -fiel ding -e tta -tiff any -al monds -sad dle -k rat -mat ter -g low -star ving -gl o -cra ppy -sl ur -st d -monit ors -recei pt -maymay entrata -mc il -un is -rain bows -cal dwell -pacqui ao -j op -a fe -hoo k -es sen -wiz ard -medi an -fla ws -com s -âĿ Ħ -ing h -ha ynes -anton io -tem plates -ou ter -na w -cardi gan -bel grade -ðŁĴ ī -hom o -a ise -ro pes -no ve -what you -tri gge -concep tion -ad ukone -na di -fri ars -sw er -adju sted -hot line -san ity -kau r -down loading -c gi -ten or -eth nic -app alach -ภ¸ -pa g -gol ds -on set -investig ator -car tel -peace fully -jarre tt -cat alan -poli o -n um -fru stration -dhar ma -my life -âľĮ ðŁı» -aber deen -mu sa -bin der -spark ly -fle eing -instin ct -co ping -domin ance -ill ers -er a -u conn -lo oms -living ston -gal i -he s -c ma -bel a -se ley -mon k -la ch -mar x - ´ -m erica -woman in -es sex -ra ina -jim i -nep tune -z ack -chine se -mart ins -chand elier -her n -with us -ear l -asph alt -modu les -st p -ul la -psychi atric -mile age -captiv ating -si der -men to -mor t -tran ce -tal bot -ab by -ì ĥ -âľĮ ðŁı¼ -j ak -daw n -turn up -scre wed -fe ds -blue print -ðŁĴĸ ðŁĴĸ -har sh -er os -insom nia -ban kers -ta emin -mis conduct -hu mber -gi di -edu ardo -con a -musc ular -consu ming -ra sh -don nie -di pped -col lie -samu el -melt down -ðŁĺįðŁĺį ðŁĺį -me z -exam ining -schwar tz -pri stine -ðŁIJ Ŀ -ve it -ful filling -an esthe -gue sses -dra ft -som me -soli d -pati onal -ho ped -evolu tionary -all er -enter tained -sli ps -lud wig -conclu des -sen sible -bon net -cra ze -tra s -haz ards -const antine -ed ics -star trek -to c -occu pational -in cheon -deepikap adukone -pizz as -new comer -de part -oppre ssion -ebon y -foss ils -tro jan -el en -ste aks -k hou -positi oning -ug by -red cross -ak h -dol ce -us mnt -pp en -dil ig -ma vs -call er -cost ello -⼠Ħ -dy n -thing s -rhin os -a xi -sar kar -con vocation -att ers -ss ss -fun gus -eu gen -russ o -squ at -w sb -eli on -william sburg -s off -defici ency -be arer -o kin -key stone -t wain -cal ming -break able -wa res -horser acing -com bs -bun ting -u it -t land -ðŁĴĻðŁĴĻ ðŁĴĻ -ga stron -sab ot -ick ers -commissi oners -sen ate -ii ot -ath ena -nit rogen -an tony -ero tic -di alo -mis sou -hypo cr -âľ Ī -kaeper nick -can v -d roo -clevel and -o sh -mon sta -stefan o -^ ) -sh ul -po ison -ha e -commerci als -ma ul -nit ro -co worker -alo e -vap or -t ents -russi an -qu id -question able -mid get -po ker -girl friends -sin the -erit rea -ten ure -depos its -buc keyes -spot ter -theod ore -trin ity -joaqu in -u cci -follow the -caf c -mp a -ðŁIJ » -plo tting -dom ino -ta ek -sion ally -dicap rio -pa p -car mel -ig er -bt cc -beth le -www bigbaldhead -foo die -bagh dad -mason ry -off ended -à · -ภģ -sc ro -vers es -ori ent -ar ches -pi yu -know your -gre e -ta kers -gu ard -dish on -bucket list -bha fc -war dly -ðŁİīðŁİ Ĭ -leigh ton -pe w -stra y -assaul ted -in hal -ly fe -amar keting -l x -kat z -ubun tu -me o -carto onist -turno ver -mi z -dis like -mul len -mo f -bl and -hi des -emer ges -chori zo -truste e -ma hog -lan sing -paralym pic -fa int -fa una -ch al -sn ar -cat h -bent on -cast illo -sli ppery -apric ot -oec d -bar o -l z -he ming -clow ns -co workers -peru vian -commu ters -y ell -ðŁļ ´ -under ing -v j -tt p -fli pk -w ana -soc ent -Ĥâĸ Ĥâĸ -ठĤ -oo sa -jag ger -di sm -e less -d ham -cali f -a official -ec lip -harro gate -gra pp -com rade -n tr -concentr ate -thi ghs -bit coin -bel arus -ë ĵ -end uring -now watching -industri al -pi p -ar on -ar at - ® -whit by -oooo ooo -sa ree -tic als -mis leading -yo on -year s -sle igh -roman ian -sciss ors -vam pires -ac up -ab ba -th weeksary -cent ri -fl ye -u o -c bi -bu ena -sin d -mar ino -bur r -re building -ठ² -anniver saire -ac ca -ðŁĴĢ ðŁĴĢ -gett ing -tu lips -wolf pack -âľį ï¸ı -more than -ta kin -ð٤ĺ ðŁı» -u be -mon ic -dou bts -mo wer -co balt -don ne -specul ation -argu ably -kak u -htt ps -prosecu tion -din ah -stam atic -disclo sed -bever ly -fl wx -cra bs -extraordin aire -war mest -imper i -o logists -trac es -par c -lake side -am r -ter i -hour ly -domin ation -ar row -shrews bury -ance stry -wr angler -trigge red -pen sac -roo ster -survi ves -a on -bo ko -val or -love is -la g -pe y -fo cal -out laws -bl anc -artic ho -wit s -marsh all -die go -support small -u ca -sa h -je et -syn ago -gover ning -ðŁĴ ¬ -sal ads -cre ate -miri am -cen sored -ami de -no u -z eta -allegi ance -* ) -bl m -ric an -pa stors -oly mpus -blo c -whir l -star ry -pr one -y k -p ne -congratul ating -be v -so ber -love island -sa ir -an ing -tutor ials -q e -lun d -in ist -cle ver -taxpay er -ali z -wren ch -dd ling -cap ri -h pa -ðŁı» âĢįâĻĤï¸ı -na j -o j -futuri stic -jelly fish -ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ -cel ery -plan k -fil a -ne me -un healthy -lec tions -ðŁ§ ¡ -rit chie -n ws -mi kha -wonder woman -âĢ İ -hip stamatic -ka g -ðŁĴľðŁĴľ ðŁĴľ -poul try -mo w -wor ds -lo ff -ðŁ¤£ ðŁ¤£ -relat able -re mixes -keny atta -ke m -re signed -fo d -stra igh -j lo -hu tch -box ers -colle en -mag s -instruc tional -ko l -attrac ts -pra g -account ant -go ggles -br u -th ole -mar row -leu ke -oc to -pon ds -bubb ly -he ist -ìĹ ij -im p -a har -ha unt -hall mark -psy ch -kkkk kkkk -col umb -jump suit -cost co -si delines -ag gies -over turned -ni b -key chain -fu k -f af -mi am -assist ants -cy cled -ri der -dam mit -red wings -mag es -kin s -ì Ĥ -ho d -son t -carol ine -" ' -cu le -bra id -fel ony -ar ities -ruther ford -depic tion -isab elle -ro ach -k day -fifth harmony -em y -li gam -bari sta -albu querque -gro ss -ðŁį º -oo ks -ðŁij ¼ -dun can -try in -jag s -g ould -li tho -âģ £ -а Ð -sam my -tun g -cas ser -apo lo -aaaa a -man g -as ics -sh en -p ye -tur bul -ss p -saint sfc -on lin -n anny -he ster -do z -à¸ Ķ -th read -ren ts -kh and -ðŁĴª ðŁı½ -un conditional -rob son -car re -ph on -sacrific ed - £ -auto s -par ker -oc a -log in -kee gan -hard cover -dough nuts -ðŁĮ İ -spit fire -refresh ments -saskat oon -commod ore -j f -rub ber -halam adrid -child care -stra da -io m -ri k -dak ar -ther mom -cro pped -gar u -ali k -ven i -i ft -si ka -ritu als -z ul -e ch - © -su dan -l land -i me -do cker -ì ¤ -fe ared -fa o -wal ter -no g -mutu als -l h -ali gn -mon ia -concep tart -ðŁĻı ðŁı¼ -sco e -compet ence -sw ine -ly me -laun ch -green er -abstract art -inqu is -gran ada -ga elic -flu ff -d backs -grave yard -ba be -acade mic -adventur ous -joh ann -~ ! -bi bi -| # -pl ings -gett y -as b -âĿ¤ï¸ı @ -staf f -religi ons -bang or -world bookday -me gh -de vin -ash ore -meri dian -gi thub -qui z -all stars -be stest -ir resi -ack er -do te -war rington -pol ly -newor leans -cr ou -wi gs -che y -smithson ian -la sag -de tour -bor is -stra ps -mari ah -inten tionally -ko h -ðŁį ¸ -ssi an -mar issa -cor al -episcop al -casu alty -tom o -supply chain -sam p -on go -ro o -cavi ar -p fw -clau dio -buff alo -s ations -mat ty -snap back -l ds -al arms -mat te -âĺ Ķï¸ı -conditi oner -d ors -he x -fi zz -a stri -sus sex -secur ity -qa eda -all star -cocac ola -as one -cl icks -sc ans -mu te -he avier -ðŁİ § -âĺ ŀ -lv l -book boost -youtu be -fla shes -f jor -c su -explo de -do dge -cair n -gonz ales -th ill -pel le -hart ley -renew able -re tin -e stre -costar ica -shipy ard -nc fc -pri ya -a ghan -an ath -plu gin -co rey -re bound -or u -kat rin -hor mone -gi m -mahin dra -s sus -park land -har per -fanta stic -infer no -ep ilo -wrest ling -fe ct -c it -ac oun -to ssed -monu mental -char tered -bu st -pe tra -âĮ ļ -wildflower hour -sweat ers -* . -bl er -ate ch -go wan -demo graphic -bra l -suici de -renov ations -vu el -sin ister -ar mani -miso gy -ph arrell -nap s -un iting -crusad ers -cor gi -insu red -than i -no or -g q -d ada -bicy cles -snu ggle -sch an -ten berg -ss al -fe mme -bo il -½ ï¸ı -re ap -occur ring -hus sein -divi d -sto ke -sh alom -na ia -o lic -frustr ating -Ù ĩ -ig s -gro ver -scen arios -n ds -bru tality -med alli -bu on -sas s -skate boarding -ony x -lor ry -ny u -gau tam -mm ings -gu g -end i -lo thian -comm ando -chal k -ph ora -asse ssing -ti gh -crun chy -ad ay -is l -ci ara -pilgri ms -kam al -p to -brit anni -t ani -sm c -l ure -app store -ab y -golf ing -cl c -fa u -an as -shu tting -regul ated -carn age -scow boys -all enge -c ma -humbold t -rel le -ku mb -her i -refin ery -sound check -d wayne -bos nia -i sp -the alth -anni v -relev ance -my a -bag gage -dre ad -s bc -th ed -bu h -hi jab -lo id -ke w -c te -respec t -lovel ies -cu bes -celebr ate -dir t -sav ers -_ , -gar ment -pulit zer -mas jid -beat port -al arts -encry ption -s ner -ple ads -found ry -sym metry -ru mi -birth place -scallo ps -supp le -pivo tal -t ati -no de -so d -pro xim -tr ics -col dest -bren t -mand u -cla ir -e ach -and alu -hi ddleston -ðŁIJ º -mel ts -v ance -pin n -se ments -scre ened -sa chs -o bl -ic ha -âĺĺ ï¸ı -school ers -heal ed -lo gged -ð٤ĺ ðŁı¼ -ic us -bore dom -b ish -b ffs -tal king -sure sh -hoo kem -de on -de fl -ei leen -ðŁį ķ -women intech -ri sotto -rang er -adverti se -ภģภ-tel ly -la go -dart moor -d ong -sk ates -lo go -un ner -mail box -ma sala -lo oooo -amethy st -che wing -c bb -australi ans -rc mp -game art -# ... -kor n -extre mism -fruit ful -anci ent -pu bg -pol ite -wh it -mur als -m gr -line man -dav ao -ste ms -ten nis -av age -tu pac -gigan tic -hs bc -auto biography -up the -ี à¹Ī -re gal -fig uring -ku l -mis sy -hoo p -gra s -for ums -back lash -abduc ted -p nw -min ic -bu tt -bott oms -at on -ven g -ðŁĮ ı -del aney -prab hu -fan club -over haul -health ye -sy no -aa f -ren amed -kim i -un cle -man city -se u -qu anti -este em -um in -en zo -mel vin -under go -j har -far ah -coast ers -humph rey -mh z -children s -^ . -d hi -disrup tive -integr ating -r nb -over sized -a ide -ne au -docu mentation -ðŁijĢ ðŁijĢ -pal o -hear th -ri yad -pun ctu -abc news -secu res -boy band -bir ch -ju co -tra ff -legislat ors -bay a -ãĤ ¯ -no ises -collec ts -s warm -k ner -bi shops -stur geon -snapp ing -mo l -fre aky -chair person -tro p -lyn ch -car cin -art sy -e sto -cha i -fl ur -inv ali -sau sages -im el -j or -fun fact -wit ter -puni shed -ac ons -h ya -re versi -em c -dif fu -z x -sp aw -cla d -d mit -hol land -fre sco -pay roll -ab undant -stu ffing -mor o -c ny -boy cott -wend y -ele ven -pro voc -pil ot -tr x -be ad -climate action -ri on -assi e -ì ĸ -o sm -islam ic -ho ar -good reads -al ici -afterno ons -spoke sman -jo lie -it as -masc ara -âĻ© âĻ« -pre vail -beetro ot -lu jah -k li -dod ger - » -ru le -l n -scre am -ho bart -col bert -r tc -er m -pat ro -quo ting -s live -que st -non fiction -semin ary -prosecu tors -ve st -express way -g ge -nau tical -et f -ðŁİīðŁİ Ĭ -dur ation -cha ired -the film -fab io -she h -can o -ðŁĴª ðŁı» -with draw -! :) -cor pus -phen om -yel p -la wn -ent om -snapp er -but te -pin ball -pro xy -libr e -alle vi -n ada -gabri el -fo wl -eure ka -daph ne -tu nes -pun ched -wh ore -jo g -ren tial -man ners -o pe -wh ufc -gu th -revol t -sne aker -philharmon ic -ho ste -sovereign ty -ðŁĻıðŁĻı ðŁĻı -fish ing -sci art -fe ta -i pp -dump ing -kel own -gir i -dig its -sal u -san jay -twee ters -sp as -col chester -sc ab -ma dd -๠Ħภ-Ä ĩ -ged don -march for -do p -maure en -un plugged -di do -fashion blogger -up a -mex ic -tar y -pol ye -jame son -v t -grin der -mad dy -consult ancy -¬ ë -leagueof legends -ac cents -um ni -jane iro -tu ss -h ens -ampli fier -to shi -pret tier -pre vents -new town -red wood -vant age -ball ard -ar tof -a she -a sion -lac ey -ap at -gro ve -ภĦ -rw and -real tors -tra itor -bed ding -ö r -zi on -fla shing -cam pan -boom er -secretari at -ab ol -liti gation -cont amination -se dly -shred ded -in for -do herty -bench mark -ro che -skate board -sho vel -i zz -to pper -o ster -laby rin -autu m -k ong -hum mus -vi z -tech news -kla us -am using -socialmedi amarketing -i des -cast ell -ste e -underestim ate -cal ab -pa ign -b illing -unanim ously -g mb -fly fishing -hath away -commerci al -colour ing -skul ls -pivo t -te p -tb c -motor way -x press -construc tive -pu k -under lying -kir sten -mani ac -cha o -se ma -chiff on -ðŁijĮ ðŁı» -ver ona -kom o -stan doff -wi ped -c ated -bla ir -wor kin -m sc -bethle hem -swi pe -unexpe c -pe es -pe tri -orig ami -ðŁij ħ -mex ico -flav or -ru dd -cannab is -mar u -ri ddle -wor shi -sil on -sch at -ap se -tang er -bi ous -e er -questi oned -o zar -dan k -angle sey -char an -bak u -compe ten -re pri -bat ter -sa xon -cal ves -leng ths -$ $$ -âŀ ¡ï¸ı -immer sion -ga unt -car ry -cy to -b anda -shu tt -experi ence -el gin -mous se -ta z -ê µ -in correct -en z -b ham -mor on -so ver -ar un -ti pped -la ble -de arly -bau tista -í Ļ -mor tal -woo p -dt la -sho cks -dav os -ðŁĵ Ŀ -swim wear -her man -ðŁijĩ ðŁijĩ -z ir -neglec ted -grac ed -campu ses -av s -ar ora -swach hb -live pd -ac cra -enqui ries -shoo ters -kur t -vancou ver -brad ley -gar da -g ü -ol la -attrac ting -up ton -ne win -lu mia -furn ace -ev ers -e on -sw a -roo kies -a oc -v ss -bris ket -tor ch -yo da -heart land -tac o -ph ony -food bank -ab bey -bab ylon -u y -gre ate -expre sses -d andy -sc apes -survi vor -ron d -e ci -ha vin -ab el -chil dish -tor que -wav y -ur self -kanye west -year of -ale stine -o brien -al fon -sk ag -kore an -anchor age -val eri -de w -ðŁİ ¨ -land slide -car ole -christ en -go phers -af i -priyan ka -q q -power of -it te -pc so -tw ol -pr y -intellec tu -guer rero -pi les -wish list -w ren -time table -ë ı -prodi gy -gibb ons -. / -ne ur -anz ac -mur ray -vie st -pla ster -la ir -art gallery -inter continental -g br -bell ator -nam joon -mam mals -am el -y aw -saras ota -cam ar -bud ding -sum mari -aco sta -la sh -ey ou -post graduate -instruc tors -ti g -const ant -were wolf -ic os -cla s -glen n -bud ge -ðŁĻ Ĥ -er ta -sta ins -persecu tion -cumb ri -o ch -syner gy -hu ang -scand in -mid terms -comment ator -regar ded -perpe tual -bo iling -al p -lan ge -sch le -fac eli -twee ta -ri dden -ok toberfest -charlotte sville -ik lan -jo u -ch atham -b sc -ðŁį ¦ -stra uss -mel low -xx xx -happy hour -re actor -ww er -distr action -at orial -ðŁĴª ðŁı¼ -twin peaks -fay ette -a or -ko k -bro om -sy fy -ou se -am ag -Ø · -ubis oft -lu lu -hall mark -stu art -it ya -si deline -venge ance -re lu -sex ism -boun cing -un ites -gu stav -te ssa -stu mp -pro clamation -ima x -divid end -col by -ðŁį İ -play wright -un safe -co smo -ðŁĩ²ðŁĩ ½ -cup board -constitu ents -ang lia -ram page -ðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺį -than ked -take aways -shro ff -de bat -kh ur -conduc ts -format s -à © -port age -graph ers -u ten -pre m -mo ines -condem ns -s ous -l ps -f cs -deal ership -leuke mia -bure au -ski d -guardi ola -ca ster -thir d -avoi ded -en cyclo -c sr -vi xx -analy zing -she ar -dulu th -shap iro -chan ting -stre sses -as be -mil itia -ãĥ ª -col lin -arsen e -sure sh -teach ings -yi xing -sh ill -nu des -sv u -clear water -war ped -pro life -artist son -it u -versail les -galax y -ax el -spring st -cal a -hu hu -sc u -commit ments -exe ter -poign ant -mo tion -conserv atory -row dy -rec alled -mu sk -emb elli -so the -âĺ Ģ -sto pper -sch ild -to pe -el mo -zi el -j om -barn sley -snow den -on tour -jour ney -hills borough -par ole -w ts -mo ving -ag ility -tiv o -ff ers -kindle unlimited -g wen -ann an -ah mad -tex tured -hepat itis -dra m -insi ders -tis sues -ãĥ Ħ -fc barcelona -cr atic -na acp -pe can -f gm -custom ize -concer t -g sm -pe g -p one -justin trudeau -super cars -happy holidays -bu lar -ado x -lap tops -digital health -destin ation -gradu ally -áĥ ¦ -popp y -ss l -inhi bit -star light -of fro -glo omy -x per -hal der -im plants -le to -hass el -a as -un told -en ci -liber ia -or an -con tests -il ah -sma g -sc out -mari anne -cr yo -schedu ling -lo s -kan e -stutt gart -ne se -law rence -da in -pho tom -car ou -ภ£ -g wy -national dogday -roa sting -band camp -kentu cky -stret ches -ke rel -ca she -ãĤ ¸ -sta x -tran si -dog gie -at ric -hal le -ci vic -brow ning -lein ster -cat day -high land -joy ous -in cumb -or lando -ro mo -col ton -del ta -car ab -ro tc -aster oid -goose bumps -mo logy -yo ko -an ds -tomor rows -red carpet -sm p -ca sio -ðŁ¤£ðŁ¤£ ðŁ¤£ -se au -rejec tion -rot ating -bi partisan -th un -mat i -bon i -ol l -ener gye -do it -l j -mother hood -lou ise -neck laces -el ite -ni x -l cs -en v -gl u -le sh -cran k -su sie -m clau -so tu -crow ley -rat ri -use d -bre ton -alfre do -ye o -travel pics -ti pp -elli son -sax ophone -me red -heu ghan -ta ine -f es -vi ro -suppo sedly -i as -dige stive -y le -li zzy -wildlife photography -bri anna -west field -ra ined -am her -ðŁĺĦ ðŁĺĦ -distribu te -bott om -pre serving -oil and -craf ty -de scen -col ling -shakespeare sunday -r wc -ang led -ci an -t ations -mon tage -me yers -france sca -ðŁĮ · -wi ggins -san ford -volunte er -car ra -bar k -vari ed -pl in -am u -kap il -rock ers -qu ind -br ane -in mate -ent al -impro vis -michi gan -re tweeting -progre ssing -mercedes benz -smo ker -physi ology -dor ado -watt pad -h wa -sr bachchan -w ga -vol atility -hi re -ac ap -wn ba -hein z -stit ches -kidnapp ing -bur ys -lim b -f itters -thumb nail -ton e -mir and -desi rable -ad dison -tar an -tamil nadu -spec tator -soci ology -amit shah -remo tely -âĻ ¦ -ham id -r ds -g lee -smooth ly -sch ro -er c -lali ga -he als -us f -ni shi -d hu -un il -h le -tro mb -bhu tan -pilip inas -se ung -whit man -te y -min ce -snow boarding -re au -k ker -av o -zach ary -ran veer -ti k -gover n -qu al -beck y -anthropo logy -att en -grocer ies -de bit -war p -sil icon -hawa ii -ðŁĴ ħ -pomegran ate -pe er -orang es -people schoice -end ure -ðŁĴĽ ðŁĴĽ -ãĤ¹ ãĥ -ac ial -a haha -stu k -imper ial -bl ond -pow der -kno ts -vin ce -wood lands -den a -watch in -mat cha -ma hat -galax ies -middles brough -k ö -stre e -resc ues -wal do -lero y -desp ic -real ities -tm nt -ha q -un o -pe c -bolly wood -blin ds -design thinking -he ms -and hra -ab sen -fan s -ste ch -shire hour -bla ine -shak ti -pu rely -ðŁı ı -tra fal -ke ynes -gr ate -to bias -spon taneous -satur ated -caval ry -pri sc -ðŁĺ ij -wh t -pas si -~~ ~ -vir at -patt inson -la o -weir do -sym pathy -ju da -occa sionally -cred ited -stat u -es co -hil ly -esc ape -dischar ge -se er -may nard -sud bury -z lat -or al -we er -encoun tered -sm elling -over sight -ê ¸ -that cher -mack ay -you can -fre ep -freed oms -prophe cy -ho e -ishq ba -dra ke -qu its -pel led -tur k -o vi -wesle yan -new music -leg g -ch eng -h illi -ay y -pan ties -ad versity -ad jac -vaccin ation -ju ke -ga c -exce ed -time sof -sta ining -ep cot -v ital -up ward -bethe sda -apar k -ma hi -camp fire -enchan ting -rha pso -h z -na ver -fa x -vali dation -ac ad -ny r -as ym -coordin ated -depar ted -all ery -var ies -spr ite -chap lin -ss occer -s wat -bre t -relu ct -tunes app -super star -reminis cing -o co -home grown -dough nut -un canny -la pd -thyro id -! âĿ¤ï¸ı -botan ic -bre s -sp ade -i ste -echo es -du lil -bur sting -qui ero -ðŁij İ -loy ola -amuse ment -ha ils -sleep y -burgl ary -âľ ı -ro gue -cot land -mo ors -low er -wic ked -ðŁĶ Ĭ -compet iti -argent ine -yvon ne -karti keyan -ili ary -gat sby -precin ct -six ty -na ji -cam s -practiti oner -ðŁĺ³ ðŁĺ³ -pu ne -neg li -juli en -inv aded -cali br -cla m -duba i -mu k -lan tic -produc t -fe dex -ï¸ı : -eu ra -dari us -s ling -virtual reality -home stead -ðŁı³ï¸ıâĢį ðŁĮĪ -pac ed -in ha -pul mon -la zy -premi ering -ma stered -in he -con gregation -ba jo -sport ing -new jersey -hor ny -lma oo -leng thy -du t -yo gh -swe aring -philosoph ical -pap ua -in ski -know les -dy ke -âĢ ² -to ken -mc guire -ri ot -probab ility -mc con -gro s -su mat -c ite -da a -on da -mad dow -che w -board games -spar ked -re claimed -ad hd -ny se -imwith her -equ inox -boo ths -balsam ic -ha zy -dor chester -ag os -se aw -moder ator -seri ea -ander sen -pilgri m -âŃIJ âŃIJ -itch en -hal li -x ton -nathan iel -mun ition -celesti al -ga f -zo om -mark le -pen thouse -cal e -s fa -bar king -tu cket -em ery -cal orie -li que -ad ar -mc nam -tor tilla -wood pecker -mo town -bad ger -ayr shire -scram ble -dd ay -cra ziest -per rie -cho co -cast e -i ot -wre cked -selec ting -uss r -gra ft -pun t -lab ou -ir st -ba ek -Û Į -su ki -que u -ach at -te ster -aug mented -wc vb -sin ks -ðŁĵ » -ra ke -inter ne -be cause -belle vue -une arth -light en -ðŁĺ £ -turn around -labe led -unemp loyed -twitter kurds -le ia -h ye -great er -ðŁIJ İ -tim ed -i red -e tt -limit ations -cab e -s out -bee ch -anni hil -re trac -yo ona -ang er -den nis -supp lying -di z -" ( -sc ur -gun man -su ho -sauvi gnon -ภ¥ -wi ley -land on -choreo graphy -pre historic -ðŁı ĥ -var gas -assess ments -pinn acle -di i -chamber lain -ì Ī -v p -present ers -deut sche -sun shine -sal utes -r one -bu siest -- .- -motor ists -hemi sphere -al wx -ps p -ow a -den ying -cho c -gu tier -han uk -mus kete -jait ley -se wage -t ame -thin kers -shi m -se quo -pap ar -middle east -k wa -ke g -patag onia -no y -bar ça -take off -he a -à ¬ -n sc -g dc -ðŁij Ī -mou stache -mel ania -thr a -â¬Ĩ ï¸ı -pier ced -ze us -fon ts -ber a -it iner -q atar -contr ary -ire land -i fy -ou los -commun al -fin s -un paid -pa a -ðŁijĩ ðŁı» -ri os -ou p -f iller -cafe teria -à¸ Ń -kas i -cali ber -z ulu -v sco -ts ford -dragon fly -smo kin -pi st -psycho logist -diplom at -we bs -buc cane -à® ¾ -motiv ational -du ne -ba e -c fs -with out -er on -i ac -ate e -pen sion -fra zier -en sis -sk is -par ting -ger y -territ ories -nach os -eni ght -ever lasting -msd honi -tel e -sp un -po di -sab ah -environ mentally -ce ase -beau mont -mar ta -kel vin -ho ff -sun il -n da -co b -sh ale -ree dus -un boxing -u bio -re opened -n all -capsu les -mar r -himalay as -swee ter -ja z -f mr -twee ter -dha ka -na u -de mi -d fs -ta urus -fad ing -it utes -ci p -over flow -jef frey -don ny -car tunesapp -ðŁį ij -prefe cture -danc ed -c pt -ple asing -ital k -earth quakes -ul ation -hi o -ãĢ ĭ -ant an -nutri ent -de ere -selec ts -enrich ment -r iti -tram pol -bl amed -j ia -contribu tors -chesa peake -pi geons -tribun al -mad uro -w su -ilo ve -effici ently -dar cy -war ms -ar ra -ec u -ho wer -strugg led -rajini kanth -ðŁĺ¢ ðŁĺ¢ -hou sing -str at -eli x -disp ro -raf fic -thi erry -na sty -c fb -staf fing -al ma -back ers -hen son -sky walker -reale state -roo s -ness y -chan ce -cair ns -c ci -pe dal -ly ft -cross word -wait er -only in -kru ger -k ir -alej andro -car tier -car rera -re paired -ou at -un clear -un breakable -today in -qu eries -jo dy -gen ital -win ner -to l -kelown a -fascin ated -ãĥ ¬ -sris ri -squ ared -spr ung -negoti ate -priv ately -av en ->> >>> -g ical -gav in -chester field -zu mba -or r -nat alia -impeach ment -mn l -car at -criti que -credi ble -trac y -tan i -musi k -jig saw -gam bia -tol kien -fe u -as per -sav ory -fo xx -f itt -mar lon -l rt -v ell -p br -imprison ed -i om -chu l -wind shield -kay e -ba a -chor d -s art -al gon -minister ial -nat geo -la zio -nor ms -ðŁijį ðŁijį -lic king -fut bol -un sung -dalla scowboys -sh red -distur b -dev ine -be ards -ch f -b day -ro sso -ig or -ay i -si ren -k air -sti les -ro f -mag nets -un cover -mou se -bang ing -si ghted -spe ople -impac t -row land -kir a -environ ment -love the -p sis -mish ra -gl endale -ca jun -o che -de ception -sex ist -stra ws -s ga -buff er -apost le -sp l -pop up -ðŁļ Ĺ -r g -up er -ball in -i dy -occa sional -national park -ðŁı Ĭ -u an -innov ation -ภ« -te aparty -re tte -counter fe -b ha -rec s -ig en -ðŁĮ IJ -humming bird -cu r -ha ven -la zar -pue blo -: : -zi onist -op ath -inver ness -promo ter -carto on -cabine ts -mahog any -surve ying -r ational -feel ing -testi fy -so w -oc on -ภ¢ -ne el -mar is -sol itary -che mo -rad cliffe -sim ons -ros ary -new er -jo die -re tali -pra wn -pad dy -hen ge -k ala -im plant -at y -bren twood -par adox -ene z -re designed -p our -wy d -al de -௠ģ -sol d -biomed ical -๠Ĥ -tt tt -mat teo -ys er -new ton -de bun -ner dy -loo l -wo on -elisa beth -ec c -wh i -ach o -salv age -sal aries -qu ity -navig ating -oph thal -con soles -re built -o pec -ast ers -sho red -set list -kathr yn -rhy mes -re visiting -ash ish -li ft -re post -sole il -âı ± -weal th -sa at -we c -king james -flipk art -field work -se gu -mo dal -bu b -are rs -ðŁį Ĵ -clo oney -pad dington -necess ity -guth rie -pen te -li mo -jo sie -ar tin -en c -l hs -betra yal -info graphics -i er -mo a -hear ings -bon jour -sym bolic -ag ro -wed ges -krist ina -wild flower -athle tic -photograph y -pe sh -ca hill -chi lean -gou l -fi oren -ðŁij ¶ -z il -sk im -bad oo -deli a -tre ble -n cc -ðŁĩ¦ ðŁĩ -a house -bul lock -sol itude -ا٠Ĩ -can cers -futureof work -hu tch -water shed -war mongers -sp illed -colom bo -mo th -associ ations -weigh ed -global goals -not just -christ i -tor g -swe ating -man eu -clu sters -â̼ï¸ı â̼ï¸ı -ta ped -ul y -tru sting -yu suf -te in -ra b -, ,,, -sin ai -audi ble -explic it -cro wns -sch iz -at least -ðŁĹ £ -de bra -je suit -ene gger -z hen -one sie -i it -ss f -gur gaon -chak ra -bear cats -k ran -k awa -reque sting -han over -g end -sor os -mer cy -lovel y -do omed -tim my -ku z -ul l -ab ram -sa ison -ãĥ « -clean ers -re mo -circu its -bar red -o th -mo ist -madele ine -gall o -u j -per mits -hea viest -car ols -az te -gior gio -flo ats -decl aring -us rc -min at -craf ts -pri ma -conven i -nickelo deon -danc ing -ceremon ial -blo gg -tw p -anglic an -she k -k nick -( (( -hubb ard -harve y -hit man -fen g -we some -for za -s word -op us -bro m -gi bility -z al -m unch -dance hall -gre edy -hd mi -re birth -ðŁĺĭ ðŁĺĭ -s world -figur ine -com post -k f -engra ving -gior no -st ana -k man -ham ster -compos ers -aj e -func tionality -pol k -is ons -air planes -te se -hor rors -musc at -gi ven -sp ence -ðŁĩ¸ ðŁĩ -eli ot -ach illes -fre ck -crypto currencies -sou ther -hal o -bor neo -polit ic -hahahaha h -up state -si ena -obsc ure -hau sen -lloy d -happy friday -motor bike -bon a -americ as -hol s -- ( -spor ty -un aware -reven ues -christop her -bank sy -av an -ev apor -com press -eyel iner -to dos -buff y -renewable energy -ly rical -ar chan -rapi st -fair trade -lma ooo -beat z -pro active -la pse -ir ical -revers al -po de -mcin tyre -mac au -ãĥ ķãĤ -nash grier -f sa -g all -çĶ Ł -perpe tr -il ya -configur ation -% ; -str ange -rac i -ภĩ -pic kups -kov sky -mam mal -w ps -g able -compar ative -z h -save our -da vey -on etsy -mu ssels -mis er -cri stina -electr on -cra ve -lo ren -precipit ation -m z -ðŁį « -vin cen -snow board -no ida -ah n -marin ated -g tr -town hall -min is -bethe l -adv an -su ra -shi el -fur ry -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ -lyn d -so il -sc ence -sen eca -shar jah -dick ens -credenti als -av ar -per k -requ iring -pre fer -j ian -de ca -r ach -ing for -del e -be ep -ðŁĴ » -cis ely -hu ddle -green sboro -haw king -ho ax -hang ar -ç ľ -mis o -lo vin -gre ta -ab ad -logi e -at an -snow flake -mahe sh -fear the -al kal -bobb lehead -ba hn -ju dged -fu tu -feli x -ðŁį ĵ -pi ke -der iv -notic es -au er -dis super -or da -wi pes -am ino -stri kers -foo tb -dram as -pun ching -score less -heming way -bi h -bal lad -chat ter -am mo -kle in -fabric ation -kari m -z end -hi sto -vol ta -rock y -marke ter -xtre me -sequ encing -paradig m -cle ats -boom ing -âģł âģł -block ade -promp ts -yogh urt -pur pose -nu r -regu late -nois y -ing rid -bird watching -bar tender -Ù ĥ -wor dof -cha otic -shor ty -el dest -z app -onceupon atime -fl yo -rit os -mike quind -ðŁIJ ´ -regi stering -. ] -ad ol -gg gg -pur ge -kid lit -ar bor -val ves -synago gue -o th -unanim ous -veri fication -dar rell -ãģ Ħ -vander bilt -tape stry -pro sper -did dy -dra fting -de cep -marqu is -st int -michael jackson -pee led -men us -bb b -sc are -ema il -wri gley -it is -f ell -some thin -bar ra -ed gar -di pping -pu ddle -sla de -lear ner -jal en -ðŁ§ IJ -the daily -mikequind azzi -ju x -iq bal -mckin ney -ra iser -ef an -dr one -cat o -pic ket -cro we -l att -uk o -giuse ppe -hin i -synthe si -ponti fex -song writing -to d -swit ches -din ners -h q -gabri elle -pensac ola -cir cle -expo ses -ev s -riyad h -pro men -o ck -sa j -cit ation -brew co -jo si -ep aper -dri f -point less -tang led -cri pp -line ups -fairi es -daz e -mour n -bla dder -sal z -bur undi -book mark -the people -sub sequ -princi pal -sk er -court ney -a oki -rac ers -ad m -mom a -critical role -hou n -shed ding -sa ka -ace ous -mck ay -hus bands - ½ -me da -accu sations -ro sel -nc is -witne ssing -or ama -go ds -hil ton -el man -ÃŃ n -meg ap -cra ven -announ cer -crit eri -sheffiel dissuper -milit ant -consu l -hoo ded -aby ss -b x -ma dam -lo cu -mary am -manic ure -grat is -ac tresses -ros ario -this dayin -king ly -gn ome -cel ine -r ous -he el -lil ac -vish al -ab h -thor ns -s ls -ne al -construc ting -be ren -s lang -ma ins -far ra -sar ko -pai ge -gu iller -l ala -ice berg -nou n -plann ers -u mmm -ou ses -ill ary -ma an -box ing -zi pper -srin agar -migu el -o str -mp o -responsi bly -lan terns -appli ance -x b -gren ade -neglec t -dy sle -ham mock -ne ctar -wit cher -r gv -di ence -ser bian -seed ed -cru z -bi sh -sp he -e q -sky rim -alge bra -phil ately -bungal ow -ge off -y ves -demand ed -consider ations -the vamp -pawan kalyan -co ded -grit ty -erup tion -se infeld -uni denti -ëĭ Ī -wor m -ac us -se ung -dun g -ro land -su d -di visions -ab lanc -shor test -j f -p oun -plant based -be to -tough er -mc o -don et -mark us -v fl -ðŁı ł -open ing -co ward -caber net -o xi -burle sque -sand ra -su mo -consi st -tho t -cay man -motor ola -gutier rez -d slr -y w -no bel -nov ice -moms demand -grun ge -sp or -d cc -pre sses -sli st -allot ment -voc ational -ft c -pu ja -lo ven -utt arak -tan dem -sh ep -come dians -anat om -cant wait -healthye ating -west side -mar gins -chi ang -asbe stos -stupi dity -proble matic -fit bit -: $ -ceil ings -shu a -protec tions -bio tic -beng ali -re sts -bien nale -tim o -cul min -e minent -affe ction -unbeliev ably -individu ally -canvas sing -wh itt -nov asco -chin son -h pe -go w -gloucester shire -pa o -thresh old -chev ron -s ine -we ther -pp ie -aqu ino -antwer p -âĸ ¬ -po on -inst af -equ ine -cinemato graphy -nbaf inals -vali ant -kil kenny -te rence -syste mic -sr l -p ound -made ira -pl ough -tre cht -mat ed -mp d -ransom ware -ph in -li qui -bb ce -boom er -i standwith -con ju -r te -nar a -foo lish -da shing -vier nes -br ite -da u -juni per -ai da -you now -ra zer -de i -repe ating -comfor ting -adjac ent -e to -ca sted -chat ur -mu er -syn th -san itary -mac le -independ ent -law ful -e erie -h or -ðŁĴ Ń -am rit -vel o -station ery -mu f -may may -contempl ating -elabor ate -gre gor -dri es -ac col -ภļ -schwarz enegger -ill nesses -day break -follow back -collu sion -electr onic -jo vi -hiro shima -ta w -hom ec -mic ah -qu itting -fro sting -ben fica -hel i -s ical -pic cad -corpor ate -ment orship -you are -sing er -shi va -ru ne -ing er -ri um -play able -doo p -wil low -ter re -ni p -at d -war bler -profession ally -er ase -proce ed -pedestri ans -mis chief -ben ding -alas kan -c kett -mo p -dd les -shut ter -ge ared -atene o -ma deline -g ations -o sha -der ick -sw ild -an gry -pat ents -hun k -decre ased -fr y -ðŁĴĸðŁĴĸ ðŁĴĸ -sal on -quant ities -d ario -ni gel -ku ma -jen n -happ ye -xx x -rex perience -pro s -au sch -rele ssly -ham burger -fuku shima -er ne -stat ec -ren d -may field -j one -lef ty -bern stein -sm il -gener ates -fore station -band its -ta yo -r ca -ac ci -rodri go -kn app -elo vers -vege tation -u ral -le ft -ħ ï¸ı -worl dre -sur i -embar k -w son -ba you -mu ller -mo vers -ðŁķ º -presby ter -l f -cre e -bat b -sal am -demonstr ations -an ec -n pc -it ics -to graphy -re inst -thur st -tal e -off ences -smart city -bro tha -ofthe year -in valuable -ear n -ðŁijı ðŁı½ -kre mlin -gra dy -town fc -guern sey -ma ha -contag ious -dre x -be en -( £ -nati vity -k tm -somer halder -comp ounds -íķ ĺ -" â̦ -af g -ott news -h ound -fire fly -cil an -donet sk -volunte ered -ak ira -è ª -sing ul -st h -dro wned -mand o -he ir -ðŁİīðŁİ Ī -tax is -y uki -vel d -k ans -el k -ran ts -hash tag -t eng -ro g -a at -gru b -e ber -in india -colo ssus -sig ni -so ever -mile stones -der o -differen tial -phu ket -master mind -an gh -mel ani -bro ker -actor vijay -stun ned -continu ity -af fl -vo cal -perenni al -fianc é -in complete -hun ts -re issue -domin ates -tur meric -ro am -ri on -bag ged -nas sau -fu t -x ox -national trust -jo ye -san o -hearth stone -dis respect -le es -h se -siber ian -offe e -re stock -wolf gang -re gan -plan o -un wind -re par -mil le -] , -skul l -fat ally -concep tual -ðŁĮ ² -f é -ber to -b ms -u a -mag na -notre dame -le te -la undering -heartw arming -buffe tt -go at -pe abo -wind mill -v ac -continu ally -az alea -mem brane -can cels -make yourown -athe red -p to -tor pe -ðŁĺ ł -ðŁĴ § -sc ares -le aking -z et -pix els -ac i -kh il -marath i -ðŁĻı ðŁı½ -u la -tam u -chandi garh -z agre -aa b -pronoun ced -aubre y -sand er -pun ta -har low -ic elan -celebr atory -so t -unci ation -stru ly -mc dowell -deepi ka -remin ders -my stical -ct c -chat ted -s ica -bar gains -ch hat -ru bin -m net -oiland gas -pel ican -o at -mor ality -k our -i h -nu clear -gc u -ric her -vene zia -m ma -le ith -ac company -rich mond -sports net -ba ahu -smu ggling -mm i -ðŁĩ®ðŁĩ ª -twi sts -sahi b -.... . -amb itions -il lo -histor ical -fo rec -show biz -pon ies -chas ers -remo del -will ing -prince sses -am ple -cushi ons -ac les -lot r -da ch -an the -in corporate -new bury -ki ri -fried rich -ab v -ball ers -alber t -ðŁij Ń -let i -nan op -ci de -anal o -n sf -)) )) -griffi ths -valen ci -ro ano -fun run -babys itting -ca day -ent re -u ck -slu g -tic al -the sims -ro ar -car ney -g am -sto we -fi d -bun ny -sham rock -pe cu -mol ina -go cougs -con tributes -transform ation -mo y -v aj -sever y -antioxid ants -thir teen -sight seeing -l j -reversi ble -odd ly -hoo kah -nou vel -hal al -fe i -stab les -mul t -ho pped -bra ids -inter change -ghana ian -ww ww -eth no -con junction -ago v -ye ti -earth and -ts p -con serve -heir loom -metaph or -woo f -tor io -self less -n wa -em ilia -yl ene -y xe -gi ar -moder ating -pro bz -b fi -ne er -du mmy -hanuk kah -we bber -k v -eye brow -dag ger -su mp -ra ges -ork ney -tb o -hal sey -assign ments -tr onic -scri b -co on -an war -# âĢİ -jal ape -flori da -qu aid -haw keyes -âĻ¡ âĻ¡ -street car -ro g -dat lantic -gran ola -un changed -expect ation -Ù ĩ -mar lin -gu mmy -ðŁĻı ðŁı¾ -awareness month -oil painting -mu th -per ch -jun to -villa gers -mor g -che ated -web comic -the future -d ps -la kings -men tioning -vo or -ident ities -accor d -mc gu -l pga -rum our -massi vely -m pls -heal y -d ate -sp oli -re visited -on t -al and -scru tiny -lakel and -bl ending -< / -an kara -jami edor -metab olic -f ences -ann y -å ħ -semic on -oo tt -space ship -wack y -le ta -ap ac -she e -in herit -do res -ðŁĩ¨ðŁĩ ¦ -gent e -tw ick -ri ms -gal ve -de ville -king fisher -scorpi o -ow l -al ar -vari an -ðŁĹ ĵ -vene tian -star dust -then orth -q ing -har rington -consul ate -spectac le -ho bbs -tur ks -gre er -mat ing -ðŁİ Ģ -ðŁĮ Ģ -direc ts -í ĭ -pompe o -vo iced -la os -tz u -pro me -pri sm -mer c -fortun ately -bc fc -mcdon nell -not sorry -smi led -t ba -for war -mid term -dar by -we instein -up grading -wol ff -bron co -cab ello -ðŁ¥ ĩ -fi able -shar pe -bat tered -sat o -myth ical -instap ic -pre pped -eni um -e spo -di aper -explan ations -who pping -ragn ar -pe el -antibio tic -l acks -harri son -li sm -au l -qu ail -martin a -sent encing -sc ams -di di -tr onics -ãħł ãħł -go ff -za in -param ore -cha ined -clin ton -li ff -cott ages -em on -reve rend -consu mer -ce an -t any -lum pur -e bay -sto ol -ðŁĺ» ðŁĺ» -ta pro -h ath -modern art -just ine -prover b -app y -tra x -mani fest -am bu -nai k -pe pp -r sd -mer chants -kitch ener -shi fted -li zz -âĺħâĺħ âĺħâĺħ -âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ -uto pia -tom o -ou ted -com ers -chiroprac tic -book club -cin dy -pro hibition -se uss -ë¯ ¼ -thin kin -rr rr -go fund -t ack -om b -catastro phic -ling u -guild ford -bo td -ॠĭ -plan ter -^ ^ -win k -kath mandu -sto ppers -smooth ies -re efs -hin d -bell amy -Ħ ë -waste water -vo or -nat l -! ] -re el -y ap -scoo by -work space -corin thians -bl un -obli gation -g bbo -dy son -cra vings -ell ington -dap l -wre xham -earthand clouds -uk runchat -positi oned -kal b -four square -jo ck -im pending -even ing -ath y -pro claimed -c ites -ann apolis -san i -mar th -ir l -accom mo -ka a -fin a -y aa -di sper -ec ar -bha k -will y -ðŁĺĢ ðŁĺĢ -mcder mott -mo j -gener ational -u said -train ing -lon ely -lo res -impe cc -âĢ IJ -beav ers -ma ki -he b -aap l -å ı -wolver hampton -leader board -me u -c fa -easter n -hu r -civil war -ou rage -hor ned -le high -awar ds -evi dent -gi gab -r ous -ma del -ro byn -ur gently -k ors -en as -heis man -bam bam -fab ian -f om -evalu ating -assemb ly -out sourcing -hun tsville -ðŁĶ ª -justi fied -cashi er -sp aper -buc keye -analy tical -illumin ati -au tho -o j -sha de -geel ong -wh ey -he aton -terri bly -ele k -un charted -sd live -moto cross -her mes -dar shan -dar lington -cash mere -gri pping -cilan tro -pun ish -... : -ðŁĴ Ħ -inst ance -der i -lo bal -muk her -sp ar -thin ker -fre mont -com piled -color ado -vig ne -sm d -whe ad -villa ge -le ek -formula e -ta res -persist ence -?? ???? -ped ago -he z -alzheim ers -vul ture -off ence -is great -suff ra -kick in -h mmmm -broad way -ï¸ı @ -art i -alli son -endor ses -ry u -lolli pop -soy bean -kend all -cer a -inv ade -( ðŁĵ·: -conver ter -car pets -ho bo -fr it -pe ac -es qu -ern an -ou f -an il -di ffer -ch ing -bre cht -sp g -daven port -stra va -sever n -n gos -stor ians -fe te -parame dic -j hb -al amo -sne aking -gold coast -roof s -isi l -depic ted -projec tions -nu mb -o ss -ep i -glu cose -zid ane -infin iti -íĺ Ħ -ran som -ton ics -fal k -g ler -ou tw -re ss -week ly -the on -n ole -ðŁĩªðŁĩ º -vol ley -sum mar -neg ativity -sam son -ye w -aus votes -ju l -ju dy -f art -pra yed -pal ate -multicul tural -double header -cycl ones -pier re -ãģ ¨ -âĺ łï¸ı -rt w -conver ting -wir ral -l ari -ir relevant -austin mahone -an che -ya an -sd f -$ . -explo ding -ulti mate -prof ici -gofund me -cell ence -ep stein -bul lied -sep tic -à® ¤ -lu mber -cu ff -vsco cam -pl or -ภ¥ -se ok -ro to -venezu elan -sor ta -spir ited -daniel padilla -team sisd -radio active -icelan dic -ðŁĴ ¤ -ver e -accommo date -shi pp -ot ter -ol ina -e go -su la -san antonio -de as -simil arities -âļ ¾ -y om -bro ward -å ° -can cun -veri fy -on te -candle light -ìł ķ -inf ants -az am -ðŁĺ ° -le ven -un stable -bloom ington -x ford -con tour -y p -innov ator -histor ies -po y -lolo lol -ex pires -cat alo -bill boards -an ab -el ic -novasco tia -fa ire -ìĿ ´ -rock well -gr ille -az tec -joh or -ur struly -fi ren -dun lop -id le -port man -jo es -tx hsfb -hol m -cham ele -under world -lo ss -ti em -therap ists -past ure -pa ste -ing now -vul can -ra gon -lar kin -o shi -ho co -child hood -umb rel -success or -kath y -iz en -° ï¸ı -share holders -ol ga -ai b -he ap -fl aming -ro u -air tel -rat t -z ane -vo w -thor ough -sn ag -par th -un conscious -ve y -new release -gh ee -croati an -facilit ating -swan son -astor ia -to logy -master y -ðŁ¤ ij -bil bao -trou pe -the ori -chey enne -ro tt -shore line -gra sso -master chef -+ ) -vi x -ellen show -as g -an ak -ku ya -safar ilive -debu ting -blu m -list ener -v ins -book shelf -smart cities -makeyourown lane -; ; -ðŁIJ ¯ -ri zz -on ward -bull dog -bear ish -vir uses -fri gh -lin den -we iser -sn t -gon a -dre sden -fl anders -cu k -wheel ing -ba u -atu esday -surf ers -swi ft -mc call -arbitr ation -aw d -mon c -b ine -at x -re fr -mi ro -po sey -n are -rit ter -âģ ¦ -play book -blow out -sports manship -s oooooo -malay alam -gri ms -bur bank -infin ity -sar gent -oit nb -joseph ine -ski pping -par kin -excur sion -semin ars -jo har -par tridge -post game -ll ll -blan che -temp ting -m na -lu ka -is ers -to ffee -bar ron -he mmings -sa e -go hawks -cu pid -li mbs -con se -un common -z ada -head shot -so ils -pione er -mam ma -sem itic -pan dey -jamiedor nan -spl its -vel a -son i -ra ff -t mobile -âŀ ĸ -pra wns -lit er -enjo yment -egg plant -tu b -cultur al -us ic -suspici on -sy cam -summ ed -ma du -ho ck -up wards -eye ing -ri ve -assas sins -âĤ ¬ -out fy -chi ves -t ner -la is -por ridge -sad dest -w cc -vick i -sna ils -biz italk -mill an -ðŁĮ į -sam oa -j ing -mi key -gu j -chel ms -eli gibility -arma da -thro p -surger ies -ãĤ ¿ -mo hawk -ex its -me m -is lington -c me -land fill -kait lyn -ðŁİ ¼ -combin ations -tomorrow land -ver b -cor a -pre cisely -na om -ðŁĨ ķ -shr ink -sof tly -merce de -mand el -poo dle -ball erina -sop h -jux ta -y at -ary an -hesit ate -lo wered -gu lar -dungeon sand -ron an -my ri -sp f -men opau -gra sp -pa thi -fe asi -fla w -shi story -ste ward -gg le -fay re -cli que -credi bility -yo g -sec tion -mu sko -se ville -no tt -cal m -mate o -indic ted -fi ba -by l -lin o -u kin -!! # -enig ma -siri us -bu sc -ðŁį Ĭ -mac kerel -psal ms -a at -tomorrow spaper -ðŁĺ ĸ -p fc -........ ... -shre k -mul let -o sh -danger ously -immen sely -am ur -ðŁį Ĥ -pro por -sy a -london marathon -abo ve -obli gatory -pro v -ra cha -alex is -pri mary -sh h -ether net -d stv -cou gar -un lucky -ni l -steak house -mel a -fc bayern -cause way -ca therine -fluore scent -nx t -to kyo -au sp -releg ation -qui zz -shored itch -proud tobe -promo s -inter acting -home brew -da esh -w pg -stead ily -provin ces -bal lots -i ah -al to -< << -you u -ri ley -prefe rence -tra verse -incen se -am munition -ho dges -# @ -hail state -tart an -witch craft -vent ilation -liber tarian -! â̦ -ow es -% ! -ong chang -bru shing -le ic -fi ber -under attack -down load -ex pir -hy o -pompe y -mc bride -y ag -stre e -com bat -ten ding -ai ra -gug gen -ab ra -in na -fli ps -aw al -m ach -dol lar -inspir ations -z um -o du -it ty -video game -aqu aman -har u -bel fast -je b -but ch -us gs -calcu lus -go yal -mor gen -x finity -stand up -contrac ep -sab re -na be -in secure -gener ously -epit ome -l w -t ca -narr atives -don nell -pand as -ber gh -tu t -ker al -fel icity -br ampton -quinte t -nom ore -ðŁĶ ij -lo i -alham dulil -ðŁĶ¥ ðŁĶĹ -ston er -shaw l -clin ical -bren dan -gon e -fla wed -tri ppy -j g -al location -po aching -ve vo -mo cks -lef tist -bon uses -condem ned -abil ity -st ating -microbi ome -bio logist -for you -wahl berg -ss or -ift ar -w ul -ÑĦ оÑĤ -pom er -me me -ver te -tre ll -tra it -in let -hormon es -deliber ately -vill ar -battle ship -p bl -tw enti -ho kies -dal ail -say a -may fair -han s -die ts -⾨ ⾨ -od in -hot spur -pap i -k ana -k amp -fin na -flo tus -ti ans -unic orns -tribe ca -chang ers -fore ground -out a -inv aders -gett ys -tomorrowspaper stoday -mac millan -hand written -w fp -u de -state of -base d -âĺģ ï¸ı -cas m -psy ched -histor ians -fol d -d da -ag grav -p ans -green way -au sv -ðŁĺ ¶ -shradd ha -inde x -be sti -zim mer -t ness -eye shadow -ot te -go ts -distribu ting -pro min -yo l -ace a -tram rahim -hoo per -supre me -jam min -intu itive -quali fications -sli m -sid di -jay ne -tri pping -g tx -pun s -e manuel -om g -mid summer -in to -succul ent -ri en -new mexico -o or -hoo king -in f -ðŁ¤ Ŀ -flir ting -na hi -g friend -t ps -hel ix -z s -on ie -ct f -kri s -irresi stible -fla p -ðŁijıðŁı» ðŁijıðŁı» -us wnt -ru d -ram ps -pin oy -ot w -lol z -low ering -favor ite -t mc -phra ses -her mi -aver aging -em br -ben o -estu ary -sle eve -ribb ons -ta sh -ภ¹ -x f -aw gs -sun ited -brew eries -anir ud -pun ches -ol die -ip ads -wi fey -land lords -d ji -gun ner -íķ ´ -tex an -ex op -cas sandra -s off -ðŁļ « -igh ton -bak ers -awareness week -v all -ear p -bts bbmas -apologi zes -âļĵ ï¸ı -was ps -states man -snat ch -watch dog -ra fi -after party -spi ke -j er -peri ph -r nc -mu ll -le en -shi es -li eu -urstruly mahesh -mer ton -de sai -shi f -ðŁĮ ± -pe dic -gos ling -arrang ing -ww g -gen y -you uu -netfli x -e ttes -k wi -bernar dino -am iga -Ø ¨ -kashmir i -t ings -emer itus -de cat -ab domin -dc i -pha ses -d jan -be am -op ry -i shed -the ellenshow -the st -habit ats -to ons -mclau ghlin -ri pper -micro biology -tal aga -clu eless -ss u -cro che -bro mance -longe vity -zagre b -prev ented -tra ve -spo ilt -darry l -migra ine -al cat -dd dd -vi v -ser pent -mat tel -jam a -con quest -î Ħ -sam sung -presbyter ian -ket ch -fire fox -mo tif -le c -cho pping -cher no -j ann -ðŁIJ ° -pro lon -wake up -conver gence -mersey side -heart broken -lo oming -hal lucin -mai ze -commun ism -mo h -twitter storians -serge y -res eller -favor able -ed gy -re iter -mal aga -live me -ka hn -pul sion -big g -kim kardashian -ati o -tyr anny -ru ption -q ant -pro ven -by z -pu shaw -kri stin -e er -tar dis -ri z -awak en -mi ko -un documented -path finder -indirec t -resemb les -h ler -conce aled -scand al -re im -d nb -cr itters -attend ant -apprentice ships -aa u -scre amed -l su -fa h -har bour -ed d -bat sman -li ss -mi sha -spani el -it f -advan cement -fa c -close up -cecil ia -medi c -narcis si -lav ish -gi ac -ma ys -le it -wine wednesday -pushaw ard -let to -curren ts -bug atti -out ine -w j -un do -ler osis -devo tional -ðŁij « -on na -fais al -sa una -himach al -am ii -à® ® -di zzy -screen writing -ph x -sp n -ick i -ag irl -fi shes -wb z -pi m -bo ar -ac id -! .. -rocke feller -n ga -dra stically -simpli fy -dru mming -autum nal -gur mee -lor de -jo ann -give up -b our -am ura -der land -sim pler -wat son -tri dent -concor dia -bel lum -bre k -dum plings -vi on -dungeonsand dragons -sp ri -ascen sion -wil datlantic -u st -rob ins -legi on -insi st -jar o -gue ss -so b -bigh it -pool side -negoti ating -mc gill -bil d -techn icians -miti gation -ajay devgn -b to -ant en -cosmo politan -ðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬ -patri oti -temp er -promen ade -nav ajo -nam m -wrink les -dc fc -le ach -bru nette -r f -cout inho -al ti -tradition ally -op tome -na z -accord ingly -rec ard -de ets -sw ell -po sure -whit ening -strang er -illi on -here ford -u wu -ro bber -cotsw olds -cl en -gor ge -nam aste -re lish -gri ff -adren aline -bla sio -val e -ê ² -toler ate -rail minindia -jen sen -ho ven -el lu -ob sole -eisen hower -unidenti fied -than niversary -body guard -Ø ¯ -i dge -sch al -stock port -sn i -re taining -po po -pix ie -oli thic -ki er -ha jj -sa z -cor bin -!!!! !!!!!! -v it -me gat -de h -circu it -af fleck -theore tical -hope less -u ab -slu mp -b ice -jam med -let stalk -can i -side ways -labyrin th -re fs -ha hn -jare d -ðŁį ¹ -jam bo -ph yl -enhan cement -c tr -ful lest -se ye -do ba -cho ic -yo s -cb j -andr é -re watch -pri ma -doctr ine -for gets -u hm -ar ound -u le -art lovers -shi raz -har th -ex tor -Å ¡ -unexpec tedly -eli us -y x -em my -se ac -ðŁijĩðŁijĩ ðŁijĩ -correc ted -com bu -wom anc -cou gh -what son -publi shes -divers ity -back bone -lock down -mesmeri zing -nor te -ma b -desig ner -í ģ -ra gh -mole cules -get outside -the beatles -semicon duc -nach o -lun es -ham mers -sul tan -o on -fe ren -att ach -ar qu -uttarak hand -s ash -; - -tre ad -i ko -ar thur -scandin avian -r ation -ga el -charge able -fish y -v ma -hand bags -char a -ay ne -de fam -sett lers -qad ri -pal ais -in wx -apocaly ptic -poo ja -a es -at ories -proof ing -n lp -ts la -v ina -li do -dee phouse -informat ics -v v -pp ings -di ss -à ¯ -uhur u -st ony -betra yed -b aff -my ra -as pen -allow ance -tam ara -ci f -cor bett -ser ge -di go -ambi gu -pain ters -p cr -p ca -nom s -lo ft -ve e -opend ata -ðŁIJ ± -alex andre -identi fies -fantasy football -re production -brom ley -ware agle -mm er -p ss -cu es -ay at -hut chinson -sar ac -jack man -ira h -ap ink -col s -aussi es -ex ecs -day ton -ðŁĻ Ĩ -im v -har am -chuck le -authent icity -ar do -incub ator -ภª -photo shopped -embrac ed -fight for -gor man -zz zz -schol astic -cri sps -te apo -mid night -ga ine -col lier -s ate -de tte -å Ń -imag ine -i ff -tw ili -i fication -teat ro -nor ma -es ur -emergen cies -rise up -r inger -hass le -cait lyn -tranqu il -vers a -se b -over look -gin i -bo go -se re -may ne -henri k -contamin ated -rhapso dy -pro portion -wildatlantic way -âģ© . -organis ers -tran e -stand ard -sper m -laun cher -ric ci -her ts -paper work -showcas ed -mer yl -pen a -p imp -disa strous -^. ^ -phar a -x is -fron tal -sw irl -sp ills -swag ger -smart watch -sizz ling -savi our -cat ar -bb cr -refurbi shment -dr is -citro en -absor b -patrioti sm -il leg -chro mo -fresh ers -ru s -lim iting -ef ish -down ed -man dir -hazel nut -p all -mac on -disappear ing -quali fies -bo on -bar racks -am ine -gen dere -ðŁļ ĺ -j es -ãĥ Ń -qu ito -middle weight -sch au -quad ru -aci ones -limit less -ðŁijĮ ðŁı½ -ch man -ar av -regulat ors -it up -batter sea -mil ford -g z -tic king -gh ou -cru shes -tu tu -dread ful -fam ine -for change -dalail ama -ðŁĴ į -whit aker -hash mi -h us -vo d -bet te -aa ah -iso o -ðŁ¥ Ī -ha ar -la ine -b v -all day -spr out -indie games -free bie -gree ks -but ler -ill in -ha al -ware ness -si ma -public health -gam a -wa a -oun g -goo oo -okin awa -off enders -im pose -ho c -young ster -story teller -sc ap -figh ter -+ , -whit es -music monday -re za -go ducks -bri a -mi um -cas per -cru mbs -a ad -marti alarts -ch p -ri gged -tn g -harve sted -sa k -do jo -mill wall -b nw -oc d -histor yof -t mr -si rens -fan ci -caregi vers -vir a -son i -recur ring -acknowle dged -ðŁı Ł -oph ile -bu cky -stre ssing -roo k -di gger -vi val -san do -fle et -si ers -sel caday -refre shed -anti fa -a que -po lo -disappear ance -de mb -âĮļ ï¸ı -ren ted -ber ger -g mb -cu la -ss al -goo dy -u hh -marcel o -w anna -soft ware -shop small -turt le -tom as -fri sco -ðŁĺį ðŁĴķ -jim enez -c su -day z -an do -wyn ne -choreo grapher -cerv ical -trail blazers -ed g -zend aya -travel blog -el s -whole some -co g -lab out -ar ney -del le -su isse -ma si -ine se -om be -fi ddle -re claim -pa u -wat cher -sla in -ber ty -opti mum -el ites -min is -tur key -patro ls -ger ard -au reli -wild ly -wal tz -br gy -w ob -cre st -+ ++ -ve z -fro sted -davi do -the x -param edics -p into -han k -du pont -ur g -fo stering -micro poetry -spec tre ----- > -ne uro -fri da -music al -galve ston -e ffic -sc ape -pal azzo -th all -pro visional -p js -au re -ðŁĶ ľ -mam amoo -kit ties -cre e -wa k -lo ool -lu pus -cn blue -à º -ðŁİ ¬ -rac ed -tro se -om as -stri de -co ors -⤠µï¸ı -in comparable -cy ril -broad er -arec lipse -ðŁį Ķ -inter val -ti ru -co working -w aco -a ham -a bee -flouri sh -the times -ol ini -kick boxing -lu cer -at la -as un -casser ole -mi aw -lobb ying -jan ice -cir que -re flex -le ary -sanat omy -tem pest -se mb -mur dering -us av -ro bo -on et -p cc -nati ves -life of -sa ha -ruth less -rel ates -appeti zer -pye ongchang -nor d -er u -a thing -ug ly -pl ying -bran ce -organ ise -kend ra -dat o -chees es -par ma -burn out -a stra -pre toria -adjust ment -uk u -sl o -li ken -fav ors -cli ve -be ets -snow donia -go tv -sy n -open house -pan i -portra yed -sl ated -me cca -ren al -supportsmall streamers -staf fs -da o -bi ker -vik tor -tit us -admi red -ðŁĵ ± -hurric an -he ats -gl ory -photo genic -mer i -de por -burn ham -or angu -dj ing -impre ssionism -ign ition -ca i -w ynn -de pe -cove ted -colla gen -sau s -or nam -administr ators -ss on -nh politics -hahahaha hahahaha -aspir ations -r gb -swol len -so we -sc r -diver gent -hou ghton -han oi -d ory -ni ki -land ry -b cci -ðŁijĮ ðŁijĮ -is mail -tri pod -her d -bhat t -dress age -tab by -ingu ish -hur on -à³ į -à ł -to das -evangel ical -chor ds -st john -slo ppy -marty r -face book -ali ght -sen sei -kath niel -r ites -zi one -u o -revel ations -weight lifting -pan o -nc wx -ac ton -à® ķ -Ø ² -som a -à¸ Ĺ -respec ting -mar che -fore man -be tty -ki k -shi bu -po on -argy le -k swx -et z -mar bella -brac kets -stand by -fire side -defi ance -v ex -britanni a -in habit -appo int -piyu sh -le ash -sci ento -fla sk -sen na -> : -at roc -sand erson -id lib -dhan ush -ðŁĺ Ļ -en thr -hit ch -de dly -al ley -dor k -mon do -cudd ly -mis sin -ye sss -night ing -j pn -w ary -ump ire -ma z -ê ³ -bab s -ĭ ãģ -stan ford -posse ssed -exce eded -ðŁĶ ¶ -wall art -tra p -j il -hi bis -sp ying -scri be -khali l -trans lator -lu mb -di zed -ch c -super vision -shut ter -ja g -_ * -yester days -ms f -hi hi -gonz aga -gille spie -vive k -ec static -this morning -ch us -ed es -ston ed -be es -ðŁĩ¹ ðŁĩ -tur in -ho ver -at rics -ster n -sam heughan -auti sm -mi ya -eye witness -writ ings -travel tips -chut ney -px rtg -keny ans -my stic -k rit -/ $ -red head -world ly -am us -op la -le ve -gab bana -se en -o clock -gang a -keen an -sc ent -ol dies -go green -corner stone -comp ly -con cours -ðŁİ¶ ðŁİ¶ -ha an -con fis -aw son -cle op -î Ģ -su zu -sau té -al gar -subscri ber -este emed -ãĤ¤ ãĥ -worth while -mel rose -flo ck -bri ghtly -viol inist -p ere -sli pping -and co -si gh -ha van -cu lo -m sa -fibro sis -matil da -ra fting -aw ard -ë ª -mm mm -ge aux -ste iner -sin n -help ers -beet les -ai mee -tai wan -pistachi o -mac beth -m zan -descend ants -on sale -in r -il m -grou se -sa ig -mo w -bi gre -adjust ments -tu la -mathe w -transl ates -mu h -bol lah -ðŁĴĽ ðŁĴĻ -amo res -ab outs -bomb shell -bla ster -x avi -s ns -k roger -ga ther -erad ic -daf t -chem o -ben ches -ðŁĩ© ðŁĩ -ut v -our a -n ko -gator ade -biaf ra -ok state -im danielpadilla -dom ains -open ingday -kid do -do i -ric e -day care -mac millan -ba thurst -cheer leading -ðŁ¦ ģ -cash back -k won -hob bies -exem pl -ries ling -âļ ª -ag les -ny s -every thing -nav is -ad di -magne sium -faceli ft -ark ham -grand es -extre mist -don at -vit ality -pump kin -be tta -sl td -arti san -li by -pe aked -ah hhhh -mary am -assi m -un sc -ment e -al aya -low ers -ar as -gri ev -le ip -gr ati -cri ses -spr ints -exe cute -w to -ms d -mag ical -re viewer -spark les -juke box -ðŁĺĤ âĿ¤ï¸ı -pay back -licen ses -dun kin -bel t -lake wood -h ateful -bud gets -rev amped -ph erson -ky iv -went worth -ro sen -cru ise -gi ggle -def star -assassin scre -ym outh -win kle -w fc -band wagon -b kk -w iring -kear ney -south side -pe tit -! ðŁĺį -nor dic -mir za -mu gabe -v l -scon es -k tv -sand al -du c -m alls -ðŁĴŀ ðŁĴŀ -it c -al ay -im pair -un rest -flo ss -c é -ab ou -var ying -muse o -ser ver -di ya -hibis cus -ero y -mer ritt -fin dom -f pp -un usually -go tt -conting ent -ali aa -ball on -jo l -hi ked -zy me -ay r -ag n -ga z -perio dic -spar ty -practi sing -lin ton -tal is -cy pri -womanin biz -radio disney -ðŁĮ ¼ -jump ers -endo cr -ðŁļ¨ ðŁļ¨ -and on -shar apo -mi er -ma sonic -fac tories -vi en -bb ers -ìĽ IJ -hol d -ke bab -be ak -approach ed -ac milan -mun ro -ko sher -excell ency -negoti ation -walt disneyworld -cr ouch -te asing -suppre ssion -en ya -b ce -transformation tuesday -cal lie -vis was -p gat -ic ted -end ings -esc u -recru ited -it fc -collabor ations -g ino -snu ck -ausch witz -i fc -x ii -ke sha -ger vais -clo ak -x l -sa ad -prob ation -pre cau -mac in -anasta si -le k -e azy -daysof code -mariah carey -yo g -stit ched -boy friends -sh ar -ph ile -ag u -twin kle -phi shing -week ender -ic ton -gurmee tramrahim -al ton -l eness -all an -pen ultimate -kry stal -go u -lan de -dis mant -ab using -nor se -pat erson -ed mun -ap an -xi umin -sk el -cat walk -re act -wal led -t angle -br yn -ve to -super moon -cas ablanc -appreci ates -ski d -bo th -catal ina -ele ague -cyber monday -cau tious -ðŁ¤ ĵ -nov o -hamp ton -ha ye -jose f -var an -lo bos -roano ke -orph ans -tt in -squ ads -ishqba aaz -black panther -e tu -k sh -cru mble -cess na -reli eved -scul ly -pollin ators -explore canada -ki es -kam loops -kir an -pri mal -sett lements -hot spot -brain storming -ce dric -bi ennial -sh ant -âĻ¡âĻ¡ âĻ¡ -do on -hear n -walk way -fe m -ve al -deport ation -tox ins -elimin ating -descen ding -by the -bla sphe -ha sta -comple ment -as cent -ri ga -provo st -âĸ ª -wee ping -anti semitism -employe e -unearth ed -pin o -natali e -bla d -ang ola -lock heed -in ian -ag r -ni ster -im pala -m ke -fan atic -âĺħ âĺħ -ðŁij ¸ -lu ch -simpli fied -gall ery -econom ic -cy borg -con i -sel ma -in ception -ko ala -dv ds -cre sted -m mor -visi ble -n sd -ðŁĻĮ ðŁı½ -w under -refriger ator -re opening -e era -carou sel -as p -balli stic -victor y -mo tive -tre y -sharapo va -si i -mon ter -int end -west chester -sp e -cy mb -vi dal -ll ama -uni v -fin er -crafts manship -jazz fest -b ch -ag gio -n cc -lamb da -tranqu ility -cis co -ba den -so bbing -of i -go ta -ru mored -war med -ore an -ac ton -mar ci -gh ani -âľ ĵ -as sorted -pembro ke -pen elope -da f -at ty -aim o -pretz el -carni val -than os -ko chi -mer sal -ham radio -ar twit -cas c -guer rilla -kush ner -k app -al ise -todd lers -steward ship -o tti -ter ri -tem pe -rest less -vit o -zay ed -rsp b -pi on -hi ppo -haw thorne -in as -am ily -nut cracker -lo p -d ali -tro pic -ðŁ¤ ł -ul o -jare dle -py rene -pale o -usa ir -m ould -it ated -gene tically -biom ass -ðŁĩ³ðŁĩ ± -do dd -practic ed -monarch s -un manned -m buhari -am al -photo gra -ko ol -bren don -ju ices -cu re -world bank -poin ters -ðŁĴ Ŀ -tur f -le ds -bor ussia -bapti sm -warwick shire -moun ts -gay o -be gg -co pied -asi ans -k g -moder nist -gi d -front man -concentr ated -y t -sc avenger -iron ically -adi c -ps n -ðŁ¥ ī -cultur ally -yu v -mac arthur -fertili zer -be withyou -ri gor -min ors -z oning -âĸ ł -ri r -adole scent -vin ny -ren g -sand stone -gu et -we sth -ple dged -lac ed -sp ide -v ai -ty coon -seiz ure -du p -appalach ian -ro k -cathol ics -sey chel -posse ss -la ger -jo di -cham p -stra s -d ina -cent uri -cal der -blur ay -ðŁĩ¨ðŁĩ ³ -mo do -an nette -youtu bers -chap s -ang ling -label ing -a qui -pk wy -ly le -bi sexual -lit ur -dug out -li bby -grey sanatomy -sub stances -august us -rall ying -fi del -ing ue -äº º -hallmark channel -tooth brush -m á -adi rond -ag gi -ðŁĵį : -cru sade -tax ation -k z -i ver -dou bling -room ie -wa b -en rolled -az on -a ju -grand children -as df -ðŁ¥ º -mat ic -ough ton -utili ze -ðŁĴ £ -pon der -rais in -dys function -co bain -butter nut -e man -su red -dri an -and friends -with the -on omy -heine ken -bri dal -leader ship -pyram ids -deutsch land -jo cel -bo wel -y qr -horse power -be acon -ing eni -gra dient -fer mented -mo om -thing y -pot assi -wrist band -bor d -bo died -ðŁĺŃ ðŁĺį -ma pp -ka u -cyber punk -ph ish -loo king -co ates -ap ur -am ie -uk labour -at in -g la -adop table -shel by -v illi -ri ya -m ingly -cli mber -bumble bee -ðŁĺ ¸ -c sd -âĿ ¥ -hospit alized -c ki -hat er -ch r -re tina -it a -fan base -beat rice -gwy ne -go ss -fo s -favor ited -swachhb harat -mal ade -mon mouth -" [ -si van -sh hh -command ing -sains burys -wee d -g man -ss w -rep tile -iv y -tro pics -roll ers -over cast -ex position -masquer ade -man crush -wa ist -spr inter -sle et -le vin -j pg -_ ( -o pel -explo it -ap a -po we -wrec king -jong in -or b -er ick -bo sco -pra ising -ber tr -to wing -in security -ku t -resto cked -rr p -prescri bed -trafal gar -per t -g ases -app rais -g har -music als -âĸ¬ âĸ¬ -mc fad -ag ony -conditi on -equi p -shi k -atra vel -ðŁĩ¿ ðŁĩ¦ -ke h -abduc tion -pe oria -wil kins -g ms -as d -ev i -ðŁĴĹ ðŁĴĹðŁĴĹ -u z -mo c -halle lujah -guad alu -lou vre -dra wing -go ve -ph ant -fri e -web dev -program mer -z able -games com -clari fy -li th -kin ky -âĿ £ -labour doorstep -son ata -ju ris -mai den -vi adu -buch arest -conditi oned -capit alist -u de -ps b -sp ca -lul la -footh ills -kay o -bon d -wom b -roun der -ce sar -bur sts -ap ra -sw oon -sab rin -fra grant -cle arer -ku brick -cli max -jour no -ag le -ðŁı½ âĢįâĻĢï¸ı -poo ch -hal e -sol it -sal mon -organis ms -bron son -art en -hodg son -alo ve -vent ure -bb i -ae a -ðŁIJ ¢ -ld n -d nr -o zone -el las -man ny -azz ur -un beat -tru ffles -th ong -ma ñ -las ers -ley e -gettys burg -back packs -or is -ma ison -craw ling -la bra -cl ing -dra gging -ste al -dou bt -de van -ck ers -agent sof -photo bomb -elon musk -abo y -dist ances -story line -sp i -nor than -europe ans -wh ale -ser pent -ðŁļ ² -fi or -tr it -ox o -awar ding -class mate -su fc -smar test -rich es -pr k -big foot -ar mb -bi polar -dw elling -om ars -k wan -gri me -m eng -freder ick -navar ro -sorry notsorry -jaredle to -pa ve -sl ack -barn sley -att ar -evic tion -accumul ation -o ir -cat chy -wel ter -vik as -has see -nik ita -mo yes -mathe ws -shi v -gat wick -pro filing -compan ions -mar rake -an tics -ðŁĻĮðŁĻĮ ðŁĻĮ -se se -bo i -bart lett -poison ous -ab uses -ym m -kam pala -guggen heim -imv kohli -dol om -bre e -thro ttle -gare th -fitz patrick -un ya -par ad -mar got -j nr -we a -potassi um -p nc -disgu ised -cra sh -ren ergy -ill ic -coup led -ni els -ci ones -æĹ ¥ -im ent -despic able -d ye -what cha -conne ctions -paralym pics -gaunt let -wait rose -suici dal -star ship -vap or -st ou -law maker -coo led -si mo -then o -offro ad -ja den -bas que -vick y -lu kaku -centr o -tri sh -strate gist -medic ations -hor st -b fc -gra il -sharp ly -ad itya -tom b -kau fman -tri pad -sam ba -pastor al -brit ney -sag an -hill side -mas ons -sar a -z one -x u -to tes -rob bie -app en -mon tag -der o -short film -charis matic -tat ors -ki ba -and ri -al arming -split ting -ic ar -th ug -scari est -sylve ster -an an -u trecht -a difference -me ade -bu ster -air strikes -cu ffs -account ants -ðŁĺ¡ ðŁĺ¡ -new t -bo tt -issu ing -cl ancy -wwen etwork -kyu hyun -rese mble -pajam as -sin k -kin ney -sul ph -or k -li es -la gh -or ton -ra hul -d sc -we will -re am -collo qui -shar ia -hec tic -sar casm -land er -tm z -endor f -ro z -ham mered -fri s -w adi -pope francis -he it -flash light -un born -op es -hol iness -ðŁIJ ¦ -nach t -im sa -gr acing -bj p -ver ts -c sc -home owner -a que -bigo try -anni e -bag h -âĿ¤ï¸ı ðŁĺį -car i -thom p -dispo sable -cardio logy -pat ented -hh hhhh -ld r -stephen son -cro res -fan ning -cli mat -ðŁijį ðŁijįðŁijį -ðŁijį ðŁı¼ -aer on -piccad illy -bank rupt -sil via -emplo y -don ny -commen ting -screen writer -io ta -ce an -anc ers -tu an -street wear -ठ¯ -sk ine -esp a -asi f -os ce -she ppard -more cam -bott le -der s -orac le -google play -aver aged -edmon ton -steph an -sister hood -cru sted -stag gering -methodo logy -congress woman -c abo -tri ggers -mil ky -gli de -tooth paste -room mates -nu ff -gu am -sprink les -alternati ve -wat fordfc -uof t -hal ey -cont acted -bun dy -pro stitu -gh ar -pre ston -on site -hil ar -g ts -c att -hamp stead -? ?! -ðŁĩ§ ðŁĩ -bbc qt -aless andro -resi st -ma idan -t ko -shad ing -pin up -gal lo -sin u -at ec -fun k -ac lu -stri des -rhy me -wet land -bbc springwatch -t ins -wild card -st our -flamen co -pau la -onto logy -gang sta -am ade -ãĤ « -t bs -skelet al -run ner -jard in -harri er -hun ted -z hen -believein film -de mean -au diti -re start -chon dri -âĿ¤ï¸ı ðŁĴĻ -mcla ren -ga b -sh um -au sa -lewi sham -y pg -k jv -fur nished -dor o -bon ded -mor ty -lat itude -_ ) -lo va -water ways -vin ai -shor th -drun k -c ay -ay ana -kap lan -capp uccino -spr o -life boat -has bro -spol ice -tor on -do ing -dam n -sh ree -foun tains -ent ation -mar u -boar der -to pless -j ada -chan ning -ul ls -en closure -gib son -fractu red -brit ton -à ¶ -t ous -por th -dra f -tra iling -mar gate -eli fe -down ward -lin n -gla des -girl power -ak rish -u ki -ron da -ts c -appreci ationday -vis ing -lo om -ðŁį ³ -mex ican -ar gos -y ya -jad ine -south port -d end -si sta -rede em -men g -bra xton -antioxid ant -s key -mp g -fin ding -vibr ation -ce u -kh art -di mini -cl ine -shel ly -hin es -ī ï¸ı -to pical -no ver -ma xx -prim itive -illustr ate -b ounds -tren ton -join tly -breed ers -u chi -wakeup america -b ada -ðŁĹ £ï¸ı -gu acam -sp heres -pere gr -youth ful -lo lo -bir min -t ly -jeremy corbyn -defe cts -co sm -a rent -v aa -bag els -medi ac -cori ander -ic ago -g haz -ab bas -re model -struc turing -pu m -out law -ad ani -r bc -gul ls -n li -confu se -ðŁijĩ ðŁı¼ -vil a -mcnam ara -correc tions -mug hal -ser i -re gain -ss b -lea ve -haha hah -gran de -di stressed -re chargeable -ho a -hou sed -sti l -attribu ted -opath ic -di ps -pri t -head phone -conclu de -pil o -he t -ut sa -nit in -je m -sni ppet -tutor ing -op er -sun k -en sla -cha u -ac orn -quinte ss -ran kin -affili ated -our lives -cl int -se ater -isa ac -ba shing -sme ar -nur se -doo dling -" ; -sa ku -atroc ities -im am -g fs -viol ating -comm end -brad shaw -er ville -b illed -b be -thul hu -i phones -moo se -di os -re w -me thane -strang ely -whis ky -ti ghtly -spiel berg -radi us -notic ing -wi f -ig nati -i fa -ap is -w ali -ha itian -bu shes -y z -v l -ex ited -asse l -tru ec -dom en -ash er -in king -newyear seve -hend ricks -bat i -ìĿ´ ì -rich ter -mon santo -con line -agre at -ðŁ¤ ¯ -master pieces -ar n -rough s -cle ve -se v -fashi ons -to ya -sh ail -cop eland -aqu ari -dec als -are you -y aya -a str -fon t -ml m -ar ca -pp or -pol lock -xper ia -conserv ation -chain saw -ag gie -?! ?!? -si le -sh on -ìĹ IJ -note books -marque tte -de us -bb led -spic er -mc cabe -nor wich -modi fication -boo sted -stru m -sales man -bang le -nis san -hez bollah -brea sts -a af -anth us -sk er -ow ed -her os -gi fs -fo sters -eat ers -du es -_ / -lymph oma -sf am -me gal -afri di -ag ic -p amp -jeal ousy -ðŁijĮ ðŁı¼ -calcul ate -napp ing -g ale -ðŁ¦ Ħ -lub bock -assu med -ren ting -íĥ ľ -subur b -ãĤ · -tech nic -u cla -in front -gar net -ster oids -stri ving -ho war -mo ver -le ton -bull do -is in -ci ao -sn z -fore front -d ams -mid wife -ma wards -cla pton -we in -subsi dies -spr oud -rother ham -phan tom -ar ach -spi el -rac ket -sel amat -no on -l bc -enti ally -ðŁĴ ¸ -sil ve -m oud -kine tic -y asi -ðŁİ © -o ol -mi ku -i za -fer a -flo ren -barber shop -groo t -z est -ne ars -stan is -z and -police man -juris dic -form ations -appar atus -sp d -arti fact -to sc -motiv ating -womanc rush -re dro -diagno stics -ra za -out fitters -el xn -dod gy -ry n -sh d -ortho don -ol de -jay anti -bal ances -quic kest -can ton -friday reads -! * -na a -a ak -ðŁĶ · -behavi ors -rasp berries -ä » -polit ical -cam il -å ľ -di k -ast ounding -lie be -novel ty -tur moil -sul ly -spring break -hon ouring -cc g -ðŁı Ĵ -my little -ky c -pro ms -ðŁķ Ĭ -à ¨ -bi ge -av ril -ðŁĩµðŁĩ ° -mari on -as ants -sur ya -oc tag -luf than -ac ron -fayette ville -ti que -love s -en ca -de kalb -ta ver -de vote -aux iliary -joh annes -tread mill -ay an -qu r -donald son -cher yl -" .... -s ven -kir sty -gun ners -ra dish -o ahu -v sky -i ble -con course -b ps -elo qu -ash ford -te bow -roblo x -ma da -dri ving -th day -spro ject -m ms -band ed -. !! -libr arians -flan nel -intoler ance -her al -ç µ -neme sis -list a -tar ak -cry pt -star plus -vish nu -sc ale -cr is -% ), -j illian -regg ae -pegas us -ol in -ip ment -man ic -l fc -godd ard -ite am -parl our -anch ors -lee minho -talla hassee -ant it -d ho -kid ney -y ash -batt led -az ad -gar is -faul kner -sni ff -papar azzi -ed m -phy llis -con tested -aa ay -se ca -k ton -vel ve -rain ier -for um -tam pab -ho sp -trac tors -ox fordshire -no tion -guang zhou -ðŁĺ ¯ -ref ill -wednesday motivation -sli der -mukher jee -pr att -fon taine -alph on -af ar -ts i -pest icides -fi ends -mo cking -bra w -tran sat -do ses -co res -hom ophobia -docu menting -zlat an -con doms -s é -sun set -kun st -ton ga -ภª -v ation -sp ray -chow der -ra ps -palla dium -nor wood -music history -hoo ker -si si -osp rey -ph ys -conce ded -bob cat -ar mad -ze it -Ù Ħ -ðŁĺģ ðŁĺģ -mer idi -ðŁĩ· ðŁĩº -corn wall -! ), -touch downs -ze it -chal et -mm m -al che -gor illa -fo ss -ati ku -lumin ous -ivan ka -be ek -sta res -sw iss -âĿ¤âĿ¤ âĿ¤âĿ¤ -scru bs -me ath -gusta v -jo gging -confe tti -as os -ers fc -breit bart -applic able -autho red -ya ho -h in -displac ement -j v -ðŁĮ¹ ðŁĮ¹ -ot c -non profits -diec ast -gu sto -inte stin -c ages -me en -lu kas -moon ey -ðŁĺ · -very day -tor ah -is sion -wa c -lever aging -ish able -cu se -le wood -may an -turn table -ju ice -tru sty -tu p -eti quette -supervis ors -stu n -gu zman -confe ren -ric o -fe ast -back ward -pol aris -mic he -jo g -h ing -field house -vel ing -sho cker -esc ence -ठ¾ -vi be -anasta sia -mar ched -kill ing -Ķ ë -fe tt -exop lan -... ( -snow day -lo h -ir ani -la khs -del a -po caly -boom ers -dictat orship -ac er -tur keys -quarter final -muskete ers -ðŁĴĽ ðŁĴļ -sf x -museum week -sc ala -ri sis -( ðŁĵ· -ãĢ Ĥ -z ies -bo eh -hu es -lu sci -dol a -impeach trump -roo d -don caster -tor re -hero es -fo yer -tar i -blur red -ke w -frank ly -dro id -ap al -Ð ¼ -y af -bre t -par agu -cac ao -ðŁĻĮ ðŁı¾ -ru e -head aches -shaw ty -char ley -pal er -go wns -correc tional -ðŁĺ© ðŁĺ© -breaking bad -ol ing -da p -endeav our -cit adel -tra d -incumb ent -medit ate -foo ted -ðŁĴ µ -shab bat -dayof the -wil lem -gal way -to red -marri age -f illion -sleeve less -aud itor -jin young -invin cible -kad una -a and -volcan oes -mon eti -indie gogo -buccane ers -ðŁijī ðŁı½ -ãĢ Ĥ -lay ton -cuck oo -hu mber -buzz er -Ï ī -to re -stra ins -sto m -pa ine -s we -du ff -z ou -si mi -li pp -ur n -se agu -ðŁĶ ® -sun dae -hi c -ðŁĺ ¨ -bull pen -u per -flyo ver -al dridge -glo bes -ali es -ken zie -ge es -y cle -sp lin -mag enta -j ha -bal u -gh orn -ti pper -wick er -taste of -con clave -ch ale -inv asi -cat er -dio xide -me gab -win n -at p -transform ative -nest led -hi g -bri dging -lil ies -chee red -bad dest -sc rolls -real is -dipl o -ðŁĶ « -conce ssion -prefe rences -explo des -er gon -introduc tory -ine au -ch af -som es -land rover -spir ation -sex y -sco recard -illustr ates -soul mate -wi en -inter disciplinary -fore casting -ent ities -glu ed -en lar -cur t -percep tions -boot leg -mi re -asho k -v az -hor ne -cal le -ac ulture -ther oy -night time -oc al -character design -ar mist -ðŁĺı ðŁĺı -yah oo -ac eae -to se -even to -sou t -nay anth -wh om -v are -ri gging -gen us -hi ve -com mands -sti e -day a -ethan ol -en f -hi fi -flu ence -cle mson -re invent -thermom eter -humor ous -emer ging -aci ón -ðŁĺĺ ðŁĺį -s ity -haw ke -accompan ying -t ility -ðŁĺ ª -re cess -protag onist -l ery -dun dal -int l -britt any -q bs -off the -marri ages -how to -viol ated -adel aide -wit t -lanc er -pak v -hu me -st ade -bra gging -ou tright -ad c -super st -real time -cu res -garden ers -ero ck -dale jr -ver o -bar tol -mo ti -mc fly -v pn -st ink -over rated -guer ra -e tis -ath ome -twd family -th ab -tn x -rafa el -family travel -x ley -sat anic -equ ations -ru dy -wal dorf -stan i -tu be -meas les -zimmer man -obli gations -i ously -bow ser -trans former -sho ppe -shak en -gh ouse -to d -ke tball -share holder -mar ca -kp mg -ak an -given chy -coast al -au th -roller coaster -mar ches -coordin ate -cine ma -apprentic es -par lor -mit o -men on -consider able -bar re -glo ss -enh ances -jaz eera -fal mouth -thra sh -stat en -k zn -eng el -samanth ap -flo ppy -sal om -ðŁıĨ ðŁıĨ -w ack -deliber ate -osc ill -herit ag -du sted -orni thology -pad dle -fer ns -bar un -cl ans -anticip ate -a ay -mat ically -é ĩ -tu mble -post man -unic ef -tro tter -op d -leaf let -ge ist -cease fire -scre ws -cre ation -wal nuts -longh orns -under statement -ab b -proxim ity -na x -un ity -turn pike -orda ined -dub step -chak ra -me ch -love her -look alike -donne in -vir on -Ù Ī -bang ers -vari ants -out dated -in ta -cri sto -sp elt -food and -f on -stefan i -margin al -hu tton -ti ara -tel ford -qu en -fair grounds -que tta -mikha il -heal er -v ball -ty re -under grad -gl end -hom ers -scri bed -main tains -po che -mis sal -mar ko -u as -á n -sh p -con vey -pad re -sab a -pu glia -madhu ri -pa xton -chap lain -n ago -ca si -... !!! -fli rt -sal eh -k are -di re -stam ped -extre me -ðŁĺĥ ðŁĺĥ -ho ppy -guadalu pe -advant aged -eu char -p low -un n -mac qu -port land -cla sh -pe s -lou bout -y p -keep ing -arca dia -fran kie -fi u -de th -encyclo pedia -si ze -inve sts -ðŁį © -geo logical -fran ç -con front -ðŁĺ ¥ -d ys -af m -tex an -graph ene -repost app -ac f -ur sula -gaz a -dd led -fu m -wsb tv -m be -fron tiers -chrono graph -ke s -inter faith -tab oo -spar ta -won do -flori st -em braces -ca w -no el -arch ers -ðŁIJ · -roman o -ban an -sh akers -melo dies -geo thermal -se phora -ìļ ° -оР´ -pro c -hand shake -pan de -popul ated -slow down -hor tons -registr ations -un deni -lan ts -pas sover -thak ur -li ef -adhe sive -pe tal -micro scopy -memph is -confir ming -air drop -mesm er -perce ived -ming le -lifel ine -gh j -worcester shire -pas sions -ach er -el lar -ah o -firen ze -bar ang -letter man -hat field -lu cha -je ter -e shop -william s -horo scope -pre de -east bourne -dur ga -di version -al trin -seis mic -premi osm -nar co -ti r -ori g -or m -land fall -ci ous -lin do -max ine -x ico -tra y -os wald -c ba -ric otta -n cr -mar au -ภ² -gladi ator -ch ery -lun g -u me -po psic -lon ging -can als -ta ya -decentr alized -sho pp -pres sures -mahar aj -eti had -wal greens -succe ssion -sign aling -li g -staf fer -north korea -def ying -as ma -de g -peri meter -oak ville -m sk -balti more -rece ip -de ple -ðŁĺŃ ðŁĺĤ -jambo ree -> .< -rsp b -puni sher -consider ably -in tothe -pari sian -acceler ated -polye ster -low es -fr ying -sauté ed -mou ths -seychel les -ra x -go dis -dak ota -house wives -the me -mat inee -black bird -ye sung -pre fers -pelle gr -in ated -trun ks -stronger together -re pet -re pairing -ped als -toler ant -her r -dun ne -indic ation -decat ur -b tv -exhibit ors -ik on -friday motivation -bra gg -live tweet -al ves -womens art -foreig ners -wal lets -min dy -lan ey -bb in -tv miaw -lif ter -tar get -tam e -dr ou -astro photography -mp c -g pu -nord strom -fric tion -run off -lov able -sp nfamily -ext ingui -bloo dy -sch el -arti stry -sw ish -scar ce -ph ils -max im -pos sum -com promised -sty li -sc fc -is sa -birmin gham -sket ched -angel ica -ordin ance -je ts -conqu er -ðŁĺ IJ -online shopping -s ori -reason ably -nue stro -ar turo -ch l -benef ici -spho to -wel t -ni kk -ðŁ¤ ŀ -dan ao -for mid -as se -af irst -âľ Ĥ -gil lette -as sor -an onym -sel ca -fe mi -bear able -y and -ar mory -cre pe -celtic fc -bra vo -in expensive -de lec -ge cko -new market -snow flakes -kab ir -con tra -can ning -mor pho -gar wal -ðŁĴĥ ðŁı» -fight ing -mu tation -woo dy -ju gg -gr aces -premiosm tvmiaw -kenne dy -gu p -sa e -op ha -off spring -fini sher -bet ts -span ning -mar j -h one -sh ing -contin ents -samanthap rabhu -un related -l acy -explo sions -benjam in -sophi e -no ting -micro soft -as sen -a hoy -i ker -ho fer -mo e -ah madi -yan n -an ak -ma hi -be u -aha h -creep er -baahu bali -am at -pri ory -haw keye -deloit te -sko da -print making -assemb ling -mirac ulous -no ch -sw o -leg a -oper ates -border lands -eli e -stron gh -rep tiles -pir ate -un fold - ¯ -qual comm -un predictable -ot r -rose wood -direc tional -counsel ors -corn ell -liber ated -j ad -ir regular -bulgar ian -high ness -vodaf one -sw ild -mini mize -gra zie -๠ĩ -r stats -stre ep -ome tric -humb le -lu mp -l ille -b ü -home depot -tripad visor -ki wan -a via -er z -ex ico -du f -blu men -mi zing -ar ma -in im -con stan -sor a -ju al -au n -tw ell -tren ches -her a -r k -po plar -recipe oftheday -ll an -bhu ban -short ages -ing don -bridge water -ðŁIJ ĺ -fortn ite -cam den -un cture -pro w -colon ies -t ks -n go -b hm -live pd -spl ace -sli ke -happye aster -ter rence -revol ver -j ed -yy yy -office of -m ts -exist ential -r ourke -explore bc -sse d -pri est -vix en -si ding -k pa -a har -ju ic -ob struc -foren sics -uk mfg -cancell ation -we ary -ab q -ele c -pri zed -deb ts -me zz -salv atore -m dc -gre tte -c gc -th on -snow storm -ts ch -cook ery -å ¹ -wa xing -n acional -mur s -ra ve -cap es -ger main -dri pping -sub mitting -ome lette -iter ation -aj es -shim mer -fu eling -ðŁĩ§ ðŁĩª -li po -bo bble -un follow -islam ist -hi ber -cat s -agentsof shield -sen si -____ _ -ster ia -inst al -ausp icious -har row -over land -femini sts -inst ant -char iot -blind ness -sp ed -sc arec -nu it -mini atures -ho seok -glo ck -fifa worldcup -e te -dis m -we iner -ex foli -ear ts -à¸ Ķ -my art -man il -iss ant -form a -in cu -buffal ob -in tim -mc cul -anj ali -po po -un doub -hil a -fun gal -thank ful -fu tur -en dish -ren ds -th ar -she ff -ring o -nichol ls -io wa -po tom -cl ams -ãģ Ħ -acon f -stadi ums -di mp -di k -residen ces -do v -caric ature -seagu ll -kl m -confe ss -sla pped -cele b -turb ines -pp v -nur ture -el ab -.... .# -tu ff -de press -al far -amii bo -di spon -e wing -que er -friend s -for re -âĺ ¼ -sw t -aqu arius -head liner -cur d -fi gs -o tters -love fl -kare em -go vegan -fri yay -consol ation -at ri -ì§ Ħ -âĺĿ ï¸ı -poly ne -gu ed -o ya -la us -intestin al -cam illa -scal p -pi r -leed s -horri fying -bore tum -dand elion -fer rer -ell ic -as x -so ren -re loaded -ale ague -navig ator -ine tte -add ams -al chemist -ak shay -dystop ian -awe c -n aya -al isa -ai led -ag or -avi ator -ali zer -smo bile -findyour park -cop ying -to ddy -sh ti -mon ger -cal houn -nap kin -break up -y atra -se thu -ric hi -eras mus -fer ry -am ore -prac tise -bo bo -power point -oo se -li ffe -chin a -sh ka -fad navis -du ane -war on -fal se -ðŁļ Ĥ -wa shes -disc ip -==== ==== -g k -ab b -stub born -medi eval -p ci -ðŁį ª -maril yn -h yo -man di -cr i -prede cess -continu ation -om usic -s lat -wh al -mall ory -bon n -shen zhen -ca i -âĺ ĥ -sa fest -for wards -dra wers -bla sted -sle e -mor phe -mb ta -dumb ass -ÑĦоÑĤ о -alhamdulil lah -ec lub -al beit -heal ey -ayurve da -adverti sed -cro cs -itt les -bry son -be i -nj pw -honore e -fu sed -ðŁĶ ĺ -mul tin -n aga -de parts -ko p -kin o -jhar khand -ed na -ax le -mil ton -supremac ist -marrake ch -domin ic -tran script -] [# -: ). -wo c -sur rounds -o gil -leaf lets -co well -whe w -tru de -proli fer -succe s -sports man -con dom -po che -k up -imprison ment -{ } -scram bled -å Ľ -ka ine -cell phone -metam or -con i -remn ants -ee z -down pour -afterno on -exerc ising -ber ser -architec ture -wick low -m ns -is p -bo c -n iss -mn wild -stu mble -r si -lu ffy -sil en -dd ad -bul lies -haw ker -bb cc -scu ba -e pp -que ts -for aging -pal let -ha di -cinemato grapher -cat chers -to aster -k hi -lite coin -kid lit -amher st -maur icio -ip ad -mar malade -fe y -don nelly -g to -est as -cere bral -ant grasso -zz led -vir gil -swa pped -ðŁĺħ ðŁĺħ -no dapl -greate st -nhl bruins -fra ser -b mo -ane w -. âĿ¤ï¸ı -se gregation -remark ably -mccor mick -lo gger -er as -contrac ting -âłĢ âłĢ -yor ks -uku lele -touch screen -de cked -ben n -south wark -ra vin -nu mis -ðŁ¤ Ļ -ru t -gre co -eth ic -red neck -ar r -t cs -ih ri -ðŁĩ« ðŁĩ· -l k -inher ited -zy k -viadu ct -marty red -hi gu -ss n -be in -street style -fer gie -bank of -æĹ ¥ -stake holder -exempl ary -cre ss -ess a -ero tica -intre pid -gom es -bra un -bethan y -bang tan -pulmon ary -m illing -doctor ate -trump russia -ठ° -s ani -bl att -pla u -depri ved -t le -ful ly -bour n -st ak -lufthan sa -kio sk -far oo -def y -bad an -ðŁĺĺ âĿ¤ï¸ı -rit z -tri sha -ran ds -middle sex -arab s -pro j -sport scenter -repe ats -iv f -bleed blue -as sure -o bs -territ orial -ele n -bever ley -ann ah -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ı -z l -for good -science fiction -gla u -son ya -pri th -st weets -mix ers -mari o -ant elope -writing community -went z -den ham -be di -sf o -harley davidson -look book -immuno therapy -or phe -es ville -ed ged -tas k -sb ball -corro sion -kilom eters -co sting -play back -ke ke -di visi -u ter -re location -yel led -pen g -up beat -ser ve -âļ ł -hal en -stir ring -reh man -en v -schu macher -frag ment -alkal ine -sb k -resil i -share point -rol lover -tra sh -counter part -âĻ « -ob itu -à ½ -ãĤ ¹ -mul berry -ðŁİ Ĩ -auton omy -spra ying -nat l -love you -fran ki -nu k -esc ar -can teen -ali baba -de plor -mole cule -pu d -fort night -blon die -sp hin -portra yal -ta che -bu te -consi sting -freep alestine -c sp -im mort -d ns -ðŁĴ¥ ðŁĴ¥ -tour de -coo king -archi val -ga thers -bit t -b anc -pre mature -snow ball -poetry day -lou dly -fug itive -ed ay -em ra -ðŁĩ¸ ðŁĩª -sci en -node js -jur gen -je ong -band ana -un is -fox sports -v andy -pro visions -wee p -tu k -i ko -h oun -zig gy -z r -fil let -bat a -tin k -con e -we want -k ilo -hor ace -sl t -sc t -stay tuned -victor ia -umb ria -att acker -ingham shire -fright ening -no ir -fr at -con tempt -lia ison -ho i -br ink -tr ill -ni agar -kick ass -dun das -not my -rho de -bu mble -no xi -fa g -spec tators -mancrush monday -jin ping -distr act -dais y -wal den -portra it -ar thistory -vol tron -ev el -is c -ac m -r ite -na o -de ported -swe ats -ru fus -lo bo -labor day -gam o -ihri thik -bl it -abdomin al -ãħ¤ãħ¤ ãħ¤ãħ¤ -i it -e q -bu sy -allu arjun -un disclosed -de ton -pro create -ki l -ðŁİĤ ðŁİĤ -mitch ell -ki i -inherit ance -al p -jo burg -pat rolling -compul sory -un signed -ni am -l ga -eshop suk -tr illi -ma w -appreci ating -rock ab -mañ ana -an tal -mal vern -roy o -grand prix -sut ton -go ftheday -dig i -ãħĭãħĭ ãħĭãħĭ -t les -varan asi -erec ted -discip les -cont act -ðŁĺ µ -li d -⬠ĩ -scen tre -radi ator -ing tips -trans itions -thursday motivation -chem ical -separ ati -sal is -mi m -geo graphical -book fest -/ . -âľ ĭ -v ae -cur rie -ag garwal -acceler ation -the ses -lg m -u mass -pro portions -nat a -ani ans -ku ch -be acons -ap r -@ # -ðŁĴª ðŁı¾ -nu ke -sher aton -ki o -ma kati -polit ico -mor ale -ì Ļ -econom ically -gg ly -ss en -pa stries -intern ships -vic ente -fanta ken -aveng ers -accu se -slee pover -indic ated -the dream -ster one -ren ders -fro st -ou i -gre gg -d ore -⾨ ⾨⾨ -pu gs -sat y -nu mb -hems worth -tam i -la ssic -schi ff -igle sias -ag awa -] " -re shi -game stop -divor ced -theat er -clau di -un conventional -prophe ts -ac in -twel f -tow ering -t ml -sc lerosis -k wan -ge ts -distur b -na ira -ener g -pir acy -pru itt -noti fied -hen na -bra m -ground water -bl s -opti mis -$ ) -luci e -biz hour -fang irling -gr ills -or l -ver se -c ina -law less -artistson twitter -tele vised -marshmal lows -radio head -bar r -m fc -bre vi -mmor pg -g aya -âĸ « -sub titles -j t -disney land -to bago -nh m -groo ve -fi awec -" / -ba o -scra bble -om ni -ff l -um c -si mba -ali er -ter rell -plu me -mi di -dig nit -co c -bru t -ad ata -alche my -d sm -ðŁĺĨ ðŁĺĨ -win try -spa res -cu er -conclu sions -to ys -od or -fl ann -gar vey -scrip tions -inspec tions -cat ap -ang lo -st louis -heim er -at ay -tr ich -en yc -chil ds -vent il -mont p -guiller mo -circu lare -z ell -mode led -craf tsman -al ina -stimul ation -cashe w -ju das -best of -to ire -susp ends -scol lege -real ising -by tes -bloo ds -as si -ðŁĴ ¿ -o hs -ðŁį ĭ -scallo p -ठµ -gi fting -camo gie -wil kes -o zzy -ðŁ¤ ¤ -ver onic -sav oy -deme tri -baby girl -ðŁĺį ðŁĺŃ -so x -cly de -induc tee -count down -self care -ठľ -vi ka -tor re -phd chat -pe ars -aw h -suff rage -le sn -admir ation -mp p -shark week -schul z -santor ini -clo ver -( * -stras bourg -ex iting -so yu -finger print -che a -ãĢ ľ -vin dic -song writers -so a -prou der -nam a -= )) -simple st -delici ously -gil les -u q -mn wx -ep p -sh un -ken nel -fall on -ðŁIJ £ -sin d -tra gically -out es -modern ism -co ke -gy n -spi on -âĺ¹ ï¸ı -le am -compress or -apolog ise -twent yon -fan atics -âĻ » -sco tsman -sa wa -ko u -as er -ภļ -welter weight -phen om -twick enham -stri a -p out -ka z -gi am -cd p -ho y -emplo y -red mond -ภĦภ-sm ere -trance family -proto cols -pie ce -lu iz -iter acy -carl s -united states -har med -phd life -ch aw -foot prints -l é -cho ker -z ana -sli pper -eric sson -insul ting -articho ke -advis ing -acquis itions -op or -mut ations -re ar -ॠģ -pod cast -wi ther -kun g -íĺ ¸ -win slow -di apers -ðŁĵ¸ @ -ec ker -col lar -hu ey -gi ro -mono gram -kas ich -si veness -malay si -arom atic -gre s -gali leo -u ji -rob b -dr m -none theless -as a -: > -lo a -l np -at work -ag t -laksh mi -pipel ines -id al -stre l -re all -chain z -stone wall -san sk -ðŁı ´ -pied mont -hoste ss -ci u -t é -analy ses -wil helm -scott y -rw by -mosqu it -use mb -qu ins -ðŁij İ -tu cker -s conf -speci fications -psychi atry -broo kes -s ils -ol af -de to -co di -cli p -fil th -womancrush wednesday -go to -ang erous -be ale -w tc -paneli st -ne x -lar sen -emili o -tab leau -h itters -conce ived -americ ani -or tega -mar di -Ñ ĥ -pain tball -thir sty -new yorker -etis ation -go ss -we aker -u gh -tro ll -har ga -du al -ght ning -at ine -ðŁĺİ ðŁĺİðŁĺİ -cook out -pyrene es -po ss -authent ication -sports wear -yun ho -kir o -archi pel -shen ko -ren der -nov ation -divin ity -ðŁij £ -su fi -humb ling -ge opol -devote es -wait ress -tr ough -py ro -i ba -bl ing -gra f -epilo ts -bt r -of tball -bas king -domin os -so om -r ath -sher yl -qu el -astronom ical -wel d -track list -sig nee -slee pless -com man -ch ron -summ on -pure michigan -cri spr -sli p -la gi -ra q -um u -thal ap -char med -scru mp -quad copter -ski p -peter sen -mun i -ðŁĮ ¾ -mon aghan -tra ys -ick ed -canad aday -te gr -ï¿ ½ -hot ness -heavy metal -ab ar -gop debate -az ul -spider man -sun flowers -ľ ë -web comics -bar d -Ð ² -nichol as -slu sh -ram an -mark ham -ffici al -ff ler -íĬ ¸ -ple ss -anush ka -to to -sk aters -pro wrestling -compet es -ay ala -myster y -thr ills -mp g -independ ently -y ul -imper ative -formid able -tire less -st acking -ton gues -mal tese -pot ts -mat ti -char ting -chill out -super nova -ome o -sky sports -nu tty -ðŁĹĵ ï¸ı -ro han -insp ired -concier ge -ser ra -ma kk -gal at -chi pp -ye v -ì £ -reim bur -op ul -kimber ley -i eee -bre men -ch itec -or in -nak u -bon kers -foo ty -emer gence -ðŁĨ ĺ -sti p -serge i -zo ey -ai me -wou ld -dy es -destin y -vinai grette -dri er -circulare conomy -an archi -ss r -sch el -cin er -gro om -determin ing -gar min -cal ais -incarcer ation -bu kit -no i -chelms ford -mckin ley -chi pped -belong ed -tu mors -str oud -mi i -influen za -wwen xt -tun dra -tele communications -cat sofinstagram -t ages -beat ty -o du -ml kday -oo per -dang le -ak ley -cru mb -anti gua -ti mbers -rou hani -ðŁĴª ðŁĴªðŁĴª -ha fi -... !! -w cs -coo p -sn c -lit res -ãĢ Ĭ -ha z -co z -k ant -green field -cur ti -y ale -flye agles -what soever -wor thing -rou lette -flyeagles fly -un da -a inted -stand ing -lusci ous -h pc -effic acy -ash land -me ghan -ky wx -n pr -bath tub -ac os -h ani -mar cor -man tis -da isi -bo ba -ab bie -mu til -vi al -spy der -po z -g ti -el fie -nigh tw -metro id -anton i -mad die -dh ry -dar lings -ten ds -taek wondo -atlan ta -me ow -chlo e -ãĥ İ -ym es -siber ia -k con -gu es -mar iner -fac il -azz le -[ ... -han nover -bav aria -vir go -te uk -u sps -) # -wall a -sam pson -need less -ver bally -hay ley -bow led -pi us -lam pard -ham string -vol vo -road safety -cho king -sor bet -a hem -healthy food -brai ded -horticul ture -cr ative -che ek -ad do -the force -ko ko -schiz oph -j ie -w ada -twentyon epilots -h bcu -pro ton -pau ls -lou isa -lat am -kyr gy -com pac -sd k -sap i -?? ? -liber alism -ep silon -ai den -w usa -spra yed -baske tball -kim ono -blue wave -ali as -ë§ Ī -mug shot -ce c -do gre -ad ora -ðŁĵ· @ -kra kow -intrigu ed -exhau sting -astron omer -ven ison -lady bug -ci v -bra e -us m -bri be -acup uncture -pembro ke -ke ating -chi e -y ad -t si -sm i -see ding -gate shead -lis boa -gy p -canv ass -ðŁĶ´ âļªï¸ı -op i -ni r -soci etal -ly te -ati es -c sm -ar tery -al in -aka poor -abstr acts -â̦ â̦ -teen wolf -ne we -travel gram -sentim ental -per ched -han del -ho ek -f ay -coordin ating -anim ate -man ian -effor t -jer ky -f ck -adri enne -ma bly -tra ding -my el -spi ro -sol a -stor ing -over drive -monday morning -dream team -pul se -bon di -ber nie -pgat our -tri poli -son am -plat t -âļ ¡ -ag roup -îIJ Ĵ -inv ading -v cu -k ell -ñ os -un dead -pod casting -mercede sam -mana fort -cor tex -que so -impecc able -pal mer -wil doz -sport sc -guacam ole -dispen ser -cate gori -stun ts -per il -invit ations -dune din -xi e -achi eves -saf er -pre ds -ph an -knuck les -k ak -igno res -lovemy job -aru ba -ound ation -datac enter -co vert -gr ing -cou ple -ا ر -vol i -mc cle -arti sans -lu do -kal am -arom a -under taker -hu la -wiz kid -gu mb -god frey -bakers field -ker n -engine er -car ve -pal in -guaran tees -pe bbles -b ays -zi eg -fin k -â¬ĩï¸ı â¬ĩï¸ı -down pours -ro chelle -rasp berry -ðŁĺ ® -gra phies -stom p -caf es -ari zed -utt ar -cal vary -dri e -crusad er -bus an -tux edo -si u -seam us -cul tured -blan chard -town house -ge red -butter milk -flu ctu -roger federer -hel i -ðŁ¦ ĥ -u ous -ram esh -mu ppets -email marketing -ye ss -br ice -ri zio -pel o -donnein arte -u rable -inve stin -bump ing -raji v -sav a -thro wer -fore x -o hhhh -th rust -pull man -r fid -sep sis -le ed -fri ght -roun ding -ne b -ph ins -ai sha -utili zing -squ ats -gold smith -j ic -bo ks -vau s -i po -exclu sion -tari ff -po kes -min al -land s -en force -washington dc -or char -g x -mar ys -ey our -aussi e -bak ers -un popular -latin os -lar ge -pu tnam -bol o -wa de -pel o -di zz -ob struction -fla ppy -weare the -depend ence -pajam a -e te -y ann -e wan -disc la -a ay -kar ina -e ic -an trim -w soc -neg atively -kai do -fotogra fia -dh ru -colo ssal -mcle od -k wang -mani pu -ex hilar -us atoday -summer slam -co les -tapro om -unbeat able -de ma -tic ks -k ling -fil s -campaig ners -ภķ -brew ster -audu bon -qu ay -ch s -ki gali -d ler -strength ens -som al -sign ingday -gol ds -pig ment -orche stral -g q -lin kin -ðŁı ĩ -ta w -algar ve -ho v -ear le -gold fish -am ig -ex er -ben in -dru id -ðŁIJ ¸ -she m -quat tro -mer cen -men te -incorpor ating -bon anza -state fair -en de -concep tions -e es -âĻ¥ï¸ı âĻ¥ï¸ı -d son -fire arm -orb ital -we h -multi p -fo b -requi em -p light -thou se -sa id -oc re -remem brance -n old -chi pping -be v -er t -ca thy -sy m -ri ggs -m ley -dialo gues -sl ender -how l -gau teng -wd w -to bi -smo kes -im plo -b pm -ad n -mom basa -cap sul -bloom field -artic ul -cle o -goog led -flu ffy -l ard -en zyme -ve sti -ibra hi -fl ame -e mea -out ages -dispro por -ble ak -an sel -ick er -st louis -stock market -good friday -sau lt -stal led -pro m -ep som -b é -the se -sau ces -me w -lit fest -pre d -re u -kar ak -si enna -ell in -bio technology -ï¸ıâĥ£ - -tac tic -sa in -por k -mon za -ka j -lu sh -compart ment -chang ing -shraddha kapoor -fo al -ar tem -cu ando -can ola -ori ente -me sse -d ited -br c -box er -bbc two -s st -ment day -em ing -de wey -kof i -âŀĸâŀĸ âŀĸâŀĸ -reali zation -smo l -tw ood -san je -flag staff -ber wick -cor set -can ary -whistle blower -et ched -com posing -squee zed -bow er -auto desk -ne h -mathi eu -ba ja -Å Ĥ -hy dra -da im -am eri -insi sted -mer lot -gar ros -heart news -gaine sville -cut ler -bo de -ðŁĺī ðŁĺī -lew es -scoun try -g sa -us u -cc m -god awgs -phara oh -cra e -mor ley -hyp noti -f ades -neur ons -fu zz -ing co -high landers -star k -vig ne -pac kets -amar illo -reu ben -insul ts -bas ic -vec tor -n me -ac ruz -tro s -transm itter -ðŁĺ ŀ -interpre t -ðŁĺ ² -pre quel -mc gowan -dis semin -ðŁĴĺ ðŁĴĺ -mascul inity -indie gamedev -ali ve -te t -pe tal -ema iled -ar med -ko o -he er -ba ird -super junior -metro polis -delav in -decl ines -stit utes -Û ģ -p tbo -g lan -cho res -e aling -chri ssy -ste mc -vi an -assassin ated -pron ounce -illeg als -discover y -cav ill -fri fotos -f al -so i -sabot age -t int -p dc -ðŁİīðŁİ Ī -ãĤ Ĭãģ -ji o -endeav or -in sig -commit tees -she arer -me tz -mar rying -h dd -g by -fre t -tri sh -pu l -scrip ted -sa ki -l w -ke ye -shim i -nan aimo -ca h -à « -tem pered -ici an -du gg -dish washer -air field -s rugby -gr inch -y st -r ms -mahat ma -lan kan -disc ar -dige stion -no des -l ls -om ic -gu tter -tis garh -feder ico -election day -bo he -master card -fire ball -âľ Ķï¸ı -oy ster -p ong -do k -en route -m vc -beat the -ali stair -shu b -sh aming -cherno byl -ghi bli -the s -pin ion -d bs -sal ts -ic tion -epi ph -nc pol -in convenience -whit ley -inspec ting -wood ley -wi ener -skil let -no les -m ca -h ina -a sha -willing ness -well ness -tam ed -show time -dis advantaged -ber nat -us n -mission aries -coun selling -arrog ant -quant itative -leg alization -ho dge -energye fficiency -cameron dallas -pos sessions -p bb -harris burg -v g -hindu ism -happy thanksgiving -fi b -re acting -tweeta picture -pol iti -mu ppet -hur rah -pac e -coast guard -guar ded -as am -par ry -fore very -x q -oom f -ke anu -j ind -ri st -customer service -sac red -ðŁĺ º -ton er -occur rence -mat u -val dez -red d -is ak -power rangers -pe asant -raj ini -abra ham -e mil -car do -tr il -hair styles -obsole te -sam pler -direc tive -delavin kisses -ver ton -glo s -sp ay -paler mo -com ets -man ziel -chicag of -ski pped -pic torial -h ant -b mi -a ol -re opens -pad dling -devo s -fra ud -bas eline -que ues -sp ired -sn are -eu ve -descri ptions -daisi es -ca ching -gall eria -tri mmed -stin o -recy cla -ic ular -bir ken -raw lings -fli x -chic as -b gt -lik eli -argy ll -thel ove -ga ston -bl anca -ha k -f one -sailor moon -h aci -ima c -fl yn -de can -bel les -ap ic -zo g -taun ton -con stance -lasag na -ker nel -in ka -har bor -collec tively -calcul ated -av ille -shil pa -pur du -gi mm -fun er -a est -pembroke shire -nighting ale -n unes -hyper tension -hu bert -sli ders -infer tility -comm ended -transat lantic -metr ical -!! @ -Å Ł -ss g -bac ca -inver ted -fun factfriday -it ans -albu m -acqu ainted -ri er -whel an -sar ab -mu e -snoo ze -pi ff -agre eing -sp itting -jer maine -n ye -âľı ï¸ı -am bush -ze ph -con greg -univers ity -s app -wann abe -pat rice -ib d -do glo -fri dges -sun d -king ston -ar gon -kam en -hardro ck -ds ley -do lores -ì ° -ota ku -pi ping -be having -âŃIJï¸ıâŃIJï¸ı âŃIJï¸ı -blue bird -an sari -teapo t -fire work -cro p -log ans -ty ped -thick ness -ig ers -c fp -dys functional -contra sting -et ty -aston martin -tx st -dra grace -at tributes -marath on -manu scripts -john stone -ðŁĺ± ðŁĺ± -bo er -ay u -aru gula -poo rest -con du -assu mption -anag h -no h -delav in -sit ter -g ö -mor ow -kick start -com i -gl acial -ghe ad -ba in -ker shaw -en dof -fre ud -om at -i af -hu g -sign up -each other -defin ite -tu bing -shak ira -ðŁijı ðŁı½ -uu uu -sw in -sham bles -ol as -sk ell -brit ain -kn w -clu tter -om y -j ens -hang ed -city scape -scra ps -un locking -dead liest -er no -breast cancer -a it -inspec t -fu ri -ðŁĴ Į -ku d -ju le -or ah -mi ds -m dt -bur gring -r attle -pu sa -stal k -cle ans -iss ance -z ek -worth it -nam eis -musko ka -council man -urban art -bar rac -un solved -tu l -g ita -white board -soy beans -em ent -cont i -saturday motivation -conveni ently -doc king -t ado -âı © -sp ino -puppy love -po f -fabric ated -robb ers -adop ts -ti fied -kk r -indulg ence -notic eable -macqu arie -chap el -sensu al -ki ko -melan oma -lore tta -li ance -ab en -sp lus -ga al -ac ele -lib dems -compar isons -ðŁĮ µ -rhy thms -mer y -en capsul -nap ier -ðŁijĮ ðŁijĮðŁijĮ -ðŁij IJ -plat z -fre sno -re formed -ran bir -el it -the best -bhu shan -vin nie -impro vised -s ittin -re created -e ba -ec ker -ac rob -pon te -cor d -gi ddy -eur usd -fe ver -intu ition -gar i -dum mies -bud weiser -amend ments -te tra -sch nit -ay as -mar ys -ci st -k ani -ker mit -ðŁĺ±ðŁĺ± ðŁĺ± -tin ker -strol ling -di visional -niger i -omin ous -menstru al -kar ab -k hy -bw fc -pan handle -l illi -well er -stra pped -son the -transfer ring -ethe real -sne aks -ru dol -gab les -jac king -cin code -for tune -canadi ens -con for -ab normal -frank lin -tit a -mu la -persi st -cu ties -ki el -ðŁĩ± ðŁĩ -her mann -aw k -fi asco -ko to -we ta -hi ker -budd y -preven tive -mcgra w -game boy -forsy th -top shop -si ob -sad h -in tram -follow art -so aps -dragon ball -ou x -morri son -๠ĥ -lu bric -adul thood -morri sons -âļ łï¸ı -her mo -ta ka -stall one -mis use -team gb -ra gha -con fined -at y -hom ophobic -nw o -sky news -ho ya -ac rosse -wi iu -pur ée -jed dah -ðŁ¤ § -advis ers -ph ine -an is -scrump tious -ë° ķ -c ke -vin y -ter m -s dc -o do -home school -vas c -leop ards -debor ah -illic it -cur ran -as roma -nau ght -mar ig -brand i -em p -ðŁĺį ðŁijĮ -î Į -su spend -lu z -initi ation -sch aft -jensen ackles -craw ler -post doc -des ks -trail blazer -den omin -tri x -no ise -po et -± ï¸ı -s mug -vol atile -proof s -pharmac ist -sardin ia -mash able -kim chi -co ed -schal ke -doo dled -c sw -sh ur -ro x -do k -chris brown -mathemat ician -ab ound -ang elic -rock ford -d ole -yor kers -ms n -g man -xavi er -bor rowing -mark ings -longh orn -k ja -diver ted -mm it -euph oria -ay yy -te a -pa h -ck i -un cut -li ven -ky ung -fan art -mer ing -red ding -amo vie -gri di -c thulhu -schol arly -ju dah -th bewithyou -eu calyp -ðŁIJ ķ -hert fordshire -cour troom -by u -auc tioned -ple ase -mar cia -ê° ĵ -succe eded -el as -arvin d -t lot -saig on -re tt -ra kesh -fd ny -as en -se bring -gladi ators -you know -v lad -gol a -par ap -ÑĢ Ð¸ -sab cnews -one team -oh l -sun e -ri j -cd c -star gate -run down -plat o -ph c -chat ter -ra viol -mn f -mand ala -li et -ภķ -mari a -hun gover -consoli dation -fer rell -tradition al -ilove art -gal ap -ðŁı Į -que zon -espa ña -ðŁĩ¨ðŁĩ Ń -ho bby -steam boat -mali gn -guil lau -pro hi -its me -íĥ Ģ -in scription -al z -mari an -k ade -mm on -adju sting -ne sts -intern ally -ci r -vik ram -mal ala -k ph -fel icia -the real -cap tivity -at is -marcor ubio -kale ido -che v -mano j -le more -gent ri -vi ps -tro pe -" âĢĶ -pair ings -mal nutrition -fr ay -desig nation -brun omars -az e -tor rential -pan zer -ga il -under the -the ological -schizoph re -dazz le -freder ic -mo par -ad illa -so ggy -ra un -medi ocre -colo rec -i fe -p inst -blu ef - ² -world water -gir oud -clar inet -ad olf -tar antino -receip ts -assu mp -ðŁij Ł -coffe es -âľĬ ðŁı¾ -du plex -s of -r x -lin o -timber wolves -pan dit -mo tm -e ga -ay ama -ach s -outsi der -ll en -co er -til ly -cheese burger -ma ds -ple dis -emp ty -national parks -az iz -p mi -jun kies -f ener -sq n -è s -gener ation -cleop atra -bhuban es -mosqu es -ty free -popp ins -tw c -or well -n age -ka whi -hol low -dal ai -¨¨ ¨¨ -ou ro -m health -gi on -az o -vis as -reneg ade -re ic -w sop -ðŁĴļ ðŁĴĽ -e chel -tox icity -mü n -bun k -stimul ating -asth our -\ ' -ep h -ende mic -cn bc -shrin king -peabo dy -michel angelo -can yon -wal e -su mi -si ders -inu it -? . -profession alism -dr acing -plat oon -p ons -out bound -maple leafs -de sol -cen cy -a than -ver ma -ru bbing -ok an -ðŁij ł -mull ins -authent ic -Å į -alman ac -ga ia -bb q -on imo -ke h -ty a -tou ts -y av -re posit -, . -wi ght -se eyou -cal lof -done sia -bar gaining -gr anth -sd su -amphi theater -p su -re watching -wine tasting -peak district -dete cting -thur man -phe e -èª ķ -u mich -re r -sculp ted -go le -name sake -ðŁĶ ģ -serv icing -bau gh -pu gh -pen cil -dar th -munch kin -at orium -ten ers -sun y -rolling stones -mag ing -star rer -i dris -fe instein -ag ron -âĺºï¸ı âĺºï¸ı -supervis ed -chamele on -aggre gate -succe ssive -mo gul -inst yle -pol dark -custom e -ohio state -ha ya -ci des -broker age -angel ou -fifa wwc -de forestation -al ton -pam ph -hu gged -ho bo -change able -ku ber -bur roughs -demon etisation -cape cod -vers atility -or ice -le ila -womenin science -tu a -he dges -embarrass ment -ali fe -so ars -ni ghter -hy mn -gi pp -chas u -tech s -ni all -k illa -hi ka -cam els -valu e - ¢ -sc oops -mah moud -clu sive -adri ana -pac o -oz il -un as -transl ations -whispe rer -s bi -bu xton -bio tics -indi ffe -ken ney -k lar -et ching -barra best -inst ability -se ine -vo tel -blo gged -whis key -my space -t ant -lan dia -give back -illu s -aw ak -ac ab -f bloggers -cloud computing -blat ant -syri ans -band ra -sty n -an em -ke ted -kar thik -barun sob -pin ot -gu bernat -gay e -arti ste -i fied -conven tions -hu an -geni uses -eeee ee -fol ly -somer ville -pride month -ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ -chemo therapy -paul s -bak ar -ìĦ¸ë¸ IJ -taiwan ese -fol lo -c ss -re ign -nn nn -fla un -catastro phe -iti es -frag ments -extre mists -ym oun -car men -eze kiel -conne cting -se h -man ta -remodel ing -we ymouth -at oms -ce m -ne well -lu mi -the open -mo c -mili band -g land -z shq -mag gie -mani acs -m sp -ad y -cre ams -le anne -e sta -py g -af finity -pray er -dun bar -ligh troom -ac adi -wyn onna -roman tic -state dept -sick le -wh os -lam o -et our -fin ity -shru b -shar pen -pun dit -ed on -af ore -mar s -jeff ery -ter ps -medal list -kath arine -accu sing -ta z -roy d -from home -confron tation -alle gh -ðŁijī ðŁijī -refresh er -ran veer -never land -jo jo -lu crative -en am -ca ver -pa edi -man jaro -flu ids -the ssal -oppre ssed -mu ss -joh anna -Ø ® -cn g -buil dthe -sett les -s ith -fu ego -cl amp -ar ag -pay er -ted x -mand y -inter stellar -fr c -ch and -b cc -mo lo -len til -johan sson -grims by -nature lovers -ðŁļ¨ ðŁļ¨ðŁļ¨ -shin de -x in -international dayof -transiti onal -sat a -cad dy -wo d -if u -ha ys -holl yo -j ang -ir c -co im -grad able -" " -ðŁį ´ -ঠ¾ -a el -n yo -west lake -time out -sof i -phenom ena -cultiv ation -ag no -un armed -so t -con j -gen o -royal navy -nutriti on -fair mont -ti relessly -sn g -re ty -mic a -lu cent -slo ane -droo l -riz al -od ell -critici zed -. '" -la ze -deser ted -co der -pra s -l illian -itiner ary -dav y -an ap -whi pping -hobo ken -kare ena -çľ Ł -vi us -ter n -nan tucket -mis understood -bu laga -st ant -chin ook -z am -reli es -d ss -ed mond -sket chy -m ell -fe x -rec tor -dist ill -day dream -wine maker -ri pley -billion aires -hel ene -ati f -cul prit -bertr and -wou ldnt -ma pped -v ak -gla dly -parliam ent -kidlit art -ware ness -goli ath -âĨ ĵ -view point -tat ted -fu ls -dor sey -ang lers -li ds -ki ya -bow les -be h -b ite -compati bility -ance stral -pro x -beha ved -gubernat orial -ch field -sab an -z h -teen y -shibu ya -holli day -pan cy -âĿĦï¸ı âĿĦï¸ı -seun gri -? , -ðŁĩ¦ ðŁĩ· -im itation -impac tful -any i -gene vie -añ os -bate man -gli der -af ar -ra sheed -effor tless -sh war -dach sh -er un -at os -kin i -ch d -kha ki -k lin -felici dades -bel o -as l -to ppers -fin ley -stac ey -rigor ous -kar ting -le ppard -car michael -be ret -c se -ak hi -mer ingue -ab an -ha ke -ger i -er jee -re sto -comm anders -pr it -fl or -ad ven -ex termin -remain der -å IJ -es g -martin o -lulla by -| @ -mi gn -in store -big bang -cor di -cau ley -ante bellum -dg ate -cro ck -span dex -scaf folding -ore os -ê°ĵ ìĦ¸ë¸IJ -pom ona -ma uro -uni versi -re mi -af ootball -t ant -sm alls -ne h -worl do -tropic al -mor ph -jav elin -gla r -arqu itec -reminis cent -tu bs -spide y -make u -syl la -progressi ves -blo t -shor ten -keep in -ch ak -ang st -super food -decad ent -ston y -neuro logical -ar boretum -ann ak -fe ma -per cu -dis respectful -small biz -lo x -co om -c sc -bs bi -pre valence -him ss -esp an -mo ga -fr ampton -sky map -mas se -levi athan -( ). -noctur nal -car ameli -ang or -amne sia -outsi ders -she alth -rhin o -ant ag -ag io -ðŁĴ° ðŁĴ° -take me -kab addi -c si -m sh -coch rane -thessal oni -sil a -ha us -du sting -obe se -mack lemore -mani sh -len in -m dc -gro wn -shef field -s rs -ke le -car son -ch um -dah lia -can tore -opp o -how ling -cyber crime -sur realism -sc ran -fa iz -thre n -rac ists -r out -pk not -se mana -sin i -mc cull -ma chi -alfon so -y b -sar dar -kend rick -den g -reci pro -on f -doom sday -bri bery -custom iz -art is -c pi -ðŁĻĪ ðŁĻĪ -sla va -let te -en s -âĿ¤ï¸ı ðŁĺĺ -cra yon -ad an -tr c -migr ate -simp son -row ers -king sley -farmers market -shee han -ne phe -bor non -car ton -mic key -all ure -u lu -sli pknot -heb do -gui do -dog celebration -online marketing -acceler ating -) .. -origin ated -macar oni -ed tech -out field -mit z -disc us -adverti ser -man or -ha shi -descri p -cap ita -ful bright -recep tor -con n -con ey -spion age -r attle -pre st -u li -blog post -acker ay -) â̦ -red velvet -mat th -inspir ing -b sd -ker ri -po con -mil lar -re pur -accent ure -ä ¹ -ram bo -ragnar ok -dele ting -british museum -pat ory -leip zig -flori an -sci fi -in ers -br ate -yo y -melis sa -ab er -ma sa -po te -mosquit oes -transpl ant -r pa -; )) -bast ille -yl an -joye ux -melo dic -cap tions -atri st -roch dale -gott i -pew die -cuties aturday -who is -aqu aculture -tiv a -sp el -he ss -ha ji -fred die -co per -brand o -v k -photo book -* , -my dayin -micha ela -brune i -sr ini -in te -Ä ± -de ol -d fc -separ ately -bun d -ve sts -to c -me ck -rein forced -constra ints -car roll -sq ft -re ver -cam per -bird man -in action -gener ators -triumph ant -pe sts -o vo -gy pt -al amo -sc aled -suresh pp -sd n -is mo -gi os -) @ -justic eleague -restaur ant -gab i -den gue -next gen -exemp li -ap ex -inspir ational -down side -kid z -u pl -et na -alvar o -fel dman -bar net -m ha -es ch -bloo ded ->>>> >>>> -kan i -ho fficial -casablanc a -bir ds -ty ga -sw amp -o day -new castle -nb ap -ci sion -cho ols -af lo -ne p -mon ton -ak b -super model -down time -th os -sc wx -snoo py -ag greg -yo ke -nor cal -we tt -prolon ged -me tast -beat er -f ta -t lap -disgu sted -y h -voice over -itch y -ip c -ðŁİ ¾ -phe asant -stra its -ram pant -j g -fer til -assu res -fortun es -sal inas -liz ards -kett le -i bs -cyn thi -he g -mc cr -soccer oos -happen ings -cor den -ðŁĺĤ ðŁijĮ -t ches -egre t -wolver ines -congratul ated -ho gg -bott ling -wr i -fer ri -bo sch -af ire -og den -s jo -j dm -sv t -con tex -tol lywood -min k -me se -super sonic -op oulos -å ¸ -âĶ ģ -knuck le -gu ise -gam i -chu cky -z inger -radi al -compla ined -bo da -fe tal -discipl ines -cor ro -ðŁĩ®ðŁĩ ¹ -op ted -filtr ation -ad nan -em cee -mi stre -insom ni -fer gus -tra jec -on don -med tech -tanger ine -madra s -gru e -cab s -z hu -sureshpp rabhu -insul ated -day swild -pp m -band ai -v day -s ff -squ id -lo thing -not dead -expre ssive -cu ll -ala stair -x u -up front -fish ers -en es -um d -dis missal -sti er -sel s -lu st -re active -prote ster -eyel ashes -al im -goo de -gre eng -da ir -com pen -anush ka -proto typing -ma pu -bear ings -ðŁIJ Ł -for me -bsbi botany -timo thy -out skirts -am bed -are tha -wend ell -stre aks -ni m -k pk -sne e -fit ter -quo ta -p ate -win ning -ðŁį Ń -sho pping -ma inst -cul ver -ste vie -mcfad den -counter parts -gren fell -fol som -dor set -tech crunch -⬠ħï¸ı -tip tuesday -us l -tre x -geor gie -ranveer official -lic ks -se wn -k f -' â̦ -jap s -p ate -orth op -fe sta -stra s -mon tal -hammer smith -fore most -wido ws -mad re -ite z -mito chondri -lig ans -z ona -cari bou -m ss -andre i -weather channel -gh c -: ... -ta ft -awe ather -al isation -bru tal -bliss ful -nik ola -mal icious -q m -mpg vip -bro die -bl itz -applau d -dri bb -v ague -dog go -transl ating -interpre ted -hat ched -ge tyour -benefici aries -spar ring -caes ars -aw illiams -la hat -bro ke -ti mp -virtu es -rel ying -pie tro -k tn -ici sts -pab lo -lou i -a ag -pn pp -cha st -pul ses -fini sh -usair force -type writer -thomp son -dog s -ut to -ãģ į -sand al -new ly -do ge -z w -wan kers -ne gr -mu cha -determin es -black fish -sk unk -mu ps -instru ment -phy to -daysto go -skin ned -hai der -con ten -ðŁIJ¾ ðŁIJ¾ -we iler -undoub tedly -chair ing -wall is -sh ard -zind abad -adul t -absor ption -pre sto -deplo ying -drum mond -battle front -seag ulls -how dy -juda ism -des de -part ition -âľ Ŀ -no logy -national bestfriend -lesn ar -film fare -co asts -christen sen -ac an -mb u -co pped -ru bble -sw c -fun nier -far ther -where as -nano technology -with stand -pil low -bow ers -to pe -it ly -con fit -ma kar -comfor ts -bo sh -cli pper -bal la -sti k -mil b -safe guard -musi que -eas port -ya z -pad ded -bad er -fore ign -chop in -archi ve -o ka -tran sporting -tml talk -aj it -consequ ence -sc roo -ff o -collabor ated -pug chat -ye mi -jav ed -au burn -o of -ma w -sau cer -miti gate -i les -evangeli st -ter ie -re cl -indic tment -cat a -bright ness -may the -whim sical -un lv -key word -cu min -med way -west world -tra w -im posing -form ity -coul ter -ab z -ny pd -grass i -kel sey -qld pol -clock work -f dr -di anne -âĺ ij -ad h -p ann -bra vely -ae ge -un lawful -ver di -pocaly pse -phar o -kar la -reson ance -ma stiff -la dak -bu u -ma iled -hi i -craw ley -tor rent -mach ado -liby an -effort lessly -fal sely -q vist -ke ef -craf thour -cheri shed -val kyrie -s ari -kal amaz -be he -ðŁĮ Ļ -th im -ro ddy -col trane -but chers -ach im -wk end -awk ward -cab rera -:) ))) -fran c -decl an -con dos -a ja -pandor amusic -char ter -ph ill -mon trose -hatch back -handic app -gre aves -eucalyp tus -ut most -t son -bur ton -mid wives -in cur -ðŁĺį # -moo d -compre ssed -tom a -must ang -mo g -as ana -te stic -sho tel -in sol -cor sair -nh q -ben ny -sm ma -kap ur -in con -jon as -ener gies -don al -as ad -se z -n pa -archi ved -stimul ate -do p -hy d -gri eving -ãĥ Ī -ron a -why te -tree house -ss ell -sand ro -ko bo -ther most -se clu -hi ya -ge ez -mam as -prisc illa -flav oured -fas s -w old -maker space -cospla y -p tv -happy valentinesday -sequo ia -love craft -gu an -d tm -ci i -yoko hama -pos thum -re q -ðŁĶµ âļªï¸ı -galat asar -dol by -hamp tons -disturb ance -stone henge -ok c -disrup ting -month sary -jun gle -head lights -du stin -micro sof -happy mothersday -ko ko -gra zi -te sto -na idu -mal ay -ari al -ru mb -ab oo -har man -tra pe -spo ils -je ho -go dly -lock screen -z un -pi ous -ma gento -l enders -prob able -corpor al -m our -aw al -su a -call me -ton ne -go vin -devast ation -x j -gear box -war lock -per me -it ate -gaza underattack -du val -paras ite -clement e -le th -i va -fro zen -tho les -to bin -cair n -s ill -luc kiest -conver ts -st ale -pan cra -euro pale -wis dom -sch ur -ì ¶ -verti go -bi j -u bc -nu re -righte ousness -mt c -factor y -ver st -revers ed -hur i -hee chul -fab er -ar r -ul ous -ven om -ph at -green ery -bra dy -à ¦ -: (( -never giveup -di sha -mo ta -health care -dun ham -dex po -den zel -bb ins -f ics -wh am -mc g -eli an -wat a -str alia -tel lu -pe sky -spin off -ar moured -re acted -do fficial -te du -sag ar -mor ally -paralle led -fi os -dow ner -dau gh -re do -world cup -tari q -bar ne -glaci ers -oc cult -barbar ian -her mosa -!! !) -y ur -inter nation -p ss -sit u -p int -american air -sw am -dopp ler -ðŁĴĻ ðŁĴľ -cincode mayo -le van -hell enic -mc ne -ju di -yu h -st x -qu are -ðŁĺĤ . -sti g -g els -mot ley -hard work -euro zone -e ad -ç¥ Ń -seab ir -ci us -la id -alpac a -presu mably -pewdie pie -boo ted -am ari -tam ine -sol ace -bar row -acade mies -x ian -om ination -dun geons -b ma -de ity -ai k -stab il -hir a -affection ate -ving ne -new port -ãħĭ ãħĭ -thir ds -re tains -aroma therapy -ski er -ni ma -do pe -cr inge -con domin -to or -anim ator -sar aj -seas cape -minim alism -lake shore -calla way -berg man -à¤ Ĺ -whisp ering -stupi d -ri ghtful -requ is -ir n -se va -ut pol -tuber culo -squ ish -de but -govern mental -christ ine -all man -weap on -s ito -bur i -lo lita -leaf y -fu ch -tin ted -mck en -a hahaha -ðŁĩµðŁĩ ¹ -repe al -ne gan -ðŁķ Ĭ -tail gating -game insight -ðŁıŁ ï¸ı -yaku za -z t -ti ring -pro posing -bow lers -tra itors -ak shi -cler gy -cit o -up sets -tu scal -symph onic -sil ently -shu ff -black well -ðŁĺĤ ) -ko be -rober to -ri dg -dc u -mer ino -ft p -east side -. ~ -nb l -mn leg -ts for -frau dul -ca pping -in my -gymna st -ston es -ss in -twe aks -shag gy -oak land -dem sin -sang ria -mm va -hen nessy -down ton -ri ghtly -in it -aga ve -ob last -northe ast -friend ship -dal a -tro phy -ðŁij ½ -mag in -margar itas -ê · -ww fc -fa sh -di ke -cu d -char t -ðŁij ® -refuge es -jop lin -n cs -imp y -firm ware -pas cu -flam in -health tech -bell letstalk -w aka -ol ls -la go -co wan -bombar dier -sh ome -ðŁĻ ħ -mc master -na ve -well s -u ta -tell ers -mis fits -kap il -face off -af firm -a pro -whit epaper -super yacht -speci mens -al located -... , -- __ -ka w -dachsh und -djo ker -s work -qui ere -or um -ðŁIJ ł -som m -c mt -ingh our -skin ny -lgb ti -gi ggles -break away -resear ched -par ity -my al -ms l -re tained -si vity -make inindia -sol ves -defam ation -wal tham -sri racha -road way -concep tu -al in -iw ant -å Ī -del ft -tender loin -ga ins -faul ts -sw ire -st ellen -pol lo -dy ne -bornon thisday -asdf ghj -sq l -sali m -advis es -vo ip -ìĹij ìĨ -un touched -she il -ontari o -uph ill -so bre -de shi -nov ella -du tton -craw fish -ا٠Ĩ -ma a -tw ine -kal in -ðŁĩµðŁĩ Ń -ye ss -brook s -hoo siers -ton ka -umbrel las -ay ers -ate am -acqu iring -su ction -ä n -wi es -tari ans -soci o -mat tb -shepher ds -o so -charity tuesday -s logans -ninj as -al bat -by te -bash ir -trampol ine -mydayin la -i ja -bas el -ror y -gol die -fi rec -un noticed -pecu liar -sch a -ker son -mour ns -liquid ity -qu ipment -hi bs -ar s -aeron au -slide show -sla bs -delici ousness -sk itchen -hta fc -full erton -cre ighton -aer ob -procrastin ation -az ores -white hall -uss occer -medi ation -djoker nole -and me -um en -noxi ous -jo ss -ili fe -anni vers -sudan ese -et res -under mine -whole foods -diso be -kor i -ade le -eli z -can ti -al on -gymna sium -sarko die -meteoro logist -yl de -ste en -stamp collecting -nas al -lo tt -fran ks -ex ol -ack i -good year -animal rights -y les -vio lets -mm es -s thel -ra pping -tu scan -wai ver -tur ner -eat local -northe asthour -anim ations -tom morow -t sh -ff ame -bra e -pe tron -glam our -br yn -d cs -bal es -ðŁĶ ¶ -bro v -bre v -b ons -physi que -car ne -x e -elix ir -vol ved -l oma -ìľ ł -æ ĺ -van u -ri gs -bal ance -va res -bon ita -sprink le -perfec to -di on -le ak -calcu tta -o ba -d ma -c mon -tun er -pneu monia -bo gus -apolo ge -cl ough -bor ne -)) )) -revi ved -o varian -ner f -c legg -fan fest -cho u -reali zes -mc n -li gu -leg alize -just saying -for ster -bo sni -k hi -in dom -hei del -en cryp -si ss -ed di -mar bles -brisban e -y ing -pre paid -wal sall -cooper ate -orche str -mar isa -ho wie -che wy -bren ner -andro meda -e gan -sto cki -cav endish -ag an -ban o -de ir -go g -bl k -re thinking -ch ig -rhe u -sni p -p eng -semin ole -m swx -an nex -lyn da -lewisham ilton -cu mul -tb l -dolph in -agu ero -........ .... -pre lude -at our -gr anger -too ting -ro tun -dis ar -home items -da res -**** **** -ðŁij Ĩ -compre h -jin x -as well -iri e -circul ating -ðŁIJ ¥ -over board -cultiv ate -rhe tt -oriente ering -ca k -bal kans -s itt -jas min -britney spears -ro tor -se aling -g bc -oc ci -f as -eman cip -com er -war time -tic kle -son ny -pac es -log g -at rix -sr p -g win -do bbs -uz be -the wanted -dru sh -ex tru -m icky -honore es -dar win -re dux -mm j -ram i -jalape ño -io c -do ver -ju ju -whit ney -s eng -en ly -au ch -archipel ago -vigil ant -man gal -wil dest -parano id -hal i -bb ly -sanc tioned -real ms -con co -u ddin -c sk -play time -libr a -sav ag -oc tane -rec tan -re turn -par rish -mor rha -cc p -c mu -sa iled -se vent -ro sie -pil ing -he w -boar ded -seg ments -neph ro -( . -cr ats -bak es -ðŁį ¸ -back tothe -sibl ing -kirk land -ke o -gu wa -bre ads -ðŁĺľ ðŁĺľ -t q -haras sed -ga u -wil bur -j isoo -ep er -li sam -tri ppin -sh ino -ru kh -beast mode -cho a -inst aweather -rich land -gar i -fe z -cowboy snation -fur suit -k run -a en -sycam ore -se gun -ent ennial -di h -o ax -demsin philly -ðŁĻ Ģ -sn hl -pen nies -pass words -ma kin -ty e -d eng -kni gh -jeep life -hel pline -a for -zz zz -ste amy -pic ker -iter ate -happen ingnow -ki b -bloom berg -martyr dom -bul ly -assor tment -a hora -zo e -no i -illu stri -agar wal -p sc -electr onica -recruit er -gar diner -rad ha -naf ta -dot net -pi ero -geor g -bel s -ðŁĺĤ ðŁĺį -tuberculo sis -run nin -mor is -haul ing -ev oc -bre thren -sha ir -frame works -a stu -ri gid -ku ma -kre me -jin nah -insu rers -ny u -f ere -nol lywood -good vibes -- ... -toi le -sk ril -instaweather pro -cze ch -pa vel -one piece -nike plus -fi let -cav ity -ðŁı½ âĢįâĻĤï¸ı -ðŁİ £ -dra stic -dail ys -siam ese -re bu -oste o -lar k -f re -sh elling -p é -glad ys -ðŁıĢ ðŁıĢ -gusta ve -submer ged -grand stand -att u -won t -f pv -b ley -jon i -ang ames -weigh ted -al ou -ठ¶ -les bians -f j -anni es -am l -dor ia -dav in -be ta -can c -madewith unity -ha j -bad lands -mu l -blu ec -pa wn -cov ington -neuro logy -htt weets -dysle xia -thel ove -ne at -fork lift -autom ate -une ven -monte ss -he in -ha g -rel ics -competiti veness -can elo -mar tens -bullet proof -sk ittles -g ya -pri mo -americ afirst -woo o -abor tions -?? !! -ma che -ld ers -rl ly -preli ms -direc t -cour se -swa in -super cell -ec centric -sting ray -ple ts -wil cox -west in -okan agan -kir an -car bo -bomb ings -ra rest -bo h -gaw d -di gg -mo ana -enti rety -en closed -dodge ball -par ton -milky way -at r -thorough bred -re ally -qant as -epiph any -ine e -aero smith -spi eth -ar thro -ell ini -du bu -bra ving -âļ½ âļ½ -re structuring -illumin ate -equ ili -mp i -ash ton -pony tail -ma scots -flat tering -cru m -ast a -à® ° -stranger things -bar nab -ر ÙĬ -make shift -got cha -will am -cho irs -kilom etres -gho sh -eu than -dol ly -un ning -the ar -cre we -w sw -j ace -dis miss -ke an -ho ta -kh at -~ > -thir u -ren dez -hart man -tee ssi -cas ca -z ah -hydr ange -fo d -aw p -mzan si -thick er -nago ya -ne va -sti que -cast el -dam ian -there by -ji ang -ale k -music islife -ra q -calla han -gou ache -somal iland -sean hannity -ra heem -lo se -elo ve -whar ton -rectan gular -illustr ating -har ne -auti sma -scra pped -ell and -decre e -nag pur -ki pp -so re -n md -ma as -gun a -gart ner -bel li -then ight -je on -gendere quality -gi ver -a el -gar ments -ne u -mardi gras -mar sden -ro wer -pollu ted -camer aman -vin od -be asley -cro c -ji u -hollyo aks -anesthe sia -al les -ste ward -lati mes -ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ -tic ian -gor ia -come dic -ðŁ¤Ķ ð٤ĶðŁ¤Ķ -nai ve -sli ons -ł Ī -bur glar -ðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃ -york shi -se ñ -fan boy -lau rel -inci dence -potom ac -rober ta -presi den -pr yor -os bourne -w ku -te me -pal ae -ðŁ¥ º -re boun -itu de -red dish -k hand -coloni alism -north carolina -ðĿ Ĵ -manne quin -lady bird -ta sty -knowledge able -g shore -ðŁĮ Į -à® © -qu aker -salz burg -med alists -chy na -bridesma id -ma ori -ro p -outra ged -in adequate -truck ers -al ana -ìĿ ¼ -ri x -oooo oooo -command ments -lam beth -aa j -eco friendly -bla z -morecam be -boun cy -rou x -rai ded -mi zed -sh c -gaw x -labor atories -ru bs -rest room -consult ations -ca jun -virgin i -so ir -rev ue -ple in -wag er -ç ¹ -we do -growing up -! ðŁĺĬ -face ted -sin ners -ho vering -ti ene -seas oning -an ja -leg go -il is -fla x -dev o -ash ram -mati sse -ker i -go wer -bo tox -mar shes -unh cr -ts m -opti mus -dun i -stu ffs -so k -order ly -n bad -islam ophobia -raviol i -fab er -cre ds -won ka -in fusion -over weight -daily news -assi mil -acol lege -medalli on -kili manjaro -sti ff -tham es -sun ken -th ard -my dubai -hilari ously -han nel -plu mber -fair view -separ ating -rasc al -qui en -necess ities -confeder ation -ll ll -: ] -weak nesses -bron co -ra ffles -el ot -ãĤ¸ ãĥ -advent calendar -ðŁİ ¹ -stra vel -tun ic -k su -im peach -e spionage -! - -di ment -cur rant -bio de -commu ting -by ron -ðŁĴĵ ðŁĴĵ -shad ed -tr uro -cray ons -ar ne -h sc -fre aked -dram ati -fle ek -u cd -marl borough -^ - -cross ings -mal o -black ops -bin ance -cho ked -chen ey -pl o -ge stures -val edic -ryan air -rem ington -v cs -mc kee -ec z -be gs -nail art -mayor of -happy fathersday -war t -pet itions -n ingly -clean energy -bro x -sl alom -exist ent -ab ay -ug liest -tom p -stom a -sel by -goal scorer -ben ji -overwhel mingly -lan s -semiconduc tor -south korea -re scheduled -sk yl -en listed -dow ski -si del -rosen berg -nas ser -white head -pri us -har are -en n -ry der -í Ĥ -mon g -clas ico -transpor ter -po tty -is me -** *** -vic e -sk it -ode ssa -l mp -her n -raci ally -pin oy -paragu ay -obitu ary -go es -bu cha -side walks -angu lar -un constitutional -transiti oning -i bu -gu ys -un packing -oooo oo -black girl -ber gs - ¯ -wordof theday -trump train -thunder bolt -m si -fasci sts -ठ¬ -t sk -collap ses -raje sh -loveis love -migr ating -set back -ðŁĺĬ âĿ¤ï¸ı -t els -safety first -nar rated -jae joong -un answered -lique ur -en nes -dal go -bill ings -salt water -mer maids -lon gs -clap ham -we arec -pic collage -n ach -h ace -pois oned -lo th -ag na -adel rey -guar dia -poli shing -peace keeping -d all -p isa -la pland -process ors -de andre -so bs -p once -dra ins -c be -ðŁİ¥ : -spla sh -meat ball -fon tana -worcester shirehour -ne v -bri sk -b int -ac r -po x -cay enne -skril lex -j fc -hahahaha hahaha -gla s -en gul -tempor al -oni zed -con cre -com pose -vibr ations -plant ers -fer t -criticalrole fanart -t bli -sch allenge -huck abee -munici pal -iam bic -radi os -ne vis -dura bility -mc cla -horse back -inst itutes -ful fill -atta ch -ate ur -ak an -resi sting -illumin ation -hand le -hair care -om ent -macle od -ka iser -g no -bear down -ly f -gl omer -distor tion -z m -san k -roo sters -is now -as ports -ag en -wo ken -st george -ro mper -my le -econom ists -ru to -t will -health and -d ito -ws l -tair p -pra kash -mic heal -h ts -w rights -kat su -fioren tina -defen seman -d itch -var sity -texan scheer -ba ham -sc anned -we il -seduc tive -ðŁijį ðŁı½ -fu e -er win -dav ison -ter ran -moo ds -wool f -re source -@ . -cu sh -ðŁį ° -regre ssion -cur led -la zer -jo anne -ab bott -mo z -down ers -mm mmmm -valent ina -k hair -dream t -cro ok -che k -ste aming -nephe ws -cl eric -as ober -indefin itely -w ye -us news -joy ce -flu shing -wynonna earp -ron do -kis s -hot dog -bar ns -sax ophon -far ley -gas p -decre asing -al way -pe x -l sd -shi ft -p outine -ra zz -rescu ing -ni ko -ho ch -cc l -u aap -n ts -m car -il wx -conqu ering -ket tering -stur dy -delay ing -sto k -vani shed -cath ar -bin gham -in v -ic hiro -he mo -budge ting -[... ] -be ss -sebasti an -slow ed -ðĿ ij -musli m -stun s -acton climate -ve a -se ton -rose tta -oun t -hard in -flu id -ca w -ðŁ¥ Ĥ -yach t -un l -sp hy -provoc ative -or ic -is back -__ _ -nicol as -gy an -loo se -fl in -reb ate -: :: -! "@ -com icon -she ff -down stream -chic hester -beach life -mom life -diabe te -ar ra -van e -ok u -ye o -man go -try out -app ell -he irs -arjun a -dd u -na veen -movi c -soci alists -s back -criteri on -soyu z -k her -da z -yol anda -wine oclock -re ina -one w -leon ard -en dez -u bs -support local -facilit ated -carameli zed -b pa -vuel ta -my tho -m ami -spe are -nbap layoffs -fe vre -nick jonas -im print -c so -craig slist -la salle -gi deon -ha doop -dis regard -w ud -tu c -ma gee -acou stics -ta a -qui e -pol a -cr t -dw yer -dis sec -capit ol -men tion -kn oll -he igh -fin ders -plac ements -l se -indi ra -gur i -madhuri dixit -kingdom s -iambic pent -geor gina -je ky -conflic ting -bay an -aga tha -uph old -dr on -vic ar -ex pat -periph eral -pe ssi -fa f -ance stor -? .. -wid get -pun c -comm enced -beav s -air waves -ad dis -po a -de sses -co den -vu e -ru pee -kar in -spo ck -m sy -ภ° -pr ick -fill more -ti fication -thing sto -sar de -em ile -pere ira -n ad -bright ening -arre sting -wo king -usc g -sp ill -raspberry pi -hu go -ite c -is ma -cuff links -optimi zed -oc c -mi wx -en ka -el ited -afford able -sa kh -coron ado -ho h -at ul -ai oli -jim cantore -accoun ted -vin ay -her mit -groo ves -ran ch -r illa -we tter -ou tof -veter in -ni kov -ki an -fair banks -ram apho -n iti -k ko -ru sty -ne stle -tv xq -shahe er -âĿ¤âĿ¤ âĿ¤âĿ¤ -penn ant -gem stones -dem debate -ðŁIJ Ĭ -auton ews -support indiefilm -mach o -ve x -new sat -ne ti -conce ssions -can died -yof the -mac au -den ds -cricke ters -san iti -mari ano -gh at -ar toftheday -¡ ľ -e gos -gen oa -chat bots -bri er -al labout -mon ty -spi ed -r tr -comfor t -sni ppets -real time -gra in -exam ined -en lightening -tt u -god bless -release the -sing ular -ki ans -ha ka -sor ren -defe ct -mar g -equ ities -d orian -su ka -per l -aishwar ya -pul lover -preci sion -fair way -ne ve -rive ting -vill anova -en com -ak o -passion ately -europale ague -siem pre -x vi -enligh tened -c fr -âĺħâĺħ âĺħâĺħ -wast eland -is f -new comers -emergen cy -amphi theatre -- . -text books -figur ative -tre mb -pe sc -ab hin -ab bot -ac acia -har ds -por sche -kau ai -el isa -car rick -abo u -elli er -be ch -neu tron -galap agos -ru ben -in nis -how to -nun s -sab ine -i ac -clin ched -no tori -fi ves -cairn gor -per i -gr c -ðŁĴ¯ ðŁĴ¯ -mal m -twelf th -di ff -rout ines -marty n -lin den -synthesi zer -nu mber -game cube -fal kirk -byz antine -queu ing -gr ill -scal able -char red -rou ting -her bali -gri zz -ðŁĺŃðŁĺŃ ðŁĺŃ -tol l -termin als -l pc -ab d -war mups -remo vable -¯ \ -vi go -pap aya -ne ve -lov ingly -jo kers -ib les -sse tt -poten ti -pel e -gi gi -sadi q -leg acy -son o -ru pees -retar ded -ele e -par r -fi ance -ey re -say ers -pend ants -mak nae -al bans -adap ting -p ff -pu berty -ji u -ing rad -hypocr ite -diplom ats -phys ical -rob by -bon sai -ãģ · -f att -catal unya -âľ ĸï¸ı -ro ma -more land -so e -conver sions -stl blues -shol m -gra ssy -pra do -on u -assaul ting -> _ -sett es -dis graceful -aph ra -âļ½ï¸ı âļ½ï¸ı -ठª -kil n -goal tender -s ru -philanthro pist -b als -th n -stu den -sando val -dogre scue -eli ons -asse ssed -lar go -hec tares -sh rm -sa if -cle avage -no ches -n ene -fat alities -cur ing -clean ser -al es -p vp -south bank -pizz eria -marsh als -kni fe -an dover -tbli ghtning -sr sly -ou te -digi mon -timesof india -prome the -le bo -f su -wit z -rever e -man as -mam ba -ch ica -gu an -exhibit or -csr racing -d ere -xx xxx -gu sta -story time -ston ey -organ ics -and u -se am -min ogue -anushka sharma -ab a -ðŁİĻ ï¸ı -ugand an -chro matic -as sn -document aries -sh t -ru paul -loy d -k ats -e us -ite ch -me dusa -pan ty -kel logg -et to -talla de -sha a -do st -p ms -mari ana -je ster -croo ks -ðŁĶ ¬ -min danao -ind hoven -ðŁ¤ ª -le xi -tv n -jan is -co te -ãģ Ĩ -ser rano -iw m -ðŁIJ ¬ -k ke -distribu tors -cap u -counterfe it -camp site -ag gie -ðŁĺ ¼ -chhat tisgarh -~ @ -state u -san di -prevent able -cl s -can ne -mm c -i ver -sa haran -pal is -night out -do s -ap ia -absc bn -manag erial -aro se -mo wx -aro sa -ðŁĮ ³ -under dog -remo ver -astronom ers -lent ils -su scep -smoo ther -pend leton -fau cet -e mory -dal mati -af cb -tic us -exem pt -en rol -d heim -ðŁIJ º -restric tion -star fish -sto w -snor kel -thunder birds -she ad -homo sexual -dy n -as li -andre tti -dou che -dom o -tar mac -slu mber -pr onto -first dayof -mini ature -mari achi -argu s -recomm ending -mobi les -in ce -illustri ous -or c -adver ts -gr its -wea sel -pag oda -over pass -gre ys -maxi mus -arma gh -wood land -sun ni -ðŁĴ ī -ë Ŀ -ti one -soci o -ho s -ðŁ¤Ĺ ðŁ¤Ĺ -wind sor -subsequ ent -munch ies -id h -exclu ding -e mi -cu th -z ai -week days -law suits -barn ard -Ø ª -pe tting -net es -mul ligan -pharmac ists -ra quel -e ton -cran ston -gil ded -cle ary -ce ph -ra a -pam per -lombar di -as in -sher ry -pro d -for te -ari anism -buffalob ills -æľ ¬ -ðŁĶ¥ # -uu u -just ices -car ina -nat in -mas low -dro oling -cog nac -cam ber -el ong -r dr -in en -convic tions -am use -tro ck -harm less -visit ation -gen omic -bl and -beno it -chim p -tuscal oosa -gre asy -x po -gil t -se q -per mitted -christma seve -book s -mu e -old school -human right -be ati -ðŁĶ Ŀ -sh at -sculp ting -h wan -fern andes -sci utto -fu entes -endeav ors -maid stone -un paralleled -shou ted -queen of -mer c -band ic -ve da -sel angor -pi le -ja han -intimid ating -disapp ears -cl ich -za ha -w urst -hi v -fod ils -cor dless -aaaa aa -hy dra -bel inda -e els -bu f -su staining -rugby league -no c -brig itte -( ðŁĵ¸: -tromb one -soo the -smo g -ad p -stab le -ing ley -diagno se -ms g -we ss -tic keting -one e -nsw pol -e up -auto psy -adity anath -sun down -river front -si ya -p is -hier archy -dur ango -di jk -ren shaw -he aps -epide mi -david bowie -interne tof -dd i -nation ality -mb ar -air y -win der -w alia -elli ott -c x -bav arian -pl att -an tw -wi wx -sof ter -ne ha -h eller -th and -dani ela -bo ast -degra dation -ðŁĴ¦ ðŁĴ¦ -transform ing -man e -av ut -ðŁĺĪ ðŁĺĪ -vo ter -the e -t ate -pu ff -in door -sop roud -boy ce -boris johnson -wait in -immun ology -ðŁıĨðŁıĨ ðŁıĨ -âĿ Į -street food -liz asober -cavali er -c elia -need le -motor ing -g ato -, ) -ra de -harve st -t ms -jar pad -on ey -air men -v re -impair ment -abhi shek -snoo p -l ant -fam ously -bl ou -s ze -g ander -un touch -tu f -dee jay -col lateral -b ind -ðŁļ © -pin ning -ic n -' ; -the economist -ul tram -worldwater day -ti poff -the i -feed ers -campa ign -sc umb -day weekend -yo m -pe dic -h ough -ps v -pl in -on de -boston marathon -az zy -* _* -con ley -thi ago -hoo o -gal erie -luci d -je tt -gl itz -final fantasy -achiev ers -y ung -peregr ine -op hi -dam es -biom ar -âĺĢï¸ı âĺĢï¸ı -sk c -l ics -fl ank -ar rahman -ho of -uphol stery -t ats -wo z - ¿ -snor ing -ra er -l ju -ap d -pl ating -kan u -im ation -fragr ances -m ra -mor ay -mo tt -im muni -hearti es -bho pal -tim ers -g ata -color way -car nation -win get -si ghs -s ville -optimi st -chate au -olympi ans -ci o -singer songwriter -ny o -fi bers -bur ch -ag ro -mil ne -ig bo -cr amer -ation als -dan ube -pad ma -nor mani -en forced -bre ck -boeh ner -ar den -sur rendered -pros thetic -om a -ha iled -calcul ations -w fa -bi b -fcb live -fon da -west coast -que sts -friend ly -to wie -fit ch -bal ot -star dom -scrat ching -ho sa -thi ka -o ven -stro ke -out post -pharmaceu ticals -hi kari -mu y -af d -fallon tonight -squ at -or u -dra ined -chocol at -ë¯ ¼ -wor ths -ri b -mu j -that s -residen te -it el -boo st -mi gos -mul led -la a -etsy shop -don keys -me k -p tc -flin ders -e hs -ro hit -mu ir -g ad -compos itions -åĨ Ļ -combu stion -i kh -yemen i -wav ed -gar ci -ak os -oo ds -fu sion -se que -s lan -pl ur -kic chasu -shenan do -s ams -worl den -horo witz -with me -mic robes -k ki -ðŁĴĶ ðŁĴĶ -w su -patch work -fre er -y aki -the art -symboli sm -mil er -bt n -ma bu -side kick -motiv ates -sag itt -natur als -serv iced -ps ori -pa ola -qu ig -i badan -gi ggs -ë ³ -sciento logy -si oux -salam at -d res -cad bury -d hawan -ci ón -_ ' -swa pping -maris ka -james bond -explo sives -ay les -af er -s agu -cen sor -tom a -jeff erson -ring ed -par tist -ir responsible -aguil ar -vac ay -equ itable -altrin cham -ac ur -man ish -ger min -schoo led -pu tter -ed ad -nav al -toast y -sol areclipse -dish u -coy ne -ac co -mu ck -mar an -el os -len der -cro ix -worth less -ha ber -gun men -ðŁį ĵ -zen ith -t enders -hur st -hol tz -itali ans -car low -u cd -characteri stic -bun g -av l -u th -sa sia -rs l -red man -neighbor ing -green peace -sti ps -follow party -y gk -en os -omni bus -na issance -chri ssy -secu re -call back -ji hoon -memor y -block er -l anta -daf fodils -bil t -ffer ty -fau st -ie c -nipp les -so g -m nd -jagu ar -bol dly -ab poli -pro position -gun sense -evan sville -cu tters -we go -dou n -do x -stal lions -ka j -shi ppers -j awa -vol o -le ven -pap rika -kov ich -jor di -induc tees -app alling -dial ysis -allevi ate -âĢĶ âĢĶ -pie ter -mid wi -q tr -juli ette -inter mission -haw ks -act ment -one ill -k lin -vam ps -fam ous -cou ld -autom obi -da an -west end -elli p -nh c -mel anch -web series -ton gue -snat ched -smy th -tan gible -sl i -e asing -bar stool -over lay -afford ability -ting ed -ter as -ay ush -wanna one -rh ine -dan a -sh ana -kend al -fer tile -w ir -repl eni -lar vae -is ro -con vos -ab brevi -u cc -hun gry -bur rows -ag er -nav i -mat in -du per -cer n -ma don -ķ ï¸ı -é ģ -tu ps -hy att -sh ep -friday night -wis er -hei di -hat ton -p gh -foun tain -wrist bands -ahmadi yya -aeri al -subscri bed -so los -m ace -sla yed -for fe -dul ce -christ mass -arun jaitley -viol ate -ob stru -ni eces -w vu -idy l -fa ze -pre serves -infr inge -premi ers -inter vals -agen cy -( © -stand alone -di mes -bo er -param eters -ge tit -ðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺ -tu lane -for given -scol l -mb ps -smash bros -rob bi -prima vera -ali st -ghost ly -ay at -ye ats -impre ssionist -ear phones -caul field -wai kiki -sal ute -sc ou -mu ay -louis vuitton -bak hta -ado g -inven tions -hur d -forec lo -stream line -thalai var -ch snews -will ard -t sn -euro parl -cru sher -my sore -gro wer -ra ping -pat ti -g den -sm w -muf ti -kid man -ab r -soun ders -skep tical -ðŁĶ İ -sun dar -i me -fer g -feather weight -ar lington -pas qu -ag azine -wearab le -nati c -mccl ure -inter mitt -hor de -six ties -car te -bha v -ze al -experi ential -ador ned -som mer -eno te -hypo thesis -stin ky -pro to -dead lines -vo gel -mus ings -monc ton -gu ter -f le -aci on -voice of -ta sha -inhabit ants -type face -s ba -bts x -ðŁĶ Ĵ -wor x -u hc -jo ko -cell ars -gor o -continu um -... & -weather cee -ha p -sr k -ris ers -lonely planet -un named -co eur -ðŁį Į -the world -ili ke -fa sten -ami go -ri ba -ramapho sa -staf fers -had ley -? ?" -fi ore -sal ut -hu ff -bez os -Ñ ĭ -ra der -kam ala -in line -fill ers -um atic -all in -shat ter -re in -o ku -ch ases -fla gged -baby metal -water stones -ts b -cut out -op hel -aam a -rockab illy -sto lic -jet blue -ich ick -down ton -uzbe kistan -pat na -la q -gr ange -) _/ -subsi di -sc p -newsc ast -it sa -twee tyour -e mor -archae ologists -uni fication -por ta -q x -protec tors -pro hib -charis ma -car tag -ren fre -scul pt -guwa hati -de ma -boo p -unf pa -dex ter -lay la -alleg es -sou ps -never again -l ys -cal c -bar oness -visu alize -ger ber -absor bed -i ers -a han -fon tein -detec tors -verst appen -sv c -formul ated -ac dc -li x -in competent -bh k -lour des -water house -snow ed -appreci ative -sig ma -lizasober ano -pen ned -pay check -tall inn -fanc afe -par isi -av alley -vi g -ru fc -hard ship -so cute -po ise -ì ¹ -roth schild -k ly -???? ???? -l hp -il ay -f hs -am ad -ide als -brad bury -bal boa -nic ot -kid nap -wol ve -tas manian -op t -matthi as -ãĥ³ ãĤ -super markets -mylittle pony -me lee -li ster -gr oun -fe dora -kind ness -en en -bra hms -¯\ _( -ros well -mar lene -ic u -re formation -or ail -he brides -dispar ities -terrac otta -swal lows -re id -influ encing -flu or -den e -tum our -blon des -thunder bird -sh eva -moga dishu -ka b -cre eps -i ving -ene ed -anno y -âĶ Ģ -intri gue -enqu iry -ar aj -tur al -kuber netes -end lessly -divi dends -tor a -ti sh -commemor ates -un ra -tri b -pon ty -ne m -diss ent -brew ingco -ðŁĺ ½ -nor mali -bi of -( ... -chil len -ì£ ¼ -mell on -av is -mccor mack -ing ra -enrich ed -custome rexperience -testo sterone -snu g -sett i -ger onimo -inqui rer -bre aches -very thing -bloom ing -mu ra -dispo s -bi de -de va -shade sof -in trin -sh ev -s ven -nayanth ara -gan esha -c ws -ber ta -label led -use um -nick named -ma han -car uso -ap ur -ðŁij Ĩ -w q -orphan age -discar ded -mag nu -lu e -je on -bridge port -pac ing -mercur y -( ðŁĵ¸ -marx ist -amphi bious -transplant ation -stit ching -then burg -gradu al -ãĤ Į -ro ft -ma ils -ine c -guy ana -dopp elg -ver o -re write -head less -harb augh -gate way -car sforsale -sw i -st is -mach t -un de -sura baya -stap leton -nur turing -mil ner -ya o -lma oooo -ko sh -arsen al -k ame -er ry -ar royo -dis misses -ru bbed -rc b -lew d -dil u -and or -vi de -ur in -inter sec -ha ar -al b -year swith -app leton -é al -ul livan -suc cu -monter rey -d mx -artem is -ron nie -farm land -s football -gro tto -anth i -ãĢ ģ -à® Ł -vid ya -jimmy fallon -ൠį -t zer -gravit ational -w thr -u hhh -e hr -tin ker -ti juana -scran ton -ram charan -bar clay -re van -m si -ka p -wr s -we thenorth -tor al -sat u -gro m -fac ep -erick son -z yn -se dge -oo dle -spur sofficial -ds p -sic ilian -soli hull -recei vers -ladak h -hend rick -ther i -presi ding -mc guinness -litt ers -gun nar -gh oul -wi b -n tv -kar o -fro ck -b lau -ampli fy -all is -ul lah -memo irs -kh loe -intercep tions -pet day -lo oney -con fin -ch ay -piyush goyal -frequ encies -ut z -event ual -warm ly -obli vion -an ka -ta it -âĿ¤ï¸ı . -director ial -ru lers -prince s -mu ck -stur ridge -deu ce -abri dged -bagu ette -un cles -pen du -min ding -forre ster -av ila -wall er -wall street -ment or -hin o -high way -crom well -fanart friday -mb i -co yle -a hi -tro ve -spie gel -pay tm -mcin tosh -jan sen -nit i -nash ville -len o -leicester shire -le gos -dic t -ðŁĵ ½ -sp ad -beverly hills -sy rah -separ ates -z ain -un fit -dra gs -tan ia -over flowing -hri thik -haw thorn -z ani -mac far -fi de -to tem -pe ds -fundament ally -cal ico -sin ner -j ä -hil de -ds d -ten ay -ta hit -mil f -lie b -inform ing -up lift -ra el -mortg ages -lec t -ii ii -guillau me -compos ites -old smobile -l end -gar th -com mish -bapti zed -scorpi ons -ru cker -bringback our -alli ance -thalap athy -tal i -sp ans -eri dge -wither spoon -lin da -sky lar -kor n -hom s -Ä į -sil enced -caf fe -ar ty -dist inguish -to wed -pun g -jessic a -ear nest -beau fort -t ama -study abroad -si khs -new bie -nav ratri -mar ble -loun ging -lit ter -dal it -so sa -iz es -gra de -com promising -tr iton -de tta -v j -chau ffe -spec tral -powe red -montess ori -artic ulate -hal ton -al co -ye y -mn twins -acoun ty -ðŁijı ðŁı¾ -âī Ī -mad men -kal a -gru m -chi k -ati s -su me -akh tar -job search -high lighter -bo ath -âĦ ¹ -tar zan -lam bo -âĽĦ ï¸ı -ox fam -dump ster -pretz els -mac os -incl ined -fac tual -adverti sers -shu i -pu ree -ml pfi -anti dote -cap o -pa str -merc ado -but ton -ar min -ag g -lol la -horri bly -er rands -christop he -time snow -monday motiv -li ss -scand als -mc i -dispropor tion -âĺ İ -sur pass -samar itan -so tho -pu rest -fl att -trivi atuesday -delec table -leop old -hermi one -chou dhary -en rich -¡ ¡ -subsi diary -ine qualities -bachel or -auto immune -la kota -i hop -ad jec -the simpsons -sh es -se k -gret chen -up stream -hin akhan -coper nic -x tina -lu g -tough ness -e ad -cli pped -bi us -sl v -fah ren -dee pak -ca u -x an -im mature -dig ni -bo bs -shred ding -but tery -accommod ations -de ven -chun ks -super league -sky bet -kil dare -je et -ë į -ce k -wrec ks -pro pane -oh l -tb d -quo i -trum pp -mi mo -reluct ant -ver ne -o ic -ma gh -ar nau -se ver -li dge -stair way -kicchasu deep -ðŁĶ º -mach ining -aama admi -ot i -c da -al it -pan y -inst alls -ac ct -e shop -di em -hard well -fulfill ment -sc afe -qu ack -extrac ts -swee tened -fi ghton -f di -d inger -wal tham -us ur -refe rees -seok jin -gran n -af rin -th n -sch af -par cels -bet is -amar ine -nom an -kh tar -mor itz -cou pling -bar ons -ðŁIJ ¸ -à ¸ -sl p -sad ler -x ander -tri ad -mc millan -kh z -divi ding -ìĹijìĨ Į -dar yl -zed d -le ys -pla ques -flu ori -tipper ary -on nell -di dier -lang ford -im c -the sun -bir dies -ar cha -ye ssss -t di -dar ia -cand ace -al tam -pal aces -ch it -sant am -event ful -book of -ad b -mon stax -cre ole -co el -âĸ ½ -we aren -sten nis -she ath -ati sm -gron ingen -mlpfi m -le pre -wrong ly -rsp ca -rendez vous -acknowle dging -pel vic -solic itor -sla ys -nue stra -lo d -is lander -fer oci -fashion show -ra ss -dge on -adole scents -sma shes -negli gence -grate ful -ved ere -sw oop -ing l -apol ice -vand alism -gan n -jo ao -di supdates -zimbab we -under age -radi ance -w of -bour geo -pla s -cr ani -gh ue -wrec kem -warran ts -re form -jim mie -at wood -ys l -neil himself -l bj -i man -tan to -nois se -ver bs -equip o -al together -mam ent -l ice -dou glass -tier ney -pri med -j hal -furn itu -braz ili -v ill -past els -n ison -u ff -paral ysis -jay e -im po -ðŁij ģ -strate gically -pakistan is -was sup -super bike -thank u -tru elove -sha ikh -israel is -vi p -to g -li en -la ker -grey hounds -cul ars -bian chi -balot elli -ar ran -loo s -str ates -he bron -ar vo -sunder land -the al -tomb stone -sand man -c pac -thanks giving -love him -lat ino -an in -aka if -ĭ ãĤ -tor quay -di est -alli anz -ðŁĺ ķ -golf club -cl lr -wal cott -sch nau -promp ted -nomin ating -len nox -val et -mon ro -may ward -e ph -ðŁĶ Ķ -inter oper -r da -re flex -arm chair -ê° ķ -stri pper -por ti -ph arm -ham za -ni reland -ne ue -h pv -port foli -sun burn -fris bee -be al -bapti ste -x h -ty m -pr ati -o vers -haz rat -deser t -der ry -us ky -em mett -ach arya -)_/ ¯ -shu d -may a -ham ill -ra im -nr c -fitt ings -cur vy -ðŁı ĩ -ster ling -à¥ Ģ -wal kin -short cuts -mil ly -ast ur -alpha be -pl i -pe z -miss you -rad ford -ml g -ta eyang -notjust lakes -du mps -seren dip -le ur -ra ving -e ster -de priv -absc bn -ðŁijĩ ðŁı» -scar city -o cr -mean ings -cap t -da hl -fer mentation -bri oche -to win -out lander -massi mo -en cro -ðŁ¥ ³ -buil t -po tam -kir i -tm w -monit ored -k ites -peoples vote -gray son -íģ ¬ -afri ka -a dies -i vote -gy ne -g annon -di x -c mc -ou ral -fox andfriends -bel i -ig ne -gl an -katrin akaif -co politics -qual itative -p si -lu cci -disc oura -âĺ ® -kel li -gau tam -carac as -reale st -pu la -in us -hill top -make aw -atten borough -tw y -r arity -peck ham -ma hon -corn elius -clin icians -ton line -tb i -paradi se -ka si -inev it -fresh ness -colling wood -lun atic -defen se -cop d -in fra -wain wright -sains bury -alab am -te ma -lac o -chec ker -releg ated -tren t -stal ks -huff post -bhubanes war -ast ral -share your -prim rose -hi me -cat an -end ment -en dow -cle mens -mal oney -hil ary -game time -den ise -collabor ators -b wo -radic als -gue tta -ici on -au a -snap matic -sat chel -excav ation -base man -s ão -gn ation -fel d -surve y -shah zad -ma st -anirud hofficial -tru cker -ot ago -geo graph -ethe l -âļ¡ï¸ı âļ¡ï¸ı -s ver -mu tt -internetof things -ancho red -wh ouse -bang la -bal main -ç¹ ĭãģ -break fa -á Ģ -twi ster -te tris -ca v -stag s -g z -au b -stor med -hel ens -yar mouth -st asy -gustav o -co sc -vin son -up p -sc ricket -assump tions -app e -nu h -u er -pre mise -n aga -e amon -coron ary -na f -north side -el mer -ro tar -out lining -el f -re surg -kat elyn -in can -hyster ia -ce e -am bani -pro lly -Į ãĤĬãģ -ax es -san jose -rem brandt -mag pie -even ly -scor sese -qu aint -f g -b buk -indian football -weare all -spd wy -pis ces -ec g -âĺħâĺħâĺħâĺħ âĺħ -pre orders -: | -ni pple -sal azar -ju me -jail break -min n -bas sett -ze tta -jef free -ad jun -tic on -san diego -drink local -chol era -solic itors -o bo -com post -ni an -wr a -tre ach -ic ic -profession al -del ve -leg ate -histor ia -cro issant -con noisse -nam o -palli ative -chem trails -i ority -global warming -comic art -behavi oural -re sted -li as -cli mates -Ł ãģĦ -rut land -nou rish -menopau se -hot ties -demen ti -ve spa -mel ville -anal ogue -tz man -str ung -im perfect -gl are -cir cling -ros berg -rec o -oc ity -lo ire -em be -do ssier -ne el -nan do -me a -gal vani -fin esse -ag p -berke ley -asi m -âĺº âĺº -quil ted -ish ere -un matched -po tion -for z -at re -selfi es -juli ana -ðŁļ ¶ -âĸ º -mel ton -âłĢâłĢâłĢâłĢ âłĢâłĢâłĢâłĢ -spin rilla -pur cell -ed p -at leti -tony awards -ra ja -pro gno -mol ten -stu ff -p ally -nobel prize -âĻ» ï¸ı -spiritu al -spe ake -sa sha -bri um -tru ss -critici ze -assassinscre ed -yor uba -u lo -fire man -workin progress -ef cc -fla res -ro bot -hi kers -cl l -shado wing -pat sy -leh man -c ns -å ± -guad al -à± į -ra pe -r honda -paralle ls -son ja -langu age -land ings -z ola -cr amps -bur ning -apprais al -jol la -ham m -kas a -gul ly -f go -uly sses -ri be -ðŁĴ Ħ -ib u -eti enne -bri ar -fin ely -comb ating -y ql -go tham -we chat -to paz -primar ies -l se -iz z -hel e -dispon ible -cy stic -bel ichick -th rush -kansas city -ge om -soli di -red bubble -by stand -cambridge shire -par fait -ast le -ow o -ind ore -stom ping -sm elly -ðŁ¤ ĸ -locom o -adm itting -hol me -clock wise -min sk -mc co -for get -ev p -cam ra -ab ella -yo tes -universit yof -mé xico -silver ado -ric ket -crom bie -pu j -eradic ate -deli ght -y go -glam ping -vic a -du ggan -coun ters -cf d -sc our -react js -pu ram -paras ites -in ki -vill en -stel la -li mbo -ang as -k cr -ðŁĴļðŁĴļ ðŁĴļ -vap ori -mum ford -oli gar -à ¼ -al oo -boo ties -ad r -k elli -dru mmers -av ici -nature uk -ron al -in trac -un splash -le che -g oma -el ine -envir o -bi onic -bu eno -mi k -av in -star ling -em powers -cake day -boy cot -ðŁĴļ ðŁĴļ -ðŁĮ¸ ðŁĮ¸ -v ach -m ci -fractu res -ger i -sk ing -exclu ded -lu ce -ja ve -ig gy -evi den -aki stan -a wn -mor als -luci fer -ha ban -tumb ling -sunday motivation -mo sley -captain america -sch icago -the one -mo td -d ts -ðŁIJ ¼ -rep ell -ii i -locu st -geo spatial -mer sey -immer se -desc end -ber nade -j s -boat sales -win der -cran k -sing leton -candid acy -ben a -ðŁı» âĢį -high lander -ol t -k prs -healthy lifestyle -four teen -end the -ith aca -circul ated -r ans -pre valent -ha vas -splend or -roo ster -kalamaz oo -jewell ers -enne dy -rou sey -es y -cann ons -ornam ental -// // -ren don -win ne -mol ding -eid mubarak -coun tess -simon a -ha wa -fo es -du ster -sb u -por tray -mar ries -goo dday -cho co -achi ever -ðŁĺ¹ ðŁĺ¹ -pre neur -tr amp -tom i -n bat -garden chat -farra khan -ever glades -ab ru -sou sa -se ce -homes wee -terre strial -bar it -sri devi -ol u -mel inda -f rick -can dies -ðŁĺŃ ðŁĴķ -qu reshi -family fun -exor cist -cardin al -ny t -dies el -cu mulus -capric orn -si ology -lor na -dou gie -an die -super sport -c fl -п ÑĢи -say ang -pe ek -ภĬ -lo be -j em -ing lis -gg led -c sn -amne sty -chu ps -ba es -sau er -ðŁı IJ -mongo lian -en et -back street -dr illed -acce ssing -ce o -b se -ai ken -pur r -wor sen -whe res -war k -testi fying -bu ri -bla st -aw g -ðŁĵ ĭ -re defining -hear ing -u ci -c mp -bon i -tail oring -ta ji -noc chi -em t -stephen king -ne et -compla ins -campaig ner -luci ano -twili ght -ti esto -pas sports -flo yd -cathe dr -na ked -caregi ver -b coz -ade cides -ku ri -ly k -br aries -dren ched -disc lose -ðŁĴª ðŁı½ -le blanc -je tty -gar ty -chip mun -b su -rhyth mic -ic z -fri d -anne x -ame x -solo ist -lanc ers -arro whead -speci fication -simul ated -na is -inver te -bo wing -wor ship -f z -abo ss -sha q -ì¶ ķ -challeng ers -an arch -aamaadmi party -ãħĭãħĭ ãħĭ -suffol k -so corro -sn ell -cla dding -absor bing -shaw a -particip ates -ðŁį Ķ -book stores -bak u -seap ort -ko jima -gab y -pack ard -electr ician -let it -mo wing -fa wad -young jae -hot mail -men ing -u rie -intim acy -con ti -: ") -lifeis good -in ciner -i dri -craz iness -jour nos -fran chi -bott len -al da -ff es -k x -south we -air a -clay ton -sco ti -f j -bri ga -ð٤ĺ ðŁı» -demonstr ators -y z -stor k -na q -casc ades -travel chat -plat a -pad ma -fran ci -at tain -bat girl -lom bard -hoo s -d dos -neon atal -discla imer -r ss -r ant -di sen -tex aste -so cal -frac tal -cam ry -stri fe -sn acking -mu h -sant ander -mor ons -gra f -par ades -hu ston -dru pal -mi ento -kir stel -hy de -vom it -forti fied -sphin x -da v -bir yani -win nings -s baseball -mer ged -lovel ondon -ling ering -dream big -car leton -liveli hood -djan go -astri d -gri ds -down e -bru ised -s ne -scarec row -hel ium -f nc -bi ggs -an ter -restor ative -em pires -ab del -life style -kiwan is -colloqui um -me en -pr ick -anti que -ze b -mi mic -edmon ds -ðŁijĬ ðŁijĬ -q ing -pp el -mc gill -interpre ting -âŀ ķ -rash ad -do ka -narr ator -electro magnetic -ash by -sau ra -iran deal -âģ īï¸ı -krish nan -in di -ff en -bre a -os man -multin ational -chi ppe -recruit ers -aus biz -p ounding -re gen -cur sor -refu sal -mac s -in ak -ax ial -wa ifu -up cycled -hindu stan -cas sini -carly le -scrat ches -re ef -man atee -eat ery -ðŁĵ ¢ -un condition -sen pai -on ther -comic book -pro sciutto -de mar -mi se -ma ge -fre ec -aye sha -al der -android games -ley ton -ho ck -door way -chicagof ire -aali yah -sw elling -bi x -. ðŁĺĤ -evan kirstel -torpe do -kon stant -genevie ve -ma ia -ha user -do torg -hide ous -fi k -sp raw -e ek -z appa -wan dered -' ' -ra jan -bam bi -( $) -wid ening -tool box -sa ir -illumin ating -pra ys -out patient -i w -day o -lo b -sw fl -sha des -gu ms -coo kin -ko di -gri ffin -traum ati -ste a -slaugh tered -god bless -air time -pseu do -b sa -hau led -ar if -à¸Ńภĩ -le l -wc po -mil iti -char ters -worl da -ru k -k gs -digital india -is able -idyl lic -esp ino -marie tta -e bo -team canada -ab our -wil ton -rock stars -fav ored -phys ic -wrink le -tb r -d print -ball arat -ad al -z ey -ðŁĺį ðŁĶ¥ -tom lin -mt r -pal sy -fener bah -tight en -phil ia -ir oning -ry u -b ant -enqu ire -ca ir -abur ger -tru n -green berg -chau han -ir ina -sh ani -trend setter -pre tt -zaf ar -alo ve -v ici -pan ic -no o -lu stre -disrup ted -bal lis -son sof -mon si -inst ac -ake st -ëĭ ¤ -kw ame -horror movies -distric t -sau cy -mb an -ar mies -with drawn -med ics -loft us -er oom -be kind -ar ns -all on -un ison -davi ds -cr at -nicot ine -so or -sm x -on co -cospla ying -zombi es -har ms -e ger -ro sy -moon shine -fe in -ce tt -du brov -reg ents -ben itez -ðŁijıðŁı¼ ðŁijıðŁı¼ -ste c -m alia -prioriti ze -ic eland -ft se -v amo -lam ont -homo sexuality -bre es -regu i -cb p -te j -sky sports -deter gent -sha sta -de rel -conserv ancy -colori zed -accol ades -vis o -show your -nan ow -bice ps -us ability -bi m -dailys ketch -pearl jam -stran gest -mega deth -broad casts -bar ren -ar ton -chri ss -confi gu -lu res -is the -e ul -railway ana -global health -gi anni -u aap -s lum -consci ously -ab re -n up -bud get -v ada -e sch -real ness -er ased -th unt -be z -armist ice -ðŁij ¹ -sh run -o led -driver less -ðŁ¤· ðŁı»âĢįâĻĢï¸ı -won dr -sk an -sal aam -mother land -h wang -gen o -gang nam -tw right -endor sing -en ic -ador ation -pau sed -patric ks -do cked -plat te -ff xv -ethnic ity -auto show -side show -after life -re located -orphan ed -food network -dare to -and ra -sla ps -v live -swim s -re imagined -mist le -re vise -real ity -bhar ti -ðŁĴĻ ðŁĴĽ -late st -prou dest -gra sses -lan yard -fresh est -carcin oma -anom aly -zieg ler -sum ner -ly rix -gor g -is d -av el -swild life -me squ -john cena -euro league -sab er -master ful -yar ra -cogn ition -jacob son -abo lic -sir loin -shuk la -moj ito -su pere -st weet -me z -e sa -rudol f -gur a -where you -tt m -win s -trust worthy -ny k -bra den -table top -good food -es on -be k -lingui stic -gra ys -ch ath -h cs -mon i -de ans -cu ssions -ch ell -slo ws -he mi -d app -shar pie -boo sters -a os -str ack -se dona -mu eller -hard wick -or nate -thor a -sal ud -o twol -ch um -mi ho -for age -thel ittle -tear ful -ones elf -min dy -sm g -gmb h -emer ald -ðŁĶ´ âļªï¸ı -tu tti -recep tions -re vising -i brox -tope ka -sal ami -expan se -i books -dob son -cli o -at s -ðŁļ Į -mo ha -is ance -shu tters -moo t -jan ine -marvel comics -jor dani -pos er -kenne th -hy ung -de ja -ase ball -speci ality -eu ston -classic car -had ith -ðŁIJ ī -chas ing -iz o -gros ven -ag lia -thisdayin history -t row -om ile -hu ar -by n -sal ine -div ine -demon ic -ty ran -han dover -revit alization -pa ella -cryp tic -se dg -m end -dun kirk -bre d -wal d -sport scar -a ard -whe aton -da ener -k lan -br t -bakhta war -spi res -schu bert -ro ti -poli sh -o se -ag ame -wonder con -prote stant -bo sa -ðŁĺ Ł -d ü -joy ride -ger trude -âĿ Ŀ -gil a -v h -tw a -tra v -swal lowed -star ve -la in -ent ren -rei ki -su kh -cra ic -az u -web page -kee fe -hypo the -hir sch -hel le -camp ground -w amy -tra vi -sha hi -san deep -ru i -han uman -dw p -reposit ory -no or -no ff -un real -p ell -black history -har vick -ma scar -pay ee -pa sha -gastron omy -d ÃŃ -ai g -rosen thal -open day -embelli shed -t tip -sun bathing -go pack -end ome -ï¸ı # -invali d -final four -st fu -squish y -ra sta -mo sch -jam esc -die trich -sel a -mel b -el vi -t dp -sun i -sli t -j ha -bi za -spi ked -l li -l illard -vam pi -syno psis -az har -kendrick lamar -ĮãĤĬãģ ŁãģĦ -heart less -country file -air play -arrog ance -pre e -virtu oso -ãħłãħł ãħłãħł -raj u -le bu -for ward -tu g -dro s -mondaymotiv aton -concep cion -thel o -pad i -looo ol -ÑĢ Ð¾Ð´ -it ss -eth ical -end uro -__ : -expend iture -mon ste -mas king -terri ers -ib is -e mber -cu mple -punctu ation -pi per -ir vin -ade e -yy yyyy -flash backs -cel sius -don nie -bo gota -ben evol -the script -shil pa -pro se -fin dia -ze ke -ne ko -do ves -blues lyrix -fro sh -sowe to -mp lo -al ai -sab i -raq qa -wf tv -stro ller -ian somerhalder -ðŁĶ ª -an on -mo seley -! ?!? -sta king -mol y -car tri -c sg -ast or -transc end -ma er -de ux -cow girl -sas k -pun ter -ma ken -o ates -love tt -grow ler -sag in -v n -ssi ble -officeof rg -y mc -sab ar -faul ty -ap ha -ak on -ðŁij « -snow don -ae w -raise the -ðĿ ĵ -grue some -clement ine -sp ing -lat a -worlden viron -mi mic -can aria -bakhtawar bz -ao a -fal a -ãĤ Ń -avi va -you uuu -thi gh -la dders -gu mbo -tz ky -fu zz -plastic pollution -est ate -strength ened -k ant -dr in -cal vert -transform ational -frigh tened -mac lean -elited angerous -ear thy -t son -to da -j nu -.. , -mic hal -i ban -je ong -is real -sim coe -exclu sives -blue bells -ben e -te u -pil sner -pens ke -athe ists -m pu -cartag ena -ðŁĴĹ ðŁĴĹ -million aires -kk kk -it ar -subscri ptions -remo te -ma fi -hin ton -w cc -ho k -ds b -ab leton -sevent y -pun ks -e indhoven -sh one -mcfar lane -lim popo -empha si -à ¼ -sin fo -pe tre -man grove -ch ino -ber tie -play lists -push awards -p af -deb bie -c do -r ino -ðŁı¾ âĢįâĻĤï¸ı -fol ke -bon nar -th ine -sl an -hal ter -evi e -aw some -vul tures -spar ky -seiz ures -âľ Ķ -ram one -ine ffe -al n -pro ctor -ast ra -the voice -gro te -sci on -dead line -am aya -tain ted -patter ned -exce eding -cross fit -kay lee -drop box -ru shes -tack led -mo by -retro gamer -n cbd -benef itting -shay kh -guild hall -gen try -dream cast -dread ed -bun dled -th aw -revol ving -n pt -kylie jenner -imagin ative -ron i -over came -family time -ds burg -car naval -relation ship -recogni zable -cor oner -ho le -fan fic -emir ates -bur ritos -analy se -thin ner -ne es -galli poli -bl r -cat woman --- >> -au lt -ada ily -nau ghty -ili o -solit aire -mtv br -jocel yn -arun ach -rep ent -south gate -hy acin -essenti al -fent on -and um -it or -go pal -sl inger -po sei -aw il -wi elding -ra ila -eli as -a sto -à ¤ -tend ency -str ata -ker t -< - -im acele -da es -sti mulus -han ley -fit nes -ec stasy -lim ous -ha iling -ðŁ¤ Ń -chis wick -tar ies -sla v -pul i -moderni zation -black mail -b ingham -h fx -+ + -ðŁĩ®ðŁĩ ³ -ni v -we a -profess or -k off -bol ster -su ave -sequ ences -pepper oni -not te -dre n -ãģ¨ ç¹ĭãģ -hs v -o ga -ap tly -z ad -excel si -rin ka -mol dova -min n -ma bel -conferen cing -bas ing -of er -ob si -hamill himself -care less -brief ed -inhe rent -par ish -dub nation -town sville -sar awak -gee ky -doncaster isgreat -was abi -gu p -phen o -dra inthe -carrie underwood -ble eds -bbc world -ane w -alta f -dul wich -ani ston -w ti -sumat ra -gra fton -bl n -me ster -bode ga -re go -es q -an jo -sump tuous -mai sie -ï¿ ½ -wil t -jak ob -el vis -se pul -mu ster -air pollution -president e -happy monday -exten sively -fl ondon -t ls -play ing -pe ed -din ho -var dy -pi ka -n iro -au cus -ðŁį ¦ -nu ll -el ondon -juvent us -imag ines -dis ab -lit o -d ura -work places -promo te -mc caf -wood work -waw x -à® ª -tt ino -shar i -sem per -better together -ðŁijĬ ðŁı» -ze bra -pon dering -en chil -ho m -cosm ic -tan z -mo cked -ec cc -ath ed -abo lish -prop eller -paris agreement -assemb lies -indu stry -fraudul ent -pe sa -chang min -ax x -ðŁĴ µ -irr ational -cu sa -ramad han -octa via -on elove -jac ki -bar ak -taxi der -seri ous -nathan fillion -mc en -ch k -po part -grav ity -copp ola -reading fc -illu sions -j ig -ww x -re sh -ex porting -buzz ard -âĻ ¤ -p cm -lan apar -ko s -arom as -antal ya -ww dc -ven a -phil a -ball in -ðŁij Ħ -quin ta -ma o -f ery -eigh ty -sentim ents -safe guarding -r wa -pu ffs -luc ille -de cath -sl u -nu gent -de ter -braz il -ze iss -super bowl -subsi dy -alter n -hi dalgo -enz ymes -ä ½ -tag ne -hair dresser -adri en -walk out -oppo ses -can tina -bed side -af an -ðŁĶ Ĺ -prophe tic -dan es -un successful -super charged -pk k -exem ption -hart le -secu lar -cli pping -br s -united way -c net -pat chy -ha gan -e en -âļ ľ -var a -sym pathi -never trump -affir mation -om f -ny cfc -ma ja -sur ro -keer th -up scale -sandal wood -mon archy -kno bs -å ĭ -po tholes -hunger games -ter races -na sir -coun sell -welcome to -wa q -se aman -m ita -stun ningly -on theroad -in ability -) !! -bon go -ant v -sp ut -worldenviron mentday -resu sc -y td -fi m -eun hyuk -sa chin -rose anne -cler mont -ape c -am ina -v ening -n antes -al most -sin us -ex as -ty l -ti en -ple ad -lanc s -bur naby -re k -jo om -observ ers -disco graphy -cl g -âĻ ¦ -sn ack -r ti -o ily -crystal li -bru te -web development -topp ings -la f -an is -ad der -reli ving -car lin -battle of -we g -syri an -pon t -n dc -lagh ate -yu ma -sp p -p iti -ro bbing -mart ing -rey kja -raj put -nc ds -kie wicz -âĢ¢ âĢ¢ -vam pire -substan tially -opio ids -nepal i -k line -ar oo -under stand -lit t -u it -thro mbo -sar ies -qu ot -b alling -t tr -s gh -philip p -br ant -ac l -m ello -whit taker -. ; -defi ant -b gc -repl ying -mir ren -metamor pho -sch wab -bul ge -utili zed -pick ering -par don -d sa -à¸ Ī -doo ley -cumul ative -Ð » -ur gency -e mir -+ /- -¦ Ī -ot as -âı ³ -station ed -grape vine -ar ac -karan johar -f ancy -sau l -coo gs -lgbt q -ا٠ħ -jav i -u mmer -pl l -den is -dai pur -pu ffin -lewi sham -fand om -co pe -ves matter -s ve -hel pless -deo dor -ostr ich -kaz an -friday the -con dor -v x -sophom ores -rob les -cu tt -cli mbers -ë¦ ¬ -sle g -sn f -mac ys -hydr ating -grou pe -po yn -mou lin -hg tv -lmfa ooo -sulph ur -asdfghj kl -annab elle -hump back -bra ved -viswas am -multi purpose -hu midi -escor ted -barb ican -f ad -cor sa -ðŁ¤ « -pi ppa -here to -can y -ser gi -or cas -o vie -ed ou -s any -glob alization -man cini -food truck -f is -defi brill -sch re -sma fia -love wins -la ut -k aka -hol lande -game on -resurg ence -out side -olympi ad -int an -abstr action -rapi d -pal om -cal le -jas min -attack ers -swag g -mit ra -ky lo -à® ² -her mitage -gor do -e ira -so sfam -roll out -exc ite -sy nod -mer rill -c als -as sa -liveli hoods -ju ve -the black -gopack go -ant lers -alban ian -wool ly -qu iche -puri fication -are th -smar thome -ne k -all blacks -mex icans -is m -ger ms -comple xion -mar ck -u shi -ðŁIJ IJ -char l -ca stic -till erson -giuli ani -biode gradable -mal bec -bo is -ju bil -im es -r ame -gene tic -esp nu -ch ley -so ho -go pher -g sc -buu ren -cu be -bridesma ids -webin ars -to e -mani pur -viol ently -notic ias -ex changing -chi ev -replac eable -muay thai -bu ss -sp il -instal ment -div ya -cait lin -o lim -fil tering -whirl wind -sta red -prior it -pr am -pompe ii -mono logue -k ite -bu ka -â̦ .. -vac cine -bre ro -woz ni -sol ent -re ferr -my rt -gridi ron -galatasar ay -fro ze -clare mont -ðŁ¥ ĥ -victori as -ssel dorf -pa stures -net neutrality -ch or -ðŁij ģ -ಠ¿ -we ho -symp tom -jo sel -in ous -dragon con -power ball -p te -four thofjuly -ec la -ear buds -where abouts -salt life -depriv ation -ch ter -wi ggle -syste m -ps st -ch az -d any -ri mo -oax aca -lanapar rilla -barcel on -melanch oly -way back -ho tro -n si -l illy -kur o -ja han -intellec t -board game -ðŁı Ĭ -sneak peek -k prc -jail s -cand el -zan zi -mor timer -star ch -ra gs -p fa -long live -k art -gir ona -cro cker -christop h -precau tions -war ship -per m -paren t -van gogh -gif ford -allegh eny -ra yn -ut m -sten cil -rec alling -pen ney -z azzle -ìĥ Ŀ -hin ds -aren as -nu ev -law ler -gu in -do this -ðŁij ķ -ì¶ķ íķĺ -we g -ti b -ri din -complex es -turbul ent -pe sos -de marcus -vall arta -sam sun -kis ses -hein rich -deport es -wil ms -ur d -then ext -inki gayo -ho wi -fir sts -carri age -clean liness -mas war -is ch -ax el -si zzle -road house -fr ans -ent ourage -co bble -boo th -benedic t -tal on -fc u -year ofthe -ray on -raider nation -fo yle -ko val -pi anos -l pg -bur mese -man ure -geo caching -cosc ino -b np -fer ra -stro phy -mar ais -ce es -legen dof -kat niss -eno ch -av ed -you know -d prk -ðŁĺ¢ ðŁĺ¢ -sp un -pro st -sor rows -cent red -ke a -gal icia -? ðŁ¤Ķ -ÑĢод а -bou chard -ðŁĴĻ ðŁĴľ -yu i -seed lings -jon ah -reco vers -ny rd -board room -su ma -my japs -tun g -sha i -ir gc -eli o -wag ons -ka shi -polic emen -john nie -ale coscino -shop ify -dot ted -de tri -va w -to fficial -in your -chal mers -trac ed -no vi -by es -ari el -nipp on -la pel -gri ez -b gs -fool ing -d ita -vijay sethu -nm wx -as ot -kr anti -hel m -ve di -sic kest -mo chi -k abo -shru bs -he red -b sp -sq m -ham r -dul kar -anth a -nr f -avoid ance -at en -publi x -be arers -nas i -ha p -h ells -ðŁĸ ¥ -ภ· -thelast jedi -oh wx -ðŁį « -wa hoo -there se -rec aps -ss nhq -bird photography -v ay -pet ti -pau lo -bel vedere -( * -gr l -du vet -c pec -sa it -por sch -meas urable -avi ators -fre mantle -bre en -on om -me and -life saving -eu ref -en don -embar as -aira sia -el is -dun kin -star magic -s ill -porto bello -ki efer -ex e -mu ted -ãģ ¦ -we thepeople -logi a -liber al -theforce awakens -min ed -haun ts -freck les -care taker -s india -âķ IJ -dev lin -list on -direction er -oh n -fi garo -em manuel -du bois -cl ones -bru ise -ðŁİĪ ðŁİī -disin fe -der matology -as r -s watch -dis comfort -tam anna -pi day -mack en -k atic -delu sional -shaw nee -gu d -al bino -p ali -din gh -cucu mbers -coffe y -anticip ating -treas ured -web summit -shel tered -sav or -pedago gy -m gs -sh ma -s bu -den ali -cam pos -bubble gum -o ir -le aps -y ler -r one -sansk rit -min t -meat less -futuri st -du de -a vel -prote sted -squ ire -z aki -sz n -har court -cycl one -bour dain -gather ings -d ant -advent urer -parag on -alt man -dd ing -ban erjee -snorkel ing -mother well -mis sy -en der -glo ws -ki wis -chick pea -por o -e fron -app t -u y -speci fied -gab by -e strada -com bos -bour bon -vin i -var un -steph ani -key words -car vings -amit abh -wr ought -tw al -re els -clu bbing -ubi quit -cri t -ambed kar -æ Ļ -prun ing -vaccin ated -boe ing -s ks -lo ona -hypno sis -edel man -pho l -he w -colo sse -mckin sey -u on -to te -sacrific ing -ox i -n ang -e mu -пÑĢи ÑĢода -m th -kers wednesday -argu ed -timel apse -ris king -regul ating -ni gh -likeli hood -cu bic -au ction -rein for -pi stor -no ses -ye l -snu ggles -pe i -jean ette -ta ku -ri th -guy z -ภŀ -y te -ver ted -pay soff -jau regui -hoo ligans -procedu ral -mi b -har dy -el eng -chec kers -all ine -the met -prou dof -keerth yofficial -collabor ator -ni u -infl icted -adv ani -re twee -memor iam -f icial -ti ghter -sal em -re viewers -br ics -ben digo -am ell -tur kish -sush maswar -paul son -pal awan -mol lie -stitch er -s burgh -ir u -hay dn -en ers -aro a -u zzi -saraj evo -hel a -apol lo -nine ty -vac a -sp on -vent u -jel ena -hei fer -avo ids -sp ine -pri ze -mar ist -re creating -me de -woo den -find lay -ro fl -n di -compreh end -yu go -y ü -to work -u fos -son ar -pi ston -recor ding -tent ative -art forsale -pel lets -fre do -ÙĪ Ø± -mu ses -custom ization -pro found -is ner -ide ally -si am -plan kton -cm dr -man ger -fran ken -customiz able -ठ® -walk away -swi vel -vast ly -no ton -lex a -ex moor -z as -tan te -reduc tions -lol ly -hip sters -benef ited -ë ² -ww www -mascul ine -fi ji -dre y -ph ill -ane ous -nic ol -men dez -disapp ro -ch ner -through s -shen mue -east man -ðŁIJ İ -yu ck -under tale -re ys -go beavs -eng en -c na -mer r -bir k -ãģ¨ç¹ĭãģ ĮãĤĬãģŁãģĦ -âĥ£ @ -yn na -ste ed -offen der -at um -vani shing -presi denti -love them -g nocchi -fri ggin -per il -mad hya -ag ne -dee jay -mar nock -m tb -fold able -@ ___ -stand re -bron x -bow ski -fin ite -cro ckett -b sf -ge tit -seren awilliams -mir o -ignati us -sla y -rin se -fon due -sel dom -s more -gan i -dy ce -dmit ry -cru mb -late post -pri mark -oh ana -flor als -do a -remembrance day -d ds -azi one -toon ami -air port -æĿ ± -th ad -fi st -dine sh -dr who -ad words -admi rer -pro je -kyrgy z -à « -manife station -le wan -j ic -thi bau -le ased -van ity -nouri shed -never theless -aug mente -fu elled -che ad -wil shere -ru di -p z -my co -mor ro -herbali fe -hardro ck -de man -dre ality -sp ades -ce vic -bha i -bar on -ultimat efan -hou news -to bi -stru t -ke el -affili ation -the masters -sm al -hu e -este ban -con v -om nic -datab ases -co v -ter ti -st g -snoop dogg -metab ol -leth bridge -ðŁı» âĢįâĻĢï¸ı -year ling -residente vil -nws l -iy aki -griez mann -c ous -ðŁĵĿ : -tor ian -sam i -ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ -g are -alli ances -whit field -we ther -refin ing -coy i -kra ken -ðŁĺĺ âĿ¤ -singul arity -lil i -h ns -bol dand -waw rinka -misogy ny -lo vers -c q -b dg -ad ona -gar ter -women of -sc d -recogn ising -mun a -str ou -sign alling -lare do -hell boy -alek sand -un available -pedi atric -as in -mer ia -ri shi -futuri sm -w ye -polari zed -e we -pro pel -in forms -cre ase -~ " -arti ston -like for -heidel berg -er ra -life in -len ny -inter rupt -cohe rent -ca z -vick ers -le veled -f bs -cab ins -bu mmed -apost les -we h -ten don -souven irs -infu ri -pier ce -asse t -m las -go th -di ggin -ann as -yl or -th waite -sw el -pan era -mur derers -croo ked -bs go -ac u -a on -re an -one of -ko hl -bloo dh -pest icide -lost dog -fle xing -ëĤ ĺ -su pra -eter nally -ðŁļ Ļ -pa olo -ol an -mom o -is elle -captain marvel -s lou -mistak enly -akhi lesh -mer t -il inan -bu on -bal kan -mir ro -mill en -der ail -dam on -tit i -bi os -re don -pic ard -par te -ðŁ¤ Ł -Ø º -son ics -fir sth -dd c -veg ans -tur ban -ni gan -lot tie -lyn don -star buck -pink floyd -life styles -am ara -a she -r sc -val a -sm er -cw gc -cli ent -buen as -jag an -coo ps -ðŁijij ðŁijij -speci alizes -snag ged -g lar -ben net -wildlife wednesday -bow den -pi k -art in -empor ium -ar l -re ba -pas ser -disappo ints -additi ve -âľĬ ðŁı½ -bay er -missou la -ha skell -comm ences -ni x -ne man -explo ited -plastic surgery -cc d -aso cial -vo t -sie gel -fro ome -kap am -far a -e ha -pro bes -mw f -meet ing -p bb -ak ins -mistle toe -kingdom hearts -for kids -ec r -bal e -escor ts -adidas originals -k wa -k ts -hallo ffame -ðŁĺį . -wag s -pot ted -o wing -honey comb -he fty -uro logy -mer le -b pd -stri pping -re ich -k state -gu ay -yon ge -shak ti -g loom -bat t -son om -n ery -el ba -blan ks -hel le -triple ts -bom bay -ak arta -ab ia -transm itted -rol f -ja is -angular js -fi erc -m ss -trac e -ॠĩ -tom bs -old man -kom bucha -fo l -e health -cere als -are lli -in ari -ðŁĴ © -wo l -liber ties -fa wn -af firm -nun avut -hyster ical -k drama -art es -âĢ¢âĢ¢âĢ¢âĢ¢ âĢ¢âĢ¢âĢ¢âĢ¢ -valent in -man slaughter -gal es -eo in -energi zed -del s -with draws -st les -sar castic -ram esh -incredi bles -lock hart -ya wn -ultimatefan live -oooooooo oooooooo -mu en -guru dev -te er -pe eling -new snow -lingui stics -direc tv -ag end -uni lever -ru ger -han dedly -ero se -li mel -the c -royal ties -fini shers -nr g -m gt -fid get -com ps -bac on -aggre ssively -ab it -ch â -tar de -slu gger -q anda -gre ening -d ats -ensla ved -spec tor -o ye -fre ef -b hand -stop brexit -mis conceptions -cav a -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺįðŁĺį -multit asking -hou sel -ferre ira -cen time -ank les -jo dh -hel ly -fro me -out tuesday -nar nia -bal aji -l bloggers -jyo ti -ðŁį ĩ -lan cia -cap ri -y ap -nat ash -down fall -." âĢĶ -à ® -ligam ent -coat ings -ai ded -hi ko -fall ing -encryp ted -yeg food -infringe ment -cu di -ce p -ðŁĺį ðŁĺĤ -tra d -super rugby -ed win -wh iche -vi meo -lay ne -in vigor -he he -dubrov nik -bie ber -u tr -sham an -op ers -ham ill -en ig -di f -ar um -scrap book -min h -diver gence -mckin non -life time -guter res -wil le -ple as -patt y -mic ron -k z -dom aine -ru sher -m ds -ches ney -screw driver -âģ© , -sle dge -hau er -chan a -stam ina -sprink ler -pl n -he ff -bol ton -om on -car rington -accor dion -jor ge -inter ception -in puts -gu ll -tran scription -vanu atu -it ical -eth os -tic h -spac ey -pee king -u mi -ha ger -psycho tic -illi an -illi a -bonnar oo -an ese -pu c -laghate parth -en hall -econom ical -dre dge -% - -u we -tu bular -scoun cil -pe asants -fl er -tumb ler -he p -ford ham -row ley -initi als -ev asion -er nation -plu gins -coch ran -c attle -acid ity -ðŁİĬ ðŁİī -re grann -jump man -ef ace -x ma -patri archy -esco bar -cristi an -tip ton -nu eva -hack ney -back seat -kill arney -aid an -sta dion -simul taneous -ida ho -a je -u th -figu re -clo s -bur k -volun tar -rec ite -macfar lane -cur few -bou do -w gn -sti x -sla p -scrat ched -philli p -jour ne -ex pelled -wa z -u ke -tati ana -ou e -ho pp -dimit ri -ðŁĵ £ -mato logist -electri fying -blu ffs -bill smafia -az cardinals -y aa -x mas -shar a -r ith -g ills -dre s -bar ton -authori zation -imperi alism -home of -to do -foot path -band width -visit spain -moh sin -erup ted -mi ki -insig nia -mike l -ss h -ger a -bank holiday -aw an -t weak -star craft -e al -construc tion -skelet ons -le ep -ine m -bar clay -ship wreck -monsi eur -yo h -ron t -form ative -ser o -le p -horse man -hoo sier -haz mat -cylin ders -cen ti -ðŁĴ¥ðŁĴ¥ ðŁĴ¥ -re em -na ire -mus ically -gras shopper -est onian -termin ology -ro main -blogger rt -tox in -stan ce -cultiv ated -an ast -ðŁIJ į -shi mano -go pher -ene i -recycla ble -gam ification -fight for -c q -avoc ados -ke ys -eli ke -gly cer -shak ur -mobili zation -gal ley -expla in -ex changed -pe th -obe dience -illa ge -en nis -ãĥ ŀ -wi v -walla bies -ma ar -ig ers -fin tech -fin alized -wo j -meaning less -in field -onna ise -e et -bron te -pass ages -ðŁij § -strick land -northern lights -lom ond -h tc -wr ay -shi fter -di alog -ðŁį į ->> >>>> -te atime -ste ch -sic huan -qu ill -fran ca -comple mentary -bar rington -marcu s -mal am -goo oo -for sa -elec tra -af s -âĹ Ĩ -tri fe -sn azzy -fo lia -and olan -after dark -wood son -stra de -litt lest -o gun -con wy -co wards -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤ -íĬ ¸ -se ul -mur phy -dun ks -kapil shar -jo achim -wom ack -equal ity -aver ages -a ine -ðŁ¦ Ī -tac ular -dis ability -u ked -mid century -bar thol -teas ers -tab ern -nj caa -sp out -op i -ku bball -bl om -so ar -popu lism -meth yl -ðŁijĬ ðŁı¼ -o spre -alo ils -ðŁĵ ĸ -ðŁĮ ļ -x er -sp illing -publ ica -car dam -adi sh -sa cha -p kg -bu da -lyric ist -i bc -gru mp -ho ver -hal ep -anti body -anem one -âĻ¥âĻ¥ âĻ¥âĻ¥ -m cl -litho graph -cc u -s fest -path ic -calli ster -otta wa -gun sn -rut ger -hali but -en vision -differenti ate -ðŁļĢ ðŁļĢ -pir an -lat el -uc n -trou bad -ra ine -fierc ely -learn english -lea se -wex mondays -em it -dray ton -bur rell -scuba diving -hol ler -dr u -clo cked -w ral -ap ro -trans lucent -w bo -patri arch -mo ja -lan nister -fish ery -ne derland -mil dly -mi rai -ma ko -ja p -ðŁĺ©ðŁĺ© ðŁĺ© -pro statec -p anna -ar ama -under taking -tomp kins -ne op -soli ds -sav oury -e ames -cut lery -wood bridge -steam er -ri zzo -wild cat -rat na -lamin ated -kin eni -jal ap -ai des -acknowle dges -?! ?!?! -! ðŁİī -w afc -mag gio -ha ves -dar je -of i -gr il -v asi -bru x -mo hd -fake speare -arn old -r mb -for be -wal leye -ro di -therapeu tics -strate gi -ob ste -mu dder -download able -dd ings -d ca -asi angames -campe on -appropri ation -th century -ram atta -dra ped -bul lion -mu c -one x -se greg -ophel ia -bod ily -âĿ¤ ðŁĺį -wi zar -te ased -ade my -to id -sur a -lazar us -sn ickers -ma se -lo h -bow ed -bibli o -x change -har lan -gho shal -flavor ful -bha gat -alle z -whiche ver -ten stein -disc er -organ iser -mt g -dream liner -t se -hok kaido -mo k -indulg ent -hick man -blin ded -al yn -aaa ah -sp ool -lough borough -inter pret -et v -aristo tle -optimi zing -avici i -madu rai -ju li -naw az -mat chups -ab ide -paint ing -w elling -vel i -octag on -in scribed -po king -plac er -life cycle -kili g -g sp -eli ves -cle ments -na sheed -me sut -incarcer ated -dist illed -wal ang -delic acy -del gado -che z -ch ita -ad ero -tu x -pati l -o do -abh cosmetics -tv c -p bc -in accurate -hardwork paysoff -ball er -quot ation -merchandi sing -ga stri -defen ses -dro gba -bex hill -ban kno -win ona -si eg -p gs -hahah ha -agu chi -su bram -mirac le -de sch -li bre -ba cher -ent ine -bbcra di -lou dest -r ps -pi erc -fr yer -storm trooper -rafael nadal -pas co -exhau stion -epic onetsy -rc tid -kel lie -ga ines -d bz -sm riti -s bridge -lim ited -cla w -technic al -bio graphical -ado red -ภ° -exclu de -ac adia -key boards -fur man -so ca -sur u -ni ps -sw aps -server less -run e -pu ffy -north ampton -nish ings -hen der -cartri dges -gun shot -ðŁĵ ¹ -fil ament -respon dents -pey ton -mountaine er -mer ging -life span -intimid ation -p afc -nl wx -expan sive -pur r -f ck -ca e -at ti -tele thon -so hn -mend el -lo pes -dor i -un broken -te red -tast ings -in active -disin tegr -t assel -share the -pi ano -is lay -air space -z awa -ricci ardo -ming ton -fresh er -cur ry -re vs -pharo ah -h mv -exhilar ating -wh oo -lin kin -kri spy -competen cy -ste wards -ne bu -kat su -ad mins -baz ar -as ar -giving back -s summit -song z -lin us -raj kumar -farm ington -fanta sia -ðŁĺ´ ðŁĺ´ -so bri -lis se -barry more -pri sm -blo b -sen ew -mono xide -exp ire -eigh teen -di pper -xi ao -kil t -hin ch -bbc sport -bam boo -p ter -ex al -ðŁ¦ ĭ -ham lin -expe ditions -star gazing -food security -wy lie -ul f -st ingly -on storm -lo eb -bro ome -bn ha -pancre atic -eli ve -!!!!!!!! !!! -ther apper -ortho pedic -avengers endgame -antit rust -ìļ ° -go te -om d -off side -gy llen -win eries -white water -ad l -lu pita -exce eds -consi sted -chew bacca -ash leigh -nhl jets -is san -sh ld -hay at -cran berries -ð٤ĺ ðŁı½ -rock the -spring training -fall out -dairy free -wa j -un decided -so wn -rc n -north wales -htt r -fu mble -d its -comp elled -popu list -min ted -blan chett -. '' -pro pulsion -m illa -au berg -her tz -h ta -u daipur -serendip ity -azte cs -als ace -ðŁIJ ij -lu n -sho es -char li -gar za -ðŁĴ Ł -pro biotics -fox tv -ol is -mi ff -loc alized -diffu ser -si gue -fun ko -rend ous -ðŁĴ ij -jeky ll -ha bib -fre ya -fjor d -ex porter -to sa -store day -maj id -ba the -cham paign -ðŁĵ Ĭ -der ma -h ittin -gor illas -emo te -ac ic -mad ly -lland ud -kru eger -eleven th -ash raf -umm it -at as -per sie -mo tives -i ona -finger tips -ss m -pon te -bri g -rb is -tu sk -ps vita -jor dyn -ci el -bas ket -are d -arbitr ary -go ed -chron o -sand box -performan ce -na ke -ant our -vas quez -quad rant -mat tis -ìĪ ĺ -sa har -numis matics -ma this -tr ams -pot w -as quez -? !!! -thro b -of life -_ ! -pan tone -mcil roy -er u -ma sto -endu red -co vent -ab hi -physio therapy -civil ized -ant asy -snap dragon -on screen -micro bio -l cc -di mple -sl ough -ma ven -col m -villar real -or p -fr ye -bar u -v tg -perio dic -concor de -childrens books -ym ru -re mark -je w -u tica -seclu ded -rogue one -ag li -why we -ro bu -nur sing -lu ster -automobi les -ic um -cl i -sagin aw -pean ut -ec ra -transp ho -bl ins -aw wwww -âϦ ï¸ı -jere z -inst ances -sy on -s de -wp xi -rob ben -man x -journ al -erne sto -belle ville -as ur -wal rus -h j -cab le -blizz con -bean ies -vic inity -te igen -ta ire -pa v -navi dad -extr ater -bun gie -bbc papers -algon quin -zanzi bar -out fielder -mer ced -m q -kon ami -sho ton -hor rendous -ad vo -spoo k -nbc sn -tu tors -en tos -sur name -pay ers -mul der -be be -radic ally -bu eno -re brand -it ching -fer o -zo u -la i -gon g -weather network -rick son -recon naissance -f sc -differenti ation -be stin -y q -st as -lon gre -pro fan -mar ac -opol is -ba its -ab se -sy r -ph us -u don -schizophre nia -reg gi -jen a -deto xi -com plac -z b -pr t -ibrahi movic -bm j -seduc tion -oooo h -gonz alo -w ham -sha p -deser ts -callof duty -ðŁķ º -photo booth -bri m -si en -scri pt -cas par -line age -x ero -may bell -co ta -carls bad -ðŁĴĥ ðŁĴĥ -im ba -the car -law x -il k -g ana -sli d -ma halo -g ant -enri que -te i -jo ck -bla de -h la -i hs -west on -trans it -au bam -lone some -kobe bryant -fun ky -v andy -sh aka -an an -person alization -rede emed -hat ter -day s -par ac -living stone -for man -de mar -ðŁijıðŁijı ðŁijıðŁijı -per sia -pe der -ðŁĩµðŁĩ ± -reli ever -ith appen -dc p -den burg -Û Ĵ -k assi -un pleasant -ij u -far o -car mar -ke ren -ha u -scot tie -s bury -r sc -pistor ius -mp ire -mo at -mar uti -lion s -back country -rash ford -haras sing -ze etv -t la -tor so -sau d -ent ang -ef abz -toshi ba -resi des -âĿ ŀ -r ct -mohan lal -memor andum -hor ner -bon neville -g sd -exoplan et -blasphe my -am et -ðŁĴľ ðŁĴĽ -spo iling -ma as -ka sey -coim bat -ðŁį Ĵ -tu ske -su zan -still water -mit z -keep the -gosp el -dum best -distr actions -ch lori -ãĥ ī -sophistic ation -mm u -lithu anian -bell ingham -ðŁijĢ ðŁijĢðŁijĢ -strongh old -mon aco -k ad -dog sofinstagram -ðŁij Ļ -west ward -sedi ment -pal met -ko de -ki do -nom ads -ff ff -augmente dreality -ðŁĺĺ ðŁĴķ -upro ar -ty rant -sty lus -sli e -deli rium -occu pancy -hat t -hair stylist -ear tist -spal ding -never mind -read able -p met -fac ts -ot to -she im -sch am -go thenburg -ex it -ty n -tam worth -roof tops -mutu ally -j mu -fis k -cun ning -re news -me tic -an tho -mcel roy -con tre -ab ank -mi les -deser veit -dear born -ab ir -cruci ble -character ized -tahit i -mur cia -che tte -uni vision -pres se -love e -im pun -ast ana -a au -o vs -loo sely -ell ing -echel on -connor s -n th -ty ch -jim bo -cor don -app reh -. ðŁĺį -jiu jitsu -acol lins -sushmaswar aj -strike outs -proto types -ascen ding -argent inian -ren ner -# ' -j y -ðŁĶ¥ðŁĶ¥ ðŁĶ¥ -nanop articles -iz ers -! ðŁĺĤ -por cup -edwar dian -dx b -.. !!! -mil king -f ours -the d -ðŁ¦ ħ -writing tips -sim ms -ele mental -whis kers -rain er -ou che -influ x -å¥ ½ -snap chats -pi eter -g awa -c nt -ley n -slaugh ter -k lay -ger m -bon ne -ðŁı¼ âĢįâĻĤï¸ı -wic ke -i at -border line -* .* -ent on -ou ss -yas min -tow son -roll s -ho ho -bant am -skill z -cl o -sf u -conden sed -school boy -london ers -ãĢ ij -vand als -sat oshi -ðŁĵ» : -sin cer -ni etz -i awx -grey son -graph ed -gabri ela -je p -ha di -fron tier -ellu lar -con fluence -ðŁĮ ł -white out -mer it -shi ra -sculp tural -incar nation -life guard -mi de -bar rio -attribu tion -app re -re eve -mag ically -din al -broad casters -tend encies -su bb -reykja vik -min ts -goe the -shi i -aubam eyang -:- / -ี à¹ī -eat ing -du mbo -oc key -ber tha -am ata -aa g -evacu ate -hu tt -dr f -what aburger -tb acks -li vin -ap an -vo a -vi kas -grand mas -inter fere -dor itos -bon ner -f gc -pi ñ -per mitting -limel ight -de anna -le ela -ha st -fahren heit -ale ssi -ðŁĻ ĩ -lie b -dee zer -cul tura -vo ss -pa si -ma ud -is it -bent on -din ers -theroy al -refu eling -ent ro -sky f -mar ital -ke ene -super power -rebec ca -inform ational -hi deo -co wardly -ãģ· ãĤĮ -u sha -t ere -summ ons -ar da -or land -freel ancer -bbce arth -v agu -in sh -blo or -pot luck -poche ttino -che ats -wondr ous -euchar ist -canc elling -st es -esc ent -en den -ssi es -sand usky -bi anco -oppor tuni -liqui ds -kyrgyz stan -ai ah -gn i -mo vin -ina via -coo kie -âĢĵ âĢĵ -ol icity -ðŁį ½ -un filtered -dre ary -bbc breakfast -amar ia -rais ins -ðŁİĤ ðŁİī -sand ler -gan j -fe in -music awards -ne ta -flur ry -er re -bri ana -posei don -mul an -execu tive -dhar thm -ch ins -thirsty thursday -jam as -bar th -tn f -tac ob -k hor -mi ma -fil ms -ington post -epit om -ec w -cor ral -weak ened -ak ov -shi pper -m line -la sal -bra iner -aw m -ðŁĴĻ âĿ¤ï¸ı -twi g -this girl -man of -re count -lan zar -for ci -dischar ged -world news -mon strous -in toxic -fo ie -demean or -af firms -hal ves -che shire -se of -lanca ster -g enders -star r -chick fila -new england -jay den -ðŁĺĤ @ -sha allah -ase efabz -flamin gos -confron ted -chi anti -a om -cab ot -af loo -pi kes -leav ers -h cc -chap o -young stown -re solu -okla hom -o ons -lamin ate -cash less -ðŁĺ³ ðŁĺ³ -z aw -sa ires -rebel li -in adver -ben i -tra c -hun tsman -ðŁİĦ ðŁİħ -mer may -gi b -die u -ce ases -ðŁĺĤ # -mind less -i der -a tho -wheat ley -profit ability -un attended -in ec -han sika -backthe blue -st f -drau ght -anto inette -v ah -se ash -b ina -cl r -ari zation -ben to -à¸ Ī -ze man -inspec ted -ar agon -ðŁijĮ ðŁı¾ -tack y -rich ly -race track -anthe ms -abbo tsford -sheri ffs -i ah -en ough -e strang -road ways -bun k -sh anti -jurisdic tion -gur us -far r -ad on -in cogn -home improvement -dal am -col lars -co hn -be da -ai re -wester ly -avo te -spin ners -sp res -occup ying -sch rei -reinfor cement -es er -sun rise -mc manus -gold stein -gg gg -ann on -yo s -re patri -hud gens -data analytics -ag us -ðŁį ¿ -pol l -just e -gi annis -star struck -dundal k -z ap -sk ol -un miss -u man -t cr -plat y -pac man -na an -pleas antly -ob vs -corrup ted -am ari -sho ve -nau til -shi van -sh reve -go bears -we akest -bren tford -st us -pre v -basing stoke -reper toire -am ala -ç § -ch ong -c aged -bil al -! ~ -yo w -wan derer -l ila -en clave -ae c -æ µ -don ne -ðŁĴĥ ðŁı» -tru ce -he il -scor ching -iri descent -ob taining -fon dly -centuri on -buff on -seren ade -break the -sap s -ny gov -la zi -\ ( -puer to -neu tered -ta sia -racec ar -hic key -gan gu -ðŁĴ ĩ -ran cher -cla se -ðŁĶ´ ðŁĶµ -ho b -bi zz -ding le -tw restling -go go -freder icton -block chain -tu ary -perce ive -jo int -es u -emabiggest fans -bis a -win ton -re counts -re launch -m ths -ar ises -ad kins -mo tions -la wns -eno cide -reminis ce -ra pun -w kr -fass bender -e manu -sexu al -hi ppy -wine house -f dc -care r -al ai -profound ly -our o -mon toya -mee e -is cher -imp lies -fifty shades -ym on -together we -isleof wight -cru e -am zn -âļ « -me ps -haun ted -got vintage -ter son -pet smart -sell out -ne cked -entom ology -eng ar -deal er -alo re -ðŁĩ¹ ðŁĩ· -par tum -limer ick -f ates -dwell ers -diag rams -ðŁİĪ ðŁİĪ -pl ore -in ca -divisi ve -blow ers -wel les -predecess or -infin ite -theore m -hot dogs -americani dol -dam e -cap ers -reco ver -lolla palooza -in correctly -colle en -brac ing -observ ance -o ise -mr n -gran ville -estrang ed -íĭ ´ -replac ements -je sus -d st -wild wood -ta f -sar ri -horser adish -am ax -cor by -con d -cit rix -t ze -sa ic -i os -mon gering -ðŁijı ðŁı¾ -jeffree star -bar ometer -avo y -yu le -var na -v ÃŃa -paraly zed -under went -ge tter -dau phin -stra r -aberdeen shire -organ ism -ing an -fei sty -ri da -worldof warcraft -tic ker -sho u -ri ff -craft beer -thur ston -s abo -meatless monday -migr atory -ma jo -gro sse -ag chat -net te -essenti aloils -chau dhary -teddy bears -archan gel -rotun da -re us -ham ad -con vent -britt le -mar che -lo han -inti mi -eu cli -b ole -s ra -ho d -m fs -di sts -cha stain -z or -she k -canne slions -l ends -cal um -bru in -alam eda -ach ri -privi leges -indie music -fel ton -po ty -cor so -ri shi -ha bi -a see -weir dly -r ho -myster iously -low down -fur s -fe t -e die -ro sh -inqu ire -vulner abilities -sil o -nation alists -ad iti -tra pp -ti i -scrat ch -ag ora -psy che -davi de -book marks -ðŁĴĽ ðŁĴĽ -re former -lu tz -ðŁĺ» ðŁĺ» -long island -awar dee -po stu -d printed -succul ents -poo rer -l da -r cc -ivote btsbbmas -cath letics -ti psy -quin ce -pupp yday -âĸ« ï¸ı -tz el -sel fridges -i onic -wab ash -turbul ence -leam ington -tt ttt -obsi dian -o hara -legitim ately -spa in -mor al -equal iser -ap g -watch ful -w ls -h ng -ro shan -mart es -falk lands -d hl -tri angles -sta un -south bank -ren ame -quo ti -god desses -col gate -z ant -trail running -summ its -dd ick -ac ad -sc g -medi ated -ko hl -here wego -discrimin ate -sat irical -publ ici -g tc -dre dd -auto sport -si ps -correspon dence -ash win -dragon ball -ðŁ§ Ģ -ship ments -gly co -fe a -pur ses -le er -gie g -ba bel -ni on -n ca -ko a -go on -rec a -female bloggerrt -elector ate -da x -ic ulture -elli a -tun i -tor til -le tour -coimbat ore -activ ating -news night -had dock -free shipping -cano eing -ay n -ocean side -nick el -jame stown -fri gate -depend ency -cho wk -cataly tic -backstreet boys -Ð ´ -ele ment -^- ^ -zen it -ro a -fortun a -fi zz -ac lub -ÙĬ Ø© -in tra -hy ena -do dging -archi bald -mari us -ing enu -steph anie -scand inavia -ma ier -joy ner -christ ening -b td -sug ary -men e -immer sed -dom ain -ðŁı ī -pap al -ic ann -ta hir -me jor -it ys -inter fer -im pul -allo ys -" ). -z ance -an ar -tam ar -coy big -au ghter -manhatt an -ko di -wedd inghour -gla zing -bh f -depor tivo -any c -nouri shing -no tify -j py -de dition -big brother -work station -r allied -ob u -impun ity -gyllen haal -you rown -sm ite -n du -s le -o am -home opathy -gro ssing -pa e -le mb -was ser -audre y -ðŁĩ· ðŁĩ -sho pee -par que -ophthal mology -ð٤ĺ ðŁı¼ -thou ses -t itu -st illness -nygov cuomo -no ta -disa ster -car den -b sl -ðŁı ħ -re po -r ate -hil da -ck en -g pi -crit ter -u hd -deadline day -tom hiddleston -sem pre -mull in -make americ -ar id -am t -n se -n ch -moz illa -food waste -co or -sagitt arius -po el -e try -c fc -kil o -av ant -pist ols -mis sive -bah rain -fa e -drin ker -war mers -sv eng -po co -its the -inter ce -pra dhan -id sday -tain able -sub marines -magn us -bo ye -am are -pen it -g fx -aren e -ãĥ ĩ -su rah -jay son -in ch -bo yer -o sun -str ati -scrip tures -master che -ster ili -program med -kn its -inj uring -sea of -reli ant -p ina -mix tapes -man tri -jind al -hac kett -bio shock -v ash -sp m -light saber -w icks -rune scape -vari ables -dimp les -ol yn -hol lis -getty images -galax ys -ed l -trajec tory -thr illers -positi ves -kit esur -del le -feel good -shan kar -ma is -is lip -ricky gervais -ingeni ous -rr bc -si p -acro polis -p buh -mesmer ising -bernar d -too t -restric t -murder ous -fo i -dul les -belie ber -sha an -ph ant -hamp den -ha ye -ch ro -ðŁ¤· âĢįâĻĤï¸ı -vi endo -mag pies -habit at -fl icks -stan za -pu tney -new smel -nd n -m ity -contrac ted -uked chat -sp ouses -plu ms -l icious -quan tum -j hope -mm r -cu sd -usa in -section als -bar bers -re vered -d ite -aw ine -mc daniel -pur dy -pelo ton -out lined -ben ito -pedic ure -moisturi zer -clif ton -prece dent -ital y -bi x -tro ye -tren ding -shan ks -le tic -wilms low -ta ir -kry p -en u -kar thi -hoar ding -surve yor -inst aweather -ri ffs -evic ted -town e -ordin ation -lux or -tampab ay -guine as -fu mes -no ck -ki ara -en visi -no e -geor gi -cruel tyfree -whe eled -te mb -mi aa -bu oy -abbas i -mc col -jas per -it als -author itarian -ma ura -tang y -mu ssel -hi gg -chlor ine -al vin -whi ps -re side -hra ya -ed ging -utt ar -ide l -du d -wo p -summon ed -ìĻ Ģ -å į -si kh -en viro -tan kers -nbc news -le bone -gw r -con ia -colosse um -rod ney -par atro -nau ghton -fe athered -chand ler -au se -! âĿ¤ -ni ko -miami heat -collap sing -ib f -gaf fer -father hood -camp ed -ro gan -hi jacked -coordin ates -am il -ðŁĺĴ ðŁĺĴ -e ther -water gate -leg er -d wy -c tly -acry lic -whole sal -ven kate -shadow ed -hor sham -bangla deshi -to ed -inst atravel -opt outside -aar p -far ce -ag in -!! !# -rap ture -lou th -mon ti -jiha di -initi ate -gro hl -u do -tech nicol -ou pe -but ti -ðŁIJ ´ -nar ayan -car la -ma kh -indi visible -ground hog -yn c -sin bajo -ban tam -wc f -sug g -pin di -them atic -rit i -kk h -val i -ty ou -lebu hraya -ko witz -sla sher -kit kat -cy pher -val u -us man -rock ville -kar ni -do re -í Ľ -fer ret -ðŁĺĬ ðŁijį -wood ford -statu tory -love and -tar p -referr als -discipl ined -yach ting -ktv u -dec king -au m -ph or -key west -a ina -ped tour -ge ti -sla shed -cric kets -gr ated -steph an -lewan dowski -intru der -al c -ðŁĺĦ ðŁĺĦðŁĺĦ -merci ful -lok sab -con sign -ab m -o shawa -fi eds -di jon -y ass -wre aths -well come -tath lon -mitt al -age of -rein force -dra ining -coy b -ac ec -inten sely -hagg is -fle mish -wool worths -partici patory -lan y -convic t -stereo type -ðŁ¦ ĩ -re sale -len i -hol ster -âĺĨ âĺĨ -âĺ ¹ -renew ing -par ted -batt ers -weak en -erup ts -sun il -nouvel le -lemon grass -tour e -h x -ç ¾ -schi phol -mess ina -han bin -daener ys -butter cream -gu o -con roy -bla k -ad ic -ach en -Ë ĺ -tran sylvania -radi of -te ren -dr fc -b ber -ay ing -alcat raz -w ld -mill ard -ìĿ ¸ -super fan -ph am -gh wa -fre ight -µ ï¸ı -infer ior -libr o -goo o -cam bria -six es -quintess ential -mat ern -j ours -hy mns -gen a -wil de -white chapel -shav en -q q -slu dge -eat clean -mariti me -ka if -bjor n -pire lli -ja sh -i gi -whis kerswednesday -the originals -sch illing -ph in -jo ke -jal sa -gen ial -rod ite -for ge -ad er -ðŁijĩ ðŁı½ -deb ated -ðŁĴĻ ðŁĴļ -woo ded -mun oz -dism al -condem ning -ant ara -saturday night -re consider -ðŁĵ ² -ol amide -hit achi -harro ds -ta way -ja a -ing uk -au c -az ette -as bury -ultra s -ri que -de ca -al oft -om ba -mi gh -me sh -fa ze -sp ital -v ado -r z -mori arty -tu ck -tou m -mon stro -sain te -ru skin -re discovered -par ais -mocking bird -cf b -tu sk -model led -black berries -spo wer -j ale -hot spots -bri m -" ," -yor ke -ap ri -mi eux -carlo s -welove you -firsth and -es thetic -rox as -j me -ho i -sch mitt -u chi -orangu tan -lead ing -def o -weekend vibes -refriger ation -inter viewer -faroo q -... :) -wy combe -rejec ting -red knapp -pi que -twee tab -middle town -palad in -balti stan -ðŁĩ³ðŁĩ ¬ -mc phee -bl medieval -ide o -e special -cc fc -ath ai -am pa -su ss -story tellers -min hyuk -tier ra -ðŁIJ § -span king -silver man -read ily -dep t -ambi ance -ðŁĴĭ ðŁĴĭ -xi x -sug ars -meteoro logical -hat chet -foreig ner -vive kan -tag ore -res ent -breath es -tele coms -pancra s -du l -ya ar -ar is -r mc -my er -jo bs -with draw -back story -u mich -sebasti en -nu est -standardi zed -sli ve -si ac -sc alli -lu be -lmfa oo -mel ons -be than -å¤ § -muer tos -hon k -din os -ãĤ ³ -team india -pet co -mo ren -fe aring -bb can -me le -kne el -gunsn roses -bau haus -ygo fficial -ygofficial blink -music fest -de marco -aro d -acce ssed -obse ssive -o con -nel lie -kil da -je well -power lifting -on en -á s -bal ism -dan ke -wol fen -pro logue -nar rows -hol o -geor die -confron ting -cab ana -loubout in -s anti -image comics -foo fighters -wester nu -g fuel -disci ple -ðŁĺī ) -su h -sc illy -next gen -eg u -aflo at -xi an -pang ilinan -di en -b ca -co ons -spo d -s dg -fall en -dol la -ðŁĶ´ âļ«ï¸ı -ä ¼ -tor rance -nc isla -ta wny -jen ni -fitness motivation -bl ount -fascin ation -p da -ip f -aege an -van o -se vered -pol s -physi ological -ju ggling -gu ev -calcul ation -sli mming -fe mmes -em pan -daw g -sto v -poly technic -municipal ities -gre tzky -defin itions -correc ting -s family -rock and -on my -homeswee thome -wt cc -sc at -mo co -lar sson -kag ame -corn bread -lc bo -head shots -fire house -d news -uc as -tem pe -son ne -di ggs -bo ilers -anti bodies -sibling sday -hobb es -fly knit -li se -ze sty -substitu tion -sic em -revolution ize -mu rad -besto wed -mill ers -liveon k -interpre ter -sant abar -queen stown -event brite -d by -chur chill -sp at -pal oma -eura sian -bu at -beau x -vor ous -naz areth -daz ed -al me -rit a -con ch -col t -hamp ers -g su -ad j -professi ons -b wi -ac b -â ĭ -univers ally -trou bling -conve y -ck ley -we asley -tra der -so td -scra ppy -nelson mandela -rup tly -pe ele -every body -conse cr -short bread -sh rou -o sama -ch ach -bino culars -pl en -nam i -k la -ce tte -wine wankers -ste f -oxy gen -ha ag -yu zu -wh olly -tri gg -me cha -subjec ted -inhibit ors -repre ssion -manipu late -cur ly -black man -u red -convers ation -bag ging -at el -vote for -eli brary -vis age -ta per -st ani -prote in -pe mber -niger ian -gle ason -behin d -trick ed -haw ley -ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ -psychi atrist -consoli dated -bru gge -ge twell -es opha -chine senew -ach t -s fu -fe mal -turn bull -mirro red -bobb i -ben id -ado ss -vit ch -man hunt -log itech -fa king -cul t -wor st -dy na -desc ended -pu ig -fre dri -chrome book -af fe -vam os -moo c -m le -lach lan -all for -ë¯ ¸ -à® µ -ye ee -paul mccartney -as au -a sive -the great -son fire -pre k -photo journalism -meh ra -le tta -h ss -dh ury -persecu ted -ha f -demo graphics -beet le -sk ath -shah rukh -k lim -esp añ -sleep ing -opp s -mun dial -extrac ted -ðŁ¥ ģ -ta ur -jeep mafia -inser ts -igu ana -fthe week -do tes -secre tary -rin poche -favor it -corri dors -eli ers -birth s -la ban -drop out -cav an -o zz -mar adona -lec turing -fan fiction -ele anor -desper ation -character ization -bu sier -or die -holo gram -son ville -av geeks -eat bulaga -" ~ -rox anne -t asked -sp k -sam ir -respec table -ha ku -di ane -bey e -fanta sies -win news -uten sils -spy ro -red mi -mer son -i be -cro ok -co pa -wa vering -ðŁĮĬ ðŁĮĬ -zz ard -selfi sh -scroo ge -p ml -bu ms -art basel -syrac use -sarac ens -n itt -har rowing -ah c -worlda idsday -strat ton -sav ages -fur nishings -billi ards -o ia -m ola -inten ds -coy g -var ma -f sb -the queen -teessi de -re locate -no one -interoper ability -fam u -planet arium -nit ro -d lr -cor an -ìĿ´ ìĬ¤ -shoul da -man an -car melo -gh o -ðŁİĦ ðŁİģ -stee ple -her zog -dev our -chan te -arun del -rio ja -box office -bo v -tri b -sn r -re for -ne wn -blake shelton -sul li -eng ages -treas ure -o yo -bi za -. _. -ãģ ĵ -oo w -ch able -brand y -ich t -âĮ ļ -z ines -shar per -plym outh -mam mo -hydr ates -el lo -do e -centri fu -ob j -laus anne -eli st -con genital -under armour -ent ree -critici zing -vogue magazine -cast ell -aga in -a ab -ld f -co ined -well done -un planned -swee ty -q p -loy al -iz ations -ir ror -ch is -sw ann -me w -custom ised -cream ery -cevic he -wrong ful -stellen bosch -n ella -house mates -e hr -c sn -tor m -pseu do -moo dy -un folding -tel aviv -small business -montp ellier -manu ally -best sellers -gin ny -leop ard -ed in -un heard -hi ero -thero ad -gr l -apho to -americ ano -nap kins -gall ant -embo ssed -avi sta -sar ts -prosecu ted -food safety -tan aka -f v -cav alli -swe den -sc ourt -bar naby -tart are -hear st -butti gieg -af icion -abo de -mtvbr kpop -flouri shing -pol ly -or son -blue sky -sound tracks -mountaine ers -ym ount -ro jo -davi e -. ðŁĺĬ -sa de -op ed -mah ler -re gs -ram ones -lanzar ote -indu s -black rock -vo cab -the hill -ni us -go ya -ru l -tin es -mu ne -cl ic -dynam ic -aggrav ated -on or -mur ph -par ka -indigen ous -ready for -boldand beautiful -au t -somer se -so good -road torio -bb t -sau k -air strike -âĥ£ - -speaker ryan -fli er -. @_ -ven detta -fre en -chap er -san ay -p fei -nu dity -mr x -h ha -ro ku -re dar -fuch sia -war ships -d fb -chau dhry -ra wal -granth am -an gio -tab loid -stran ds -portfoli os -an ning -work load -ho to -head light -general hospital -chri se -later gram -ga v -h out -bi dder -show man -sha we -servic emen -bra vest -ach y -te de -pran ks -juli anne -ema iling -car do -testim oni -supreme court -calder on -st le -wh in -tro jan -ma honey -co u -! < -gen con -bh atia -am us -vo ting -far ah -be van -å · -lin c -ka shi -gif tsfor -fas o -du tta -institu t -code x -tongue outtuesday -olo gy -nat ty -ju gger -de cency -ch ul -aw o -mont clair -gol o -g lyn -ðŁĺĭ ðŁĺĭðŁĺĭ -qu antic -n ics -h bt -cal eb -tra vers -thisi sus -shi sha -deodor ant -cr d -ac ao -ðŁĴĽ ðŁĴļ -y il -endow ment -z ur -for ts -mar tech -fifty shades -ci v -aqu atics -accumul ated ----- - -un published -poro shenko -iz u -gn all -le mur -ilo ilo -glad stone -esqu ire -sk aya -revi ving -nigh thaw -:- )) -national puppyday -mi amid -kamal haasan -guest list -gentri fication -dale k -water way -t gt -sle dding -math chat -hu da -elan ds -cap aldi -bm g -pong al -fac tions -ðŁı Ħ -p ham -el ton -, .. -op ium -lake view -excelsi or -an ic -fin serv -ent i -true story -pa id -special olympics -me tte -ta pper -ship building -z brush -tosc ana -t ants -straight forward -k sh -ca hon -bra him -simul ations -gu mp -car til -distr acting -pa is -mu rak -gre t -ma hama -eque stri -emra an -at k -la galaxy -ho ku -can to -bo gart -inher it -colli ded -carol inas -adon is -years ago -roo ts -girl sin -title ist -itch ell -fat ality -clo ths -center piece -tis land -mi ker -u bu -sh k -in tran -cob bler -bor ns -z em -sub po -expon ential -car p -uri g -panty hose -pa wan -mac cle -brigh tens -aliz ations -the weeknd -t down -t ash -ferr ara -âľĤ ï¸ı -mee k -gro omed -bar am -pl ough -letter press -edit ori -imo gen -gregor y -g mos -bree der -reduc ation -lic hen -he er -distor ted -beat tie -yum m -spla y -paras itic -brook field -ver pool -thri ves -sto ves -ru ssel -cor r -ar min -profici ency -jack y -debat enight -wh iting -nure mberg -denti sts -baja j -ari ka -vivi and -pne fc -sr h -sick ening -cu lar -å ¼ -mil let -gar age -mc murray -infin itely -aw as -anti virus -par fum -gorilla z -qui x -it sal -hair line -bo ta -ë ¸ -yan ne -ven kat -ro ta -kel a -kath niel -èªķ ç¥Ń -sch ne -deriv atives -dakota johnson -ip v -bus a -ìĦ¸ë¸ IJ -un intended -in dra -pro pelled -ne olithic -hil o -hi ves -gwin nett -co tta -can aver -b ne -magi strate -es ri -zam an -weir dos -short cut -mocking jay -ðŁİĦ ðŁİĦ -so h -wh ip -spec tra -rober ts -rob ber -promin ently -ecz ema -bu stle -b cli -sk ol -jordani an -ev ich -æĸ ° -ro jas -mizz ou -sa shimi -install er -gu chi -pon cho -hi man -democr ati -al be -pp ies -chlori de -bly th -âı °: -yo yo -ss ard -sp at -mad dox -salam ander -boun ced -asu mmit -al mer -scru tin -am editing -transform ations -tag line -neur al -mu tton -br d -ayurve dic -re vel -humili ation -ik aze -benz ema -natur alist -mac cosmetics -fi a -ram on -pre domin -li son -goo de -ce res -materi al -herald sun -cannon ball -bob dylan -bo thering -s gb -know ingly -che ung -cha z -hand gun -chinesenew year -un treated -rabb it -place bo -ble ssed -ay am -ire ann -grosven or -b light -nu ne -co stal -c span -sa an -sol l -ra jam -k q -gary en -ben nington -on tag -muse veni -black jack -o casio -mol asses -inter cept -gh ent -fu rever -bla y -aqu i -tele cast -s ats -nat gas -ho v -neighbour ing -mag ell -escal ated -newmusic friday -per ish -bru tus -lav rov -jo dy -gira ffes -bha gav -stig mati -pais ajes -it ra -bi ases -un control -hil fi -ðŁĴģ ðŁı¼ -stom ars -© ï¸ı -ur inary -:" > -s cone -grapp ling -af ran -ace way -nau t -level ing -bre ather -aud acity -loo ting -drex el -game changer -stam pe -p mo -marchfor ourlives -ger t -cre amer -ron son -gu z -ðŁį İ -k ast -hd tv -accompan iment -trade show -sacram ento -prolifer ation -wh n -facilit ator -om bre -en y -ìķ Ħ -ve h -gi ri -bal let -ðŁĹ ½ -ðŁĨ ĺ -take the -promo ters -mu ff -iti vely -crun chy -prose cute -gu antan -! ⾨ -lex ie -kar un -joshu ad -fit spo -bagu io -........ ..... -voluntar ily -sti gers -pron unciation -loo ted -ju ke -er adio -dum pling -barit one -neu er -mac cab -in ations -at te -๠ij -nbad raft -df w -chil i -bc ps -amrit sar -ta vi -ro tor -ra bi -gh os -de smo -ca g -fan meeting -ram ona -au tam -waver ley -tu sa -t se -say noto -pra ise -es mith -time piece -o jo -k ü -cu ffed -z um -juli et -vege ta -pen tax -is inha -ni ño -mall ard -gran ting -ðĿ Ł -tag gart -south land -pas se -maryam n -grum man -boot strap -amo tor -soci edad -nath alie -x es -tr out -mo ji -mar go -g ld -ma hal -bal enci -ten n -pedi gree -na omi -las vegas -ke ssel -gun fire -ak kineni -ten e -grand master -un ru -k sen -rebe kah -mon e -kol lywood -reci eved -fire fighting -cha o -de led -memor i -fr nds -b gm -shaf ts -saxophon ist -ry n -st fc -mis chiev -annu al -y vette -var i -tah rir -perth news -o bey -naji b -isab el -z ler -van de -somm elier -sole mn -interven e -con cise -. âĻ¥ -ref rain -kri sta -conver ge -trife cta -trac er -predat ory -pu li -i ow -brass erie -sco ts -pti official -bon ni -bl t -sung min -regi strar -re define -pa stime -gy u -canad as -blue bell -ye revan -south australia -sli ves -en id -vi ole -e el -death metal -avent ura -:) :) -ple dging -i ucn -daf i -bet ween -to workday -sa ur -be le -super store -hair cuts -fil ter -an ore -sp resso -shiel d -digni fied -b fa -so jour -br in -sham eless -harri ers -er ab -au ld -tight ening -prevent ative -si star -narco tics -yst wy -s nyc -ir u -for real -b ends -fala fel -si vak -free port -ce ch -say ings -don ut -dial ec -x ml -wom ani -ott city -ke re -book lovers -london is -augu ste -wonder ful -win elovers -๠Ĭ -pe da -miner va -ar de -" !! -or biting -nationalbestfriend day -flur ries -ang kor -z d -strick en -photo volta -nan dos -hou dini -fu ente -chad wick -ce rer -wh ack -terti ary -ny pl -low carb -hai ley -d ness -bla c -thar aman -re treats -pic chu -mari am -l ale -decre ases -b he -ðŁijĮ # -ou sa -o ye -nhl draft -ly on -car u -expect ancy -back log -audio books -sur ges -provin ci -pa ol -gr ate -ðŁĺİ ðŁĺİ -r nd -parais o -kee pp -hu l -ap ed -ðŁij ĵ -po tters -eeee eeee -we work -tom i -quil ting -in dra -haw t -anarchi st -pit falls -co stab -zom bie -re flexi -mar low -hen rie -gra ff -dribb ble -am joy -v ases -unex plo -tri mmer -bl ic -the or -le sley -kh urst -fix er -fili ppo -cli que -av tweeps -sc alia -festival of -mc govern -ku hn -hol z -cor ning -ym pics -villi ers -solu ble -hook up -black ed -elimin ates -t va -f endi -dent e -alger ian -re uniting -sel le -pe au -news feed -southwe stair -pendu lum -air man -ut en -in humane -gol an -av a -inci pal -d fid -bla ze -cd nag -mor bi -gal lup -wyn dham -open stack -h isd -on shore -analo gy -v ado -jo t -l la -go of -dum fries -macmillan cancer -em ur -wra pper -par mi -log ical -indi ana -lo bby -kit ts -ki z -ðŁİŁ : -vid con -phy sed -jacqu i -follow friday -cancer day -er g -____ __ -ðŁĽ Ĵ -un lock -suf fo -must go -ay lor -so va -shi gh -scienti fically -sar k -pitts burgh -barb our -arri ve -aren ergy -hon da -ãĤ· ãĥ -mother board -li ps -g ac -fore ster -ffe cts -e si -de stin -r ini -mu les -daun ting -it zer -de sal -to ad -main z -lin burg -group on -< -- -bu en -gipp sland -inv ader -hatt ers -fel la -eat in -del orean -bau m -ma un -je ez -indefin ite -ro gu -bru t -z ay -hamilton musical -emb le -sla x -he es -full moon -ant an -li one -ðŁijĬ ðŁı½ -mac kie -tk ts -loksab ha -aw i -smur f -man che -british gp -sha hi -lon sdale -hom bre -wav eleng -scoun ty -in ja -in de -darje eling -ðŁ¤ ¡ -nietz sche -nb n -win frey -pre ached -cap er -t pa -replic ate -di ii -Ì ¶ -su u -speci alizing -rep ent -jp morgan -hul me -clow n -min ster -bo ise -ðŁĻĦ ðŁĻĦ -m soc -the fancy -m re -president sday -pau ly -new delhi -jan elle -heritage month -car pool -car pe -nab i -mau rizio -es ki -bern hard -th tr -oun ced -kirk wood -in comes -ido li -coo ley -art deco -ðŁ¤ ij -waltham stow -mut ants -mal ema -son aksh -pan theon -lucer ne -intro vert -out take -dean ambrose -child birth -megap ix -gh outa -ap m -pan o -illi es -ba ez -red nose -le ston -x ero -sfor life -mid land -ir re -er th -bad al -ren ault -re spite -am ani -come on -fuku oka -b q -chai kovsky -ðŁ¤ ¨ -tab lec -an sel -war frame -sul try -sobri ety -bridge stone -arm and -ðŁĩ©ðŁĩ ° -ste u -s ny -gun ned -ji b -fo u -exac er -aper ture -ye on -k sat -gir lies -â ij -fo h -feroci ous -pep si -hay den -bry ce -ðŁĺ £ -shahe en -n mapp -mu shar -clo vis -bri bes -po sh -music festival -injec ted -ìĦ ± -li pa -sla via -ar l -an et -ðŁĮŁðŁĮŁ ðŁĮŁ -z we -meer kat -expe dition -oni k -df wwx -bat ches -kisses delavin -inter faces -ino v -cast or -âĶģ âĶģ -south park -new sday -go bble -anton i -al us -wick ham -st ly -guantan amo -fan cies -str on -moo g -ira q -i yer -cl p -vis cer -vo ten -k lon -atmo s -zach ary -michelle obama -ph ine -inven tive -bal four -s ita -remo deled -he ed -breath able -ju ju -weak ening -ol den -hel lu -g ast -extre mes -school er -perfe cted -hil al -dl su -cau ca -go to -bal fe -ab id -selec tor -yo t -surve yed -llandud no -sc ann -bour ke -us d -tow nof -j at -drin kers -ðŁĴ¯ðŁĴ¯ ðŁĴ¯ -rr rrr -maccle sfield -cor als -bra king -tr icia -collec tive -bet sy -w un -sonaksh isinha -coin base -chelten ham -usemb assy -myri ad -mc pherson -con ni -c mos -sj sharks -perth shire -kno wn -bump y -è me -supp ress -thel ma -fey eno -ðŁĴĢ ðŁĴĢ -ss erie -makk ah -bru ssel -ðŁĮ ® -mil os -sv b -emb ank -ta yy -u le -top gear -j ira -ch affe -bra dio -an ac -lu la -za a -evalu ated -ar ic -Ħ Ī -ा _ -ru ck -buy local -sag awards -k sleg -def aul -chant al -butter fly -ha vens -car ats -can lab -br k -dou x -bee hive -new bury -jodh pur -free hold -ferr ari -y ells -uncondition ally -play through -nanow rimo -dic tate -ar mor -swi fts -sc e -huss le -say ed -ro cha -at en -abil ene -ar mi -d tv -action able -tri pp -sn k -od inga -w kyc -time out -roo ks -myal gia -insul ted -an am -ts ar -o leg -me tt -j ble -escal ation -qui eter -house wife -experim entation -u ary -to ssing -re mixed -la ird -it arianism -extrater re -z are -k tor -pay load -ber ge -restra int -bethe change -be w -çĶŁ èªķç¥Ń -f ells -r ta -persu ade -line art -b do -adop tive -ðŁĩ¬ðŁĩ · -ìľ ¤ -ke ssler -= = -gran ds -v aish -sa fi -emil ie -car twright -and ale -ye st -w or -po ts -pam el -boomer ang -lju bl -ham ish -el g -christ y -ðŁĶ Ł -spectro scopy -po fficial -m yeon -Ê » -sto ols -nab bed -insh allah -gi da -c sl -li dar -exper tly -deterior ating -bru ges -sati va -testi fies -py th -hero ines -chi me -facep alm -street fighter -ph oo -may onnaise -canni bal -ðŁļ Ĥ -wat ered -ðŁĺ § -cor rea -lunch box -hybri ds -s fs -is an -cul tu -zoo logy -ric ci -pi pers -be spoke -asc end -ðŁĺĬ # -stopp age -ana esthe -prostitu tion -w mc -regu lars -oce ano -comm a -shenando ah -regin ald -nas a -cohe sion -bli mp -z as -tag li -sm al -ra ga -min or -gabri ella -moja ve -m crae -earth ly -sail boat -gad kari -worth ington -lin cs -itch ard -cit ra -sor cer -racha el -pag i -ne ta -good news -ed ly -wee t -ab storm -realtime chem -over heard -g ish -barang ay -ritz carlton -miche le -hir st -gosp ur -bu sts -par rots -ke ira -hal la -bot ched -ai o -æ ¸ -su pri -ot b -hass an -sl ick -sb p -ni o -shru ti -ba it -: * -ng l -hall o -di age -qu arri -qq q -lud low -hel mut -ge al -establi shments -ax a -melan in -di ri -da red -aless andra -met cal -car val -bru ises -li u -lat ch -lap is -jurassic world -chalk board -bo sworth -batman v -awareness day -ðŁĸ ¥ -sm tl -second stomars -hen ne -pra s -fidd ler -ec ast -ve sp -kh ill -fai ths -acqu a -sold out -francis can -dat enight -h st -te acup -muham mad -manu als -ar cs -iel ts -hr t -m ro -ii fa -flu ke -ar lene -yeo vil -nut meg -lo dging -scre e -oli vier -jac que -international catday -innov ate -doglo vers -comprehen sion -bea stie -stu bbs -sol is -inter pol -hal ted -bly the -andre y -âģ£ âģ£ -schan nel -chance therapper -pott iteam -norther nireland -chee tos -belong ings -mer ida -jan o -oce ania -fear less -le ung -la pping -iver son -huff ingtonpost -hu ts -de akin -d ili -prick ly -kids deserveit -id p -est es -co sa -wi c -ne wal -confron ts -bar bi -appreci ation -Ð ± -rati os -r pi -monste renergy -apple watch -yu l -sas uke -pe gs -bow tie -ute p -salu ting -po res -home boy -char cu -ca it -ಠ¾ -mon tr -li ams -gy ms -ad in -ha slam -easy jet -col le -beyon dthe -stu co -my n -gospur sgo -ge ophy -sk a -rock land -ence phal -dispo se -ภ± -tol ls -pew ter -nom ore -div yan -californi an -undeni able -tra ver -par ri -infl ated -eu v -downton abbey -com au -n su -minis eries -tor t -prepar atory -maryamn sharif -ga els -ðŁĺ ł -pic kers -nan jing -ex u -bun ches -ðŁı ĭ -raf ale -ko sci -d of -pale ttes -on is -new sl -micro services -bar code -à¥Ģ _ -rat che -jun ta -j and -drainthe swamp -anno y -sc ards -pc gaming -aveng er -pax east -hur ray -condomin ium -sheri ff -li ra -hard back -far ts -demo lish -assaul ts -w dy -vo ort -tion ism -philanthro pic -j ci -inim itable -ft b -swar aj -ri so -qu ah -pi ps -pe so -cor olla -rolling stone -peach tree -carl ton -be b -austr al -tacob ell -ro ver -murak ami -del mar -sun dar -jeho vah -hilfi ger -emraan hashmi -emabiggestfans justinbieber -dis qualified -vi val -fren chie -brian may -bingham ton -ttr pg -refur b -il let -da ver -bath ed -bar rel -s ra -i vo -am ak -wearable tech -shahrukh khan -ne ander -le il -gren ada -ðŁĺį âĿ¤ï¸ı -swif tly -sho wr -re posted -ad il -î ģ -fir sta -easport s -aaa ay -& @ -wolf sburg -s sports -li dl -ab an -sports biz -s na -pr ank -po i -em bodies -sky papers -re ek -mc neil -el ow -dolom ites -lec ar -lau ri -grass land -at ica -hypocr ites -so ya -ro scoe -pow dered -nom nomnom -mixed media -ic p -grand kids -tray von -seaf ront -mach ina -bueno saires -multi ply -wr x -ro chester -on et -kar u -k awar -an ed -aber crombie -shak y -emp irical -bal or -anti microbial -pula ski -n ance -mi a -heart breaker -gal lop -rock away -er is -joy train -ĤâĸĤâĸ ĤâĸĤâĸ -cl un -gi z -sal ve -pan eer -out now -boni fac -wr y -sel fle -rattle snake -pi al -gh g -gastri c -walk through -nc l -ju arez -ja un -seam lessly -bur j -shim mering -outw ard -m chale -ðŁĺĤ ðŁ¤£ -stead fast -hu y -tra pping -to a -thre es -j ello -innov ating -friend lies -cor re -tic le -thi est -ot tery -mis information -hill crest -gam bino -what son -bel las -the cable -penn ington -op sis -mon ash -water fowl -storm water -ne tting -body builder -aber ystwy -ka therine -hartle pool -execu tions -vi m -sha ve -lich field -insi ght -jim mie -emb raer -cody simpson -giftide a -fu s -ci g -mand i -schwar z -ro tt -dad i -bent ley -ang ed -zar ago -worl dr -train or -pushaward skath -he iser -withdraw als -pri mera -mi gnon -diar rhea -vm world -o dom -ky ra -u mass -sp ud -ou li -c gi -ro de -quizz es -moon rise -il ty -hedge hogs -gil bert -ar ising -pi ers -p ada -fellow ships -cardam om -anni ka -un humanrights -sunday thoughts -kid neys -gand hi -mar guer -ari sts -un ny -ti ka -law d -kind red -fra pp -no sed -real madri -our i -i fi -car am -char m -sp ared -la do -ke pler -bree der -earn hardt -winder mere -viviand sena -progressi ve -mus th -jag ann -amp bell -affili ates -rick shaw -ha in -compri sed -happ ine -cambo dian -ro tting -bru nel -ê¸ ° -shreve port -ri gg -phan toms -far rah -a die -todayin history -of er -e ssi -tre ss -st am -sn d -la tham -for giving -bi ff -winter iscoming -wa hi -w ut -tor rey -silver ware -jai me -flu tter -co ders -be p -k hel -br ates -one ment -b bling -âĻª âĻª -right to -net de -e ster -ver ano -stay cation -motor home -ag ood -ì¶ķíķĺ íķ´ -ภĽ -xen ob -ven ice -sw ap -ol lins -mon i -li ka -imran khan -der m -saf aris -mon tic -better than -pa edo -may flower -hypno tic -communi sts -clari on -band o -âĶ Ģ -i j -schro eder -pre achers -ity day -b ini -oo lie -m wa -k ula -alber ta -phys icists -mi asan -do gg -whit tier -down under -dono ghue -se vere -margin alized -gb v -che eri -wat an -o an -too t -stric tly -in verse -chau n -b hic -x plo -un ner -tun ia -ro be -persu asion -dog ma -swal low -infe sted -dor an -asu ka -tortil las -mi ya -ago sto -eri als -ag ric -âĢĵ â̦ -twer king -sales force -d mk -cre pes -u me -stac y -smar ts -repet itive -dul quer -ke sel -aur ang -way ans -s wind -world s -cho y -rede emer -uc sf -starwar sday -lager feld -expre ssionism -cir rus -t sum -vote blue -kaleido scope -hydrange a -chick peas -íĤ ¤ -å ī -zion ism -ty son -new som -fal k -toa sting -schrei ber -recu per -fiel ders -Î ± -{ } -thor acic -ic d -ar se -adverti sements -sink hole -liber ate -bis marck -ag ed -sylla bus -del a -cl ary -shadow y -mom my -lim ite -gr s -âŃIJï¸ı âŃIJï¸ı -uk ah -good all -f ong -envel opes -de paul -ufc fight -pe to -cur b -critic ised -wa key -steven age -hen ny -err ari -der p -canaver al -mu sta -incl ine -e bb -b ks -ter ic -re defined -ðŁĵ § -tw alk -sor cerer -me c -cali bre -ðŁĺ ĵ -se co -k andi -jun i -egyp tians -depar tures -ãĥ¼ ãĤ -ti mess -ilo ven -come true -art museum -apo the -ap l -on ation -kangar oos -x avi -sh om -pu i -na am -bom ber -tc g -ply wood -no re -h ame -electri fication -blu stery -un rival -un authorized -plu ral -lu t -gilli es -ecu ad -co quit -av rilla -yol k -pou los -her nia -est one -pe aking -id w -hispan ic -ah l -wor shipping -pe arly -ðŁĺĢ ðŁĺĢðŁĺĢ -ap s -turnbull malcolm -se av -mc l -ma koto -leu ven -b sr -zu c -te u -sc le -ph onic -shat ner -san z -caul dron -war ra -po k -pierc ings -i aaf -grande ur -fran ck -dis section -affir ming -py le -ham el -equ alizer -bernade tte -syour bestfriend -stumb ling -prith vi -polym ers -mcal len -jun ky -hu gger -da vide -ver itas -mp f -mc neill -ley land -jo zi -candy monday -bas u -mon g -list o -hair spray -sun dance -film photography -far row -u sta -oci ety -me mento -fe o -ab ruptly -c ska -ti vi -on en -calcul ating -shi rec -sequ in -mal ang -gen sen -é n -up take -r tx -free the -wi per -sym bi -co qu -ภ´ -z oned -te ak -id ps -alon zo -qu ish -oc chio -artiston twitter -summ ery -su is -sil as -j alli -forci bly -del ano -cu d -blogg ing -air craft -thri ft -pal myra -ber liner -under gone -fu j -v ray -on b -mand olin -kra ut -butter cup -br ats -termin ation -penn state -moff at -mo dem -ashi on -ðŁijį # -thin king -re publi -ou ta -beh ance -ra ha -loc ket -parag li -l hr -crow der -ma gu -light ning -jo c -fire bird -any l -an vil -sus anna -r ö -feder al -cas ket -bo or -ðŁIJ ¢ -tion ists -pushawardskath niels -jog ja -ha kim -ðŁĩ®ðŁĩ ± -kendall jenner -fri es -boo l -boath ouse -ðŁIJ ĺ -ðŁį Ĺ -s lin -kash yap -i que -care free -ðŁĴ¨ ðŁĴ¨ -hu ber -do b -bre con -an acon -pho bic -deta inees -ðŁĩ³ðŁĩ ´ -un ter -sea horse -man c -la ila -cy tes -author ised -wi pe -stor ia -mi yaz -k ling -isol ate -he brews -gu cci -australian open -tex plain -dis continued -crow ding -mer its -all ar -ðŁĸ ķ -tiem po -spo ti -balenci aga -l cm -kay la -der mot -cor dill -ou ille -oh m -le thal -free zes -ut b -she pp -rou te -dar y -bha van -breath less -ash anti -aci fic -ne followers -kristi an -on c -mary lebone -ber ks -x posure -unmiss able -tul ly -tor bay -raven s -kar thi -ad vers -ðŁĴª ðŁı¾ -us z -sc is -mil ion -at ura -peach y -cra m -ev ils -pel ham -paradi so -meteor ite -kra vitz -yo te -confis cated -bru ck -pla sh -mur ano -maro ons -ðŁĴ ¡ -yn x -pick le -lovin it -k ra -r ns -ann apur -u ct -le ander -lan adelrey -gab on -numer ical -mens style -ma pp -ju g -gli ding -steve aoki -fric kin -food fest -ch int -y pres -sidd harth -butter field -i ff -ad jour -w gr -tam my -me kong -it forward -g td -cryst alline -sur faced -super cross -dilig ence -v z -sd al -s fm -in version -sni ffing -pun to -le vis -ka jol -ini esta -the future -squ all -end alz -di me -con tention -ce sc -shin y -band age -nom adic -dif fusion -aver y -stir red -rig by -os mo -hard ships -wh or -s sp -dis ks -ðŁį © -ìĦ¸ë¸IJ íĭ´ -wil ding -yy j -ovie do -n pp -excep tions -sever ity -made by -harve ster -del inqu -pedi atrics -human trafficking -appre hen -w lax -thermost at -wi gnall -d pr -woo oo -tra u -gor such -east ward -conclu ding -team jesus -fla k -cc r -sa sh -man te -hi k -vag ab -pur sued -legis lator -di ri -ray mond -nu dge -mun dane -s ars -mccon augh -ck in -âľĮ ðŁı½ -pho p -me yer -haci enda -feasi bility -sapp hire -mu gh -ly di -lo west -ers ville -god speed -gabri elle -d agen -beer fest -bang alore -ra ff -n pl -lu kas -ach an -sno ws -ml c -hu mming -ten ter -resi dual -mou ssa -le andro -ke strel -d reads -resu med -hr m -com ix -agreat again -un loading -lovel ife -jack ass -cu yaho -wh ining -power shell -n gs -front page -barbar ic -uni q -ol phins -intensi fies -ea c -dy sp -seabir ds -tann ed -sti el -ho ws -aaj ith -mc avoy -á ¹ -windo ws -wh u -muham med -ide ological -mi de -j ingle -bbcra dio -ultra violet -next door -lei den -con un -an thro -air way -wa irport -tr p -race day -l ml -g ough -in stig -den berg -es ther -meat y -da vie -co founder -tour mal -shir ley -ob noxious -loo sing -ðŁįĢ ðŁįĢ -⾨ # -spiritu ally -sc rob -go for -coffee day -ðŁıĪ ðŁıĪ -i em -extra dition -sett ers -demb ele -tur nip -mathi as -liken ess -roo st -i en -ero ck -dro ppin -mu ay -feyeno ord -bon ang -sv g -ous ell -mar vin -cas ing -mor ata -edi bles -co a -av n -ta ken -ice man -t cc -sand berg -id gaf -consider ate -ps f -ay y -scho en -hake em -excer pts -no elle -inevit ably -blumen thal -wh yi -under taken -sp ub -oni um -daw kins -pro tip -âĺ Ħ -troye sivan -t ye -stati stic -sm l -ðŁĮ § -ger anium -ver watch -yo ak -world wide -volta ire -ns x -na iling -mo ira -band ar -lay ering -kin dest -ef fi -cham plain -apo stolic -ta vares -lero ck -appeti zers -ac centu -;- ; -w awa -or ning -on der -easports fifa -ar p -ðŁĺĬ ðŁĴķ -up setting -str inger -sho ggi -lu pin -l ny -su bor -pr itz -mor o -hil i -tro ye -scor p -her story -ent ral -ch ine -mar ques -hop kin -mo g -h cafc -g j -y aaaa -ru moured -iti ans -cotton wood -basti on -nine teen -mish acollins -men i -handicapp ed -alt coin -min der -at socialmedia -allen town -ak on -ðŁĺĿ ðŁĺĿ -gw u -ay ah -cannab ino -anth on -air stream -i wc -cbc nl -ðŁĴĥ ðŁı¼ -w soccer -se ong -aad haar -l anger -ì ¦Ī -the bachelorette -t chaikovsky -pep tide -p sl -agri business -oun i -scat ter -nul li -inhibit or -vie ira -ra iling -law ley -ðŁİī ðŁİĤ -ì ² -su tter -mi u -husk er -har rys -con cac -c ates -as ak -ãĥ Ł -serpent ine -santa fe -pat taya -modi fy -jay hawks -h ors -brain storm -be sik -wat h -qu on -creep y -u ic -sc aring -peel schools -ðŁį ª -sh yam -rou se -gov ts -go pal -par th -maxim ise -ken il -hhhh hhh -health iest -so or -r acker -bb on -vintag ec -the w -marl boro -d any -aven ues -ag it -ro sh -sc ania -pr itchard -p mb -glass ware -your bestfriend -whist ling -la e -indigen ou -brad ford -co q -bloom sbury -spirit of -op eng -flick er -cre ed -confi dently -aw fully -um n -hermo so -tom y -sn ape -kar ma -wa isi -nw dogrescue -mon mouth -de fun -bu ren -west gate -s show -goog ling -gibb on -deci der -q vc -pat ra -m chen -bra ille -wh opp -de bac -one al -willy levy -white side -the red -im patient -saat chi -depic t -war na -pick ens -gh um -fi bon -opla sty -director ate -wh ittle -kim my -gru dge -al tu -simil arity -eng ro -cham onix -alic ante -secre cy -re master -pyg my -low ski -gujar ati -figur ines -at uri -agar cia -ultra sonic -out breaks -inno cents -under goes -acou stic -nhl blackhawks -dan ville -ðŁ¥ Ģ -holo graphic -f able -cum ple -ev ens -acqu aint -she ba -the drum -equili brium -sincer ity -premi ums -jelly belly -buildthe wall -and rade -staur ant -savethe date -re election -prescri bing -kno tt -some ones -cook ware -sal ford -popsic le -dr ury -c age -ag gi -portra ying -pande mic -pan tom -v d -ero es -backtothe future -ë ħ -trans gre -suici depre -stay safe -o bas -ju ma -heigh tened -endome tri -a jo -v yn -nd t -lif es -tu ll -dic tion -chilli es -calla ghan -take out -su bbed -stephen curry -sol i -promp tly -aw ang -a theatre -ni th -d ney -aji th -abas ketball -sk it -mol ded -duc tion -an ker -ìķĦ ìĿ´ì -world sbk -syn onymous -rr r -ro dent -ash win -Ñĭ Ð -ge ton -real talk -mul ch -j ani -dray mond -ast in -harmon ic -h ms -dwar fs -ambi ence -ab laze -th grade -ra kh -mc david -bar bic -pre t -mun ster -kis sim -indic a -cy r -ac nl -ðŁĩªðŁĩ ¸ -turno vers -rae es -plu to -m hr -lec tric -kon en -ca stan -mitz vah -bo wie -une asy -pode sta -phy lo -im moral -hour sof -decath lon -c br -kham enei -ja in -ex tric -cu shing -z hao -y id -plo ver -nor ge -yak ima -women shealth -to ff -gil mour -ch ay -าภ£ -visit wales -art fair -al en -willam ette -lu zon -elli e -blin ders -the john -co lette -o zzie -drun ken -bur kina -adirond ack -rescu ers -pay out -mar ge -ju ly -car parts -su shi -goo dison -ag wa -cor doba -box set -ad un -.. ) -le sotho -layo ver -ke an -al b -ठľ -son net -mus ke -mach i -i sto -bran de -syn ony -li oness -ak ia -texaste ch -stun g -hang ers -commerci ally -du mas -uni magin -spar king -ri f -z ic -tabern acle -g aff -creati vely -coura ge -arma geddon -ðŁIJ · -s st -gerald ine -ss chool -son am -ne ha -man c -j query -eleph ant -ejec ted -cam i -yy z -cle m -x games -wi ft -sw we -ra bi -back in -man j -hol t -ho ist -fire stone -ðŁĵ ¦ -ur anus -la ing -ðŁĩ » -nfl network -insp ace -god win -clari fication -tre spas -multi plic -hack er -ðŁį ¹ -pol enta -heat ers -mk tg -mercedesam gf -ãĥ Ĺ -wwer oman -gu ing -gfuel energy -ภ· -u ste -di ony -cu sack -cor ned -( - -thex files -v news -sind hu -le high -fun times -fo g -exp ats -a beach -dun fer -deduc tion -beauti full -ol us -modi fications -mul la -not ation -wweroman reigns -thal aajith -kar im -harmon ica -salv ador -oc co -plan tain -faith fulness -prefer ably -car th -!! ? -womenin film -so br -enterpri se -che at -ab del -sar coma -mca fee -chu a -museu mof -black stone -ar af -un dies -smugg lers -yo se -ten dulkar -preci p -fc v -trac ey -in voice -am bo -theo logi -li ye -chronic pain -bash ar -war burton -the more -sol dering -ho sse -gine bra -g ly -flash y -é ĥ -schu ster -livepd nation -ind ler -bon jovi -black ened -silhou ettes -gar go -ni les -mu zik -gau rav -chant illy -recl ining -mc cur -lou doun -har old -ad ha -f ata -ali l -tb f -v am -twenti eth -thisi sy -the bachelor -lan ark -sni der -bar an -fi sts -cra i -al go -pl ice -or ang -gen ds -cor nish -ste dt -di shing -ci on -rel li -in bound -cent en -va z -sc ia -une th -mock up -lac s -dr an -design museum -cos mon -c dr -bull seye -s ds -pamph let -fi zzy -silicon valley -barthol ome -' .. -tra e -pett is -osh kosh -o ast -mal ice -body suit -all uring -pu tra -no ki -ar news -wil lows -urban a -radi sson -podesta emails -ne apol -j timberlake -ti q -om ents -cc c -what wedo -mat is -ign acio -ho ss -hill song -gra be -fran kel -e us -cre epi -benedict cumberbatch -âľĮ ðŁı» -ra bies -mc m -batmanv superman -sym path -s ry -roland garros -ku ch -gross man -du als -coco on -bri scoe -rebelli ous -pride of -mi mosa -k ola -hear th -gil more -caled onia -c md -py jamas -am end -ðŁĻ ħ -hau te -ev r -ðŁį ij -ðŁĩ« ðŁĩ -vo res -marj orie -in explic -dat piff -spr in -rub ens -lam ent -apo d -re stores -ra hm -madein italy -cas ed -ca pre -bang les -ag ile -refresh ment -parkin sons -gri eve -expon entially -gr yl -drin kin -ठ¸ -sch la -snap shots -mis on -sf v -nov i -cun y -the snp -kin ks -josi ah -é r -megam an -m dm -blu eli -x ena -par ab -maker s -cle f -ðŁĺ ¸ -t cr -pa io -cron in -the boss -scar y -ran os -ko e -daim ler -wy man -te es -s beer -ise ach -in is -and an -ðŁĴª ðŁĴª -ë¹ Ħ -stal wart -ni shing -jun k -gu s -perfec ting -new x -ir us -co preps -supp er -suc cumb -mosch ino -hi ggs -ãĥ ĸ -shan ahan -mark t -lor a -hou thi -ex c -or dan -ko d -gro in -just doit -bell ar -rho a -psori asis -ma arten -insu fficient -impac twrestling -g aff -du stry -summer of -news week -mur a -is la -do yle -ma ic -luke bryan -fibro myalgia -ر ÙĪ -m la -kar am -ju d -evoc ative -ठļ -tro tters -tri pped -ple aded -fall in -et fs -venom ous -mcconaugh ey -flam boy -chang i -good morning -fri gid -th aman -re claim -bo leyn -ãĤ ¦ -recon c -ke sh -el sie -bed fordshire -be ss -sub continent -kat erina -bo z -thessaloni ki -termin ated -rag ons -intro s -dr r -cre ss -brief case -blin ks -ran bir -perfu mes -exc ited -ever ton -cou k -c pp -yr kkh -sk u -ri va -kit sch -di pa -do do -bo ho -ticket master -ling en -lau er -dat sun -ðŁĶĹ : -m ro -gon dola -ci elo -chapp ell -fit r -ski ps -nc ga -mur dock -multi disciplinary -ki wi -cer os -cac ti -vene er -on u -k ars -evangeli on -Ñ ı -titan fall -secu rely -eyel ash -îIJ Ĵ -s watches -heal ing -ton ya -n q -mi stry -high e -cab rio -m ö -kinder gar -in nate -vi pers -nucle us -mac key -al pine -ox y -mor tem -fol ders -a fest -á ŀ -repur posed -green belt -de port -west port -pu sb -news brisbane -arquitec tura -set life -mag ick -macar ons -dark horse -vau x -mu zaf -ðŁij ° -ì§ Ħ -pro wl -gon i -edmun ds -vie jo -lau rier -enqui rer -embank ment -ðŁĮ ĥ -ro mel -ma ury -line a -k lee -bis ons -b able -we athers -o deon -de volution -cordi ally -bu ch -sti an -o varies -lov ell -cru iser -c th -v ay -un nie -tro w -t ler -ben az -- £ -nas asocial -meto ffice -gu en -clu msy -? ¿ -or ps -jac ket -in nes -regi men -mah mood -kam ala -fi end -da al -co as -å ½ -twitter less -tao iseach -buk hari -panther pride -delight fully -book case -pan tera -ms ley -mesqu ite -here by -he morrha -gun control -du ma -colla red -av l -ador n -vaul ts -teme cula -sky diving -play maker -mur ug -lat vian -here fordshire -god mother -till man -shoo ting -mar it -mal function -fr inge -tu bed -nab show -ed dy -do ge -diag onal -as mith -好 ãģį -sti est -spectac ul -pinst ri -pi pp -d sw -ðŁĮ Ŀ -nam in -mb ur -propri etary -gener ale -dic ed -ba hia -ðŁĺĬ âĿ¤ -urban ism -pe ps -dri scoll -u tt -cay ne -tul ku -national siblingsday -ya an -v adi -together ness -o en -juli en -cam pion -ðŁį ī -ye ahh -wo e -t alia -lepre chaun -p ice -fin i -de ver -carri ages -we aves -scho les -ra deon -lil o -j cc -icec ream -hagg ard -el ks -cir cled -yl le -tu cci -ic loud -dr an -analy zed -ðŁĴĽðŁĴĽ ðŁĴĽ -âĢĭ , -win x -sonam akapoor -s fl -ni ka -lock out -injec tions -erad ication -bio chemistry -rot ate -rang ersfc -playo verwatch -kr iti -hand lers -win ks -mis ss -k su -best fiends -ðŁijī ðŁı¾ -âĶĢ âĶĢ -super iority -kri sti -flan ked -alt coins -mimo sas -hallo ws -yo i -tro ller -re pay -ny g -ie a -fol lic -ðŁij ¾ -tele caster -pro claim -fear ful -whi z -mosa ics -improvis ation -bic entennial -we sley -pad ukone -every ones -ain en -lat i -lac ma -gram mer -fore arm -de ir -colum bian -tyne side -sh ingles -rou sing -rand le -cru mbling -tu pelo -glo s -cor mor -bosni an -rac ine -k ington -ha ines -children sday -at un -analy zer -at ch -meat loaf -amaz es -isa acs -corner back -os wego -multi ple -electro cu -admi rable -sho als -red mayne -lo sa -mcdon ough -ker ber -te ddington -rh one -plu mp -ne stor -kw h -hat ching -girl z -bel uga -.... ? -ðŁijĭ ðŁı» -y ms -ble achers -ang es -tor tu -refugees welcome -pu th -vul can -nu i -mad hy -doubt ful -dami en -yu u -si ppin -ky la -ospre ys -mache te -lad bro -sh era -scoo ped -jy p -z co -u bi -smugg led -dre d -cl ondon -der berg -e hl -du mont -de de -è ne -s bb -pru dential -life saver -key notes -bal t -un settling -pu ente -out fit -leg acies -exam inations -red hawks -manipul ated -gaz ebo -tou hou -medical marijuana -ing week -gi bb -zero hunger -rac king -tu ba -sun a -seaw ol -w pc -oz an -cav ite -broo d -wool wich -vol de -un fur -shadowhun ter -jo bless -har var -food blogger -ca wards -ta hs -st b -no wh -jo es -h j -cahon tas -oper ahouse -mi ght -flag ler -b ch -sp ire -bun gee -b x -ri fle -cu rie -ba ines -ru pauls -) ." -vi vac -health it -wel lesley -throw down -sa ver -ri vier -x ray -nap erville -induc ing -charcu terie -berser k -ba at -spart acus -noo b -dead ass -bel e -vi ri -niam h -mountain ous -si xx -qu a -te sters -prince ton -in q -ber gam -democr acy -bre am -aun ts -re is -pet r -par ramatta -nic ht -arte facts -un just -jet pack -in venting -filip inos -farn ham -do il -chu cks -ac ross -sp ass -r anc -hundre d -euro sport -slam ming -house mate -gam bit -d ÃŃa -azzur ri -stam ping -nar ra -campe on -suici des -colon ization -be zel -xin jiang -stand still -hiero gly -gou da -cam bs -thr ill -star vation -night shift -adi l -spher ical -loc alization -clean tech -zarago za -wor ka -spec k -sou the -lip sticks -cb t -ak im -ag es -st ica -un k -pion ship -shell fish -kyr gios -far is -sty lish -squ aw -kel p -id w -cap stone -w gi -trol led -pe ppa -gam mon -anti och -; ( -z ations -un realistic -ss cot -slu g -ke ats -en th -ad iti -uni onist -ol or -ke ita -exagger ated -briti shar -Ø £ -suzan ne -so z -n gr -campu s -bri o -pet iti -eh ler -ci k -ab io -ubiquit ous -Å į -wi gan -plac id -bank holiday -my sql -mc nally -fire wall -bay lor -bar stool -az ur -âĿ¤ ðŁĺĺ -mid as -ãĥ ¡ -sun downs -sto gether -sequ ins -m va -c ph -ðŁĩ¦ðŁĩ ¹ -trail er -so wing -am ary -mol lu -mackin tosh -al di -wil fred -vaccine swork -lo ls -dial ect -cas inos -militi as -go thic -fort worth -calibr ation -br ine -ble ached -ke k -n ss -har u -acry lics -mar ou -ger sh -bor ac -sam ar -rome o -mr p -light ing -ab p -spra sad -main line -flav our -bo sp -alber to -the show -santa anit -plu s -n fu -morning joe -m chu -gi mb -water loo -ut z -motor ized -mar icop -inst adaily -rever sing -mm ons -cen ta -salv ation -jaco by -inquis ition -he id -bantam weight -sun d -stri p -sime on -fu tile -carpen try -al ondon -ðŁĵ ¡ -p ma -the hobbit -mo ab -keep sake -for mmva -water mark -free iran -folke stone -drif twood -sen sor -maybell ine -for s -fer ous -ane mia -glen coe -atl ant -at lee -incre ibles -cor t -refuge e -elli ot -Î ± -tim or -tann er -take down -m nu -ha bad -proud to -nu tt -hann on -castle vania -timm er -restric tive -l tv -delu sion -ay la -a ann -ze al -j ant -im bi -bat smen -um o -ther on -smir k -per ishable -d wind -aa ja -pla giar -lu dic -kesel owski -clin ically -reck oning -mountaine ering -conj uring -yo gi -west land -toma hawk -montr éal -jaf fa -b de -ra fts -n lc -avrilla vigne -ux design -sun roof -ram s -gw yn -die ter -awak ened -ab l -sur realist -der mat -ban get -the cat -latin x -gar nett -ay or -wel der -state house -love joy -gir lie -coquit lam -refu el -po u -man candymonday -ma q -bus by -tt f -picture oftheday -ak ade -yi pp -y ere -wi p -tre search -li ya -wh ol -dig ic -bel lied -abar th -will ough -vil nius -tellu ride -kar at -anth rax -t work -as say -ach am -wil shire -rain drops -l are -gigab it -do san -ab p -ðŁį ¬ -tr ynna -orthop ae -h inter -go irish -gian carlo -gas ol -chat bot -where is -si h -holli ster -cli c -abc network -dress ers -fe asting -elev ate -constitu ent -adventure time -sr iti -el ou -de soto -dav i -contain ment -lo di -ko da -gl in -wr itten -wind chill -out spoken -make adifference -j annah -" -- -tro t -summer fest -sil os -joom la -game design -ar go -ru pp -perio d -new quay -mitt ens -ici ally -emplo ys -du bious -bail out -+ @ -ðŁĮ § -âĺ Ľ -special ties -pan ini -mb ridge -gar nier -du els -anton ia -u j -ph u -aw at -robo cop -mac abre -dom en -band ing -anat oli -ad n -nam co -laco ste -buy out -fav ourable -esc o -sexu als -kait lin -en try -ad ly -yang on -win ston -wau gh -pati sserie -ozar k -kristi an -kha shoggi -g mm -embar king -mo aning -mal kin -j el -di ggers -bee keeping -whirl pool -hor gan -bb cin -ðŁ¦ Ĭ -ðŁ¤· ðŁı¼âĢįâĻĢï¸ı -suffra gette -mer u -dro ck -cru fts -woo dru -pi ero -om bud -esp ana -advis ories -aby ss -us ar -ren ato -jean ine -endocr ine -. âĿ¤ -ðŁĺį @ -ìĥĿ ìĿ¼ -wand sworth -slo vak -reli ance -in competence -ey oung -ap as -a sen -s lander -ljubl jana -iti ve -ar gent -tion day -reson ate -more house -en chant -b sg -ri vers -n ils -m da -indul ging -gal le -sav annah -no k -mn h -lu h -hi berni -tor turing -le b -girls who -dro gh -adri atic -shar pen -swa sti -se urope -i fs -gi mpo -eri e -amade us -ipf conline -ðŁĺ© ðŁĺĤ -tr l -as syrian -ðŁĻ Ģ -vi ene -data protection -dream catcher -thro win -red undant -pen rith -n ne -amal gam -sense less -par v -national guard -kne eling -guine ap -fa qs -cy an -ãĥ IJ -whi le -loun ge -sik kim -makeu partist -instin cts -ha ji -cot to -vil i -mb l -com mo -mi ga -lu s -ar mp -ŀ ï¸ı -æ Ī -platin um -na am -lukebryan online -gulf stream -ad der -tot ally -pal i -wel i -alter ing -ts x -par ake -mon ol -air lift -sym pathetic -su pa -recep tors -pat a -orchar ds -op m -lo dged -ky i -bru n -villen euve -ko e -electro ly -dead mau -a ed -sharp ton -re branding -nu est -hub spot -hemp stead -gw end -bourgeo is -wn w -living thedream -friday night -orthopae dic -kx ly -is and -f co -f ada -bla s -all l -: + -r cb -mi kel -live streaming -din ing -de ford -she esh -lon nie -ho ard -zar if -thevamp sband -spiro smar -spirosmar garis -n hi -ft k -biome tric -bas f -auberg ine -acti vision -vari ability -pi ans -med an -l nk -ira h -t pc -r tv -ofi eld -dr aco -bri c -x perience -we stin -santabar bara -quadru ple -connec tivity -bru ssel -marriage equality -dat am -concac af -ë ¬ -w acom -truth ful -sw irling -sher lock -archae ologist -aque duct -york town -ton k -ten n -sti letto -jo on -ab ril -f ft -boiler up -? ðŁĺĤ -shi sh -deci mal -unle ash -pl at -ec risis -nar c -suff ice -jellybelly friday -it an -inv ades -ctr l -santaanit apark -le aping -invic tus -ful fil -x ic -under stated -l é -higu ain -ct is -bo realis -annihil ation -z hu -ul rich -shar ing -pul w -eth andolan -vard han -timber land -corin ne -spac ef -resili ency -pu k -inspec tors -cer ve -beli us -avent ure -par ris -pag ing -hy land -debac le -first look -bast ille -Ľ ï¸ı -ðŁĵ ° -ðŁĮŁ ðŁĮŁ -rel i -raje ev -fand oms -val verde -med ford -vo wed -v amp -sweat pants -dee z -par nell -glen wood -bur ners -road works -no ire -lek ki -ðŁĺ³ ðŁĺĤ -sus que -sp as -s dr -launch pad -de tto -sa q -cam po -ðŁĺŃ ðŁĴĶ -vi va -ne g -jol ly -di anna -waf fle -trick le -th w -scumb ag -henrie tta -foo lish -expo s -caf er -bil awal -âĢ¢âĢ¢ âĢ¢ -stri be -se ward -n de -lou th -cyn ical -bat o -m ily -inclu sive -hai yan -aj ar -ðŁĺĬ . -me redi -d pt -can tab -ven n -gan e -di was -bird club -tr ina -o gs -mon ic -he en -de mented -she ik -noman ss -itu nes -gly pho -ðŁİ ¯ -y ous -wi fe -vom iting -om gro -tax onomy -ri eu -berlin ale -ad ag -tur ret -maul ana -mag icians -ag ul -xx i -the age -shel ter -gru ber -cri mson -bal di -ab sin -h inge -me ij -loc a -ge iger -dri guez -atten tive -dit ched -cat nip -íĬ ¸ë -loaf monday -joko wi -ce bu -chur n -breeder scup -stap le -lef tists -train ings -fu ku -e bb -colon els -â Ĭ -whist les -shon en -mc ge -vel asquez -tes lamo -lom o -car rey -in ton -kent on -isleof man -aaj tak -ven ous -tuske gee -original funko -jewelry onetsy -ðĿ ķ -per ak -eye balls -dom ingu -ath al -ðŁı İ -tg dn -ta v -spam ming -ren ters -not ably -kav anagh -pp ert -m db -fox sport -ex ec -besik tas -auth am -ka iju -ðŁĮ Ħ -utili zation -spo of -indic es -hin der -gir ard -deep en -anag ar -ðŁĶ ¹ -termin us -s wore -rita ora -li ven -bra sil -alham bra -ðŁijıðŁı» ðŁijıðŁı» -ton ews -ore gano -boat eng -joh ann -bu mmer -ba ston -à® ķ -then ation -spac ec -cru m -bu sch -sarah g -lo we -aw arri -âĪ ļ -zel o -wayback wednesday -tent acles -l hh -jo ec -eras mu -de witt -rick man -dill ard -curi os -poin ty -po thole -mc nair -he mat -dr m -de fies -w sb -plant ations -ha im -pal trow -up i -ter ies -shor tened -al ac -pon der -la ker -best fandom -ambul ances -safe way -pas ser -melo dy -ima r -spo tty -in der -hear tedly -ge ss -bi ga -ðŁij Ĺ -fl ack -bott as -y ara -si b -disci ple -ti dal -sol ve -lon a -âľĬ ðŁı¼ -strato caster -k rs -eng age -du chen -buon giorno -ঠ° -pi geon -lets dothis -fe et -ci roc -ðŁIJ Ī -som ers -ko ch -i ain -al m -veg am -re pu -promethe us -pede stal -ke swick -i ol -ori z -cotsw old -a er -Į Ģ -æ ° -head sets -al ona -volde mort -gor d -fu se -dont care -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ -spl at -port als -lets get -inform ation -en ugu -attend ants -th ackeray -progre sses -ke igh -alpha bets -ðŁķ Ĵ -sand ton -derel ict -ìĬ¤ íĥĢ -un familiar -super human -ri an -insur gency -cor rug -trage dies -si sland -del ilah -and aman -fu chs -br ati -adam son -par as -live by -even ting -ç ķ -ra go -le z -il ook -bou lders -bo j -tom brai -ring ton -ma ul -fi que -complic it -wel beck -gryl ls -discrimin atory -une p -scra ping -pan a -ocean ic -mat tered -ಠ° -tropic ana -house wares -bell i -agu irre -un censored -mult itude -mon god -met life -kapilshar mak -gal len -confin ement -tru est -new bies -chil ton -cal cio -ballis life -________________ ________________ -âĺĥ ï¸ı -santam onica -open ness -faw kes -co leg -bo yn -ðŁĶ į -r caf -pr in -pic colo -dev oured -av at -adequ ately -ìĬ ¹ -thi e -mc ity -madi ba -le mmy -in ject -farm ing -it el -beauti fu -à§ ĩ -Ù ¾ -miz uno -en rolling -du mber -aqu inas -wo ws -sque aky -l ons -impro per -esk om -emancip ation -bar ba -a hahah -âĺĺ ï¸ı -mc mur -eye sight -dissi p -cairngor ms -baf ana -s movie -li ang -ger d -andalu cia -am mon -yl de -t mi -s group -poly mer -newin dia -li i -te w -le ge -go ha -for ay -dissol ve -th ks -so ire -lan dis -go blins -glau coma -jble fevre -d cu -th ony -p tx -margare t -mal in -íĶ ¼ -li shing -cough ing -conce aler -und p -sw ir -g te -sil ica -ro asters -po go -ou sted -in play -bird sof -hist med -dep tof -bon g -ric key -mad man -fundra isers -e al -portsm outh -mu th -predic tor -iz one -compens ate -sh inju -po achers -nbc dfw -ci ano -ðŁı ° -uof a -po cus -open ers -insi dious -a the -yi el -sup date -pel let -n sc -f fr -cha e -½ ï¸ı -lo m -l fa -kissim mee -hafi z -å ¿ -tr ich -elec tive -brant ley -mi g -mee ee -lun ar -laver ne -cor related -carto graphy -ar au -z az -yi p -viol ates -negoti ated -law ton -âĢĭ âĢĭ -to ads -reno ir -follow your -arma an -w apo -th yr -n gu -mark sand -rein force -pension ers -pa f -mu kesh -fer ro -çĶ ° -ven u -re run -man zan -fin earts -bray den -x m -wag yu -un bearable -ri deau -ec m -c pm -b itt -ðŁĻĥ ðŁĻĥ -ye ahhh -temp ura -re view -noo o -moder ates -li ef -lat ory -deplor able -co yr -re gas -gov ina -dv or -angh ami -seri es -pal lets -lin d -sha olin -colli sions -than a -l lu -jume irah -honey well -compan y -ve dic -twenti es -t was -snu ggling -la f -gossi p -bow yer -ba si -vigil ance -sni pe -senti ent -represent ations -formul ation -adven tist -âĨ Ĵ -t sa -ss ors -isu zu -bon ham -vi vegam -liver more -join us -ðŁĮ ¶ -stage coach -con tre -clique art -ðŁĵ Ī -ðŁĴ ² -par son -ful ham -ª ï¸ı -omgro bots -bridg end -wink ler -waver ly -ton to -slu gs -glit tering -ni d -dog sof -ah hhhhh -thisis queensland -pro wess -pale y -n ga -gangu ly -dor mant -agchat oz -vi acom -song bird -ron ny -after school -un insured -ther a -bc afc -. "@ -ja o -ip cc -hef ner -gen dered -cou ch -be there -v ann -retali ation -moder ation -j pl -mac adam -dan sk -y us -mu ri -car amel -bro mpton -ar mando -agu stin -.... ! -ski y -kitty loafmonday -ido t -en son -ha vill -extravag ant -ðŁĴŀ ðŁĴŀ -the op -un done -ephe sians -nott inghamshire -nec tar -ch q -bai x -te z -stream lined -fl oun -all timel -republic day -mer curi -cc w -ak ash -ðŁijĭ ðŁı¼ -twi gs -tul le -ti ram -red ford -ne ttle -el ms -bu gger -fitz roy -! ( -ver ve -bottom less -blu shing -valedic torian -tin iest -recy cle -ju di -ather ton -time for -ti mi -kis umu -fron ted -e ola -digiti zation -cu ster -baz aar -tri angular -st ann -paedi atric -mer can -ma ren -gv prakash -wind screen -un pack -la do -finan ce -saf rica -cron ulla -bit ty -bel ter -be bop -â̼ï¸ı â̼ï¸ı -my x -ker man -dd ell -bringbackour girls -sau ce -rac al -pap a -nu f -fa red -cartil age -c renshaw -vas a -rele ss -book ish -w mata -ite x -dor al -astur geon -tremend ously -info sys -fan fare -die ting -ðŁĺ ° -suscep tible -sex po -ry erson -mo fo -yel len -var nish -ðŁĸ¤ ðŁĸ¤ -ðŁIJ ® -mo sh -lif toff -kamala harris -crow ning -# . -âĩ Ĵ -tu f -pac er -shaf fer -en lighten -swe ars -apolo getic -yi elding -un opened -n vr -ken ner -jump start -en sured -à° ¾ -t mt -pack ham -cd mx -swer ve -sprink led -day dreaming -boudo ir -nicol asturgeon -be im -motor speedway -ane ur -acron ym -mer cer -facil itation -d ass -as il -,, ,, -tb ol -ba er -auto correct -won ky -the garden -remn ant -mv ps -mun ity -ling o -kar am -is ma -dignit aries -boy hood -st inger -marath ons -lo fficial -jo ero -flat bread -er aser -court side -y ville -n ila -li mo -im ho -tho se -pre viewing -missou ri -explo its -cry in -( ~ -y ooo -sal ma -po cahontas -ex uber -an ad -united we -pun cture -explo iting -deci sion -cauli ffe -be curious -⼠³ï¸ı -z av -newh ome -carbon ate -bust ling -bts fanart -az ur -ade bay -ac cli -kit t -c love -bur lon -ภĤ -new town -im perfec -hit z -depe che -carne gie -twitter blades -qu art -nu isance -ih sa -t series -knu tsford -doug all -at ourism -and beyond -bli ster -am es -prob ate -ex ported -ca icos -toast masters -noo oo -fa kes -pe at -maa stric -ha rem -bha g -aus vind -preli m -chippe wa -b ni -po g -pa wx -t day -e ep -benedic tine -trigg ering -e chi -v k -pretty little -har k -mam at -el more -cu ad -ar nab -j hs -c mp -v ra -stor mers -lan ier -jar rod -ice hockey -wren ching -wreck age -om ia -na shik -ar co -sveng oolie -en tran -bake off -thisi smy -sw r -grateful dead -mus sen -m ff -fal co -dor se -win n -prin cer -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺį -fir mino -yu z -sk op -mum mies -mor si -l ca -art pop -ame er -qu ant -confe ction -cag li -mccla in -se ye -s int -ro bi -ra aj -á ¶ -way ward -mi mi -back side -ãģ Ĭ -regi sters -gru po -dis graced -i ghts -analy sing -advance ments -trum peter -tr ice -stlouis blues -sapp oro -ofthe month -j son -j cc -c of -bo real -anz ac -ro ch -pan tal -ny rangers -n nam -ic arus -dre au -ë Ķ -mo an -ðŁĴķ # -yann ick -pope in -ma sha -house keeping -gy o -giz mo -book stagram -samu i -ex xon -cri sto -chi sholm -sas qu -ric cardo -rel ativity -lu i -d ori -we can -super cup -se aton -func tional -chil is -sf r -p wd -le eu -l ha -ide as -and a -fli gh -ash u -tou rof -starwars rebels -per alta -on an -descri be -daf fo -se ma -monaco gp -k ink -himalay a -gi za -chim pan -law school -j z -im mobili -dick erson -chan ey -chain smokers -and hra -vir al -over take -madein usa -et ano -ca ther -quin ton -ik onic -co pley -anc entre -amal fi -ðŁĺį ðŁĻĮ -super bly -q z -hu is -sier rale -my name -em ph -yi sts -snap seed -self love -r cs -shout gamers -newsl ine -gn r -ec co -ca vern -ha pp -environ mental -dream in -ag il -! ðŁĺĺ -winter fest -sh hhh -s ye -sch on -mlb draft -bla ise -dunfer mline -be aming -a star -ðŁĺ ¿ -tu fts -har inge -f ü -aq sa -abu bakar -!!! @ -wad ing -fla panthers -dun dee -bo hol -rejuven ation -ers week -cor se -wag ga -tor o -tat er -sa ira -o tra -mck night -for thelove -t tawa -baff led -lex us -davis cup -sw ick -penetr ation -b dn -whe res -twitch tv -pr ing -heal the -f ms -tm j -pir lo -me zzo -man ley -lovel ive -hu ffman -ðŁĮ ¶ -wa w -to toro -cur tiss -chi u -bil is -ti kka -r td -im poster -edic ine -olive ira -neat ly -é Ľ -wells fargo -s mbb -f ick -alltimel ow -shim la -sat l -rein venting -pen h -san te -nu kes -im pal -bohe mia -ðŁijıðŁı»ðŁijıðŁı» ðŁijıðŁı» -stin son -bt l -ëı Ļ -ul tron -sand ing -n th -mir amar -bre l -bre cken -re draw -evi dently -e zy -re unites -miami beach -indian army -crunchy roll -Ø§Ø ª -l of -gg en -fl ay -do ol -wil ds -th ir -rent ine -ren nie -napp y -lesli e -ag ec -wood side -vi zag -ro ker -over loaded -esta dio -ภĬ -un u -kah lo -hi king -ðŁIJ ³ -ta king -ol m -ingenu ity -el p -common wealth -baha dur -wiz khalifa -stray kids -southbank centre -show er -humph ries -de vol -cor ny -micha ele -fon do -anc er -è ī -ron in -ar ou -proud ly -pp d -donnie wahlberg -copy writing -cap a -bro d -un imel -ome let -le berry -eccle si -cla ret -ter ro -si fy -lon dres -legend sof -doub ted -ö z -sony tv -rebe cc -vote yes -tv show -sun burst -de y -benef it -z ico -t cd -rejuven ate -don ato -to is -im porting -fa kh -e fe -and ela -zind agi -love y -high school -gordon ramsay -fur ries -f cim -chi vas -ax ed -p mc -jay am -brew dog -gam y -captiv ated -shout outs -sab bat -ru fai -lat enight -descrip tive -s racing -pr p -nad in -mushar raf -grump y -gn arly -font sunday -fon dant -classi fy -ðŁĴĥ ðŁı½ -ryder cup -pne umatic -i phon -ra glan -mam bo -gilli an -enig matic -cor dova -spoti fy -har ish -emo tes -ar gh -m bi -love to -cur ve -ad ore -po sa -pa inte -be gum -> @ -ro che -mag i -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -x lr -stoo ges -newsline weather -wc l -linkin park -bush wick -hei ght -cla pping -capp ella -bad i -loo t -def con -super hero -shore ham -mc c -k lam -ale ducation -é Ł -the democrats -sher ri -dioce san -d mb -sen sex -lovel iest -ai ko -âŃIJï¸ıâŃIJï¸ı âŃIJï¸ıâŃIJï¸ıâŃIJï¸ı -gra z -cla sp -chec o -ar nie -stra d -dar ou -britt ney -bra h -festi ve -er ley -the blacklist -tb ay -pau lin -basti an -affir med -stre isand -gan esh -stat ute -re load -lu l -id is -youcan texplain -nu tt -migr ated -zi ps -pro dig -ma geddon -for ging -ðŁĺ ¨ -st mas -plu gging -dur o -correc tive -t elly -sj p -pi et -anu i -adap tations -v ant -myel oma -cap one -sier ra -black water -zeph yr -yon kers -thr ac -screen cap -pa seo -mi kes -lock wood -h rd -er rol -colum bus -ab al -pp t -indv aus -char lo -par aphra -daniel e -r joseph -hir sch -carol yn -thro ated -sli mming -adi os -v logs -mun ching -j akes -fi k -bar rage -shan gri -pin occhio -pa kh -min as -icha el -diversi fied -caes ar -ome try -ham ble -cuyaho ga -bai leys -seat belt -jeopar di -brown sville -scandal ous -oni ans -ble aching -found ation -the le -rye o -kaf ka -ja ja -feder ic -fat al -best price -bandic oot -ðŁĺĤ ðŁĻĪ -kor o -fac to -dispen sary -br ation -ur ray -makeameric agreatagain -wit ness -toyo ta -pat ties -black board -ad is -te rer -ss chat -sh alt -record storeday -la da -gi ann -íĽ Ī -un holy -kh ana -godis good -palis ades -he for -ci ve -hered itary -hay wood -cor ker -spr ingh -sand i -re du -natu ro -many vids -jessi e -âĵ Ĵ -schnit zel -o vie -gren ades -gat es -ab ed -ms ft -medic ally -led ore -l ousy -mentalhealth awareness -glee son -col ly -cabrio let -wee e -sp end -snow mobile -hi j -Ï ĥ -tal kies -rich ness -jor dy -giu lia -acti v -do pam -alleg ation -your life -sk elton -v ny -mu riel -lat t -inaugur ates -foreclo sure -tain er -harne ssing -aguil era -x rp -coo lidge -car ta -ser gio -news radio -k tr -sol arenergy -r sprasad -home design -ho stages -hat a -al ali -thal er -a sturi -tri pura -hydro power -free bie -escal ating -m ha -getin volved -protec tour -od is -mus ician -mu le -u wa -ter iyaki -rip city -race horse -loaf ers -kha o -fi vb -bal con -an ou -ðŁĽ « -vis ayas -sh all -fire flies -ठķ -re morse -pho tonics -let splay -imp lied -hes itation -gur ney -ol om -une ar -pi d -mo gg -itt al -âĿ¤ï¸ı ðŁİī -ma ku -ar man -mo ke -han ts -cor fu -ä¸ ĸ -digit alization -ti ana -su bo -schu yl -e redi -ven cy -v room -ro ars -growth mindset -cosme tic -chir p -stra u -seh wag -ric ha -pin ellas -elo tti -dur and -deta chment -qu ando -mau sole -ma su -black wood -aspir ation -bell ator -shi ka -mar oc -ki ra -pi k -gta photographers -gand alf -sto y -spee do -mand alay -fan o -un ice -sol ange -po pper -den ch -ne warri -cel ta -d lers -ce tta -cc f -black smith -bhan gra -w anders -hide away -employ ability -z te -under take -tw tr -team building -ta pa -virtu alization -pro vo -eigh ties -che ery -ay u -we ber -per ro -inspirational quotes -d hoo -aj ara -ðŁIJ ł -sub du -bill clinton -am oun -stro oms -soldi er -mouth watering -malay a -legitim acy -gr ats -syl vi -sleep ers -boar ders -ðŁĺĤ ðŁĺĺ -up loads -sports news -ske wers -referen cing -fo dder -ea a -remo s -ra ss -n ann -cor azon -alas ka -shak h -pig mentation -incogn ito -as ca -miamid olphins -le land -ig t -gn es -boo s -cla ps -major ing -di als ----------------- ---------------- -regi mes -pe an -emul ate -mer ga -med hat -head liners -go h -con di -wi gg -ser af -ric kie -bor ty -âľ § -re is -cel eri -âĿ£ ï¸ı -ye ez -ni ki -draft kings -diet itian -at weets -ampli fied -nee son -mac ross -dystop ia -bor ges -blat ter -b ade -direc to -bha skar -sch ae -kar my -scot spirit -moment ous -an ation -lm k -kne e -in da -ig g -bo tham -barber a -toi lette -r tl -metcal fe -lin x -clo thed -vo ila -se well -region al -ple dge -intere stingly -f nl -ru f -mun di -bur sary -bout i -âĺ Ķï¸ı -âĸ¶ ï¸İ -sto liveby -star let -pic stitch -car wash -aw ar -round house -margar it -manag eable -bon ito -us ab -on n -flow ed -cher che -s ju -kensing ton -jo yed -cal e -???? ??? -zu mel -wir th -re pul -gary barlow -coel ho -âı ±ï¸ı -work er -sp t -siob han -segu in -s gp -glypho sate -clin ching -charlie hebdo -bati k -uph eld -just o -her ne -euro star -mccull ough -fent anyl -diamond backs -âĺ Ķ -indian express -jis ung -hen e -conve yor -appe tit -yn g -over kill -kim mel -in it -y ff -st ine -le urs -her ring -ear ths -or ne -leis u -go pro -sky way -scri bble -by nature -water colors -tin tin -inter ruption -br rr -wide screen -shake down -knit wear -karab akh -id as -cor der -tt our -sac king -good ell -thisisy sr -goo ey -german town -fa w -cat amar -ðŁĴĥðŁĴĥ ðŁĴĥ -vijay a -ti ber -sa ad -ha are -seul gi -mischiev ous -isu per -hellu va -confe ssed -litur gy -in man -ce tti -tuni sian -tic ut -sur ging -sau er -ry erson -popu p -mb k -br itten -v f -gray ling -abstr ac -us p -un fa -so rely -ri ona -r dc -of sted -ju icy -horri fied -grac eland -fa k -justi fication -jam esp -bat u -. âģ¦@ -tu i -te jas -sul fur -indirec tly -a ford -under privileged -northan ts -m countdown -ji ve -ha des -lac quer -humbold t -gi ggling -jun ho -digital painting -aph rodite -ab di -tel us -pric ey -hahahaha hah -fibon acci -dis mantle -ar ne -an ine -willough by -motivational quotes -mid west -inter lude -ge re -be come -s illy -felic it -tap tap -st ings -ilovemy job -cospla yers -bra u -votel abour -sto ver -ru ddy -meh boo -hon e -gift for -phosp hate -it ano -do sa -babys itter -kri sty -dele on -dd ard -confu cius -stewar t -s worth -com ed -arn hem -a ño -ym er -smo re -pur suits -flee ting -dat ing -sav anna -delic acies -comic book -co arse -cir ca -calam ity -bro ads -pre natal -jo c -cyclo ps -c lec -yam amoto -un b -pu sd -plu mmer -per ils -gu mi -ath ar -val o -timel ines -ense mbles -b sc -maha jan -wa sim -techn ics -sorcer y -jo bo -havill and -themore youknow -ta ki -rest ful -mer thyr -cro ck -wee ps -reneg ades -lear nings -g lands -ti dying -ec tomy -dol la -ya g -rev it -kar ts -f natic -apologi zed -win dy -w bc -si esta -pe ony -gor an -autisma wareness -af fi -wh aling -v ps -train spotting -ra kul -mel anie -mal let -ky our -? "@ -reti rees -ip kk -in hale -electronic music -cur ators -pocon o -l sc -an son -u si -lu r -hide out -twi sting -samp led -jun su -ing s -dead ly -auditi oning -happy bday -emplo ying -ti voli -nic u -fu sil -ak am -palmet to -ofthe wild -my kon -mahar aja -deut sch -selec t -nat ura -me ddling -land is -i have -comm encing -.... .@ -ðŁį Ł -mer gers -m dp -ben i -ne led -lino cut -kn ack -j pm -battle ground -at ter -rat on -pente cost -organis ational -decan ter -cn r -boo zy -bap u -al ve -fast pitch -ðŁ¤· âĢįâĻĢï¸ı -z hang -token sale -hear tof -ha den -rapun zel -lar o -fro yo -bikin is -siddi qui -scri pps -pi ec -lin de -story board -red lands -op o -mb r -grace fully -c de -th enews -cas pian -and ali -ä¸ Ģ -ro ald -optome try -medic i -ken g -der ma -ðŁİĥ ðŁij» -mar chi -bi al -al ab -âĢĭ . -red wine -k gb -gun violence -gi vin -fan page -adri ve -ëª ¬ -tel stra -fl t -biome chan -ðŁİīðŁİ ģ -dram a -اÙĦ Ùħ -ti rol -de ferred -be sts -spr ouse -o hh -chead le -im balance -gy n -cruis in -ci m -un h -tra pp -ob scene -ir fan -impre gn -deut sche -cymb als -ob an -au er -atal anta -roo k -men zies -g went -entran ts -co pac -or tho -marksand spencer -lee ks -lac tose -spac ed -sh ak -pale ontology -ine mas -e an -bi bi -alban y -ìĭ ľ -ko in -be ssie -ar dent -latt ice -be sie -ade h -# _ -surro gate -sand hu -rain water -k hun -cau sal -be wit -at las -agu e -water polo -l ts -jam ess -ae on -sch ofield -motor cyclist -ge force -dre y -wai vers -sh us -no excuses -di ade -sweethe arts -macin tosh -l indi -ar junk -am writing -æ Ľ -luci an -ink jet -citi es -survi val -gam ep -g j -ðŁijĩ ðŁı¼ -zz ah -objec tions -dit to -ìĤ ¬ë -trump care -lof ty -tool ing -intrin sic -fenerbah ce -cle men -will power -su tra -sim pl -save shadowhunters -san aa -pri mate -or bit -kel sen -asho k -artisan al -ê¸ ° -tri stan -shre ya -midwi fery -lit ers -la dd -fla x -bry ant -nau sea -la vo -ul m -sid hu -she ena -gott lieb -cr n -we id -âĸ Ī -motor ist -ma vic -laut ner -endo wed -spar rows -ka de -ip p -o vens -ti led -stin ks -keen eland -kath a -c te -mass ages -interro gation -ðŁı ĸ -sen sanders -fish in -dro se -ðŁĴģ ðŁı» -sustain ably -sh ant -propor tional -mis cell -kh l -chemi sts -m ra -her pes -f lux -disgu st -bon nie -artin fo -~ $ -sau dis -pollu tants -op ia -mo fficial -dark side -cultiv ating -civil isation -champion ing -bl f -armed force -ðŁĺ³ðŁĺ³ ðŁĺ³ -tian jin -lar avel -fe men -baf tas -absen tee -ra onic -provo ked -pla gued -cool ers -uc davis -sand er -s books -di orama -un ab -sub division -pritz ker -pa sty -j ks -account ancy -tri bul -re tta -er ty -! ðŁĴķ -ðŁıĨðŁıĨ ðŁıĨðŁıĨ -ri beye -theli al -nin ja -g ls -cer ro -usa id -pu ma -pascu al -chev y -brati slava -bra ga -bi gs -ap nea -åĨĻ çľŁ -sd p -marguer ite -khu sh -vec chio -glit ter -el issa -dumb ledore -car gill -ann am -trium phs -templ erun -ru min -lny hbt -cla sse -êµ Ń -ri ri -gun ning -boy e -am ento -limite dedition -gra w -gan ache -ðŁĮ ½ -resemb ling -on tv -moti fs -i mani -hel ms -epo xy -clear ances -ba ha -this day -re eling -gur o -fi eri -faw cett -chec kered -ti v -narcissi stic -i tha -guil le -go e -dart ford -comment ators -cl out -ch illa -ky li -hun d -ro maine -jum bo -fil ip -de au -tyler rjoseph -the un -orphan black -om ans -in manila -tho reau -sa ar -ra bin -en heim -tn t -state parks -kour tney -we th -kair a -ec r -gas par - ¸ -olu tion -me ars -home town -execu ting -defic its -car bide -blan ey -stri dge -sh r -ho tty -grow yourown -fal cao -îIJĴ îIJĴ -âĺģ ï¸ı -un wavering -more tz -hoo dy -h ine -dain ty -bak ing -ภŀ -salom on -disin formation -pu sha -la the -ad di -abi ding -zig gler -sic ilia -mening itis -hol ling -aus gp -ri mes -barrac uda -al do -af tra -pe di -lith gow -analy tic -vanc ity -se f -pc as -c ya -afric a -w ella -ra ys -n cat -fe ez -don i -din amo -breast stroke -truec rime -tofthe week -south ampton -el ina -zain ab -sw az -ph elan -kri stine -k lit -er ation -bud d -wrist watch -the week -simil arly -qui k -over throw -naku ul -itali ano -bigg bos -se ashore -arnau d -le p -fan site -ding o -cler ks -cas illas -jo die -de generation -ãģª ãģĨ -her ze -adjun ct -ac ard -ðŁĴĻ ðŁĴļ -à¤ Ń -wa al -rad hika -chim es -ti pp -o or -ki ye -he c -ba hu -ab at -sam us -inver ter -indi spen -he ge -ภģ -l ff -bi ele -mu ja -indone si -f wa -beat rix -bbc football -sa ks -q c -cont acting -att enti -vivi en -taf fairs -so crates -sen e -se mper -co bb -ðŁĴĭ ðŁĴĭðŁĴĭ -ladbro kes -á » -will ingly -p are -p able -occi dental -ich es -can tor -rox bury -fre ddy -ed ger -de capit -wgr z -ma im -ku sen -ulti ma -solar power -schan el -dishon est -beck ons -yad av -over ton -ne ale -me sses -darou sey -auc tione -ap aaja -ðŁ¤¦ âĢįâĻĤï¸ı -u tri -.... .. -taco tuesday -prote as -introduc tions -pi ds -gat linburg -pam pering -marig old -f isa -con tor -clean est -short stop -ne em -pin kie -let our -kathle en -imp ly -ðŁĴ · -work out -ro que -estim ation -countdown to -conom ics -al tar -q e -jesu schri -grayson dolan -st ines -smith field -shi gh -ir replaceable -spr itz -mon op -lo real -lab elling -fli ppin -ðŁIJ Ĵ -sher pa -jan el -embr yo -bir dy -ball game -vul gar -un f -spra ined -cr f -come back -col man -att y -at a -ar lo -u alberta -technicol or -rush more -respon der -ou re -obli ged -mt ve -mac c -wood house -vent uring -sen john -light ers -her bi -wall ace -exo tic -ag em -virgin ity -the ma -mart ine -mar ang -lee teuk -ho list -watch men -s ile -le ck -kan ji -hoo ters -st ile -n ala -e am -clari fies -am é -voc ations -succe eding -jesu is -conqu ers -uc berkeley -nz v -cas o -bar ist -bar bed -patri arch -p cos -ben ign -re read -mn ang -fly weight -fc live -cre t -bar ks -lione sses -benid orm -bc z -an je -ti wari -ol li -nak amura -ha san -fun imation -co ss -bir der -anna bel -tim er -rn cin -real ale -ra vine -no s -ðŁĩ° ðŁĩ· -te ke -sa hab -bal tic -âļ Ķï¸ı -sur g -ka hit -tru ss -stein berg -replic ation -elev ators -ðŁļ ´ -ma ki -har ming -h si -del ena -t ke -sime one -pat ina -shutter stock -she ars -aller ton -ai ka -temple ton -raf ters -perio don -note worthy -mongod b -man fred -ko wal -stu b -join ery -an gie -u kenyatta -shel ving -kenil worth -instru cted -ta ey -retri eve -interpret ations -first world -d si -biop sy -benef iciary -saf a -philosoph ers -pand ya -ner i -bow ery -wel ly -the cw -spr ites -ner v -mon orail -jac uzzi -de mysti -con sort -program mers -news desk -l sa -hong kong -home and -ed ale -dor p -dar in -vali date -tear drop -syn ap -repeal the -premi um -nik hil -blan k -ai ding -squee zing -rncin cle -ret ard -park sand -bru ck -wr u -su zi -specul ative -hew lett -cru st -as m -app end -¢ ħ -tele mundo -st aley -sn rtg -samu els -jae ger -farn borough -womenin business -ron darousey -min es -au de -shi ba -m ne -estre lla -swim ming -ë¹ Ħ -tam an -it é -cuth bert -casu al -ag ing -offici ating -li gan -fo iled -ver i -ms r -dr ay -usf ws -ta heri -se thi -ç ī -uneth ical -kick ers -hi jab -ak ash -pur po -pellegr ini -neu mann -man del -de ver -ap u -ìĭ ł -z ha -indic ations -imag en -clean india -car pe -so fe -mart ine -stra pping -wit ter -no tin -fic ent -bbcc ricket -tur ally -cou rier -tri xie -sw am -i ab -alfar omeo -stal ked -so h -oooo ooooo -miasan mia -con f -thisgirl can -tar rant -re reading -present ly -pow ys -nj devils -mart i -fe b -cerv antes -tam bo -retro games -lang ston -kell er -ar nol -ठµ -shinju ku -sasqu atch -dan ica -akrish na -so ko -cat ter -car park -inde cent -er gy -bur ley -brother ly -xi v -post doctoral -polyne sian -suspec ting -mass a -make ithappen -fab ri -cu ti -cor sica -bor den -un impressed -sli gh -he don -gon zo -fic o -eloqu ent -dic key -podcast addict -le ona -jewel ers -wic ca -uniof oxford -u den -gene res -ban shee -u ya -she khar -doll house -blu eno -af alls -wra ith -ta fe -moun ds -j ct -in clement -fun g -fluori de -! âĻ¥ -raji v -b me -waz e -squad goals -pre ak -hand painted -c sgo -sat h -leg oland -in la -d pi -c actu -aband on -tali b -janet jackson -ãģ Ĺ -khal sa -gl c -c fm -ab ang -ali sha -we m -sur passes -ou st -nai as -max ima -lind bergh -lic o -it syour -h ä -gul li -anacon da -woodru ff -pr m -h é -anonym ously -sun nah -scat tering -sc int -sal mond -pe king -j cb -ed ine -diversi fication -ari on -all state -t ley -gam bler -b hatt -ra ku -pit ts -j enga -ri di -pun dits -papp u -now spinning -ha drian -az ure -autom o -aran eta -a stray -il m -yong guk -wel ded -parano ia -explic itly -co f -ðŁİīðŁİ ģ -som uch -post partum -ler c -gu ava -enhan cements -ber gen -con glomer -âļ½ï¸ıâļ½ï¸ı âļ½ï¸ı -milli gan -% ). -âľĮ ðŁı¼ -sh yam -ry man -megat ron -koh ler -de schanel -chel sea -zoo topia -wr t -valle jo -tri pp -positive vibes -irrit ating -book fair -aac r -san it -di sk -depeche mode -classi fieds -ðŁij ¦ -ven erable -ra ves -fav re -ek iti -quarter backs -he ma -h sd -g ach -con template -l ant -kh atta -inter sections -harle quin -ncc u -m dr -pp ro -il legitimate -gre be -ler man -ite ach -cspan wj -voy ages -sat x -rednose day -oo king -dan ic -char lene -a hor -ty sm -gri ffins -cheng du -boo ka -âĢ ¼ -ye h -ur ra -tari o -pou ches -dd ddd -staf fed -revo ked -ran chers -ou z -oni ka -share d -n bs -li mp -etsy seller -cl one -visi e -ksat news -good life -cow l -chic o -н ÑĭÐ -vigil ante -skate park -re it -mar av -man ja -le et -co der -ðŁį ĭ -w gn -ld c -duck lings -don de -avoid able -í Ī -over lord -mp r -anc elotti -intermitt ent -colli der -ste ins -sque ak -dispar ity -colorec tal -clark sville -ado u -Û ģ -women swear -di bu -bar ts -sa ws -recogn ises -re pa -m cauliffe -hear tache -good music -gg ish -Å ¾ -tech house -aci dic -re pro -mal low -d printer -cro tch -kir sten -kan pur -il kley -fan i -ev ry -dit ches -cher ie -bat angas -lost girl -liam payne -la be -rid dim -den ni -? !) -vo o -tw c -s za -fo als -fic tion -lim ate -dab s -mc f -er na -smriti irani -espo sito -duc ts -blackgirl magic -weare one -sen ec -sch ie -nath singh -fo ia -en or -don bas -ç İ -wi jk -over lap -gron kowski -full er -e ssie -ðŁĺ¤ ðŁĺ¤ -ye ye -loksabha elections -guev ara -bi es -â̦ â̦ -z he -pic a -homer un -con stip -apo stro -refr actor -sa an -o gun -man sions -re sh -nam ely -high er -evan ston -up town -ring side -naz arene -ir regular -invent ors -pope ye -mnang agwa -fern and -sp litter -mor ten -asc end -whi ff -cr ink -be ste -at to -shad y -el n -bjor k -ðŁĴ Ĭ -no tting -england rugby -be tawards -we all -dan is -Í ¡ -mo she -miff lin -lu walia -al un -li pid -ha van -cmp unk -bur row -underestim ated -ste yn -pul pit -pir i -p nr -jer ks -fin ney -tra volta -roman ce -buck wheat -black metal -st oops -intra day -huff post -ale state -so ver -pat o -obstru cted -jen na -fi o -bo den -bill on -my fox -la hi -kar na -bartholome w -vin o -lovel and -ecu men -whitec aps -the king -qu il -human oid -alab ad -g ome -fri ar -c bre -broch ures -we si -mal anga -dr brianmay -assi si -sav our -prefe ct -mt ns -inter changeable -hex ag -gar nish -c ce -amar o -ðŁį ħ -gu sting -dismant ling -bay one -tv showtime -sun ion -rad ha -ozar ks -nautil us -la youts -did sbury -dance floor -suicide squad -ok preps -j ura -alum nae -ron ni -ma f -george tte -coordin ators -bad u -ðŁı Ŀ -ted ness -re prise -pain fully -jo ie -hill billy -thisi sd -ss er -oo ka -mm g -meredi th -klim t -kat an -blood borne -bab u -trivi al -th rif -o cla -mo yo -milk weed -âľĬ ðŁı¾ -sul u -occu pants -farm life -cru sty -sing in -r tr -penn state -met adata -fab ulously -wee zer -schnau zer -rash tra -ni moy -h cp -freebie friday -do le -sti me -jef fre -gro ban -broad ly -bil oxi -woo hyun -u zi -ny jets -fi ver -vado dara -it ake -check up -supremac ists -ro mp -the sunday -contin ence -liz quen -ha ut -ellip tical -sho o -pan ty -pa as -immigr ation -park service -os age -i sta -homes ick -cyber attack -colom bi -boy ne -ðŁIJ Ĭ -ty lero -iron maiden -hand a -ch off -al ya -ry o -red acted -mo ts -intern ment -die hard ->_ < -ðŁĺ© ðŁĺį -m sle -li bel -f ant -embar go -soc kets -ski ers -photo journalist -mchen ry -bou cher -ric ard -jayam ravi -dock lands -annot ated -ag ata -ðŁĶ » -prev ails -new ington -las sen -hydr ant -te o -rough riders -murug adoss -at su -afil m -admini stered -v fw -calam ari -bay less -sw ung -sag er -ple ated -mo dric -hi my -golf clubs -citizen science -rehear se -pic kett -le aky -polit ely -gra zia -sk or -sar an -cl inging -âĢ ł -ther oo -squir t -on your -bag gy -at oll -th ys -coul son -vivi enne -s anya -recogn isable -gr u -scoti abank -milk shakes -fundra ise -d mu -bu tters -ra wr -lin dy -al ed -sk am -ryeo wook -referen ced -quad r -cri sp -bio informatics -âľ © -che wed -sm acked -commend ation -classic rock -ðŁĵ ½ï¸ı -star ved -pu ddles -do sing -bru e -zah ra -wo king -sun rises -stro p -sal ons -lif ters -cor coran -ala ina -kom onews -ken yon -gre tsch -ge zi -floor ball -fi q -tw om -re clamation -ineffe ctive -cop tic -cit ic -ch ute -unle ashes -ran s -mo sc -joe biden -sw il -osi ris -ni h -embo diment -cruci fied -ãĥķãĤ ¡ -schu mann -horri d -pri mer -northampton shire -je b -graph ing -back street -ìĺ ģ -wood row -tar garyen -t bl -sky ler -ru ffle -joc keys -info s -deir dre -bosp horus -âĻ¡ âĻ¥ -p led -chu an -bi got -ren nes -ra va -parmi gi -chi ar -vide om -stau b -exc ali -ex clamation -city council -barnab as -se du -ker ri -is che -fr actions -fly by -bau er -where in -ra ge -ou lton -mu ah -co stac -co lec -char mer -capit an -secular ism -mumb a -hu k -hen e -blon de -so dia -r tb -de coding -cad ence -art an -ðŁĺ ĸ -too cute -tn c -chen na -brux elles -à® ¤ -t ft -ss ssss -sp ital -poun der -p ch -mega star -in junction -al ent -æľ Ī -x k -tro pez -tombrai der -m mi -amp i -tac tile -sel ina -ma sai -good bye -dod ger -al fred -vote maine -qu ads -ad die -sep ta -s brewery -ric oh -monte ith -humb ly -histo ire -me agan -low ery -del o -ab il -out numbered -er os -craz ies -r bg -pollin ator -il c -gin sburg -cy gn -ab vp -wi dest -rescue dog -ho re -y g -sof theday -rac y -la ban -i bb -ci aran -robin son -ali kes -fre n -ban bury -ball point -atten dee -ati m -ìĹ ĺ -pi p -ergon omic -ad re -rem itt -pir ates -over see -it sen -hali fax -dedic ates -cycl on -as wamy -ãĤ ¯ -mo ser -ge op -d mg -chatur thi -chag all -bu gle -ðŁĶ · -samp doria -low n -davi dg -newsmel b -fix ed -cordill era -ar ri -ðŁIJ Ļ -y ra -to pi -n aka -g é -d life -beau ts -p date -min ty -hy uk -er am -e bert -at chee -theno tori -ni kit -muham ma -fan zine -negoti ator -gad ot -bli stering -bg su -yoga day -un sw -john deere -zhen g -struc ture -porcup ine -cl ack -boun ces -qu ali -mat ador -otta w -mo es -gil git -esp lan -dy strophy -b dc -ठ¬ -sh illing -one world -on k -formu las -tru ff -teach ing -robin sons -rij ks -qu ays -her ry -fle dged -fish eye -guardian softhe -du bl -z ane -sty list -qu ack -leah y -j air -hawa i -diversi fy -darth vader -und ated -su pe -< > -p oms -memorial dayweekend -lu ms -kc mo -de hydrated -taptap fish -re com -pode sta -j ir -far med -cait rion -bor no -bc m -sk as -se dition -rub icon -noo sa -le page -haw kes -additi ves -a ol -th q -ru ta -jo burg -bas k -yan ks -mont blanc -lu a -jam mer -cho ol -rou baix -re clin -mat ured -dimit rov -ãĤ £ -m ites -âĺ Ŀ -ment alist -mam ata -g na -fla thead -canad a -caled onian -bo we -yor kie -re print -g bo -en thal -al ka -x com -u ka -tr alee -spread the -ni i -joh nathan -human kind -ha sina -du vall -craft buzz -ton ic -re lli -ra ged -jo f -free masons -____ ___ -un ter -sc aff -lee ch -extor tion -ari e -ra ghu -pin eda -att an -vehic ular -ra oul -lu pe -eng er -divi des -cr b -cap ture -bo ii -maricop a -hearti est -fair child -alter ations -no ta -mar d -s kids -no k -gui deline -deplo ys -carni vore -g sw -au ren -at ac -ani el -of c -ko vac -web site -spectac les -sn an -sher yl -rever b -nik ond -n ce -big sky -ra pes -mat o -night ly -mp n -ke sbury -jep sen -gul p -french man -bar ley -andor ra -king pin -in ns -dra shti -catar act -cand o -p co -last ly -herze govina -gr ounding -íĬ¸ ìĻĢ -testi fied -talk show -f day -even song -eat on -tor ment -love ee -cooper stown -al gi -ðŁļ Ĵ -rare disease -meth yl -lu isa -inbound marketing -ec re -t sem -ro sam -nove m -more ton -monster mmorpg -home buyers -fru gal -escal ator -de sa -boul der -bel mont -âĺ łï¸ı -twitch con -tur ners -sal ut -per vert -le ye -hiber nation -gg ggg -food service -ex porters -d assault -after market -we athered -un ravel -si di -plu ssi -mp t -ky m -bo spoli -sand piper -gole se -col itis -br al -adventure rs -ìĪ ĺ -ve do -preten ds -b da -sac re -ju m -hin ch -acci o -hy nes -back stroke -ly ce -h ve -v bs -ou m -brand enburg -âĿ¤ï¸ı ðŁĴĽ -t itude -spe cu -rapp ler -raje sh -dream land -av in -ma rek -ke ss -ho oman -pu tin -par then -hair do -aaaa a -è ģ -votemaine fpp -sha stri -remedi ation -it m -hai fa -ex xon -empha sizes -u conn -sim monds -mo ire -e scher -cru tches -vi vi -ar mitage -air ani -shi pley -prou ddad -mar v -inter nationals -bb k -prostatec ancer -mon ash -task force -god son -levan te -barric ade -tr lt -rapi sts -p vr -kimber ly -ge p -eri de -acknowle dge -will rock -u pland -aa i -willi e -une dited -tri ples -or ch -hai ku -gene see -en gel -bay e -plex us -pen zance -ko bane -f ash -cac c -xi p -scam mers -sal i -notic e -modern ity -chi en -bis cayne -nba allstar -mar ston -june au -ðŁij ¤ -van life -ro sters -r st -labra dor -brek kie -ro ssi -my x -lmfa oooo -je tta -ãĥ « -zo ya -w pg -mer chant -goul ding -food for -dosan jh -connec ticut -it to -gho on -can aan -bo le -retrac table -mar zo -lau ght -discoura ged -dan forth -a holic -th d -marri ott -in lay -duplic ate -c zar -woo fer -scre ek -ni pi -intimid ated -god ard -elu ci -ab omin -sco ping -program mable -mexico city -me tat -h mrc -h man -ashi sh -sierrale one -in sha -hero ism -gu staf -rein hart -lumber jack -gu sa -fella ini -eu f -belgi an -bab ys -an ski -yu gi -spot lights -rockand roll -k has -dark ly -but cher -bal lads -auto cherish -water man -peps ico -lo ggers -infinity war -as ach -ðŁ¦ Ħ -spring boks -ðŁĻ ģ -sp acing -la val -ffici ently -endor sements -ed am -sharp ening -sor rel -prev ailing -ove rex -nbc snl -native american -ex oner -rin gof -ml ins -disobe dience -pre car -cic ero -âĿ¤ # -per taining -mani fold -su gi -of africa -mu sh -morgan town -gel ding -co zumel -ny x -ab ili -ðŁĺĤðŁĺŃ ðŁĺĤ -world cancerday -pal acio -go k -ecoun try -âľĿ ï¸ı -ro tary -íĬ¸ìĻĢ ìĿ´ìĬ¤ -spin dle -neck line -maneu ver -mary land -i player -bal led -am ended -ne b -en rico -el dorado -dubu que -blood moon -as lam -comple te -a of -wil ma -the band -kn g -revi sta -mal ak -goha bsgo -car y -ve en -tung sten -snu b -shab aab -kil marnock -le pi -re eds -ne m -can op -ble d -vali dity -ju icing -hun a -chauffe ur -water town -wait ers -lo d -fel der -dow nie -don ate -san down -rh schel -or f -lulu lemon -kare en -galac tica -bre vard -strat us -rose ville -fall acy --- - -w eneed -san kranti -local gov -billi e -ac cr -k illian -comm ing -worldo cean -watan abe -sothe bys -sin ful -rol i -lynch burg -integr ates -hefor she -an p -al aw -ðŁİ¶ ðŁİ¶ -maxim ilian -g ma -bre tagne -ail le -world food -turi smo -ra u -mini van -dis belief -bay ashi -us atf -skate boards -uy gh -plo ws -don bass -sugar cane -cham omile -yel lo -in quest -end ron -ani sts -te eing -cos worth -tune chi -sothe by -sle w -sher o -le f -ho wit -gly ce -joshuad un -enfor cing -baby lon -reck ons -apu ram -toler ated -resur facing -pla inti -o tr -kylie minogue -dis able -pod u -mul tiv -inter cultural -gy ro -goal keepers -cac cia -ag am -íķ ij -vic o -tri mester -ka e -coffee shop -tsem tulku -sta sia -go coogs -ds worth -wast es -boun ce -u vic -stri der -m Äģ -laur yn -kevin smith -jan ssen -ðŁį Ŀ -the one -same er -cret aceous -! ): -re gent -project management -person alize -mah di -zah n -kra f -vivi d -ten news -re re -ogil vy -tiram isu -photo bombed -n ke -cau stic -ra hi -nca adi -lauren jauregui -ki ku -i aa -dine sh -dal ton -ch ata -ba ht -x as -wi ping -ripp les -de generative -ðŁijĩðŁijĩ ðŁijĩðŁijĩ -vodaf one -thou gh -sla pping -naz ion -mer rick -intern acional -do y -bucket challenge -y au -vi stas -present a -mal t -expir ation -e ich -pu ttin -ve su -si oned -ct fu -circum stance -blu er -. ), -pra ia -mcfar land -ju eves -hat tie -du bey -myrt le -asturi as -ðŁİ ĩ -reason s -gri z -co ils -at lu -mode sto -lo gger -iber ia -af tr -v ang -transp lants -prairi e -maur it -haha a -t ink -sci fest -sc lero -random ized -glam organ -feasi ble -splin ter -blu eline -subb an -nakuul mehta -m ch -johnny depp -car cas -vin sky -hex agon -* " -women empowerment -s ooooooo -invic ta -gla de -ðŁĴĢðŁĴĢ ðŁĴĢ -we bb -desig nate -con figure -ay l -steven universe -spo il -recep tionist -plo t -na is -!!!!!!!! !!!! -ra gh -ne war -fr anta -sar aki -pi aa -obse ssing -m anda -f cc -em d -ba ins -rev ital -ki shan -fe c -ep son -def lec -cbs news -camper van -c ty -be so -at tribute -ari ya -ì¤ Ģ -tun is -out flow -not the -mykon os -clare ts -ci pri -brain wars -sign al -min ing -tr amp -ten go -jimmie johnson -christma stree -am x -a ung -v z -tran spo -spr incipal -reve rence -nam ma -key ring -ne gro -ate show -ingle wood -inadver t -impre sses -awak en -avi es -sale em -ess ence -es sel -doo dle -win ch -son e -nett les -mi me -alzheim er -vall is -insur ance -h pm -as sam -tun ity -post p -monte carlo -luxury lifestyle -ju dd -in sensitive -wax ed -was a -fand uel -chor ley -bon y -back packer -te urs -ho ag -surf board -stati st -sober ing -f anta -bob s -bar dot -ban i -ad da -rec tangle -pe tro -pa ign -n ang -influen cer -in u -hard line -gwen stefani -wood cut -s ors -for nia -cater pillars -ãĤ µ -tari anism -shel lac -nd su -illino is -el gar -cel list -ato day -ðŁĺĶ ðŁĺĶ -silver stone -log ic -fac om -weal thiest -sun tv -gy ang -com posting -candle stick -can more -z ard -x t -sc athing -ps r -north land -collec table -wa si -rip on -qu is -ge v -se men -ough lin -ob x -intoxic ated -bay side -é Ń -van poli -tim hortons -taji kistan -po i -peep ing -dri zz -contempl ation -ballo on -un folds -tre aties -aishwar yar -l hc -foodie chats -excav ator -cocon uts -apple bees -ambigu ous -repar ations -man goes -kh mer -fr itters -do wd -antonio guterres -cu a -impro vise -g fc -ec cles -carcin o -ðŁİ © -theori st -sj c -mu je -ir acing -camel ot -um mah -bachel ors -lumb ar -c sk -bi ya -re fine -queen willrock -ci os -bicy cle -bali k -à° ¿ -wil co -ow icz -loy ol -wa is -mer al -har ma -ba ili -ste e -jo ker -hein ous -bu oy -the sun -nou gat -ic ant -an anda -dji bouti -s night -relationship goals -polit ici -mb appe -google maps -ba shi -ta ap -now listening -flaun ts -ðŁĺĨ ðŁĺĨðŁĺĨ -vene to -car pent -bre do -ot l -di vert -br oughton -flat tered -bra denton -as ada -alo pe -ar b -an akin -ten cent -nad y -constant in -sb l -reinforce ments -ol b -jol li -il han -yu ri -the other -punk rock -lanark shire -bi st -ti ma -th oo -sun beam -r all -kar achi -iy ama -dhar am -k state -bat on -ay yyy -tre v -br unt -ar ashi -à® ļ -zu ka -can es -ar cade -uuuu uuuu -ma han -to pes -sen try -myster io -mis sa -deliver ance -ëĿ ¼ -un wrapped -ol li -holi sm -h pe -free view -calab ria -twent y -po g -pe cans -gru den -^ __ -ðŁĶ ¨ -os c -leng th -jef fries -ðŁĴ ı -sh el -mesmeri zed -ke gs -er at -cor r -caver ns -british library -⼠³ -pap y -al or -w age -jac lyn -co ols -bio logists -tur d -plau sible -ðŁĺĥ ðŁĺĥðŁĺĥ -yu mm -tic ho -te atro -ash lee -ve iled -umb a -obli gated -moisturi zing -magaz ine -long board -dang ling -c elli -west bury -v ä -ucl final -hou ser -chap elle -admir als -par o -mutu al -clean eating -vacu um -kh our -hab itu -foo din -fil mis -es con -sm it -awar dees -à¯ Ī -wan ds -thug life -mc cut -calyp so -Ù ĥ -yas a -radi om -hen ley -fron tage -critici zes -access ori -sardin es -id ge -gold finch -front end -d wi -beach front -# ï¸ıâĥ£ -âļľ ï¸ı -sh l -sh eng -rai shi -mari ota -fen der -con do -un covers -de van -ðŁĺĤ ðŁĴķ -renov ate -compri sing -tamanna ah -mash allah -humph reys -en acted -ar tu -wo e -sine ad -om ore -del phi -bre n -bo z -wellness wednesday -v sc -t iller -progre ssed -on ze -love for -gor a -don the -dear th -de ve -cas us -b ili -alla habad -ag ni -t zu -produc tion -com bed -cha un -s ce -mem bran -don ner -bla der -darkhorse comics -c zyk -ayat ol -sacram ent -pere z -pe in -n ite -ken ya -intensi fy -eleg antly -auto pilot -rou ted -iu bb -celi ac -ste infeld -moc cas -ka ther -ex hale -dad dys -sta unch -spring board -pe gg -kirk man -cin nab -aor tic -ruth wignall -moder ately -lau ds -au ral -vagu ely -spread sheet -merri mack -da thletics -we stie -pesh merga -coo pers -tan trum -t cu -ga be -criminal minds -com ix -q ur -fi q -bor g -pue bla -nis mo -cy ano -bak h -ti g -tho tel -il ford -guadal ajara -inclu sivity -atom ic -ven tric -u el -mono gram -man kato -fu q -ðŁĺĤ ðŁ¤£ -stra d -plu mage -op ath -kom en -im al -che tta -bill ing -s vr -hu mmer -d lt -water cress -pil ar -human ist -her r -ha ig -cor ino -swan ky -spo tters -sn h -medi aday -under ground -ton bridge -roblo x -re take -men in -inno cent -ton g -lar amie -be gged -arti sta -uste des -san tho -lac ro -is ations -fox y -bio sphere -temp tations -stan lee -semin al -ini go -ãĥ ĭ - º -spod cast -o shi -lloy ds -gree ce -fore word -david tennant -brain tree -tam i -sam mie -predomin antly -coffee time -clut ches -acap ul -val halla -pro ck -mytho logical -meh met -idio tic -d su -ðŁİ Ĩ -puri fier -oc ca -ma f -hoo t -over joyed -ha ke -behavi ours -ðŁĴķ ⾨ -le ena -gau l -carne gi -u ws -repell ent -maxi me -kar lie -j iro -gla ser -fr ites -earth hour -de k -se ams -l ly -gilli am -davin ci -we sh -swe de -pe tra -p tm -my b -min ig -hon dac -al f -staf ford -plu shie -pal in -metast atic -go reng -flan ery -ro java -ani x -ðŁĶ Į -ap c -activ ates -vic i -tu ally -delici ous -aw ith -air base -stabili zation -solic ited -pic ky -im pin -fo p -af x -the man -the green -pee wee -mis smar -kitchen ware -gil man -scoun dre -kra use -j nj -hend ry -eng r -dar lene -mal don -fam icom -mi er -di su -breakfa sts -اÙĦ ع -ver gne -sunshine coast -h ed -di vest -cri mean -v fc -su le -sam ay -sloven ian -is bn -borac ay -tu bby -sp are -reas suring -mu tt -intram ural -at b -aaa and -âĻ Ľ -o ge -fi u -caer philly -string ent -steel er -n pl -macadam ia -indi go -grow l -gimm ick -españ ol -z ü -th alia -soul mates -more au -cri stin -anxi ously -vod acom -pam pered -lo z -content ment -pharmac o -n sp -mon ika -mika el -mac d -da o -sw ill -sheep dog -yo st -seiz es -off shore -nor walk -lo scab -bo sque -r acked -parri kar -na st -lo tti -bi j -Ð · -tb thursday -question naire -mercen aries -evo ke -di sal -al tru -what ever -str ö -san jose -man tel -in convenient -uaap season -tow no -spec k -al bright -the girl -ha shi -em oun -dow ney -desp ise -amuse um -sm elled -rugby union -over turn -ak ron -son ora -pau ly -mont ague -min ar -mill i -suzu ka -seo hyun -portra ys -ou mi -mo hit -lor dof -ayles bury -appropri ations -en act -conclu sive -chim ic -rasc als -j rotc -ind aba -ma iler -sun dry -subjec tive -stu mps -secre tive -red blacks -qu asi -oni ze -cany ons -nav a -lor ne -for de -cocon ut -us at -shear ing -sai yan -prat ap -modu lation -flann ery -gol ding -di da -ag ong -patho gens -k ye -dow ling -chi ara -sadi q -ol ander -journ alistic -croche ted -assu mes -ai ba -s vet -re visions -ph at -elis sakh -sur passing -person ified -mon ta -in ar -wil fried -âĹ ı -x ler -ta kam -out done -hall ways -gow da -fam ou -chop sticks -antiqu ity -% )... -nak uru -forsa ken -role play -kan ban -fly in -dock ers -con jun -ìĹ ° -swee tener -sin es -re kha -imagin ed -h su -der ailed -mano j -ji mi -acab ello -âĿĹï¸ı âĿĹï¸ı -stre atham -parad ox -ma stop -like aboss -leisu rely -iti ger -faire r -er cy -ðŁĮ ¾ -ma sch -lun e -la sd -historical fiction -bol t -, ( -ta pi -jor d -d na -cant be -alder man -to sses -or deal -nur burgring -kin gh -du os -de ze -clin ches -nap avalley -indispen sable -heath ro -fro ma -dece it -ba ira -ws ers -jack al -ch ula -bal ay -sur bhic -sal at -lolo lolol -had don -fear twd -scar lets -fanta stically -eredi visie -conting ency -seven oaks -me tra -futur ama -ce phal -vi kes -termin ate -sequ els -chipmun k -val ky -stu la -se vents -lo dges -jess i -j bl -gar rett -es es -con ferred -certific ations -anter ior -te ague -ha da -âĸ ¸ -win less -ji b -grit te -ga el -z d -un covering -si mr -roy ce -gwyne th -goo ooo -conquer or -ald rich -vin ny -re generative -propag ation -cri stal -correc tness -wh m -un lv -so w -net ted -k haz -an ise -plough ing -million th -em ac -ec ki -yar ns -impo sible -good byes -ff h -fel ice -ero a -du omo -du ll -barri ster -v ity -st irs -shu gden -se per -re discover -mas sey -al fal -over ture -mole skine -ma ka -li ppers -jay len -gron k -fel dt -puni shing -gary vee -dim ple -briga dier -happy sunday -freel ancers -cajun s -bloss oming -scar let -s ities -ph en -one ida -ken nels -inadvert ently -hu sky -fi fi -bj d -?! ?! -ur chin -to s -ste pp -au tor -ãĥ ¢ -~~~~ ~~~~ -wid nes -she re -just icia -fant as -el aw -Ì Ħ -wi steria -u q -shar kn -dragon flies -al dean -go b -di bs -bo rer -petron as -doub ting -chap ar -shil oh -gabri ele -cor pu -taka shi -selfie day -pe tru -harmon ies -u ck -sty x -k ine -high gate -gang sters -ga pol -desi ree -over comes -mc cas -hersh ey -he ston -duck worth -das gupta -zam ora -har rell -am ble -visu alizing -uc u -su zie -mil dred -lu t -d wi -civil izations -preten tious -obl iter -mil len -girl boss -% : -win field -rever ber -mat ta -in ery -cro ke -ch lan -bep anna -ðŁį Į -ðŁĩºðŁĩ¸ # -squ a -se id -la ve -gh is -be headed -emer son -awk wardly -ar h -Ã Ł -w mu -tw i -shiva ji -on of -bun kers -tar aji -pal ace -i ang -de crimin -whit lock -wal eed -ax well -viny ls -kan al -exc ise -don ington -carl sberg -under served -solu tion -portra iture -ke urig -incorpor ates -민 íĺ¸ -velo drome -pe tta -len eck -for gott -fe fe -eu c -art book -through put -share pict -pe eing -high bury -dog strust -ðŁij IJ -w wi -m lax -dd in -con de -affordable housing -ðŁij ¿ -t fl -sho aib -ne ues -n de -mor in -flu tter -fi ver -separ able -kenne saw -irish times -ink tober -fantasy art -ed sa -shruti haasan -sc ous -cro pping -abu sh -y c -tem plar -motor cycle -gab ba -ar ic -aldub nation -af r -whispe red -va x -pollu ting -head ers -great awakening -eer ily -bal my -ida e -bon es -a fu -shi res -f ww -uni fy -press sec -consign ment -ma ken -terr ance -swe ar -prag matic -night fall -jor dans -ic han -ta hir -ma dal -g eller -alber thall -social selling -recur rent -pho ton -organi zes -fight back -evacu ations -du ci -chicag opd -bird life -ðŁĺ« ðŁĺ« -tu mul -cam pi -ðŁį Ħ -sin ski -dissol ved -an ch -yon der -rs na -river view -pul sar -pro pon -multil ingual -kab ali -be agle -air canada -sor ghum -fron trun -la val -im mortal -epi phone -de preci -cor dial -bet fair -ìĹij ìĬ¤ -ti us -ombud sman -kar p -gy psy -autom ata -you sse -tam pering -red birds -kar in -trail head -legend ary -fi shed -es l -steph ane -hill sboro -her cu -camil acabello -cam ellia -al ts -adju dic -se kar -scaff old -mel aka -ill iterate -ha sle -fa thom -campeon ato -v logger -spi zza -mccur dy -ine ed -dev ito -team em -sun nies -morning side -elec ting -ãħ ¤ -bad die -aksh mi -sport sp -program matic -ge eta -fla unt -? ). -zu ela -sun ku -spider verse -shreya ghoshal -sh ams -benevol ent -spo int -jee zy -equ ine -dunkin donuts -comp troller -arto fli -tre v -pap e -ohmy god -bou ts -bik elife -mo te -g cs -acce s -y art -ut austin -trans lators -tab or -sho wered -andre as -ak l -women who -ãģªãģĨ ãģ·ãĤĮ -ram zan -lake front -du cky -civil rights -ë l -team sters -str is -shat tering -char lot -bag an -alo a -aaaa aa -mo se -mar ce -gun powder -ge isha -ðŁĺ µ -per mac -elo pe -chri sto -april fools -wolfen stein -there of -tar n -taka hashi -poly gon -lu mix -independ ents -hier arch -fc fans -wc q -law ay -av ro -at one -tru ex -s ro -r ur -mt l -i ft -defi antly -ch itt -r vp -o bel -k mart -ela ine -bed ford -se men -sab out -bathro om -ðŁĴķ @ -khy ber -i will -business woman -tar as -param ilit -mer sal -chor lton -ak ram -w dc -universi dad -ja vier -j ara -gil as -contracep tion -cat aw -c nd -bu co -au ri -ton ight -ma vote -i fi -albat ross -vegan ism -tw ich -lu d -le ases -de ben -worsen ing -qu ia -power less -end ra -ðŁı¾ âĢįâĻĢï¸ı -ا٠ħ -ventu recap -su do -nom ad -indiffe rence -ge tup -explo ren -bay ley -u gg -pad ra -orange county -co bra -tic ked -ti ss -shrun k -k sb -ic m -gett es -aberystwy th -de ars -vas an -tab asco -life mag -fin lay -tam iz -poon am -plat former -mu sco -joy ful -it b -gol ang -ga stro -enrich ing -eli ke -p wc -kelly anne -jama ic -hal lam -bri ar -well ing -wat s -vo icing -t tering -ra vel -pa wards -mu zz -h tm -alig ning -wedding wednesday -dri fts -rolls royce -multic olor -luci o -han son -f gcu -sound garden -pan cetta -oc tober -free masonry -boun tiful -bigbang theory -behe moth -º ï¸ı -sne eze -saat chi -raw at -mobili ze -mo he -fur ther -dy bala -boli var -tan o -ghu lam -femini st -bo f -ben dy -ant in -we is -t sar -fav ours -fab regas -sh ang -pro biotic -ad mit -sol der -mo vable -dra dio -cyclo cross -australi aday -âļ Ĵ -z at -chi m -si reland -s mb -air fare -Ú ¾ -me politics -mal com -kop f -k all -chi pper -ban que -ðŁĻ ī -sol ver -in sinu -avent ador -zero waste -hell cat -universal orl -pu so -pal au -gav a -e intra -d je -arunach al -vi u -the ad -sep tic -santac ruz -mor gen -guil ford -ber tol -b dutt -world poetryday -sc m -ple thora -london traffic -cre ma -t iness -si em -el ated -before hand -b q -aw ada -nag arjuna -ev y -ðŁĮ ı -lu cha -call in -se aco -retri eval -kun al -car on -reserv a -negoti able -lang a -do fe -cab al -ani k -ðŁļ § -ðŁĺĬ ðŁĺĺ -sub station -no x -long ford -gad dafi -dic a -zi oni -mitochondri al -it on -in sp -be tray -va in -tr ts -pen di -oppre ssive -long wood -limous ine -iz umi -green light -go ggle -pl t -to kio -long beach -gene ss -visual art -s ball -pacific a -kir by -itu dinal -i den -foo ting -en sues -dit ching -sunku writer -sig nor -m news -l tr -b sn -whi de -ver des -taylor nation -sen n -n spoli -match box -mac gy -chro mato -íķij íģ¬ -q in -mo ca -la gging -b ander -sm r -red woods -de gas -ti ered -ma ko -kno tts -ble sses -bella gio -barunsob ti -ad t -sc rape -p mp -no y -mu har -whit stable -man sell -dri bble -n di -mun cie -ho yt -fiber glass -alo u -thing si -th au -sanay airani -s forever -rale igh -mccol lum -but tered -bang in -shab azz -cho ir -pension er -n ando -mu sa -kra u -intoler ant -h mcs -ka jol -ch ale -block ers -bi el -v su -sh ona -gh ol -decor ator -chi ppy -~ # -wel lies -sub hash -ou ld -oc r -o ann -ken wood -c bus -ton ing -ruck us -ro ca -pi b -op aque -for bid -britishar my -sens ation -lo bla -inde b -conne cts -ðŁİ ® -next level -jaz zy -e fe -wh l -im mortality -gym life -dopam ine -arter ies -ts g -steeple chase -resurrec ted -ka izer -hotty toddy -dg b -dal ry -attach ments -wind mills -ul cer -share ef -oy ce -n tc -loan ed -ani ka -ag r -west coast -sha ver -bolog nese -su ez -photo card -mi splac -limb augh -barbic ancentre -accor dance -ze bras -thalapathy vijay -men style -final fantasy -app ing -angel ic -raf fa -hitch in -he ct -bre da -blind spot -pre eti -mentalhealth day -dae hyun -bore rs -ãģ Ł -talk radio -Ú º -itiger shroff -end on -ra pp -ph onics -tar a -rand paul -face ts -art ful -ar anda -âĺ ĺ -stor mb -sau cony -member ships -al ur -treach erous -tis the -stan sted -re work -pre emp -hol la -gi anna -beauty andthe -âļ«ï¸ı âļªï¸ı -surbhic hand -health forall -anatom ical -ve c -trans national -or la -en n -ak ali -to tti -car mine -sub mits -projec tors -gu ten -cruz crew -sc ele -ken yan -conce de -! ðŁĶ¥ -saturday thoughts -ru k -ec er -win ing -pic mix -li mon -lau gha -iti e -fa un -bru cele -à¤ Ł -vocal oid -t news -miser ably -em brace -don kiss -de position -clever ly -thic ke -sky dive -play bill -her t -door i -de letes -bo asting -analy tica -sh su -pro sthe -f bc -du arte -c wa -bad as -in visible -geo logist -ec t -cas settes -ba ir -revolu tions -off end -nutriti onist -line men -dele vingne -si da -man chu -ji an -bli mey -ar gan -wildlife mag -snow drops -pre cursor -o co -neapol itan -it su -birth stone -amate urs -pin ks -ley ton -gram my -giac omo -sei u -second hand -out cast -lon er -b ites -ðŁĺŃ âĿ¤ -è Ĭ -un cg -slimming world -si o -shin ji -ou ch -kan te -ðŁİī âĿ¤ï¸ı -pe k -hu zzah -de kar -belt way -ab und -ðŁ¤Ļ ðŁı¼ -cri m -caregi ving -ara jan -q pr -fon seca -daw son -bu li -alter cation -we the -rawal pindi -messi er -je mima -den ounce -debu ssy -chiroprac tor -antiqu ities -wa hl -un packed -tri athlete -cl iche -super card -re tour -re petition -re actors -lead ers -hol lie -fa z -bad o -ta os -raj avi -multi verse -aj al -ìĹ ¬ -uof l -o ha -ka c -pd l -baro ssa -ari k -ðŁĺ¢ðŁĺ¢ ðŁĺ¢ -met calf -ciu dad -chi yaan -ash lyn -am ity -way nes -pa wn -ox nard -ìĬ¤ íĬ¸ë -es b -dod son -âĺºï¸ı âĿ¤ï¸ı -is che -ev ry -bre m -to en -pronoun s -graff iti -flat bush -che p -pig let -it ye -empha size -c bee -á Ī -tele graph -sing am -or dn -mg m -kno tted -ale igh -ranbir kapoor -mar ko -lic orice -ax ia -arti e -ðŁij ¥ -pu m -plun ging -ore illy -gastro enter -cis o -bombar d -bas qui -speci alize -nr m -nak hon -fre sco -am ity -aero bic -sin ow -re produc -pri mor -straight en -bound less -bone less -stampe ders -re tweet -quint ana -luci en -kri eger -jam z -dou che -audi ophile -abol ition -to ho -tab a -se gal -sch ö -s gov -m td -len ox -cru tch -ðŁij ł -platy pus -ing old -re think -kh attar -dri ft -apaaja iklan -ancho vy -tri este -lu mp -quen ch -on it -gill ingham -gal van -com miss -mi sty -col ton -bob cat -white horse -ric ha -pu ke -perpetr ators -no b -kt la -ira s -g wa -d pd -co tti -teas er -olym pu -franç ois -sh amed -oul ding -offici ald -inaugur ate -der went -con formity -sil vers -is ka -gat ineau -ce ce -any thing -splend our -pin tura -on am -dur bin -d gs -vali dated -se go -par ra -last fm -ka in -h cm -ak ar -ab ram -learn to -ar ke -_ ; -som mer -she amus -kam ara -flir ty -ðŁIJ ¬ -on ice -hu ma -el bows -conce al -col leg -acqu itted -tax ed -mc cau -health tips -defend ant -chee tahs -business men -re h -mat y -andro s -the musical -ob ar -ge mm -dalmati an -wob ble -spho tography -prairi es -ma dge -kail ash -fun der -datab reach -tender ness -sper ry -mc cu -debu gging -ko pp -jame is -diss atis -n cl -logan o -h mas -e ren -ac os -tumb le -natl parkservice -cross fire -bat mobile -ag iri -war ne -vi my -supervis ing -ren ko -pool ing -ma wr -dock yard -nar o -multi plex -exc l -conten tious -ab bi -好ãģį ãģª -twitter less -obli vious -kore ans -fre ne -tul si -hi ma -pasqu ale -oc clu -o key -go dof -dan ilo -ar de -ðŁ¤ § -nn nn -fur y -fi ka -ber sama -wise man -tru c -sh em -q atari -ox fam -as lan -soci ety -ri dges -mur ky -frederick sburg -f k -char ly -buck nell -atta ined -than am -mez cal -hef fron -w jc -sty lists -daffo dil -wend ys -r tz -famili es -crack le -tun nel -nit z -mur ph -ad avis -esp rit -win nin -ki pling -jer o -young blood -ru z -paranor mal -pantom ime -mat lock -inst am -gall ardo -f wy -ca en -vel le -kut i -fur thest -com ings -av b -shu dder -north am -: ^) -ðŁĴ § -swe dish -prettylittle liars -braz os -r ations -pizz a -go gators -fire wood -esto y -ad hi -lec lerc -ice bucketchallenge -hippo drome -bloodh ound -ad gpi -suc cin -sub committee -moris sette -the view -show ering -j awa -a ic -tro m -surbhichand na -ro din -restra ined -ram bl -mo bs -cubic le -then y -park our -he ute -ep c -bit coins -auc tioning -mal a -gi gem -concentr ating -er nie -bun e -tran sports -ki shore -har aju -ðŁĵ © -sweat shirts -pol yu -need ham -nc te -kh loe -fire safety -er ian -dri fter -deta chable -woof wednesday -tric ol -shu ps -dise ase -u min -story book -start ling -sg f -ma kan -ðŁIJ Ķ -agend as -hi it -dispat ched -synchron ized -shu man -radic al -pu tt -pre cure -go fficial -de code -vi ans -vi ability -v sp -tam ales -pra bhu -snor kel -eas th -bl under -: (( -wai ved -ide al -e ury -americ a -t dy -shock ingly -fran z -eric s -ce f -bal ear -ren zo -ko enig -c bbc -biome trics -suffe rers -su ch -smo kies -mur u -k hawa -i im -gha zi -íĶ Ħë -white tail -un chained -thenotori ou -sh ino -ken obi -cour gette -clint ons -al ala -sexi er -never stop -ne gros -ne ca -x cx -song book -ren ding -cal ms -amar u -ag tech -ãģ Ń -qui dd -new years -mar gher -eye ball -ati er -vivekan anda -somer set -rin ce -mu kh -ho h -col er -bu kas -⼠µï¸ı -tu cking -pi ggy -iban ez -ho skins -decep tive -click bait -bu le -world view -woo ster -wo td -stin king -dam i -pau lina -fel on -cross body -wb tv -sub han -lon zo -flat iron -burn side -win throp -tallade ga -sp angled -sf p -ro wan -real ises -wash burn -ÙĬ ÙĨ -ston ec -emp tied -ci ren -cha ise -am bu -. !!! -se tbacks -sad dam -con naught -av enge -af fluent -u ob -that ch -swin ton -sat ya -es z -equ ity -re invented -kas per -c fa -aesthe tically -mi ku -mar cy -fin anced -look up -ecoun ty -ðŁĺ º -t dih -ro pe -me ch -dy ing -book seller -aa sh -vel oci -o vi -im m -feat ured -nu g -fun g -ell sworth -sett ler -say o -mu zzle -su omi -ragn ar -mentalhealth awarenessweek -maastric ht -il in -gl und -ak ar -intellectu als -flor al -brack en -ti ps -sub ver -se duce -scu deri -nev ad -je eps -jaw an -scar red -med school -ec p -catap ult -additi ve -sm itten -q d -lock ers -like agirl -keral afloo -bub bling -ari ze -ðŁİīðŁİ Ĥ -ìŀ ¬ -ted talks -rhschel sea -pu y -ok ra -logo design -hen g -hammer head -dri bbles -gan ja -for ds -cou scous -ar gen -ë³ ´ -van ish -ne tapp -my love -anch oring -ç Ļ - ¨ -por ous -over seeing -musi k -ma gen -dar nell -r ha -per o -land a -jurassic park -fre o -bron ze -ãĥĥ ãĥ -ðŁĶ ¸ -ðŁĴIJ ðŁĴIJ -wa ch -tri gger -eng inak -d bl -ðŁĺĩ ðŁĺĩ -speake asy -solid works -sheh baz -pu sher -p ty -fat loss -discre te -di onne -ch iller -applau ds -u mp -ra staf -neg atives -macar on -islamic state -cap tion -anti aging -pember ton -long ong -issu s -res ounding -offen ses -new balance -n ley -mont auk -mc ga -dispos ition -purpo sely -ir anians -ðŁİ » -fu lani -corrug ated -ðŁĩ³ðŁĩ ¿ -ston ia -par snip -jam ison -ge is -ðŁĶ Ħ -re claiming -pleas ant -on boarding -edou ard -a ah -swee per -nu nez -mu dd -holo lens -chee z -brigh tened -âĿ ĵ -wo wed -sch ko -nis d -co ffe -ba hama -auck land -super mari -oun cing -op ting -mc clu -â̦ # -sant as -sli brary -revit alize -qu ai -men acing -kkkkkkkk kkkkkkkk -der ulo -scre ech -ko enig -crowd fire -bravo tv -ay ee -ar kar -si mi -me era -jiha dists -je we -bu ss -ari ane -- , -ਠ¾ -n su -ðŁĶµ ðŁĶ´ -fi bre -ar ched -à ¥ -t so -re my -light foot -far han -embarra ss -bro derick -breath ofthewild -as ino -superst ition -new ry -mer ck -kip lier -ab ag -van g -pic to -li f -bag pipes -at ru -royal alberthall -movie review -lil ley -ju t -bang bang -. ). -grass lands -flower report -chat sworth -aam ir -syn tax -pro bing -nomanss ky -lau der -we tting -so ta -rappler dotcom -photovolta ic -pharmac ology -luc ca -le gging -gumb all -full back -dece ive -sop ranos -s bar -ru pert -com bi -clar ks -billi es -alle gro -m ce -dam an -chicago bears -cas as -vap elife -mal in -byo b -âĹ ¾ -rac er -mv p -memor ize -jiha dist -ing life -com ber -ar tex -applic ant -je a -in former -ho xton -hen ning -h ls -ðŁĩ© ðŁĩª -p q -in london -ilay athal -âľ į -sciss or -sch amp -li able -stra ining -pu ra -mon kees -let ch -kom pany -by design -mo dul -har dened -brecken ridge -wol longong -tri er -man ate -lyn ching -con cur -c sf -wood ard -ol ab -l st -jamie oliver -insur gent -wre cker -or mond -kim ball -sn ic -s ere -mal ar -gar ages -fel a -fa de -pastr ami -ic rc -hor atio -cle aver -ab be -wwer ollins -privati sation -nature guide -hol me -h eng -esk imo -may noo -lever kusen -ax l -sk sk -n our -fi do -famil le -dis i -br inger -age less -x g -pi an -path ak -ab domen -tri mble -in ns -idw publishing -focu ssed -ei ght -mandel aday -fa ve -da ire -bul ance -u mmmm -pe res -tomo da -pp ed -may all -ler ner -elder flower -bar nar -transp lan -mausole um -fier ce -alleg ing -neti zens -ky ler -il de -gam b -e as -lit es -go er -bur u -alice in -ðŁ¤· ðŁı»âĢįâĻĤï¸ı -ti pple -rupauls dragrace -pee ks -inter twin -æ ķ -y j -shan ia -techno logy -nba on -mul tan -motor head -lu kes -ken zo -mccre ery -er te -dra s -blo kes -ber nal -apple by -south carolina -new borns -tw ir -spartan burg -o cala -l ü -dwy ane -bra va -ace h -à¸ Ĺ -sv s -sula wesi -stoke city -shar ks -fo a -anti depress -ðŁĩ¬ðŁĩ Ń -sidel ined -shu l -seren geti -ll lll -kab ir -bout a -bi zzle -bam ba -que ttes -nb cla -mj hl -mg mavote -mac chi -cag r -ale ah -ðŁĺ Ĺ -whi plash -tim i -pal mas -domingu ez - · -il on -hil arity -ru a -organi st -mit ts -gas ket -ðŁıĢ ðŁıĢ -ten sor -steep le -smy rna -rand o -r ma -pl enti -fo go -aph one -ðŁijĩ ðŁı¾ -ðŁį ı -th ad -re sor -petri fied -di xi -ti gan -jalap eno -deser ve -sav age -mad sen -gre mlin -for women -depend able -conve ction -bo sc -yel yah -watch mixer -ìĺ ¤ -z ell -tur ku -soul ja -she et -sel i -ma kas -k league -an go -ak al -........ ...... -te tsu -i heart -her bst -cyber attacks -sum ter -rijks museum -raj ya -ar ba -rock ingham -mus sel -micro scopic -ke babs -cand ice -get fit -adam ant -we ing -sa shab -h gv -emp tiness -cur ation -brit natureguide -um n -ra fi -an er -viscer al -up trend -um pires -ts now -out last -le sh -ih saa -shal lots -sco pe -dan za -c vc -bac ardi -air brush -ae gis -ðŁ¥ Ĭ -tru sh -scha efer -resist bot -fior ina -bran ch -whit efish -ru l -con spic -ar ig -twe aking -tub man -ste tson -robber ies -iso l -em m -condem nation -cast ing -aud its -vish al -vand alized -oc i -gi m -work place -van buuren -nig ella -mis guided -cas cad -after ward -:- * -sub tly -car rick -ple ading -original art -omnic hannel -nancy pelosi -great lakes -glimp ses -ent ino -down right -arter ial -ðŁIJ ķ -maxi mizing -er acing -cy te -chur ros -stur gis -microbio ta -mass ac -kun al -ku b -h ny -blin ding -articul ated -an es -piers morgan -ker alab -ho cken -coles law -gas sed -d md -ðŁıģ ðŁıģ -nor bert -mi i -long ines -go de -del ray -carval ho -bou quets -bat ty -bake well -st oop -sare es -pug life -kau ffman -g ds -free speech -cul pr -basqui at -pan dian -g ws -do glover -den ces -beach y -wan ing -press freedom -home made -con stric -bhu mi -bb all -t iling -popular ly -accol ade -tar ra -sta ve -kardashi ans -jac lyn -ic ed -endange red -art finder -ðŁİ ¹ -vanity fair -tr ill -psychop ath -multi functional -lou p -jag ged -gr ama -sanctu ary -her schel -et ch -capac ities -z ora -slu ms -jad ine -bag ga -ani m -sp ress -hand some -cape town -by ers -w sc -sh reds -miyaz aki -iti st -coll ard -è ² -sal ina -pac ino -nune aton -jan ella -grass ley -à§ į -p eli -don line -comfort food -c ÃŃa -so ba -fl ys -spay ed -med ve -hol man -ãĤ Į -stef anie -nais mith -home girl -g bb -bul k -au ce -afternoon tea -ac ular -su iting -spot less -sky lar -shop kins -j ona -clo cking -car cass -bo gey -be ig -bac chus -ari es -ad k -ðŁĺ¬ ðŁĺ¬ -upro o -tri a -hom ing -han n -el vira -cdc gov -br ind -al en -wn c -with ers -ro ast -os mond -ke ele -e bs -marke ted -imperfec tions -en cin -e sses -c zar -worth iness -watch man -me ena -man ali -kat ow -historyof painting -edit or -° . -rosen stein -itsen rique -dal hou -begg ars -sym metrical -surg ical -star a -st ent -so excited -sa ac -robert pattinson -pe dd -ker o -ç Ľ -thu mp -re tribu -powered by -ober oi -hybri d -grid lock -cd m -av al -ãģ § -thenotoriou smma -sub conscious -he id -go bruins -cy ani -bo den -uc sd -sar o -el c -de ley -bol den -spie gel -re made -n anda -jodi arias -h any -too o -salis bury -op ing -cab all -an gr -... * -to ggle -shorth air -sas sy -san am -fl on -apologe tics -ac cel -shirt day -ac me -ic t -hal es -danc in -co exist -ðŁļ ¢ -è µ -yelyah williams -straw berry -fc n -ce t -sanc tion -r fa -po tt -iz om -id t -; ;; -vol a -mess engers -cher i -sfor all -rhine stones -r ann -us k -sole mn -sen tai -retro fit -mait land -ac tus -ig loo -desc ends -u day -ic c -hu ck -endometri osis -elec ts -crab tree -rakul preet -jur ors -holy rood -feder ally -di az -de mil -wash ers -ver tically -untouch able -mal o -curtiss mith -cali bur -book keeping -ym o -x men -per mian -national theatre -n assi -lein ster -c ld -aw az -apolog ises -al ysis -son u -mi dge -inte ch -gy na -come th -band stand -viol ence -survey ors -n ms -es d -dr ing -clar ke -beat on -u bud -ons laught -ne vers -m sk -ee vee -con qui -bump in -bel ted -ac ris -c our -blo em -bien ven -v mi -da de -as ic -su vs -speci fy -gaz za -fe dex -voor hees -shr ines -# âĥ£ -ito hs -del co -cruci fi -bo h -ath os -âłĢâłĢâłĢâłĢâłĢâłĢâłĢâłĢ âłĢ -tri pathi -think tank -t ta -satur ation -mmm sie -bear cat -rick and -pa z -kand ar -jo ss -al ang -sab ina -ree ce -m kh -jin der -est elle -ell on -pellegr ino -o skar -im man -n ona -k go -engag ements -dest abili -bb g -y x -shiva ay -see saw -mo tu -ger hard -al armed -houston rockets -fin ally -dra vid -corpor ates -c ô -c mo -blood shed -ti h -strong man -sol an -sn ick -r ara -pau li -n ge -horse men -ch ism -? .... -.. ' -li via -issan ts -bc g -bar one -wat ters -val eria -optome tri -jess y -j hl -com be -be toor -ðŁ¤ ¢ -ut in -iggy azalea -grou ping -commun e -columb ine -af for -sa is -panch ayat -h ro -floyd mayweather -esplan ade -z vere -sony music -no a -i vey -d onal -cher son -c ack -betoor ourke -susque hanna -kak kar -don es -derail ment -compul sive -cardi b -ca e -tim ings -ap l -after hours -ac ting -un fore -transforming india -suppre ssed -sidd har -r sm -mah rez -in capable -green wich -misplac ed -love this -insi der -biomar kers -panini america -multiplic ation -ice breaker -discre et -chec kin -人 ãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ -vel cro -pre scriptions -hetero gene -dru dge -ìĬ Ī -Ø§Ø ¯ -van swar -tu pper -spar ade -m callister -e ko -ve ep -mar gi -ker k -kar a -dic ho -cos grove -val des -pu mas -off ending -k andy -hhhh hhhh -h pd -complex ities -car te -buf fo -k hun -ta char -in ky -bat es -at ms -syd ne -hri thi -der mal -ðŁĴ» : -ea sel -diss oci -bikin i -n sui -mon tes -mol loy -mo par -h di -dom a -ari ous -alphon se -âļĵ ï¸ı -wer der -uni x -seg mentation -micha l -lam beau -what the -thread ed -sa am -pfei ffer -fu sa -fr ack -aur us -te dious -nag el -ken an -island life -ge sh -cate red -bilt more -kam i -bul le -teamem mmmsie -t tu -sl b -newal bum -ma zing -gra phi -en vy -con g -we sson -sch il -gur ru -be de -aqu amarine -kand insky -emor y -den iz -ri sa -pul p -o cho -neuro surgery -le sions -h ons -big cat -sak ti -psycho sis -nsi tharaman -sw ard -le gu -fi ennes -se att -marketing tips -man groves -loop er -dh ya -quar tered -pri este -pres scon -ll amas -com elec -ri sd -r ine -pp r -dete cts -vival di -valle tta -fle sh -alfre sco -testim onies -quil ts -lat ency -k els -grun t -crimin ally -h tg -apo or -p ga -or m -ol ly -modi ji -hin ckley -na ve -n ong -heffron drive -gulf stream -gar rick -enti a -man mohan -iphone ography -flo ated -co en -c ally -armb and -te ton -tar te -ns wr -max ed -in ward -hydra ul -armin vanbuuren -hob son -creep in -re ins -kentucky derby -dream s -blou in -armaan malik -ab ana -.... ." -ten acity -ðŁı¼ âĢįâĻĢï¸ı -tam ing -oper atives -lec turers -cam us -áµ Ĵ -therap y -se dge -qu é -l ene -judi th -ac claim -on as -l ill -ben nett -sh atta -go dre -fle ury -e ath -posthum ously -pla ined -n ace -mor bid -mas ood -bac olo -mic ron -intercep tor -g acha -talk sport -requis ite -intru sion -dom es -brea the -affili ate -nyc marathon -house warming -blur b -si ren -ss an -mill on -gra inger -col by -campaig ned -kir sty -illu sion -f omo -c illa -armad illo -a better -t mc -soo young -sec tarian -rede mp -om p -chapp elle -and ar -ðŁIJ¶ ðŁIJ¶ -por tia -la pd -imit ating -do ers -cam b -bas alt -w sp -w los -tal es -lov atics -fat ah -sle eved -rand i -de foe -Ñ Ī -vo k -spraw ling -smo thered -kin ab -isu ppor -i wo -diff ering -al ine -scour ge -restra ining -kh j -joero gan -ed ina -chiyaan vikram -web ster -ty rell -take i -marting arri -j edward -e ke -dil wale -sur face -pu get -le sc -green tea -di xon -mi si -huar ache -cher y -aqu il -altern ating -my thic -lans downe -fil an -z ey -s att -o as -kerri gan -ty r -startrek discovery -ds man -bre ached -banc roft -ìĦ ¸ -lobb yists -lil ian -c ve -bull ard -bring the -st of -plane spotting -mit o -wak anda -mo wers -le la -had field -bouti que -ðŁĴ ¼ -s bc -lone star -disciple ship -qu akers -ecclesi ast -dead lift -c po -botan icals -ac al -stein way -je u -h cl -cru x -ë · -sh ani -palm beach -men non -du da -cho t -wn yc -cou pon -ca an -am f -ab users -ðŁĽ ij -ðŁĹ ³ -yu catan -w ird -tele medicine -ster oid -mayorof london -hy ay -sni pers -n andi -mo x -ga uri -xen ophobia -the arts -slo p -s val -llan elli -in consistent -do ki -demo ing -char lat -carl sen -bel lies -ìĸ ´ -ve ts -sen atorial -krit is -grun dy -golden knights -di vo -arch er -resi sted -connoisse ur -celebr ating -yousse f -par inee -de blasio -darren criss -ronal dinho -mt p -match play -entit lement -ðŁİ Ń -ภĭ -ple asee -men di -ev as -y una -that kevinsmith -red shirt -lin c -kung fu -epidemi ology -du z -sto ker -say er -mad huri -if ttt -gye om -fau lt -chan ukah -used cars -unimel b -la ha -eco logist -conserv atism -bar ro -art station -star citizen -spr outed -sho ved -shark tank -pro filed -jam i -hu xley -grote sque -be cc -ìł ľ -ภ¹ -ww t -work fromhome -ud ine -mar lowe -her bal -fur long -deb by -bou tta -ve dder -pri miti -mb t -e ia -dill on -akrish nan -wi ener -tun bridge -thy self -pav illion -om ggg -kevin hart -aw ry -tv news -si one -qu ds -n ita -loop hole -te chie -sab les -ber ing -worldocean sday -se g -pat tie -ne pale -indi o -bi anc -be ingh -air line -su ne -sj w -m wah -h ca -gre noble -gn c -council or -call a -weird ness -spo ken -sh ined -rotar act -om in -city life -vanswar pedtour -t ine -sp b -sof test -ram med -mentalhealth matters -gar ry -ex iled -adap table -smir noff -sedg wick -glori ously -bit strips -af an -tam er -q adi -origin ality -john kerry -es se -soire e -jo ggers -c gn -boo sie -se thro -le cht -in al -de generes -bog or -algori th -abo lished -scram bling -ici ones -hed ger -har ing -gen omes -bol locks -ram ble -bepanna ah -ðŁ¤Ķ ðŁ¤Ķ -the sp -t so -hof stra -stor ied -ol lege -jan os -gold wyn -donny pangilinan -ëĭ Ī -âĻ¡ âĻ¥ -yo w -sab ado -defen ces -ap ts -inter personal -el ynn -b ff -." ~ -un discovered -red deer -py ro -muhamma dali -lam on -kevin harvick -itu res -mol ds -just sarahg -irr itation -fre u -fort itude -du ality -archa ic -æ ¥ -sc loud -narcis sist -mu tiny -malign ant -du cho -culpr its -cross walk -berger on -back lit -ye sssss -tro l -sil ks -ran cher -nil sson -store front -sco ffee -pur o -fla herty -fa j -compen dium -car ds -si mu -mo sk -joe jonas -hand ker -y h -screen saver -ravi shing -hu mm -del mar -cro mer -cape cod -í Į -transi ent -taey ong -segreg ated -man ji -ki dd -jam il -cze cho -au ds -ãĥ ¯ -ma si -athle te -tu fted -tobac co -the l -bird land -transm it -thra sher -suit ably -seawol ves -ma so -lo vic -ing ford -communic ator -be gon -pr s -co ker -at ticus -tel co -stu bble -mp act -je anne -home schooling -est rogen -dt by -de hydration -com et -aper iti -work wear -tc p -pan t -men endez -air pods -tick led -me ws -may bach -li ar -inc iting -hal cy -fo m -fjor ds -wd su -saf ridi -produc er -out there -im ala -er b -butter scotch -ble tch -anc up -ãĤ ª -tan doori -shi d -p ds -ny x -insp ort -i fb -hydro gen -battle grounds -work s -meij er -mary ville -kal yan -cas sava -bo zeman -mat us -in human -ec ur -ðŁĮ µ -schoo lof -hispan ics -ga j -es qui -bt g -ac ing -pr amo -maer sk -ga iman -biza v -bir ders -whoo ping -vit ro -s ö -re telling -pal o -mar kiplier -hipp ies -cre ator -brom wich -ste ely -oo o -louth chat -nin ers -mil der -simon e -pl m -ho tt -devon shire -bon ny -victorias secret -the city -sch wei -pra bha -lil tunechi -inter galactic -cit ations -car thy -bi ow -vil lec -ut d -t st -shay ne -shakh tar -reson ates -per col -kat ana -asi ap -ak ki -shel ley -ke ston -jade ja -hutch ison -disp ers -bro mo -rai ding -o dy -n news -martingarri x -lu g -g lish -ver so -tan tal -om ag -o tak -free ing -yam in -un ser -multi family -haha ha -h sm -fi go -f ma -em bre -ab normal -nu ig -mall ya -d pa -bu i -ar no -amp shire -af fin -ab ook -pel ican -mee ks -heathro wairport -bhai jaan -ภĽ -st are -sar o -mathe son -mar ts -eucli d -w sc -seven ties -se cy -s not -motivational monday -mar que -karl sson -imit ate -if bb -houseof cards -ba sta -ðŁĩ²ðŁĩ ¾ -oc cul -na vel -manag h -ic her -ent icing -tw ente -trac ts -room ies -little big -el dor -humidi fier -depe che -su pp -si b -se ong -safridi official -nebra sk -make your -hiro shi -el khart -edi ble -du t -barrow man -balo ch -ude my -rwand an -me ts -footb alls -conun drum -ti u -p low -news stands -constell ations -ch n -lu han -khu shi -hope fuls -confe sses -ati ya -w ms -v ite -syn dro -shameless ly -khloe kardashian -hi sp -haban ero -descend ant -con scienti -black caps -ban dof -wad sworth -museu mo -ban king -anu rag -va ill -tele health -\ \ -w gc -v aqu -up cycling -k sl -aw ol -up cycle -nick names -diver se -centi pede -br indu -bur ying -bi gger -bedro ck -re solving -rang a -or icon -nikol ai -god in -excali bur -cur tin -chir anje -ab sa -wh irl -monday blogs -ll ang -bj ö -trip led -re imagining -lo ko -govern ment -craft smen -oste opor -lo bo -la vigne -grand view -v rin -v anna -s net -nomin al -ju ri -es m -cra dio -pr ingle -key chains -imagined ragons -ig ned -hill man -e ases -catch ment -ðŁĮ ª -transc end -qu ita -no sql -hav re -ðŁIJ £ -âľ ¿ -rani eri -por ta -yun nan -y ac -tam ale -ir t -gar gan -dis agreement -cy st -busine ssc -sten c -sm f -shino da -qu adri -off site -liter ate -chap ter -boun cer -asym metric -wi den -sch n -j han -ak wa -rheu mato -le de -in patient -he ide -chec ker -inf light -im pover -ha res -ayush man -ðŁı « -uter us -fly catcher -du ques -ka st -jahan gir -con vo -skin da -san sa -qu im -presu med -p ils -nbat v -mainst age -bri xham -s game -rho dod -qu ake -per ci -never hillary -love birds -loo kie -la vi -wes tham -pomer anian -ner o -montic ello -const itutes -warner bro -synth wave -nr w -fand ango -con d -grin dr -dé cor -cu h -come dies -bir kin -bap uji -smu dge -scru ffy -pan cakeday -ove se -ni d -li eve -laz iness -imple ments -ad ri -ðŁį ŀ -vi sts -ve u -risk ed -pro football -pless is -meso potam -ma ret -lu pa -koto ko -k ura -clin ic -am ends -state fb -goo ood -<< << -âĢ¢ Ì -th icc -mc do -hd fc -configu red -ck in -back ups -the mo -pol ska -insi sting -et su -sis coming -kin ect -conce iv -ar ry -go heels -vac ances -to sca -te sco -symboli zes -pnpp ro -palla vi -os born -ori ole -k sen -cro issants -+ $ -the man -li gn -jump in -hoo ligan -dictat ors -anal og -wai kato -ha vi -gis elle -fin ches -c di -ar at -tra shed -the academy -steel book -ove rest -home ward -gen ev -david son -ti bur -loo ker -brindu sab -tra shy -sl v -illustr ation -bread th -ba f -ri del -expre ssionist -co pic -clu s -ag chat -wiscon sin -sn ick -sh s -ricket ts -mlb network -han sel -dari en -chi val -wh u -sal as -phi pps -cor responding -chicago bulls -blat antly -bil a -bay watch -" :" -ìĿ ĺ -su mb -rous seau -p we -ed d -dam ning -benaz ir -bb mastop -unlea shing -hour glass -bur nie -buck les -ticho pra -tee thing -per ri -pen der -inf atu -he il -alum ni -à¥ Ī -wh im -ver ge -newly weds -an ach -wo h -sj su -mi an -lom bok -j adi -ail ments -ft m -cro quet -blu ff -fa iz -chromo some -qu t -iti onist -ma dera -breastcancer awareness -b so -tra pper -tole do -o ys -fe ats -bt p -beli ve -a sey -ser t -bor i -æ Ń -tr ition -nun n -nbc thevoice -form ers -cav all -ðŁį µ -l ingham -hang zhou -we stand -inju res -gr rr -fer managh -cygn us -amster dam -t ns -spar row -ro logy -ray ner -pe onies -lu ton -huff ington -ha si -pri es -ev ol -ds l -. âģ£ -wins let -parinee tichopra -nur series -es ri -de mor -con texts -con rad -ðŁı» âĢįâĻĤï¸ı -sp rays -pres suri -don or -... ðŁĺĤ -gru b -der asach -ðŁĻ ĩ -zvere v -thi el -slo e -om w -kha di -ic hel -pun ters -f gs -commemor ated -brick ell -box eo -school house -on enote -lu men -l ye -ar ah -alex ei -ab ingdon -schol ast -magdal ene -for a -foot bridge -embo died -ble e -sm w -ren ton -mad havan -estim ating -son of -inthe world -ce ta -asau da -ঠ¿ -vue js -shar ad -sh unt -o val -local ity -first ly -de jav -whe elie -no zzle -no bu -han es -cu ban -aj ram -s radio -reen actment -play grounds -ordn ance -mu ggy -hor i -col ouri -b aka -vi ber -sle dge -ro si -off aly -im u -ende aring -concentr ations -ari th -ver me -south sea -sha ws -second life -re ac -mob i -la ff -exxon mobil -domestic violence -condol ence -cd g -bi i -ab cd -venturecap ital -thra shing -fox sports -ferra gamo -dang al -acapul co -ser rat -uphol stered -u gu -ro bs -play station -forwar ding -beautiful pakistan -x vg -tit us -su se -in sure -havas u -flam mable -ðŁĴĽðŁĴļ ðŁĴĻðŁĴľ -wh ine -tuc son -tame side -sc f -is so -afl cio -cal tech -theat lantic -taylor made -q ot -pp i -hy alur -hect are -de mir -su kho -scrap booking -sc ic -s sport -harmon izers -fol lies -che tti -med ellin -ken osha -hal ts -fuji film -b hd -epic enter -civil ity -te ac -rajam ouli -ho zier -summon ing -music news -laugh lin -friday thoughts -derasach asauda -cauca sian -z ha -total ing -sa rena -ratt lers -go se -by ul -b mc -ti st -seri ousness -kid dies -gre mlins -con testing -ë łĪ -z g -snapp y -pud sey -hor ton -ho ses -der ozan -sar ge -plastic ity -intercep ted -ðŁij ¬ -tre c -more lli -her ron -dj t -ðŁĴķðŁĴķ ðŁĴķðŁĴķ -year ning -j hu -hyacin th -che stra -ya w -sequ ential -ol ite -moo red -t assie -sop h -is brill -insec tic -fou ls -ab ook -sli ver -cripp led -transl ational -shock ers -she er -seman tic -mumbai police -accu ser -? - -the official -sam ara -jac into -fal ken -expo sures -car repair -amand a -ðŁļ Ķ -twee tup -til ted -ro phy -ske et -pamp anga -it take -eto bic -dess in -aa shi -us ga -paris attacks -ate ch -am ici -scrob bler -nintendo america -mol son -mag ne -haw es -ex pres -âļ ĸï¸ı -we got -scram bler -pra m -fic tional -elli eg -ðŁ§ ł -sw tor -quir k -karti k -s rock -ni er -land on -he dron -ber yl -^__ ^ -pin back -dar ling -c mon -and sons -al ca -severy thing -ram an -ra dy -permac ulture -be vin -see australia -man ga -kau shal -half term -fet ching -divyan ka -bureau cracy -al ena -stin i -sho vel -rho bh -raz ak -co schools -peril ofafrica -o choa -gi mp -facilit ators -blueli vesmatter -ah ly -adul ter -the art -revol ves -photogra phie -be happy -ahu e -s are -fc l -counsell or -bio gas -avi base -wh ys -v ad -santor um -les sen -don k -cover girl -bacolo d -ach en --__ - -zir conia -roo p -brack nell -à± ģ -mis spelled -imperson ation -hand soff -( @_ -rou en -cl er -stabili ze -st t -jun aid -defibrill ator -she skinda -rox y -ra jar -pr ingles -over alls -jin ks -mchu gh -fra u -abig ail -ab adi -ro sco -re ims -ho shi -quig ley -pu rim -police uk -cu pping -aro v -a state -xero x -nz l -noctur ne -mortal kombat -clou dexpo -ain tree -hur lers -e ffing -bi athlon -al os -kin ky -hut cherson -bol l -wood bury -tart ar -sav o -q o -cou ghlin -civ ics -blogger stribe -ther oux -royal rumble -ni bbles -k ro -gar fun -west jet -track suit -syl van -sof ten -reg tech -goo oooo -bio graphies -barnsley isbrill -adam levine -ic f -guit arists -gal ing -cour tois -black hawk -ta gh -sa kes -religi ous -o er -an j -table ware -ru de -my first -mun itions -ah m -ðŁĩ«ðŁĩ ® -sli ppin -sharkn ado -gab y -early biz -ðŁı ¡ -sw ad -sorren to -koh ls -kend ra -hahahaha hahahaha -d mr -` ) -é ĸ -mel e -anten nas -work ings -i wa -ha fen -di ah -the k -prophe t -mc callum -m re -cripp ling -ate ment -ab omination -! (: -âĪ ŀ -world heritage -un reliable -t into -sho gun -que sta -ho tep -b po -al r -supple mental -mm f -it en -dor n -con current -arsen ic -martin is -cu sp -ðŁį ľ -za hid -is fun -as ahi -ðŁĨ ļ -wal kie -spo d -natural hair -blader unner -an se -it ory -infe station -gover ned -dic e -custo dian -sulli van -r ong -n dam -hi z -d ba -teen choice -sid harth -sh ami -magdal ena -john lennon -f nb -en rol -con form -unh inged -sp ay -flat ts -dar shan -to ver -si ang -one er -mo ga -lead ed -ef ur -din burgh -mezz anine -angeli que -e fl -ba ar -you ra -nbc washington -et u -disco vern -dimini shed -ten acious -precar ious -lo tu -kel e -j illo -gag reader -bre s -bal ding -u is -right now -richi e -euro maidan -dwar a -cur v -chann elling -ben zo -unreal engine -u shu -n mr -let ts -is r -fergu son -elev ations -dream works -tape red -ruff alo -pen ne -ful ton -down trend -depre ssive -actu al -vijaysethu pathi -th monthsary -fla p -de human -bol she -a sta -uchi ha -sha b -scen ic -pla gi -lan sbury -몬 ìĬ¤íĥĢ -v ri -un interrupted -sw ami -concre te -world mentalhealthday -work hard -tru ms -ser if -py on -os x -oh t -le dit -la gs -graci e -ðŁĻ ī -summer camp -karan patel -av p -ãĢ į -weather nation -the division -miser ables -liverpool fc -king sc -ju ba -holocau st -co eli -ade y -âľĮ âľĮ -un marked -swag gy -finger prints -yel lows -vo m -sm th -ri ser -on ge -no tions -vac y -tn wx -sh ala -nc state -leav eno -ec ke -dutch man -cor o -bang ed -te ver -rout inely -new schannel -hec tor -g mp -fo z -cor tina -w ce -su zy -motor spdwy -ma ye -zimbabwe an -sa ip -head ingley -glit tery -establi shes -es cotland -ander lecht -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ -wood man -ri az -kritis anon -ko dak -ham lets -ha c -flee twood -antic or -z it -yar n -tu t -tin ashe -mand ed -dam m -d fl -comfor ter -bicy cli -u il -succe eds -pat ernity -no ds -cu sco -aband oning -white ley -weather man -shi h -marau ders -hilli ard -di rek -chor ale -ali c -ðŁİī ðŁİīðŁİīðŁİī -makeaw ish -maha thir -loch te -dro plets -cob ham -cle matis -besie ged -pan kaj -illustr ators -co burn -affl iction -travel o -ruff led -nag aland -doc trin -bul acan -aqu ap -me de -h sr -du bbing -cat z -ready to -fin alizing -e pping -defun ct -bonifac io -agu as -zo ic -taxider my -pra dhan -har ass -grad school -counter tops -clt motorspdwy --- @ -secre taries -å ĩ -u pped -ser ap -pel t -id an -humili ated -ðŁİĦ ðŁİħ -ðŁ¤£ðŁ¤£ ðŁ¤£ðŁ¤£ -psycho logists -mil le -extraterre strial -emirates facup -chatter jee -bre con -t gs -pan el -men ag -ig le -cb se -ron ic -guide book -bystand er -valu ing -nko tb -men sah -go cards -exten der -er bil -draw string -demo day -pho t -fe red -chic har -beth une -be m -mol y -loc ke -excur sions -data set -bre ds -ab aba -ðŁij £ -stab s -scrip ting -par m -paper less -mu zi -kra sno -cle ft -accu sation -mon oc -gre wal -e dia -cb x -cal ender -besti val -v ying -uph olds -sa oir -me tic -châ teau -alle gri -yo gy -tro is -mar ley -g fuel -english heritage -emb ed -counter top -ba chi -:- ) -Ø ¶ -r sac -mill eni -ko komo -deduc tible -am ia -yam aha -total ed -th war -p br -mor den -mo yne -k attu -cali ente -tra ve -th ayer -scoo t -mc crack -gu bati -gas s -fel ices -bac a -un fairly -trust the -sb m -sadiq khan -pri mates -gen i -/ " -wou lda -un well -rac quet -pa than -me wx -hol comb -hero academia -fro do -eng vind -bet fred -ãģ £ -west end -sch ke -rat at -les worth -kashmir is -juxta position -je annie -green day -g bs -f nd -temper ate -philadel phi -fé in -eye hinakhan -ate k -ðŁĺį ðŁĴĻ -v awx -j col -er d -aj u -adirond acks -y na -tra shers -super powers -re funds -ox on -mu rah -llan o -aw ana -sly ther -kh on -cast ello -blo ch -à¸²à¸ Ļ -up t -illa warra -gram mat -eintra cht -as aram -sprink lers -las se -haul s -chry san -cas ks -ठª -woo jin -ther mo -oppos ites -le ttes -heath en -goal less -gi ga -esper anza -anzac day -ac ul - « -te sol -obas anjo -fac es -sw w -stat en -az io -shor n -radi on -maiden head -inspec ts -ri ordan -jen son -gb h -ek u -albi on -ta ffy -slu r -rit er -nouri shment -mot ley -life guards -frei burg -cent ro -bir u -bb ci -aj english -swee tt -per shing -new haven -ake up -abru zzo -the b -sig ur -remember ing -ram pal -qu eri -conven ed -braz ak -alco holism -ॠĤ -firec racker -dat emy -dar o -ðŁį Ń -junior bachchan -dis likes -af oot -t ff -i one -deer field -cory booker -pull back -mail bag -j emma -daily photo -cur ating -tourmal ine -pupp ete -pots dam -nis ar -madi gan -bas set -un intentionally -til apia -smo s -naji brazak -xy z -squ amish -produc thunt -ni z -ellieg oulding -ch r -è ¶ -un followed -heu er -wo ww -un prepared -pe els -moul ding -mar le -bellator mma -ar rays -z uk -social justice -ri ma -ent angled -absin the -⼠° -thro ats -theat r -sligh test -shame on -notmy president -humanright sday -. :) -ðŁĺ»ðŁĺ» ðŁĺ» -your world -testimoni als -f br -cumbri aweather -| | -spr outing -san gre -roa sts -respect fully -ma el -l x -kan ata -k ells -dam nit -spur geon -pitt man -k we -geopol itics -dec can -chri sc -venkate sh -ba ad -plun kett -led zeppelin -lang don -gilli gan -fur sday -bu gg -blogging gals -u lit -sab r -ivan kat -gl ene -cd f -am m -am ble -âľĬ ðŁı» -vote snp -star gaz -cma awards -alder shot -vv v -lent en -ax is -tt r -thi bo -sunny side -pulw ama -jan us -ðŁİ · -tru er -shel fie -pas ar -lowest oft -gu ac -go diva -extraordin arily -country man -view ership -mag ma -gen g -qu into -m fl -gh d -cr p -class ico -sho veling -se same -re at -ed ining -boyn ton -bea sties -west life -trous er -ter i -myo gi -min ced -inde struc -domin ican -ê ´ -t sai -son n -sm in -jeff gordon -cypri ot -cast ro -boy with -americ orps -ac al -ðŁĴ ¢ -pa e -i shi -gau rav -evangel ism -e ic -cur ate -ti sdale -synth pop -spaw ning -role playing -national ities -hormon al -re constructed -g ne -ed way -dom i -doc u -* : -shre w -seth our -out day -mor ia -ma ther -latt es -ka it -k ri -jolli bee -di or -defe ctive -al bin -adri ano -: ((( -u cha -serv ings -il los -green brier -dye ing -congr atz -moon stone -exi les -bell ini -additive manufacturing -tin ent -ster dam -sar kar -re lin -ov c -o del -hat ties -feel s -colla ges -as sign -nik kei -my r -minim ally -bel ting -Ø ³ -stat ely -mac pherson -lob ster -hus band -ca po -bigh orn -ç ão -ver tical -sten berg -locomo tives -stocki st -norman die -mo yer -homec are -hassel blad -dad dies -cal laway -ai x -tar te -s gs -pr une -ner os -mush y -mar go -bel ton -bag ley -ai e -youn is -tom cruise -swaz iland -samar itans -nat ur -mi ata -la paro -anti bacterial -u we -ori on -loscab os -loc ates -ig p -gi ff -plun ges -maj ldr -ha ba -fac ul -cran ky -air drie -ag ron -r fk -p vd -hey ward -dat eline -bo ko -t ma -sin ce -objec tion -harmon ious -gren ache -clash of -)) ))) -ym ents -si mb -ridd ell -rb ny -mur da -may hew -ton in -swal lowing -rand wick -ob c -ig non -f ann -begg ar -ab q -suppor ting -se go -plate let -l chf -Ø§Ø ³ -wi pers -web toon -out cry -bio l -urban decay -taran tula -na uru -megh alaya -medit ating -me ren -lett ings -hol born -ðŁĴĻ # -trish trashers -ry lan -n ne -mand ated -full ness -field trip -chi sel -buil dup -ty ra -made with -ha ile -forgott en -dan gote -women smar -ti mid -ski m -si kor -rig or -reig ate -pu tty -illu m -fat ale -bra sile -bass fishing -af a -âļ ĵ -su prise -n endor -hair dressing -cd l -be cks -bart ley -wit tle -tang a -l acked -fox business -ducho vny -day time -audu bon -think able -se marang -roman ces -north umb -nl cs -io e -bt sport -ste dd -pa b -shr oud -red line -pla ge -p ell -lip ton -achiev able -take over -ru ci -o vr -mide ast -jun tos -amo ah -ve tting -v eng -ti my -new shour -le ste -indu ce -hard waj -de se -ba idu -my cleanindia -leg alized -am monia -web by -un tuk -stone ware -ap id -sol sk -satis factory -head master -fulham fc -chi dam -bere tta -ðŁĹ » -kil len -early bird -away days -ni ve -narr ation -is b -eter nal -tylero akley -tri g -scoun tdown -ol en -myogi adityanath -indi atoday -f news -engul fed -th aa -subsequ ently -music app -constantin ople -sta hl -recu er -em m -u om -stone bwo -south wales -mi zu -joy stick -hydro electric -hat trick -vivo ree -ayr ton -ðŁĺħ ðŁĺħðŁĺħ -u sch -k ham -d proud -ðŁĩ®ðŁĩ ª -ton io -lal u -kil os -hel las -gle aming -face of -east coast -the truth -ston ers -r gv -jo liet -e spar -al cs -@ â̦ -sh ingle -enchil adas -cast ile -bio fuels -am il -al pin -r ile -mu da -chri so -aw ad -to b -stor mont -mat tresses -hel o -hee led -dul lah -chom p -chic os -bis que -lovely z -gali lee -co va -vir k -subli minal -phosp horus -l mu -footb alling -drogh eda -cro cus -madhy apra -graci ously -gen ova -ex pos -cruiser weight -bi ken -af amily -accr ington -tt w -ted dies -spon taneously -som o -sla sh -ben et -afri que -vand al -un till -tor ius -stadi um -nnam di -migr ant -man na -ll b -kar oo -chi les -cave man -ðŁı³ï¸ıâĢį ðŁĮĪ -separati st -ron pa -pa cha -oper a -macau lay -frank fort -fr ills -ev ade -aud iting -theli on -par take -mck ellen -man is -ka yo -dee pak -cas sp -zam be -sunday brunch -ra sa -qui p -adhe rence -s wed -le mieux -stu mp -litt les -evalu ations -amu let -ðŁĺĬ ðŁĺį -n ch -ðŁĴ¤ ðŁĴ¤ -âĻ¥ï¸ı âĻ¥ï¸ı -were wolves -ste ers -scar face -par tied -de su -creepi est -controversi es -adri ft -su mer -sou p -ri go -let stalk -irrit ated -grou pp -carni vorous -autonom ous -au e -al pes -t fa -m gb -incan descent -glo ve -cant ando -tas man -sab re -liveon komo -kapam ilya -fang s -di lem -deb bi -bah ra -moha bb -g mg -g da -ke xp -bal an -ux bridge -t of -some things -keigh ley -embarrass yourbestfriend -cho ke -nab s -am mar -adjec tive -ðŁĴĺ ðŁĴĺðŁĴĺ -vol l -pin to -nhs england -krit i -it age -collec tor -black twitter -b more -ab and -sher i -north west -mtve ma -kel so -iz ard -bur gos -ãĤ ° -wet test -ma sti -i stan -tri al -th enight -purpose ful -off ical -bbmastop social -ar g -vent ured -vas co -male ficent -har k -barre tt -re adies -quantic o -jen ks -centr alized -ye m -un tapped -un m -n bas -ivankat rump -ingl ory -haare tz -ul cers -sky nyrd -ru ms -pre cast -md w -horticul tural -geel ong -egg nog -cataly sts -y all -woo ooo -to bo -shru gs -ev in -ser mons -nau tica -it in -emb a -coloni al -bow er -blin king -bbcc in -thin ning -stu mped -sh awar -psycho therapy -o ssa -dolce gabbana -bra zen -: . -stur m -ribe iro -nbc days -zz zzz -wozni acki -with love -mag ick -id l -func tion -car li -ai ya -sp its -sn fl -os m -mo ya -hi jack -great britain -a vey -âĸ¬âĸ¬ âĸ¬âĸ¬ -u ea -stom y -quidd itch -pine apples -spoon ie -sch rader -ram blers -knuck le -gra ze -durand uran -d har -âĻ¥âĻ¥ âĻ¥âĻ¥ -patron age -nieu ws -mee ster -ij n -i is -construc ts -ðŁį ¯ -taap see -death ly -back door -aero sol -wh c -t ss -of honor -bring it -athe dral -ate c -ðŁĮ ķ -v us -tokio hotel -speck led -scon i -sa under -ra be -fairy tales -e is -av ers -ab rupt -ðŁĶ ŀ -umb c -su ren -pfi zer -love yourself -in uk -ger son -en ish -the archers -te pe -solom on -sign ite -s new -rav aged -ra ul -hon ky -ci b -chester ton -tv d -neu tro -n lt -musth ave -lu vs -han lon -coinci dentally -æ ² -projec ting -h sa -digiti zed -di min -chilli wack -kick sonfire -id ad -haraju ku -du eling -discre tion -ten ny -progno sis -pitch fork -le vee -d hy -co ven -co pic -san disk -ilook like -be sar -ar ind -try on -nor way -levit t -eun ice -w pa -scan me -quin n -met z -land au -in wood -er to -cruis ers -craw led -chap in -car nit -angel is -fl an -chel t -bri l -na in -integr ative -here sy -d app -bn pp -ut k -stam os -sco de -pen ta -name less -ka is -in elli -ill ating -sa ina -renov ating -nut anix -grand child -bo keh -bat ch -b ure -approxim ate -몬ìĬ¤íĥĢ ìĹijìĬ¤ -zam bian -fallout boy -atl traffic -un mistak -o ink -je k -ik amal -emin ence -wor ding -unimagin able -mock ery -hy man -hand er -go onies -franch ises -collabor ates -she ik -immuni zation -fre es -ayatol lah -as on -un abridged -rec iting -jen winget -du ly -& â̦ -stra pless -han ey -chev alier -ber th -ansel m -acet ate -water park -vio let -s mann -s illi -of t -movi enight -do reen -collabor atively -ìŀ IJ -un confirmed -rubi k -ru di -ny knicks -longe xposure -k ur -vitam in -tra x -megapix el -lat robe -in deli -hoo oo -dream hack -dive st -deng an -cover up -comb ing -colum bu -wil kerson -lo la -flu shed -fi gue -dou in -contin ental -capit alize -baj wa -wind power -sha e -se asi -plan ks -pi i -n cbn -extin ction -ÄŁ an -tot p -rex po -oc tu -mo k -clo t -pick ford -osteopor osis -m alian -intelli gent -dimen sion -beetle juice -abre u -yo jana -touri sme -scat ter -ro per -pue de -mar tell -he sse -z ags -ta ch -sen schumer -montre al -cou ghs -ab usa -willi an -sur in -stain ed -north wood -lil ith -gun ner -ab ay -sen der -corp ses -u go -house gop -stro m -li ddell -ki ki -dir k -( {} -rela y -ma ire -cray fish -se da -id h -boy co -ðŁĻĪ ðŁĺĤ -sam son -post pone -n ra -es n -de wan -ber nabe -an thrac -ìķĦ ìĿ´ -under mining -sm v -gior dano -cor ne -ca stig -bal moral -peder sen -pap s -du e -ad here -vanc ity -ta za -t ada -le if -incre mental -house full -secre ts -eth am -ex es -r itic -keto genic -kerry washington -kean ure -du go -dra b -college gameday -co gni -ac ap -uc sb -nab il -corri gan -al ain -sh ale -s ws -im ti -bre ve -ar ai -pc gs -kaw i -har ford -gerry mand -casu als -an ish -th ap -lo aves -go alies -cle e -pash tun -ven mo -vaul ted -shi var -re gur -plum me -fun ders -t sch -rapp or -r ten -ple t -deb ilit -chil ders -black ness -black heath -az im -anthro pom -alco hol -wednesday thoughts -wan ker -lon goria -ne spresso -holland aise -artist es -ðŁij ¦ -singapore an -miam is -ent or -d lp -be ero -ak ka -united kingdom -unic orn -stan k -shi k -pres sured -person of -impre ssing -grat uit -grac ia -gang es -detroit redwings -century link -inter collegiate -boo ed -shi ki -opti ma -onthe blog -margher ita -ling us -en bc -don i -yi fan -r ba -fit test -dor ff -dep tford -dd g -woodland trust -j cu -er skine -dab o -re tr -pe eta -interpre tive -comman dos -son o -ru ffles -bi bs -mercuri al -lo pe -grim shaw -fairy tail -d ood -con nacht -bot anist -yam ato -wal ton -tri ke -sh ards -motor rad -mach u -fa had -demon eti -de h -cy ril -ch roma -bla zer -wau kee -the fan -sj s -si ro -sch iller -play wrights -geopol itical -cb l -c mb -brick yard -ëĤ ¨ -sul ts -policy makers -marx ism -el paso -dil ly -at tainment -watch ing -inser ted -bl ick -as pi -of course -la ois -a sti -ju illet -har ness -enrol ment -ðŁĻı ðŁı¿ -ðŁijĢ ðŁijĢ -hon ne -evo kes -curi ous -clo thes -tu lum -mo x -lo fc -ka os -gun point -carav an -boo boo -tran scrip -pollin ation -gas m -den ison -cam e -ãĥ ģ -obsc ur -liter ary -g ati -disneyland paris -ag ames -mn p -mitt romney -maha dev -hang a -ðŁ¤ ¬ -pre ordered -mj fam -ku al -in day -duck ling -div yas -bo v -af tere -" ), -wo bbly -transi stor -thom son -sc l -l ach -gur ley -fu tur -door bell -cau casus -ile ana -george town -be ste -ðŁļ ģ -ðŁĺĦ ðŁĺĦ -st ence -s ü -or ti -male c -islam ists -heart throb -crucifi xion -ali ster -wiz ki -cole en -app alled -sk am -sh indi -nightw ing -fix ation -tri vand -stir ling -sing ham -sh able -fro wn -cu ses -ano inted -tar yn -presu me -nu anced -meck len -ku bo -hl pf -funer als -flo at -wh edon -trans fusion -fc ps -af u -subor din -she khar -seaof thieves -plenti ful -pente costal -pa sig -beat le -squ ires -conge sted -som brero -ring ling -rein hardt -is love -bal last -annapur na -al ban -/ : -vi ent -tit ties -gro oms -du xford -dan vers -bab ar -ack erman -x factor -v ms -uniq lo -sporting kc -pen al -over run -ne arer -nad er -life hack -ko ku -cr pf -vehic le -un ners -serv o -n ta -i wan -h md -emp tying -de kker -chu bb -back yard -news flash -n st -ley ball -lam bing -jamie son -folk sy -cram med -polyu re -mpu malanga -karnat ak -ef er -w has -v age -till is -street art -nit rate -nas s -gues thouse -blan ken -save butterflies -photo bombing -pe bble -nbc sports -ke mb -jessi ej -human ism -ge ki -ern yo -dancing abc -all ard -al ford -ab r -shin hye -repent ance -lym pho -don c -di ol -no l -ठ¨ -work book -vincen zo -spra yer -mental illness -by te -ðŁĶ ° -sel var -puri fy -min zy -ce ci -cbc news -âĺ ł -win tery -toronto star -gar ret -cassp ernyo -atl é -al can -one more -hist fic -hat ches -ha se -gy ro -gamb hir -erik sen -afore ver -yl o -valu ations -sel tzer -nus ra -ðŁı ¹ -plagiar ism -per la -kun st -jon athon -inqui rer -black face -tri e -pas a -joh no -chicag oland -chi al -ag al -trin ket -fran tic -din on -cancell ations -un be -sch me -promin ence -o stro -com ical -e ads -weav ers -antwer pen -tri an -ec ole -bil bo -b su -cospla ys -conven e -cm te -barric ades -amazing phil -) ] -tat i -sh app -scis sor -north ridge -nazion ale -gro cer -eat more -ea ves -de sley -bbc weather -b vi -ðŁijıðŁı¼ ðŁijıðŁı¼ðŁijıðŁı¼ -youth day -thur rock -tensor flow -man z -katow ice -high life -deci pher -pig ments -mu mma -bu f -amar in -trouble shooting -snap deal -ol ar -jeffgordon web -dog wood -kat ya -itsenrique gil -bigo ts -ðŁļ ² -ker now -jay alali -in separable -x files -war at -mu z -mo ped -break throughs -bran ching -bouti ques -word sof -wi st -tren ded -ren aming -r hom -maced onian -keanure eves -approach able -y bridge -ve il -ty l -tamannaah speaks -sti f -photo friday -e ir -cav ities -proce eding -pix ies -key hole -eeee eee -ultimat um -stu ffer -mar sala -groo vy -dal ston -ðŁıĮ ï¸ı -vin ay -lat inas -ga is -fo les -be yer -app al -th ales -soun dof -moderni ze -ligu ria -jav a -carib bean -aa yog -wiki media -socio economic -k cr -im raina -hygi enic -the kid -stret cher -scot ch -pan cho -oo g -nat west -nam ur -ðŁĴ ĩ -re shuffle -o a -go m -es f -dill inger -bu sses -bac cal -sa al -person ali -n ought -lovers day -kew gardens -ge mini -du x -bud den -blood line -bi les -air quality -ìĤ¬ë ŀ -âĸ ² -razor back -londonis lovinit -konstant in -k vue -ima h -: ,) -spu ds -skyl ine -lux uri -loy alist -horn by -deb t -charle ston -more head -health day -ess endon -ef m -cow es -timm y -oxid ation -invest ment -inthe city -geo g -ale gre -ðŁħ °ï¸ı -waf er -ri bu -m tsu -fab ulous -zyn ski -va inglory -under whel -ri bble -men sa -kim ber -insol vency -gen ous -ck d -person as -na e -iv ory -dagen ham -ra o -mouth piece -mor ne -le mmon -gl ace -etsy social -chiranje evi -tv series -the u -sait ama -ging rich -flag day -b snl -au ra -ao i -hol brook -green ish -consult ative -win drush -water side -n ff -lovel iness -live in -for heroes -ðŁĶ ± -vo i -p ne -nol i -l all -horse hour -bre whouse -be mid -pd p -fron ten -fri eze -ar acing -æ ł -sub tle -sm ac -ah san -ts v -restric ting -li ano -is mail -fianc ée -ad oo -yn olds -pret ended -om yo -n aca -convic ts -battle ofthe -ðŁĴĥ ðŁı½ -re vo -kil lah -jad hav -gree ley -fc cc -ev in -y oooo -te al -shiv raj -rival ries -rel ational -pos ite -nct smtown -fi at -anam bra -aerop lane -# / -ðŁĩ¹ðŁĩ Ń -rein forcing -just sayin -incub ation -de u -( ...) -vern on -new swire -lan ge -hypo critical -ac ity -abu zz -star news -rhino ceros -rais ing -pm qs -pin as -ne cn -mtv lak -harry potter -att is -sof as -patho logists -oc to -mont mar -hah ha -far aday -ar murugadoss -appell ate -saku ra -imperson ator -er go -dog sare -bour go -talis man -pon dic -il legal -work flows -thn ks -sm itty -skin care -poin set -pic spam -man soor -exac to -ech lin -as at -alleg ory -y asha -u mc -re kind -rat an -pu ck -ip ur -humble isd -christ o -bel tran -az a -ab bi -vi sto -shin hwa -playo ff -pa ve -hun an -bush nell -) !!! -ðŁĺļ ðŁĺļ -st win -place tobe -non violent -lon go -kal ing -geo engineering -audit ors -è ¡ -uof l -tal ker -s borough -patho logical -or as -elm wood -bur l -bear den -b hat -relent lessly -men om -j alil -e bene -augu in -men tos -im d -fur sona -ras mussen -ran ting -kas ab -k lang -ide k -dy nasty -cbs thismorning -mt bos -ðŁĺ ½ -re worked -mali bu -lo ban -la zar -host els -do in -def ra -breit ling -bis on -an r -sa want -quin nipi -mcar thur -ally son -aler ted -y lang -tr ul -ron ald -pro ds -master son -hel io -get the -fire emblem -cup final -bre st -ðŁij Ł -y aaa -van quish -track ers -rosal ind -persu asive -new found -g sk -el ke -dev op -ci ar -buck le -aly tics -yah ya -ty me -the dailysketch -th aan -personof interest -e bel -atlu td -Ä « -tson ga -scari er -rise and -pass able -pa than -lib crib -im g -execu tion -yal it -re port -op ie -dun geness -dream home -ne ssa -monu ment -mill enium -dani sh -bert son -é Ļ -w impy -spanish gp -slic ing -n oun -la borers -ji hyo -f st -dad dario -bang or -' ." -pra ha -mau de -jacqu ard -hi ra -cook books -th wart -sor riso -me din -infe rence -gr inning -cor du -ano inting -íĺ Ħ -val do -ss oc -screen print -s ree -privati zation -national poetryday -healthand safety -er ner -the five -technic a -run es -per in -don ahue -bra c -ber nab -wizki dayo -ra bat -pyon gyang -lion el -fi da -cla us -bay are -aldub the -ðŁĴİ ðŁĴİ -suz uk -retro grade -moun ta -ma der -her ding -ðŁĶ ® -soun der -s forum -gre tel -ಠ¨ -pa the -edg baston -do h -bob bie -ðŁĴĶ ðŁĴĶ -se alife -s ree -mu gg -monte rey -no am -much os -lu red -t dc -superstar rajini -spal ace -show us -i go -faw ad -wa j -smash bro -jacob sen -dvor ak -regre tted -ral f -no b -lobby ist -isai ah -etobic oke -brant ford -bon ey -believ able -agre en -ðŁĩµ ðŁĩ· -sky fall -shilpa shinde -re spl -rail road -pau k -fun inthe -fi est -co cc -cho ck -beli ke -alli e -qu at -public schools -mar o -h ing -gloss ary -flo tilla -figu eroa -f illies -birth right -bar olo -am ag -é Ģ -tab itha -ra shi -pu tra -com or -ky un -il u -cad re -belle w -ab ort -sp fl -nick carter -naw ab -jol t -christma sin -carr illo -affirm ations - ª -yipp ee -as sail -à° ° -ske leton -river walk -per l -nin ado -mis understanding -hunting ton -holly woo -bel lows -¨ ï¸ı -unru ly -the weather -sw ar -ru stic -reggae ton -my ungsoo -muske gon -fili gree -czech republic -ch ch -un thinkable -vaccin ations -swasti ka -sol vent -ipkk nd -hel ve -aldu beb -raun er -pho en -jo ya -twi st -trade marks -spor tive -scor cher -razor backs -ra ik -infiltr ation -biow are -archi vist -ak ita -ç¥ ŀ -meek mill -kn ap -cag ayan -wh id -tu ll -sri devi -mis fit -ma v -imacele b -fo ils -cc b -bren don -bic ep -al ittle -thr ice -reg alia -ra bo -pain less -overest im -marin ara -klit schko -ig f -hr inger -gu st -captain swan -ar ay -ðŁİ º -á il -u day -co bras -caitrion am -u ig -hard top -eci g -bach mann -k wara -eric h -de bs -contra sts -turbo charged -rich man -provo ke -long mire -dilem mas -the blue -me di -ley park -fam s -e sport -bi ko -bar ium -aveng ed -allar dyce -aar hus -better call -king sbury -gn ant -friendship day -substan ti -sch ip -pep tides -mate en -اÙĦ س -tur alism -st ang -ra aj -peace keepers -li ana -exc ites -vaz quez -us gp -travel ing -pill ar -gu h -competen cies -ar tur -vo lo -jer ome -di adel -den ny -av fcofficial -u dd -mo dy -mini str -ge min -cryp tonews -chitec ture -z infan -super fast -st ace -saj id -kra zy -ðŁĵ Ģ -philipp ians -nis a -book sellers -Ä ģ -victor ian -the body -su pt -salmon ella -rat ty -jo gger -fu biz -cree ks -bled soe -ad ell -zinfan del -trape ze -si z -sho eing -le pro -ja vid -custom ed -sa ath -quar antine -mis sk -detri mental -champag ne -bi k -; _; -wa f -tiger woods -star burst -rach man -ok ada -new day -ly ca -der rick -anec dotes -stemc ells -pas cal -hu sain -clai borne -bol son -apar te -ai pac -wi k -w ch -stimul ates -morpho logy -logi stic -indom itable -gal oo -comm end -chaw la -' ( -tru jillo -lown des -log ics -liber ating -as am -arrive alive -aro ons -а н -shepher d -p bc -li po -er l -citic bs -cc sd -caitrionam balfe -br fc -se ki -it out -ish q -dil do -ati k -amar inder -tal kie -state hood -ca be -bos well -ðŁļ ij -wer th -va al -sky ping -ear phone -dilig ently -co chin -ap hi -am ente -timesof israel -sel assie -road runner -ok ay -ny der -ni ven -la ir -ce ased -categori zed -ðŁĴ Ĩ -u fo -tele scopes -om ania -cam ino -b illa -aw ning -Ĵ ï¸ı -ðŁIJ ħ -ðŁįķ ðŁįķ -wom ans -re iner -peace building -neu ter -dj ia -cyber bullying -cs x -constitu te -b the -zam bo -on ta -cal loway -steel head -one team -ini ans -i zzo -abor ted -se to -maldon ado -good day -fil mo -bre ck -hang outs -gibr an -z sa -whit more -stru p -short story -jen i -energi zing -con vening -check mate -batt en -amazon in -alfal fa -star ks -q v -ma eve -le fish -ide vad -earth capture -bn buzz -bau lt -amate ur -us l -twitch kittens -tri ms -mb bs -kodi ak -din ky -choreo graphed -ben son -ar aw -ÑĢ Ñ -real tor -fun facts -f nf -d mp -ben ue -baye sian -the old -subscri bing -ra king -official monstax -g ak -drink able -detec tive -trilli um -snow men -shah rukh -eli ds -dismant led -mo dest -lud acris -can trell -ðŁĶ Ļ -âĿ¤ï¸ı ⾨ -Ú ¯ -yw ca -tb adly -sa ha -por tof -lu cre -la ken -ha skins -vinyl records -p ima -mol o -ign ited -gau ges -f sd -ðŁĽ į -mat su -g ant -hen nes -h bo -bu sta -se tups -scor ner -reli eving -neur on -irish man -fo gle -d bn -summ a -pi ppin -micro finance -fanci ed -chair woman -brah ma -fal low -anti social -wi a -t ments -ram i -ra iney -mind blown -ly man -afgh an -billi ard -author itative -ye hun -sput nik -bombard ment -nl traffic -mar ic -ma vis -in nov -central park -bli ge -ry de -plun ged -patho logist -host ility -groove musicapp -enti st -em be -chi ba -chast ity -boul dering -bc l -accumul ating -ðŁĴļ ðŁĴĻ -smo king -sm town -pre ssie -k lik -je une -ikamal haasan -highe reducation -e music -ðŁĺı ðŁĺıðŁĺı -war ing -up c -stra chan -sp itz -rober son -nick laus -mue ang -interpre ters -cy c -casspernyo vest -cam acho -sl png -pent icton -min hyun -ki ah -i vo -energi ze -dou gal -alo ha -winter wonderland -ir win -i ar -handle bar -gal lows -est ro -en vi -trivand rum -sty rene -medi ums -gains borough -dr ina -dis agrees -d la -aud acious -wizard world -us ac -subdu ed -slaughter house -n wc -macchi ato -ham er -gat os -debun ked -contact less -c ing -z f -ver meer -trick or -opul ent -is ure -gaz i -filmis notdead -canon uk -bam ford -ske chers -shi ver -ko gi -h mi -gh ats -cor leone -su g -som uch -lo athing -l int -foot work -en list -du rian -canonuk andie -ab ot -x dd -jar gon -ban di -:) " -the only -sm n -n ha -looo ool -idevad hikari -h bl -fol l -traffic alert -kau f -dd p -ad in -so d -rom ford -re strooms -bol linger -sc cc -guardiansofthe galaxy -ash er -api ece -ÙĦ س -rod man -ren z -proce eded -hul kho -equi pe -whit worth -visual isation -under pass -thor p -tae hyun -power fully -pag ani -memor ials -mar vels -intan gible -win o -pe o -o der -ilo vel -gil christ -deep ening -chrise vans -chi ka -br ü -persi an -jer i -ful lof -em manu -cu pp -awesom ely -alvar ado -woof woofwednesday -me ticul -info wars -friend sof -fair mont -cov ina -cma fest -bul ky -agno stic -far ne -anton ov -ta pi -ofe x -men tored -e pps -a had -ãģ ķãĤ -treas on -ro dents -riz vi -pari shes -mal am -ka sey -appreh ended -absolu t -tech ed -pitt sburg -o real -mar itim -li us -laun ce -correspon dents -wat ery -s jr -ron ey -neta ji -glori fy -ar son -âĿ ķ -Ø§Ø ¦ -wood block -rt p -m th -iam jericho -hu ge -gh at -car go -a edt -wig more -shutt les -retribu tion -pinot noir -back room -abhi yan -ðŁĩ§ ðŁĩ· -sir l -se gura -latin america -ex id -be aker -arch ite -wo z -un load -student life -motiv ator -ku ta -green ock -go zo -con st -respl endent -e mulator -atten u -the zon -reser vo -mc gon -in dah -ga it -domen ico -do sage -ant ler -oh ne -inter ning -cor mier -ci ence -å ij -ss ur -red hat -ou ach -high score -exclu des -ear ls -cal u -simul ate -mur frees -kru g -gat to -christ a -an h -start shere -sin n -n wo -lo ween -g lynn -flo rentine -dra go -spi kers -shar m -north wich -liquid ation -are llo -walk about -ting ling -public art -on earth -mu ker -interrup ting -il va -de brief -cancer ous -big sean -week night -t cc -gene si -el ka -ci pher -cali ph -ti eth -re produce -koo kab -kel lo -aldub x -shoe maker -imagin able -าภ¢ -w bu -th ay -strato sphere -red stone -pla s -pimp in -mi p -lu te -hatties burg -hal lowed -fen wick -tweetapicture youcantexplain -pro gro -not ley -jaw line -dev ouring -resi due -redon do -mm t -mccaf frey -human it -gr m -dou ghty -ë¦ ¬ -wit te -til bury -men sch -intellectu ally -col ada -ar ad -ðŁĮ ¤ -understand able -gu lati -ghi story -ase m -ram ping -pr is -mt p -ic ul -gerrymand ering -fan nie -dealer ships -coc cus -carav aggio -ameli e -ra ger -twi sted -succumb ed -spino sa -ku mari -iu pui -horn sby -cro sse -c fis -t ingly -ss ohn -sab ers -red cross -over priced -ni sha -kat t -j peg -internationaldayof happiness -fau x -ym c -ug i -tn z -sw irls -strike out -st k -shred der -ninado brev -hulkho gan -gh ia -discer ning -bru yne -! .... -tac loban -r ind -major ca -le uk -grand mothers -g bu -buck inghamshire -ðŁijĮ ðŁı½ -ìĽ Įë -âļĵ ï¸ı@ -photo synthesis -jugger naut -dan te -stick y -soft bank -im mer -ha ber -! "- -y ue -ru in -id m -hing es -cricket worldcup -wisdom wednesday -tra xx -old skool -now reading -mar la -kas per -gersh win -dugg ar -ber mond -yid dish -tayl ors -mus graves -ft l -dun yan -chrome cast -ðŁ¤© ðŁ¤© -nc p -mick elson -mart en -mahar shi -contracep tive -à » -vit ae -ten ni -stal kers -mirror less -excav ations -cnbc tv -christmass y -cav ed -ste pan -sep p -oo dles -âĹ ĭ -vil les -ro ving -pan am -nen shi -l ö -bun n -âļ¡ï¸ı âļ¡ï¸ıâļ¡ï¸ı -w wa -kae mia -pre print -magi strates -kam ikaze -ka jal -inge x -equ ator -box ingday -aw ara -ser ye -not ched -membran es -mar an -humili ating -some one -sno qual -sn j -r pt -pries thood -man hole -bur ke -ðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺ -ug c -pim ple -n aco -made inthe -al em -zi onists -wau kesha -nip sey -march and -// /// -⼠Ħ -to or -new ham -metamorpho sis -mag num -don ning -ci vit -bn k -v oot -the v -sar nia -sabbat ical -pa ppy -on fire -leon id -go ff -gi joe -gel atin -garfun kel -camoufla ged -air ship -paras it -nca ad -dor man -chann ing -ce bit -at ina -ðŁ¥ ħ -weare alive -rall ye -nightly news -kiba athai -fate h -codi les -amp he -yz f -su man -dm z -colli ding -assembly man -à® ¯ -year in -to ga -po tions -patric i -matter horn -ma so -kath thi -kale b -hashtag roundup -appo inting -ac g -stro be -re twt -o don -ming yu -la z -ci p -alex ey -shradd ha -schoo lo -ma do -gh ey -curren cy -mis sus -ingh ome -glob alist -di vo -cbs la -be amer -pier son -nb supdates -beau coup -bb it -anom alies -rally cross -man gan -ha zing -bred dit -sony alpha -out source -haram be -esp ys -bu x -bol and -bench marks -as ka -time travel -protect the -moor head -kar ate -jag er -gri ffey -ex port -craf ty -aw ild -arche ology -and mail -pad u -ham i -draf thouse -de ane -yugo slavia -wall paper -tyran no -quar k -lic ences -admit tedly -y re -lau rie -fore sight -al yn -ðŁIJ ¥ -yogy akarta -war gaming -tyre se -romel u -revolution izing -lil le -ing in -ah q -xi ao -ti ffin -teacher sday -sau stralia -mid western -gel e -fin chley -fantastic beasts -cla s -âĢ £ -mountain bike -l ates -ðŁĶ IJ -scu der -re direct -her bie -ge sh -frat ernal -ran chi -modu s -mar bled -g ans -f ss -compli mented -clean water -um rah -rock in -mal achi -lasag ne -gee zer -f ated -du be -de jan -as ante -anti semitic -shan ed -rou sh -resent ment -pokemon go -mi ths -catal ysis -sor cere -rati fied -jewe led -go swami -cho ppy -bra r -ar ay -a wh -zo omed -su breddit -stric ter -short cake -onlin ecraft -nes bitt -nepale se -knick ers -hotro d -d pm -bc b -ba ren -agne z -âľ ¦ -u co -s best -k dvr -ðŁį į -param ount -mar lon -machine gun -it ers -do berman -attack on -ac orns -ro stov -re gained -py r -out board -am ol -re sa -ig lobal -hill on -f kn -crowd sourcing -rc p -lo rena -e ow -d mu -ðŁijĮ ðŁĺį -tony abbott -sw b -hu blot -hom mes -gal vin -vat os -un biased -terrac ed -oc ta -mel hor -ilayathal apathy -f lead -burgl ars -electr on -cam brian -aure ate -ali b -under valued -t mr -our ce -ja er -ous al -len oir -ðŁĮ Ģ -than et -r aring -quix ote -loc ator -la porte -endocr ino -change makers -bo dh -so hail -kam il -fu sions -compri ses -ranger over -pau lie -mush room -go shen -fr nd -erc ise -bur t -strath clyde -north umbria -keepp ounding -k cal -htg awm -german y -far thest -eng lewood -block buster -wor shipped -geor g -condu it -weir der -under water -spe y -shi pp -sam aj -fon ia -ðŁĶµ âļªï¸ı -çµ µ -yehun dinon -well ington -s ood -dog gies -wa ites -ss ac -se ep -reas surance -ram sgate -di us -con fer -at too -ìĺ ģ -vaness a -us as -observ ational -na st -mis carriage -io i -ec up -af oundation -live at -gram ps -gigi hadid -end am -bu z -aspe edway -ren é -pin hole -my day -mendel ssohn -k bc -downey jr -ti gger -spe x -radio show -ft r -Ø ¹ -the series -shivan gi -senate majldr -oak wood -i mi -chuk wu -asi a -witz ki -see ley -ro deo -pin point -mod ded -home m -gor i -gb pusd -un timely -sh atta -severy where -nic hole -den ce -ðŁijıðŁijı ðŁijıðŁijı -whit t -reali dad -kin en -in or -fad er -dri fted -def leppard -ä¸ĸ çķ -sling shot -ka iz -cer o -blac kex -ap na -aaaa aaa -ðŁ¤¦ ðŁı»âĢįâĻĢï¸ı -ver acruz -she ph -pi awards -à´ ¿ -will i -visit norway -the voic -swee ties -royal airforce -pic nic -lin z -har wood -cla rendon -super foods -stri ves -ridic ul -incar nate -absa prem -toronto police -ond that -loo sen -de ws -je st -ir cle -chu ms -bri stow -zan te -mulla hs -mi as -ha bbo -à Ń -z aza -war lord -shab ab -sero tonin -ren berg -on coming -ex cre -ev ada -b cos -un dying -special ised -sirius xm -ques adilla -open science -kar olina -dil la -u fa -mir chi -juventus fc -j sa -dio de -command ed -cbs baltimore -be ys -as kar -art collector -am ira -who dat -t wn -po ppers -bl ame -u mber -sword fish -lam ini -for america -fal cone -envisi oned -der anged -wh r -t fs -seag rass -se fton -on di -kemp er -ju do -do pest -disar mament -antag onist -ali m -ak p -sm er -risk management -oo c -fan ni -eclip se -curric ular -ca stel -bal le -ate a -ar by -te quil -k ander -goal keeping -cra igh -bb h -un itarian -maas ai -just ine -be gu -arc gis -sr b -south all -mus ée -juli anna -exce ed -auditi oned -aneur ysm -ac customed -thi erry -syl vie -itu r -humming birds -fortnite game -ent ley -cro hns -cl oning -chak ras -c ely -== = -whit er -rose tte -phi r -ko bayashi -kir kle -gri st -disproportion ately -corin th -bu c -av aya -we iz -vo i -s iti -min ha -meticul ously -k si -herring bone -every one -work man -north shore -mor dor -ir ving -hammer ing -scien cen -nine ties -mar shawn -l illie -for tu -f elling -cro codiles -wi den -tiger pride -rou ss -pl r -os ab -o ski -gu zz -fen ced -end fgm -din es -tr in -sto ic -my er -k ass -k ama -eye glasses -bol an -bob marley -ation ary -air tel -pro ye -mad den -inhe rently -bush fire -ble acher -beautyandthe beast -re ak -op c -lex is -ho bi -eu genie -bar ter -bar bra -ĥ âĸ -à § -wa e -po ppa -long standing -indestruc tible -embar ked -co ppa -bel los -teslamo tors -influen ster -immac ul -hav n -chu g -apple bee -mal lo -je di -er rr -ö zil -morri stown -mo bbed -gun ter -foo tie -e ce -bun d -u ae -so ka -ra bid -lu pu -destiny thegame -class men -bo thers -ar ah -ze phy -mini stering -he ire -fo caccia -distric ting -cros stown -ðŁij© ðŁı»âĢį -sop ro -snu ggled -sho al -ch kin -ari anna -thu ggin -thor pe -mother ship -f end -cam ille -arch i -tor ches -si smo -dome ter -cur tis -tar ragon -oxi di -m ellor -i rena -head y -entr ances -bre mont -bn ppo -tro tting -sang am -no d -daugh ter -cold well -buff y -bbc proms -ann once -tt tt -em ce -culin ary -bre scia -bor uto -big p -bettercall saul -ven er -tor neo -rodri gues -de pra -stam il -ðŁı Ħ -salv aged -madein america -fu gee -comic relief -anu eva -âĺºï¸ı âĺºï¸ı -you ve -rooster teeth -mur thy -lan za -ja xx -invo ke -ign ite -fi ori -boston globe -ðŁı Ĵ -jesuschri st -cgi ar -ðŁĹ ŀ -w fd -s gc -kow loon -deloit te -the cat -sval bard -rickand morty -nun o -jun cker -implic it -har sha -ghou ls -end rick -bow es -te y -te ign -rin ks -o ce -metaph or -ish ly -intern al -in clin -day out -sil age -par ang -ny n -murfrees boro -k org -cin der -ba ji -tell in -mic rone -kang ana -id x -ðŁĴľðŁĴľ ðŁĴľðŁĴľ -te ca -sy co -madhyapra desh -expe dia -clo g -av ol -u mar -the chive -se izing -pri v -pav ili -p els -lin de -jam al -de walt -alle ys -ì§ Ģ -summer reading -orphe um -gla sto -europe antour -ci gs -beat riz -tonyabbott mhr -par le -kil au -hit ched -bere a -be holder -bas sne -arro z -í Ħ -syn ths -nfl combine -new stv -; ;) -y ams -whom ever -tor un -they re -south west -shru g -scot landis -pione ered -haul er -h ss -dav it -be fri -tro on -se pang -lo z -ea p -ay len -wri t -toile tries -lac ey -engineer ing -ch vr -wan ted -w am -silverstone uk -si al -sha sh -pe le -pan to -gor dy -g st -âŀ ¡ -upper deck -nat chez -mach e -collec tables -b cuz -ðŁIJ ij -tin ubu -snow shoe -moham ed -mal divi -mal den -thankful for -royal ascot -private equity -nine teenth -hus sey -bo ggs -zin ski -ter pen -son os -radio therapy -quic kie -pro vement -north ward -inns bruck -flash mob -expe di -boyco tting -rd guk -o ole -mar chers -mand u -griev ances -diss on -call ers -ble mi -bill gates -suni versity -sen warren -ru d -ros common -palad ins -monday thoughts -beer day -al c -n tr -kag ura -jiang su -flow ery -conce ding -che red -an ay -ĵ ãģ -âĢĵ âĢĵ -resto re -ny ard -muzaf far -ine za -esp anto -cannabis community -smithson ian -s london -regul ates -making adifference -at v -à¹ĢภĽ -ross ini -re settlement -ini k -in the -fo t -color ways -ak en -ur qu -under pants -n ns -medic ine -l lo -ik an -g acy -em body -ef ter -ban j -ar f -âĿĦï¸ıâĿĦï¸ı âĿĦï¸ı -ts r -mr ss -fi es -cor az -ago go -then orth -resolu te -nas l -magaz in -gr rr -et weets -business insider -bench marking -montmar tre -home stuck -he it -e chin -ac ai --- " -u chicago -ph ra -m clen -cumple años -clo sing -bald win -par kes -orni tho -mi on -art sed -outer wear -farm to -endu res -dor king -ai i -per severe -o ar -knight ley -ho hoho -democr at -bernabe u -ap la -yam an -veterin arian -tin the -sonsof anarchy -shad er -hawaii an -ge tz -am bb -ðŁĮ ħ -u mu -that smy -one day -door n -cr aters -cn ni -ast ate -council member -back pain -ad r -âķIJ âķIJ -stra ined -sas su -globe andmail -geta fe -fri vol -fanta stical -allen de -thezon ecast -shipp uden -saras wati -rou ge -pu pper -mo dena -gerard way -gaz elle -du sse -dog friendly -ð٤ĺ ðŁı¾ -t fi -sam mi -row dy -kinab alu -jagann ath -u ff -so da -sg d -mum taz -glo bo -faf sa -b ced -visi bly -miner al -di ra -bees wax -shail ene -presti ge -dissec ting -bm wi -b ich -an tic -wil hel -tax scam -son tour -or am -north field -k tv -her ds -fu jitsu -es v -et ch -bro ms -borough s -anchor man -smash ing -j mc -fra ppe -ct l -ðŁĵ ī -un ger -screen er -nbc nightlynews -lay zhang -hugh jackman -devo tee -defici ent -charli ze -ðŁĶ¥ @ -water crisis -vish nu -t fm -sof war -mau ve -ken ji -datemy family -cer u -bear cat -su zi -o ad -leit rim -iso de -cre scen -astro physics -wc co -w pt -tou lon -to pple -pu c -pe ay -ninj ago -manufac tures -dissi dent -col vin -u ist -tra i -t ola -swan k -splat ter -robbie williams -nu ps -mcn ulty -lacro ix -bati m -ðŁij § -ðŁİµ ðŁİ¶ -th elife -gent ina -cl at -( ), -you gov -yehundinon kibaathai -us g -re branded -mar mite -ludic rous -kc co -j ft -hur acan -huck leberry -at ingly -ðŁĩ¨ðŁĩ ´ -the storm -rec tomy -monstro sity -memor ies -kitt en -en a -dough erty -bt b -are g -ðŁĺį ðŁĺĬ -sla v -moon lit -mad d -dis advantage -comm enter -bram ble -bor rowers -bel ow -staun ton -sali va -kwi k -ken na -fal si -edge water -de ur -d souza -d me -contradic tion -stan ning -sch loss -sc tv -i aff -golden eye -archi e -ali khan -al brecht -aa as -slo west -in scriptions -girl guiding -chu ca -ðŁIJĿ ðŁIJĿ -âĢĶ # -styli zed -sam ford -ph nom -long view -jy j -bu ford -as n -wall y -li en -decad ence -dan e -bar uch -ry land -halli well -g tb -g out -fou l -f ye -cur lew -con golese -bhat tachar -ðŁĺĤ ðŁijı -sla ve -gli mmer -d alla -cy l -un fccc -tram way -ti gre -sin dhi -ob ac -ben et -beef y -strat os -pregn ancies -plan te -el ux -chennai ipl -ภ« -wa hab -out kast -manit ou -lu au -io u -hock ney -contre ras -baby sit -uh cougar -mobile app -maria sharapova -expect ant -consoli date -ton al -steep ed -kaz i -ih ate -fl acco -e show -catholic ism -ar adio -sack ville -mackin ac -i was -english man -cantbe broken -bu ble -united fc -ron de -pack er -bristol city -ãĢ ° -sol s -schur ch -sak shi -meto pera -me ang -i vor -ech l -ba an -ðŁĴŀ ðŁĴŀðŁĴŀ -vin ho -sm ttt -prince sa -por trush -aa o -= ] -profici ent -lick ed -ig nis -head lined -fast ball -do ss -Ð ¶ -squir rel -pro c -plan ned -izom bie -itali angp -hu may -h town -co bh -bar un -run g -res ford -mo jo -adop tions -t la -shar d -pri vacy -ko in -don na -ceph alo -cent aur -bau d -ar cel -apol i -ak en -ç ´ -wit chy -tic ats -spo x -real food -mac e -fi fe -be ch -ðŁij Ļ -ÙĪ Ø¯ -seac rest -renfre w -pi xi -neu f -entertain ers -co oney -cll rs -bo ing -well and -the office -nad ine -inspired by -dilig ent -devi ant -r pf -lin ens -k news -instap lace -em itting -dur and -uuuu u -strö m -sp hilly -o dia -nd tv -jab ba -ing t -d ceu -co et -cl v -pon ders -parliament arians -kei sha -k illi -jae hyun -c ph -an un -sho el -ly tham -em bi -break out -anim a -faith fully -cu pe -ceram ic -am way -wasser man -scotlandis now -me tics -instaplace app -g mc -ðŁ¦ ī -water proofing -resi sts -par quet -go c -brave heart -qu arium -pom ade -pit stop -ng k -for g -bankholiday weekend -resi dent -kol o -hel ic -go lov -found ational -e ine -de tain -cont end -bb f -ðŁĺĬðŁĺĬðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬðŁĺĬðŁĺĬ -ãĥ Ĭ -her ts -ðŁIJ ¦ -visi oning -sk storm -la vi -ran ia -go h -fas cia -dunyan ews -chidam baram -bra zz -bain bridge -sp ook -sno d -silver stein -sav ile -plat onic -msk ajal -geta ways -fri sky -explor atory -u ll -ton ia -sy r -stru ts -spl an -rec tion -oll yofficial -n elly -malm ö -confe rence -clar o -bi bby -topp scards -ther ight -mat ricul -kajol atun -gl enda -church yard -bt m -æ ´ -utah jazz -p sat -high line -disu sed -al mo -af t -âĻ ¬ -troubad our -mull an -lie ge -k oma -he wson -with a -vent a -t ched -show me -leg ali -gift card -boy band -al las -vir at -spacef light -ou ture -lie berman -li kel -i sha -head way -ear hart -bhar ata -å £ -th as -rec ce -pa yo -gab or -foun der -cold war -car pet -ag ha -park nyc -mis a -li mass -len g -infin it -indeb ted -deep state -bloom sbury -ðŁĸ ĸ -yay yy -toy story -sb g -n wa -lar issa -gn ar -resi ding -penetr ate -fr itt -ex tro -clo ak -sens ations -rang ers -pur ring -mskajal aggarwal -hi ram -en vious -de stru -and heri -agron omy -ä¸ Ń -to va -lock heed -face timing -bon ny -ab user -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -ro derick -out perform -ne pa -ir in -explain afil -buffalo es -ðŁ¥ ģ -uno dc -trespas sing -to h -rock music -dolce amore -on eness -lob sters -in tr -hind sight -enlar ged -brit ons -ago d -va id -tt l -there after -so ir -nat ale -ecor ps -chipot le -yo k -ga h -al va -pic s -ow sky -cin ta -anec dote -ðŁĺĽ ðŁĺĽ -rein carnation -ple aser -ni q -mackin non -can ber -wa he -ur bex -ud inese -selfies unday -sa hel -extrac ting -champion ship -buzz feed -/ £ -yasi r -smi thing -rela pse -libr i -inclu sion -fab ian -!! ... -ðŁĻıðŁı» ðŁĻıðŁı» -ne der -gu sh -blen heim -âĦ ĸ -yugi oh -seh gal -po dol -je thro -jama al -g oun -co zy -bri gid -v lc -roc keting -pin ch -maggi ore -ken a -k ony -wi ke -whistle podu -stupi dly -liv able -lion heart -lak me -jong dae -ge en -electr ics -cyani de -arc ades -to kas -mono poli -mar key -dimit ri -dale ks -convers ational -aj c -tes bury -ste pper -ri as -repl enish -ker ou -imel da -ig eria -ðŁĶ ½ -une qual -sad dles -reci fe -ms f -mal practice -io dine -dar ko -stu esday -ho dge -dc f -wal kin -spe op -pe ering -okc thunder -jac o -ha snt -ge ico -bree zes -berea vement -ðŁķ · -lu saka -irish rugby -el aw -tyr rell -thunder up -inter acted -goooo od -far oe -ver mouth -tren ch -l rc -east leigh -copernic us -ber dy -special ty -prostitu te -po ftheday -li ster -gry ffin -ed f -bra ith -boo kies -bid den -ber nier -ac ause -was s -to ku -rit u -internet marketing -electr ons -akan shag -tv r -sni ps -pac s -mu ss -ho da -fire power -drum sticks -childhood cancer -scri bbles -off i -vo gel -t gi -star s -spo st -se atur -koo tenay -gy al -ban ff -ap ush -ad mk -sp op -ri stor -nit ish -mel lo -kat erin -goo g -aw ol -ai ley -ãĤ ļ -ภĦ -wal kies -te j -jar red -g ley -" !!! -ø r -sh andy -parake et -me tering -man ju -lets movie -j ls -j aga -en shr -of s -honey bee -fire truck -ad f -an try -tom cat -p russia -li sal -ew es -du d -boy d -analy zes -real life -head teacher -a vie -yu le -wal lo -sha g -m signite -deli rious -cool in -apo s -w illa -villa inous -hac er -dece ived -cv n -wind ham -ta q -mplo tbadly -mee han -man ner -macgy ver -de pau -beer co -arch it -over looks -k ard -g litters -embe zz -dan k -atro city -ë¸ Ķë -è ĭ -tam u -sul timate -south florida -nendor oid -ge yser -di z -al ston -sul fate -ri alto -revol ve -o is -ing ress -goo od -ask mrn -waste ful -ver mic -un drafted -so as -ici c -god dess -gill an -carpent ers -stan hope -scul ture -r sr -cr ème -bri en -ðŁĶ ĵ -ob v -hi karu -flo rence -flat ter -contin ual -art vs -ðŁĩŃ ðŁĩ -z ale -ww d -ut ely -tre lief -tip ster -sto tt -st pete -muss olini -mc b -jun o -an aco -pra deep -ect ady -ãĥ ı -ঠ¨ -z uk -twe aked -hu huhu -chatur bate -bo j -a jax -subhan allah -snar ky -rw b -rever b -hu mes -gilmore girls -cel ine -âĸ ¼ -rak sha -m to -intelli gen -fla pol -co pia -can isi -bible verse -tre vino -trac i -thom e -pharmac ies -gram mar -en sign -w miwx -swach h -ra gged -par ian -p ff -gro sso -adi eu -âĢĭ ' -zor ro -swin ney -osc eola -nigeri adecides -n ma -mm d -insomni ac -in design -harley quinn -full time -er z -cer sei -male k -mac aw -cling y -beero clock -band han -ðŁĻĪ ðŁĻĪðŁĻĪ -gulfstream park -fic he -entro py -ci led -amaz e -me us -ie v -emb lem -em ate -donal dj -ban yan -akanshag autam -save america -ney mar -missi ble -leav en -capac itor -bod hi -slyther in -explainafil mplotbadly -em re -e tru -cohe rence -schen ectady -positi onal -nai arind -lao gha -jay z -bro ward -bat tista -at te -apple event -al g -te ary -replic as -polari zation -mor ton -inste iger -cotsw old -brook line -amphi bian -who res -parti san -monogram med -low land -lewi ston -ger o -cam in -boy gan -wear in -unex plained -m ke -her tford -hat cher -matu rely -i be -ac tin -wol ves -d fa -chromato graphy -arri va -sham rock -role model -legendsof tomorrow -prat chett -iom tt -franc a -makas sar -eliza bethan -cav an -ir re -ill ini -gre sham -g é -ero yale -ant m -ðŁ¤· ðŁı½âĢįâĻĢï¸ı -u vm -network rail -lo tz -la ston -inter com -conduc tors -ai p -ðŁĺį ðŁĺĭ -thin ly -mu te -jun myeon -epo ch -black cat -bir thing -tar pon -stil ton -robert downeyjr -qu int -philosop hi -kar gil -fu elling -corp gov -aw scloud ----- -> -park run -double tree -co ted -ari vera -the beat -sapphire now -pro tools -par chment -ondthat cantbebroken -ni mble -ho ts -han di -thir teenth -pow ders -musli mban -lor is -hi paa -domin ica -caramel ised -pan de -miami herald -medic are -jam est -invasi ve -half marathon -configur ations -box ingh -aug mentation -ag c -ðŁijĬ ðŁı¾ -vil leg -un natural -shoul der -roo kie -ration ale -norther ly -motor cade -mi shap -maker faire -ki ernan -ken more -jo em -instru mentation -ge stion -di ggy -cell phones -ör de -var ad -toot sie -r mt -parkin son -pakistan zindabad -ne ct -horn sup -gurru choudhary -fiel ds -cri m -blo ated -vec tors -t pu -s that -r pg -pu d -kl out -kau litz -pa sto -mar ous -man ge -kor ra -ko d -gor ka -d tc -bed lam -b anco -v cr -shakespeare an -sch atz -der ic -baby shower -mer cat -factor ing -£ £ -gi sh -dri zzled -chvr ches -cha im -! ". -tex tile -mo ssy -as v -vi enne -un suspecting -qu b -gt fc -cor tana -bal inese -v rc -un locks -prox ies -dal er -al issa -ìĿ ¸ -spon dy -s vegas -my stics -mis c -may wards -marci ano -escon dido -accumul ate -w acker -til da -sp ines -na ina -mit b -h cl -coach ing -bra v -tran mere -suicidepre vention -story lines -spin y -reci eve -kri sty -don key -cur a -comp ag -blo m -articho kes -wee b -wal luk -ssi mo -radi shes -mechan ic -aj it -ag olf -ðŁĺĢ ðŁĺĢ -wyn onna -pax ex -kon o -âϦ ï¸ı -trip tych -southampton fc -old ham -god z -gibson guitar -e ka -diol ch -cu ddy -che ws -æ ı -watch list -u so -pred snhl -pad ua -of an -never forgotten -kab hi -italian food -har mac -cra g -clo gged -b ong -pay ed -norman reedus -cre ature -wc u -valu ables -run aways -cooper ating -co pious -si der -senjohn mccain -da il -uof t -under dogs -speed ster -sk ye -royal academy -prieste ss -j illian -h sn -am ey -that ched -kau l -il ver -dwell ings -dur ante -ap ache -wo burn -tanz anian -soci able -saatchi art -s wor -jo ann -ji ji -can ister -* __ -wing man -vit ale -osmo sis -organ ically -nom e -hand cuffs -ffe st -eup he -creep ers -* ! -won woo -spla shing -sear th -roll o -lud hi -head ley -fleetwood mac -differenti ated -de thr -brex ite -al drin -zi pp -sno b -sf n -hum mel -bu ona -af ox -wh ok -pilo ting -ml i -j cp -gru mps -danc er -c mg -addic ting -ad dition -hiberni an -g ham -b ame -ðŁį ¼ -sta tham -smugg ler -n tu -morning show -j ö -in love -zap ata -souther ly -shir i -obam as -letch worth -he yy -g bi -et or -ba iting -abund antly -rock port -ph ics -metall ur -dor nan -t lt -o den -lets football -kay leigh -ir ate -goog lec -fa ked -dwell er -du tt -ber k -robb o -lot ine -i yc -hey man -âĪ Ģ -me cum -jam mu -defence man -carth age -moham ad -ill an -d hol -brown lee -ven us -rapp ort -mck el -head wear -got ta -âĺħâĺħ âĺħ -we es -ven kai -n gr -m twx -jai hind -berk ley -ax eem -ye ager -w pial -matern al -gre ys -for love -daily mail -cincin nati -chau tau -awarri or -zü rich -ww os -stream er -peri shed -pearl harbor -pe ggy -online shop -me cfs -vish was -sre es -po re -ichi go -ar gento -wa ive -proble m -pat ched -nowh iring -k pk -fc porto -do on -whopp er -tri bal -sier ran -por te -bassne ctar -af ol -a sted -wit ney -inst alike -del ine -cil ic -bud light -better ment -ab lu -pe corino -and ria -ìĽĮë ĦĪ -ver t -uni er -tic elli -re max -main street -kick ball -coinci de -book lover -aver t -south america -sav ille -oriz ons -kun le -kul karni -ger ty -for better -eil ge -dimin ish -mcen roe -mb poli -kn x -im possi -grat u -doppelg än -cre atine -be safe -ðŁĴķ ðŁĺĺ -sweet water -reg ine -py aar -meh di -explan atory -dr ill -deco ded -danger ous -ci ab -uk business -oo b -mit re -metr on -kop i -gros jean -franch ising -cow ley -van qui -theologi an -re ho -publ icist -pistachi os -local news -ge ck -dor ks -ch h -ay res -river side -in continence -fear some -aster oids -men is -etsy retwt -buck ner -tr ing -tom ar -si ste -aspir in -âĽĦ ï¸ı -reclin er -product design -chim neys -alu it -å º -ti ously -r wd -pe m -nickel back -mclaren f -ly ra -inv ents -cu rio -ciren cester -and gold -� � -ãĢ IJ -ठ¹ -time sup -seag ate -purdu e -pul ley -pepper dine -ali ya -à³ ģ -z hi -ting le -po ked -hunt ley -go dogs -fa kel -" """ -take your -re writing -celeri ac -appro vals -ve rer -toom uch -mis demeanor -ly mp -gar ts -fer ia -culmin ation -bayone tta -y f -moo res -je ju -ef i -conserv ative -base camp -ab aseball -tom ar -sensi bility -r lc -pap as -jcol enc -ware houses -v ashi -transp o -spho to -poo ped -glit ches -ren i -pre et -lma ooooo -hu f -st inging -sne aked -re plays -r hi -inter racial -bu cking -tax ing -sig nature -party time -kid die -inverte brates -impro bable -gastro intestinal -to ki -tang les -om ap -loo d -gold blum -gle be -ec enter -ear ners -si belius -po los -over taken -daysof christmas -cross rail -cob webs -bir la -bil let -z x -vis i -un folded -ste ele -schwe insteiger -rak hi -mar lo -fe tty -cn u -war nock -spoke s -na shua -h ci -way lon -ph t -jan es -im al -ðŁĮŀ ðŁĮŀ -over grown -monday blues -l yo -ho yas -deter rent -crimin ology -anc on -work hard -wel don -nag y -mac omb -lin ux -dap at -ca shed -be is -th b -premi ere -ny sc -jan son -institu tion -ban ish -b hawan -al pradesh -ve lez -spo oner -gret chen -fin edining -dwar ves -drive safe -dishon ored -as so -ver anda -ty rion -stri ppers -nxt takeover -electri fied -sd b -pal moil -n sync -k ith -hart nett -gil berto -fl ate -car in -under grads -tun ga -tot w -s be -mei ji -leg ere -l lyn -head board -fru c -birken head -algon quin -wee ding -she ikh -posse sses -op ent -love able -eso teric -bigo ted -ana heim -wel le -vigor ous -tab la -sp el -par nas -land line -g po -brush less -ble au -au ger -launce ston -hr man -fav a -employee engagement -sus ana -of erta -dari us -crown e -ðŁĵ ½ -w top -te thered -man et -gu te -grim mie -forza juve -cho ppers -bere aved -andhra pradesh -al bor -weather ing -ran gi -out chea -mi zation -fro me -ed vard -bat aan -vic ar -trump jr -sea shepherd -lo cos -dun king -crypto graphy -mat ron -bo ggling -beck enham -wi x -pat ernal -hun tress -herd smen -bi sping -av ati -ac d -un married -turt leneck -tar un -ste ez -se in -lockheed martin -it takes -insur gents -botan ical -bis mil -un speak -o gre -bolson aro -bethe best -sa heb -cathedr als -captain cy -âĨ ij -t cd -se villa -ðŁĺĪ ðŁĺĪðŁĺĪ -w pi -scra pping -prote st -pi dou -mel ba -houston texans -bur dens -app ly -ìĸ ´ -typho on -r ink -j bj -flip grid -com te -carriage way -radi op -pic nics -on as -ham burgers -go red -drin king -bloom ed -sho stak -mul tim -gh en -b ss -afil m -âŃ ķï¸ı -z hi -the projec -rel ati -pr at -dj py -carl ile -sy mp -sad d -oral health -mus i -ka vi -hetero sexual -abo x -ðŁļ « -vis on -tele communication -r nr -pu la -na ir -mccrack en -hazel nuts -gre ig -flamboy ant -fiver r -aussi eed -swa c -sel va -oth ello -or ville -is ch -ing es -family history -course work -chal ice -cat ed -bli sters -xy lo -the p -sk ennedy -school girl -ki v -k nick -fu me -bri gg -bk lyn -uw madison -stumb les -stu pend -stag nant -lax is -ing en -cam corder -tzu yu -sat chat -prohi bit -heis enberg -den iz -aad mi -theli on -sty lin -reinst ated -he ur -ffici el -confi denti -ca z -âĻ¥ï¸ıâĻ¥ï¸ı âĻ¥ï¸ı -te cum -sus anne -n anna -la guardia -king sman -ing in -gil ber -f eng -ephe mera -enf ants -chom sky -chi k -bre anna -uk r -sar an -r ting -pa checo -del and -opti mise -kee gan -caliph ate -ari z -z it -west side -ul la -to it -shif ters -sh river -pan i -must fall -eth ically -br no -in cess -hu sh -happine ss -far qu -fai rest -f ka -eli m -ecumen ical -ec ity -dre dging -dc fcfans -am ichi -å Į -sp ak -sati sh -pu cks -match making -go enka -ea sement -ci der -c mu -b z -aqu as -ðŁĶ Ĩ -{ # -smoke house -separati sts -saf fron -ma at -l loren -iro quo -cor ns -cassi dy -ah met -z hou -ck man -yor i -social ite -pro mise -plo tted -metic ulous -fluore scence -se wing -sa it -hunting don -gi gat -cascad ing -atl hawks -ue fa -nor i -is son -iac aucus -gir a -der ail -bad boy -way to -too wo -se u -rath ore -pra shant -ol ay -oce ana -le vin -in dent -heavy weights -guer illa -cor o -alay sia -x ing -uc ous -storm zy -sky light -sen dai -sch s -pa il -mac miller -leo dicaprio -hell fire -g dansk -fa han -aa w -south well -ram bler -persi sts -brut alist -an men -tari k -se oul -popsic les -man sour -daes ung -carra sco -sas a -mat tie -maro on -lever aged -kom odo -h sc -fac toftheday -cur ses -aff in -ðŁĮ ĭ -à ² -yvon ne -w mur -meadow lands -gra vel -fa hey -cze chia -tupper ware -mar awi -lac azette -hero ics -far i -del aware -pe cial -pancre atic -out and -la zz -e vel -toom ey -tam pere -squid ward -sop a -shar man -er nest -black pool -ao ife -air i -y eri -sig mar -ni han -liz ard -hom ed -dry den -chu b -blac ke -aldu blo -re iss -olympi acos -love story -lent icular -lan gue -jcc aylen -i hc -ban ked -trum pets -sx m -ob inson -ma homes -k nes -dissemin ation -pe derson -or bs -ner dist -lar ies -fon te -expedition ary -ex a -dam sel -chi ang -ab on -âľĬ ðŁı½ -ta v -sil o -plan ing -ny wx -m ú -data sets -c rick -ye ay -vol e -slin ky -m srp -c pp -bex ley -ve dra -open rp -mysti que -micro phones -dra ghi -atri al -?? ) -yu ki -xenob lade -words worth -u sted -influencer marketing -ds g -as ingh -roz ay -rail ings -m ks -kan an -intimi date -bat ted -barunsob ti -asho ka -anne curtissmith -so ares -mercen ary -lg f -eyel low -embar ks -ssi ans -lung cancer -in fini -ec c -brun son -bloom er -ar can -walla by -tr ici -showr unner -r dg -net to -mi zes -erup t -dur ban -baby y -tric ycle -sam smith -pre z -pe pe -gal low -g day -dist illing -ðŁijĮ ðŁijį -ðŁIJ ļ -tw ic -see e -job seekers -why ilove -poster ior -li rr -freed man -e ge -do xy -cur y -ang al -suzu ki -mc qu -ct w -antic hri -stu f -spring er -pow ell -om aha -marri ed -go home -g vt -fox trot -uc p -ow er -fit ch -con nie -wander lust -sym bio -sunny day -mic ah -haye k -cor mac -boj angles -é es -right fully -on a -nor ah -k cc -hillary for -h mp -bru in -ath lone -action news -ì¤ Ģ -se hen -pu lau -priest ley -posthum ous -pe do -nai doc -ling ard -le ben -jum per -... - -pet tic -ob serves -nuest ros -now smoking -night cap -mc p -lan downers -k ta -eng ad -ele x -alle z -w z -un ai -md f -jard ine -al ax -wh aley -tec no -son dheim -junky ard -insu rer -e hl -de vote -car ra -ca id -ca diz -ar thi -us ch -tyour self -per n -natgeo travel -ic ism -amo g -scuderi af -que m -pow wow -kur tz -head bands -gla zer -getwell soon -gam enight -euthan asia -catap ul -asy mp -sol ano -red hill -pu ffed -ap ura -allstar game -ye sp -sal war -nag asaki -medieval twitter -loo sen -inst ax -i sti -go si -contempl ative -chanc ell -appo inte -tal ley -corn well -war dens -v ate -sori ano -rad ley -pu a -m cro -inktober day -ero th -constip ation -ðŁ¤Ļ ðŁı» -wil mer -vani er -val lado -tic ons -reconc ile -mort als -li bby -h dp -yu gyeom -ym ac -un bound -sch ach -sb sb -plastic free -napo le -mum mi -ligh test -lam ent -de vised -un intentional -sheskinda hot -saint s -place making -paste uri -ke ir -kab oom -in san -dool ittle -cassi us -te va -shutt le -row dies -dra k -bren na -blu m -ki ii -ker ton -deriv ative -bu ts -bar zani -ador bs -ad ami -zu cker -time isnow -su lli -sat i -sabar imala -min na -- >: -ðŁ¤ ķ -stu r -princer oyce -marvel studios -itali ana -hahahah ha -gg ard -flu tes -xx xxxx -pin ski -n pd -must see -immort als -gar b -fi estas -dor a -bi bles -angu ish -sco trail -pa se -lazi z -ivan ovic -chronic illness -ar me -zu lu -tech stars -ro cher -ric ar -plo y -glar ing -des antis -cancel ing -ab ha -; * -. "# -ðŁĺĬ @ -y ch -vas i -skybet champ -sha una -ke ty -goggle box -balcon ies -ag as -un tamed -t ce -ne i -montgom ery -min ot -lombar dia -brain washed -bo tha -block cha -âĺºï¸ı ðŁĴķ -te te -star tin -ric hs -new sma -fab les -fa rer -de feat -cy an -compan ion -bio diesel -ben g -ðŁĴ¦ ðŁĴ¦ðŁĴ¦ -mail man -lin cs -fc bayer -bla sters -baccal aureate -attle boro -vic eg -limass ol -isak hi -himy m -franca is -da real -bush craft -ann ou -z aky -vie ja -kirk by -ca ste -a en -zd net -fac et -ali x -è ° -raj nathsingh -n ini -mc cloud -il ano -du ous -dil jit -dal lah -cycl ical -cur acao -âĢĭ ! -wr k -west boro -rat o -r z -ne gra -land mark -john stown -interfer ing -hann an -duc ated -zin ke -tamar ind -sub title -ro eth -le at -kar ls -ka hoot -insta art -hi aleah -embi id -drum line -assess or -anore xia -~~ ~~ -wemb ley -ra jap -ouni versity -jal al -copy cat -ak as -r jd -u hhhh -re flux -mor mon -mb f -lucin da -j drf -fon taine -defend the -crack ling -ë Ł -uk housing -tb m -shi vers -pri m -per in -in for -h ba -furry art -cav ani -ale se -acce ssion -zin ta -wr ongs -worldre fugee -tam bour -reb ates -ple ases -paramilit ary -ool ong -l mc -facilit ates -espan yol -car ling -k of -hu is -brew er -a hahahaha -will son -sh ure -sain z -play hard -lu p -lau b -gour d -dun ked -vi vino -sw restling -pi en -o ks -l leg -euv res -do zier -canadi en -blood stock -bac all -ठħ -vol ver -e sti -do sto -car b -u pping -say fie -ro she -m ru -emo tional -dit alia -book shelves -ab oo -s lane -on tem -mon drian -laogha ire -ds f -conflic ted -charlotte town -ðŁĵĬ : -whites nake -uni fying -tsi pras -smar ter -fron ti -f dic -emb ers -dece iving -bel air -ac kered -ur su -taste ful -sti let -pas ok -k sc -inv ari -in gof -dar tist -clin ician -chef life -bla b -avi ary -ðŁĸ IJ -stream ing -out ings -natural beauty -gil roy -du ets -animal welfare -ad air -sounder sfc -sashab ank -ro lando -qu aker -me ses -ka jal -jesuis charlie -brucele e -u albany -re ts -install ers -ilo cos -fin ca -ar kan -ðŁĺ¡ ðŁĺ¡ -shru ti -sha qu -leak age -cy cla -bre aded -ander sson -th reading -polaro ids -korean updates -hard ball -flock bn -cw g -sauer kraut -os we -ine w -du ped -à¸Ńà¸ Ļ -un reasonable -tour billon -tat su -pab st -optimis ation -in significant -il ah -cn tr -!!!! " -sl f -ra pap -o dor -masse ffect -lac lippers -ur sing -reco very -ne ff -mon do -gymna sts -fin negan -ct m -bro wsers -w ert -pag et -ou d -ong kir -nas sar -mind ful -k si -bak i -] ) -ðŁĺľ ðŁĺľðŁĺľ -non chal -men e -ly cra -bay view -barn um -â̼ï¸ı â̼ï¸ıâ̼ï¸ı -virtu ous -tre es -pal ak -mid century -kel le -jof frey -ho ppers -tor os -se pia -pay itforward -minim ise -fresh en -el u -d pp -ce us -å° ij -yu ta -ton ian -the king -te jas -rand all -me up -gut sy -dor ms -ch ore -½ ĺ -tsu i -thu mping -s va -girl scouts -bla h -ðŁĺĤ ðŁĴĢ -stor yof -ske g -san am -kumb h -ic ts -go lem -coffee house -be more -tweet fleet -tol stoy -paul sen -film noir -deduc tions -bear ded -be len -be ke -ÙĬ ÙĪ -win win -opau lo -da is -amo eba -sun y -london derry -gil ly -davi dj -craf ter -water colours -triple h -super tuesday -papy rus -foo di -demil ov -christma stime -ber tie -v ities -to il -sky lark -mi pim -foodand wine -fl c -usa in -te ers -rom com -morph ed -ho cke -hem lock -fire storm -comp te -bo dle -vis xx -scor ched -re ams -jones boro -choo ps -cheeri os -ðŁĨ Ļ -â ħ -n ity -miri am -me trou -man de -indie comics -bree ze -boom in -bol sho -android dev -aero dynamic -sm en -kri spy -in nu -im ps -ham id -fas a -emper ors -eli sha -ëĶ Ķ -in q -i zzy -bre sson -ãĥ³ãĥ Ģ -syndic ated -sashabank swwe -ou a -kah ne -june teenth -go tigers -diljit dosanjh -can tal -ball a -asc ended -v ga -t ass -made it -hennes sey -distri butes -top man -ti ago -the game -nav as -mur at -mtvlak pop -hol ley -bau bles -am rita -/ ? -ìĤ ¬ -ëĭ ¤ -âĿ Ģ -k ä -cel lo -bio fuel -ashu tosh -adop ter -] ] -ðŁĺİ ðŁijį -sw y -pete y -home ownership -go van -ecol lege -bres lin -bbc strictly -aga i -yum i -wil lett -w isn -tr visxx -solsk jaer -so vie -sle uth -ot ley -m ame -honey bees -bal dy -ðŁĺİ # -un na -ti more -the ti -progre ss -k was -jama at -h fx -crime fiction -c ado -bad d -anu bis -ê te -nom a -h ps -vintage jewelry -to fino -stra vinsky -go ffin -gh q -ef fe -ch acha -cam eos -n ci -lim m -invic ta -fle urs -en cu -brilli ant -ban sal -alan is -wan ee -spr inting -long mont -klar oline -feed ing -ðŁ¥° ðŁ¥° -un sustainable -tw of -luci us -ld sconf -hubb a -fri o -de hra -ur in -tre me -n mc -com es -bun bury -b cu -ad ina -£ ) -za b -ske ptic -shop rite -sand o -re shaping -magne to -kel ley -ilove you -cri pple -contain er -wham my -wfa aweather -techno logist -hl man -dynam os -cru ze -ble s -ati d -ork shire -tt an -poyn ter -pac a -mar mo -hyun dai -wi eld -sabrin aann -quick books -petro chemical -nol an -les den -mc lisse -lit chfield -gur ls -done gal -debut ant -com is -am ul -vigne sh -shi ge -re portage -pru dence -poten cy -pan hellenic -me ms -kling on -impre za -eri es -cash flow -winne bago -uter ine -ss k -do bby -canv ases -vau deville -pradhan bjp -myth os -medi ocr -mattb omer -g ns -final ised -election night -d pradhanbjp -coch ran -calm ly -amag azine -ç§ ģ -wareness month -tar ga -ta hun -sche tta -mu tter -liber t -hal low -de ities -chrysan the -c ms -am ents -sabrinaann lynn -ri ghted -r wot -ko i -ha feez -g dt -ul ls -u vu -ol adi -metro parks -it ness -extingui shed -simpli stic -pl ath -menag erie -kcr w -cam bi -ðŁĺį ðŁĴĸ -worldrefugee day -kel vin -i message -emo s -ah ca -sk illing -share this -ov sky -mcin nes -inter city -innov ates -gor die -g ons -fusil iers -duques ne -artofli ving -advance d -ph ane -oli va -met is -mal loy -jer rys -fu ming -follow for -f bla -eyel id -ak enya -ac ara -yu va -x code -wyn wood -tor te -te gan -superint end -sh inde -ly ne -hay market -england cricket -at z -ðŁĴľ ðŁĴĻ -speaker pelosi -pon zi -ole miss -men ter -keo gh -do td -bun t -bdn mb -are y -mathemat icians -fi ance -ce cili -spot the -pilo ted -escor ting -av ali -ale e -ðŁ¤Ĺ ð٤ĹðŁ¤Ĺ -weapon ry -trapp ist -tho l -sur rog -reci ationday -plain field -phi les -os as -mi kayla -ma ham -favour ite -bl ane -ba sto -auer bach -vit esse -one republic -di ma -caer nar -we trust -sa jid -peek aboo -mam moth -hatch ery -h re -grand dad -dail ym -correc ts -californi ans -ë ĮĢ -ster ile -land sat -in fielder -imperson ating -hypothe tical -ठĨ -ul ta -the xfactor -pas sat -nw r -he ss -atlanta falcons -ah madi -âĹ Ħ -tu lip -ti ra -this week -spar tak -ot f -l enews -at ical -newsp erth -ha ge -car box -Å « -t pb -succes strain -sel man -sal umni -mor te -mor ro -lu k -elo ise -cust serv -ðŁĸ ¼ -ri bo -f tisland -do ble -cu ma -clinical trials -bla ding -bergam ot -ti zed -si v -day ever -by o -avat ars -alle giant -ðŁĺį ðŁĺŃ -yar ra -welcome tothe -um no -tur ing -tinker bell -ter ton -swo oning -regre tting -pin nac -pat rol -iv ar -im manuel -ig lia -bar ds -vit torio -rac in -park side -ktr trs -gu el -ðŁ¤ ¯ -whitt ington -sanje ev -s festival -o rel -miami open -jan es -intensi fied -ig ar -derek theweather -barbe que -ðŁ¤ IJ -âĢ İ -yun us -ny post -abudha bigp -semin oles -ground work -fu ss -eamon n -du ol -col ympics -chi an -bo oms -ani ac -~ * -y omi -thankful thursday -tech tuesday -la ur -iphone x -ha aa -fla va -e ku -d all -cor tes -care w -blun ts -ðŁļ ¶ -îĦ Ĩ -val tter -un written -top sy -som al -re generate -man chu -hun nam -hoo ts -e com -ðŁIJ Ń -Ú Ĩ -gn or -gl ens -bartol o -avi d -antibio tic -anc i -star key -ru he -practic al -penny wise -o cular -jim marous -calvin harris -ane mon -ãģ Ĥ -tat ts -suff er -sp ics -on kyo -o jai -greg orio -big elow -ath i -an ta -ðŁĩ²ðŁĩ ½ -zo olander -sha adi -kho v -di zzy -ann um -wo m -th orium -summari zes -scam paign -kc tv -ju mb -bit z -si al -r mit -promp ting -f cm -by me -bron ies -wj z -ti ya -ri az -re sign -provinci als -go vs -brock ton -ãĤ ¬ -z orn -ola the -leh mann -juan ita -g dr -dis bur -tab ling -pi azz -per plex -milit ar -gin seng -fred di -fire birds -f ags -dig g -aug sburg -ac as -. & -ðŁ¤ Ł -stabili zer -sa thy -re gt -ni ker -mode sty -fo garty -cap p -bal oo -bal ac -ar oy -al corn -agu sta -un zi -stoo pid -pue blo -micro chip -k affe -cut lass -clin tock -tu il -startup life -speci ale -pp pp -mi ent -illumin ates -e spe -d der -pla stered -pas sive -o jo -nay lor -go te -sp and -rush ers -me b -lyn ne -kyle busch -gic lee -ee g -destroy ers -cap rice -as mr -ab f -preak ness -orphe us -ni bs -ko ji -be sse -ac anada -year sfor -thi em -san cho -philli ps -ne f -local food -ki en -inver clyde -den ergy -st paul -plu r -other worldly -li er -l q -depos ited -alope cia -ëĭĪ ìĹĺ -p bs -magne tism -long weekend -l ssc -fav oured -fa ç -ce y -ric hey -moom in -mole sted -life less -in hibition -fa k -cat lovers -blu el -le ot -beau lieu -tou ted -the fts -i frs -home stead -gg yu -cy g -written river -pe ña -ov ar -o bu -neb preps -kerou ac -forevery one -bol ling -ï £ -wu han -un til -semi finalist -persu aded -new berry -mutil ation -medi um -kr t -con da -xox oxo -ti po -lo th -j il -go eagles -dab ang -yay y -we hr -ther ings -ja eh -dang an -we pt -ol der -mcla chlan -magnus sen -dispers al -cap gemini -ðŁİģ ðŁİī -stark ville -or lan -abor tion -t outes -legal tech -lead lap -hanni gan -as ers -ver lander -sw bb -s com -little ton -fe h -empower ing -dead wood -al go -ñ as -val eyellow -patti son -d abad -buck land -ro han -pu du -ma ari -ine fficient -cra ppie -ch swx -br ca -z anne -shostak ovich -hy una -de acons -canadien smtl -byr nes -abandon ment -âļ Ķ -presi ded -predic tive -per ma -mnu chin -maccab i -ha shim -die te -antiqu es -mt m -mm da -johan sen -ex change -clut tered -ti vism -love less -id ler -bb va -am arie -all ll -air liner -yen naiarind -vern acular -tec tonic -pur gatory -photo shoots -or man -mel ina -khawa ja -ken tish -eb m -chrissy teigen -ðŁIJ ĩ -un resolved -ultram an -the heraldsun -ren ch -cab ling -bix by -beck brom -´ ï¸ı -the ism -th un -simp les -popul ous -pad ding -mar on -crun ch -catamar an -be est -zoo s -sush ma -rel les -mccr ory -ge f -ev ra -rev lon -oo ak -mit ro -ki os -ðŁĺĤ âĿ¤ -ðŁĺ¹ ðŁĺ¹ -w z -stra di -grou ped -ge x -family law -eu an -ear my -confi g -abdul la -ðŁĵ ŀ -ðŁĴĵ ðŁĴĵðŁĴĵ -she ith -quote stoliveby -of fic -alli anz -zal mi -tenny son -stor age -pol led -mac ao -lips comb -im er -dj khaled -cancer research -bbcin tro -up f -mu es -ma gritte -hyper loop -flu ency -edmonton oilers -co vey -bel low -bar ba -pau ley -etu de -e it -broo ding -at ori -ðŁĩŃ ðŁĩ· -tooth less -ha worth -ge b -bur p -bi bb -zin da -tro ts -ca shing -be ep -ðŁĩ¯ðŁĩ ² -¡ ľ -war r -shri mps -pay able -dimini shing -b tr -å ¯ -r cm -ouro cean -no ts -mil i -j deep -duc ati -bak shi -traff ickers -ta hini -pro am -ho yer -tom ic -n ce -mar ron -ki st -kemp ton -cal abas -c vd -^ )/ -ðŁı Ķ -wor sen -side board -sad o -rock on -ij in -h mc -ðŁĩ¿ ðŁĩ¦ -water islife -te ix -sty ler -sarde gna -oper atic -nl poli -hoff mann -com anche -boat ers -ðŁIJ ¼ -ï¸ıâĥ£ . -not ches -g ash -excav ated -dom me -dese cr -char ing -art and -!! ] -sur fer -mow bray -mat lab -kati ec -inside out -a shar -ðŁij Ĥ -ëı Ħ -von n -un apologetic -seven fold -ni ak -mis syou -kab uki -har tn -care ll -cal ic -bat ley -ap it -" // -tr ical -stra han -se tia -main frame -love parkrun -kait lyn -bo vine -alej andro -z us -tw oo -mal ts -dr p -cath ay -ðŁijį ðŁijĮ -zan u -video grapher -vez da -thou sand -tar an -rein vigor -inspir ation -grou per -dd dd -col ds -chur ning -be seen -automo tive -* # -ver son -numer o -michael kors -ka ala -fotogra fie -bc f -ur f -tan trums -ro sales -min ate -ki va -il in -de fied -athle ticism -tu cks -throw backs -roth ko -ro gues -per idot -new seum -national petday -erdo ÄŁan -erasmu splus -cad die -be heading -spectacul arly -sp rain -seg way -post card -mano har -ing p -he aney -schuyl kill -s anger -migra ines -m st -gor mley -ebene zer -battle born -ðŁĺı ðŁĺĤ -umber to -sm k -saturday night -palm springs -eye son -dre cords -clari fied -âĦ¢ ï¸ı -terr ors -stati stically -par tofthe -naw azu -disc ourage -bou gain -yan kee -wish ful -sla shing -oni ous -iri dium -ff el -elev ating -crew sc -craft shout -br anco -ac ri -abstract painting -bro oms -ðŁĺij ðŁĺij -un masked -super ficial -pine y -par king -our ney -lauren s -hydro pon -hand y -d ells -cel ina -au de -at ico -ðŁ§ Ļ -re di -profootball hof -nb s -fa ints -ar aja -win kle -un tol -seaf ood -scot ts -kee per -i feel -go wan -g auguin -fam ers -bü sum -brown low -am ul -ìĺ ¤ -wal liams -tsu ki -señ or -sch indler -mur phys -laugha ble -gor d -escal ate -e oc -ye swe -un solicited -spra wl -le bowski -he mel -grow lers -gar uda -ap rons -thel ine -nor throp -nab j -kin sey -hor as -dallas stars -chit ty -bu si -bar do -ul is -straight ening -sd l -ra yo -mirac ulous -ko c -har die -do y -dani ella -costu me -t ss -st iller -plu mb -on demand -cot ter -w dw -uh f -today s -s sh -s illa -roblox dev -re districting -lo de -kh or -cover ings -ba w -ali express -peace day -men o -marin ade -kear ns -how ler -har pers -au ge -alla hu -sa z -ro well -revi ves -pul is -pre ppy -illion aire -ic el -chev elle -ç Ł -vix ens -redbull racing -plac es -pal os -os ke -mid season -mendo cino -k ron -geni us -gay nor -vic tim -sn itch -hyper ion -good food -sking dom -mediocr ity -live t -ku wa -i work -ha gia -fromthe archives -chen o -bann er -ah d -+ # -relax es -mal foy -fo sse -fire places -dar pa -corin thian -ðŁı ¢ -warran ted -um d -soci et -of love -gun ther -de main -vol ts -ti zi -klo of -ith waite -har is -h ky -firsta id -bee b -av ic -mul lah -lim es -j rs -hipp os -felici ano -whe e -un plug -r ng -pren tice -mor inga -mer ah -ma sque -k mbc -j hon -fare well -bor ic -.... ..# -ðŁĺģ ðŁijį -ìĥĿìĿ¼ ì¶ķíķĺíķ´ -âĢ ¿ -mas se -hurricane harvey -de vere -cy nic -yaz idi -ro ld -pon toon -mirac ulously -h cv -gar da -g mu -der ton -d ink -coy h -av ing -âĤ ¦ -th win -mo wed -martin sville -mal lik -life sciences -kiba at -ke ym -em r -dur k -coun tering -cor vallis -bro t -baro da -w any -vijay awada -sy ty -r ill -oy ama -ole miss -mor aine -loom is -kd trey -is c -indi as -hau lage -eng le -cre s -c ct -be you -stand ar -numer acy -l pl -bru schetta -wi k -q sl -pha sed -mix cloud -fi facom -comp ile -Ì Ħ -pent agram -monday mood -financi als -do th -debilit ating -ard t -ut u -tru gby -stre tch -sp al -san tosh -me st -lo real -gen ting -cre o -air cadets -ðŁķ · -wi ff -tri os -tou rer -rhi annon -o hhhhh -kier an -james maslow -flock a -e ww -ang ar -ab di -v hf -sound system -mi ura -manipul ating -ino cul -govin da -den o -birthday girl -bad man -ak ura -ab n -нÑĭÐ µ -zand t -par dew -mo ja -misogy ni -lind ley -empire state -ejec tion -atac ama -whi ppet -tu cc -timm ons -ps x -novem bre -na it -minic amp -exc ruci -caffe inated -smoo ve -revo ke -mccar ron -inter sect -duol ingo -ch aching -brun ch -ìĹIJ ìĿ´ -е Ð -w alling -take shi -showus your -ni da -jimmy kimmel -h ri -di ed -clou ded -sap ar -ra don -practic e -pim ms -kan a -head space -gat i -frustr ations -anno ys -____ __ -ro te -per tinent -orthodon tics -be kasi -aeronau tical -wei wei -vic ki -rel son -ra he -mar ry -do ak -chan ted -bbc countryfile -uk gif -qu iri -qu ag -much ach -loren z -k roos -for your -far away -dark souls -so k -s land -k for -future ready -car din -advent uring -zambo anga -yon ghwa -u mma -kan an -hand yman -fi duci -edge wood -domestic ated -consu lar -wn d -super hit -pa cho -mono chromatic -im bu -gla ad -dar ken -cor ti -byo d -bar at -({} ) -wein berg -the chase -or ge -miy agi -j ali -in ac -en atics -ban ished -b fg -wheel ers -neo liberal -mi mics -enfor cer -we aning -py p -i pm -her ni -cla flin -chitec ts -carbo hydrates -ae i -work week -ver ity -sleepy hollow -sani bel -per due -global bc -bin ds -sty ro -show stopper -par able -i dism -hin ata -fore casted -du ffel -de cent -bott omed -bbci player -at elle -anthropo logist -see able -re creates -raven na -pu ffins -mand al -fla ps -cou sin -cool ness -che tan -cbs miami -ao te -ai leen -u twx -u di -ram bling -o ggi -ne en -meteor ology -ir respective -illi ers -domin ick -cann oli -adjour ned -âĿ¤âĿ¤ âĿ¤âĿ¤âĿ¤ -wy p -ste au -o cial -k hay -h mv -ene x -dj life -u ko -tro pes -swar tz -pu yo -play house -patient safety -labou rers -ite a -e wa -deal oftheday -bog dan -wild star -wed g -the gap -pa ki -is bell -devo id -aw w -as b -was pi -te fl -sver ige -qui eres -mo en -asi o -afri ka -vi agra -twitter verse -syour friendship -pry ce -mon on -elm hurst -bring iton -videom tv -tam er -jalli kattu -foodie friday -federic amog -extrac ur -cal len -anton y -âĺĢï¸ıâĺĢï¸ı âĺĢï¸ı -ta ichi -rishi kesh -pand ana -n ung -la ver -gaul tier -fair ways -d ello -alcat el -z le -re frac -prote omics -pent at -or bits -mor gue -maver ick -kand ahar -issu ance -intertwin ed -i ren -git mo -faz al -err atic -dor mit -beauti fy -( (: -you n -mx gp -it zy -dam en -colorec tal -co sm -chri sk -c ita -apologi zing -îĦ Ĩ -te tra -saoir se -penit enti -man deville -lo dge -ja xon -j la -aph rodi -alter bridge -ç ¦ -te dd -re fit -injec ting -di stro -brig ham -year challenge -ra he -hit men -ha bi -grammat ical -george michael -bro x -bo ck -am la -tour life -stry ker -p all -marqu ise -gher ty -el z -cla pper -cataw ba -tisthe season -scrip tw -ma doka -int ently -gee king -galac tic -do the -bl c -ap tor -anci ente -al icec -ÙĬ ÙĨ -wool y -ralph lauren -jane austen -hun ky -dry wall -chen in -at n -anticor ruption -three some -the t -metal core -li ga -lex icon -eura sia -dor sethour -daily mail -vel vet -mou lton -colle tte -bra ai -ben ning -asi acup -wor ded -social work -shu man -s ich -ment a -kin sale -i hansika -du cey -dif fuse -cur sing -cordu roy -å ² -velve ty -ur inal -tucker carlson -temper ance -fro ggy -af cv -shan ty -l ner -good rich -ge j -eli x -ef ood -b of -artvs artist -vo wel -sut cliffe -sta v -se ous -ra ines -masto don -booka day -tag alog -ridge wood -progressi vely -lock smith -kan er -dic kie -cel los -break downs -bo ssy -ba al -aveng ing -sky landers -fa jar -ci u -be aks -b ere -ðŁĴķ ðŁĺį -su fficiently -may weather -de scar -bil i -tat o -revolution aries -kwa wesome -em g -cad ill -c bre -ðŁij Ķ -wheel chair -ten a -r amaz -jo kingly -har lem -go knights -enu mer -dili p -con serving -beckbrom fl -bat avia -ag gregation -ta ip -stat ure -selfish ness -scuderiaf errari -ke u -in sati -fix it -eric garner -entr ant -âĢĶ " -Ñ ĩ -wi ley -ty nd -pa ke -infl ict -bu law -black more -sacramento kings -ol ta -ker r -gra dio -bro snan -se on -po ws -patho gen -fra zer -en large -athe on -ware housing -ur se -fil ings -dis content -che t -wri gh -vacation ing -ta rek -str angle -nic ki -ident ity -dhan i -d ary -construc tions -cagli ari -age o -a fia -wedding dress -sch ed -per rin -me ur -in art -wor c -un settled -mini bus -mat ric -christ ened -bell inger -mo xie -kar bala -e hn -at tainable -ta va -sw ells -ro da -pi stol -p z -lis burn -k roll -fcbayer nen -bel lion -ro byn -grou pie -an ant -ĥâĸ ĥâĸ -ri at -ly me -ju te -hall oumi -glu t -cor te -vas sar -then and -terro ir -ring tone -musta ine -homer oom -fu tbol -fr in -bo ba -basil don -to ews -summer fun -it sa -in ia -im plying -hark ness -gn u -deplo yments -bir dc -bar my -ì ¢ħ -sten son -roman a -note pad -me mon -cellu lite -by gone -ator y -wood lawn -thevamp s -la sses -embaras syourbestfriend -affection ately -ws j -vision aries -ren te -po iti -hann es -ha ger -ge me -distribu tions -bas sad -waveleng th -van n -or me -neighbour hoods -jersey city -fu te -car adele -bru iser -am ed -sub a -bas so -ðŁĻĮðŁı» ðŁĻĮðŁı» -ë· Ķ -â¬ĩï¸ıâ¬ĩï¸ı â¬ĩï¸ı -ss unday -sli fe -skar sg -li an -gallo ping -boc ce -tou che -ro my -ou la -n ll -mo ir -le mony -is ine -hoo ver -evacu ees -dd national -addic tions -ðŁĵ İ -ri ker -nca a -ka ia -h anya -dayofthe girl -crust ace -acrob at -white field -vill anueva -vallado lid -s mor -s ico -ro ping -open mic -gen ia -fast lane -eci gs -dod ds -board man -zin edine -u che -q at -n abo -m wa -kon rad -knock outs -i of -co lic -weight loss -w pb -shri ke -re vert -library congress -gate fold -åĨ Ĩ -se ad -sam u -piran ha -om ena -g aven -dayo ff -cray ola -y ai -under sea -shap ers -perl man -hy rule -di manche -âĻ łï¸ı -your take -sung jae -ple c -o ik -neil tyson -jam on -id le -i go -i bra -cast illa -brem ner -bot w -ðŁĺį âĿ¤ -pre fab -men orca -maine mendoza -glori fied -divyas pandana -determin ants -black sburg -ìĽ IJ -make red -ly in -ic w -filip ina -est i -del ves -dat uk -absolu te -whal ers -tt al -spaw ned -newin dian -mix er -lead off -kash etty -ha ddad -gau ahar -f ct -eis ner -ate in -w sm -th eni -school children -rel ls -orchestr ated -octa ve -ob sessions -meg adrive -jab i -ideo logies -har tt -fe sto -boo ting -band h -bacter ium -won g -tw ing -lepro sy -k vit -bye lection -bat chel -alter nat -reli ed -ke el -fresh ener -ec lan -cor i -chi ko -aw ed -anil kapoor -whis k -var o -shi o -san ia -laure ates -j rpg -guineap ig -grizz ly -doppelg anger -bar rows -a hon -ðŁijĩðŁı» ðŁijĩðŁı» -Î ´ -ye v -woo tton -sn ps -re collection -ma al -ket an -fe west -far az -cd w -bi f -shah baz -qui er -hust ling -hern don -deu ter -cl u -adul tery -ru it -gre na -gn omes -free hand -ref ills -po tting -diagno sing -ban nister -al ms -ag et -sam rat -s vi -pe tri -o virus -mid lothian -ëį ° -scal ability -me tac -just us -individu ality -usa c -the karanpatel -s bar -re shape -pa war -jf k -is sac -custom ary -bol der -Î º -r mx -pla i -ber nice -ar cana -ntv news -melan cho -h ö -bro aden -andali olo -ðŁķ ĸ -ze h -ww t -us ma -substan ce -ray man -kr ati -de ze -bron er -ðŁijį @ -ze ec -x wx -sil very -kac ey -ic ardi -et works -ba st -aap a -ðŁĶ Ľ -vap our -smu le -hu ang -end ar -dis located -cari be -) .... -ðŁĶ¥ . -vo to -tu tan -tele metry -pa karmy -opini on -o tome -nz pol -is en -e amon -co bbled -cit rine -audit ory -ween ie -uk snow -long itudinal -har pers -gni er -fasten ers -em met -cross bow -cau tionary -bre aching -yam una -wash i -swit zer -swee tly -spar is -sp ilt -nig am -indian food -fin alize -bach ata -wi w -spe wing -ra do -dh c -an ow -kis se -go frogs -alpac as -âĻ ĺ -red grave -new era -kid der -hel ios -del on -c anna -ðŁİ ª -xi on -stone man -polyure thane -ni do -mr ng -mac a -iso topes -co fc -twit pic -round trip -numer ology -n ooooo -marc marquez -just ly -ga ir -french bulldog -fish and -felix stowe -er k -bag e -ag itation -twit s -moment arily -wi st -saira jdeep -n tu -mur o -mc gi -man hood -man ford -love eee -l ta -ha dri -fer ro -doro thea -beach body -arri ba -angu illa -vape fam -spres ley -sli mmer -sday time -ophthal mo -lac ing -j ür -grin del -din ah -ce x -c sun -breath s -bra bham -war f -sp ang -ku bota -hay ne -h mo -gv su -go sa -fun nies -cre a -zak ir -stru mmer -kur tis -h kt -ch aka -bach man -b jer -adventure travel -y ves -tor r -nitt any -hi mes -cen ota -bay ern -иР² -ur ses -sn ags -saura bh -nico sia -nick ed -in shaallah -friend liest -ever note -austri angp -ar mou -anthropo logie -skag it -shrou ded -little mix -hello kitty -eli z -br é -apothe cary -amphi bians -tro p -tr t -suc ces -rup ture -metrou k -ky t -gla sto -g int -congratul atory -volunte ersweek -video clip -swoo sh -neu x -man power -format ting -fl r -fer nando -deal ings -thequeen mzansi -shawar ma -shand ong -hurricane irma -con vul -yo han -tr us -re forming -r ter -lax mi -ho hen -fu turo -down grade -dehra dun -boo ts -b ct -aaaaaaaa aaaaaaaa -ðŁĺĺ @ -shill ings -s ge -ou le -e gon -du pree -dri bbling -contradic tory -canton ese -avar ro -ze enews -y adi -was atch -th alas -rv smtown -o ap -ma dinah -ber ton -éŃ Ķ -ter yx -ss ant -sc av -realmadri den -park s -ome tre -hl f -re signing -ki ana -k cs -gal ine -el dredge -co han -anthropo cene -ðŁļ Ļ -ãĤ » -things that -ome ga -om bo -ny an -le gia -instrument als -firstdayof spring -ecuad orian -dic es -chautau qua -chas m -ðŁijį ðŁı¾ -wit ten -wang i -no bles -chan el -castle ford -bloss om -whole heartedly -v ab -un aids -pal tan -off c -meta physical -cor net -car bine -acknowledge ment -radio city -mal ach -w whl -total ity -r sp -power up -mar tel -ice day -go ings -g me -family day -es k -cb sdaytime -yam ada -wn y -spe th -os walt -man heim -make comics -in securities -ici us -ha ge -âĸº âĸº -won ho -m action -lo zano -k uk -jar ry -indi visible -in nit -go er -ff i -dut chess -cle mons -cla ssed -cham i -back end -wat u -war games -van illa -ru bin -neop rene -lo x -gly phs -develop ment -char ger -cesar o -x c -van guard -poe hler -pau ses -p sc -mis bah -mad ura -eli very -de coy -d ouro -coast path -biop hy -ìķĦìĿ´ì ½ĺ -with drawing -schwei z -sarde sairajdeep -san ji -proven ance -pic ker -nade em -he hehehe -form by -en ed -elvi spresley -ku du -ke at -kam eez -curios ities -cr amped -childre ss -wra ppers -wolf man -st ell -passion fruit -no sh -ni eve -fang irls -avon dale -z ace -sar ang -preserv atives -lo co -ig l -hand set -hai lee -ge i -g be -distin ctly -bring in -f enix -enf ant -elast ic -don o -commer ce -budd ha -wh ang -sz cz -roa dies -retin al -mc ghee -halli day -cu tie -slu m -cosmon aut -yoshi da -t ney -t ge -sm riti -d ls -at orio -ali e -ìĤ¬ëŀ ij -tink ering -ske le -rath bone -pr g -phon ec -mc w -lifetime tv -lead up -dy r -spho tos -pu ffer -prospec ting -osa urus -nv m -mor phs -maur ice -m show -le grand -iran protests -cartoon network -bet i -acrylic painting -ab id -ģภģภ-ðŁĩºðŁĩ ¦ -è res -wait ingfor -min has -leh enga -bag ans -a or -multil ateral -lig ne -hot shots -de classified -wish ers -tiss ot -mess aged -lo on -kul tur -kil ometer -ital o -fer rero -co pier -bar net -shal lot -sea view -dri ven -com press -chic ano -bou vier -âĺ ® -time flies -sal ty -rother ham -rex ha -ni al -i story -h town -chi v -afro beat -yellow knife -vil s -va sive -sin fonia -ponty pri -hou zz -di ble -âĹ ¼ -wine making -w ca -van re -scho oner -os r -na se -mi zu -klo bu -journ aling -fa ker -emmanuel macron -an jun -win t -j ari -impin v -earth athon -di ffers -c gm -supp lic -stay in -sieg fried -ni val -j ith -ho cking -u hr -shab u -hot test -g any -bigre d -ðŁ¦ Ģ -ï¸ İ -swe des -pupp etry -prin se -mc donald -fran cia -at ino -ar yn -ultr alight -the j -ra dar -pre caution -ly a -kasper sky -jeff eries -in fir -gaz zetta -face less -diver ting -chrome books -agh a -ab normally -Ù ģ -sho win -shab a -psy chic -ja unt -de formed -awan inews -a ily -unfore seen -picture ireland -n gt -down y -dalhou sie -council woman -cor nyn -bet sey -wing span -par id -ming ling -loc us -in no -husk er -fl ys -carroll ton -tr icity -scra ped -safar icom -occup ations -nawaz sharif -hoo ves -cathar ines -ag ger -à¸Ńภ£ -wad dle -syl vain -st johns -so yl -ol ds -g ack -fire men -fin o -en tex -de constructed -bc p -asser t -ب ص -wh ow -vari an -ne sta -max well -kru se -dr b -cool ant -aw kins -al et -ab rown -ðŁijĮ @ -smashbro sultimate -ir rig -cobble stone -cas anova -buzz ed -tele kom -should nt -pt p -memor ia -cham isa -alme ida -wi reless -re visits -no ize -ne go -la garde -is th -is ac -extingui sher -es an -w cd -se ful -dead lock -ðŁĺħ ðŁĺĤ -wen atchee -sla g -sen za -o in -ne hill -ko vind -kan ter -jo be -ci a -cat ers -agh i -suni ons -sop er -sli z -pac cio -mo sh -ma ddy -lo rence -herb icide -grati fication -cu it -bar bell -? ". -l pd -kil mer -car no -ball entine -sh iner -ne tta -loo kat -il ocks -iam the -ch ola -ul an -tr fc -termin ally -ori st -o gle -light bulb -zo or -web store -wait ing -render ings -poetry month -parach u -miniature monday -metro link -m ple -kre w -empha sized -car rot -íĺ ķ -vari us -roman ticism -mahesh babu -lake show -jol y -cormor ant -break in -ag ni -v av -shack leton -po of -mass ager -man ay -m br -kag awa -brew ery -att ila -ade d -pav lova -lan ning -king khan -i ata -fl our -dun ning -az awa -are th -yee haw -shel tering -se bi -ru pts -pin i -nar rates -far rar -cho kes -bo ssa -snoo ki -sep tum -p ounce -my team -my n -metaph ors -mag ine -leaven worth -lay man -lat ch -hi jacking -hard away -gu gu -godbless america -dil ip -cla r -brun o -ا٠Ħ -wer ks -vision zero -t whi -sei ko -ibm watson -emul sion -bho ys -ws vn -voice mail -v cu -robo tic -ro k -o woc -mari ecla -cric h -av c -su bi -shivangi joshi -hai da -s keeper -mid ler -kn ackered -kirk patrick -kil leen -i fc -y ala -vege tarians -sub terran -shat ter -mdc ps -max ine -mat ta -amic hele -pro claims -pri sma -h dl -for de -fo ams -end less -bill eric -an si -ti rana -smoo thing -roun ders -man ics -koo kie -invin ci -ari ad -adop ters -timess quare -ta ec -sco li -s wash -ou tt -o sho -gas co -fo c -dru pal -coy w -bus king -bat ti -ĸ ï¸ı -ðŁĺ© ðŁĺŃ -twal ker -the vote -o ha -man on -kri t -jose p -e inste -contex tual -caradele vingne -wee zy -som er -ro an -pro ton -oke anos -halo gen -german gp -choc taw -ta q -syste matically -sha shi -om ens -mad dison -focu s -ess ay -air bag -tsh wane -scho ice -pr é -hed wig -deze en -ab dic -ðŁĴ°ðŁĴ° ðŁĴ° -vaid ya -holist ic -down ing -desal ination -de are -adole scence -ou trun -nu di -má s -indie author -f agan -dof theday -conce ive -chest nuts -arch diocese -ac are -world war -gun g -g ada -cel ts -as una -à® ¨ -un cu -sun ggyu -seaf arers -red field -pis ses -odd ity -blow in -( ': -à° Ĥ -r q -nan ak -iri er -ha velo -cri key -chase elliott -c mr -bar atheon -sat the -newindian xpress -imple ment -div ul -delu ge -bla en -be el -ìĽĮëĦĪ ìĽIJ -ul timo -stained glass -ro lex -pla it -narcissi sm -mi gno -mal abar -leu kaemia -ing up -hot ch -d cr -chath am -blanc pa -ti pper -glas shouse -drag ster -dil apid -anim ators -w fla -toi let -pi o -paratro opers -mi stic -hir sh -guru gram -Ħ Ī -vie ux -sub sea -quin lan -nie der -nes n -li day -lau t -ampli fiers -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃ -w ami -over crowded -fir s -d nd -carto onists -barre tto -wh eni -uproo ted -stun ting -spital fields -smur fs -perfor ated -n fa -kios ks -him chan -fli pper -daily deal -brand new -ðŁ¤ ¸ -íĪ ¬ -re mb -mm mmmmm -iber ian -freak y -falk land -art news -ak ha -ðŁĺ ¶ -the cure -strath cona -sel fe -omar keting -om ani -for tw -brad dock -ðŁĺĮ ðŁĺĮ -ðŁĶ´ ðŁĶ´ -san remo -hu ma -guil lotine -foot bal -dun lap -dre a -cast away -but ch -sl ant -rout ledge -on sen -litur gical -grunt led -discovern i -bou che -and am -ðŁı ¥ -tuss auds -think pad -super group -summer solstice -que sto -notice ably -fi bres -ende d -colly more -buzz in -ai k -w ate -vivi an -stav anger -re produ -pancre as -gar cetti -ceme teries -bird song -arith metic -ten is -soo thes -post modern -mul holland -cn j -bi agio -ar tapp -antichri st -yol and -so be -run time -puri fied -prou st -jo m -godd am -far id -cru yff -ðŁij ¨ -un ig -ta chi -syn chro -pa sir -ob la -lind t -le de -dist iller -cry o -ca h -atro cious -ãĥ © -x en -wi dow -veg gie -scre wing -roman reigns -ker nels -cream fields -ak ala -wri sts -work sheet -mar su -mar nie -mac o -io d -con volu -ar les -. ðŁĴķ -mo te -j ds -ers for -du ty -div ina -animal alphabets -accu weather -west minster -quin cy -pou ting -n live -lat our -ketch um -gi le -Å Ľ -wood bine -paragra phs -nad da -ac tic -white sides -ung u -som ber -min ot -lati fah -horror news -hero isl -gem ma -sky train -ni em -ne urs -mon line -jay hawk -fe cha -fast company -ce m -armedforce sday -! " -supre mely -st exas -premi o -pal mi -nie to -n ge -abe g -âĺ ģ -x r -reno wn -mor ten -ga sh -ap j -ë¹ ħ -whats the -rain y -conceiv able -af db -t live -shi itake -r mw -om alley -ke ving -stun tin -espino sa -de br -constant in -art show -ze wski -z ander -summer school -mo rena -ferr ar -d wight -boko haram -slo ths -shill ong -ky e -kry st -equ atorial -capital weather -bi onic -bc i -bb mf -arche ological -aly son -acquaint ance -!!!!!!!! !!!!! -z ina -ye ong -th ali -red car -iti zen -he cho -gri gio -du sky -de grassi -bermond sey -b nwt -aram co -ab ut -wine makers -tu al -rhetor ical -hesit ant -ay aan -at op -ap ha -sel kirk -sd v -neck tie -jo inted -jo fficial -hi bern -fle xi -dow ry -chap stick -x anth -la ren -fla shed -eg x -bin ay -agnez mo -zu mab -ra at -mat suri -ly wood -jose f -har ald -bal sam -ðŁıĥ âĢįâĻĢï¸ı -shannon leto -sa aho -s anne -mo ans -gott alent -dam us -co e -bam ber -swallow tail -snat ching -sharpen er -ligam ents -ka in -evan escence -appalach ia -à° ¨ -the ir -skag gs -sau st -partic k -lin ks -john legend -i bo -gn an -twit t -n fp -em b -doub ters -bi ak -ad ria -âı ° -segun do -sapi ens -cm h -yadav akhilesh -win i -t pt -ron d -mau rer -margi ela -man olo -jec ts -ha wn -green point -ev on -atlé tico -scam med -n nw -key less -i he -hol den -attackon titan -voo doo -thi an -tau pe -nal ang -me ath -je i -i ann -hr tech -dar lin -blackex cellence -best fans -b wa -ðŁĺī # -vo z -rup tured -mam ac -m bu -lu gar -indeli ble -he bert -al aa -seag les -ruck sack -dav y -copy writer -am ok -ab sa -ror o -q amar -new wave -multip lier -mc adams -ly chee -latel ateshow -hi ke -gen er -dra ken -cul lo -as cap -where are -radi ate -power star -ms w -hon do -gas light -bre y -az oo -at erials -ãĥ £ -she boygan -regi ster -quinnipi ac -pedro sa -mu ffs -habit able -buck head -taun ting -princi pe -na ar -hi ba -duck tales -british columbia -sug i -road block -pic kin -op tera -le os -il ford -hand picked -da shed -bal los -acceler ates -un orthodox -trend line -sy cho -hex ham -ev ita -malar key -dor mer -bri x -alici a -adel phi -ro ssa -plu mbers -newe gg -nai res -jo dha -impover ished -h mmmmm -gal en -em v -defend ants -ðŁİ ³ -way farer -to ca -ste vien -sli go -perci val -jk corden -g pl -aer of -ac es -yester year -sc as -salam anca -rey na -pv fc -p tr -harry styles -dan n -ãģ ¾ -belle za -alo y -ab alone -xian limm -hur r -hot topic -home ware -eas ports -clashof clans -ber ti -an ad -v ca -st ach -square pants -shin zo -cor ks -ðŁĨ ĵ -what syour -sh ey -ra af -pri mus -narc issus -massi ve -klobu char -jor nada -ben elux -a ou -âĿ¤ï¸ı ðŁĩºðŁĩ¸ -tre acle -tion alism -st oun -sab o -jalape ños -dar kk -ci ma -bu ku -bridge t -beha ves -wim mer -national gallery -mis conception -epi ste -b na -ani vers -us ka -u soc -ne ocon -ly e -kang in -cry baby -cler ken -car m -re ga -par ameter -over taking -nu man -mor nin -job fairy -ha f -fil o -exceed ingly -end point -b kapoor -an x -amaz in -sau teed -mal ick -lu gano -front row -di en -Ø§Ø ¨ -ys se -sti pul -sr m -sc roll -rever se -no tal -key boar -immort alized -com d -arch way -aficion ado -up heav -ta ker -m ä -hou rof -dog show -mo oring -meat less -king scol -he ter -hand maid -cani ff -bo ssing -amaz ons -x lm -sav it -ice cube -don te -woo oo -ven trilo -sy ring -sen or -pondic herry -plan ck -par ov -p ening -mcdon agh -dwind ling -dar fur -credit ors -cra zed -cr j -an ong -mar coni -devi led -carmar then -bik ram -ðŁij ª -vig or -v fb -tro ss -to th -pe u -in paradise -dev out -que tz -mi dr -hag ya -fu sing -displa y -ben teke -amir ite -ty rol -tom atic -tic ke -ro bredo -kum kumb -hurricane matthew -grand canyon -chapar ral -cat ania -car ousell -seri al -seme sters -reper cussions -ouach ita -moon shot -ic les -how doyou -d sen -comix ology -children in -richard branson -read er -p so -g dragon -far ro -ski pton -shoe gaze -ni dhi -kö ln -green wald -smu ggle -shel led -sh of -hern ando -edu ard -am is -vau lt -more llo -m ll -inter generational -i ab -don agh -bur kin -ä¸ĸçķ Į -âľĮ ðŁı¾ -venezu el -v ato -sto pover -som bra -sal ad -pav ers -i bi -beaver ton -aerial photography -aber g -åŃ IJ -wy ck -progro ck -ni vel -mc do -land rover -esc a -bis d -ðŁĵ· :@ -s gr -re stin -nar uto -longre ads -deliber ation -a ight -ðŁĺ ¦ -ssi ma -ri bbed -intro verts -end re -ah r -ðŁİ¶ ðŁİµ -á rez -squ i -park life -mo se -dal its -calm ness -bc t -angeli que -un surprisingly -un necessarily -tor ched -sw u -sof i -reimbur sement -qu inox -may e -cy stic -clt traffic -ac ed -xi ang -waz iri -supper club -se ti -pa oli -ol on -kr g -ing at -u stad -u gl -twhi ddleston -phine as -ing rosso -digital nomad -ar to -ver milion -val po -sch om -penetr ating -ky at -hand woven -fle mington -( =) -w tae -tent acion -ste em -shri e -mp l -ic am -i pan -ation ally -ðŁį ³ -th k -reti re -re mission -re done -phar ma -ove chkin -it sm -donaldj trumpjr -crack er -barist as -ari ah -app liqu -aote aroa -ab scon -west wick -veriz on -sydney fc -enthr alling -chad ha -bn n -bi stro -ðŁį ĩ -trans missions -straigh tened -mol in -letsgo bucs -jordan knight -gro ff -freel ancing -fin gered -car show -ac in -nt fc -klam ath -hitch ens -gee bung -el vin -cre amed -bourgo gne -pie monte -j su -ha bana -gran turismo -aqu at -** **** -!! . -zhe jiang -twol ves -q wer -mb urg -im partial -hor d -har ps -gr r -g illum -dar by -b ens -ap b -air lifted -pale onto -no things -gr unt -c sb -at ree -afgh ans -ðŁĩºðŁĩ¸ @ -support local -sub stitutes -gu la -ba ju -ate gate -amig as -ab ell -ve m -tw ing -o don -long hair -is ley -gu tters -gre ase -g fa -fu mi -wul f -se ase -post code -e gal -champion scup -c sis -ali yah -y rf -w saz -sr fc -me gyn -mag net -kno wns -i hs -drug store -biomechan ics -aver a -wimble don -slu ggish -si mmer -science museum -qué bec -nok xl -man do -k lub -gran bluef -dü sseldorf -col ab -ch ars -boo ger -tin nit -ra fferty -ne k -mo v -hand out -ei u -cat skills -business intelligence -boywith luv -raik konen -rachel le -pro g -mt pol -mccre ary -com pote -child marriage -aa at -âľ ¾ -zak zaky -womens rights -tre port -tramp led -no tb -m ri -lucas film -lo stin -law son -jun cke -juncke reu -ho tty -syr inge -su ds -st ooth -ka ar -ity uk -inter play -hon dar -ho gan -fu ssy -exal ted -en crusted -c bo -absor bs -ãĥ ij -ter tainment -styro foam -reali stically -n pg -men orah -mcgin n -lan dish -i ki -hr p -c chs -yo self -shi vika -petro l -morphe brushes -men os -mck agan -k uni -gob let -davi do -beau t -bart enders -ðŁį» ðŁį» -west moreland -war planes -py ne -princi pled -pen sive -par s -need to -mar salis -local e -harper collin -gi v -ap riv -al tos -zace fron -z at -takeme back -sridevi bkapoor -py ar -pla w -expend itures -de bug -ðŁĺ´ ðŁĺ´ðŁĺ´ -z ok -s itec -ne fer -n na -ki ely -co ty -anim ation -an war -ye shua -royal operahouse -nf v -cur t -beat le -........ ....... -ä ¾ -âĢ į -sy phil -sy an -op ts -lu ang -hol yoke -en tel -do terra -bl und -anag ement -alum pur -si ra -reiter ates -parad is -kpk updates -e ased -command ant -ande ren -Ļ ï¸ı -too ts -nott ingham -ley fc -ec i -ec d -comp iling -bm supdates -berdy ch -ar ron -val der -stri kingly -snoo zing -si ento -nikki haley -mar lies -ic illin -femin inity -fat boy -cal dera -bon ey -boat show -affiliate marketing -ðŁ¦ Ĩ -win nie -win dies -une ducated -mac aroons -iiii iiii -critic ise -coron el -beng a -twitter ati -p cl -n mb -les bian -jacqu eline -hom bres -encan to -dog slife -suppor tour -ral ston -cine plex -ð٤ĺ ð٤ĺ -work horse -tour nage -sa at -new sasia -k ish -indic ative -chat ty -cali pari -blin dly -street photo -slu mped -reservo irs -lac tic -ble ts -w tt -ta jinder -sobr ang -ro the -la uri -idi oms -hor ts -cran brook -cb f -bulaw ayo -au ro -ze a -southe ast -par ale -ing alls -drawing august -co existence -ðŁĺī . -tin sel -syn chro -stedd fod -sh et -rp gs -poppy legion -out loud -in dr -eli jah -electric vehicles -co wh -chit ra -as ahe -yu mmm -vene ws -swach h -pc p -over ride -mu z -k ada -el bert -du sty -con cussions -brazili ans -ar ame -sna il -out burst -ni hr -mun do -jean nette -har greaves -fin sbury -fa yo -dylan obrien -se ssion -sd m -sc run -procrastin ating -gol dy -brid lington -________________ ________ -tr uly -mon ies -jour no -halcy on -fer b -ex mouth -all day -soft ness -its all -hard style -bo yl -az adi -uni formed -six nations -sekar pandian -nikon usa -nc i -master of -ice bergs -hair pin -demilov ato -deben hams -crowd fund -ash croft -ang ering -: )! -stu ffers -pushawards maywards -p yo -m tu -hand ley -é » -u on -tobi as -tal aq -sig ner -ru sted -no zom -magni fying -divi der -al de -:) )))) -!! .. -ภ¶ -ठ¡ -po ons -oil field -do tty -air bags -sl urs -rapap ort -ms me -klon dike -. > -why not -tw omen -reboun ding -mi ken -ho dl -fru ition -do er -cin que -certain ties -âĢĶ - -tiss erie -theprojec ttv -se ducation -jewell ery -in between -impre ssively -hair y -floo red -flo wered -de carbon -bari atric -adar shan -ãģ ı -water ford -tre stle -tann ins -mo in -gi sts -g be -brande is -boo b -behavi or -b pi -acade m -yam aguchi -penitenti ary -mosc ato -dusse hra -democr acies -bla key -bad dies -azte ca -ar cy -tru ely -squ ab -ghazi abad -bu gging -bal vin -am nh -âŀ¡ï¸ı âŀ¡ï¸ı -à¸²à¸ Ļ -ri aa -mennon ite -ice ps -hey wood -we fly -sig nat -shatta wale -shab irah -moor ish -men tee -hudson valley -bas mati -? ), -tigh trope -sor i -raj sekarpandian -ne manja -lu zer -fre t -en list -el dridge -e hh -bett ingtips -apple sauce -ðŁĻı âĿ¤ï¸ı -âĹ ķ -trumpp ence -sol berg -po inte -ero ar -energi zer -death penalty -ch iro -ww l -fla u -evol ves -à ¦ -ther ain -slo g -sk ova -rc mp -kumkumb hagya -go dolphin -camber well -be ading -ax ing -z ki -war blers -une qui -toowo omba -salt lake -panam ap -ny p -mc cord -light year -je fe -itu tion -hydropon ics -car paccio -sho spital -mai da -indi erock -cu enca -bati sta -all access -____ ____ -ì µ -sab e -my life -e dex -ber ne -av ings -ani ello -stor onto -pre aches -head piece -hair dressers -f sc -ex patri -dana white -ts f -tal eb -stein beck -pin der -mol l -lu ge -lil kim -jin woo -camp ing -broc ade -al locate -ï¸ıâĥ£ : -áµ ĥ -out takes -monte video -lom b -fun ke -flet ch -ê³ ł -z nation -vi Äĩ -ve sted -shabirah luwalia -pur su -o ath -nas r -mer cato -dave y -= " -wi red -uni do -t ili -re ston -fren te -di aled -cf pb -/ â̦ -vel our -sle u -o ren -mad ina -ken worth -kell yanne -enchant ment -b ce -av ana -ana than -! ðŁijį -ðŁijĬ ðŁijĬðŁijĬ -ðŁĮ ® -ur b -sar ap -reli a -knes set -cy p -chan neled -caball ero -bcli ons -v ella -pri sing -pine wood -n ane -insi des -gorge ously -flet cher -al jazeera -pre cep -per vasive -pen arth -mam my -kins ella -connor franta -colla bs -ahmad shahzad -w tm -mercan tile -loop ing -loo ky -i got -fa jr -s dotcom -pat naik -do brev -bor os -ad erie -stell ar -liv re -impre ssi -da hil -bas ing -wedding photography -stu pa -or z -mar ky -mag da -id len -grat in -dies els -cas ino -appe aled -machinegun kelly -m ct -beck man -at water -ëĭ¤ ëĭĪìĹĺ -tur i -st david -sre bren -smo k -pu yal -mor pinoy -inter st -you uuuu -yo der -roo i -rith vik -re payment -rat cliffe -law ren -flatt ened -cu so -ar tic -tal en -sig nees -hart mann -ev ac -dri vin -clo ves -ab lation -yy yyyyy -thro tt -th é -sw f -squ ig -jhal ak -ig nit -calabas as -al one -ðŁĺģ ðŁĺĤ -ÄŁ lu -throw ers -sway ze -srees anth -sex iness -gen ji -algi ers -z oro -roa die -posse ssing -paras ol -over watch -o dm -mal mo -ec khart -desi st -call me -) & -! ðŁĴĻ -ðŁĺĥ ðŁĺĥ -tas a -nor vina -kom o -i kaw -brutal ism -bar aka -tablec loth -out pouring -lovel ace -guar da -ga vi -circa dian -ba q -umb o -tri gon -the f -tc dsb -ta ku -sni pes -protag onists -par kin -das adarshan -cur ried -c ne -st ico -ro ja -or p -noton fire -dragonball super -dac ia -blue monday -b fs -are e -any how -adopt adog -ë ± -åŃ IJ -y ur -syl vani -rip ken -ore a -milton keynes -la it -je z -gay lord -g ase -edam ame -ba iled -v ry -si ds -rain storm -emer alds -cent ra -becky lynch -à® ³ - § -viceg and -then or -tem bre -o tw -jad ines -ain sley -petal uma -nz wine -ha emo -dor ky -ãħĭãħĭ ãħĭãħĭ -ãĥ¼ãĥ Ī -utili zes -shaned awson -ri ze -har ts -ha gar -effici encies -deu ces -def tones -centr ally -wildlife trusts -n fr -gt fo -cuis ines -boeing airplanes -ãĤ ¤ -v su -treas u -tam pon -sth lm -staf fie -simr an -sh ey -home wood -dougla s -tn tweeters -spoo ked -in ag -i pl -guang dong -culmin ating -botan ics -bha v -yl ation -very where -vel y -ten ner -ru bies -nar ita -muje res -kar ol -fa o -custo dial -uof g -ra heel -plac ard -lawn mower -ja ar -ation ist -âľ ¿ -un accompanied -sleep in -side car -qatar airways -fright fest -blu me -batt lec -tampab ay -syn gent -pend le -i bom -hu er -head gear -cosmo polit -wal ther -transpho bia -san gi -or da -hexag onal -hb cu -gryffin dor -disrup tions -ber lu -ark ham -app el -ðŁı ı -wash room -po y -pk r -new sies -mon ahan -f ene -e mas -dispo sed -the moment -shir a -kuma si -hypno therapy -dhan an -ang ler -wh et -vo u -newh ampshire -manchester united -mam as -if you -hor sey -h ma -gin sberg -de po -tran scri -tajinder bagga -oun i -lees burg -k imp -happy weekend -en coding -bru ton -broo ker -broo ches -bor k -ang lais -îĢ ¢ -st eves -sk t -negr oni -hir i -e ber -dic tion -amal fic -tho tels -som i -shap er -q asim -invigor ating -gan try -fle er -cc m -blue water -atro phy -ìĨĮëħ Ģ -tourde france -fet ched -che aters -centr icity -armp it -yu cca -tax reform -snu g -ma up -li go -hr mann -fu ses -under represented -strath more -seab ird -gulf port -dam sel -colli er -az er -a online -worldfood day -sil vio -nz d -nach a -gr illo -fair fax -book blogger -zam o -work bench -we do -traditional art -thel ight -rain forests -or phic -l ma -ko z -indiffe rent -gu apo -cw m -conspir acies -brum hour -be el -vari eg -pay et -is ang -go sport -empan adas -conver ged -am ping -wom bat -wa u -the way -merci er -mccar ty -itt y -is beautiful -hu w -was ser -s first -oni stic -mtvbrkpop bts -galvani zed -ei ghts -ðŁ¤ ł -ma ac -kel ving -grindel wald -co sas -calab ar -ar aw -# # -ðŁIJ ² -tag sfor -pur rs -nai ledit -msh sl -k ore -ham mett -ec ret -dra goon -d cm -clo i -v ics -trail blazing -loc ation -lati f -islam i -geh ry -ff xiv -dai quiri -chipotle tweets -bha gw -ab end -ðŁļ ļ -tre x -shre ya -re gen -qu illo -noon an -can ciones -âĺĢï¸ı âĺĢï¸ı -wa heed -u ggs -ni et -go da -fra il -dis gruntled -app u -anti a -ak ha -un sg -super charger -quoti ent -q l -non na -ne ely -m cauley -g fx -ford ham -far ns -⼠ħï¸ı -to ke -team moth -sr x -ordin ary -mini mizing -borough market -beckylynch wwe -az an -appro ving -yiel ded -we remember -metro polit -here ford -for rest -er ne -dar la -sp rocket -sl en -outsi der -kas kade -iam cardib -hon our -fom c -fia formulae -ev is -! ðŁĺģ -van loon -fif ties -sun gai -sil encing -pop corn -p sm -ou sh -nigh tri -naam kar -el ing -cup cake -bo te -am ac -ack le -scar lett -saf ar -pl f -n pg -msi sodia -men lo -mc ps -lu thor -h hi -b sn -ature uk -voice less -uttar pradesh -qu raishi -pover ty -l fi -kis singer -bon aparte -at eli -sur bhi -re designing -ma dan -ha id -fi stula -dra pe -car ded -asi mov -pear se -p tl -infu se -enor th -clu j -chri scol -cat riona -tr d -thingsto do -tat u -sil vi -schaf er -q at -naz ar -man ts -jab ari -fi ddle -baby boy -al politics -turi st -sur ly -re purpose -pare ce -men dy -ku ching -iso m -anime expo -ag ung -a achen -ðŁİħ ðŁı» -âľ ı -Ð ¸ -pesh awar -pe plum -n fu -liqu orice -inte stine -ingh ouse -footh ill -áµ ī -vegan uary -skep ticism -oo p -gor on -ak at -ak ai -ðŁijī ðŁijīðŁijī -the t -sport ster -ph ire -n fs -cere digi -artif icially -v rs -l bor -eri ver -cant stop -bead le -bao bab -ðŁĶ ĭ -ðŁ¥ Ī -ner dy -medi ab -fly rts -f ty -craf ters -ar dern -wl f -sr hr -s ft -mac ros -id it -hard man -ham eed -co da -boo kie -arri eta -sketch notes -pr u -o tor -granbluef antasy -co by -universal hub -there samay -spor tif -ri h -pper ton -mal le -ike ja -deut ch -audio visual -ati ans -sar ai -mik ko -fal z -dest ine -cow bell -carav ans -ðŁIJ¶ âĿ¤ï¸ı -âĤ ± -sad c -pari shi -no won -me ads -de vious -ta ÅŁ -sal one -q h -oo fficial -friday fact -easth ampton -aq a -v sk -sch ap -ras mus -ot us -osteo arthritis -orangu tans -concier to -cit ym -ah s -un loaded -sidd aram -le as -ha gger -gam bar -ðŁĴĥ ðŁı¼ -un spoken -tuesday tip -native plants -gran blue -fic ci -cart els -ðŁİħ ðŁİĦ -à ¬ -wi ggles -sheph ard -sar andon -saku rai -lumi ere -human e -dapp er -cal med -th abo -taylor made -po si -mi ston -hoo ch -freedom of -ational park -ai lee -sophi abush -sc mp -quick silver -han teo -ðŁĮ» ðŁĮ» -sab ah -remedi al -knick er -exc els -dau gherty -alex ia -sque e -matri mon -mad di -kun war -hell raiser -har uka -gi es -evolu tion -coo ke -bell at -ari elle -ak hil -active wear -tak sim -mari ab -kun dal -gar cÃŃa -con esto -click er -thir ty -sub strate -ra ye -pro league -p gc -gc se -gain with -ct n -consu mes -vi ks -stupid dope -smi a -sfor th -lifel ong -kha bib -ga ea -den o -brink ley -army selcaday -ðŁķĬ ï¸ı -ðŁİ ² -ãģ ĭãĤ -ww f -wheel er -surrog acy -squ int -marc ello -lolli pops -ic ole -chel t -travel with -read ying -fur ness -ey elids -evening standard -d ll -whe e -p ks -om gggg -logi stical -hun gama -er ve -cor ked -brig ades -book loversday -ðŁijįðŁı» ðŁijįðŁı» -wh ockey -tu ttle -son ko -ros anna -non i -in atureuk -tr f -sk ated -scri pp -mad verse -jo ked -i bc -er ri -daph ne -collec tion -aw ood -abdu laziz -ãĤ º -vas und -vapor wave -mo res -li ger -is ing -intru sive -ak mal -ä ¿ -ãĥ Ŀ -weather ly -w la -schen ker -ruth ie -eye care -eco tourism -di ap -cross stitch -benton ville -barstool bigcat -ati que -af re -ad ama -é Ŀ -ni ghty -lon i -kk u -funko pop -ev oo -ec at -che alth -az quez -polyne sia -nat ge -micro fiber -mi o -manag ement -king sof -its ch -enlar gement -emer gent -e od -barri er -acor p -teas poon -tb sp -stat t -squat ting -r fp -pas cale -p flu -ma el -jawa har -da id -con ey -vo s -sa un -goo ding -g andy -cogn itive -y dd -vis ser -tri m -su pe -so ared -six th -rizz oli -mi kas -kat arina -gulli ble -as pin -alexand ri -tri fle -tomi ho -sha in -nn nnn -mand ar -j ink -gu tenberg -discover ireland -c kie -weg mans -wedding day -v ail -so tom -music thaman -kil i -ka ke -ci el -bt cusd -be wil -âĿ ģ -under side -q b -inquis itive -har relson -gut feld -forevery child -duc ci -can ap -ag un -Į Ģ -wee per -wc ws -spe w -ri ra -pimp les -mother nature -min seok -leav y -it aryan -ir k -day um -cristo bal -cat acom -alti ma -ty pos -off beat -nc su -in tox -hur ri -gow dy -go an -edu c -d mn -ber ly -low country -in set -hom ey -help forheroes -gr out -fl ung -f enty -elimin ator -bro ly -bal th - ± -wag ner -sm ell -iv ana -in ds -hi ga -ha vas -fed cup -fe sts -f mcg -eigh teenth -daw es -can arias -âĿ¤ @ -swa hili -surrey bc -redd ick -camar aderie -animal cruelty -vali ant -shou jo -dun lop -[ [ -twitter bestfandom -sho spice -ma al -ke eler -ju les -food photography -f locks -dangan ronpa -responsi ble -oh no -octu bre -mo leg -can el -bri dle -ad ream -talla ght -qu ens -link age -la de -clam ps -al maty -ðŁıĨ # -ver dad -su i -ringof honor -mix tape -mai dens -lem ire -cen se -ber nd -aw ww -tom hanks -home opathic -dis ick -bethany mota -bahra ingp -ait ken -ðŁİ¶ ðŁİ¶ðŁİ¶ -zi pline -twi ggy -stead man -ss aint -sd d -sch ka -preven tion -mike brown -l land -!! ?? -sle m -senate gop -os an -heire ss -gi ii -fo w -bur ney -as wan -s ja -mour a -hump ty -cutt ings -cra w -an ky -sp ed -running man -pdx traffic -digital isation -deple ted -church of -staf a -ss j -soom piawards -se der -pete buttigieg -per f -le ym -burg laries -avi va -ar thouse -ðŁĴ ¿ -y lona -to cks -ss mith -sam thaan -rec en -pro bowl -overs old -euro pa -vaj payee -or say -of m -myle skennedy -methodo logies -ko jo -history teacher -gu j -dre m -cap ella -bun yan -s apol -parti do -ju gs -hun za -dan se -bobb le -yar is -skir k -laugh ing -j ell -hoursof lemans -fram ingham -da eh -ch anda -u ab -tam pons -re pair -ne ko -kw o -good time -ag in -we have -renfre w -qu att -mul cair -jeff ers -cater ham -view points -sf su -kindergar teners -gartner sym -el ong -c wl -br rrr -ðŁ§ IJ -å° ı -ro then -pil bara -olo red -my heart -mand ates -ma ith -barbe cu -adag gubati -ad oring -( £) -ðŁĩ¬ðŁĩ§ ðŁĩ¬ðŁĩ§ -tra dar -my ung -move ment -br r -blogg ers -are z -aller genic -âĿ¤ï¸ı ðŁĺĬ -womens fashion -ton kin -rakh ine -rajas than -lich tenstein -i ad -g sx -exc elled -eli se -s blog -l bi -kine sis -is ometric -enthr alled -e il -duc ing -dri zzy -clar issa -to pic -summ itt -ridd led -mag nate -fi anna -eu er -book my -ali enation ----- -- -yuv raj -von ne -tn r -ten ey -shin ing -rhe in -po to -pen ed -new book -kel len -jack sons -flat bed -el ah -cre do -cor nered -zu g -wad ers -sub hash -smol lett -p sa -mm c -mar rakesh -gir is -elast icity -disney channel -carbon ara -bi ar -anc ourt -sunny leone -mv g -mun roe -meat free -mac y -he matology -ev enti -x cel -us agi -stock bridge -star board -r pd -mad hu -le ma -boise state -african union -ê°ķ ëĭ¤ëĭĪìĹĺ -好ãģįãģª äººãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ -yu mmy -win ans -ran jan -no du -n gay -mk x -massac red -koo k -aidan turner -adi um -ðŁİ¨ : -ìĭ ľë -à¥ĩ _ -sunny vale -ra jab -pr d -kat un -ign ites -harvard biz -es y -deep a -at own -ðŁĩ¨ðŁĩ ± -toronto fc -sc v -re ni -ot g -neymar jr -mar mot -kal on -io p -equ in -echo ing -c du -bis i -beau jol -barric aded -amar athon -x ps -ts wim -super car -magical kenya -l pa -kri eg -be sser -waziri stan -save slives -pro kabaddi -or t -mü ller -mi ui -ha zza -em es -animal sin -âŃIJâŃIJ âŃIJ -united nations -tc f -se gg -nsp cc -ka o -inter modal -gill is -fri ar -danis notonfire -ba hru -amen ity -like wise -jard ins -ill at -idlen omore -gwyne dd -go ol -cess ation -am ay -nat su -ga vel -fran gi -dun n -ati va -and el -tur pin -sh ind -mo hr -ma ggi -king man -heart burn -h fc -glu co -f ll -b nw -am ae -affirm ative -,, ,,, -video graphy -sal esp -n º -jo er -jap on -f ylde -bu a -anush kashetty -win chester -scon to -no tyour -m é -kual alumpur -juli anne -ju r -four seasons -dev itt -cur sive -chiang mai -asp ca -am ico -ad joining -sta c -kee ley -jo i -hal low -go y -em f -dill i -diag on -cb sd -cal o -war ring -survivor series -stol l -stay strong -qu y -moo kie -m ally -hospit able -girl problems -exquis itely -drive in -down turn -d modeling -co pping -cad y -br ough -b ould -$ , -visit portugal -subver sive -run ny -oti v -musc ulo -k illie -in habit -hand stand -fil le -ro coco -l ge -facebook live -eu vre -black friday -thrombo sis -standre ws -r gs -mie expert -lu sa -fra sier -epi genetics -bant u -artistson instagram -ðŁĴĸ ⾨ -o sos -ipo h -cardio logist -é ¦ -white wash -ri que -peter bilt -pencil drawing -numb ering -mon tag -g ell -dr t -cra shers -ani mo -íĶĦë ¡ľ -travel skills -ro ped -fore sted -ed is -br l -bo ol -sn out -sd c -reli eves -ram in -ha usa -amp us -mar itz -initi ates -dero gatory -caru ana -bol i -tian anmen -shiv sena -opho tos -ol ice -li feli -den iro -ann unciation -zar o -xxx tentacion -sto cha -spac er -sco field -rai pur -no ctis -jam mers -gra fting -dent on -baira vaa -- / -ðŁħ ± -z onal -z ille -vagab ond -shoe box -regre ssive -kel d -jo elle -home stand -can you -anup amp -play mobil -p á -kra uss -jame el -e uk -bra s -su med -sto ys -sting rays -stat ue -remember them -refe re -produ kt -o asi -mary jane -hong ki -el mira -conduc tive -char io -bu kowski -ðŁĮ¹ ðŁĮ¹ -tibet ans -tcr wp -small ville -por tal -love whereyou -ie bc -gor ham -communic ators -cl acton -cat ford -at an -ðŁĩ° ðŁĩ -stor ies -shattawale gh -re sorted -pad stow -p wr -grey cup -fou cau -for tis -curren t -co sted -chong qing -ta vish -ta illi -ste arns -le murs -iri t -gad sden -ep r -be stow -appen dix -amalfic oast -truc kee -ther un -th nk -t fios -mon tero -min ous -har yan -ep fl -dy kes -de fund -tim kaine -rose mont -li vi -la usd -jo vic -ghan ai -boston strong -am ama -z ent -ush ka -swan queen -mis match -millen nia -jaw ans -el va -an ee -admi rers -ro lo -optic gaming -much love -i ha -dot ca -dig by -ag al -adul ting -ç§ģ ãģ® -v la -tun bridge -sur bit -no ho -la fc -jerry brown -gil insky -fb pe -eli ad -do good -dark matter -ban de -yu my -w thr -temper ament -p wa -ou ija -no sey -napp a -houn slow -h cp -goo den -american art -% + -south lake -ron an -reg gie -marth as -kir in -de a -cu toff -\ \ -ðŁĹ º -ðŁĩ¦ ðŁĩª -te vez -shel don -ragh u -push kin -passi oned -nar ayan -illi ons -hol din -c sos -anupamp kher -ë ¶ -z et -vo stok -vo gt -support the -sr ar -mour ners -laun dro -k cam -co hen -class ically -pss st -hassel hoff -fa erie -black mon -ac tin -tribu te -fil me -expir y -d mc -atur n -voy age -old field -mkh itaryan -lean er -jerrybrown gov -is enough -e ft -c suf -bu ca -batter y -b gc -ðŁĮ Ľ -sae ed -ocean front -michael j -k ross -fla ky -compost able -au den -u tion -t ite -royal baby -rod ger -och re -disproportion ate -devon hour -dand en -da ar -bas ins -b tec -pe mbs -khal e -gra b -dun ia -clo gs -be ath -ter man -shut down -re pose -raj endra -quar te -national catday -mir i -ma q -lok sabha -hyper rts -ðŁij ¹ -super woman -sris ri -oro sa -mother sday -hill sdale -eni us -disc red -bel aru -bar ring -av as -amble side -ãĤ ¨ -rot ational -pseu don -podol ski -om l -no body -nap alm -high tower -cran king -brew pub -ðŁĶ ij -Ù ī -zer os -ur ham -slo pe -sl ings -om phe -mel i -flyn n -erit rean -bri and -bel lo -aly cia -ag ap -tari an -sc ant -plu cked -p lowed -olu tions -o kee -le sm -inter vie -gall er -ent ice -ax x -wo b -ugand ans -nit ty -m kii -lin field -ine pt -bo sco -autom ating -as ketball -ane gi -smar ty -lingu ine -bb cle -ðŁijī @ -tinnit us -m vs -ko ons -k lia -ic as -gg mu -de ren -camel back -wk bw -sta ad -so res -is ola -en ps -cy n -ced ric -ber gha -te f -slur pee -me thinks -le ann -hor des -energy storage -alternati vely -ai ims -ðŁĻĮðŁı¼ ðŁĻĮðŁı¼ -war an -wai sted -man ip -madri gal -de ye -bon hams -stupi dest -ri ghty -org and -just for -j na -ipo b -gra af -fab ol -diagno ses -bio dynamic -[ + -ÅŁ k -ro bby -jewell er -exacer b -spo ty -skop je -sid ney -shadowhunter stv -paw tucket -om nia -n ong -lyce um -ingu ishable -free form -concep t -alco tt -sh weta -s sex -morpinoy biga -marilyn monroe -ic ol -di allo -alli gators -sop hila -pa hang -mascar pone -frapp uccino -clar ita -zil low -up bringing -so ch -sin nott -n q -man os -j tbc -i will -han an -flamen go -far go -doctor strange -cull man -ash ima -ad den -tutan kham -seren o -ry zen -ru mba -om agh -monol ith -cu ous -const ab -un read -demon ium -bismil lah -ap as -ab aby -te g -li que -jo son -jim in -jal isco -int i -gran by -g fw -ari at -stil t -sor tie -sof ie -re th -gw ynn -flex in -fa ireland -dispen sing -cra in -ðŁİīðŁİī ðŁİīðŁİī -ãģ į -tre mors -terr ine -presidenti al -moder nis -kkkk k -gyne co -gran ul -afro jack -unic ode -soci als -sh ec -scal ise -re entry -new stalk -m wan -li abilities -le athers -gur ung -gis ele -cont ouring -ak l -a ene -tt g -ther mal -t wor -nishi kori -cor tland -co sheriff -us vi -tsn hockey -sj u -p lowing -notori ously -menopau sal -mal ted -ma thers -kettle bell -is best -constitu encies -che ts -with standing -sport sm -op al -nh k -hu mps -edmon dson -call i -arte m -ðŁ¦ ĥ -scho tt -re ticul -ke ele -hu f -hi ma -ar ton -ar os -tim m -sc su -ru mp -oc sb -healthy life -ct u -basic income -andro ids -whitec ap -reck oned -om ir -louis ville -ju mia -ó r -sanje ev -ran adaggubati -ra ki -pil la -deci duous -carab ao -bon aventure -bel ight -the fall -o ineza -keyboar dist -impeach ed -fais alabad -clow ning -brooklyn nets -app lec -petri e -n ma -i isuper -foot loose -chakra borty -cal or -ar thu -Ùģ ÙĦس -pag an -n pm -n co -lind berg -jenni e -g outes -du ma -cul ts -! ?? -tic es -scot gov -pad mav -mam a -helsin ki -fnf jb -el am -co bbles -volu sia -per oxide -om is -new lands -hound stooth -ga eilge -so happy -re agan -o en -forthe kids -ciab atta -bal ham -af un -vicegand ako -v alli -sen i -mete o -living room -ko dy -hust le -harle quins -be ka -ag new -íͼ ëĭĪ -Ê ° -wr d -usain bolt -under card -theori sts -th century -nu ance -n lex -mccul loch -light ness -fridaynight lights -e stor -! ðŁĺī -ìłķ êµŃ -Ñģ ÑĤ -yn t -we ald -ster man -pro vocation -nik ko -mi gli -max on -hol lins -fli x -environment alist -en camp -cho reo -ï ¹ -wb g -sh eroes -ridd ance -paragli ding -obsc ura -james arthur -deep ens -deb au -char geon -boot suk -book shops -ar px -ami sh -am ay -vit ri -sc ad -lac key -f ateful -do your -cabo chon -blo x -ann el -am ato -we sty -sprink ling -rain coat -ong c -le vy -ii iii -dr gn -ìĿ Ģ -wet suit -we imar -mag ica -la ff -kaz akh -flo of -dul wich -dinner ware -differen t -dan and -cellu lose -ðŁĺĭ ðŁĺĭ -tri dent -the grand -scro ssed -p sac -me hr -mark us -marau der -k up -in col -emir ate -dam o -com mi -bu shy -ìĿ¸ íͼëĭĪ -wa iling -theli fe -so der -provin ce -pol ter -pe ake -opening ceremony -nca atf -kei thur -bi v -av ast -andaliolo isa -wol le -shi kari -pau ld -mon son -medit ative -iq aluit -im pur -cri st -copac abana -un true -uc b -over heating -kale y -iisuper womani -ho si -d wn -cu tee -cler ical -bro gan -bemid ji -ðŁ¥ µ -spiderman ps -sax ony -real james -mu see -ka po -j ure -iam ahmadshahzad -i y -esc uch -vic kie -razor back -nar rowed -mat ts -mangan ese -kil ometre -iisuperwomani i -da ws -beat down -bb d -ÙģÙĦس Ø· -vil as -tu dors -p ka -mis ch -len berg -ep onymous -ðŁĴ ł -slo o -k gw -freight liner -discre dit -chi er -bur sa -ben ched -uni bet -singapore gp -noo se -jingle ball -gra ppa -black cat -anu rag -west cdnag -up sc -ru ti -ros setti -r mh -philipp a -oun ty -gau di -effe cted -co ward -ðŁı į -⾨ ðŁĴķ -zer matt -startup india -shindi g -re test -prev ailed -mill ones -light box -brim stone -and ry -al ene -á º -wre tched -the g -sky pe -hungar i -depic tions -dan bury -cra zier -camer oun -as kin -academic ally -watch out -theal thy -mac ca -honey moon -f wm -esp y -dar is -ci as -canadi angp -wil ko -wa hoo -kam ran -good fellas -fluctu ations -chi o -ch ka -ìµ ľ -wc pss -siddaram aiah -gi allo -defl ategate -bla zin -a ima -san de -pit as -kraf twerk -hel ion -fi p -ar bro -ðŁĺ¡ðŁĺ¡ ðŁĺ¡ -ðŁıĢðŁıĢ ðŁıĢ -ra it -ra gaz -om on -fri sky -bur rata -ðŁıĥ âĢįâĻĤï¸ı -wa v -ukrain ians -tor ta -sn ook -simpli fying -side bar -reflex ology -rb w -qu ers -phe asants -nor r -no ws -ko tak -ko on -fu tura -epi x -ba chao -ع ÙĦ -scy cling -sa ini -resu ming -ph ons -japanese gp -gur dwara -farns worth -bitcoin cash -å ł -tori es -ti ga -lgbtq ia -la chey -ko si -im ro -gol drush -fi ley -fet sy -fer ran -air force -ðŁĺī ðŁĺīðŁĺī -tri vedi -tor tell -sch mid -panamap apers -ley te -guil ty -golov kin -cla uses -canary islands -ber mann -as qu -a he -tun de -miscell aneous -may es -chi x -ca den -av alon -ash anegi -ðŁIJ § -world war -tid bits -se w -padu cah -goo den -girls generation -gir ar -exter n -exemp tions -ch alo -bur lap -bi ja -b mt -trich y -she art -sb r -r ls -po it -muhammad u -mer cies -low poly -kame ham -jür gen -chab lis -bil ingu -bi ot -bal y -say ye -patt en -ma this -lam pp -jag r -frag ility -erec t -di maggio -creep ed -ch re -ati ous -ðŁĴĻðŁĴĻ ðŁĴĻðŁĴĻ -vi per -ss in -r ü -par do -light stick -kidder minster -con don -ab uri -ðŁİĤ ðŁİĤ -ver million -ti wa -laz uli -la sc -irregular ities -gin za -cle ve -all ace -after glow -z k -snee zing -nfl x -moun table -infiltr ated -fra ilty -fle ets -com pa -cec ile -car n -íķ ´ -us mle -sla vic -se ema -marys ville -it weet -hal ton -eng ler -dd t -book bloggers -ب ÙĬ -v na -ut sav -t ville -ha sty -gra di -fl ore -bab i -b bie -ar na -ðŁĩ®ðŁĩ © -wof ford -ta vis -summari zed -phil a -mccle llan -m xm -lit tering -emir ati -can tona -bet te -an tares -ag n -pepper corn -motor bikes -im poses -enfor ce -cal de -vin tages -kin ge -ja f -go stanford -fac ials -chand eliers -reflec tor -ptx official -paleo art -national signingday -g gio -di am -cooper atives -ple in -kun is -fc cla -deterior ation -c pe -bel cher -ann ac -an dean -thel ance -sor o -sh asa -recur rence -play set -pee bles -n ars -entertain ment -citizen s -alej andra -reli ably -reason sto -kut cher -geograph y -fran kin -fet tucc -edwar ds -delu ca -d ger -å± ± -yo e -wl wt -sierran evada -sha ha -sear le -se pp -san gh -reinst ate -nic hi -gratuit ous -gra eme -ephe meral -chep stow -c mc -ar able ->>>> >>> -y als -wi el -trum bull -shri mp -rhe tt -pen tathlon -lle well -in organic -in accessible -head dress -haz ara -e gi -contrac tual -compu ticket -swim suits -sledge hammer -pu di -marc in -li smo -la ins -cor nu -chick as -snap backs -sal vo -raz ors -ra pped -he ms -gab bi -fr ith -equestri an -ek won -desol ation -cw m -val paraiso -te lec -tam ron -super fly -situ ational -sh k -mou sep -cu da -âĺĦ ï¸ı -ske pta -qi ang -ol sson -np fl -mau i -integr ity -ig ns -design week -cor mack -busc ando -ba ile -ðŁIJ¶ ðŁIJ¾ -ãĥ ¥ -ul ina -tast ing -koo ten -ah p -unil ateral -spring bok -purple pride -ox tail -n rs -fr itter -bur ry -arch e -ak am -uk sopro -spec tion -sa kho -ratt an -po ste -new sa -kil bride -hbl psl -handmade jewelry -con nach -bill deblasio -toxic ology -ortho doxy -new car -lar ke -godof war -f of -dar m -admir alty -s bay -parthen on -paedo phile -or ly -mo et -jackson wang -j se -iroquo is -gor da -best dayever -! ðŁĺİ -zig zag -that describe -star fleet -mac allan -interven tional -es in -snu bbed -precau tionary -orlan doc -no one -gill ard -gar van -fl icking -fa ver -cal dy -ar shad -vo ix -stru del -nu ances -ne in -kro shan -ken seth -ciu dad -bel fort -aver ted -âĿĦï¸ı âĿĦï¸ı -var ney -th il -swi sher -spec ter -lom l -kin ok -itys c -frag mented -de in -bag ong -tz bach -reb be -re issued -mar gie -lu ff -fr ack -fil les -ex oske -blue birds -ðŁijıðŁı½ ðŁijıðŁı½ -thri ve -offici ale -m schar -freak show -bour n -al fie -acre age -ú n -wag en -stevien icks -span dek -si bs -scu f -s not -olive oil -liber o -kitesur fing -ers ack -car lin -capre se -é ĺ -rhy ming -red dead -pe aky -pal ay -museum modernart -mc coy -la very -la gged -ker b -griff on -eis enberg -condu cive -aa and -ãĤ ī -puc cini -north star -lg b -leadup chat -jo h -intran et -hu sk -fur nishing -with holding -new ze -mo tte -met policeuk -dec aying -baseball hall -ar utz -alien ware -à¸Ńภĩ -uit m -sur renders -super charge -ra fe -me than -ger rit -cow en -tor ri -tal lied -sriti anne -sho ah -mc master -lun ching -li sab -is my -hay abusa -fol ger -tremb lay -ni se -moss ad -kry pton -as amoah -ann enberg -t ween -ni alls -mul ls -may the -loves you -leon ardo -i ol -har kin -circum cision -æı ı -oper as -moose heads -heart beats -du athlon -assassin ate -armen iang -rott weiler -north york -micro sd -im ic -h ant -gru ff -gaff ney -cre dential -bnpp ari -beech craft -?? ?" -ti mon -lose weight -ist ically -house plants -e ef -dun k -cosmo logy -cam ara -apart ner -âĿ¤ï¸ı ðŁĴĻ -wester os -theri ver -t wee -ke yser -inser tion -f pga -expla iner -di dd -. ðŁijį -stair well -pu ckett -por ky -pat nam -fle es -der ay -tro tt -ten by -nutt all -daf bama -comm ends -car les -c pg -ðŁĩ¦ ðŁĩº -z eller -sj c -palmer ston -no bu -ni le -flu e -cr é -am jad -ìļ Ķ -up ad -q ay -pop star -ov sk -match maker -lef ties -jeb bush -in ked -ge un -f ite -eco boost -brit on -blancpa ingt -asym metrical -ðŁ¤£ðŁ¤£ ðŁ¤£ðŁ¤£ -w yer -to shi -s fire -q nh -main enatics -hou this -her ons -fem me -c tb -ī ´ -winnin gest -ro is -pon d -oned ay -mun na -ld l -ge ant -focu ssing -ev sky -do gan -ash y -weare r -th app -santho sh -sal for -ram allah -r bc -pin scher -noun s -mün chen -keithur ban -head stone -foodfor thought -brent fordfc -andalu sia -thalai vaa -suspici ously -sc tweets -oo re -kon dap -kin ase -disney parks -cru de -com mie -raje ev -mid life -me ag -mari posa -listen ing -ka ha -jet lovers -cer vic -yor ton -walk the -tell tale -son nen -sit ka -scru ff -pro vol -ki x -di ese -camar illo -au sunions -Ù IJ -t ards -resource ful -nb k -moo ch -mar ÃŃa -manof steel -il volo -ger ardo -ate x -ag allery -* ~ -yo p -tten berg -thunder ing -rab bi -play boy -pe ddling -morph ing -menstru ation -he ster -fr ito -eu se -davi dd -beauty blogger -soul talk -ny ong -mar ple -jer vis -gho se -cul ver -atle ti -un successfully -refuge ecrisis -r sf -j aff -gram bling -enter tains -c sharp -barbar ians -at well -v é -un ending -t pd -sanc tum -reverb nation -per c -only at -mee eee -lot sa -kel man -dam ask -anim o -thumb nails -prote afire -me ir -bull itt -bi ase -ann ad -tele port -sthel ens -sa way -raw ls -o cho -morg ana -h inged -gra hame -ch ha -aj as -un sc -land slides -cur ds -blizz ard -ar ching -ãĥ İ -vit t -un ison -ske e -pin ter -nu ma -melis sam -intox ication -gamep ad -fluffy fursday -emp ties -dalla sma -compens ated -wj xt -te ther -rhy me -real saltlife -ony c -meso theli -ke et -fin dyou -boun ded -yuv strong -sco il -pr y -pp f -nys na -her on -gran canaria -fra iche -d uni -aureli us -al un -al anna -tal lu -ro am -naamkar ann -mer ges -lit trell -ko b -hi dd -grave stone -ge c -ed an -duplic ation -cast ings -bio energy -bi p -thr ones -thail and -s don -pom pano -pig gies -moo res -it wednesday -is al -fl x -faz eclan -ash tray -af y -acham pionship -zz ini -true blood -sa dio -ra rer -new england -ne who -mi h -li fer -hemorrha ge -free standing -za idi -yü rek -r lfc -mo sby -mar gol -bra ined -ber gamo -ðŁį· ðŁį· -oxy moron -looo ove -instru cting -g ago -curti ss -arutz sheva -ali ga -al ake -whit eness -state police -o po -mark s -geh rig -embed ding -debun king -ca ren -ai red -âĢ º -villa ger -sweet dreams -sub tropical -produkt fang -pick up -partisan ship -mus grave -mouth ful -mob ley -empha sizing -avenger sin -ar ron -aci di -wad dell -stor tford -ra ym -po irier -keep going -kari shma -iam andalioloisa -hammer stein -crossfit games -whistle blowers -toyo tar -it w -he on -gly ph -a era -ze c -volkswag en -vivi dly -t act -stru tting -hu erta -gro ssed -giro ditalia -ep t -bb r -amazon uk -alto ona -ðŁIJ Ħ -prime video -n sm -kings way -shay mitch -rocke ted -po lok -nhl flyers -la bon -k arel -don gh -cheese steak -b tt -atay lor -ah on -vocali sts -stocki sts -soir ée -sat ay -n bac -model o -melo dious -gha stly -an en -a ita -âĿ¤ï¸ı ðŁĴĭ -sk its -mar ky -ic ke -euro cup -dge e -whal en -w cnc -the jeepmafia -tear th -murray field -lakel and -go cats -fur t -congr at -v air -ther mia -snoqual mie -sk ri -j q -geo de -f locking -av ak -art z -you sef -vi gn -tre n -t ür -rejuven ating -maje stic -lay er -im passioned -fel ted -fac up -cruci fix -rac on -prop ylene -prag ya -mer ion -maj lis -lumin osity -li fer -ko eman -gold cup -families belong -et ly -chri ssie -where i -pre sa -mues li -kit sune -i wan -hat sune -en cer -chang a -soren sen -ha ste -brook side -ade pt -ãĥ ķ -water bury -w man -new some -ana x -ðŁĮĪ ðŁĮĪ -tunbridge wells -thu le -manas sas -lur ks -le ting -k mov -ho ss -hel ton -ab ell -ðŁį Ĩ -âĺ¹ ï¸ı -sch ir -lan dof -hu ay -ga ol -ðŁİ ŀ -yl er -tre ati -th ay -tex pre -spla shes -shan ah -scar amu -rrrr rr -ody sse -kuz net -ir reversible -cu fc -con tri -w ys -stam pa -perfect shot -panam era -lom as -diab ol -chief skingdom -act sof -ðŁĺ± ðŁĺį -ti gres -sing along -silk road -mal vern -kis sonline -gujar at -desh mukh -anne cy -tele phony -re vis -pa ak -mi kk -m hc -hy nd -hol stein -ho garth -gry phon -cute animals -classic fm -ble ms -sk ind -scre amer -music producer -endo don -em en -av anti -rhode island -medicare forall -md x -la belle -ame dia -albe marle -ðŁij Ĺ -than h -si f -pre viewed -o sinbajo -mm k -is an -ge de -e del -common sense -clown fish -bas al -ana is -ìŀ ¥ -y vr -vie ws -thel and -sy l -pre schoolers -j omo -hoo sier -fotogra f -elong ated -áµ ī -pa inst -na han -cenota ph -wh p -ti vist -s words -releasethe memo -mika ela -le duc -eng li -der n -brown field -af n -a version -âĿ¤ï¸ı ðŁĴļ -wen de -mosa ic -margin ally -ma zi -ku ll -harb inger -cocac ol -ar apa -apl enty -us an -to zer -tai me -sick lec -life lessons -kirk uk -kat elyn -ga an -ag lio -å¤ © -âĸ Ķ -util ising -s fan -provol one -per n -mon astic -mi go -lu mens -hoo die -es me -dare devils -ais les -sph one -rou th -p nb -over lapping -or ds -norwe gian -ir fan -hus q -goo fball -d zi -cro ce -cap i -bu sk -us djpy -sy man -london er -ky un -hospital ised -felic itated -wildlife day -reven ant -re tic -po cky -pi zar -os d -ne ment -mi sta -manu ka -lin gh -g ned -evangel icals -cy dia -ðŁİĥ ðŁİĥ -ðŁ¦ Į -topo graphy -ss cotland -por tico -more tti -mor de -k q -colori st -assi es -ae o -a hern -seap lane -red bridge -ra ft -omo vie -l viv -kl f -jewel er -gg wp -falcon er -di plo -all american -ðŁĺ ¯ -ðŁĴ Ń -to ba -srar auf -mo ar -ma una -lic ht -kla srarauf -dora emon -bar is -ðŁĩ¨ðŁĩ ¿ -sy ch -pun tland -par ade -obsc ured -jiha dis -e tti -cap tioned -bab oon -tic on -stor i -respec tyourself -pu tri -p ce -npg london -mar cell -clari fying -chapp y -ca as -broad casted -nikk or -e bc -cli ppings -yan kovic -sh ali -sanjose sharks -salt water -re tty -prescri be -peril ous -la fd -jon o -cam ber -bra ke -// // -xin hua -tre mor -the david -scann ers -san gh -lubric ant -it za -daun tless -solo ists -nighthaw k -golf channel -go rey -gin kgo -diet itians -ann as -ðŁij¼ ðŁı¼ -âĨ IJ -wall ingford -visit england -tom ford -thrif ty -sher aton -rite ish -ridel ondon -persi sted -pan er -ma ir -ic ao -hi jack -g so -blo em -bant ams -way side -tor toi -t dot -stupend ous -park shinhye -mer man -mar zi -jab s -glasto fest -co fe -brah man -boon dock -apostro phe -ðŁijıðŁijı ðŁijı -zak aria -yar row -wor den -ph l -om my -li bt -hall am -ha yes -gun slinger -gir oux -frei ghter -cannabino ids -torn ado -ra fre -por th -or ban -newmusic alert -itsyour wales -celebr ation -ÑĢ Ð° -tho t -tar leton -t cl -ri fe -mann heim -ludhi ana -kero sene -jud son -e qt -disrup tors -dg p -cr ac -beati ful -barunsobti says -au p -andre am -vet te -swar a -short ening -mob b -f hm -bhak ti -az usa -yu ba -ys u -wedg wood -smi reland -sm alling -sh m -n ino -hourof code -food blog -ebon y -dag gers -v da -tri pper -shi elding -our future -man ama -d bc -che x -candi ds -ìĦ ľ -аР» -su spending -stro ll -conglomer ate -xbox share -w had -uphol ding -k sp -ic sc -how lin -ha inan -giftsfor her -does nt -bellat wins -anim at -my nameis -lau ded -land t -la sik -jen morrison -instaf ood -dud ley -delic ately -biggbos stamil -a island -y ani -wro claw -sel enium -ru ise -ri poff -ra ab -prospec tus -nu bian -mis fortune -in focus -ich en -hh n -fl w -cru ces -bu hay -wol ds -too oo -row ing -pen nine -par son -magnific ence -m elia -lo or -kam oto -hi mm -good woo -buck ling -boy friend -volunteer ism -twitch tv -regi mental -pet te -new son -ne po -nar i -hen ney -gag s -ext inguish -ds w -balance forbetter -ay tay -abo realis -ye ahhhh -wash able -lang ham -info comm -fiance e -et n -chem ically -annivers aries -å ĵ -to ve -spon ges -si mbu -sh ir -sand storm -pull in -high rise -ave ga -addition ally -vi har -ne mato -micro max -fe ira -enab ler -conduc tivity -chri sg -ìĬ¤ íĬ¸ -pos ner -pha ge -ha dh -colli ery -ch els -bur lington -ant man -al v -un fao -storm troopers -smy the -sc ough -g lyn -fan expo -el kins -apat rick -ðŁĩªðŁĩ ¬ -pro fu -an them -tou ssaint -ti go -swi g -om iya -of champions -kir chen -gargo yle -f nr -eat eries -bra xton -bleed green -ano brien -! ?" -wali d -ti xs -sho wn -rr c -lo de -hungari angp -gott fried -forsy the -boo king -ab ooks -wal pole -ve the -te ds -str angel -pad dles -om gg -mun n -gri sw -gri mm -gl er -de bon -coom bs -chief tain -ur ls -take that -still life -re ch -luf tw -kang daniel -flood lights -enough isenough -bra i -a ek -ðŁĴ° ðŁĴ° -worldr x -we sthe -thr i -scree ching -obel isk -my elo -iz i -h sp -fute bol -em bry -ðŁı½ âĢįâĻĢï¸ı -ristor ante -pa isa -ny y -mobil ity -infor mant -christmas gifts -wy ch -jenmorrison live -gru eling -blu ee -viswas am -th ng -taste buds -t gi -rack ers -okla ed -mu sed -mr f -mol ine -giftfor her -fettucc ine -distingui shing -comple ments -c ce -wi x -wal trip -virgin ia -umb il -stra sse -s vit -re mi -le sp -feb vre -cu se -chri sl -.. ( -tw u -specul ate -ru tter -obe dient -mÄģ ori -mo dal -lan de -kla xon -g ere -clau stro -auto biographical -ac s -ðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬ -ãĤ ĭ -star lings -lur k -black magic -bart news -ath abas -press release -phil o -pat el -ou lt -magell an -len ation -for progress -fin nair -cow girls -sat sang -penn ines -lo tro -kvit ova -gro ssly -fer ment -du chess -do is -b hu -sal ter -presu mp -lock er -krun gy -ing ar -er vin -effi gy -dur st -araf at -w ma -revolution ized -q r -po pl -lur cher -k ora -goo fing -atur ner -trans link -t ard -su baru -sn ba -ridge way -pet es -ing ram -escal ade -cup head -bul an -anchor down -ðŁĴģ ðŁı½ -ðŁijĩ ðŁı½ -ze an -wish bone -jimi hendrix -j post -injec tor -hom in -h ine -dr acon -beni off -baby doll -' ). -woo o -ur sa -thesp ian -mik kelsen -low o -ki yo -getin spired -for bidden -can aries -ble us -bibli ophile -spla shed -seis mo -s view -prohi bits -nar cos -nan twich -mil led -gian luca -cat stagram -bo ge -ar it -mid winter -josh groban -cat lover -ca sement -advoc ated -act now -zu shi -ratat ouille -mom oa -enti als -cou ches -college football -cis d -ced ars -bra gg -ìľ Ħë -wen g -nuig alway -no ona -mer rell -lu o -ju in -heg de -gun pla -di ma -dah lone -br z -bj ym -wal sh -teach ers -pap illon -mo gu -kru ger -k elling -impur ities -don ga -casca dia -bot l -ale y -.. :) -® , -sandwich ed -sag aftra -mor mons -ire ne -ir un -dru cker -alexand ra -aap i -ðŁij¨ ðŁı»âĢį -๠Ĩ -ze ko -langue doc -ju mma -infir mary -f ice -e ers -der matologist -cu cina -contradic tions -col ino -co ley -ay ya -<< << -w tsp -the who -sl inging -rappor teur -or gy -g cats -david bowie -bag gins -ab hor -soo hyun -revers es -r ya -ou de -maha bharata -igle sia -ford performance -ec mwf -dispat ches -cheno weth -ìĿ¸íͼëĭĪ íĬ¸ -ver tex -shab ana -reho both -rand yorton -pi ste -om ber -ol ondon -ob scen -ha chi -visit britain -thel ost -re affirms -mor g -m sm -let the -jan itor -im pedi -fuer te -dhoo m -cbc mb -ben and -armeniang enocide -te vin -ste aler -q aland -lec rae -lat ent -disappear ances -be to -as kew -alab use -shar ky -sc r -sat ter -sa ward -resurrec t -reper tory -ra ver -multicul turalism -liber ator -kri sh -hor acio -hell yeah -hal lie -euro basket -cin der -amar ket -tu dor -sou k -omor ph -mar tha -lo pe -hur t -bm f -advoc ate -un willing -un licensed -rabb is -puyal lup -par rot -hail wv -gri ss -en cased -confir m -chee ch -am bi -six teenth -rescue dogs -remo vals -reg gio -pl under -painte d -la ve -k pl -iti ves -exempli fies -cron ies -ë¸Ķë ŀ -vogue team -tv g -opening night -mcgin ley -god less -er asure -de bian -bo whun -ãĢ ½ï¸ı -sy bil -ri me -po tro -geaux tigers -el sin -dahlone ga -comedy central -clu be -buy back -bl end -!!! ... -w yan -turk meni -pu ro -prodig al -pit bulls -mat ric -k appa -il yn -he heh -fil er -f enders -wk d -qu ora -fau t -cou ps -co stanza -ann avy -âĿ ¯ -min x -implic ated -handker chief -ep d -e ker -bel fas -ac umen -sc al -pi de -new man -inspir on -fox tel -clean air -chihuahu as -c zak -ðŁİĦ ðŁİģ -word press -thisisd sp -signi fies -manne quins -gra ven -dingh y -bro lin -s kie -puzz led -merci less -gro mit -fier y -expand able -equi val -but toned -ðŁı¼ âĢį -yel fie -y tes -lamar r -gro m -for peace -cp t -ca str -beat box -bak elite -wrong doing -resusc itation -han ford -go bi -depart mental -cycli c -an um -á ī -ri shab -mce wan -kang an -encoun tering -bat ra -sh rey -li at -lean startup -cliff hanger -chir ping -c va -apple podcasts -ad trip -absur dity -:: :: -w ku -so das -sa ku -prioriti zing -netflix uk -mar zio -ken n -dermat itis -ðŁĴļ ðŁĴĽ -whim sy -vapori zer -tre ks -tele scopic -scam mer -pre sci -me tag -iri on -feature tte -be f -a ath -⤠µ -work ers -sur ry -ri us -myth busters -lu ll -coo gan -cerve za -beauti fication -aty pical -an az -zen fone -x xiii -ti gre -lor n -l to -eccle stone -der t -bo fficial -vir gins -uten sil -to efl -sub woofer -pur nima -nak ba -mo hawk -guatem alan -experim ent -encom passes -botan ic -bad shah -servic enow -pass age -oxid ative -me f -ma us -ho ga -gimb al -gent ile -ers ons -doro thy -burle son -boo zer -à° ² -wipe out -vari ance -sc c -o boe -gun z -gran di -country men -cohe sive -answ er -á Ĭ -way nero -ti mur -shuff ling -ple c -hunter hayes -basti en -bankno tes -vast ava -u hs -pun chy -pent a -marketing strategy -hein z -frau ds -foam posite -ee a -chry salis -bo as -ðŁĶĬ ðŁĶĬ -touri smireland -sarko zy -print maker -kian lawley -hu ddled -du sseldorf -chron ological -cat box -y ali -sch lu -sc ast -mun go -lon er -jel lies -g agar -dat or -bo ils -ber i -andro gy -wood burn -winter olympics -vene w -tre monti -supp le -south wold -plu shies -over shadowed -temb lor -st w -spra gue -re discovering -ol lie -ma thur -lall ana -k tb -ero tic -burger king -biz party -éģ ĵ -up ta -thisi se -initi ating -imag ed -go army -crooked hillary -cro well -arab i -amher st -ðŁijį ðŁĺĬ -zi ppy -x ctf -we ah -trickor treat -teix eira -reluct antly -mamat aofficial -freder ik -for gives -fly er -clair voy -acy cling -ðŁij ° -si ppy -schu yler -in voluntary -h ite -gl ories -fac ial -as you -ark ali -um bra -sta dio -o iled -nad ler -charli es -abol itionist -war io -t ct -squa shed -no way -megan e -kon ta -in doctrin -howar th -az uma -ale house -acti ves -ach an -stand outs -sear ing -haringe y -gr ana -exoplan ets -cab ar -ap ach -stre p -square enix -pin ky -pet its -ne gre -morph ine -mer on -e on -dro pper -d pw -ar aj -adi o -yu eng -sur facing -sc ampi -sa if -rut ledge -men cap -im practical -charlie puth -ze tti -saw grass -rox ie -mul ling -hu w -eng chat -dr j -club man -bo tics -av ell -u cm -tecum seh -re runs -op on -ome trics -man x -jes y -in laid -grazi ano -ch ella -cal derdale -all red -ภ¸ -sea water -mo les -lauren t -kra us -ground hog -feder alist -da es -x peri -st elle -pati os -o tra -nt ds -n bl -mitch el -kingof the -ki ley -hom en -ge tre -dise mbo -den sely -columb o -carbon ated -af ra -wa ilers -ro pa -on top -ne f -mou ss -m hs -ind veng -fan boys -bas kin -" ..... -ju manji -gr w -governor ate -gen flynn -fl i -ep au -cont ador -ca di -aa ja -zu zu -ta kingly -special ise -sc lass -s fe -ra ic -luftw affe -hack en -gar bo -and field -am li -alcan tara -tb il -tamiz ha -om m -ne ma -natural gas -li man -hand s -fil min -boom box -vol l -un apologe -swif ties -ste els -sar ro -nar rowing -j ll -foo te -ei leen -basel world -æ ī -wil kie -wes tham -turkmeni stan -th wick -t asking -sil vers -repe l -re arranged -out puts -miy amoto -miti gating -ilo va -fe ss -fast back -cul lin -che ch -cb d -! ðŁļ¨ -visu alized -tru man -se ager -sd wx -co bo -wor ry -strate gic -pok al -mi p -fro y -ex cision -ang ell -ðŁij¨âĢį ðŁij©âĢį -zz or -subterran ean -pom p -mesotheli oma -li ao -ir at -i ap -god addy -et en -dragon age -catch up -# ( -tum ours -the star -rho ads -pi gg -ori anthi -jeep ers -infra structures -har shad -hal os -ha ver -day al -b si -b se -ac yday -sl m -mu jer -mor atorium -mon go -lo is -bw f -spani ard -musculo skeletal -mis ra -i ks -!! :) -wi eder -s á -n ts -moo g -ci bo -yr sof -young and -ye son -w myb -svet lana -mam o -jy pe -dor sal -af zal -re cherche -ra gu -hy dari -hin os -acrob atic -up tick -tel ugu -so so -rad hi -mu guru -infe ct -gosp els -down es -ded ness -ðŁį¾ ðŁį¾ -xen ophobic -ra kow -pe h -medi as -ju s -dv c -ðŁIJ ŀ -track side -tess ell -rhy l -poli shes -mal nourished -lar va -icon ic -hol der -for ç -far ron -chev al -cas sis -c ich -ball ant -wester ns -tu tu -tat ters -rich t -neander thal -jo akim -insati able -hoar der -fran ky -fla v -womensmar ch -traff icked -the gathering -te eth -sho ving -per cy -on so -nic hk -nancy ajram -kir stie -jab bar -gr ingo -fair trade -demo iselle -sch a -madam e -brah ma -ag am -æĿ± äº -yoshi ki -southern most -ra po -pre eti -ou g -mc shane -mani k -kad er -car ole -bol ger -ðŁIJ ı -tattoo ing -sketch note -poker stars -ip tv -cb u -ank ita -ı @ -sat uk -regur git -ph oning -o akes -neu ville -jor don -bre uer -as sini -ap en -tran g -te w -mn g -m te -m so -ky ri -gossip girl -b ck -ab ro -wy er -venture beat -mesopotam ia -in crimin -hel mand -ha iti -ha it -gro sse -dar den -cli matic -ç§ģãģ® ä¸ĸçķĮ -wh e -sm ill -rising star -percent ages -mu ddy -modu lar -kit ted -je une -is in -incur red -fir stre -communic ated -bt sin -ðŁ¤¦ âĢįâĻĢï¸ı -zapp os -win es -tortoi se -swan sea -shoot around -ri ding -hi ga -di van -att led -stiff ness -stereo typical -satur n -philipp ine -mati as -khar toum -j dt -hend rik -consul ted -ame c -x finity -voic es -un grateful -lizz ie -lar p -eur onews -ac n -ru mah -pan icked -men u -la grange -go lions -gam eday -dk ny -winter ing -will never -te us -t vac -su ma -sanctu aries -in justices -fi ore -dance music -án dez -zeal ous -robin hood -river bank -man zano -gy i -gati ss -fritt ata -enthusi ast -clu se -ba res -to po -spartan race -sha key -sh ue -queens ferry -mur ri -i biz -hurrican ef -hi mi -flow chart -dilu ted -ac sports -ï · -p sp -oc y -inc ite -corn elia -co very -sim ile -scuder ia -rot ator -op to -har ish -easter sunday -dish one -ch back -ðŁı İ -west point -st eller -search able -pad ang -mon goose -malcol m -hanni bal -gr n -far ting -emili ano -may berry -gal braith -ex pulsion -dow ne -congreg ational -bar bie -yb nl -oladi po -nus rat -mor nington -maurit ania -kag ut -k th -ju ror -hib bert -d va -bri k -schnei der -motley crue -live your -hospital ity -gul ation -for ty -faç ade -fair port -ely sium -de ion -come backs -cli part -ad af -w pp -un restricted -top anga -tony stewart -rare disease -ou trage -men ow -gand ol -as al -ambigu ity -tt alk -sti m -re used -mar lin -il han -fle dg -eun ji -chi le -by nr -+ ! -zom ato -wed ge -newly wed -mis management -mi f -m alling -lo fts -ho or -field hockey -bally mena -bal las -íĻ Ķ -yo ff -world healthday -tin der -ship man -pa ok -nhl flames -ma kayla -bay t -sto ve -ru dder -raj at -ra iler -pen e -mercedesam g -im on -i ee -brow der -adren al -x ed -skeg ness -sill iness -sc lassic -pe pa -fit t -diss olution -copa america -book lets -ate urs -asahe b -aln wick -the hobby -taran aki -shan k -rep john -our ses -mobili zing -iso tope -gan z -ðŁķ ¯ -vis count -val les -v se -sk enya -schau b -play mate -park scanada -ma ren -ju wa -bu mb -be rea -am orph -waist coat -piti ful -na ji -l fl -ing news -t mobile -nami bian -jan sson -hand son -ev n -catbox sunday -bhak ts -spe y -sky rocket -ever t -y ab -wen n -ve k -travel photo -ti ere -ski ppy -sa ab -qui er -payo ff -miller lite -j ps -emb attled -el ma -depos itory -complac ency -co h -ansel mo -show ings -shi ro -se ger -p fl -mat ti -knight sbridge -dumb arton -con son -bee ston -asci i -worldre cord -tim mins -men ssoccer -kilau ea -jo van -deni ers -beach side -tran scripts -punjab i -pre ssion -on ov -music hall -jam ar -err one -ep en -democr atic -contra band -& ... -su mp -sk ov -ray ne -mur ali -m eric -ed ays -cu test -con roe -bra unf -ab in -ðŁĺĤ ðŁijį -syl van -procrastin ate -la var -fing al -ak ind -admi res -à¤ Ĺ -treat ers -tre mbling -ral phie -p bis -hand outs -sam o -li one -griev ance -co tes -californi a -bis cotti -stock ton -sitec ore -podi atry -in ky -ic ici -fil lets -fail te -e pub -domin ik -day trading -braunf els -um b -tro phic -tric olor -ther ules -spl c -se con -paint brush -or ry -ni zam -nat weets -metal head -mam moo -esopha geal -de celer -allthe way -ac at -yn g -sh elly -poi rot -mon cri -fra z -ðŁij ® -å¹ ´ -yul in -util ise -tak is -stilet tos -ri v -rein carn -re imagine -pl p -ner t -ki shi -kaiser tone -ga iner -dier ksb -deptof defense -cut throat -chuk ka -black friars -alam bert -ak vari -ad om -wr ld -wkr n -w pl -tale za -ta unt -spey side -punch line -original character -maz el -help ing -har ries -bl aring -bag ger -accommod ating -predecess ors -peris cope -le ish -d illa -confe ssional -th yo -sho pper -royal visit -meridi an -me is -lovethe darts -kitchen aid -iti onal -it son -hin de -ha ss -gigat own -fri ghts -feast day -ðŁIJ ĵ -si ima -ray burn -mercedes benz -ford nation -cont ented -app i -re butt -qui k -qu and -muguru za -l ss -kan colle -ip r -fo wey -direc tives -car is -can nock -at ment -air flow -west pac -wdy t -trave sty -the artof -s fi -re ale -pa ws -new song -napol itano -mess er -lo fo -ke dar -david guetta -astu te -ðŁij¸ ðŁı¼ -ta an -ferri ss -bu chan -amuse veni -sho vels -newsle tters -ho tly -hen sley -ge dd -g ingham -esc am -drum roll -car dle -âĻ ł -spir ito -speci fic -skill s -leg alizing -daw ood -bb cn -{ " -zo oming -val erian -tand on -sk un -park view -paper craft -mr c -con traction -beautiful destinations -tas er -shaw ks -salt lake -ple y -pessi mistic -jae ger -ide e -gor ges -gar am -clo thing -cl ink -cent enni -ali ab -ta sters -sit ges -mo shi -ji iva -har borough -firstworld problems -atri sts -# $ -ðŁį ¿ -un professional -tre ach -team work -s ills -gaz ette -finger scrossed -b pc -undeni ably -th g -mo hand -kagut amuseveni -haw ken -ers world -daily art -balay age -watch us -th ame -sustainable development -re iter -ol ica -lucy hale -ku ba -foucau lt -crime stoppers -cre pt -choo sel -as w -ambassad or -. ðŁĻı -u omo -ki me -check points -wing ate -sau ber -nor ton -mei ster -lec oul -kar yn -duc a -cor te -ak aya -a sic -short stories -gol ly -elli sts -bour se -strol ls -niagar afalls -newyear s -n ines -lor ain -le win -geor die -ath lon -un knowingly -han go -bo dice -bay onet -tu mi -str ick -r ity -mis susa -le el -garth brooks -f mc -as ss -s ate -ron ics -guer re -ger u -exfoli ating -a ak -woo ten -subur bia -se wer -mecklen burg -ken shin -dj o -de wi -col ston -blue star -blanc pain -transc ends -te ma -scrib able -schi ele -mo ff -is sey -indi ab -cu bed -cand i -alp has -alle ge -ðŁ ĥ -r he -p fp -new west -lack aw -h ree -cru mbles -al ap -wthr com -to kio -state side -sit is -se vern -ro mb -ico se -gri sham -fla gging -com posure -cathe ter -can ines -ðŁį Ĺ -z la -v ander -mom oland -hil ux -gar nished -coven try -bi gi -stu cco -oo ty -kac ey -guess the -goose berry -for it -death match -ali bre -af ari -ab cs -val our -sush ant -ra hal -publ ics -lati mer -k oop -h iss -go oner -g pc -f tv -con front -c ada -archi ving -apo logist -å Ĵ -Ø§Ø ¨ -stl wx -small holder -reta iling -recording studio -of sky -le le -desol ate -algorith mic -íķ ľ -wy k -vers ed -tre spass -take it -pr aline -nue stras -mat thar -li psy -ky lian -fli pp -fa wards -clar ine -all lll -sta ar -scaramu cci -reas sure -kir ch -j cp -commend able -bank roll -baf fling -angel a -ðŁĸ Į -tre mont -spook tacular -raj kot -kent a -home stay -ho even -fontaine bleau -decapit ated -ar abe -april ia -thorn hill -tat t -si bir -no limits -newze aland -naz ir -morph in -la ken -hinch cliffe -gor se -gaz prom -fit n -defici encies -d ool -bohemi an -ar ad -z ax -tambour ine -sp elman -multi modal -milleni als -melt zer -henry cavill -han ia -w zz -sever us -planned parenthood -ni b -multip lied -cal lum -be inspired -ðŁĺĤ ðŁĺ© -yq g -uk weather -laundro mat -kir stin -ip i -fair ground -di vision -d ando -be als -based god -âģ£ âģ£ -whis kies -weak ens -to watch -te pp -seash ell -pa inter -o ast -inde scribable -g ani -el rufai -devil ish -bo capsule -bha ji -yeez us -work sop -ques ad -phosp hor -mo ffe -lan z -indi scri -id d -giz modo -el pas -co als -chim era -carbo hydrate -am oment -sta at -sof tener -shrin ks -plate lets -ok la -di b -deplor ables -car ling -cal gar -breath takingly -ann n -ðŁijĮ ðŁĺĤ -ж ив -ze m -white haven -we isse -virat kohli -sc ap -fir ma -co rea -c mi -ðŁķ ° -ðŁı ij -pn p -mess er -gue sting -gran tee -gi st -che ater -bur na -ak im -uni birmingham -kan di -her tha -feli pe -b bery -super dome -os f -mid town -letter box -la far -juni o -food trucks -fish man -âĺĿ ï¸ı -west bengal -u up -spla yer -patri k -man gan -kram pus -hyalur onic -fra un -curi ou -charl ton -bike share -bah ay -studen tath -n ant -d hillon -cre ssi -ar ta -twitch streamer -snake skin -saura bh -pre maturely -frankin cense -conden ser -capp ado -tweetab ondthatcantbebroken -ti ms -man cave -jal en -hand i -cafer acer -bar ger -as ena -" > -wic can -ver de -standing rock -puri fying -paste ur -gal t -fc king -dierksb entley -car away -batt lero -asse m -ad week -ðŁIJ Ľ -us am -thor pes -supervis ory -sc lub -pas saic -mil la -form al -° ) -travel theworld -ti sha -pic t -per oni -lore to -ku y -ff m -watch this -u lam -medit ations -emb assy -bir o -wheel chairs -su pers -si me -run corn -ne to -ke ke -hun ts -donut day -ci ders -brief ings -bren ton -ãĥķãĤ¡ ãĤ¤ -we den -tumul tuous -tr ine -shaqu ille -ran goon -pal pable -geri atric -ea stere -cfb playoff -brun ner -apro pos -ðŁĩµðŁĩ ° -w fm -tee ter -od f -nov artis -ni jme -n tw -matsu moto -intersec tionality -ham ed -contex tu -avengersin finity -sd ale -nat o -mac gregor -gar ber -ele m -c ps -bay elsa -back fired -anal ge -ni u -mini aturi -li fers -ke dah -ai mee -ad dy -ðŁĺĤ ðŁĺħ -wp tv -trouble some -li ani -deep water -ðŁı ł -wor sley -w un -si sley -s fight -mai mane -long itude -ec lare -ck a -cabine try -brook lands -anastasi a -vonne gut -swat h -science week -mutu a -can oes -brun n -aishwaryar ai -vesu vius -travel bloggers -traumati zed -te din -shaf tesbury -prow ler -ni bble -mi ko -es mer -crock pot -waynero oney -un harmed -spell bound -s ram -play suit -man che -fraud sters -fore shore -du gan -ask the -vol go -sav ant -par si -ol le -look s -fu mi -fais al -exor cism -candi da -wl w -vin yasa -vent v -urban ization -tam imi -sports betting -shar ma -rejo icing -gla sse -dar aa -d fat -bb j -bankno te -anonym ity -whi zz -shiv ratri -ri vas -popo vich -mil dew -jimmy kimmel -gon er -frag mentation -e aves -affi davit -nott m -fa ires -dr l -deeplear n -de scu -care lli -bra bant --__ _- -ðŁĵ Ħ -the hungergames -schem ing -ro tisserie -ri pa -present e -over crowding -fear lessly -cer rone -vic theatre -ukbusiness rt -substitu ted -shut outs -pau lette -pal ing -ola unch -henne pin -bow man -a was -yaw ning -with am -vs fashionshow -ver ture -tra b -th ath -st peter -ross endale -may an -heritage day -f mi -ca ith -bel gra -tavi stock -sur ged -str am -ra tha -prem rugby -ny cacc -mor ay -fiftyshades darker -fayo se -en actment -conden sation -carra gher -british vogue -bom ba -apric ots -alessi o -war tho -sex es -pra veen -lis berger -ki bum -frac tional -ew tn -conco ction -cater ina -am aker -symbi osis -supre mo -sesame street -polok wane -new burgh -khal i -k agan -di pp -broad bent -boni face -auror aborealis -ภĸ -sub way -screen printing -h ati -dc universe -vicar age -u ah -tiger zinda -stol en -space man -sam ple -pil kington -medi ator -lu mps -joyful leaders -e ason -be agles -paren ting -padra ig -obli que -ma es -inst ar -har git -gen ie -de em -cbs sports -back stop -vern ay -t sur -rock hall -night stand -musc lecar -journ alis -eff erve -do zer -darken ed -cu per -col ne -brook ings -world premiere -vel ma -south dakota -sh inning -s ically -le er -elo ck -di pika -winni peg -wa an -vaccin ate -si ms -sho x -q t -oli o -net ball -mc as -magni fique -ma ples -i kar -how ells -v ence -richar dd -pur ina -mend ra -je z -im is -h tt -forthelove of -fight night -exhi b -earth bound -e sol -butter worth -blo c -bi ol -before you -ãĤ¹ãĥ Ī -¡ ¡¡ -wc th -tom mie -th art -stra ys -speop le -sh we -sea hawk -pp et -ol ler -n si -me tv -ma kar -kur ta -k xip -k nysna -friend zone -de scan -bint ang -as pire -aquari ums -p mr -one perfectshot -non linear -nom ura -nichk hun -he yyy -faf bulldog -du ane -all u -un sig -power bi -mill brook -lion sgate -but lins -be o -al ok -suspici ons -r ins -mid nite -mam an -el way -e bi -ast i -al ah -wi ther -senn heiser -plym uni -pan icking -night photography -lecoul tre -harri et -clerken well -ci da -chick adee -car tney -cap tained -be te -am ee -ðŁ¤Ļ ðŁı½ -what chu -scream queens -k mt -en heimer -dont be -der ive -davi dar -cr and -ëĵ ľë -âļ ķï¸ı -wi thr -pe cos -mar kie -hat teras -garden a -arti stic -stony brook -pra xis -one w -gar nered -e gor -crew neck -bn f -acon ference -zoo logical -u ic -swe b -men ard -mayo clinic -lin css -hu ggins -dl f -award winning -wrest led -tranqu ill -re voir -re charging -pro fo -pro claiming -p tole -jimmykimmel live -gman ews -douche bag -cle m -ce ylon -accent ed -aaaa and -u ks -symboli ze -swan age -safety week -mo si -law fully -ira d -idit arod -hen rico -fir a -âĻ¥ . -wak o -vo ye -susp enders -probab ilities -ox ley -hye ong -gru yere -auto cad -accumul ations -(- : -ðŁĸ¥ ï¸ı -ver os -tough mudder -thwar ted -shor ten -koo zie -kameham eha -jung les -ide ation -hill ar -el tham -chem in -assini bo -ar cane -an ai -ab bot -ðŁĮ ĩ -ye un -subpo ena -selvar ag -red box -fe eney -f wc -ab is -: ( -ðŁı½ âĢį -ðŁĩ¿ ðŁĩ -| â̦ -to read -mill inery -le ssi -feu dal -fajar do -cyn di -chronic le -boyl ston -beautiful day -wj sn -w md -va g -tech n -sumat ran -pre sales -mind body -likefor like -chro mium -cha it -ab aker -~ ) -pre ma -nadin elu -missmar is -men del -man sion -kle enex -ji yong -in of -entry way -bump ers -au k -ê ± -stal bans -rs v -paddle boarding -le as -evo que -enginak yürek -em al -dang elo -berg dahl -az ad -amphe tamine -ç « -z rh -x ddd -puzz ling -mont serrat -man ns -jesu ss -hatt a -canon ical -x z -lun dy -leav ed -jo dha -epic fail -el wood -du ali -conver ters -a et -!! ' -z is -wal z -v vs -slo ping -no str -mel li -graphic novel -dol o -cork screw -ul uru -the way -sto k -spell binding -ru be -ro den -re ay -gu shing -bra wn -av at -su mac -pis sarro -mano ir -ly nette -comprehen sible -absor bent -winter solstice -the q -share r -mur ali -mm urd -md l -light skin -gg g -el ny -consoli dating -command ment -bur dened -bin ders -asi atic -Î » -um bro -suicide girls -rail uk -n ale -missmaris racal -master chef -de generate -boo sh -aze alia -united way -technical analysis -t ended -spo kes -sheep skin -ram ayana -queen ie -je f -i ana -h indi -gra pple -el itist -el ap -d pc -d mv -bet cha -b ape -ðŁijĩ ðŁı¾ -ton gs -shoton iphone -reli shing -re pra -powder puff -os man -bu tty -ba ie -aco ke -the w -re making -pl atters -per jury -ni zam -movie poster -fredri k -fa sten -ener ge -el don -bird day -wy att -wh atta -uygh ur -tx motorspeedway -strau ght -sta de -pe kka -ki k -cri spin -cat t -ayushman nk -ðŁĮ ľ -weather ford -vern al -ta stiest -suspen sions -s ada -perfec tionist -jo go -del ving -con chit -. ⾨ -top friends -summar ies -ste wie -scrat cher -pre sets -mar ana -her mano -g dn -edm family -bug sy -us ical -ste tho -qu ities -lin ings -king swood -dhar ma -wil k -ou lu -ori ous -or om -optometri st -one se -er rand -end y -doo bie -coo ki -ber tram -akvari stan -torto ises -tatters alls -ric ular -p ough -ok tober -nyx cosmetics -lo oooooooo -hoi sted -ho des -dw t -dist illers -day light -coeli ac -bo bro -arra igned -tag uig -sf pd -pres sure -flaw lessly -ev geny -conscienti ous -buc ci -we can -them all -plu ck -pless ness -me v -lab ly -it te -ar v -ab lack -wt k -up tempo -stil ts -sma c -jaf fe -hur ri -hta fc -head quartered -gul ch -g ca -with drew -selfle ss -meh mood -la bo -sunderland afc -st ens -potat o -pic card -o go -mer vyn -ma se -koenig segg -ilu str -hom opho -hari bo -di ario -calvin klein -le ec -c sharp -apat ow -al bury -yellow ish -y tv -ut ley -ro san -ram snfl -national coffeeday -kuro sawa -judg ments -it si -idio m -ho led -cl ank -citiz ent -candi dat -ae g -wom p -the opening -the bhf -shar da -north van -nas scom -mm p -inqu iring -glu t -dar te -sin pics -sas cha -re pp -do go -bag gies -u ottawa -tu ber -stor my -st lv -re it -re fil -palay eroyale -omo juwa -my suru -lo li -bio science -ang ello -ace o -ãħ İ -victor ians -tyr ann -tit o -sand hill -ous se -moneti zation -mo ka -iz mir -gr ins -gentle man -disson ance -deep avali -danic apatrick -president trump -par mar -pain killers -pag asa -origin ates -nex us -aspir ants -whatever ittakes -stock well -ste alth -s de -l bf -ign an -her z -gon da -fu sc -fe dor -dra x -d arian -ca thr -ama al -yu t -spl ice -s attar -re sses -mt f -inter acts -infiltr ate -happ end -den ounces -car row -vir gil -v vip -ti bles -oce arch -cour ant -z adar -wille ms -u ze -sympath ies -revi val -pe ase -ou fc -gren fell -globe trotters -g lin -fur thering -fla pper -war ds -raven a -mit su -eu g -cated ral -bex ar -be douin -zi oso -y aaay -sg t -refin ement -mol ine -lam y -d lamini -climate strike -bythe sea -brat ton -av r -ah ill -ad an -wolf son -m ne -ci ak -char d -bright side -â¬ĩï¸ı â¬ĩï¸ı -à¸ļ าภ-sch l -saniti zer -master plan -la vish -kar ant -hull city -gur kha -gat lin -com cast -bi ar -b ww -ak bar -x eno -wo wo -spin al -per ts -ic ent -famil ial -ally brooke -à ² -z oro -ver te -se mp -sab ato -rela p -puerto vallarta -pe dre -pat ria -moo dle -make me -im porter -fish tank -f yo -co pi -bicy cling -awil son -above andbeyond -wa ar -tat a -smallbusiness saturday -rhi an -ko ya -gr ation -dict ates -d tn -be it -ð٤ĺ ðŁı½ -x eon -son akshi -sch en -ratt led -pro long -g pp -fast track -dr anath -de central -copp ell -breath ed -ðŁ¥ İ -who dun -submer sible -scallo ped -r itten -mal don -l hd -just another -joseph s -hope well -fa stand -dhar na -clar ice -walk off -unspeak able -sp ac -soap box -ross r -jay son -ce ps -af faire -ad minister -x clusive -tar f -special ising -kir ill -hand som -daytime emmys -congress men -ceredigi on -ca ix -apc nigeria -al al -âĺº âĺºâĺº -ru ps -pop music -mr and -gold man -gi vens -de ffo -art sand -alu a -viv atech -tarra gona -shak in -sa irport -recap ture -pat r -mano har -law rie -hi ver -ash am -ÃŃ s -ther m -sim mon -religi ously -opul ence -nawazu ddin -mc ca -la sso -bir a -y ami -y af -tele photo -su sten -sego via -rio de -go han -f bu -ey bl -clic quot -bu x -ber ley -âŀ Ķ -wal mart -sar war -r fs -p ylon -mign ola -go pokes -cu oco -car li -appreciation week -anti um -ali yev -Ĭãģ Ĺ -wordsof wisdom -wi ggly -wa di -u do -strand ing -sto bart -shadesof grey -port noy -port illo -pa sties -mi spr -mam elo -lor ax -la ire -janos kians -ham dan -disc ern -country life -ai les -t cher -sail fish -saf i -pro fil -nothing ness -n ri -har iri -grou cho -far outa -ev m -enthusiast ically -en da -du sk -dread nought -cru mp -coul da -certi fied -bot ticelli -ba x -au me -ske tt -sc b -rose hill -mb c -isra eli -h ne -great day -folk fest -faire y -er ink -en ry -craw ford -broms grove -bo drum -travel channel -sar dar -rec tify -newsa del -micro be -inci dentally -in still -fe cal -eu gene -dru gged -b man -whoo pi -un a -twi z -street view -our day -nicar agu -mr k -mouth ed -intu it -ingra ham -groo ving -cute ee -chil tern -che ol -boomer sooner -arbro ath -to ko -te ab -smo ak -ser aph -sal ert -re w -pol k -pim ps -ma ho -ik ay -he sper -cit ru -black sabbath -short fall -mar a -ib as -easter ly -ca stiel -ìĨĮëħĢ ìĭľë -ë Ĭ -rein vention -la vin -jo ong -con cur -clu stering -bra ver -ba aa -alge bra -al ita -aberdeen fc -wholesal er -vo et -vin od -st alling -daun ted -âĺ ¯ -walk ways -sadi stic -ridd les -o ar -ne ves -match y -lex y -kine tics -gil da -ðŁĺĺ ðŁİī -sant ino -predic tability -fo kker -ana ero -vesp ers -sy ne -stock ing -self help -r bl -mak ita -ju ego -in fidelity -hei de -devi ation -cur zon -com mis -ci bc -bbc wthr -ba hai -aaaa ah -ðŁĮ ª -wer ise -tom mo -seren ading -m itten -loose women -ite e -ic arly -ha va -gop ats -ufc w -the chainsmokers -t chat -seab ass -san ju -pepp ered -or illia -ministr yof -inf ant -fortune magazine -augu sto -ais ling -ðŁ¤· ðŁı½âĢįâĻĤï¸ı -scru bbing -rac coons -mon et -mcke an -jay y -experim ented -cost as -cam my -base ment -al te -worshi ppers -wal eg -t co -sier rac -santi ago -s ø -s ily -s aga -k sd -inj ury -fi jian -exeter chiefs -d ja -com erica -bee cher -u du -ti ernan -sol eno -show jumping -purr fect -mer tens -fr p -feder alism -constab ulary -ba shed -air max -syner gies -shi da -pi ña -mis lead -ma ud -eye z -air and -z of -wizar ding -w cha -tab u -spo ssible -sol vers -red zone -nhl stats -ne iman -mile high -mc vey -lew y -laur amar -incen tivi -i stria -goti ger -en amel -bb on -alco holics -ðŁĻĦ ðŁĻĦðŁĻĦ -we as -time pieces -swee ten -st ah -rehear sed -n wc -frontrun ner -fi vb -d our -cataly zed -bron ch -blo k -ðŁİħ ðŁı¼ -ven do -ra vers -obi spo -k alli -iner tia -g ny -d ni -bi hari -anaheim ducks -altu ve -air bus -ac a -we sts -voc ally -rati fication -nj it -lar son -izz ard -i ec -gb m -city wide -call an -bob sled -bbcwthr watchers -ìľĦë ĦĪ -sun risers -pediatric ian -pan ning -nar asi -liber ian -end ic -base balls -v anian -um g -tai ko -ri sd -magno lias -le em -ken ai -fric ken -dom ed -d atta -col fax -cephal us -adopt me -what a -pre mon -mass age -go buffs -enor m -dolla sign -dal es -bon aire -bertie schip -applau ded -ann n -wind swept -ss football -recover ies -raj at -pro tru -hoo kers -bio security -ãħ¤ãħ¤ãħ¤ãħ¤ ãħ¤ãħ¤ãħ¤ãħ¤ -ton o -selvarag havan -pitt i -n ro -l pr -je vic -goog ly -char tre -ðŁĮ´ ðŁĮ´ -âłĢâłĢ âłĢ -u bere -sb d -ri vi -po conor -pan ellists -matt ingly -ken y -ibe w -foolish ness -farouta khtar -dream work -whit erab -west field -ten ors -mu sume -mo rey -md traffic -i af -easy branches -ch aff -carden as -ab vote -å ¾ -s ours -mul grew -me su -kd ka -food truck -der mal -child abuse -time share -se ti -pha se -oka for -lough lin -jan ine -around theworld -ॠĭ -rein forces -jane the -hel io -he man -dra kes -c sports -ye ee -vis iti -st john -percu ssionist -non violence -f ase -di ac -break y -" * -sn b -saf ran -pat ching -nickelo deon -intru ders -enlist ment -el les -cost ner -coo s -be sson -base less -appe ase -super se -su mit -sab ian -gene simmons -g don -frat ern -emph atic -d np -constra ined -clee thorpes -catal ans -an ae -yu en -sori bada -sky bet -saw dust -s film -nag ano -n ari -le ong -la is -in eligible -idi bia -go dav -disper se -bur man -an jel -re za -pough keep -ph oned -me du -ka ori -ive co -com uni -chinese gp -chim ps -twin kies -o ise -natge ophotos -na irn -mitochondri a -ju hi -cy lind -churchill downs -christma siscoming -atta ching -ar ras -. "" -timb aland -the hedgehog -sustainable fashion -summ ing -more los -me tta -man tan -kut ch -evan s -dazz led -stu ssy -royal family -roeth lisberger -prism atic -jam shed -ge s -brou ssard -blue angels -b mo -ann af -alis son -al gal -ë ī´ -wal ang -scar ab -m ingo -fruc tose -force fully -eu w -cri er -bai k -ar ter -alphabe tical -al lot -waz ir -to ffe -opio id -non existent -nephro logy -mc at -ing it -har ts -dad life -tx h -twit ters -tross achs -ss oa -so koto -rein ce -real bread -ray theon -ragha v -periodic ally -mayo gaa -gio vin -ed on -down graded -de pay -costac offee -colli ers -canu ck -vo tre -onthe move -margarit aville -kw az -gour met -foo dre -exo tics -de grom -daeh wi -ðŁĮ¹ðŁĮ¹ ðŁĮ¹ -te dros -ss rajamouli -ru ble -p news -ot one -ny i -fu ge -dam an -dal ert -as bury -allow ances -tel la -t dr -spir ulina -rugby united -rel ly -pass ers -oooo oh -medic ated -evangel ine -enti al -conditi oners -âĺ Ĥ -scoli osis -h ro -gift guide -g ally -dv f -cru mlin -moy nihan -mo disar -master classes -mac ular -be cau -bair stow -aun e -us gbc -thelion king -overwhel m -foo ter -and ler -she ard -ridge field -na as -n so -m sia -leg on -c sp -bo zo -autism speaks -as ch -ðŁĩ¯ ðŁĩµ -âĿ¤ . -» » -zo ella -syphil is -shim ura -sen tosa -new er -m clou -kri spies -im fc -gar h -g hazi -charle se -by d -ush ers -spread sheets -sel in -projec tile -p gm -over turns -must aches -mun son -muchach os -mol on -itss sr -ino is -fanc am -d cc -bu dge -pe gged -ing dom -cymb al -tul are -kryp tonite -ino va -feed the -f eni -ci ster -na eun -individu alized -fi h -fer al -ef fie -d so -???? ???? -syman tec -ss f -sma ug -si bal -okee cho -md pi -ku di -ho wer -gar gano -a pren -âĭ Ĩ -y is -w tv -thorn ton -subsi dized -speed wagon -pas so -mat ted -hargit ay -grave send -gi dd -friday fun -detec table -wild lands -w soc -tw is -san ji -sam bora -sal via -fakh ri -bella thorne -ak var -scint illating -ne er -n usa -m pl -leg iti -ku a -guer re -grou ch -en baum -ej f -col la -wind hoek -ut dfc -trey songz -stra damus -ro sar -mol ler -lordof therings -ill ar -drex el -dot tie -di straught -chaper one -bring your -bay shore -am ur -um ph -stock port -sitt ing -radi sson -ok al -jol lof -hor net -havelo ck -de j -cab bie -a arti -° , -van de -sch wan -let cher -lero ck -j mu -dw ells -dis qualification -bru s -amaze balls -ðŁ¤ ® -sc ac -radi ates -grow ling -ge th -et ter -dis fru -colo ssians -cd w -an arkali -alde burgh -ag ot -s west -or ro -on l -max x -imman composer -fro mmy -dam nation -d int -beer week -tribu to -til ak -t da -savethe children -pim lico -mississi pp -mar gau -ak ana -ag ami -âī § -wool ley -reven ge -over size -k res -ir ce -h news -et x -con yers -bill shorten -ban v -at el -v sphere -sule iman -stack able -petro v -pale y -pal atine -pa arl -le ch -kil patrick -k shs -ju v -hit am -ash down -abomin able -var k -uni an -u wi -thel u -shoot film -sand lot -pau sing -l lega -hor nb -íķ ľ -ठ¤ -Ùħ ر -y ha -wzz m -way back -t suk -stom achs -star i -pizz ahu -pa sted -nameis nani -kan to -car ley -be ur -ðŁĴ¸ ðŁĴ¸ -yn j -us army -sen eg -roa ster -mo rel -inthe park -ff acup -cre an -billshorten mp -ann arbor -abo y -rock wood -pill sbury -lu go -explor ations -broom field -az mi -atul a -akvar yum -show en -mc nab -d ws -wa see -nijme gen -john kasich -f pc -cr at -êµ ¬ -ื à¹Ī -velo ve -rose bud -orche stras -mortg age -flate arth -dailym irror -charle stown -bra ff -bo ku -bel kin -ãģ « -ร าภ-ti is -sacrif icial -lo esch -vide omarketing -un dul -supe rel -sh as -musi q -ki era -kam en -jam ey -encan ta -den u -ar cus -æ Ĵ -sor kin -son ali -ros alie -pushaward sliz -no ord -iam specialized -cap tioning -ðŁļĢðŁļĢ ðŁļĢ -sange et -rashtra pati -rain yday -paralym pian -must n -kun e -gen z -en viable -ef b -ami ens -à® ± -t de -re painted -ma zer -lay up -keh lani -jor gensen -der g -con chita -bloem fontein -all yn -synony ms -sten house -sli my -shal ini -den ier -assi stive -aquari en -am bar -subram anian -rebu ke -mam mam -ing ers -h itt -dog fish -cr l -am are -te uil -soci alize -shi z -rar ities -e ire -cincy tennis -benet ton -aven atti -ëĵ Ģ -un geneva -saan ich -r sa -poconor aceway -p liers -inter rupts -dark room -bau man -affe ctive -tou ro -tag aytay -sw ole -sc n -o ston -min ah -lam pung -coni ston -biken yc -bali ye -win i -spec trum -h ick -ely se -pet ter -i sel -emb assies -dj iglobal -dec ca -chal amet -an ony -ta ar -stemc ell -po sium -muen chen -bblo grt -app dev -anirud h -ad ah -toler able -sula iman -sec network -rhon j -prece ded -ob vi -kp mg -exclu sive -cou steau -une arth -space walk -pen der -il k -fari ous -excited ly -common place -bin ge -alec ki -a ert -w mma -transc ei -sw amin -sch ec -s anga -lec tive -ki pp -gl itch -f any -elli s -eal ing -di man -ãĤ¹ ãĤ¿ -ÙĨ ÙĪ -ville a -ver ily -putra jaya -head land -h elly -ë ŀ -un announced -techno logically -pushawardsliz quens -phra im -mar z -ma scot -kindness matters -hu ski -her ren -amary llis -a isa -sten osis -shi ite -mv fc -ml p -mirand alambert -me jia -lo ger -like able -ge vents -cold field -bu de -appli que -^ * -windows ill -ste mming -sql server -sh ur -mschar lotte -mscharlotte wwe -katerin burg -i spr -hinter land -fre i -er asing -concentr ates -blood bath -bk lyn -ari ka -st mary -prime minister -parap hern -pa ket -om ie -mun d -medic a -law yer -ka poor -gotiger sgo -enorm ously -dop ening -cur l -ang irl -ðŁĩŃ ðŁĩº -vo tered -oooooooo oo -om bré -neer aj -n vey -marcel lus -mar illion -el fon -dro z -ane a -abre ak -wont stop -sof love -sher idan -sch utz -ry ne -old town -kr p -jype twice -int end -ghanai ans -flying tr -doppelgän ger -bro lly -agn olo -ðŁ¥ ´ -ìĦ Ŀ -yn drome -y ate -mic keym -life coach -en ke -cap that -b ne -stere ophon -pal mo -la et -franc ine -bm x -âī ¦ -whit eri -til ting -post production -knicker bo -em boli -umbrel la -ri i -refu elling -rally together -ne th -matri arch -lg r -fore shadowing -eye witness -ðŁĺį ⾨ -u can -ty rants -pav es -omic ron -mir r -medit ated -gal atians -dro m -cabine t -buy now -skill ful -sha v -pit bull -meand ering -indic tments -gu tt -f ens -br ity -bar f -ìĦ ± -su st -sn ort -sky ward -reincarn ated -posit ano -neuro pathy -mag and -lit tered -line backers -jule p -car tons -ben shapiro -ax l -ðŁIJ ĭ -rejec ted -o ssi -gai ther -en sue -b gg -uncontrol lably -sur bhi -so de -sha an -re join -pre e -higg in -cav s -yu b -w hal -use rexperience -spoon ful -sli ght -sar in -sachin ita -rhodod endron -rep til -rel enting -refere eing -paral lax -mün de -lea shed -il ms -col onia -chow dhury -cer i -ap are -and son -ðŁİ ¢ -ìĬ¤ íĦ -åľ Ł -work loads -up ers -tenter den -snapp ers -sm acking -she v -redd itch -ilo v -dinosa ur -bi jou -bankof america -wag tail -vi se -ud hay -pic turing -festiv us -expe c -ep o -encro ach -co ding -ba ad -ಠ¦ -wye th -sc raw -ove re -n ena -l z -j anie -gar g -e de -arti fic -window sphone -ver dun -under standings -to g -silver ton -shack les -ho ppin -fa zio -election results -cbsd fw -ca pel -bio ethics -wrong fully -vel i -singul ar -pe sh -o chs -kat er -kar li -hango vers -flo pped -financial inclusion -fin ns -ff en -eart g -e sche -dy na -consecr ated -ce u -sam bo -s zy -reyn old -mat uring -lol ly -lau d -gel man -gear sofwar -g sl -fledg ling -epilo gue -cal led -bo ssier -zo id -yas in -whos next -stabili zed -spo res -spi ky -rol lie -ra vic -prinse sachinita -ph ds -mun g -mamelo di -maker bot -fur by -fin der -ct fc -brun ello -avengersinfinity war -ac cru -ab us -ðŁı Ŀ -ìļ © -âľĪï¸ı âľĪï¸ı -sp u -se pe -se aboard -power puff -impre ssion -gold end -ft f -e gy -drink water -b int -affl icted -Ñ ı -sch on -respect the -ram ming -piñ ata -park lands -math ur -la vuelta -far ia -disney cruise -deci dedly -simul cast -que bec -p ge -mit te -lc pl -ill ing -har oon -eu pol -enh ancer -der gaard -ard more -accli mati -á ĭ -wat e -tat oo -sh g -od b -la gan -equi pping -dhru v -cystic fibrosis -al aac -ðŁĺĴ ðŁĺĴðŁĺĴ -âĪ Ĵ -win theday -total itarian -it sm -elle smere -de kho -daugh try -childrenin need -by s -bak it -tallade gas -supple mentary -stu ck -pav lo -obla stoma -n jo -mix x -lan ez -krat os -kay aks -gar ret -favor it -civil ised -am pl -ac ra -¨¨¨¨ ¨¨¨¨ -wor ley -tri omphe -st ak -porto fino -pin ec -percent ile -om ari -kus ama -inverte brate -guild wars -gu id -ei b -bo gs -analy sed -san thanam -rang ed -le j -gains bourg -feel goodfriday -den hall -cros scountry -confeder acy -cen trum -blak ely -belgi angp -ðŁIJ¾ ðŁIJ¾ -ðŁĮ Ń -y aaa -up time -sound wave -renfrew shire -pati ala -mi m -k adi -hum bug -hey day -fox woods -fab rizio -ely sian -deterior ated -cover version -afrika ans -Ì ² -sn it -slo t -samsmith world -r dj -py aar -black hole -bar man -abstrac texpre -xox ox -where by -m raz -green est -fly be -dro wns -cu mu -bla m -al af -ain sworth -trump shutdown -sk at -set to -sc outed -mal ton -law lor -fini shed -emo tive -dynam ite -ar shi -ano e -жив оÑĤ -sing let -sar torial -ni shes -hel big -hart ford -boy le -ðŁį £ -z c -tuss le -sti ves -skir mish -red to -phen ology -matil das -jen son -integr a -heart ily -dolly parton -breit bartnews -b mp -ðŁĶ¥ ðŁĺį -ðŁĮ¸ðŁĮ¸ ðŁĮ¸ -way v -si stine -poughkeep sie -oro ssi -loc kett -hindu tva -dead man -aqu it -ðŁį ¬ -âŀĸâŀĸâŀĸâŀĸ âŀĸâŀĸâŀĸâŀĸ -Ñ Ģ -uni onists -ther oe -sm elt -r natweets -kal u -family guy -exagger ation -des ic -chate aux -birdc age -bic ol -anc tuary -ad nan -" @__ -went worth -u ros -se ss -se ss -power ment -mi sia -mar ku -gen itals -flo g -distill ation -bun dt -bor tles -w ile -scalli ons -sat t -imperial college -gu v -aerob ics -çµµ æıı -pope yes -pi sta -neglec ting -ik ki -house boat -ge ary -don er -spear head -sol aris -ob ili -eur on -dun stable -ë¸Ķëŀ Ļ -un claimed -spoo ky -persi mmon -it smy -fight in -ar ley -z eni -th yl -shav es -predic tably -me ach -may day -ma sti -hq trivia -bien venue -be bo -âĿ¤ï¸ı ðŁĺŃ -ô me -ve tch -val lec -v dc -spru it -pat ent -o she -guru ji -do ch -cor tical -cashe ws -bu eller -bau chi -super ior -sand r -r cr -ir in -hrithi kroshan -embr yos -dom ens -do per -cha peau -ðŁij» ðŁİĥ -yl ine -y us -un am -su kk -stoner fam -recep tive -os p -in ke -hil ia -green energy -gor od -cap er -c co -b wc -redro ck -ra ekwon -g yo -eu bank -complac ent -bedro om -ðŁijī ðŁijĪ -âĽ Ī -живоÑĤ нÑĭе -water melons -total divas -spring dale -sp edes -slu shy -re ve -nur ser -men ez -bil lab -ad l -ç IJ -term ites -r fu -lo ll -ip u -cr acing -chas se -zi va -trilli ons -red fish -pat on -long champ -li sd -fol lo -fin ex -do goftheday -ce do -adap tor -wil lem -transiti oned -swee teners -ps vr -na agin -la was -kar no -guad ag -gal ena -exclu si -conspir ing -ber d -any ang -andr ze -tur an -stra yed -spl urge -personal finance -nat bynature -legendof zelda -food travelchat -delu ded -conce al -besto fetsy -ac companies -ab al -numer als -mb laq -dar rows -anach ron -ame thi -af ca -water color -under mines -sh ish -paraphern alia -ke gan -index es -hydraul ics -cl onal -campan ia -c bb -ber gh -======== ======== -................ ................ -the par -taste fully -scoo ping -s fc -om atic -mi q -lv g -itunes music -eng ar -du la -dra ch -dn cin -bloomberg tv -bever ley -bak r -and ha -âľħ âľħ -o bel -mah endra -la j -kun o -khatta k -k rug -hu iz -fen n -dn ce -colino donoghue -blaz blue -éĩ İ -vas eline -un cw -ts w -snow shoeing -refin eries -pho s -muer te -jumbo tron -in ners -im mu -e br -bri d -bram ley -bab son -at lus -a om -sim ha -rip tide -oh saa -dam pen -d te -bahrain i -vibr ating -st marys -redar my -gui dores -g di -fu k -bo bber -aler ting -( ^ -ver ton -retar dant -let tered -in vis -ha dd -gr instead -e wok -before and -âĺºï¸ı âĺºï¸ıâĺºï¸ı -yu me -thatdescribe syourfriendship -super lative -sovie ts -oro ck -lar cen -hy gge -hon duran -hilli er -hat in -h pm -est an -decentr alization -at ology -andre a -wi pro -typho id -stub born -scalli on -levit ation -esc u -dis sect -car done -bro dy -ay ew -alab a -ab ras -íĤ¤ ì¦Ī -sil i -rock band -rin con -mo cs -kick back -ju ssie -ar ayan -alai kum -ðŁĺ ¼ -ãģ¦ ãĤ -str ans -ship sinpics -ree ze -mat z -ko th -gun metal -ds n -di ved -cur ley -contamin ants -catch ing -tyne mouth -my k -mor neau -bud gie -apolog ised -adam s -ðŁĻĭ âĢįâĻĢï¸ı -ãħ ¡ -work life -mult nom -la fferty -dove cameron -a em -í ļ -æ ¨ -why dont -sur fs -st ü -repor ter -rec al -photograph yday -p isco -ko y -gram ma -dong woo -cor t -astro logical -ðŁĩª ðŁĩº -you were -u zu -ti dings -red bul -pre set -lamp shade -inthe air -icic les -hol zer -gi psy -gc p -cli x -bible study -w sr -the dog -tas sels -movi star -kur ti -im ed -icon ocla -fire dept -dg in -ant illes -a awards -sugar loaf -ric ken -motiv ations -ili st -hep worth -fan meet -do an -davi ds -chron ology -bol in -at g -[ !] -weh be -tortell ini -team dairy -new cast -manate es -mag alu -fre itas -forwar ded -college of -buffal osab -spor trelief -sotom ayor -nbaon tnt -matthew mercer -governor ship -al ger -wol fe -tit ch -stephen athome -ru pa -p onic -origin ating -nbc universal -info tech -eu logy -car ters -bum garner -ance y -yeg dt -wind surfing -st ons -poz nan -not ary -music is -men shealth -l pt -ha pur -el or -crun ching -terr arium -royal society -par ke -ner a -muru gan -mem grizz -joshu agarcia -hin ted -harmon y -ga ur -flu me -el rey -doc ket -be ga -twitter nature -s water -pu gli -ordin ator -one sies -mu kun -cru mp -bur leigh -ar chil -aftere ffects -stro mberg -pim ento -meh ndi -lo bal -kin near -intech nology -holiday season -con summ -cli ffe -cer f -buffalosab res -? â̦ -topo logy -su ga -sne ver -skep tics -shinde shil -ru h -mar at -ll or -hear thealth -ha vil -bhar ati -ar ang -weare united -w kyt -o tro -minne tonka -mal ag -g sc -Ĺ ï¸ı -un rwa -twitternature community -seym our -se ar -r nr -q ab -linkin bio -ku an -ha ku -ch aco -butt ler -bc wine -sket chers -shake up -ram m -pol on -photo aday -mosqu itos -fotograf ÃŃa -fli ers -encephal itis -el as -du page -terra pin -sath ish -har at -g ell -fe dor -disc ard -co ole -am ph -adop ta -ye z -ty dollasign -the win -sub trac -roy ston -once abc -od p -i im -fa kis -diplom as -bru ising -vene ers -tu i -thesunday times -shop e -moneti ze -mo ol -mann kibaat -khil adi -ipsw ich -electrocu ted -el do -cyber space -car naby -ãĤ ¢ -tech week -swing in -stocha stic -mall ory -li r -land fills -kala hari -fa of -à° ķ -this is -rap sheet -radi ating -ra pha -p me -niti aayog -ne gara -mand al -kra bi -iam k -hin ting -erup tions -dmit ri -ab ington -up mc -tc b -raj nath -multi function -lec ted -grin ds -dj ian -cad bury -burge ss -bron z -ang la -ac mawards -yah weh -pu ss -lei bo -lanc elot -bang kok -back field -b sm -as ce -whit mer -tou n -pre ju -max preps -j crew -ed camp -deport ations -cho cs -beat sby -ash worth -za heer -val ery -tr ini -sy sad -sun dial -sti p -sange les -san gu -roman esque -le al -lam ents -hit is -equi fax -clu tch -chi apas -af sc -zig lar -un qualified -tend in -stanis laus -rock chalk -ri vet -rhon y -ra ppa -man tras -fromthe east -dy ck -boy f -bi ome -ba strop -à´ ¾ -tw ise -perenni als -multiple sclerosis -mccar thy -disper sed -dau phine -ber ner -aubre y -xen on -ss outh -sar ahah -par in -muker ji -lu ci -hyo yeon -evangeli sta -ce asing -an dis -tim on -lu sk -f ha -esof instagram -duke u -tex tual -steff en -sagu aro -ridic ule -re unification -leap day -kra ine -idol ssa -hot shot -financial services -envy us -con templates -al ters -ðŁĺ· ðŁĺ· -ðŁĴ¨ ðŁĴ¨ðŁĴ¨ -ãĤ Ĭ -tu gs -sl er -pro wrestling -po ck -patri zi -nadi ya -hahahaha h -be as -wan ska -sle azy -ri ku -rad nor -r sv -nadinelu stre -man galore -kil gore -inno va -green leaf -ad mon -å¥ ³ -u ously -sung woon -sho d -sal erno -roller derby -r tm -pitt a -pau line -ni mitz -moores ville -lan ark -jav its -indv pak -hi the -here after -gri pped -encin itas -edtech chat -do pen -demo lishing -beck ford -ban h -ðŁĹ ŀï¸ı -ud ice -taste less -promp ter -nat ter -mi el -ii hf -han over -guj rat -dis dain -b news -aw c -ab g -ãĤ ½ -âĿ ® -y fm -transm itters -tigh tens -stel ter -sc ouse -sal liance -ir v -ick a -fa inted -dethr oned -bo tte -sa hil -rhon a -proof ed -juven iles -isuppor t -gh ton -fli r -champion ed -c span -alde hyde -zam alek -waf ers -sul tans -sn apple -re capping -n daa -gov t -followfor follow -discrimin ated -dg c -brid led -âĸĪ âĸĪ -for mance -fac ades -du pe -de mir -bl fc -biomar ker -sin st -ry ka -ple i -ny m -nur tured -moi stu -mal aika -gh ill -eli os -court ship -cal mer -an ey -ag ye -yose ob -ved anta -uss ell -um l -trick ster -th ali -pen and -pe et -ob er -loo kers -ia as -gam ba -ethno graphy -bor dering -bal er -an en -walk man -then ation -ri dding -pen rose -la ssie -hydro ponic -east coast -wwe universe -tom boy -to ir -ro dan -p th -on ef -care ss -bee z -the comedy -son goftheday -sab or -rten ews -ro hr -peak y -pare des -in come -gre l -en is -chocol atier -cas sa -aon b -an f -ampli fication -accom plice -wel by -stre wn -sand well -o for -kim on -kim my -k dp -ik al -hoo pla -gan as -ei steddfod -drum stick -demonstr ator -centrifu gal -bl chat -ìĦ Ŀ -vit er -ssy dney -nan om -deter red -anim ating -aeronau tics -ab ull -tick ling -testic les -soo t -sax ena -qu ine -pet us -mousep ad -jo ols -german shepherd -b th -alabam af -ðŁļ ¬ -ðŁĩ¸ðŁĩ ¬ -uof glasgow -tra bajo -th ics -rap tor -pro stitutes -orlandoc itysc -heart disease -first nations -bo ces -ãĥ¼ãĥ Ī -âĩ ¨ -yueng ling -talladegas upers -tab ula -ske l -re affirm -pan es -ir k -d oun -chan tel -bron t -wether by -spec savers -sch ema -precin cts -pan acea -inf eri -gint ama -fir stal -fin sup -e studi -de in -c á -yu van -the bear -paley fest -page ants -krist off -har dik -ha shanah -cr g -bu do -amli ventv -a jan -ðŁķ ¸ -ठĸ -susten ance -onlin ed -nostr ils -mol ar -f sl -ente bbe -de ed -chival ry -bib chat -aj mal -adju sts -[ !!] -ðŁĺŃ ðŁĴĸ -w mn -qu ang -pil lai -misogyni stic -mar bs -its me -holy spirit -h se -critic ising -co ff -cm w -chel seaf -ch abad -ad ry -uru gu -tom bo -pl u -mass acres -jack o -it l -id capthat -hl f -go red -chri ssi -av ani -anthrac ite -am ous -t ity -su ggs -se maine -safar icom -po z -mey dan -medi al -kan en -je taime -il ver -gu adel -gre nier -duchen ne -ale ssia -abra sive -wind fall -t itious -ra yy -mind blowing -le b -kati a -in charge -fu d -chit ra -alvin foo -re dress -me gha -ha grid -du champ -cudd led -buc ke -woman hood -vey ron -pat ton -ou is -lar ch -j x -fla via -bran ched -bas ses -agron om -reach er -ram ses -ra han -prohib iting -pl er -pe eve -oo zing -luke warm -kru sty -hai lee -el d -ardu ous -' .... -watchthis space -vi ot -road runners -q mjhl -pel le -ned bank -mos cone -mam et -lit is -kosci elny -j uri -j ra -in am -han zo -hahah haha -gamer girl -consumer ism -chipp enham -centuri ons -as ya -ancho vies -ste ver -sk r -roo ker -que be -organ za -nar ry -l itu -kl cc -accompli shing -Î ´ -u she -sw d -official helly -montre ux -len ingrad -ic ola -her kim -fuer te -e wn -dilapid ated -dau s -colli son -cold war -boo g -à³ Ĩ -to dor -ter mite -shine down -on ye -mer ck -law of -garden design -fighter z -de grading -bra u -ange red -al labou -wra h -to logist -smallbiz satuk -s wati -mon gol -mari age -man uk -gold finger -em mal -cit rix -ar rhyth -quadr atic -pat chou -mcil roy -iteach math -art v -Ø ¢ -valdo sta -to ks -ste ppin -sal gado -moo k -maz ar -irish times -comment ating -brown ish -ac ism -ãĤ § -play list -ol f -lucha underground -kol b -gc f -ðŁijij ðŁijij -show rooms -rafre darrows -on nbc -mew two -kondap aar -jud as -j illa -goal scorers -g autham -dump trump -de bra -cov fefe -chur ro -t ando -ly medi -ergon omics -capit alists -capecod times -ðŁįģ ðŁįĤ -ws of -squ ish -om c -meghan markle -lha sa -jan ney -hust ings -photo set -kis an -gard ner -ben zo -bat am -z ito -sub ju -sar k -pun itive -maure en -kaw ai -groupp alestine -fi j -en lists -ch ini -bang a -w abi -vit ali -valder rama -sou thea -p ku -om x -flori an -cn d -bt u -ast ley -am ai -ach amp -heath ens -go lobos -dan ia -cn rs -authori ze -ar oo -. [ -wonder full -w pl -taun ts -sonom achat -pi otr -pan ache -mc n -exper t -do than -alex i -ðŁį ī -íĶĦë¡ľ ëĵĢ -u calgary -tigerzinda hai -spin nin -shar inge -migr ations -mac don -ma ssie -key pad -karls ruhe -ili g -har issa -ha vok -figur ation -d ld -cle arest -broad cast -brit pop -biom ed -att t -arto is -zh eng -slu tty -ser c -ro fficial -plex es -pe du -moul ds -le ek -dak ot -dais uke -chry so -bon fires -tick les -stun t -sikor sky -gr d -def rau -chimpan zee -bha sin -worshi ping -w ylde -w ole -thejohn abraham -s re -ra ig -pinst ripe -orient birdclub -mc morris -lumin aries -lou ch -la shing -gro omer -elo we -clut ching -cal ving -accessori ze -ðŁİī @ -the todayshow -t ld -spectro metry -pa ka -minot aur -man gi -karant acker -hay stack -fr d -ef en -diabe tics -bul i -av s -andr és -al ty -x k -uni e -sof itel -shi do -riteish d -mystic ism -kundal ini -ho te -ho sen -hin kle -good luck -go gi -fried rich -con gle -chap lains -bur net -ang lian -é « -ston ey -rede eming -random ness -pr sa -ober on -newh ouse -gonz á -den im -del ph -con ic -an kit -wolf ram -wine bar -unmistak able -power play -nag ging -lincss kies -gh h -desk tops -bore anaz -as port -ad wala -íĺ ¸ -theyre theone -sal dana -nes se -ci an -chemi stry -can is -b hc -zoo t -x an -sylve ster -ici dal -hmo india -gav i -gam ma -g itt -critic isms -bi do -be bold -aashi qui -tu ff -street life -ro mp -monk fish -mal evol -looo ve -k cl -gad get -d bu -ben carson -ail a -ì ¡ -re playing -noc turn -labe ouf -j hb -game on -ast aire -% ? -ðŁĺī ðŁĺĤ -ri yad -nyc parks -nm su -ly mph -kwan zaa -in sg -hack saw -gh nessy -dand ruff -basti an -au ber -atla ssian -al icious -wel ker -ris sur -pra h -pit ino -mt w -la thtr -jong suk -in subcontinent -ev elyn -dav ina -cri bs -cre u -cit ys -chin chilla -canter bury -adhe sives -tower of -su ite -rapp ler -op h -new sin -don ot -co ts -bair n -ãĥ© ãĤ¤ãĥ -w aging -sl acker -siem en -sand bags -of e -ig ars -hygi en -hcl dr -fuerte ventura -fore see -f td -f sm -ev ict -bun g -at tica -whitecap sfc -ugl iness -ko hn -in animate -gaf fi -fe yn -empire fox -dv ent -co inde -chuck d -aber gaven -ðŁĻıðŁĻı ðŁĻıðŁĻı -verse oftheday -titan ic -microsof tedu -l atives -eri ka -au f -adjec tives -ðŁĶ´ âļª -z ari -xi jinping -vir ul -the ville -tar ot -su va -s magazine -ri ggins -py e -isi er -der ick -barn staple -thu man -sprin ters -r mu -mexic ana -loo ters -lan i -jaeh wan -hi me -fr u -east end -cr amp -char izard -out ons -ni ppy -f xx -d agu -sky cam -ner kondapaar -chu gging -argent ino -alab i -âĿ¤ ðŁĴĻ -u waterloo -redi aries -mi da -jar os -in ching -hon i -gold ilocks -dra pes -d td -bi ed -anemon es -aku mari -ak hil -yam an -vel ife -surin ame -ru ud -r hd -kill zone -i my -hur a -es inc -cric keting -cor busier -bridg ford -ble sse -as sur -; " -wal lah -up r -thor in -sc bwi -re mus -ol oured -news stand -new sonline -mal li -mahar ash -li tho -jun ga -il ies -first friday -cu evas -clo sets -bur j -bac c -b hs -ae sop -a alto -wembley stadium -wal len -under graduates -stag g -pla stering -le l -ity fc -it ur -im gur -homec ooking -hear se -g se -eski mos -dr ys -dailymail uk -bi ot -arav ind -ðŁĶ § -âĿ¤ï¸ı ðŁIJ¶ -âĿ İ -tapi oca -syn cing -sw p -mcgin ty -i wata -hon ing -de graded -boy kin -aurang abad -aun ties -vienne se -unexplo red -pal u -look alikes -ham sters -for taleza -ed am -diction aries -care y -ty ree -tom tom -stra vel -re aring -periph ery -mcle llan -ju hu -i je -gd x -dent ures -au gie -architec tures -am ador -ac at -yu g -ve he -sh is -sall ye -kut v -impossi ble -chat t -billeric ay -war birds -turn in -tol y -the mb -sc lothing -nbc bayarea -lun areclipse -li be -kin ross -et es -dar ke -advant age -wing ers -stri ve -ru se -modi fying -mcilroy rory -hi ght -hair loss -critic ises -bob bi -autonomous vehicles -ar go -̲ Ì -sub bar -spar kle -sar dine -ran aut -nu c -na sional -lo kom -impeach kavanaugh -folk lor -defen sively -bigg in -ave da -غ ر -ubere ats -sy mon -mimic king -ini um -eatmore fish -ca zor -bo ds -a fore -< --- -ðŁı Ĥ -winni pe -tooth ed -seren aded -har ic -drow sy -domin oes -dog finder -costab rava -bob sleigh -bich on -all iteracy -ðŁĻĭ âĢįâĻĤï¸ı -ಠ² -out lier -n ites -lanca shire -idi ocy -guz mand -far ris -caernar fon -bar ney -az eroth -au dra -amazon prime -x haka -valent in -tumb led -t ph -retro spect -rajap ak -ni kes -nad i -lu br -giov anna -elek tra -de ku -cl b -cash man -art lover -anap hy -! ðŁĴľ -⾨ @ -west virginia -nur ses -mac on -hul k -heath ers -ach ak -ðŁ¤· ðŁı¾âĢįâĻĤï¸ı -sp ore -ling ers -kid ar -har poon -gran dopening -chel an -anaero bic -à ° -toyotar acing -tar on -rays baseball -pilot life -ori vera -kur u -c wu -alan te -ab ate -wil ber -tou can -the fosters -shar key -r illo -lo per -life goals -jam ba -gall atin -coin collecting -bhatt i -è¶ ĬãģĹ -utri ents -s rd -po h -o ds -fun ding -fili pe -digit ale -cycling life -c vt -aband ons -tem pah -tar sands -stat a -sher bet -prosthe tics -pi ppen -ne sted -le va -ferr in -da ho -af ina -sports radio -sam edi -li ffey -lex is -gen eve -cal lu -bri st -bar ty -bar ic -you suf -it up -woking ham -wizard ry -we ster -si di -pan sy -me des -ke ya -hilary duff -de barge -crani al -win esof -symph onies -she hu -re sp -mis ano -lin der -infer nal -engro ssed -dallasma vs -cron kite -ðŁ§ ļ -ãĥ Ĩ -se vent -sd avis -pru d -olu min -hog manay -gin n -et ted -cul kin -corro bor -x ti -we ck -ud der -sta ines -reig ned -particul ate -nu mmer -gro sser -gro g -gon awaz -f bc -encan ta -ce i -(( (( -ventric ular -tr k -ta al -o ong -no vena -n cr -lob bies -ini showen -in oue -i up -hallo we -fore seeable -con done -vegan food -pr ally -moun tb -mi ki -jake tapper -gra iny -gil i -gh s -gaw ker -forever more -experi en -ex asper -ep lus -chuck les -cervic al -anom tv -ah old -ðŁİŁ ï¸ı: -sphy nx -shon da -ra khan -pel vis -kil burn -ic or -as at -york ville -travel diaries -th ack -shan th -sear cy -n dr -looooo oo -lip gloss -it achi -hartn ell -gar dent -chriscol fer -ch ies -bor d -bla ken -nep tunia -my switzerland -mu mmy -d de -cl twx -ac ek -: < -sho ba -rico chet -mark up -fy re -fire rescue -christ en -al eta -zo oms -youre welcome -wi gw -unis outh -twil dlife -sun ning -sin tra -seed ling -ru gg -public safety -pitch ero -mm ff -mid fielders -kn k -hyuk jae -fif teenth -emb al -bra zier -ðŁĶ¥ ðŁĴ¯ -sp itta -pa chel -jour dan -gold mine -flip board -eric o -az adi -ë¹ Ī -à® µ -visit london -reco il -que t -oc up -ni vea -new combe -k ome -foss ili -duck dynasty -dev ents -csharp corner -cheek bones -aishwaryarai bachchan -ðŁ¤ ¡ -æ ĥ -âĹ ¡ -yar aj -tre llis -stra f -myrtle beach -ligh thouses -cr unk -ðŁļĢ ðŁļĢ -ê° Ģ -unsc athed -tt ur -team sky -real y -pin na -orthodon tic -nike sb -let me -lean ed -gro en -dono hue -bra sh -traw ler -taxi ing -ros sum -photo art -pakh tun -origin ate -nu ovo -more over -man ti -machi av -long fellow -inj ure -hen y -ces are -am v -ðŁļ ĺ -t lv -ru grats -reg als -pad alecki -lun ga -kh wa -jan ette -fc i -de tours -cle ese -ðŁĺĻ ðŁĺĻ -ãĢ ı -top gun -peak challenge -le thar -institu te -hemat ite -fri sk -( ´ -ðŁįº ðŁįº -vote fifthharmony -un checked -th rash -sassu olo -ra kyat -proof reading -new deal -ma ree -lo ins -letour yorkshire -godd aughter -elsin ore -companion ship -bon fire -big time -beast fromtheeast -ðŁij ¬ -el salvador -asse sses -amo ore -ahar ashtra -adul tswim -swan sofficial -star c -se wa -sa xo -old man -ga on -centime ters -bluef in -bet way -ast wood -art sakh -are al -ag ee -ag ape -ðŁijį ðŁijı -vul cano -unrival led -tues news -se khar -sac char -oni an -kau n -im position -goul burn -fru m -free man -fou led -fin all -eger ton -dri e -x uan -victoria beckham -ver min -trun k -tam aram -super mario -need for -mess in -me ar -io g -fe ces -ce tera -cab os -tren tino -re paint -on etv -off screen -niger ia -mccon nell -kin ship -fore igno -christma scountdown -bag well -çİ ĭ -yo kai -yar os -wad dington -ur band -real hughjackman -r wy -ou ette -mo res -llang ol -fly thew -dl r -bis choff -al ak -اÙĦ ج -vent ur -tab bed -st ls -seam aster -ratt ler -pro cure -nott s -con forming -ðŁİ · -william stown -var ou -tranquill ity -th rissur -sn ark -sevilla fc -pe asy -paper backs -law an -day uk -app iah -uri ah -som mes -showyour hits -sc ancer -mal inga -lauren ce -hurricanef lorence -bride tobe -bri and -blind folded -beg g -azzur ro -ðŁ¤ ¼ -tu stin -scy the -ma din -luxury homes -ker atin -gw yn -ff d -dam o -bt ts -be cer -Î ² -wid gets -var ner -tbil isi -shock wave -sa hl -rock wall -qu eria -kel le -invasive species -flam ing -ve tri -surf boards -sukho i -ox one -mm l -fr act -c sul -ಠ¤ -w ss -sar u -ro by -ra bin -myan c -erup ting -des ro -ci aa -ac ro -thyro idism -schla fly -parksand rec -mut ated -lifeis strange -gh y -ford mustang -dor ney -cat o -body guards -ani els -è¶ĬãģĹ ãģ® -sl g -s iting -resear ches -lofo ten -i and -cop ha -assemb lage -; - -wo t -tcd dublin -sten ch -no sy -net worked -ma eda -gher kin -cuper tino -com o -wre ak -shel f -padmav ati -mon ti -lol lies -ho tb -entren ched -tron dheim -srini vas -shor ty -shiv n -projec trun -low ly -lin wood -kier on -eth el -es ce -ðŁĺī ðŁĺĺ - ³ -wil ts -unc tad -smar ties -pat t -ne jm -mad hav -jayalali thaa -g tv -the city -o gle -mu sing -mcke own -matri x -f sf -Ñ ĭ -poinset tia -magne tic -fle as -ed hi -ed bookfest -bow o -ba har -x lt -working together -wo a -with refugees -ss chools -score line -run for -regre tt -ha der -e it -case study -ad ot -ab ha -ðŁĺĨ ðŁĺĨ -trac tor -sub culture -special ises -san u -pl tw -mis led -mari kina -maneu vers -hoo ps -gri me -fort lauderdale -dy spla -cel o -aw am -at our -Ë ĺ -william sport -sk int -å¹ ´ -t anna -shou ses -rheumato id -pla sty -pa wa -oscar pistorius -nott ingh -m we -lor raine -kar tel -i dont -har te -ghost adventures -g listening -ep som -a acc -ãĥ ł -âĶ Ĭ -watch dogs -time x -spec t -sp aul -salute to -rin se -qant as -plur alism -neil son -mo ine -maha bharat -mad don -electroly tes -du ches -adap ters -ا٠Ĭ -valen zuela -r ca -pit man -o ars -micro plastics -ho tt -ho ti -dou ma -dimple verse -der nier -commo dores -b boy -wor ri -seung yoon -or is -no ban -men shealth -i dy -hi g -greg orian -f sprint -conj ure -cazor la -but chery -ad versary -x amarin -thorn berry -t ü -sw ann -sta al -santac lar -repe aled -quin tu -qu é -per tur -mé tis -man ning -ic es -go ji -agne tic -ðŁijĭ ðŁijĭ -zo d -wal dron -tree hill -spo p -ig or -hal ley -cotton candy -ar kansas -acceler ators -vis alia -tr iceps -qing dao -od ac -li key -lat enight -itv corrie -empor ia -electron ically -cer ritos -b ns -are cords -ad du -ðŁIJ Ĥ -ve dalam -spar se -on tap -monoc le -la il -gn t -car dia -cap sic -bou w -bear dsley -bas i -plan ds -pi et -personal trainer -ow er -ol as -janu ary -jack and -environment alists -dr qadri -dog fish -vuel ve -th waites -steff i -schul man -les ville -food tech -stephen fry -pos ers -cur so -cor bin -br uni -ðŁ¤ Ń -tweet like -sme tics -rene e -post malone -pat ter -p sni -or no -ll am -i du -en tro -bl ica -b nd -the park -son atas -prime day -paw some -official bsb -dro wn -danger field -beach clean -ðŁĺį ðŁĴľ -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -wefly asone -wa seem -rac kete -pri des -op u -grand slam -dolphin project -cun ard -zi ppo -wi les -sh b -san toro -muse o -me mos -inde xing -dri est -bronch itis -arte yart -world peace -theat ric -ke ely -inve stor -far ru -dam el -criti qu -coron et -channing tatum -body work -as ser -éĩ ij -road ing -quin te -nation ale -gu di -great ful -fu gees -adri enne -sal ish -quot as -qu elle -pro team -neo liberalism -n elle -khal ee -jaw bone -impair ments -go ggle -dul la -di ari -black adder -ven ge -spro gram -she w -science magazine -lind or -h pi -forthe people -fac esof -fab rice -ef ra -d ne -cate rer -canisi us -bu sca -bran den -bibli ote -bee keeper -ation matters -arri a -ðŁĴĸðŁĴĸ ðŁĴĸðŁĴĸ -y au -sub ways -state ofthe -sher ri -rho ea -patchou li -lu mpy -la vor -hal wa -creek side -coler aine -car bure -bloom in -albu s -al bers -ta ha -ren ata -polter geist -net gear -kaz e -dazz les -cre mation -chan baek -cal oo -mour ne -kor o -ha ight -gas se -fi m -eg linton -desi der -chri sm -bat tering -ak onda -ðŁķ ¶ -zip an -sen tedcruz -rin go -re me -or cs -mist ook -marthas vineyard -lu th -li vid -iti l -er tz -tag h -step dad -staten island -rol la -riode janeiro -province town -lu lar -ken e -expe l -boom town -bh vn -Î µ -sh as -se is -quatt ro -p fe -over use -moder ne -hype beast -folk music -fish tail -ca jon -ang ora -ðŁĴĶðŁĴĶ ðŁĴĶ -ðŁij§ âĢį -no filter -mc gann -lam or -hist stm -el los -cre we -art nouveau -am atsu -ac cs -a em -ðŁĺ Ĺ -ðŁĸ Į -yuk o -turk ana -torch wood -spi ffy -si ii -sel fridge -roc ca -ro chel -mat er -life with -len i -kil le -ij s -hard ness -ben net -t ml -son es -sic ili -road to -pric hard -p va -midd ay -chihu ly -back fires -ak il -ade v -& / -âľ ª -wf my -supere agles -rang as -py ri -pix ar -pan khurst -la hore -ho stel -expend ables -el nino -circu lar -bizar ro -be bold -ais d -tre ce -sr f -orland om -o ed -ny time -munster rugby -invent ories -gate house -gar m -camer a -be then -asser tive -ìĨ ¡ -âĿ¤ï¸ı ðŁ§¡ -we p -w td -t mp -coven ey -ceil idh -born to -aw f -autom akers -asi l -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺį -wol l -thedaily show -t dm -sher man -scru ggs -samo an -rear view -over takes -mad max -geo logy -condi ments -by num - ¤ -wood fc -tan gi -san rio -oo ster -le u -k wu -hiber nate -cay man -bewit ched -ali bi -you ll -y fc -win ed -warat ahs -spit fires -sne ha -love dublin -impul sive -ibra xton -hop kins -har o -blue jacket -bee be -ar paio -ðŁij Ħ -Ø§Ø ¹ -ve on -tham mer -sh ta -pudu cherry -pitch perfect -me ine -me gs -li mp -j sc -fu dd -can et -bel k -acro bat -ó w -west meath -sa opaulo -pro jet -lam ba -frit illary -er by -dg al -deliver oo -ye eeee -vul garis -start led -repe ater -ray ban -ra val -por que -o han -ni eves -mur ica -kenne tt -haar lem -gro he -constitu ted -best boyband -èģ ´ -y aga -turn key -sx m -su raj -sk poli -s di -psycho social -nar cole -n and -level up -leis ure -kis d -jam ia -house work -cra dle -compost ela -comp iler -anne marie -aleksand r -su bic -season ally -king sland -jam b -jal and -f blogger -drey fus -din ed -cron enberg -conspic uous -co ton -ca pps -bo hra -bo gum -bal aya -americ anc -u mic -pau s -o kie -mul roney -mer maid -melo drama -lis more -it ations -im mol -ful mer -br ining -bol ero -bin h -ast y -we standwith -thunder ous -stub hub -ro by -r kc -path um -o ac -nb r -mun ir -legi ons -jeon ghan -habit ation -ge ht -cappado cia -( !!!) -èĭ ± -yn om -the grammys -tab lo -rec er -pu ller -ny ack -new beginnings -maynoo th -inf low -en stein -de ano -cr in -confection ery -berlu sconi -ash raf -aby te -âŃIJï¸ıâŃIJï¸ı âŃIJï¸ıâŃIJï¸ı -wing sup -syri za -presci ent -new sad -nare sh -lis zt -gre ath -extra pol -divest ment -dis orderly -cu st -body weight -ave don -walk able -red fern -push kar -pro kof -mind charity -marin elife -dul u -as son -win kel -to ky -the p -t pr -refu ges -phoe be -ec fc -comic con -bro od -br m -asam sakti -adulter ated -qu illa -pol anco -po vers -no shame -montan o -kaz u -ham mocks -gu ana -el v -der ange -delle mc -bic on -bi or -bean stalk -ve tt -saur on -or bust -ol ic -li zzy -ik at -hand cuffed -fa p -ani an -ac ell -à¤ Ń -whatyou eat -syty cd -star cinema -s net -rat cha -om b -john green -jit as -h si -fun time -e ac -dad lani -clean air -bay e -zo a -wo on -wh smith -vo wels -un secured -steph on -st é -per v -i aea -ger maine -dis respected -birthday boy -ba on -as gard -âľĬ âľĬ -us atoday -tri age -tho ts -kipp ur -fam y -equal pay -dncin phl -del ph -dd w -al qaeda -" + -௠ĩ -str zok -sh ome -on ward -kas auti -hy ping -excell ence -caric atures -bblo gger -ay n -winter time -sac co -or no -musical theatre -la cher -juni per -happy place -ero de -dt p -color ad -rak uten -pla ss -no ite -mccul lum -hosi ery -ether idge -enrique iglesias -dru id -dra gan -com unic -( = -ðŁıĪ ðŁıĪðŁıĪ -uncu lus -twee ty -squaw ka -p russian -oro ville -m pe -ker i -colin morgan -ay ush -_ âģ© -. âĢĶ -à ¹ -shed d -she en -rose dale -pa chy -mix mag -incen diary -gil git -cat ac -bold ness -ambu shed -alco a -ü n -so con -rati fy -plu ri -on air -fl p -eng els -eb ner -bron zer -bro s -alig ns -ķ ï¸ı -ì Ķ -prosecu ting -profo sinbajo -obscur ity -n tl -lu ger -gonzá lez -epile psy -bo fa -ali fornia -' !! -ãĤ Ĵ -ठ² -wwe supercard -wt f -win ch -wee vil -twit song -tv guide -supp os -spir o -i see -ate ez -vy as -soom pi -ny dailynews -hand loom -co bble -bolsho i -az ing -aw olf -an kit -ðŁ¤¦ ðŁı»âĢįâĻĤï¸ı -way land -track andfield -tear oom -scoundre ls -po b -over fishing -en ia -bar bosa -alicec ooper -) * -we day -in activity -hel lish -dor dog -axi om -ë¸ĶëŀĻ íķijíģ¬ -thra shed -su tter -stra iner -so ren -ram o -ope ia -nikki sixx -ky derby -flori dian -callaway golf -c ml -bran ford -bird house -baby face -the cho -simon cowell -move able -meatfree monday -lo red -laun chers -ko alas -kingscol leg -ja v -gor gonz -femin a -car mona -an sky -z ep -verte brae -time y -skill susa -shir in -ser gi -re gan -pha il -north gate -mo eller -keralafloo ds -ke swick -iti e -har psic -fin cher -dc l -carmar then -amit abh -alzheimer ssoc -ab jp -pace maker -ore m -lyca productions -en sued -ee c -donald glover -bot tega -wy z -run d -pour ri -o dys -my ron -le ti -la dd -jc ps -heal ers -greys abc -fair mount -bru v -anton in -ajay i -ê² ½ -spr inge -press forprogress -p ase -lo ons -kellyanne polls -ic are -fre da -fox conn -de france -ag all -ac ne -[ â̦ -ðŁĮ ij -v gc -show ground -pound land -olympi que -manife sted -kar as -jack fruit -instru ct -in our -il ab -hel sing -al meria -ì§Ģ 민 -Ð ´ -ver ock -tl m -oc elot -gas pari -data security -cher ub -c vb -birth ed -bel voir -bar rack -bak lava -ad min -ðŁĺģ . -un er -tech ni -su ena -rot ated -penny dreadful -pel tier -mic ally -f naf -cipri ani -auto car -any day -ÃŃ o -vignesh shivn -sr u -re ttes -mb p -marsh alls -legi ble -labrador ite -e az -day ne -con val -ci se -chimic hurri -black currant -bar y -ba ale -ash burn -ðŁļĹ ðŁĴ¨ -y adi -su bang -save money -on in -nhl allstar -k fc -grin ders -gates foundation -âģ© ! -ti dy -sky lines -mor land -full house -ex l -every man -to ft -pp l -perpetr ated -nand ini -mines weeper -love of -ingra ham -en elson -da as -cam pari -ann ul -a art -ðŁļ ¦ -stun tman -spr inging -nou vel -million dollar -in hib -her der -entang lement -di spl -com batting -battle star -whel p -tru ssell -srebren ica -rt é -o tica -mumb les -er st -coc teau -uc f -summer ville -suggesti ve -g pus -escar p -ed son -dg asm -cap ta -ab ir -zak har -woo kie -victi mized -thu pp -the book -stra it -sports man -scher zer -raj kum -own it -mc cour -le ib -hor ia -holy field -excel ente -est ilo -el am -e ben -coyo te -amazon ian -rocket league -ritten house -public lands -mat ador -manife sting -kar n -afri end -w yl -w lc -t mb -qui que -patriarch al -p sac -j ago -gi bby -de colon -contra ption -brid ger -astoni shed -å ³ -water sports -timeout london -ten o -quanti fy -nap time -moh fw -know sley -hei fers -gasco igne -free k -ei ffel -collar bone -brazili an -vi dad -uc davis -r itt -open street -moun ties -min ton -kryst led -k uni -hol ton -flash point -duali pa -will be -v alls -ry t -re issues -na die -luhan sk -l pool -guil le -di strust -des man -apo o -ðŁIJ ¤ -sin tl -rever ie -ma kon -le ve -jak ob -hor ni -dd b -cam ryn -ë ¡ľ -ymoun tains -wedding photographer -vit oria -tome try -tal ons -sche in -ran jit -pau lin -past el -or atory -neve rending -mon fils -library life -li si -indi atv -bin ks -bi da -ai kido -victor s -tur day -sport smen -shru gged -sal ves -re gn -peer less -pate k -jj ba -guern sey -exuber ant -black berry -wel fare -stu deb -quay side -nar ay -lou don -f wx -dise ño -cel e -bohe me -awe b -antic o -anthony f -ador ably -aamir khan -stock pile -pe tty -pas se -pa stu -moderni zed -man z -le vers -jun tas -gras shoppers -a stre -w ta -thegreat awakening -pas coe -ng k -jen o -d se -cla vic -& ' -we faq -we care -sun spot -rai den -optic al -once acard -jav dekar -house made -first born -erec tion -de angelo -bal ah -alp ina -ðŁĴķðŁĴķ ðŁĴķðŁĴķ -sla shes -ra ucous -pal ac -hey man -gh ir -fo yles -crou ching -changing lives -au la -as ghar -apol lon -ab stin -san kal -monro via -l alo -kangan aran -car yl -birth time -am ano -ðŁĴĽ ðŁĴľ -unapologe tically -som o -sh of -sey i -prop tech -ong ed -ni hon -nas ri -mat tia -man ik -lo gar -jur ong -it ti -hay dock -don russ -dis respecting -carnegie hall -ano dized -© ï¸ı -tex po -ss an -robin williams -pun che -mon ero -mo hair -manit ou -interst iti -home red -fsprint monday -tan u -su bbing -shiel ded -ratt ling -rak itic -quest love -man orama -look north -jun hyung -isma el -grumpy cat -fro lic -escal ators -dÃŃ as -de bar -colleg elife -cle v -brick work -bom er -all ama -y urt -vul a -spreadthe word -ped ics -lom ax -l uring -kr u -human resources -he dging -har wich -goo ber -crutch low -cly ne -y v -thessaloni ans -spir als -plant ar -hang man -hai fa -gyp sum -gl p -gameof thrones -advo care -wa yof -star times -or a -occu pies -misogy nist -ku d -kello gg -g under -foli um -emily bett -big blue -aw oman -sp aring -sop p -par ound -mind body -mail boxes -la zer -j so -great british -gi lead -f ba -ch aves -ce vents -c so -aw oke -al aw -ak ong -young thug -ru ll -poly styrene -pe ñ -oko ye -lip stick -ke fir -hi x -flu oro -di aling -am ana -traxx as -su j -stra m -sas soon -mm snippets -han if -fiduci ary -co stan -blu shes -av ale -af p -/ ' -è ĩ -wedding venue -univer se -shrin ers -reli ef -ob in -mike the -mat os -jo ckey -jam in -intric ately -il da -gli ders -ex xx -yu lia -wg me -w pli -sc lo -ra ker -patter n -ob it -master works -landsc aped -l sp -l ers -kav ita -ih g -fly past -extracur ricular -end anger -cape breton -bra x -bor row -action figures -w bbl -tal kers -sau cers -re adi -mam mal -m sport -i ee -g hal -back light -b ww -ak ane -sti ve -my peakchallenge -il ana -sand ed -pi ety -ke es -hur l -harry shum -eag s -dro ids -do v -city news -brai ding -barclay scenter -band era -à¸ Ł -y ada -wedd le -varou fakis -swel tering -special needs -sjo fficial -sax ons -riaz theboss -rashtrapati bhvn -mi ms -kro q -har nesses -g sma -freder ik -dy an -colo res -centri st -brain wash -be ow -ay ton -ax o -aureli a -ace vedo -ç¾ İ -ا٠ģ -yas mine -stel vio -scoo by -mul van -i got -endo scopy -dil bert -ðŁĴħ ðŁı» -x drive -power train -h de -foster care -eloqu ently -carbon dale -wh all -un ing -ti fying -superintend ents -sm fh -of tware -mu tts -krystled souza -far thing -transm itting -sig net -portrait photography -o varian -kit sap -kar ya -d alian -b sb -b ho -ari zing -ãĥ³ãĥĢ ãĥ¼ -à¹ģภ¥ -sam bal -new in -music ed -monaster ies -marke tresearch -lovel o -di op -deta inee -whe ate -sol er -sa wyer -red ales -lan es -dan zig -bac chan -b iss -austr alis -ab acus -what vegan -upp sala -tull amore -soci ological -s van -ru ffin -nepo tism -ms gs -ke mi -ka hu -ex pun -ec ks -ðŁĺģ ðŁĺģðŁĺģðŁĺģ -whit church -w elive -un block -u cr -tow path -sen er -rede ye -r ch -pear land -o afc -lamb ton -imagin ations -fashion wk -daily doodle -ay man -apart ment -í Ĺ -tahir ul -sei do -ok on -o jos -mu dra -mor tuary -is thenew -fore fathers -fern dale -del phine -carre four -bor gs -ðŁ¥ ¶ -tie fling -th and -sel hurst -re ya -nei ge -mi ha -medic board -jann at -i movie -hol dsworth -gu en -gat ari -garden ia -cho bani -ca sta -ben nie -yule tide -r se -proud coach -lu te -josh ane -gu era -gl ac -far mb -exu des -eng le -battle fields -ap akistan -ÙĨ ا -ss gt -shar pest -power shot -mar fa -laur am -harryshum jr -go ole -espan ol -dis d -cas sel -cam ise -argon ne -yos bourne -uk bloggers -ta kay -m strong -lubric ants -kine siology -kas am -game sh -eu ri -disc golf -dev ans -cha os -auto desk -âĿ ¯ -wim ming -wa id -valiant comics -simul ating -po pes -on dor -mari anna -lop sided -isab ela -game maker -flead h -easter weekend -bhu mi -bar ges -ani shin -íĺ ģ -sand ara -may i -lo es -kin son -godav ari -b fast -avi onics -ab elle -. ðŁĺī -loveyour petday -kru sh -import ers -fro mage -east side -e ey -c mom -bo die -bl x -ul cer -tm h -sa ito -reti ree -ps al -pret ties -maritim es -magalu f -m fm -jenson button -in am -car hartt -bun da -avi gnon -need a -ip f -ic le -dews bury -bar ker -andre ww -ðŁĺĿ ðŁĺĿðŁĺĿ -ther mos -sonic thehedgehog -m nc -la vine -glo u -car club -ag gs -ac tional -ac cou -ab cf -y atta -vis co -ver bena -syner gi -pri mes -phar ao -p ella -ner uda -mo tos -guel ph -cor re -bang erz -aw l -auth ackeray -all saints -ae v -un circulated -ste ading -precision medicine -o stomy -must see -mediac ell -kwe si -ju al -im c -ghet to -fla vi -em pathetic -dip brow -criti ques -cri si -ador n -ðŁ¤ ¬ -stap h -rol le -re tur -bab yyy -ye et -wild horses -wel wyn -stop her -see ger -reiter ated -nl ds -lo ge -head ings -gorgonz ola -en caustic -di u -di sta -dam me -ch iron -bike to -ðŁĮ¸ ðŁĮ¸ -war is -usa hockey -the placetobe -snow boarder -sheskindahot vma -sal ome -owen sboro -k ler -im perfection -if ta -house keeper -gu v -game changers -est amos -bu kol -bom ba -tol ling -steal thy -sta x -sketch up -sc lu -pol and -mis cha -jin ja -gre go -da star -as al -ar arat -ãĤ¤ ãĥ© -ಠ® -tw irl -t ws -pu cci -par ading -kal am -is fahan -himach alpradesh -et l -copy righted -co heed -ar kin -ah n -ag ad -ack o -ac op -ðŁļ ľ -ðŁij Ĥ -âĺºï¸ı ⾨ -yan ew -un divided -ull man -t q -st ds -pa sion -minim alistic -menis cus -jo st -ich thyo -gol e -wsb k -spo kane -leav ing -kan n -iter ative -cel ica -bl arney -ðŁĴ Ĩ -zz les -womenshi story -vick sburg -un p -swa b -sof tball -ro or -pamp ers -pa ch -ni ya -neutr ino -it f -haver ford -groo vin -fa thom -f mx -art space -ab ounds -âľĬ ðŁı¼ -t ams -n ham -ju ggle -jol ene -brandy wine -augu stin -ðŁĴ£ ðŁĴ£ -ëī´ ìĿ´ -z is -sm d -pa del -ni ec -man fro -ke iser -grown up -blo opers -bar tow -ad hi -run ways -rang i -portu gal -papp as -men der -mal aw -ex ert -amwriting fantasy -çĶ » -åĪ Ĩ -trek ker -tele matics -sf d -pap an -ou tro -optic ians -niker unning -lmfa ooooo -lal it -iso bel -fair play -expen sed -canary wharf -call for -be ster -ah li -zambe zi -ut ara -stru mp -sal to -pen y -om id -obstruc ting -ne re -kre bs -glyce mic -ext ant -dominican republic -cour ting -ar re -x eno -ren ta -new video -make the -horn bill -gu ero -fut sal -fertili zers -d di -constan tia -ó ¾ -trustthe process -tid bit -te ese -st ler -seri als -pr ate -lan ai -ge ta -feu er -bun dling -tent acle -silen cer -short comings -safe guards -pal atable -pag ano -missi t -epile ptic -ed h -de santiago -bur k -alab ang -wsoc tv -worka holics -we iss -uto pian -ster t -om ma -loo o -lol la -ho on -gre ggs -beat y -we br -up d -un committed -trivi um -t ce -pine hurst -maple wood -gor gon -ek ta -anthonyf joshua -son ar -oste opathic -gru elling -director siva -d th -boye ga -boli vian -tan gel -strate gy -st paul -shel burne -sch mitz -pla c -pal me -niti sh -mom mies -human a -fern anda -faver sham -di ana -chu ckie -âŃ ķ -vig nette -sail ing -pre show -li gt -kar loff -hou sen -h ft -em pres -be vel -be sh -âĺĥ ï¸ı -ta iling -silk screen -pri mal -off erman -mil dura -king sport -ferr ous -dg en -chair manship -ðŁĴľ # -sp outs -sil ove -schme ichel -s lau -ri ken -mc clintock -lu strous -k lau -jumper day -go atee -global isation -ari ef -after shock -zi ki -we aver -smo m -sa si -recor ders -ra is -pear son -ip as -i pe -humber side -f ce -buck y -bo ars -wis s -re ine -prob st -ph ong -intellectu al -handic rafts -fd fs -enterpri sing -cocc al -cic lismo -carr ara -b vs -ak c -ðŁļ¨ðŁļ¨ ðŁļ¨ðŁļ¨ -yy ah -web shop -sym biotic -stu bby -me phi -mb ang -e sea -but chered -u vm -revol ting -mac ca -hhhh hhhh -gun tur -el be -dragonball z -catch phrase -at tic -an ee -vo e -vio lette -unra veling -tu ms -subur ban -struc turally -stre ls -se ch -re si -puj ols -pras anna -om arosa -nar ro -lumber jacks -ja an -free book -boss man -black ish -av ali -ãĥķãĤ¡ãĤ¤ ãĥ³ãĥĢãĥ¼ -vo ce -search light -rejuven ated -pr n -mar th -goal scoring -gi vers -ga w -fat ter -vac ated -ts ons -ta pia -shri ya -oswe stry -op ter -now all -mas ss -lang kawi -janethe virgin -carlo sp -budd hi -brit ains -be eps -ak han -w ff -prep on -navar re -kas ar -gran dest -elev ation -ele on -bra ithwaite -beaujol ais -and ante -าภģ -yard age -stal emate -ol lywood -ne ssie -mam matus -inf alli -de ering -crude oil -angu s -am ex -!!!!!!!! !!!!!! -olm sted -lin n -iri ses -in xs -impac ton -faul k -curren tly -ba az -wan ews -ske wed -shind ong -re po -p itu -oo ops -mar zipan -mar te -make sme -h bs -gedd es -g bm -first time -es ks -asi ago -sar copha -nal oxone -kab out -ing rid -globe trotter -c sir -back fire -ba reng -y w -sa adi -q asi -opportun ity -ni khil -ms v -mau ri -iron mantri -iron man -ingraham angle -indie authors -grey son -íĭ ° -x mr -studio green -se mma -ridicul ousness -rec tory -kon do -inf ancy -el clasico -deli very -an caster -ach in -Ì ¶ -sv pol -sun o -sp anner -solidar ity -ro hn -eag les -d ti -clau dette -â¬Ĩ ï¸ı -xi amen -word play -wiki artapp -v ath -sur fri -pat anjali -ortho pedics -ingu ish -gle am -eu elections -epi genetic -cold water -ay a -ant agon -aer om -ade a -ab as -Í Ļ -ze eland -sig graph -phon o -of com -mar ni -inve stec -im not -gener alized -fromthe past -ad ob -âĿ¯ âĿ¯ -what doyou -theo dor -stitu te -sac s -k app -di mas -cos ford -carry on -book ends -ai mim -Í ľ -red sox -k mc -jun cture -inhal er -harro gate -afro beats -vin cere -subli mation -so ton -pe per -mid week -mi zer -medve dev -lombar do -fineart photography -col eridge -co i -chu b -cardi omyo -bro phy -balear ic -aster isk -ar und -alabamaf tbl -wrest lec -un loved -time ter -sav vy -ro sas -recy cles -r cc -mi speedway -mat aram -lund qvist -lo vie -fare awards -classi que -boo know -tr n -pu ddings -post o -magdal en -dav entry -carnival cruise -bureau crats -beforeand after -b dp -we tzel -spring field -mosco w -hepat itis -gre cia -game development -dro it -diversi fying -class room -ut an -up dat -s itters -port ada -ou bli -novo tel -nag ar -kw ang -krat om -croy don -ax on -à¸Ļ à¸Ļ -ye vents -wan aka -tion less -t sm -shab bos -refriger ated -ra ku -om f -mari en -lead right -kla as -k ering -jen kinson -inte x -gro te -galaxy note -delu sions -chu mp -toys rus -st pi -spell man -som atic -red und -mci ver -k pi -inqui res -icon ography -dro ck -astro loger -abc tv -u cir -su mer -retri eved -per vez -nik las -kar olin -infl at -hol l -hand guns -good beer -food festival -divin ation -dash cam -bbc doctorwho -b caa -łĪ ìĿ´ -ì¤ ij -tri pel -sizz ler -ro op -q na -m gh -lindsey graham -limo ges -j anna -goo oooo -ghe ads -curi ously -cl á -cantal oupe -brook haven -blin der -barri os -yas sss -ws room -winter fell -v cf -su spiri -st end -ro omy -r aro -marchfor science -har dracing -fc p -fat wa -end zone -dol lop -ru dra -rio ting -poul ter -poche tte -on ds -o ge -lu igi -impro v -g bf -del as -can tik -all you -wasee mb -sno hom -poster ity -pash mina -nb avote -mg k -de shaun -clark gregg -cav ing -ั à¹ī -ਠ° -ug m -mil os -live sport -ho vers -gam blers -four th -form en -fire up -far ing -execu tes -dumb bell -su cht -sny der -sle d -scorpi on -rie gel -fe asts -f dp -di b -conne ctor -cb doil -ar gon -â̦ ) -u ft -ss ou -re trace -ms b -lone star -kin shasa -jam balaya -fan z -cyber ne -seneg alese -ne ther -mid ori -law enforcement -jawahar lal -harper collins -burning man -at itis -adol phe -æ ĭ -wheel barrow -tan ah -si ff -saw mill -rose bowl -own er -nt l -nathan sykes -morten sen -kan sai -kajal aggarwal -he user -es auce -cet ace -༠ĭ -welcome back -tin c -superel mo -repri eve -prokof iev -pis mo -go vic -en j -corri ere -bel ushi -ali za -ur ya -tb g -se va -nd l -jaf ri -ghost face -fino alla -de war -colli des -au sten -ãĢ ľ -ton ey -though toftheday -ta kara -sher ingham -shakti arora -pal ak -mut ant -mk r -lo ony -kno tt -in cest -gul u -cri ssc -central parknyc -c ca -bar bs -x ander -supp s -sky y -samsung mobile -nail polish -mak toum -le da -lar der -four nier -dicho tomy -bigre d -as un -ale sso -t dim -suz hou -song stress -pla sm -mind sets -keer thy -ju k -i in -che sts -anivers ario -after shave -teacher life -star fire -shi vani -peck ers -pancreatic cancer -kana wha -inst inc -htc vive -bulldo zer -bliss fully -angel o -ÙĪ ÙĦ -Ë ļ -ze es -time frame -she etz -ser o -sent ral -pt g -nc is -nak o -lo pez -hive works -hany u -f pa -enab lement -electr ically -cam ilo -caled on -ade yemi -team love -revolution ise -mach ined -fili pp -fate go -d hu -chri sp -bon afi -b sw -tus ks -refresh ingly -muhar ram -high roller -fre eland -dat as -cru ella -twee dy -see b -per k -merit orious -lu do -l wc -in dc -ic hoo -hare wood -bur rowing -bur ris -back waters -al don -sun devil -sne st -ph es -part i -ka ha -eng l -con cu -bed azz -ðŁĴħ ðŁı¼ -tin ts -t mg -shan tae -nighthaw ks -ni es -miraculous ladybug -ming us -ma kings -lhh atl -joy news -i ums -bystand ers -!!! ] -âļ½ âļ½ -wo g -vive k -tr attor -to bler -simpli fies -sc er -new z -lam my -jay ne -ham my -hair less -gra u -gat uck -fri ghtful -e au -delinqu ent -chech nya -ari sen -ali ons -! âĿ¤ï¸ı -ઠ¾ -ਠ¿ -ve get -town sh -te entit -tc as -soo k -sl acking -roman tics -rock steady -orange ville -neural networks -motor show -maya wati -ma hia -lu sit -isi ah -er ken -ch allah -a one -Ð ³ -ö ster -u aw -the matte -si go -ro bust -mo hali -mi staking -maje ed -le sion -jc penney -fung icide -dy k -comic bookday -boba fett -row d -potenti als -post punk -jig s -inf lows -inf ar -en vis -ds r -der py -big ten -vast u -signi fy -puer ta -poo le -lindi s -lim itation -i sps -dor is -co satu -chromo somes -boo the -al arm -ðŁĮ Į -weare uk -vare la -sun glass -sec def -savethe bees -s love -per missions -mi zor -macro photography -girl friend -emmanu elle -des don -cl m -chesa peake -cal is -bo ps -ðŁ¤ ľ -v st -no vices -me son -love our -itten den -it r -ir oned -clu ster -char i -cap sized -ave tt -asy lum -arrang es -ab angan -zi er -yo d -u sos -te el -sne ek -ru der -ori el -mcne ese -kill the -kid ston -jam my -inexplic able -ho th -griffi th -galax ie -death stroke -but i -ðŁĺį ðŁĺİ -wick er -thi essen -san gha -puni shable -pre ma -me u -interpre ts -ida h -harsh vardhan -gen naro -ff p -exhau stive -e ke -cha hal -catacom bs -amaal mallik -Ù Ĥ -ut r -ul in -tab lo -south paw -sor or -road blocks -ren zi -pre term -lead generation -he dy -gun shots -feyn man -e phraim -de grade -d ama -b cc -am und -af in -ðŁĴª # -ðŁİħ ðŁı» -yand r -tari q -stre it -store ys -sky blue -o connor -naz ism -moun i -macar oon -i bex -gen ces -gee tha -free press -dayo ff -cle at -bad awi -an ko -ðŁļ Ĵ -âĢ ı@ -tornad os -stra sburg -post ale -om ers -nim bus -murri eta -il yn -hou ser -equ ate -eclip sed -dis liked -aleksand ar -al oo -aku fo -âĦ ĥ -ty ron -t with -sport sday -ml w -is l -in experienced -hom ily -ex xx -depri ve -deon tay -can ter -bin di -arab iya -adap tion -tu belight -lo ong -le ith -ku wtk -ke ta -ka izen -fro ch -el ish -el if -dun ya -diec ast -communic ates -black outs -armen ians -åĭ Ŀ -á ķ -ri ke -park land -ou tri -new bridge -national donutday -hender sonville -hailee steinfeld -d antes -co ffman -z ano -t lp -summari ze -sud hir -sole dad -rami fications -pee te -otak on -ng ss -loop holes -le der -insomni ac -h pu -gag ne -dhe er -const ables -boom studios -block age -bas sey -as ad -al ittle -ac le -رÙĪ Ø¨ -whi pp -tweet master -tg it -re manded -moff itt -ky an -kno wh -kidnapp ers -ki di -ji won -in abudhabi -drive time -cic ada -chitt agong -challenge cup -soul less -pos i -morning star -manny pacquiao -fre eride -cap tor -bro se -bak ker -alli um -yy y -xen ia -we iland -vad achen -se dent -luxury realestate -lac er -kanganaran aut -ire x -hager stown -format ted -fashioni stas -ec f -dema go -clone wars -cha day -book reviews -ay eee -at trition -asu per -am d -actor leeminho -abp newstv -ãĢ ĭ -wr p -su al -stead y -shim on -re gener -photo sof -n tsc -martin sville -k vb -haw key -fish bowl -fil thy -din ge -dar on -cher on -barn acle -archan a -ut ilit -us abasketball -shack le -ol itics -mel endez -lat h -graph ically -geor gin -dv b -dig itali -cô te -cover dale -che quer -assimil ation -under appreciated -todd ler -qu arti -pig lets -p ounded -mom entary -int eli -ent um -dal glish -chop ard -aqu at -al lam -ra scal -ole mis -mat era -late show -heff ernan -ex ols -en emy -com stock -ze gna -wel la -viol ins -t ti -studeb aker -scotti a -pash tun -on wisconsin -nca as -n lin -mis anthro -lul z -deco der -con lon -cau sa -ay s -anaesthe sia -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ı -vine yard -on it -ko ep -ho echlin -heart land -haw thorn -free mason -blood lines -bbc f -a ot -! âłĢ -ye bo -ple ader -ne ssi -matt j -ke fal -door s -cylind rical -crumb led -conve ctive -bruck ner -waseemb adami -vici ously -tu bbs -treat able -slide share -shop lifting -port landia -nor cross -mix ology -leap frog -inte stines -hw dsb -harness racing -ha igh -glo bin -ge au -flori dians -eli quid -dread locks -collap sible -west co -sang at -rooi bos -mobile apps -her vey -feature friday -et us -cor relates -biz kit -ank let -ta ff -stick er -sof la -r tf -proc ter -photom ode -ou ge -me sa -mal acca -lar ks -kot lin -ki hyun -inaugur ating -godre j -car le -cal o -black listed -? ", -âĶ Ī -trouble maker -tol le -spot lighting -s gr -rep sol -rangas thal -pan demonium -fr é -forti fication -custo dians -capu chin -alab aster -w ound -un sere -sal tire -now ruz -n tsb -move on -mahi rakhan -head start -distin ctions -annex ation -ðŁĴĿ ðŁĴĿ -yas ser -westham utd -th ong -sab road -ro ld -po bl -oc p -loun ges -l fp -go ffs -franco phone -devo tions -d ni -alex i -tur ous -taj mahal -se ad -ram ach -neo classical -l anny -hal p -ðŁļ £ -superst itious -show y -relay forlife -pi sto -part ite -no dding -it n -gra smere -for zam -fire emblem -ethno graphic -die hl -der i -dat i -cam bma -br anca -apo li -structure fire -spark ling -n sta -kosci us -joo st -horizon zero -gun nar -der ives -dc ps -cre mat -choc ta -cay uga -ble mish -bi olumin -bar co -al ky -a health -u aa -sub mariner -quot able -ponder osa -nan omat -meen akshi -jojo ba -im als -gu ia -dig is -der ich -corti sol -coach j -bra gs -benef itted -ðŁĩµðŁĩ ¸ -ðŁ¥ ij -wol fie -tn es -quick en -lov u -jam m -it sin -fe es -because of -ðŁİī # -sa ket -oli a -ke ds -happy diwali -ful fills -ent omo -cle xa -anc ity -alon ga -! ;) -william shatner -sunday supper -sun ita -sh anna -rep in -mar l -madd i -kis sy -ke mal -k fan -jak ub -hoff enheim -ha ko -fron tera -danden ong -cooper tire -cau tiously -bon gs -b him -angr ily -aldu bi -z p -snu ggly -sas kia -preci ous -prakash javdekar -infin iti -in roads -cur bs -cat i -bu stin -black women -ben j -ballo oning -bali k -ðŁļ ĵ -thin blueline -ther yan -the justice -shipy ards -li bros -j ase -gre tna -fi ba -che khov -avl news -une sco -tr g -ro dol -ri ppin -pit to -pad lock -no tan -nic he -ink ling -haver hill -cro hn -chicago tribune -back flip -ty p -thursday thought -social good -re ise -pw g -nor r -nepal earthquake -min y -metho d -living wage -jon gup -duke of -cub ism -b ough -âľĬ ðŁı¿ -âĥ£ . -youn gs -yaz oo -whi sper -tre cords -su erte -me tax -long list -kub ica -indv nz -ey y -cla ren -bread crumbs -zig gy -yu suke -win king -tt rell -pa pel -m sps -gb ps -wag on -ut p -thel ondon -tang ent -standard news -south beach -sece ssion -fri c -felici dad -ev alley -en bridge -cour sera -chro m -canni balism -burn ham -bill i -beau champ -accent ure -ðŁIJ Ī -u mesh -to vey -smile day -pass the -lar i -jas mine -hodg kin -gaf fe -forest service -f mc -enth used -dis advantages -cur ren -bl ended -ë © -¿ ? -univers es -tweetab ond -tau po -s las -pan ahon -occu piers -il len -ec y -dro ppings -boo yah -bar as -ba cha -af r -ภ³ -wi u -prece dence -o gier -nca aw -manohar parrikar -mac aque -io a -gh man -france sc -burj khalifa -bog dan -av ala -trans for -sto go -pon to -n sn -ch achi -catholic twitter -yy t -un environment -sof ar -pen ance -mole station -massi f -line ker -kcam exico -buil der -bak ken -apic ture -si res -sav oy -relin qui -mu ñ -mag con -k her -i aa -fo ther -fam a -editori als -chel sey -âĿĹ âĿĹ -z inn -w ud -sel fre -schau mburg -lo carno -dar cy -co star -austr o -âĿ ® -Å ¡ -wa ha -to end -sus annah -stag nation -shi vering -sau mya -ra gin -paul wesley -maldivi an -combin ator -aven ue -) ~ -âĺķï¸ı âĺķï¸ı -whitec ol -well come -tra iled -ste pup -smar kets -savo ie -ren ard -rabb itohs -prefe rential -panas onic -new forest -ka den -fu en -fix e -far ber -ba ig -an jan -zu kic -uni watch -under cut -sul tana -retri evers -ramad an -pi xiv -ob b -jun ctions -hall oran -endor ser -decl an -cu c -cardi ac -be ath -ba al -assi dy -as pires -adver sely -wee kes -un l -training camp -thene w -ter med -rec itation -pu cker -ome gle -ki drau -ho cus -gru ff -electr ical -doctr ination -cra bby -cosme tology -ce spedes -carni vores -br yo -blit zer -be hr -b nc -am bo -actu ator -ther aces -state bound -star ts -dil ated -burn in -bir b -you saf -social impact -re gaining -n ku -holy week -h mc -crack in -clich é -ato ire -wine and -ufcfight pass -sal va -pen den -maryam rajavi -jay e -hide ki -ar nett -ì¹ ´ -âĿ® âĿ® -xxxx xxxx -tomor ow -to yo -sun mi -pur sues -mini figure -hu ez -clu bb -beingh uman -aqu ila -ab ah -" -@ -y tfc -triple t -sun belt -stan dee -shaw na -rece ding -p sh -master minds -llewell yn -im post -geograph ically -youn ger -wer k -perplex ed -ju z -ima d -hep tathlon -hay man -eye sore -du hamel -brock lesnar -ॠ¤ -o scopy -mor in -lour d -hil lel -flo re -ero berts -doge coin -board game -am ond -ðŁĺį ðŁĺ© -scru m -ly ke -ju illi -ji yeon -griss om -fou ling -fo addo -fidel is -ero ded -en so -e wr -down sizing -aie sec -twi x -the final -pla sti -nit o -national selfieday -malay sians -li re -lepi dop -ess o -dab bing -complic ity -bre merton -ÙĪØ± Ø© -zay ns -wau sau -stim es -slou ch -pis gah -pf ft -n ans -medalli sts -kar ol -en sburg -da aa -arch daily -alpha retta -upheav al -pp hoto -pan ig -fla ir -eras er -emper or -bla dder -bir t -! ", -âĹ¾ ï¸ı -un met -reu ter -ran cid -pert wee -lin ds -kansas speedway -jodha akbar -jersey shore -heral ded -deple tion -cu taway -complic ation -cal trans -ant ar -un see -u tic -tw ar -sp en -ram say -nav an -j bs -hu mm -herman os -forever home -com prise -. ðŁijĮ -ãģ ¤ -win tour -ren tal -real paige -pin ching -pharao hs -or den -onthe go -newyears resolution -mend ler -k da -is ler -inde pendi -im iss -i eee -han ky -da emon -& # -ðŁĻĪ ðŁĻĪ -u gg -primor dial -nam mshow -mamac ita -ku i -k gf -emer ick -d ach -cm shehbaz -ðŁįĬ ðŁįĬ -vis ite -tun atuesday -shindeshil pas -one direction -his ar -hazel wood -haun tingly -h ley -gif fords -fo gg -ed le -bram hall -blac kest -anxi eties -yer ba -tem pran -sound ly -imperi alist -go les -ghaz al -disp el -coffe elover -vy bz -small pox -predictive analytics -ou tofthe -no kid -mr robot -gi udice -euph oric -ele gy -da sher -czecho slovakia -censor ing -burn snight -vic eroy -ukgif thour -ts am -snow mass -sa ar -robb in -rho d -mce voy -mc cauley -joy ann -i bar -for two -f cn -charlat ans -c ga -at onement -af oo -ad ine -ðŁĸ ¼ -ðŁĮ ł -video production -v kenya -v fl -ue ber -neutr als -nay ak -lili ana -la se -herb aceous -he en -chau vin -bit sy -ann ap -w aged -ven kat -tail ors -t shirt -spor ted -royal caribbean -pe tunia -myr na -in visi -af o -ab dsc -world wildlifeday -ti gress -th unders -h na -gon or -class y -aval dez -pois ons -par abolic -nba a -n ado -mcnab b -loc sin -hallucin o -gri gor -enter a -din ero -d icky -vis itt -ul ver -sk al -short wave -rae us -pleas anton -ou za -kre m -ith i -ipad pro -hi sham -fill ings -wh yy -vio gnier -u led -thir l -scu tt -m ck -kab a -k one -i shaq -home front -eclip ses -deau ville -caith ness -ber son -aviation photography -ðŁĸ¤ðŁĸ¤ ðŁĸ¤ -varad kar -shan kly -rev ell -re kindle -li sac -lazar o -g si -david duchovny -climate change -circul ate -can twell -can field -bir ra -Ùħ ÙĨ -john legere -j att -henri que -fro mb -concer ted -cic i -aller gens -za id -w ena -virgin trains -sp ina -oro zco -oak dale -lec tor -ir r -inquis itor -ine ff -how th -hof mann -gum mies -gilli ana -gel dof -final ising -christ church -Ù ¹ -y id -wal ken -tro ck -tr ong -tar d -sasha alexander -me che -latest news -gay atri -f mf -bi ffle -su ha -shore birds -ol do -lackaw anna -l grw -i ic -gw adar -cra ve -con ga -b pl -ar ao -æľ ¨ -vend ra -silve stre -row land -m power -ja vi -ec lair -compart ments -aaron carter -wh s -tol o -sy denham -sti pe -skarsg ard -ric kie -ric ans -pay al -outrage ously -inciner ator -iam joshuagarcia -hin dered -herr mann -gi ga -daw ns -cf da -bla zed -bene detto -ba sha -red heads -ko da -i ano -gh hh -fre ep -cu tty -acknowle dg -abre w -ðŁ¤¤ ðŁ¤¤ -âļłï¸ı âļłï¸ı -p ä -oc cit -l gg -l bd -kuwa iti -gb v -ap roud -******** ******** -ug lier -to know -swin burne -surg ically -myo ttawa -ke tamine -c mn -an amor -aci vil -ìĨĮëħ Ģ -trump ed -testic ular -spen der -singh a -ror schach -pad am -men i -le vinson -kron os -ko ta -hi stam -harb ha -ear ner -do dd -capital one -ap ne -ab es -wc s -ven ation -the dark -sp iller -richar dar -plac enta -me tv -lov ren -itt ing -in du -down syndrome -des mond -bukol asar -agn st -. âĢ¢ -uk ti -spe t -se ton -requ ited -olive t -hobb it -car is -bas ra -ban yana -ak ing -án chez -ya el -y eni -un faithful -tahirul qadri -stetho scope -santa fe -rot ations -nar whal -n berg -muse u -mc caw -ja official -infuri ating -hispanic heritagemonth -gir dle -daw ning -con anobrien -bri sto -black coffee -ðŁĽ į -ten sile -ss un -she edy -ili stic -gi on -c mb -bhattachar ya -b æ -am boy -ton do -tom oz -sel ba -per gola -okeecho bee -hou wx -he ya -ground sman -griev ous -co tab -arma an -app g -stop rush -se ach -russi agate -me gyn -in doctrination -he ee -handi work -gas sing -fred rick -enab lers -diabol ical -chicago history -bukolasar aki -uro pa -tun ney -steel er -on der -ly sm -ger wen -en tails -as says -ಠķ -Ùħ ÛĮ -vampi rediaries -se ig -ran ches -pa vements -over sees -mu ffler -medi ev -human sof -go yal -ear nest -decep tively -back packers -at lan -ww p -turn ing -st elling -sel atan -s you -pur y -masquer ading -luxu ries -har ington -gil d -findyou re -eve sham -esc row -ery kah -endeav ours -comfor ted -chant elle -ari ver -am ey -wit ted -stal ingrad -spill way -sli mbridge -shel ved -real isation -meer ut -green lantern -grat z -flat tery -ef ly -cy pru -count ing -bookmy show -at ini -al bi -âļ¾ï¸ı âļ¾ï¸ı -vi render -vari ety -sun da -quot ations -public speaking -office space -mi ffy -mad house -eun hae -el td -dro ss -buck ler -⼠µ -vi bes -up grade -u ga -rag time -par ro -knu st -ke ven -insul ating -ici on -gar ba -el ph -del t -ax s -vis conti -r tx -pos al -my heroacademia -mm in -groundhog day -cuer vo -childhood memories -cag ney -bear grylls -b awa -whatvegan seat -un wto -un officially -thibau t -the struggle -raj on -pho spho -jesuss aves -gur ud -fur tado -fligh tradar -es mol -el eni -bletch ley -an otte -ad ol -ãĥķãĤ¡ãĤ¤ãĥ³ãĥĢãĥ¼ è¶ĬãģĹãģ® -usp to -ten ured -por ch -oo ze -ne go -nbc newyork -mal ty -logger head -av il -âĸ ij -tw g -theod or -quesad illas -pit ted -mountain top -ml s -megap lane -ma sc -just listed -jo ana -geo science -fos goodwood -del o -conve yed -b ö -as ado -vibr ancy -sey fried -scott s -pam pl -nation wide -ma shaallah -log i -ko st -go z -gb k -foot note -dau m -bam bino -arcel or -adel ine -y j -u ppers -transc endent -thi stle -stran s -ri mmer -moon lighting -lie ch -inexplic ably -in motion -head quarter -guadel oupe -el um -dordog ne -diamond back -c td -ðŁijĬ ðŁı½ -with friends -spot light -splat form -so beys -shin obi -scu ffle -re sorting -peri pher -kak ar -is sy -hel ga -cmom aharashtra -bo logy -app legate -w os -sway ing -ma uk -hun ny -grand rapids -gee ky -fore caster -e ate -ys r -to si -she af -sec ts -repatri ation -real es -piyu sh -pi as -mexico gp -incon gru -dee side -custom ise -chi kan -ÙĤ رÙĪØ¨ -wil frid -wi sher -topi ary -south yorkshire -s ge -real tree -nd is -marilyn manson -m of -kas parov -geof frey -for ges -aw anda -west midlands -ti ppy -sit ar -sho al -shi zu -room ing -puzz le -mur illo -jes sup -hur tful -by un -bront ë -b wa -work manship -w nep -um ami -the apprentice -smoo ch -se hun -se ff -reve rent -pleas ance -mm k -her mine -al art -thevoice uk -psychop aths -or gul -mor peth -inger soll -hydro xy -hiphop tamizha -ge dy -cha pe -at rol -ย ย -wine day -wa o -u news -tiger shroff -som nath -ramm stein -pre neurs -peter pan -pan jang -national championship -man gal -for gery -dru ids -ðŁįĤ ðŁįģ -rl wc -pin ner -nan ce -guar dra -bridg water -bor de -black star -atta ining -ag ates -ðŁį ¨ -yau pdates -tru dy -tortoise shell -sch ell -meg aphone -joey logano -jin ki -induc es -go oners -gigab yte -gack t -escal ates -classic movies -wet land -tumb les -istan bul -i ic -fran tically -fore runner -esh war -childre nof -ba aghi -al ente -â̦ : -shab bat -ou ise -ic j -gi i -fav ela -cran ked -co iled -bul king -ap am -af ood -sir f -se to -pop culture -perpetu ally -li dia -la pp -kai ros -deaf ening -cr ate -cool more -conve ys -ðŁijĮ ðŁı¾ -vic hy -sm acks -letsgo pens -hu mong -her m -emma us -e and -cali per -ah hhhhhh -\( ^ -~ !! -yar ch -univer so -ste me -sp ader -pe pit -pe ct -night sky -gla dwell -florida keys -curb side -con joined -c ville -bb z -visit devon -sky net -sas so -sand ford -plu mes -impost or -homes forsale -hair dontcare -disru pts -cin elli -suppre ssing -speak up -seren di -phil bin -pdp nig -non leagu -ne ville -mtp spride -mar ci -len non -ld p -kam an -front line -ever ly -do cker -co vet -clo ser -ìĬ¤íĬ¸ë łĪìĿ´ -æ Ħ -win it -welove history -webcam s -w mp -ur bang -sw ood -stro wman -port ad -ot ts -obse ss -mic ra -ir repar -helen clar -campaign for -beck in -bar ros -al barn -ad vi -var vatos -ske eter -sit c -is z -hygien ist -en on -cro ke -crich ton -car nou -ag round -âĪ ĩ -wh izz -welove you -stour bridge -sentin els -regal o -official pdpnig -myn tra -gonawaz go -bu sker -bio economy -angle sey -.. & -+ / -z vezda -union strong -te man -sav o -polit as -pe tron -orig i -op ro -mit ty -hen nig -g aku -foren sic -far c -and an -tb n -speci ale -sm ite -siri ano -press ley -ox lade -kingscolleg elon -kau shik -holi est -fu sel -fre di -dalmati ans -bc b -bat woman -- ____ -vegas born -un supervised -ste le -m ft -k md -ho shi -go vols -four nette -chaun cey -annivers ary -srilan kan -mil ad -lac ombe -jake miller -gall a -ff r -ec to -cu bby -be cher -ri gg -kra ft -hin dr -ha tha -fundament alist -erat ops -dun yaupdates -cor niche -congre s -bumble bees -block party -absur dly -wh et -ve ta -un bridled -ulls water -tri star -str inging -mickeym ouse -ic ar -hope lessly -gu zzi -fire proof -dul ce -d co -common core -cis se -bol ted -a bet -zebra fish -t ze -t pm -swi ped -sean flanery -san ford -pas ay -network marketing -mitch el -mike shinoda -mediacell ppp -mach en -krispy kreme -key ston -k hon -humm els -grow thegame -camino desantiago -za z -peace maker -pay pig -le yofficial -iu cn -gri l -diony sus -dinner time -de ming -dc fcofficial -bi ba -amity ville -ðŁĺ¤ ðŁĺ¤ -ë° Ķ -watch tower -va v -tel eno -sto the -shi pping -rhe in -p ft -ma aa -m sci -itsal labout -h bc -fri sco -east lake -dark siders -croati a -char n -brah min -bol ing -sie h -sh allo -s ram -ney land -nature lover -mh saa -martinsville swy -m pi -ling ua -li za -inst one -ic up -hu x -emerging markets -bur d -amo tors -! ðŁijĮ -ðŁį ² -âļ½ï¸ı ðŁıĨ -âĺº âĻ¥ -tc s -taek ook -sh ina -q n -ple te -ni mb -ml k -mil by -li ma -kel ce -j ingles -groovy bruce -for aged -ct g -conspir ators -wind breaker -war lords -tol uca -lan o -joyann reid -il uv -hoku sai -getty museum -extermin ation -cro f -ball ina -ðŁķ ij -à¸Ńภ¢ -ofc trendsetter -mu star -illi st -christi esinc -cancer awareness -éŁ ³ -ภĤ -yuk on -w fu -vintage style -tel kom -pho tol -mi stresses -ll cool -ku an -i fly -espino za -duff erin -dono van -chil terns -cal train -bio grapher -ber nese -belie ber -aw ami -ann als -alber tans -zing is -wv wx -rat ch -mu ms -ku lit -kav a -inter view -i hl -emra an -d li -c ll -broad church -bl ks -aw wwwww -annot ations -vent i -ru bles -pl ondon -ol lo -mor avian -inter cess -intensi fying -gra vely -game week -flint stone -dis missing -dash boards -cr outons -belt line -ðŁĴªðŁı» ðŁĴªðŁı» -ðŁ§ Ģ -will ys -twitch affiliate -st nt -re mun -out weigh -noo ks -min dia -i led -home screen -furnitu re -be om -azerbai jani -alley way -? ] -ðŁĵ ķ -ta chy -shuttle worth -quit os -peri winkle -miti gated -lu mix -itv news -i ep -gaz pacho -gay i -en trusted -em me -cc n -caf f -bombar ded -bo chum -tul sa -p gr -mic ror -kur z -ku da -jacob i -insur rection -el ko -east london -ak ure -women artists -spin ning -park dale -n gi -lud wig -amar k -w pri -rashi da -pod caster -o ster -ku chen -it es -gh sa -follow us -defe cted -deci mated -comple anno -c qc -beach wear -aw ash -po ff -mitch am -mc clo -in cit -hol ic -ev ander -dy no -dur an -do co -co efficient -calgary stampede -big south -animal kingdom -æ ± -wy ch -te les -sud hir -stu ar -gw ang -g lynne -eu in -dav ila -bir i -agu as -ðŁİĪ ðŁİĪ -z adeh -to st -techno logists -sy th -suzi day -sk l -rein hard -mis soni -mat ely -hell er -fa jitas -eu ch -er go -cm j -bo hs -vape on -trace ability -tom holland -stac ie -sapp hires -sam phire -re ge -prin temps -nic hol -multiv it -mari el -lo tions -li ddle -it stime -indi as -gi rish -foreign policy -far ina -em bry -disc ord -aj style -tw ye -set te -physical therapy -je ze -fu ele -fat bike -ex hor -cap ra -b chs -re dox -picture books -me gaz -me gar -jo sep -gre ent -cre ating -ce v -b fi -adebay or -âĢ » -uw m -te g -t ni -ro es -res tha -re fra -pc w -oc n -mole cular -mi it -kirkle es -int x -gyp sies -gu da -gr anger -ger on -fle ur -fin kel -fe ely -evi an -end ran -cat lady -biar ritz -ban ky -youtu ber -yanew ade -tic ia -supre mes -ross lyn -pi pit -passi v -nc state -mr chuckd -mayor ship -mati sm -euchar istic -dw yanewade -d sc -cur mu -boy z -am ours -ac ms -yu rion -tricol our -sa al -ren aud -ramesh laus -photoo ftheweek -ol vi -occlu sion -moul ded -kour tney -illumin ations -ali garh -alas dair -ye yes -turn tables -sil ence -sharpen ed -re sp -patric io -pal omar -kre we -internation ale -emb ert -desmo ines -ar ap -amotor sport -abergaven ny -ðŁİ ¡ -townsh end -over doses -mile split -middle bury -less on -i pa -hat ter -george galloway -fla vin -disappo intments -conchit aw -cantab ria -blur ring -be ec -ast m -work able -ty sons -swing ers -in humans -dormit ory -dc ms -daryl dixon -da shi -burn um -ym iller -vill alo -ri bery -play room -m ander -jo a -digiti zing -dar ley -cloi sters -brad paisley -up enn -stay strong -re edy -macken zie -k stp -j inn -it g -instrument alist -buff ed -bl acc -abra hams -zu l -thisi scle -rear don -photo cards -per verted -ou ble -kh ati -k ly -is kcon -gha da -fr itz -fa ites -en etwork -east bay -dev con -d bt -country wide -columb a -clo the -alex ab -ิ à¹ī -wy then -vinay ak -sch ick -ru fu -making amur -go pi -ec kel -door mat -ca vie -aw ines -wan ath -vege tarian -van halen -sa wareness -rocket man -pan di -mom mas -lloren te -kavan augh -k ı -ic ro -de pts -conti gu -claudi us -ven u -su ki -scru pul -sap a -min ce -man to -gau lle -ba esy -ati mes -ap alach -an ana -ug x -save alife -nu ri -kre uk -honey dew -ha de -fre q -farra gut -famili arity -doo t -de cou -ba ils -ba ier -az har -and ri -uni form -th ylene -spokes woman -sp ate -shi on -presi dio -on key -ncaadi i -min woo -it yof -gal ette -fur nish -fe de -cedar point -brin dle -bigh it -accu mulator -........ ........ -âĿ¤ï¸ı ðŁĴķ -ver na -tri vikram -sel y -nik os -moff att -make sthe -j x -i spower -hen ce -elis se -da unt -cric info -back less -aj k -ab ner -ðŁĸ ĸ -us w -sei ya -pry dz -p mest -on us -mic honne -kap uso -jets go -jaf ar -hen don -goo domens -em its -egre gious -conchitaw urst -bird guides -ber to -aur i -ajstyle sorg -vo tto -spr out -seri e -re finance -protectour care -omo hoy -ne os -national poetrymonth -min strel -min eo -lighting design -kin caid -foo dis -far b -div as -davidbowie real -d wc -confu ses -ala unch -ðŁĮŁðŁĮŁ ðŁĮŁðŁĮŁðŁĮŁ -ëĿ ¼ -å Ŀ -w aker -ri xton -philli ppe -o au -kan ka -do cher -them out -sm it -seaco ast -scott morrison -ro magna -mc part -life savers -l bw -hu me -er v -ding dong -con us -cha at -ad al -aco yotes -ðŁĺĬ ðŁİī -áµ Ĺ -tour ny -sp ic -secon dly -samu rai -po te -per ovsk -parkrun uk -paralym pic -idri selba -ha pi -gra v -gr rl -fawad khan -dj snake -chil ife -capt cha -vol voo -t ci -sab ri -pul ver -onlined ating -newarri vals -melis sab -j ala -domest ically -devon life -aper ol -amare tto -ad olph -ðŁİ « -ìĿ ¼ -wake boarding -multi plying -moffe tt -mais y -jo z -in hab -germin ation -di dit -cre pu -ad ella -ðŁıĥ ðŁıĥ -wen sley -twel ve -spur red -spoo ks -spear mint -snow mageddon -selec tors -sc ms -par si -new listing -large mouth -kak ashi -cab elas -bry ony -ba as -ash ken -apriv acy -ðŁĺģ # -ðŁij» ðŁij» -war si -ru te -mapp le -foot paths -elan tra -cc cc -bluejacket snhl -ãĤ ± -treati se -stret chy -re pro -o din -it sk -ino y -hal ei -gy e -fronten ac -captiv ate -ax o -amy jackson -a pre -ðŁĺĢ # -zoo ey -w faa -then et -squ awk -schu le -s warming -plan tains -official livepd -kam u -hom et -hel pin -har de -g sb -chas in -tu ts -philosophi es -osc ale -orchi d -oceano graphy -mod ding -l sh -firstre spon -educ ate -demo ted -comp ad -co gs -âĨ ĵ -wolf pack -wen del -w gs -tooth brushes -th ame -ra hat -pet ter -pad ova -mel ly -mar aming -ma sen -ky lee -invest iture -how es -hol st -blockcha intechnology -z app -star wood -san born -sam osa -muh lenberg -mc ve -loop y -ir ty -hyper x -fri el -cr ony -bo bi -best ofthe -ber o -bee feat -ano che -wil w -ta pering -self defense -le vis -ivo ire -iti ba -edinburgh uni -camber ley -boo ster -as soc -alta f -adaf ruit -ðŁĮ ½ -ye ssi -ver ma -san dia -refrac tory -re organization -ph ul -pe ti -me izu -hat ec -gc ses -gam ous -ai za -tw ick -ti ki -star boy -sign or -sh pk -practic ality -om me -mail chimp -ma bry -ju ssi -ju a -ho ke -extru sion -dirt bag -chin os -ìĬ¤íĬ¸ëłĪìĿ´ íĤ¤ì¦Ī -su fficiency -slat tery -saving lives -ri ss -pro bin -new bery -iz ind -it p -hb r -daz n -bio sciences -ber line -ahu ja -w yo -um f -tx ed -otta waf -or land -napole onic -moly neux -main event -lax man -kut ty -ic hung -husq varna -huawe i -ferrari friday -ak syon -. ): -tru sses -scottmorrison mp -repe aling -r dy -pizz agate -phil at -malach ite -l q -ju ss -den se -car path -ðŁĩ ¾ -wr f -who scored -volgo grad -visit greece -vi el -v cc -tagsfor likes -shi fty -rotor ua -opportun e -naq vi -na eem -mo stre -le mu -hill ingdon -cup boards -bon ed -absen tia -ห à¸Ļ -tri pe -te th -schoice awards -ranveer singh -ilford photo -hl mann -deep sea -ber us -b ta -aku mar -âĺ Ħ -t pl -studio life -stimul i -sec pompeo -repur posing -re strain -organ ises -op l -midcentury modern -forza horizon -co cos -bik elife -beckin sale -ar aki -Ñ Į -wany ama -w chs -vi ens -tribul ations -rip ening -pro grama -photo challenge -l era -embry onic -de yes -t th -spread love -snu ff -sand bar -sac a -s ánchez -ri mini -ph ants -juic er -for sberg -eh ren -chocolate day -c to -b anna -aust ell -ar mand -ðŁIJ ī -ze i -ur als -ob f -barnsley fc -a hou -wind ward -su sie -sketch books -regi o -pha l -par an -ign iting -gri a -cb m -bc w -al thea -âĩ ¢ -safe co -rand stad -pra dio -makeup by -howit zer -foo sball -fe eh -design showcase -cla rence -avi an -ani dhi -welcome home -ush l -recomm s -parv ati -n pf -lindseygraham sc -glen non -gain z -domen ica -dis agreements -dar row -c ff -au chi -type script -the alth -ste rer -ss ens -sine ma -re treating -plin th -ic l -hen do -den euve -colour pop -ch t -burger day -bor rows -ano v -ad age -the white -str ano -realjames woods -onlyin mn -modernis ation -mast ectomy -late ch -khu malo -horizonzero dawn -g ak -fu ja -flo cked -fier cest -ex pat -etsy chaching -coon hound -cal endu -ban ting -ðŁİ £ -treason ous -ten ancy -statist ician -occup ational -nun ca -lau da -gram ercy -flu ttering -ble vins -acidi fication -ðŁĺĤðŁĺĤ ðŁĺŃ -west mid -w inging -uk parliament -sc tr -mach akos -go jetsgo -early years -eagle pride -da fuq -cot te -cospla yed -carol la -cap y -bo leh -aa rena -wi dens -thor ragnarok -pa jh -n ellis -g tf -ìŬ ìŀIJ -ro ddick -lev ant -ky rie -emb er -c gs -amae chi -wh cd -soo ty -sni ffer -sl c -seem ing -madri d -it ating -is lav -girls with -electr icians -do ings -dal en -d gy -cu ss -con fer -busc emi -brat wurst -an sar -abstractexpre ssionism -a india -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -ul li -tele vision -sol on -pri ming -persi b -pap ryka -ol ac -o bie -n ade -multic olored -im mune -hu x -holy head -hen k -fel led -diam ante -cla udine -char l -but z -( â̦ -yurion ice -vel as -uk r -the beast -sy ah -st ourism -so co -snohom ish -sin o -siddhar tha -rho dium -ren n -red shift -na ise -mutil ated -khale esi -ka abil -j aded -hen chman -ga st -discern ment -court ne -big green -bi plane -be ano -anti po -tu lisa -sion ary -re written -oy u -ll oris -kra sinski -jan ice -franc s -familiesbelong together -cricket aus -co si -bu sey -ade m -tal o -show girls -sen ess -pad hyay -op el -moss berg -man zo -interior decor -f les -day y -cu e -ber ia -ठ§ -tou chy -tennes sean -mac lachlan -fa inting -den omination -ci encia -ca poe -all caps -al ade -è Ī -ठ· -the tford -so bel -radio thon -postp ones -ine urope -harve sts -edin burg -dexter ity -dar rin -bho j -til ley -th ore -roman cing -realpaige wwe -r atti -proble ms -nor se -kre wella -ja ket -ir cus -half penny -chit o -bun ton -bu u -boun ty -y rs -ste u -ro ald -resto cking -qld votes -ou i -nay arivera -labou rer -is ak -i bo -coc ina -aer on -ad show -sur rendering -len nox -hindu stani -gop taxscam -car itas -byr ne -bo gle -always learning -æ¥ ½ -titan up -starmagic ball -sna res -multnom ah -lap u -interce ssion -her barium -greg son -furi ously -fly wheel -eck ler -del tag -d aco -break outs -alaska air -îIJ ĺ -âļ¡ âļ¡ -zam boni -suit cases -stri pe -roto world -no bility -inf ill -dynam ically -ch é -band aid -angel i -a org -sheh zad -s office -pu pa -ph or -pajh wok -pag er -natu red -mis used -iam ejf -hast ing -e chop -dever akonda -daniel ricciardo -cr one -coet zee -ar ms -ar as -ðŁĺİ ðŁijĮ -ë¦ ° -æĸ ¹ -ั à¹Ī -wonder fu -why not -ta re -su mit -slo an -sa shes -perin atal -man ek -guer lain -gar man -egyp tology -do ghouse -appar ition -ac cre -uten a -umm er -skim ming -ri re -nf pa -ne tapp -mi sta -mang aniello -don nell -cit adel -axl rose -ad obo -acrobat ics -aci os -ðŁĶ ¬ -uk ong -tro yer -thi one -t ase -s fashion -par ikh -mono graph -ja ish -hor ford -h qs -foot sc -col ini -ðŁ§ ĺ -ure a -stol tenberg -ma an -index ed -hydro ly -hin kley -adel rio -ab solution -Ø « -til burg -sa ppy -replic ated -ree bok -pat erno -nand am -i pe -home base -coun tr -cbee bies -boot le -uof sc -seduc ed -scan lon -priorit ise -pc n -or ks -occupy hk -nan ay -mil o -mao ist -genoci dal -ex tractor -con lan -bro k -av ir -app an -war ra -stri x -sedi mentary -real ty -ps w -paris jetaime -m can -li um -li aquat -jo shi -inquirer dotnet -ha gen -este fan -coinci dental -bett is -ðŁħ ° -winter ishere -re unions -nu ss -mix tures -mir amichi -la pi -ko pe -kir chner -kel i -emur phy -de tti -d q -confe ssion -ç ģ -âĿ¤ï¸ı ðŁĻı -w de -u stream -swamp y -sub missive -sleep wear -out back -on ond -in corporation -fan friday -desch utes -cush man -cour tenay -blon don -ÙģÙĦسط ÙĬÙĨ -st george -sp ag -sic le -sh ins -resul t -ka ik -j ms -get cha -fo lie -depo k -cri p -bit stamp -azz am -an bar -ãĢ ° -u pm -ph thal -over tones -game show -es r -duf fie -cas sad -si ssi -scru bbed -ron n -ren n -path os -mur mur -kul deep -gril led -gal o -ez ra -ext end -dav an -cl f -beha r -avant garde -am far -ach ill -volvo car -visit florida -sea ford -prote stor -pl dt -gir ling -fc d -bi zzy -ash benzo -aquap onics -wh alley -vet ted -te ment -tal ks -super drug -sun coast -sav elives -sam y -pro duk -lec tronics -je suit -ii hf -gan sett -dat aprivacy -circu mc -c ch -be o -bay ley -ak ot -twi sty -ton ians -skir ting -s golf -phil pott -k mh -in world -go or -du s -devon port -d ago -community engagement -ac ta -w wed -scot parl -sc ut -s bt -richardar mitage -o den -nol l -jan mash -hy an -green houses -goo p -excruci ating -dur i -das ilva -d ich -c pr -algebra ic -war am -th ins -sho ddy -sad der -plum lee -pay wall -od our -mp ton -kic au -kan sen -jubi lee -exce ssively -euro fighter -dri ps -diage o -daf t -cat alan -cam girl -ðĿ ļ -ra kim -ot ay -mob ster -leg lass -kp is -en el -crush wednesday -chakra var -ar ranger -xtre me -sali ent -kar lo -her manus -chlor ophy -bang sie -un affected -plein air -pink ish -p yl -n cle -head lamp -hay worth -fun a -fore urope -floun der -cork gaa -compress ors -an anya -yoo chun -u shistory -strike force -ste ine -social security -re makes -pim ping -nau ght -moh sin -mem bered -le yes -ihs net -d ner -clu mp -âĸ ½ -z sl -si red -krp kab -capital reports -bu ries -angry birds -twin ned -roy er -pu reb -pand ering -ne gi -men tees -joh ny -gru bby -b ine -vie wings -vel asco -tec no -sk is -pun ny -primary care -po key -par lay -llangol len -ju ghead -graphic designer -fashion friday -endocrino logy -b way -aldubx dtby -thought fully -soft ening -my ard -judge me -h unch -g ss -g sm -carmarthen shire -vol k -sp atula -sin dh -shan mu -kn are -ip d -har penden -h up -fab ul -encom passing -ann amari -with held -vin t -to ty -si den -ren se -regi me -pv sindhu -middle school -mel ine -mau er -lu thier -kk ar -justi fying -int an -ill iteracy -her ty -gil len -geek and -electro de -dry ness -can ons -bar ca -arab ella -up for -tre mble -thematte spinosa -social enterprise -scoo p -re to -ran es -pu tts -projectrun way -pp h -lar ue -jar re -homo gene -geo logic -faj ita -don do -den nison -demetri us -beth nal -a hahahah -t fclive -s iti -roe buck -pen ni -pal tz -ol af -kat zen -home office -expan sions -eat aly -can te -boyband ph -ap titude -ambu latory -wa pp -t mom -saddle back -re focus -ngo zi -mb ach -mah mud -loaf er -iam dj -ga etz -d wn -clash royale -be resford -an keny -agi ikay -à¸Ħภ£ -wack en -ther ide -sher win -rule of -ren u -pre pare -naf isa -mix on -ke sari -girls rock -classi fying -bri e -boo ker -blo x -star gate -sor rell -sop e -sam hain -rocke f -nozom i -likel y -inter locking -grace ffa -gq magazine -du bbo -die ppe -coinde sk -broad stairs -ano a -anaco stia -al au -temper a -sque al -selfle ssly -rivier amaya -rhe um -molon labe -lin i -ko st -incu rable -fe ige -ca water -ber is -barre ra -wol l -ta reen -ome thing -humong ous -ha ut -g wa -eu k -e pa -confidenti ality -be az -ðŁĺį ðŁIJ¶ -ðŁIJ ® -x lp -sm dh -ju pp -hierarch ical -f sr -ev a -eng g -disinfe ct -dis arm -bot ton -bab ble -ðŁİ º -word less -virtual photography -twin kling -tennes se -sch wal -sam p -rece ssed -ou b -lec tion -j id -ha up -co ho -carlosp ena -swachhb harat -stip end -salesp erson -rb g -prow se -occup ant -medi ate -fix ers -cu ore -ar fa -ðŁĻı ðŁĻĮ -à ª -tori kelly -si fication -nu e -neuro scientist -live wire -lin dale -lan vin -jeremi h -herkim er -cutt ing -cho k -cab ral -bil ic -big timer -âĻ¥ .âĻ¥ -volvoo cean -sten o -neha kakkar -hoo da -for o -disney springs -dam per -chap lain -cal zone -brad man -alyss avaldez -whir ling -wh ack -wall flower -wake board -un turned -stab ler -sp dc -par am -pad man -odd ities -l cl -imti az -g mr -eugen io -di feren -c ella -aeri als -young life -see in -pran ab -laksh mi -kent uc -john mayer -free download -fod map -top golf -tomoda chilife -to ole -siste ma -n ny -mcgin nis -kru mah -ishi i -hyung won -geri atrics -f fa -cl erics -aqu a -worklife balance -w bir -the saurus -sibl ingday -ru mbles -ridd ler -pro let -ow t -mc q -ma dar -lo isa -gue te -ds max -dir tiest -di stru -coni fer -cen tering -prote ge -nat alya -kur di -ho ka -gan pati -feeh ily -cad ero -ag ric -⬠Ĩ -wor sens -war rick -the k -south end -s yed -plo rer -p ili -n é -im ura -hen sel -fili buster -city walk -brexit shambles -ba ked -amic us -wild land -wag en -thad deus -sh atters -lu po -kar u -ig al -hutch ins -har ie -bra wl -bay liss -baske tb -ðŁĺ¥ ðŁĺ¥ -westin ghouse -un knowns -timo th -pi sts -man gos -mal di -kasauti izind -ite ja -interior designer -hor ry -dro mo -ch all -cavie zel -[â̦ ] -viro logy -spice jet -software development -se uss -school girls -mac an -l bp -koval ev -hitch hiker -fi brill -face app -dra sh -circum ference -annot ation -wow za -super annu -snow mob -si sco -pel opon -lor ries -gar neau -chicag omed -c mx -brasil ia -an ok -al fa -( ^ -thro p -shr ink -man si -l las -kitchen design -is lington -install ments -gab a -dele tion -twee ts -ran jit -post gre -ny j -monte go -lipo suction -kut z -ha que -gir lon -ba illy -arre tt -agre eable -ðŁIJ ½ -wrist let -vadi m -tat ar -sibir sk -l boro -hoo ah -ho wrah -ey o -bi ere -b do -al ev -vo ight -mete ors -lymph atic -live well -li shes -kr ill -i barra -greet ing -en ric -eldo ret -bren den -angel ico -afore mentioned -èģ´ ãģĦ -we ald -un isa -sta dia -o cha -n iner -mait re -i ki -cur bing -chri scor -bo gnor -bird ing -baton rouge -allo a -t ka -shoo p -reser ve -par tie -opportuni stic -ma scher -ka di -ep il -conce des -b hn -wo ks -t lr -t dd -shul tz -ne vin -lou ie -hyde park -hero d -az am -al q -â¬ĩ â¬ĩ -web developer -uc sf -te dge -suppor tyour -rastaf ari -lin ic -is ai -ic ri -hege mony -beow ulf -artic ulation -ap ir -see k -sap lings -muja hi -mid del -ku do -inter sex -high tech -af am -# - -yearin review -qui ver -post grad -pho today -ni vers -my baby -mi ed -meche len -ky ush -inclu siveness -gn ss -dv t -dastar dly -dal key -clo th -chi evo -awe e -tre llo -ti reland -pupp et -metro s -j hun -horizon te -gom be -gastro pub -gari baldi -fon dness -e ley -do tch -dart moor -cott rell -axi os -asi e -Ø§Ø ± -youtube gaming -wash wizards -t andy -sumer ian -ser b -secrets anta -pedal board -mizor am -li days -draken sberg -dic kies -courte ous -car mack -bor on -af k -êµ ¬ -wilde beest -victor inox -shan nen -seun ghoon -py rex -proje kt -pri x -moccas in -kuz ma -floren tino -bachelore tte -wan k -ve sh -ug ar -s network -my new -mari u -manu ela -k nut -jo ão -indv saus -il ham -hal ford -goode ats -dg r -bun ker -blues kies -amas sa -ðŁı į -wh urst -smar tly -sh rap -seaw all -school boy -or ator -not d -ma ac -live music -in yo -howar du -dor sett -audio logy -ðŁĶ« ðŁĶ« -vote kathryn -vol ga -sta shed -serendi pit -se led -p cd -lam y -ko dal -glo b -cm f -chrysanthe mum -chocol at -black box -spo iler -sof itel -smo ck -pla st -pa this -obstruc tive -krist of -histo logy -h ird -flu i -feather stone -ch aya -box x -toys for -robe son -postcard sto -n gin -merri man -kh oury -exist enti -bo les -be b -bb qs -ìľ ł -twitter support -sw asan -sh ura -raven claw -jp nadda -findyoure pic -d out -cutt lefish -ye shiva -r giii -parliament arian -o gg -modi in -marath a -hoo ping -do gra -d ard -char dy -cal on -ap ati -ak ennedy -we f -soc keye -shane filan -sedent ary -san aya -ri gi -re produced -r ought -orthodon tist -ner dv -en raged -do young -calu met -bor rego -boo gie -aa as -zom ba -world tour -under belly -un ob -tom m -mal tings -hr d -ex ple -cu le -cis d -chi bok -chan son -business news -brune ttes -bluff ton -aqui fer -range finder -makingamur derer -ma go -gran ular -don n -cressi da -cr ans -capac itors -c dr -arizon acoyotes -ve es -ta ko -su pa -slope style -seat belts -pron oun -men thol -knigh thood -key ed -ji ffy -issa quah -ide o -ende ar -chop e -bo red -an at -z any -uss sa -se mple -rider ship -mariecla ire -kra v -drys dale -deb i -congre so -c cu -ðŁ¥ Ĺ -ç¥ ĸ -worm hole -teen agec -standardi zation -perse phone -perfect game -ough s -l pool -hahahaha hahahahaha -gw ali -do dged -cru tch -co ped -clo gging -be ver -band mates -ven to -ti fo -rd x -pavili ons -nip sey -is las -il frac -han sol -grisw old -emanu ele -devo e -bull ring -at ala -ãĥ¼ãĥ ³ -win ecountry -stal warts -not ations -macin tyre -job fair -je sper -in ne -holm firth -hoi sting -geh lot -gagar in -fla red -bou logne -aw o -agas si -afran klin -xox ox -wn l -waw ine -wash u -top model -tain ers -su cha -si aa -ough ta -kil ig -guana ju -go do -gar n -fly air -ff ff -dec i -bri dle -bran ning -blu estone -bl r -ìĺ Ī -synchron icity -spl unk -mel chi -mc tavish -loot crate -icic le -hot wheels -go y -die z -dar vish -ble ep -arab ica -Í Ł -z ka -schi av -my cology -kumar aswamy -edwin a -ati v -^_ ^ -ðŁij ĸ -y ac -wey bridge -ti mor -si ke -roman i -ro ther -quint an -ham pi -fla c -co vent -cham in -c sm -bour get -ðŁĺİ . -wind ell -waf a -stan ak -seab rook -san chez -russi angp -re arrange -pen tium -paki stani -nfl playoffs -mo hit -mari am -mar ne -four four -conesto ga -co ff -bus quets -ar jen -ðŁĴľðŁĴľ ðŁĴľðŁĴľ -ðŁ¤ ³ -virender sehwag -valeri e -semi finalists -lower case -khu sh -in vocation -hc sm -dunlop btcc -bla u -barb ary -auctione er -ac cu -x lix -water spout -w pd -vand enberg -swe en -in soles -del os -cutt ack -car ru -byr ds -black widow -ath in -a ç -yol ks -tan go -sto cke -no is -mk t -miya ke -mc dougall -manish malhotra -fon d -fare ham -by l -and is -an gui -ad as -ðŁĮ ¬ -wil ley -swim dive -shoo ter -se wers -sch efter -os b -mm b -jane oineza -jami es -colli sion -chron ically -bo jan -aro ss -ts l -tories out -sens ical -ol ins -official r -life quotes -karnat aka -hir u -cir cas -amo vie -sports book -sangi ovese -ravin dra -prof iting -pro gen -pois son -ji day -bm wm -this week -synchron ised -sou ff -people of -o campo -norwich cityfc -mt k -mor phic -lor o -k home -identi fiable -ic ula -flint stones -bibli ography -à´ ¤ -vent e -unite the -ter ill -pamph lets -nas aj -md g -l ı -ker rang -k bc -fer ran -cu bans -biz awards -un winding -swe g -ru mmy -resur faced -ocon ee -nat as -jo iner -i oc -gra ys -chop on -carol ing -be p -terrori zing -slack hq -sch mal -ra du -ponte fract -pi aget -p yn -o gp -o edi -el ven -digital signage -an ight -a arts -$ ... -world rugby -wb ko -ti verton -th ati -tar tu -sk ink -sharinge conomy -sal lie -recipro cal -propon ent -poe tics -o q -novo sibirsk -nb stv -mini stry -me unier -lyn ched -je tair -in fighting -hello bangsie -book list -as apo -ðŁĴĺ ðŁĴĺ -ìł Ħ -wy den -wareness day -ta wat -t ph -sky hawks -personali zed -me za -int ouch -fü r -franca ise -dejav u -de spo -bur ks -astro dome -v mc -uncontrol lable -th ie -spike lee -park city -matri mony -ho pen -h x -brook ing -bre aux -ap ace -alicein wonderland -aj am -ac pa -; ) -âĤ¬ . -ve sta -tri d -offici ate -natu recomms -mient ras -lan gh -im measurable -gif tof -fash ola -candle lit -bal der -baj rangi -agre en -y aar -tee pee -re structure -rc si -mis cre -lu rie -libert adores -li ssa -geordie shore -gent leness -flo gging -bre win -bahu bali -and ere -ad ana -ãģ £ -vil lar -ucl an -tyr one -tro dden -sub zero -scol lection -nu bia -na in -men de -jubil ant -gre gh -freedom day -fin ery -deuter onomy -byu football -brain erd -bour sin -ben ven -belgra via -ar una -app state -trattor ia -polye thylene -nikon photography -marc ella -fn f -film twitter -far si -back hand -è ı -vel t -twin k -sau sage -sar ban -reproduc ción -mo dis -jo ta -cad do -ad don -vis akha -thu mper -sy x -p dr -oil sands -mar oo -m soccer -hen a -glen fidd -ethical fashion -emo ticon -cam embert -be il -ar ro -ab x -vian ney -sweat er -su bar -sh w -raredisease day -meang irls -le win -im planted -hun han -ha kk -fit life -ei gen -ear a -bur de -bloss omed -Ù İ -u con -ty o -sta p -pru dent -p fs -jar man -fire stone -blund ell -ðŁijıðŁı¾ ðŁijıðŁı¾ -nam ed -kei ko -ju b -ide x -hemo philia -everton fc -ede ma -d be -cor gis -ðŁİ » -to que -rambl ings -por zingis -or chy -mi rad -land mines -kom ets -hi ddle -go team -fyo dor -escarp ment -du k -dn f -bro deur -as ki -an ks -a ee -un framed -rich land -ra di -ma qu -leinster rugby -kali mantan -hit ching -economic times -dump ty -craw ls -asado waisi -as oci -as and -to bey -poetry community -official bhafc -mon alisa -jag er -ha x -h ff -flat ware -duc king -di vi -bio chemical -ðŁĴ ij -í Ŀ -su o -sl k -predic ament -nerdv ana -m live -le von -gaither sburg -com ox -by water -ðŁıĨ @ -vaul ting -to ta -thel onious -pre cari -ios dev -hon king -her nan -h ice -enchil ada -en reproducción -da ed -bi ki -bau ble -band it -we c -venge ful -tobler one -tay ler -schar ity -revit alizing -r vs -r rs -love craf -k age -ei bar -dysle xic -cro lla -chit ral -ðŁijijðŁijij ðŁijij -x vii -wil la -tang lewood -ta iga -su football -squ ier -sas sen -per rier -n ld -ko lo -conservation ist -c fe -block busters -an ah -ü ber -sun ba -sty our -smil in -pillow talk -le pas -kru pp -hosp ices -hel ipad -fil i -dro sophila -bo som -yennaiarind haal -uk in -standup comedy -sni ping -sand castle -qu avo -nom bre -n la -man tar -gu bler -gr ano -elo y -d bh -cy r -car pal -bor i -air france -aali zardari -ðŁĩ° ðŁĩª -yak o -un women -sundance fest -small mouth -seash ells -o waisi -mul doon -cuis inart -bo gie -bas soon -an jan -rock o -po ste -pim entel -pe avey -nos fer -kir che -inter pol -haji me -en l -ar ak -ðŁĺ¹ðŁĺ¹ ðŁĺ¹ -еР¹ -Ï Ĩ -woo fers -vo tive -ver dant -u leta -trum pe -ship wrecks -shim my -sc ats -salut ations -s anna -pat ani -nag s -indi gn -gaffi gan -eag an -cr v -bad r -ant and -annu ity -the afric -terrori st -sol ana -rape seed -poo ping -m chs -fast food -emul ation -elev ates -de sean -wel yn -w yo -th birthday -speed boat -pinstri pe -oneof akind -maritz burg -k hai -j nj -gil ani -chri sw -ay our -ap il -a ini -ðŁİ Ĺ -v ln -ther sc -sw en -restor ations -reiter ate -photo call -ob p -ny p -m hp -fil mb -d aps -ðŁIJ Į -z ec -uniof nottingham -tra shing -stra ub -sequ al -ry back -ro thes -mummi fied -millenni um -marsh field -j cs -is art -hugh es -gau cho -defen sible -ce mented -bor land -bon nets -ðŁİĤðŁİĤ ðŁİĤ -wonder wall -wim ps -vivo ipl -tallu lah -taec yeon -sport sawards -sher brooke -q sa -pin ck -ph r -oun ty -nu ala -kung fu -hel sing -dalry mple -ate acher -animal crossing -afc wimbledon -] - -seven teenth -saip an -ku o -ka an -in ta -huss ain -epi thelial -den iso -as kan -wam bach -su ko -son oran -sn ola -pr ong -plu g -nb cs -mt u -logar ith -local es -kelle her -kat ch -flu ff -cr yer -cont ours -con jec -ce real -calendu la -a icc -åij ¨ -tent atively -tempran illo -succu mb -south ward -raj jat -r fl -par ham -ny our -my p -mur ry -ligh thear -in time -gag gle -f lim -city hall -ceme x -brexite ers -bi glo -at ly -ห ล -women insport -un invited -town es -the botanics -sensu ality -sc el -pre occupied -onlin ec -men ai -long term -le ich -land y -ig ong -conservation ists -black light -az aren -architec tural -ðŁijĪ ðŁı» -u et -tu red -stal ybridge -r za -perfectgame usa -pap adop -motion less -mil t -di el -cre at -black birds -bal eno -att itude -about lastnight -ãģ ¯ -respir ation -re defines -pic c -pale stine -now tv -m cuban -lo ka -gman etwork -chi z -angu age -alli ed -alicia keys -w ning -us se -the people -sd t -reson ant -nyc mayor -n bt -hoo pers -don ned -do sed -d illi -centre piece -blog spot -tu so -t mo -md na -land rieu -kann ur -ka rena -in slee -giu lio -alle lu -ak un -thejustice dept -simm ering -ro ly -o ki -nh at -metal work -hou ten -contag ion -aka worldwide -å İ -ãĥķãĤ¡ãĤ¤ãĥ³ãĥĢãĥ¼è¶ĬãģĹãģ® ç§ģãģ®ä¸ĸçķĮ -under tones -sun daes -pi os -on de -o intment -mo bo -kev lar -ket te -ing lori -ic ano -i ag -hay festival -doctor ow -chir ps -bill board -! ðŁijı -â̼ ï¸İ -year n -ven er -ul te -treat yoself -ton ys -som os -s man -oreilly factor -laparo scopic -hah haha -free se -domin ator -chau cer -ch lamy -birdsof prey -armed forces -aero dynamics -ad ors -vol com -vancouver island -the killers -ob fusc -mú sica -lil bthe -lilbthe basedgod -gor akh -fool proof -etsy gifts -cho d -bu e -ac p -ðŁĺ© âĿ¤ï¸ı -war r -vapor max -sr tc -sen ayan -ri man -onond aga -on ference -metro plex -mcgill u -kath ie -kak o -je tting -get out -fuja irah -fertil iser -ex propri -eli ght -don tt -car jacking -bi ri -bal de -y ella -wil ton -wheat grass -vani shes -thel on -sedi ments -pu yol -postcardsto voters -mu to -miss america -ley la -len ovo -justi fies -in co -ear plugs -bur o -blue prints -b school -ver and -ou k -ny giants -jo vo -deter rence -dc cc -con diment -an l -wor cs -v di -tt d -moor land -lun acy -inti mately -idio syn -bod min -belli ge -. ðŁĺİ -work sheets -wil led -ulster rugby -th july -teen age -super janella -sty lings -sh ingly -p spk -ost asis -om sk -n acc -mi ren -ko bi -im ola -fe f -bil le -bb mp -ae ther -! ðŁĴ¥ -tear gas -tapp an -sig ourney -sam ira -pap hos -kat weets -hocken heim -gen ghis -gate keeper -acap ella -âľĮï¸ı âľĮï¸ı -unrival ed -sla ven -russell crowe -py rr -poo ja -ni z -mike tyson -lero i -lan sman -fran sch -end violence -don y -dian ade -bour que -b tv -anci ents -ab dallah -ðŁĵį @ -ðŁĴµ ðŁĴµ -z os -wozni ak -wer ri -sin jar -in visibility -cor si -cen to -ar ine -adebay o -âĽ Ī -pur p -n bab -mari ee -ma sta -ly les -l chs -i ak -de gan -creu set -co ppin -blu eri -bag us -ai on -wh ut -urban fantasy -stephen amell -snod grass -sand hurst -pool party -plat form -plan king -p ona -no sleep -mr sa -luci ana -live show -jais almer -it smore -finish line -film maker -fc f -e bol -destru ct -an sele -suppre ssor -spit zer -real berta -pl iny -nr t -nfl pa -lal aland -eric hards -bil tong -and ai -ak ro -war hawks -redund ancy -q ian -pu shups -grou pies -gel lar -com inghome -clan destine -chait anya -an ys -ab aya -tx dot -su ble -r du -migh tiest -mccre e -jurisdic tions -hu dd -hans ard -flo rent -d ce -colla bro -ch oma -bar sand -adi se -v ago -tic keted -th p -st lucia -snow pack -sher borne -ration ing -promote horror -mobil ise -luxury hotel -kand la -k awak -ho se -he dley -dr yers -cre scent -ab or -w sa -su le -sister ly -re bar -ramaz an -long mire -inhal ation -dissol ves -commerci alization -cha ine -carri on -cam erica -boo galoo -big deal -b let -aspir ant -ur gh -tiru pati -sl acrosse -sb ach -poor people -oo gie -ki ambu -jab lon -how ls -b hardwaj -b ds -ant u -a aw -ðŁĶ Ķ -é ľ -van v -plussi ze -link later -lin lithgow -kla ss -finoalla fine -envir ons -bren nan -appeti zing -$$ $$ -$ ! -wa pol -tu fc -ther o -sivak arthi -si va -plastic free -my hero -la gh -fau sto -ev c -cross overs -bn sf -bern thal -au li -ìĿ ĺ -tin sley -ti sch -straigh tener -scotty mccreery -rece p -pun ky -no to -in pics -happy day -criteri um -bikelife dotch -worldcup final -to let -shin kansen -popu late -orche stration -naku foaddo -lindis farne -lat akia -integr ations -ig c -ib g -hopp us -food lover -eng ard -du ds -df b -depau w -bel af -bc n -bar c -ba sie -as sad -af resh -ðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺðŁĺĺ -ya ay -sar sour -ric ardo -prophe cies -power boat -om r -newh omes -magic thegathering -m dr -lokom otiv -li ii -jä ger -ju egos -iter ations -inclin ation -ig ne -gro gan -fu sco -cran ks -be sos -âģ© ' -tric eratops -spic y -spac ers -scri bbled -reach able -over ground -microsoft teams -m hm -g mt -future is -fell ini -fel ines -fab s -cri ssy -ca il -book worms -bo do -ar rington -ðŁĺı ðŁĺı -y ameen -sa kamoto -re ared -nu ys -market cap -mail lot -inhi bit -filmo graphy -falcon ry -engag em -de faced -car at -buc keye -bay front -bangalore ashram -atp worldtour -am un -ad om -y ate -mediac ityuk -j fl -gun ung -fre s -che on -bagh dadi -bab at -aug ment -ari sta -alk official -ê· ¸ë -wie sel -trin idad -sof summer -orp ington -nose bleed -jay me -foot locker -em pathi -bo bi -anti bes -ansele lg -aerob atic -ðŁİ ĩ -ãĥ¼ãĥ « -âĺĨ âĺĨ -water works -water logged -no bar -n cd -ka huna -is ar -fli rts -d mb -cp us -coo kers -cas co -c fi -band ain -ayo dhya -aj man -surf in -o carina -gu tter -fries land -cast rol -bon plan -be so -à¹Ħภ¡ -ven ter -spr oul -sport back -sp j -parti zan -oc ket -mathur a -m fl -ha poel -gre i -g mf -dru p -cover art -contra dict -ay ub -anselelg ort -abse il -war bird -tro ma -ph ro -nerv ously -kw ch -kun j -j illy -id b -hundred th -hal alan -dece it -ca wl -bon t -tash kent -ph lebo -march forlife -mar red -l cr -krish namur -he bei -fra g -bill ballentine -bha gya -august ana -anastasia beverlyhills -amc cartney -íĻ Ķ -th all -ta thletics -stu es -st anc -re als -ol ino -n tn -jet lag -hi ii -aller gy -wn bl -suit ors -sin bad -scotland team -sal combe -roll back -rey no -point less -pl ou -octo pu -n xp -hy po -happy bday -bou dreau -alla ah -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ -world star -the wire -t gc -sun trust -sore ness -sk ap -sci o -re started -low lands -lewis ville -gastron omic -expir ing -defl ation -de tox -cu s -blu est -ti rade -schol l -prof en -pol itic -po sen -par cs -liber tad -la ye -jan ic -her ing -hae morrha -en cino -cal ori -andre j -anatoli a -ðŁĮŁ # -unfor gi -tab i -shad i -opar ks -my world -ho dor -azaren ka -ðŁĵ ľ -vic firth -tre vi -tran shuman -squir tle -speci alization -read e -ra kes -one treehill -mu khtar -mar ymount -kaz u -k wai -ic er -gla ssy -forfe it -felic ity -f els -dual shock -de fra -cer i -as phy -ang ri -ঠ¬ -worldof outlaws -ta or -slic er -na si -mis se -lock the -jen kin -friday sfor -fasten er -dream force -bloom sday -bl ck -biop harma -apple jack -: /// -. ðŁĴĻ -val ero -uri be -un doing -tw w -to tnes -tic les -tech fest -sun nier -stream lining -s gi -offen sively -lund gren -lc sm -inhal ing -enci as -cr on -comment aries -code ine -cly ro -br n -bo wel -tutankham un -spru ce -sky walk -pang olin -mod ine -men ta -lan cet -horizon tally -gu rira -grant gust -gas par -freder icks -curv ature -cam bio -ask is -éŃĶ éģĵ -u cs -tcm ff -sen or -pu dge -mal dini -kirk d -ken berg -kam pung -iri a -cotab ato -bay onne -anesthe si -and ron -ðŁij © -zen o -stock man -sk an -r pc -on canvas -mtvbrkpop exo -ci re -band ages -aurang zeb -a star -ðŁĻĮðŁĻĮ ðŁĻĮðŁĻĮ -ðŁĻĮðŁı¾ ðŁĻĮðŁı¾ -à· Ĭ -yeg wx -w mt -volvoocean race -vari etal -simpli fication -rock climbing -mis matched -h nd -geome trical -dh sgov -danger uss -center ville -ble acher -ar quette -afc bournemouth -âļ Ĵ -ty bee -tre d -thur good -oast al -nax os -mainst ay -kar rue -joaqu in -iff i -ic re -hover board -evic tions -dun more -d ado -both ell -twee zers -se ep -ry lee -power ade -mur phys -lang chat -execution er -camp out -bice ster -æ · -à¸Ńà¸ Ļ -zo ey -le ach -guide dogs -fi bro -ef x -bi el -be fitting -ðŁį ı -workhard playhard -sojour n -sav am -rss org -ni i -nay eon -li han -h bu -gab bar -eng lund -e space -citizent vkenya -aw ah -ab bit --- # -thor ny -squ aring -ra wal -lou der -li sar -lex ington -intro spective -guin ness -daily telegraph -co pland -cen o -vi zio -transplan ted -shi z -ros ari -ml khattar -indie dev -huck nall -fe ct -embr yo -dy l -di go -dg n -am dg -al locations -ðŁ¦ ĩ -ãĥ Ĵ -sym one -season ably -no stra -mee ke -loud speaker -jam bo -bo got -beck ley -scep tical -sa hm -parame tric -oc tor -nn pc -logan henderson -limb urg -lak as -gor ton -drone photography -deb ate -char me -cele stron -can tu -avi on -ab in -éŃĶéģĵ ç¥ĸ -éŃĶéģĵç¥ĸ å¸ -x terra -we x -wal worth -tra di -team coopertire -sin aloa -r anda -pu tih -physio therapist -over falls -or omo -ny islanders -mmi w -la ki -go av -gee ked -fan e -enu ff -dr at -al evel -yu vi -vol pe -stren uous -shaq iri -shaf i -oun a -mu fasa -ju i -happy ness -em pe -eg l -degra sse -comple tions -chili peppers -bi dders -ðŁĸ¤ ðŁĸ¤ -ys gol -y ano -ur at -un attractive -scienti fic -sam pai -re vels -ou ma -nic ation -ly don -in voices -fer v -expe dite -dangeruss wilson -cumb rian -cram ming -caption this -bas spro -an au -ak it -air crafts -vis ita -shi ps -out grown -north cote -kair i -k nut -ini sts -dio go -dc united -cur ler -cellu loid -baller inas -arapa hoe -yn h -up ma -true blue -t pg -ste via -sever ino -rajjat tokas -r ational -pol kad -os in -nasaj pl -mann schaft -manipul ative -kayo de -k ray -hur ry -euph or -educ ates -cu cam -cor don -black hat -b side -ane o -ai admk -adri anna -tie breaker -south side -param singh -koko bop -kaffe e -in croy -icon f -health news -distin c -bigtimer ush -wi aa -tore tto -to wel -thelittle things -tele fon -smor gas -smo ked -positive thinking -on theroad -music production -mar ab -kasautiizind agiikay -hahahaha hahah -fr antz -empty the -e ffin -cu eto -cross ing -ace of -ðŁijħ ðŁĴ¦ -âķ ± -sorcere ss -o ad -ni aller -nh ms -mu gged -metro pole -kau st -hit man -croche ting -crimin ality -⼠½ï¸ı -sme ars -mir ko -leep ace -kirkd borne -kaz oo -kan ina -ham sa -ennis killen -e scri -di shed -cr na -bo iz -best nine -âĿ¤ï¸ı ðŁĺĤ -wise st -vou cher -vac uu -tac ks -south land -ridic uled -rasp utin -port ability -pat ine -mus ket -la ya -gh ese -free form -flu ently -ferre tti -chand on -ch oux -bli p -betra ying -bet tie -arte ta -all night -un ica -toom any -te mer -switch foot -sme ared -s vs -quir ks -prin sloo -northern soul -excit ing -dwar f -do tte -de ven -corro sive -ci b -certi fy -bam burgh -ak op -si bly -sherlock holmes -ro to -re turno -re launched -outlaw ed -nat archives -mon so -lo tt -lo ire -detroit pistons -del ly -coward ice -at ur -vi ki -tion ate -te v -speci fics -se ale -parth samthaan -mist ral -mea india -lent z -lasal le -is g -gu llo -cull en -che tte -billab ong -at at -aspir ational -air jordan -web gl -wa stage -underwhel ming -ufcfight night -tre yarch -su cess -ru islip -op tus -no regrets -mar r -loo e -it sy -handic raft -graph ql -fen cer -ener o -dun hill -dre search -be thel -ari ed -tim peake -scandal abc -re visi -pu ffin -ph um -memor ized -ka han -hale storm -ep al -dublin airport -w ca -vic er -thaw ks -so to -shu ck -pureb red -pere ra -mug ello -l fcc -ki vu -fre hley -e brd -clack amas -che vel -ðŁijį . -woo young -sti hl -show times -jane way -e be -cir c -blast fromthepast -big ben -bel grave -v force -skim med -san ofi -r cn -out number -mont fort -major ly -f bi -cob blers -cave at -asse ur -adel sol -wel o -ur ns -tor ii -mor rho -man nered -lymedi sease -dg t -âľĿ ï¸ı -woo ps -ur ch -tane ja -tal al -snor kelling -sas se -ric one -nu thin -n art -me ck -lan tern -ker ridge -i ram -her re -followyour nola -flexi ble -ep at -e day -dun de -de id -dal v -cul lum -coinci des -bern hardt -be friend -and han -tik tok -ranch life -por phy -ol ito -new southwales -nak a -move mber -len z -kim bo -kids books -ken nington -k ase -fan shawe -ce ballos -capac itive -bro ek -bom a -battle for -ba ap -ðŁĹ£ ðŁĹ£ -ãĤ¸ãĥ ¥ -war field -vas ily -t sc -se mo -prince of -le tic -cack ling -bett ina -b ms -è Ĺ -äº º -{ @ -scor ch -sau v -s disease -rev amping -piyush goyal -pe chak -nac ion -mn statefair -mag al -la fleur -isol ating -i au -gal gadot -cd ne -bill maher -beg ley -ba io -west australia -vul gar -tv b -tar lac -stenc ils -sch lei -normali ze -me anie -jo elo -hereto stay -dy ne -cre at -chartre use -aj mer -storm team -river o -re spe -paner ai -pale mbang -lu ty -lo athe -judg mental -huff le -hr c -hh c -eu il -c illian -br p -all natural -aar p -yo gis -xan adu -uw f -topp led -se ers -ophi les -mo sque -m ame -ju er -jan asen -guanaju ato -employ ment -bryan cranston -berne se -bbcintro ducing -ad eni -Ø ¸ -yan k -wr angling -wind farm -webr tc -tr one -timber line -the cube -team chevy -tac tical -pur p -o steen -ing rown -gilgit baltistan -gau thier -fee ble -der went -bra chy -ami ento -ðŁIJ ³ -vy ch -the boy -sky blues -po acher -nico lette -na az -dit ka -Î ¹ -youn gin -was ps -tu ks -stat ic -makeaw ish -houseof commons -her sh -ecr chat -de ji -ac ru -xi u -vs sea -u vic -tt weets -sthel en -pr ana -oc ado -ob jet -negli gent -ko tor -kar yak -flax seed -daf fy -conve x -aristo crat -whist ler -vas cular -theone show -standre w -south field -screen writers -kan hai -athe i -to you -sam y -sag rada -ring ers -opp enheimer -mono gatari -m wave -j angan -gil gamesh -dai ley -d ancy -boo by -bbc looknorth -sw asth -sound design -sci am -sadh na -pret enders -out en -mis sm -ma guk -ike da -gil lette -el fman -defl ated -col u -buddhi sts -av u -with pride -wc bs -t mb -t ld -sydney swans -swan ted -st acker -pratt pratt -nan oscale -lil acs -ju ul -high street -fren d -fer ru -de ve -con klin -un relenting -trans actional -stro mb -s ach -religious freedom -n tm -n ela -lu i -h iller -flo tation -en cy -disrup tor -ci er -cas per -bul la -bet ti -w tn -ursu line -up silon -thur mond -splat fest -sal o -p gc -mm h -makesthe dreamwork -lean in -ka ji -gro ping -g cc -d ening -col ter -ar al -anni gan -a week -ðŁĻĮ ðŁĺį -x abi -u wc -true social -timb ersfc -rich mon -prattpratt pratt -ny am -lo thian -leot ard -j ma -itu te -ek ay -echin acea -dur acell -ìĹ ° -tro feo -she tra -shang hai -sab i -qu inter -nhl canes -me rer -ly nyrd -lin del -lawof attraction -lam ela -kho sla -has set -finger nails -end angering -dro plet -dies er -cont ac -center pieces -a sharma -ðŁijĩðŁijĩ ðŁijĩðŁijĩ -vero truesocial -segun da -plum met -pan ch -mal le -li sav -hi bit -h ru -g ct -bon amassa -blu th -backto work -aphi ds -ti bility -sc ount -ra pt -place holder -lane way -fo stered -fo red -fi el -emplo i -eme ka -ca k -ante ater -!!!! ! -the ist -tech o -tec mo -sw best -su da -sky hawk -se itz -s academy -pra j -plac ards -pivo ts -mountain biking -jum mah -jj f -ig ata -eu co -de constructing -d ft -al mond -weis z -vi j -to li -south wark -slo tted -ra gin -pro actively -obste trics -north woods -nh of -jeune sse -ae um -tv p -thero ck -sym metric -so afx -seag lass -non league -night crawler -m de -ky uu -kl ance -kab balah -cri sis -chemical physics -anarch ism -å¤ ľ -tr m -smo res -sa xton -re construct -pettic oat -out scored -mini mum -luci atas -luciatas san -loy alists -ligh thouse -lake ville -industri e -ic aew -i ie -ho gging -fro mm -ephe sus -dur rell -blood shot -beech wood -american cancer -ach allenge -v cg -tom ellis -tempor ada -sel la -morri gan -lom ography -li der -googlec loud -ger ie -fe ild -ev os -cine world -bha bhi -amy schumer -afsc me -vic toire -vi a -sub i -na sir -multi ples -lu stig -lat timore -k cb -i din -guy ss -di stressing -ðŁijį ðŁı½ -wil f -tom bola -tigh tened -sl peeps -sig ye -sham rocks -sat z -qu ec -no gales -new ss -natur ale -k ss -k cap -et fo -epic ure -bbc four -barrier reef -ab on -ãĥ Ģ -tw os -ro id -re eve -natu rema -mal ac -m sh -i jo -extermin ate -chou han -cas i -yn or -tele visions -storm doris -spor adic -soli hull -soci alizing -sh amp -pnpp atrol -out fest -it orial -idh lig -how land -ch ur -belgi que -and ran -w mf -tan nehill -ta ye -s thu -ro que -rik ki -ra dium -pat er -pac sun -p cusa -obli ge -ob vi -n sf -mi es -mc busted -lingu ist -li ppy -di ms -ce g -canni bals -candid ly -barre tto -scholast ic -q fs -propri etor -paci fier -offici alu -nott m -mexic ano -mar yann -la hm -grand parent -forz amotorsport -formula oneworld -burn leyofficial -bax ter -apal mer -ab loh -ðŁĸ Ĭ -wh ittle -throwback thursdays -sla yers -ma key -lauramar ano -athan asi -ap el -vo is -vi ves -tur nips -snor e -pl ines -or do -mac rame -ir b -hl n -global dev -fuss ball -evol ve -epit aph -dang les -dalrymple will -carn elian -as cd -ana esthetic -Ê ĸ -un du -shabbat shalom -ridd ick -ol ney -li da -lal un -im possibly -her at -groom smen -gay le -co ffs -capoe ira -can ta -bak eries -vik ki -tu ra -t ne -pl zz -per ky -peace and -ord way -n anc -la vin -doo d -digi byte -com promises -co bbs -at am -vik tor -ser aph -re arranging -pil sen -marque tte -mari ob -fic us -do pey -d ng -cur ries -ce ec -caf cl -wee ee -urugu ayan -ru ffi -pre ppers -h ü -gob ind -ga stown -baham ut -attrac tiveness -ad ra -zar ia -wis p -sang ster -ribb le -mo ises -martin luther -leagu er -le one -kat v -inlove with -encamp ment -d ct -ba di -âĥ£ : -senior night -rosel and -rand al -pampl ona -link ages -inspec tor -ha bibi -equ is -dam ing -cat chin -been ie -ba haha -al cu -ac ar -èªķ çĶŁ -war ri -tom morrow -ti oga -te sla -sh rooms -orb ital -mulvan ey -mu gging -ku i -distingui shes -abnormal ities -a verse -wb w -vit us -trac ie -the end -t week -speed master -sag ging -re tainer -panch oli -n po -ing ame -in sk -har apan -dif fraction -custom izing -buckle up -are search -tweet whatyoueat -shi pla -pon ting -or us -north america -lucer o -lam i -kit z -green y -de composition -dabang g -belo ve -asper ger -ap ai -antidepress ants -ac tory -) ". -yor ku -yo h -te res -si ft -red bird -movie awards -li mon -dispat cher -compet ition -à´ ¨ -tin dall -skele tor -qv cuk -pnppatrol plan -licen sure -letter kenny -leaf leting -grate fully -gorge ousness -er ste -b fd -ave tt -aloy sius -ow d -ol ine -nom akeup -n tas -man ch -jer oen -had don -gri ggs -golden retriever -fact check -digit ised -dd h -bella donna -ðŁĺģ ðŁĺį -w sd -the z -prith vi -ou en -or ford -mush taq -ma b -ger a -frank ston -fab led -f rick -deleg ations -æ © -xti andela -per fil -ong we -mp v -jammu and -il op -geekand sundry -fi dge -feder ated -da we -cli f -black veil -tu scar -span ky -or ob -moline ux -mar ano -ma pa -hol tz -fret board -ec ac -dup atta -biscu it -bij oux -am illo -+ : -volunteer week -vac ate -v fd -self portrait -north dakota -mull ingar -make overs -he ke -h ct -ever a -deliber ations -chickas aw -bo bbing -big daddy -aro ck -à§ ģ -tb ar -sanc tity -ny cha -mgm grand -jones y -jan go -fri st -di fun -chouhan shivraj -ad agio -âĺĢï¸ı # -y bor -upl b -ti fa -s fans -ri ven -pol yam -ol am -gn am -fre dd -dog toworkday -cr an -cin que -bee keepers -be ÅŁ -at au -ar la -an ah -y ura -te rence -te ck -su ge -re insurance -play store -l ile -ker ns -hy the -h tx -gn ani -centenni al -bu ter -ash ville -agre at -ach u -a see -ಠ¸ -sus ang -super dry -sp rime -sc ity -re aping -out sourced -obstru ct -green room -fe heroes -fa in -cla pped -cab in -be inn -av ai -ðŁijī # -vector stock -teamwork makesthedreamwork -sha urya -le ch -kristen stewart -in between -gin ny -fy c -fre er -fr inged -em itted -di ba -cross bones -cow ichan -conve ying -bolshe vik -band i -alexab liss -ador o -ðŁĺį ðŁİī -wan amaker -ve ena -sr v -nit rous -mor aes -loving life -kay ak -iq rtg -hil d -competiti vely -cleveland clinic -cit ron -ar aya -ëĤ ĺ -uc sc -recor deli -puli sic -pis cat -mow ry -ma est -ke p -is ko -fal lujah -dun a -cor byn -zeit geist -wedding planner -spor ttv -schem atic -ram ya -ra ji -napo leon -muen ster -m se -le bron -judas priest -imper ium -did nt -brecon beacons -bobb in -bex ley -bel k -à® ª -ÙĪ ÙĬ -z yl -y con -west africa -spac es -ory x -oran je -of w -odys sey -n ür -japanese food -il lest -grind core -gla dy -fre ude -exerc ised -diar mid -da th -curren sy -awe struck -andrew lincoln -ðŁĴĽ ðŁĸ¤ -ãĥķãĤ © -yof theday -vinyl collection -vancity reynolds -un compromising -su de -spi ele -sing karaoke -rout ers -rei sen -red bulls -priv at -ma day -live strong -k mc -har land -goo ch -fi an -bit moji -aj or -ach ar -ðŁĮ· ðŁĮ· -work force -soci opath -pro fun -mer kley -love team -le itch -kin z -inflat ables -ge y -e esc -chat ta -al dini -æ ¼ -w aven -reich stag -off erson -nat west -moo s -mid nigh -gubler nation -grind in -goal tending -du jour -com an -charlo tten -bm th -blooming dales -appal achi -:- ). -ðŁĺĺðŁĺĺ ðŁĺĺ -will smith -unexplo ded -thegood life -tar ver -sy es -sush mit -stop adani -sh or -ol and -mon di -meet sworld -ka isoo -indv sl -fra ses -car in -bo ve -ðŁķ Ľ -ti pi -sustain ab -strang ling -provi den -ol den -ner ium -merr ily -janmash tami -in famy -docher ty -cassi eclare -carnit as -car ing -all thing -al at -y onex -worsen ed -w aff -tr onix -ste y -name is -mole sting -ma gg -low rider -lo it -jab er -id ling -i et -cra bb -beau regard -au tor -yousaf zai -un structured -syl lable -perman ente -o gu -nu b -kyrie irving -kele chi -he ther -f sh -csr classics -chees in -chandra babu -bar am -ðŁİīðŁİĬ ðŁİĪ -tew kesbury -super coach -prison break -onco logist -ocu lu -itz man -in house -go dot -ge aux -fah lo -disneyland today -bre gman -tor mented -nou ve -margau x -mar kov -loo kit -kimp ton -ish mael -goss elin -denti al -cultural heritage -cin ch -capsic um -ðŁ¦ ij -æ ģ -yumy um -studi ous -social media -seong wu -sat ory -q an -par rott -mac ey -funer al -fiery verse -e bit -congle ton -com as -chario ts -but thole -ap te -an et -ador ning -x hosa -un women -un dy -talk like -dhar mendra -da ele -con fines -cad dy -bury fc -av oce -altru ism -= ))) -/ ... -t assi -scu f -ri a -renew als -rec ited -que re -psyched el -ow ar -geck os -egyp tian -ye p -seri ou -rosel le -public relations -oak man -me theny -make money -ll ins -k alo -ho sea -hau ghton -ha gel -gram matically -at ro -armist iceday -worldof tanks -vindic ated -triumph ed -ti eri -oni us -mon cler -mo ps -mis ed -mat ures -i gem -hilton hotels -geo logists -dishone sty -din ning -but te -alger ie -ðŁĴĻ @ -sym pathis -repleni shment -md k -mau mee -margin alised -manil ow -kar ta -im passe -hy vee -green away -d st -ba hl -ap ic -aerof lot -visakha patnam -the wall -style blogger -smoke free -sig mund -omo to -leg room -jig gy -ja unes -gai ety -free code -express o -ek man -drou ghts -cu i -chall a -ber nan -am pang -way sto -vol ante -ti redness -sen gupta -scoun cil -ro amed -mt k -linden wood -l alo -k lose -jac que -ilhan mn -hoot suite -ci pd -ampli fy -ðŁĴ¯ ðŁĶ¥ -ðŁĴ ³ -tor rington -ne farious -muj he -l ó -krug man -ki mani -jammuand kashmir -in h -im en -g bt -fla vio -dee mable -bo sh -blues fest -bi on -as awa -ðŁĩ²ðŁĩ ¦ -var icose -ton ous -surbit on -ssi veness -pre form -post docs -n sr -n le -jun a -iz akaya -gul liver -futu rec -fa ster -e of -bastille dan -apo cry -ðŁĺİ ðŁĶ¥ -ðŁĺĤ " -up start -ro ff -ran cho -paw paw -llll ll -kor an -humid or -her c -haw tin -goo gl -chic ory -car ro -ax les -announ cers -what sfor -per use -p ml -drag me -dis array -belo it -bar neys -ìķ ¼ -ì° ¬ -western australia -tweet perth -petru cci -oo ga -mc enter -mb d -lawrence ville -lak sa -kre is -ke own -kar at -fro licking -fac ulties -ed ra -dism ay -de kh -davi doff -cur atorial -brue gel -acro ft -- : -ðŁĹ ºï¸ı -y ny -sp reader -share thelove -lu ca -lic a -flower power -d ka -clo tted -aton in -am ori -ðŁIJ ¨ -wood peckers -titu lar -sudo ku -sd proud -pol ynom -mu sso -mi mo -figur atively -cor nea -ak iss -Ñģ к -za j -te eming -social es -n sp -mo pping -le bo -id ina -i want -harm reduction -har ian -darm stadt -arre st -âļªï¸ı âļ«ï¸ı -wedding planning -und ate -social care -sale speople -re ck -ra che -megyn kelly -me ille -ger r -enor th -cani sters -c mof -bi u -ðŁIJ ľ -uf fi -realestate agent -ny times -mor ial -mi shima -ken do -je suits -insp ain -hyun jin -gastroenter ology -eiffel tower -cheltenham races -à® ħ -we k -v logging -shoo m -rom mel -repre ssed -newho pe -nar rating -n cd -metal gear -gloss op -ger aint -fa is -ed ition -e book -coron as -car tman -accor ds -youn gg -un certainties -suspiri a -sal vini -preeti katweets -peru gia -ke p -in shore -guin nes -gi ger -family business -bin aural -au try -acron yms ----- --- -ãĥ ĵ -x viii -val di -urban o -star ry -pla ster -fli rt -zir con -un defined -tre st -the gold -su árez -sle ds -sk elly -moderni zing -mer lin -li ere -lam u -j hel -gol lum -cr ysis -chu la -cali pers -ca ille -bri x -bou lton -big finish -bc r -bar tending -world class -welove our -te emu -sed ation -sabot aging -q lik -pos ada -mother ing -jer ker -hello love -cinnab on -can poli -autom aker -ðŁĻıðŁı¼ ðŁĻıðŁı¼ -wm ns -vand alised -ul trac -mon soon -miz uki -legis l -ju ried -je anie -intro spection -ho ggard -cor rine -br ynn -bell erin -astro physicist -a bed -à¹Ģà¸ Ķ -won ton -whok new -un scheduled -the que -sig a -ricky rozay -pp p -llcool j -keer thy -kat sina -k cc -hop scotch -defin ately -d att -ðŁ¤Ķ ðŁĺĤ -æĿ İ -we ill -shirec c -qu orum -nd x -kha imah -ist g -ge et -fle ischer -fidd ling -exclu sions -electro lyte -dispar ate -boric ua -ar mas -tu delft -te ous -li de -leg ality -jil lette -f hp -boy scouts -ar jan -al ami -௠į -tat ler -steve harvey -shrap nel -sf g -sensiti zation -miss world -le me -industri alization -ic ting -har man -fol ate -den haag -clo sings -ch are -aru sha -ado c -us j -to ying -sof life -sna pe -pé rez -poorpeople scampaign -no le -looooo ol -jit singh -il b -gi ans -dot son -do sh -bra il -battlero yale -ðŁĩ·ðŁĩ ´ -ë Ħ -Å Ħ -this s -sn v -reddead redemption -pal me -pa wel -no witzki -nar ayana -mobile photography -m sin -live at -le ones -jaclyn hill -euph rates -engv pak -dc ad -co ffins -book launch -ðŁĥ ı -strat for -speed paint -s zi -ram in -perpetr ator -paint job -ol m -mr m -hal ved -flint shire -eri o -blaken ey -bin ky -aqui les -y out -watch able -w sf -the carlospena -roy le -ri ers -py d -piyushgoyal offc -magni fication -iso c -hurrican es -diet z -c wu -br ich -border collie -bis son -æ ŀ -val ance -u kh -truck in -ter y -rick ards -pest control -natu res -mo fos -m vb -gruff alo -ful tron -e ben -doo s -dar bar -car melo -busines stips -bou din -transpho bic -schae ffer -pre cords -mee tups -isaac son -e talk -dr g -barsand melody -aye sha -au dley -ash tanga -amar anth -ðŁĺ¬ ðŁĺ¬ðŁĺ¬ -ðŁIJ ¹ -shap s -r dp -mol lywood -kun dra -ki ba -dig vijaya -cycla des -co il -back gammon -b more -wensley dale -u ar -the house -tb b -sha o -nor ri -mer alco -l ée -is our -her ak -go x -consecr ation -chrisg packham -chester field -animo sity -! ðŁĺĦ -ìĥ ¤ -ya ad -v x -ta ren -syn dergaard -road kill -nat chito -mountain view -min ec -lighthear ted -leg is -illi er -grand daughters -ay ed -aqu il -ðŁĮĬðŁĮĬ ðŁĮĬ -w gbh -typo graphic -the be -ta cha -suc re -spr att -rom toronto -ol leyball -my st -lack luster -kal ash -ilfrac ombe -il ley -hon ed -heyman hustle -gu ill -go tha -crystal lo -bho omi -âĿ¤ï¸ı ðŁĩºðŁĩ¸ -ঠ² -z oni -ucir vine -t ga -ro vani -nipsey hussle -lun atics -les vos -kidrau hl -jovo vich -comic s -beck yg -arbor day -ad tech -ðŁĶ´ âļª -umbil ical -tan que -swag gin -stor ch -show off -sallye aves -picture book -my rr -jo ele -hor chata -el dr -dil iman -cmof karnataka -choose day -al ish -ver itable -tre jo -ran gel -rail roads -ny sut -morphe us -masterche fau -mani ac -kowal ski -jaz mine -ic ahn -credit unions -cra d -ann ation -yn ski -wilhel mina -sare an -nosfer atu -gri ffs -dias por -d jash -d iller -ct p -contigu ous -bottlen ose -baha sa -âĸ¶ ï¸ı -stal bert -profan ity -pharmac y -oc chi -ju co -ishi da -fe mur -di minu -comple mented -clo ts -bal akrishna -asv px -art net -ah ed -ag b -stanak atic -show girl -resc o -res ell -re group -pra vin -mt news -mb m -li ais -kell erman -kaz uki -gr ater -dis gaea -dere rs -def lect -concer tos -bha dra -beig nets -anak ar -ê° Ģ -stall ings -photo gs -music fans -mon gol -min now -mam ie -ib jp -e ta -cd ma -cath al -c mt -arun ning -aquit aine -win ery -to res -super latives -recep tac -par ched -loun ger -ja ap -i ia -hill billies -grey stone -ge tover -fashion ably -ad eno -yay yyy -west bourne -su stains -star buck -so so -sh ner -rave ena -oned rive -k town -in ar -gw g -gir ardi -cec ily -c ations -advers aries -иР´ -yeo vil -v allo -spas ms -so ton -ra bble -r ch -q gis -n bt -lake s -lady smith -is y -iol ani -iam j -drif ters -compar atively -cli pper -business owner -birth date -battle field -ym ur -winter classic -vic ari -sub species -spe er -sor ia -sion er -si mcity -o glu -mar cell -jeremi ah -ho pi -gar vin -further more -flo ssing -dogfish beer -discoun t -denomin ator -block chains -b fp -ah at -ðŁķ IJ -trow bridge -stool presidente -sky rocketing -sho tt -shan gril -ro pp -par ine -news line -m cly -le sia -kun duz -kon o -k fm -ic er -har twell -eng in -char ot -bel per -as yn -alter ation -a ish -æ ³ -transcend ental -sugar free -semiconduc tors -sau vage -red devils -mun dy -msle amichele -mo her -milwau kee -mclen nan -ll ws -j lin -gur meet -g tm -farm ville -f bb -burge oning -belly dance -ba sti -athabas ca -aran sas -a historyof -thisi sm -tek no -stif tung -south asia -prom posal -orient ated -needle work -local business -le iter -if as -ho cane -gran ary -domin ion -bo go -bar fi -abdul lahi -zane tti -woo len -si fting -natur ally -lu ongo -jaland har -interrup tions -ge u -game plan -fro cks -foun ders -facup final -dem convention -d ici -coup é -circu ses -bar gain -à® £ -up an -tram mell -tab led -seag ames -rest itution -q igong -pull out -opar ty -no p -ko dan -juli a -hal stead -ga the -dani il -bat su -b ng -ab ca -â̦ ? -vali dating -transcei ver -re touching -mindy kaling -la gu -ke mba -hi ght -fibrill ation -dei ros -cor man -con spired -arcelor mittal -âĢ ¹ -z ata -yorkshire hour -ventil ated -ueber tangel -to ile -ter us -rho da -prank ster -m ston -lumin ary -kk rv -ker rang -gru bb -bu ki -bo one -aque ous -âģł # -young people -wi ig -wh ich -wax aha -synony m -summer lin -struc tural -saddle worth -rush die -pher om -p mr -oli go -og den -ne hemi -michel in -israel ites -hip ster -go duke -fu gue -evacu ating -de fer -cb schicago -wi v -spart ner -simon son -selec ta -rat liff -ra zz -plainti ffs -lu coz -kar st -iw news -hone ys -f sen -dinah jane -cec elia -ðŁį Ł -vote leave -tom daley -tibur on -srini vasan -roth well -mon dial -man chin -lovecraf tian -l mc -ha ving -gun i -den man -de ga -chu y -bru k -blue devils -ageo fultron -a ie -( !!) -wir ral -tm f -skybet league -ra ds -pk d -neil young -lad ys -is ys -ion ian -inhal ed -hoodie allen -ellic ott -car sten -al bay -adi da -acci dent -Ï Ħ -visual ise -tre viso -tra che -speed run -ra joy -prospec t -orlandom agic -nokid hungry -margare tat -kri ss -ik onics -grrr l -go hoos -g sf -do ty -applau ding -ac tu -ëĵ ľ -suffra gettes -star gat -jonas brothers -it alien -g luck -deton ated -can andai -bo st -begon ia -beef cake -bann at -anderson cooper -affor ded -travel guide -stell amccartney -re spawn -panig ale -one il -ny ongo -nike football -mow gli -montan amoment -mid size -kel antan -jamm wal -ha se -golds mith -fo den -da ren -child hoo -ald ine -adri en -ðŁĶ¶ ðŁĶ· -ðŁ¦ į -ss eries -spear headed -se xt -sad hana -ram bam -pe ta -oligar chs -mc court -loc s -ðŁĺį ðŁĴķ -и Ñı -~ âĻ¡ -yee zy -wil ks -tcc andler -que tball -posse ssive -moff ice -medi at -materi alism -jon ath -hat su -flu ous -craf turday -car re -b hala -am hq -veloci raptor -teen vogue -table tennis -se away -pre amp -pn pd -mc clean -labon te -invic tus -ic r -help desk -exclu sivity -etsy uk -episo dic -dat sy -bu teo -ðŁĮ Ĩ -ye a -sky box -sing let -pi f -or te -om ara -man alo -mac tic -li sd -feder ica -fati h -ener gia -el ines -coden ame -cho ckey -birth da -w ssu -ver bier -ush ering -talk to -t me -ro swell -neuro surgeon -ne pen -national siblingday -mess y -mascher ano -k vy -iy i -hong bin -flutter shy -chi i -ay go -y amaz -whit ford -un welcome -si yak -scri bes -sad lers -re imer -r cr -paw sox -parale gal -my picmix -moo ts -kirk caldy -k rum -ische mic -int z -gui da -gh es -gb w -fransch hoek -finn balor -east on -blu ish -atthe disco -âľ īï¸ı -ye huda -wi jn -wag ging -terri er -swar th -state champs -star fighter -schec ter -sas soc -pod casters -omor phic -ma dy -ine bri -go pack -de tv -d xy -cra ss -chag rin -bur den -ay m -app soc -al haji -z wolle -theore tically -tel ford -ri bera -problems night -po lis -mel ind -ish an -indi anc -ga ana -food allergy -equine hour -dream z -bi mbo -alou ettes -wal dor -tri angle -ste k -ra imi -qu ell -nieu we -nickelodeon tv -mohabb atein -lot l -liech tenstein -ir p -gu stin -decor ators -cl ack -bha ira -y cles -we music -train wreck -stam kos -sar tre -ru h -remin i -pizar ro -mu scul -liven ation -jazz festival -il ence -i ffy -constitu tionally -b ld -ìĤ ¬ -åī £ -stra ppy -sever ing -priv y -oo zes -nightw ish -hom ely -grin nell -fantastic four -du vernay -ce ts -ay den -ar pur -apar na -andrew smp -wyn n -vet med -town homes -tips for -tat oo -ste t -sa iy -rock hampton -pro choice -pnpd pcr -organd onation -n ago -meg ali -k po -jan ef -i mex -het field -gen et -free diving -fis ker -fe tu -ep n -democr atically -chap book -cas sper -carto oning -betra ys -ðŁİ ± -west bank -vis es -som ali -sivakarthi keyan -sc athedral -reflec tivity -postgre sql -o fus -no da -mu kh -mitch um -m fab -hyster ically -gi ano -force ful -debun k -cru ised -cic ely -brain washing -ak aran -ab ul -rash tra -pneu mo -oun tain -manit owoc -lo ic -it all -ik or -id n -hu ppert -gg gggg -z ite -thir st -te an -strang led -peanut butter -pc gamer -lo ta -kurt busch -ko stas -kib ben -jer main -gab bott -yas u -t pe -ry and -platt sburgh -nicole scher -nb nnews -mr james -kauf mann -it san -get outdoors -gam on -eugen ia -car man -bon heur -anti polo -ðŁ¤¦ ðŁı¼âĢįâĻĢï¸ı -âłĢâłĢ âłĢâłĢ -ÙĦ ÙĬ -ut as -super man -pickle ball -optimis ed -les ford -ko tt -journey man -gra bber -co inte -bra eden -bj s -atur k -ad ler -ðŁĴĻ âĿ¤ -won ga -wi er -wartho g -tribul ation -tan ker -stan for -shev chenko -regar der -r int -pun ya -nab y -mill ican -ha er -ev alon -dwar ka -cyclon enation -boo gi -blu ed -tra vail -so aker -plainti ff -mar kh -loreal paris -kovac s -fis ch -di ab -brew master -az ole -rugby worldcup -ny lon -nat t -jas si -igu anas -flap jack -energ ised -ed x -buccane er -baz ooka -ati l -ar dee -ðŁĮ ¬ -wil mot -the stage -super massive -seva sto -sc rit -river trust -podi ums -part iti -montag ne -mer chan -meetthe team -loubout inworld -kindness day -heb den -dur kin -cynic ism -cape x -ag ulation -abid jan -ðŁİī ðŁĴķ -yo sef -un avoidable -sting y -soyl ent -shar am -re using -offic er -mend enhall -je eves -hi day -day soff -bay swater -ban ned -ative art -april fool -apple wood -app easement -allelu ia -tri o -trax source -ss mb -re publica -raz r -p ingu -ouri er -mcgra th -magn ac -k mph -irrit able -ing roup -harvard med -hak una -gre nad -ero se -ed clv -door steps -counter terrorism -andis les -à¹Ħà¸ Ķ -whiterab bit -wh ill -vad ra -tooth pick -te mber -suspen seful -shar pens -natchito ches -minute men -mick y -mer ge -libr arian -laha ina -jugg ler -james on -in ker -gen x -fin de -engra ver -chi yaan -amon day -aband oned -a ami -twitter clarets -ter baru -spen ce -shav ings -sf moma -par ke -id ly -grena dier -bu ko -ðŁĺĥ ðŁijį -ðŁķ ¯ -tuesday trivia -ro el -mul la -min ami -luf kin -heart s -gine tta -g ff -dise ased -cute emergency -cor dell -christma sday -cer ts -authent ically -ap ta -am stel -wilber force -was sily -var am -se daris -naz ar -mori ah -kis ser -k ba -high heels -hh s -give blood -ging ers -eti salat -ener gie -dopp el -dex perience -cole gio -chester fc -bha iya -ag l -we w -stu y -ss ang -sal ento -psy trance -pan ko -paign ton -im pt -hoo se -goooo ood -erink rakow -design boom -clon tarf -b per -afc cup -abhi shek -wether spoons -ventil ator -tweet deck -stap ler -pow r -plo vers -nur i -northan t -mc garry -ma ur -lang ley -kla ine -justi fiable -habitu al -g soc -fin est -extre mer -exc elling -en coder -eil ish -duc kie -bon ucci -bct gb -si bley -red hat -philharmon ie -pe cs -mete o -m ound -liter acy -io ka -i hr -hyper bolic -happy holi -ess er -con temp -cau cuses -bm th -ym urray -when in -tw irling -sex ting -scar ring -ru den -ru bi -rom ney -ridge back -ok ka -off ends -ny mag -kla ge -fix ings -excav ating -digit isation -am alia -zam fara -w kc -unc aged -tele tub -purpose fully -mex po -mass governor -kha di -cor neal -bin son -allot ments -abur ro -âĿĹï¸ı âĿĹï¸ıâĿĹï¸ı -wicked ness -vaj al -tw im -tt weet -tru es -tan jung -sin ned -rain dance -priest ly -pra e -p fi -non sensical -meta irie -le omin -ha ase -g nac -eth ic -dou gi -bucci gross -bre y -a etv -/ = -zu bair -zephy r -vo id -un ed -sc ani -sav oir -recom end -mic ho -mer ch -lo cum -jun os -instagram mer -gago sian -eri ous -cau tions -best photo -an abolic -ag ame -âĿ¤ï¸ı ðŁIJ¾ -vol ks -up vc -terra zzo -spl icing -rte one -mc cray -g pm -emoun tains -east lothian -du bz -dmit ri -den ning -c sic -blood matters -baku gou -arame tta -al pa -âĻ £ -travel chat -tayy ip -su et -rebutt al -prote a -pontypri dd -pi ac -per d -lu ker -hypo allergenic -haha haa -fun friday -elisse joson -at rump -tom maso -slo ver -on omics -metz ger -lor ca -lek ker -ja ipur -inf ood -gl ent -full metal -cucam onga -cu taneous -cp as -coron ation -cal abre -bul ging -b ko -ap sa -* -- -yo ta -wo ke -util ised -tin cture -rhon dda -pc f -ngay on -mic hi -margaretat wood -ld i -hi ther -guil ds -cleve don -bank side -af ans -- >> -vers i -v ld -under classmen -tri an -te v -stone bridge -smi ley -rinse fm -real me -re affirmed -pla st -oo dyssey -nei stat -medalli ons -mc kibben -mbe ki -hashi moto -ha zzard -ha ther -ele y -ak ko -af ashion -western sahara -villeg as -su man -nor e -monte cito -mari bor -m ch -em watson -bu la -bas sy -bar ratt -yorkshi redales -ware ham -v pd -selfless ness -refil lable -om aker -mb l -fear nley -ea b -de marc -che quered -br ze -ame ga -." -- -yar mou -x series -ri gan -pig mented -patrizi arametta -pa ppa -of ah -mu cus -lets gor -leader boards -eff ingham -drive ways -dragon sden -cl n -cit ron -chi esa -bron wyn -brack en -bl v -are id -ami stad -ae oli -ae com -а к -wax wing -sz abo -openg olf -o berlin -mac ul -inf omer -ho de -ge ert -encapsul ates -cro mpton -con centric -bil le -bc jr -as gar -aired ale -usa a -tra gus -to pher -reed timmer -rare books -per verse -mo star -lom an -ll m -je p -ir ang -fi br -f mg -e ir -child line -book challenge -bon o -augu stin -at night -anup am -ðŁĺ² ðŁĺ² -what sup -u avs -t ittle -sw amps -st petersburg -so shi -mar ni -je je -inde mn -humili ate -do ped -cate chism -bur bs -awkward ness -ðŁĻĬ ðŁĻĬ -ðŁIJ¸ âĺķï¸ı -âľ ĸ -world league -vi di -theatre day -tal is -t be -sterili zation -shaf er -scal er -plan ar -nhl ducks -mapple thorpe -get covered -esopha gus -em el -cir o -braw ler -bottlen eck -ðŁĺį ðŁijį -ðŁı¾ âĢįâĻĤï¸ı -ಠĤ -Ø ² -vin eland -thr iller -side burns -se cours -pit ting -nu tz -nj pw -mogu ls -mee ch -ine a -houston dynamo -grav ure -gor ba -glyn de -fri en -daw are -commemor ations -bay max -ðŁ¤ « -xx v -tran quil -th um -spad ina -sol ly -mo ti -metast asis -mapu to -len se -im on -hilde brand -h sj -fur man -etsy finds -esmer alda -e goti -d fo -cham a -bri el -bor dered -ðŁĴ« ðŁĴ« -wido wed -thro bbing -themo in -ta it -synchro tron -stand er -skate boarder -samu ell -pa ire -free town -csi ro -ber ners -bar buda -squ ash -so well -raf ter -rad ine -oregon ian -northern most -mo hic -master fully -jar on -inter sectional -hass am -fla grant -emce eing -captiv a -buck led -ze ki -ye oman -welsh rugbyunion -tur ney -tam aki -stro llers -nn r -merri am -lien hardracing -hi pp -ev ander -ers burg -erik sson -cn b -bas ker -aphra gm -the year -stereo typing -sensor y -rovani emi -lo gues -kre mer -four teenth -bri ann -bow ling -bio logically -bang z -b har -arch uleta -a et -ðŁĺ ¿ -ðŁĶ´ âļ«ï¸ı -swit cher -se gre -ne da -mountb atten -la dle -catar acts -b cl -varieg ated -sou d -she is -rad ars -mistre ated -mc cal -gam el -g pab -conte ssa -chri sj -che ques -ch saa -bun nings -ambi ente -~ < -ye ol -under mined -trans lat -or to -ol oughlin -off load -neuro logist -mu ba -men ong -m cre -letic ia -iz u -hence forth -gai ther -e ws -cer berus -car ia -boy george -ac entre -zen o -w ür -vanessa hudgens -sushi l -pla z -ma za -kar dash -di va -di aphragm -cloud appsoc -acci dently -ðŁĴ Ī -Ø§Ø Ń -sw illiams -stie boys -sterling silver -si xx -s bee -re td -northyork moors -min olta -migr ation -ma shing -ma sam -lo ach -indiedev hour -ga is -ep al -ec l -bye bye -bic i -at elli -asen sio -anti o -ala stro -à° ¤ -un ir -to asts -specific ity -sma sher -shop keeper -ram ada -oni e -n ph -meet s -lular oe -li sto -kaf tan -j mi -fon tan -cardiff uni -bur ro -! ðŁĻĮ -vigor ously -themoin montrose -thel asto -t sang -slur p -sed ans -regre so -mun k -lar ds -ha sil -fra p -flin ching -dragon s -disappro val -del aire -chu cking -be coz -anarchi sts -ðŁĵ¸ :@ -wic ke -v axx -tex oma -tall a -summ ers -su si -ro wy -provoc ateur -pg achampionship -oko toks -o tv -magick ingdom -khome ini -hs sports -here tic -happ py -h ito -gbm fg -de paul -come di -coffee morning -cannon dale -bra ini -au robin -till am -plann ing -ph ir -panic atthedisco -mc pe -kanka kee -ful tz -fm radio -dissatis fied -con gru -bat ors -ambro sio -adol fo -acom be -æĴ ® -ãĤ Ī -y ona -tri as -to yn -thefuture is -pen icillin -os lo -mt gs -menong autham -med tronic -inf om -her ve -gau l -essence fest -blackveil brides -amas sed -aficion ados -aesthe tic -wo de -wal lop -ts d -thermo dynamics -school games -ram dev -pal patine -hom an -go vind -g va -fe il -el v -bjor n -av u -aaa at -ðŁĻĪ ðŁĻī -twin cities -tri alling -si ue -relax in -rapi de -kal o -gover ment -gl ick -fun fair -fick le -e ed -dre vival -che o -bull terrier -berk lee -ðŁĩºðŁĩ ¬ -çµ µ -tr yan -substan tive -sol heim -sh into -scotland hour -s oooooooo -ro he -ril ke -pro mi -nam az -mini figures -fraud ster -engad get -bb b -aperiti f -... "@ -$ - -ðŁĴ¯ % -» . -west cott -smo sh -odd ball -mee ker -la wards -hacken sack -fr act -fer menting -fac s -er rant -call the -buen os -broad ening -bar bo -afl w -ac sa -⾨ ðŁĴ« -woo din -ton awanda -sin ise -re ka -mu rad -kl is -ingl és -ij f -ham els -gre gabbott -f mp -egyp tair -egor aptor -csgo giveaway -contrac t -bar nes -together stronger -su ze -slo tt -rani al -lamar cus -hick ory -exploren l -beach club -yy ccc -sw all -suc on -storm chasers -sound scape -objec tively -nov ich -ni kel -neur onal -me aghan -manny mua -iber ico -fer ty -fa thead -dol lywood -dareto dream -d jen -cr pd -courier mail -baon pdx -vi vre -thomas rhett -seal ant -sa arc -qu asi -pac o -macken zi -k ole -john lewis -head rest -gn ini -generale lection -ben affleck -zul fiq -tac om -spel un -run dle -pr ana -la pped -kni ghted -gold fields -can oe -bellar ke -ba hr -amo led -acro ix -willi ston -wen ch -vig ny -ti the -se cul -sad r -pick ler -ne pean -may r -karrue che -is sf -han solo -fri zz -flood waters -fari dabad -dar ya -coden ew -cell ar -batchel or -ar co -ak t -* ... -ðŁijıðŁijı ðŁijıðŁijıðŁijı -æł ¼ -we will -un ch -sni ped -sat yan -ren fro -re ena -rd ma -ra am -iti ative -hear to -h mong -ght me -cine max -bon obo -atta ches -af tab -) âĢĶ -ðŁĴļ âĿ¤ï¸ı -ðŁIJ µ -âŀ ° -ç e -we gian -vin i -trans continental -tear down -tar as -tam agot -semb lance -pet care -notre ally -money maker -lu can -jazz club -her tz -great barrierreef -dec can -bogot á -a az -ï· º -twili o -tug boat -top brew -se ren -santac laus -roman empire -pr ite -pay outs -n sg -n att -gun d -bon nies -back woods -ante tok -an kh -ali f -able me -ver dic -van camp -tynd all -se vier -scele bration -ro darte -pe scat -par affin -kir wan -isi dro -io sa -hun chback -gas quet -fl it -el rod -cott ag -camero onian -buck s -at wain -ðŁijĮ ðŁijı -ðŁį ħ -sunrise on -shen hua -r vd -pr yn -on side -nom i -mour n -kno t -kha l -iri es -independi ente -guer ri -ffe t -cal lo -ðŁĵ Į -âĢ ³ -sj m -s inter -recipro city -pir at -pi do -nuclear ban -nag le -ingh e -golf club -goldman sachs -geography teacher -g mw -g inge -fu g -france sco -cor bis -cli theroe -bas co -alta ir -al of -ag over -tu do -tam per -ster il -say s -ri ss -pr unes -l ck -in decisive -guide d -gou lash -gold schmidt -geaux cajuns -fo is -dr ona -ct x -anup am -all things -achri st -ðŁĮ´ âĺĢï¸ı -ãģķãĤ ĵ -ve taffairs -sar is -qwer ty -ore illy -mcgu iness -je c -ir lam -h vac -for an -follow up -elix ir -clau sen -bram all -bighit ent -baum gartner -y mm -van ce -ta pur -s fa -pre ity -mach el -got g -dess ert -client ele -br una -bo ylan -al td -spy der -spirit week -semper fi -re developed -r ko -pre face -mc adoo -mal kovich -m mu -kanan askis -iw obi -ell yn -dream ville -dick y -coo lio -char maine -canal rivertrust -brown back -brac ed -a ena -tal kin -sw ot -si raj -say n -ryan gosling -ole um -mil denhall -ka dir -gram m -eng ined -dont try -death bed -cor sets -close the -aro or -amaz ement -al akshmi -é u -upp olice -tem be -stev o -scan lan -reco de -ma pper -lux e -ke yn -hr v -horror story -flaun ting -em s -dor je -dignit as -dar ul -chor ley -chav o -b hoy -ar us -ac ram -ðŁĹ ½ -uof cincy -universit yo -te aday -sal k -pin kerton -mc all -man oa -ma kat -ke wl -it x -ili us -ibu profen -go el -gi glio -f and -bau mann -bastille day -un balanced -ter rence -shot els -row ena -ra she -pein ture -moham med -mis sc -gau che -daniel son -cud litz -counter act -ca vern -ah soka -after show -wh ot -unner ving -to ko -sho pe -rise of -red friday -pobl ano -noble sville -naturema pr -mam malian -ma goo -know le -jam shed -go k -fo wl -dh ana -dand elions -cu ador -colleen b -co ba -bug ti -au guri -ap ad -am be -и н -vin ton -to vote -sentim ent -red chilli -rar itan -ra quel -min ter -kore atown -ha bl -final ise -fa ison -engra vings -ab at -éŃĶéģĵç¥ĸå¸ Ī -yo gan -x anax -we er -wahl burgers -town ships -stra gg -ste er -ste de -sel ive -my st -lu des -liv onia -kite boarding -kemp inski -joy fully -j hu -ig ner -go har -centr ic -bri bed -bla zes -ag rit -ver mon -u cle -sc ard -por g -plex ig -no plac -man nion -j abo -i aff -crest wood -co org -co horts -cla dd -can ard -bi kel -bannat yne -ban n -ðŁijĩðŁı¼ ðŁijĩðŁı¼ -zi ers -yesp lease -su fi -spell ings -quar ant -pa di -ki ff -end gunviolence -e ggers -con signed -ce au -brum bies -brit o -aldi uk -ad sor -abo lish -win itwednesday -thre elions -tech ies -snat ches -sei ze -pu is -ol mos -min chin -mce wen -mar ner -malam ute -made myday -labour day -da ar -cott age -ban u -ak land -ðŁĻĮ ðŁĻı -Å § -the wine -shuff le -s map -road work -re defin -mud slide -leon ie -head waters -hay don -clyde bank -cas in -cardiff cityfc -ber li -bar bour -au ston -ab us -ç Į -yi k -wa pping -sun der -scen ter -par snips -no bby -jen i -icom be -hpm kt -gla sne -ga han -fre ier -co is -bru baker -vis ite -te sta -te flon -roman tically -my c -kir tan -get some -carry on -asian et -_ â̦ -wat terson -waste management -room ba -red ick -re mou -r team -prince harry -pr ca -post ings -new mexico -net galley -mp loyment -mil ano -cry ing -cd b -á´ ĩ -z ang -weather proof -tang ling -strat ford -sleep out -shown u -nir mala -n krumah -mon iz -lan et -del onge -box ster -bij lani -ag upta -a quar -yoon min -win the -un afraid -ug ent -supervis e -sn u -shak ib -sal taire -ru sk -pre fabricated -pentat onix -pe ston -na stur -l pin -go dal -faith full -enshr ined -crusad es -aldu bb -al ok -whole meal -riz in -re dri -or ta -nutr i -kelly file -gen k -farm shop -erken ci -du ffle -dev endra -ci gn -bc ity -av ram -ale u -ye ung -unic ycle -sp rang -si ones -ri parian -plu ton -pierce the -pha sing -od dest -non o -natur alized -n ls -my favorite -k ran -ic bm -hom i -gro cers -gov christie -four some -fl keys -d ally -ayour b -yor g -when you -tw ang -ti als -r tel -nationalbestfriend sday -mcgu igan -kath i -invo king -ev ading -dor tiz -col borne -bur qa -balu chistan -and proud -am ba -adidas uk -âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢ âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢âĢ¢ -uk is -tra ore -then fl -quarri e -origin ator -om nis -m gh -knare sborough -it d -ho yle -donat ella -cho ses -capit alization -are pa -ar ua -un cann -twitter afterdark -over the -ley va -le ggy -john wick -her pe -ev ora -der mato -a wat -ðŁķ Ĺ -âĿ¤ï¸ı ðŁĸ¤ -ภ¿ -wil ted -the tonyawards -sig s -sha hr -sel leck -re van -pan eling -jun ket -id g -gol dent -gaz ian -don gle -car fax -at w -| || -wheate ar -whe ein -tabletop games -speed way -solic iting -shk reli -ser ia -s ann -pol anski -on ara -iw f -indi st -iam nagarjuna -gre ville -fan zone -ee ek -do vey -bhar atiya -astro turf -antetok oun -amazon music -all saint -al amy -v ora -tv t -sy fy -rob ison -ra zzle -pli skova -offshore wind -no id -nain ital -ma dog -inter reg -il bert -hot elier -gu gli -chri shem -chas ka -ath om -and om -vo st -ter p -sun tory -summari zing -stor mer -steve jobs -st x -sc dsb -po tre -news boys -mc crae -luc ite -it at -excu sable -daz s -colon na -b andy -war game -w ans -valenci ano -sa chet -phx traffic -phila union -mumb aim -mar gret -fon dation -explo realberta -defe c -david caruso -a egy -ðŁĶ » -미 ìĬ¤íĦ -vir gen -ren dra -n ack -mon deo -live the -l sch -j lt -di ka -con dors -berry man -anc illary -acor n -о ÑĢÑ -wythen shawe -tobe apartner -tai z -street light -star lin -si u -pro sser -ph is -on track -m wh -humanit arian -travel ogue -trans duc -theop ap -seman tics -sat work -sahi h -pas schen -nik ka -narra gansett -na thy -man ado -m po -l sc -kcap inoy -kcapinoy star -i dd -ge ass -g onal -fair field -d alia -clean up -chor ong -ay ang -yn n -x fm -wil a -ren dez -ra vish -qui ff -puppete er -nat asha -inst on -fi f -e star -do shi -cu zzo -corre ia -cole man -annoy ance -.. ðŁĺĤ -á l -wi ps -try st -top chef -spoken word -sel ah -madel yn -lg fa -give me -e wood -don ington -ci gna -chry stal -calic ut -zimmer mann -tre et -spon tane -sour is -sag et -palli ative -mo jit -htafc dotcom -dre yer -dev ore -cycl o -cor by -bey hadh -banque ting -aber ry -ãĥ ł -wo ong -tess er -ss sssss -shop boys -screen caps -sa dies -obliter ated -ni as -mel ty -knock down -ka ji -ep f -din i -british council -ðŁij¯ ðŁij¯ -ðŁĩ®ðŁĩ ± -ðŁ¥ ĥ -wu v -un opposed -sw enson -stu ffy -spee der -raw ford -r gc -prayfor gaza -pg achamp -p nc -oni sta -mtv la -military monday -k he -fiel ded -engagem entr -en amor -cas sell -cad res -arund hati -.. ?? -⼠¹ -war ks -ver ny -theopap hitis -subtle ty -stat us -spro blems -spin n -simu lators -sail boats -rais man -oc are -mw angi -london symphony -freddie gray -con way -class act -bebe rexha -air bender -u yo -the music -re did -queu eing -leav in -kitchen rocknroll -hau d -glo ck -fe ile -be vy -bass master -barretto julia -band on -abar ça -a ep -¨ ë² -z ko -we support -trol leys -transcend ence -tal esof -silver lake -sharp shooter -schwe itzer -real gdt -oh yeah -life blood -king sme -heart attack -glori etta -extre mity -cro y -com motion -collu ded -col fer -checker board -cath ay -buen dia -am uses -aa ahhh -. ðŁĺĺ -ðŁĶ ľ -wo hoo -twitter vforce -rot ates -qu els -pizzahu t -pan tai -or me -man gesh -happy saturday -h kg -ge station -communic able -coast lines -âĺĨâĺĨ âĺĨ -y ooooo -thiru van -steve austin -ni azi -gg anu -em w -d itt -buff ering -am ma -ðŁĨ ķ -wha aaat -vs gb -spe ight -re sis -m se -j ho -ib aka -fro ot -evalon goria -din klage -bio hazard -beli a -ac as -ðŁij ķ -Ð º -tw r -sysad min -sun burn -rrrr rrrr -pr ater -kyush u -go by -consequ ential -come together -beÅŁ ik -bab b -annak endrick -ðŁ¤ ĸ -x rd -too good -seal er -re ira -ra ut -pet tit -own tv -ol ler -mountain dog -mis sp -goodbeer tweet -european union -efur niture -dra dio -disc ern -call ous -âī¦ ) -ut mb -spur rier -soli der -or bison -od g -mic a -ktn kenya -koep ka -ic ca -gau lt -g x -g dn -for ts -fil mawards -eu tical -ea g -dier ks -cannabino id -bul bas -;; ;; -ðŁĸ IJ -vit toria -up lift -under writing -sne ad -sn ell -re distribution -p do -no akes -narayan an -j vc -gram ophone -franç ais -ell ery -convey ancing -bi ked -aw we -ab ulous -wan te -sh wara -pay son -lu mumba -lifeat att -le ics -iron fist -gr int -figh to -copper head -aqu are -ÙģÙĦسطÙĬÙĨ ÙĬ -we make -t ys -qu t -play as -off a -ne revs -must apha -meta physics -mammoo tty -legali zeit -jun oon -jan n -flatt ening -du ral -cam a -bub ba -antand dec -actu allyn -aar ons -ðŁį § -á IJ -wi zz -twin peak -sle wis -parishi oners -oak ham -mai du -jessica jones -bay town -az s -ates sen -anc ing -ðŁĻĮ ðŁı¿ -ðŁĺĢ ðŁijį -ঠ® -ske w -fi af -da sha -cladd agh -bino cular -bal le -az ria -v ented -ts laq -sn m -pen chant -mod ality -gand hin -frivol ous -del am -cc na -ang an -am os -alente jo -across america -y ore -twee ter -the clash -ny lons -needfor speed -mag got -lion king -har id -h sieh -fabi en -ul hassan -ui design -ste vi -sl ats -retwee et -radio graphy -por poise -man cuso -lap wing -ki bble -gram pian -fai ers -ec nl -dun phy -disney pixar -de eney -ca pote -ðŁ¦ Ī -Ì · -v int -tyranno saurus -tu gal -sw amped -su strans -small town -seag al -salvation army -ready stock -kri ders -hen an -groom ers -earth lings -ce da -bom i -actuallyn ph -vand al -sch rö -polic eng -nbc blacklist -mul ca -jack johnson -eeee eeee -bri elle -brazil gp -b ages -woo gie -wat tle -ve ley -tede schi -tape stries -stain less -sb s -pri yad -parish ilton -nam pa -mor rell -melo dic -kam o -impro ve -hill climb -eur or -dev ant -dal umni -chi ellini -al chem -ak ashi -vote trump -steel heads -six pence -po wn -offici ated -new yor -magnum photos -lin dy -la yed -int ar -immortal ised -hall fame -f hd -cor dy -ba a -ar ru -ðŁĵį # -âĮ Ľï¸ı -tt b -ra pper -pier cer -pe m -nomin ates -marathon training -le vert -kodal ine -el ford -e gl -doyle stown -ay re -as suring -yo tu -vel lum -up sers -tg f -supple mentation -phy sorg -never stops -mean est -maple story -kid dy -incu bus -goav sgo -fic h -cot illard -carmelo anthony -c ny -c me -az pi -âľ ° -suf jan -sneaker head -sher if -sa har -rum mage -rub instein -remitt ance -rail a -phant asm -onyour side -mccut chen -main streaming -it ag -hoss ain -end or -de briefing -cou ros -boo tie -bharat anen -baesy stem -aud ited -am un -ðŁĨĺ ðŁĨĺ -ঠķ -v apes -superannu ation -ry anc -rec ourse -re working -pom pidou -pok hara -nma ahc -equip ments -do ha -cham bray -ba ste -year lings -vap ors -tom kins -tom hardy -san s -quo tes -pixel ated -mur tagh -md ma -mau led -erec tile -dd j -brah man -blood stream -alway sin -ai kman -whad dup -un authorised -topbrew stues -sea horses -remitt ances -ra id -play ers -lee son -joh nam -ipan ema -dust bin -devan te -ab hay -! ðŁĺĢ -un ni -tar heel -o jib -mal lett -machin ist -got chu -gb l -e ish -discrimin ating -bc d -az tec -avi c -ðŁĴ¥ # -â̼ï¸ı # -wool len -timm c -sun se -st oughton -sethro gen -ro tten -ro sey -over lords -night shade -mou ld -min c -mi ele -line of -lifeli ke -glut tony -fla galine -fan made -e art -destin o -desc artes -bun dy -artist as -we bradio -ty agi -there in -su si -sp rit -side by -ro isin -pt bo -pro bed -passchen daele -n ich -man as -jor dy -gwend olyn -far rington -ef ury -eamon n -cu v -buzz y -ut tered -t ally -surbhi jyoti -stu m -shar an -q v -pre tender -ji kook -hol ger -gh is -co axial -che wie -blue moon -ash bourne -up cycle -tes acker -sy monds -silent film -service design -pre go -pa wns -one ttes -nc ss -monmouth shire -lum ley -level led -fun nels -flint watercrisis -flick ering -edel weiss -croke park -cloud flare -cis neros -b appa -un protected -sp anned -som in -score sheet -look outs -libr ar -jen der -jas am -g land -french open -disclo sures -az ura -ðŁĺĬ ðŁijĮ -ðŁijı ðŁijį -wel a -vit ra -spine less -my way -le anne -lat ics -kri ssy -k va -inge sted -hu bris -h me -furnitu redesign -f md -discre tionary -d mm -comple to -bc sm -balo gun -womanin bizhour -som mers -pd m -ol um -o sho -ne en -mobili zed -me gas -incess ant -gu aj -ga th -fa ste -ed un -col lies -arche type -ad us -ç Ħ -yo yo -ul lo -re wilding -mac ron -m peg -kk un -ji ju -for senate -er ud -edi son -com ey -ðŁĵ± : -æ Ģ -un worthy -talk ative -sc rolled -s ment -rainbow six -pin up -p tv -nc w -hager ty -di xie -cor delia -coles windell -ch ito -c pim -ali ef -ðŁļ ª -âľı ï¸ı -âĢĶâĢĶ âĢĶ -x ss -ww ltv -tv l -sel van -ra gini -ph ore -par ry -o show -mar ref -mam aya -high field -fis ch -e amad -dg allery -dail ye -ck ont -ce ce -buon anotte -be ary -ðŁĺĤðŁĺŃ ðŁĺĤðŁĺŃ -sw ope -snow drop -sin dhu -pet worth -mur row -mou st -manife stations -gra dation -gorba chev -gh ul -fc dallas -euro trip -dw b -dom ic -datasci entist -ali sta -ac ps -ðŁij µ -ve mos -tur nar -the first -su var -nord ics -dizz iness -dit ko -complic ate -come on -cogni zant -citro en -am ory -ðŁĩ®ðŁĩ ¸ -z ela -y are -super fans -r ry -meas ura -mari ok -je ux -green newdeal -gi um -d zeko -bicycli st -approxim ation -appli ed -actu ally -ðŁIJ Ķ -wwi i -under lined -so ty -slur ry -sho ta -scol ded -o ona -no ord -naturale za -loveyour self -kim ura -hack man -go sh -dru mand -de jec -chri sco -cel le -apr ile -ad ot -åĨĻ羣 好ãģįãģªäººãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ -un provoked -tt ps -step father -sen tra -ro hini -rabb a -personal isation -mirr oring -mc mullen -lun ges -lat itudes -koon tz -kevin jonas -jimmy johns -forzam ilan -car bons -ach enko -ye sh -worl dd -war sz -use fulness -su pra -sol as -rapp el -mo sth -ki is -im bec -efan dom -drou ght -co ax -bur saries -black bear -best oftheday -ar up -ðŁĴĸ ðŁĴķ -woo commerce -waist line -tr ini -super liga -recur ve -ra ho -nj ca -nas r -mesmer ised -mer tesacker -lu ce -j illi -im mobile -de commissioning -bo ta -] ... -vo j -tibet an -sponsor ships -sp ad -roger scup -re filled -pune eth -olivier awards -nether land -n whl -kil kenny -kedar nath -kap a -ha shem -follow train -eth yl -dar my -cr ps -bay ard -wre tch -w mag -super girl -su an -prece ding -ni uk -multi faceted -mali ka -insp i -fr b -emble matic -cap uto -bur ren -xim en -ul ta -smo key -si zable -remain ers -mesu to -men zel -mc daniels -is kandar -fuel cell -fron ds -bu xton -ari ba -americas cup -am iz -ðŁĴ ² -x is -ur chins -sur fl -sn p -see it -or ra -nf örde -lat ex -kre m -ir v -hel der -fore t -ecker nförde -drum heads -car nal -ðŁİŁ ï¸ı -whati f -vas ili -succu bus -s wales -ret ford -mon di -ma ina -lun ge -la shed -indie wire -gla sper -fresh eyes -forec ourt -fan k -don n -disturb ances -denomin ations -boy ish -arav ind -( âĤ¬ -⼠Ķï¸ı -whe elie -u plands -scru ises -pet s -me chat -mac am -like mike -lgbt qi -jo li -ido sis -iat se -he di -er oo -eamad den -ê¹Ģ ìŀ¬ -ste ered -rh s -pop sugar -n ape -mun nar -ling field -leban on -lan te -kend ricks -jelly bean -igh ton -ho dder -gor ky -give sback -dayin wa -cor tic -c caa -buzz ards -ar awa -aaron rodgers -ãģĵ ãĤĮ -yearsof onedirection -wood wind -true to -sal inity -re sin -pl ural -nor cal -liz quen -kay ne -gu rion -gi org -gallo ps -conti go -chil de -car issa -ye oh -win ky -w nu -son parade -show case -sho walter -ru ston -nicolas maduro -newarri val -monster mile -kumar an -kad ri -jim cramer -gu lab -gravity falls -g chq -esper ance -cur lers -chamin ade -brad field -travelchat sa -tor rens -rh swis -ree se -mal vi -lof ton -law firm -kp cc -it ab -fer i -el lum -diversity and -counter point -chrishem sworth -chaplain cy -biz journal -bi sp -bi elsa -at cha -assur ances -ak ay -aer lingus -ya yoi -sode xo -reme ber -ord nance -or ation -lin donesia -jo sey -hast ily -go pin -fan atic -el oun -depend encies -comp ounding -az aki -al wefaq -ðŁĺī ðŁijį -ðŁį Ĩ -venkai ah -stimul ated -pp act -pmr outine -papp ar -mel oni -mc gur -j itters -it sc -harsh ly -ham ish -el ca -dece mber -de wy -copper field -bha kt -be more -apple seed -all yn -aby smal -ðŁĺħ ðŁĺħ -ys sen -tu q -to ei -thor ax -se din -sar cast -po way -or se -jan asena -cityo flondon -cat lin -car lie -bie bs -bc fc -ap y -[ !!!] -:- ))) -trav elling -raun chy -pim ped -kat ja -ju tland -h pl -first day -crew life -colla bo -che ong -che chen -bl ink -bernab éu -ban c -win x -ur gent -tul u -sof c -repri ses -pe pin -optimis ing -gau chos -com bo -chang wat -bo ca -b dm -audi sport -ðŁįĢ ðŁįĢ -é« ĺ -white house -sav in -r so -p bo -k de -illi brand -g sr -conver ging -conduc tion -adequ acy -ab ane -wood all -tha ic -tant alizing -soren to -satis fies -rush theband -rhyth m -ner c -ma ilers -jin hwan -exem plar -en acting -dar r -d ars -ball o -agr itech -ðŁĺı ðŁijĮ -wide body -u ow -tur ley -sab u -red waver -perse us -out do -nam c -mm el -las z -kne cht -interne tradio -haw kn -ey fs -dur bar -aegy o -. -. -w awa -venkaiah naidu -sure fire -stone walluk -ru slan -royal enfield -pollu te -natur alization -mo oning -li otta -iow ac -he yer -eli ver -don th -cal ma -bri anne -am ission -action news -vish war -treach ery -talk back -sav chenko -ri pon -pur vis -no e -mne monic -kol kat -k oni -johnny cash -jam el -gall i -fer nie -extr alife -eeee eats -dom ani -dann er -cy b -bel fry -ðŁİ ¿ -zil djian -yam aham -tur lock -to play -si sa -rho c -passiv haus -paratro oper -ju ara -insectic ide -fat boy -brigh ouse -be cket -ao e -wel lian -tim tebow -thegirl gang -su c -sto watch -sp iti -octa vi -jen g -jac aranda -improvis ing -hoo doo -gry phons -fri t -be ane -ðŁ¤ Ĵ -yo ka -wo gan -witha view -un controlled -tw oman -ti z -thereal taraji -rams bottom -ra bles -pen ce -pe per -mi hal -man ti -mal to -ja u -ig ar -ice service -hosse in -gen italia -g age -fascin ator -baz os -abyss rium -we bex -viole tta -une lected -un ashamed -sor row -ram akrishna -pe f -pay a -na ev -mor gon -l th -j iri -f sp -ethnic ities -elle magazine -co leg -ali bab -ëª ¨ -⾨ ðŁİĤ -up fronts -stoner nation -stack house -retali ate -ram apo -preity zinta -osc illo -n pc -instam ood -in ck -hun ks -hi b -fluor ite -disc losing -br g -appropri ated -amé rica -y pe -way anad -vi ñ -v le -trin kets -to to -syn bio -stru th -se wed -r ce -pain killer -night mare -loan ee -implic ation -guer in -fi i -deb out -dal le -clut tering -astra zen -as saf -afric ana -# ## -ðŁĩ¨ðŁĩ ³ -⤠µï¸ı -tex turing -steel workers -star man -son n -scho on -roo de -nit in -mi ah -inten ding -happen in -hali m -gun fight -ge ffen -de pot -che tt -am sa -ðŁ¤£ ðŁĺĤ -yess ssss -sha ina -scen e -sb spop -rol lin -penand ink -our n -ok ami -mer cure -me thu -mari ya -en closures -dmn takeover -athle ta -aggreg ator -wash out -sunday sunsets -re watched -nr cs -ma shi -lynd sey -k adam -ik ka -i sen -gc n -fl un -ent wi -discipl in -antic a -. _ -ðŁĸ¤ ðŁĴĽ -vit is -ur laub -trans at -tra inee -tom petty -the powerof -next generation -mo is -mac er -liam gallagher -lev elling -k aga -int ell -gh ard -dol man -cu ten -cla ves -cam ill -bur well -ag ia -accu sers -à´ ķ -zak k -yan cey -wi jaya -w rest -ven ables -te sonline -sha z -se gal -ri r -pin us -phone tic -nor s -natgeo wild -le asure -hi an -ham mar -goo gl -ga den -el che -cab ot -bu lova -bah n -an agram -agency life -ðŁĺ« ðŁĺ« -u ña -tro wel -tam im -se me -pap u -mfab oston -marin as -ha de -evapor ation -com miser -bor sch -bor ja -yo del -toho ku -ssi ve -new marke -mine head -mar wan -mal ari -m mb -kor fball -im part -hedger ow -he uri -gab bar -elpas o -e wu -cour chevel -col qu -char ol -buzz word -ab vp -visual novel -tac s -san ghi -ph all -per kin -op hia -mexican food -math ilde -li do -har grove -gor abbit -fun house -envir on -e der -de sen -confi dant -b ya -ay k -ant ina -an anth -ภ® - ¦ -yang tze -tagli atelle -sr w -sor ley -sk ellington -sever in -s oooo -mo ku -mar ri -iphon ex -invo kes -guil len -get to -enti rl -en cel -e bro -digg ity -cr itch -ci morelli -ðŁĴľ ðŁĴĽ -yo ho -su deep -so cool -sine k -see ker -roy soc -ro ps -re mington -re lo -paul walker -ode tte -martine z -lec ture -laban pilipinas -ken z -hibern ating -flag pole -fight club -fer nan -ab ack -tam iya -stone hill -stin k -sell ing -re treated -pig tails -pe eler -par ten -n ku -loaf ing -ko vo -i sie -ferr aris -cdne con -c ti -bi le -ber cow -bar ing -augh n -ace res -ter se -sten de -rizzoli andisles -ri son -rav iteja -ph q -lo ews -jaw ad -gim me -fridaysfor future -cal cite -by line -z aya -west mont -v ce -tt ac -t ø -super show -stel ena -scape goat -mesuto zil -mer s -livel ove -g end -g ann -fun kad -evan cho -conver sing -ak uma -ðŁĴ¤ ðŁĴ¤ -wh itten -ti gnes -skysports news -sex press -rum maging -ov ary -mu v -ma homies -ha chette -gi gging -gi gg -fel ting -con vivi -blo or -acoun cil -à² Ĺ -Ú© ا -z ner -sc w -rose mary -rhswis ley -rabin dranath -polari zing -mel atonin -len nie -leed sr -ke zia -infan try -he k -gen nady -ey oung -change theworld -bu te -bay bay -assemb les -ðŁ¤ ¢ -wise words -we ws -was aga -sw v -run k -pul s -mon iker -mer o -hur ried -garden ersworld -frisky friday -ev b -cn c -c mv -c ati -actionnews jax -w st -shot guns -scottish labour -sau stin -new single -merr ill -ma jer -kitesur f -impecc ably -grand fathers -go bi -glu ta -fe moral -fa thered -e sports -cre spo -bhagw at -au coin -aram irez -ang u -after care -w aca -trac eable -sav oring -purple reign -pas qual -may ans -maidu guri -li ens -im t -ful bright -f ram -domin atrix -be my -ai ww -wal sall -w res -ti ri -ti ed -sch engen -reasons why -luxury life -le pore -kn itters -he k -bibliote ca -bene factor -bedazz led -bbc three -ad g -ðŁĴĻðŁĴĻ ðŁĴĻðŁĴĻ -si stas -sch alk -roch mn -r pu -pic ton -paper weight -over se -mat zo -masi h -gwali or -gau r -football manager -flin toff -fitz ro -dal and -crescen do -bow ery -ateli er -ark ana -antetokoun mpo -ws fa -wi zz -st angs -ro v -poo kie -parid hi -my lo -itu ne -hu ed -gorabbit ohs -fred do -ed ical -dj mag -beacon sfield -( > -z ep -wab bit -u om -stu bb -stap o -singular ity -p gp -nehemi ah -music education -ho key -gun nison -fri zzy -feed ly -chap man -ch alo -bien nal -belaru sian -aga ins -> " -ì¹ ľ -ton gan -th ais -stor me -seque stration -s fra -psycho active -ol ph -mi dat -marc jacobs -mar ini -m ellen -layo ff -kan chi -hi hihi -gul zar -equ us -can va -bellar mine -bad minton -anag rams -ðŁķ ĺ -ç © -valenci acf -tanger ang -ss ociety -shaw shank -sche rer -sc ity -red v -ra whide -petr us -od as -nsc aa -man am -lock yer -lar ams -kiri shima -im petus -gu lag -french gp -cu bano -bil lo -aw in -asser tion -tre f -the expanse -raisethe wage -o smo -melancho lic -luci an -koo pa -cor relate -colourpop co -c zer -bis ky -beck with -all ga -al ang -ðŁij¶ ðŁı¼ -whydont wemusic -unfor giving -str ath -sell in -ron paul -ri sm -qu ino -music day -mat ata -legion of -heat nation -gro ats -fawad chaudhry -ebit da -chriscor nell -adam awa -าภĩ -z n -waq ar -vel e -treat yourself -so cratic -pie tro -net suite -leon ards -lam bert -kyrgy z -k cb -ike ji -he f -gfx coach -fat tah -fashion blog -chi story -b sk -ðŁĺľ ðŁĺľ -v lm -shaw cross -plo p -pixel s -indy star -in compatible -home brewing -fri eda -dun gare -consumm ate -cha eyoung -brow ski -are llano -ar sh -anni es -- _ -ðŁı½ âĢįâĻĤï¸ı -teddy bear -humane society -geo graphers -for sake -de cap -com plying -col onists -car ay -bu is -ðŁij¶ ðŁı» -veer am -tra jan -to ch -shyam alan -ri ki -pre neur -pin wheel -per v -o sei -its not -iiii ii -hydro logy -haram bee -gossi ping -fix in -ec mo -be art -ar x -agra wal -ãĥ § -univers itas -tremb lant -to saurus -shin ki -sci oto -om itted -my asu -lou ghton -hypo thermia -ee as -cre mated -az ale -as as -!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! -wi po -suffer ings -ro dr -nouri shes -noban nowall -me irion -kle ine -kan aan -ho ek -form entera -eng vaus -ck c -celine dion -ber sih -ae us -a hotels -z ke -sch im -poo dles -po sible -on ted -meri jaan -luke evans -lor re -li ber -ili pp -her nan -haw kesbury -eugen ics -bates motel -assam ese -win denergy -ver tic -th aus -stan field -peru ana -new ick -george takei -g mp -fer me -dis su -day mond -cha el -cer ia -ai shu -ĤâĸĤâĸĤâĸĤâĸ ĤâĸĤâĸĤâĸĤâĸ -ðŁĴĥ ðŁı¾ -un specified -tor ry -sp ousal -sapol iceservice -re funded -p andy -master sof -madel ine -m rd -julian assange -gon u -dep ended -delmar va -de commissioned -de activated -com usic -bir fday -ance day -alber tsons -al man -a etna -yas min -whoo pie -vidy ut -tv land -too led -sutton nick -pro mon -nudi branch -lm g -kh ans -jac inda -heterogene ous -e zio -com pass -calibr ated -bio logics -ben j -back channel -v aya -tra yvon -suffe rer -snow white -scre amin -pledge music -palad ins -mo va -m mo -lan k -kr rish -cd ns -brown s -bah nhof -babylon ian -b á -ath ia -arm oury -ad ou -abo lishing -== => -th us -quen ching -proud mom -pre phoo -pheno type -par atha -monte iro -ex hal -evalu ates -drop the -ashi on -all my -ðŁĴ Ĥ -you m -writers community -tye ight -tren to -stu bs -southea stasia -some place -per using -pepsi ipl -no ggin -mc curry -gustaf son -fon si -chri sy -ar peg -abram ovich -... ðŁĺį -âŃIJ âŃIJ -uni for -u af -tap ings -tank ard -sn cf -small town -sid mouth -se ta -rosen baum -rc f -pay sage -oo th -mer v -kit o -ka ito -jewish press -go bolts -fen way -fc bb -clu stered -cap lan -bo ater -beur re -bar nyard -anti viral -z uri -thorough breds -super boy -pha ges -par ibas -our team -ol denburg -mccas kill -ky ga -ku la -kk city -jo jos -girlswho code -far cry -da ren -clon mel -ar ci -alo y -> .> -ðŁĺį ðŁĴĺ -viron ment -ul s -u ssa -run ny -riv ington -pp u -over worked -loc i -is si -gradi ents -gol i -go eags -gla iz -csul b -cn l -ash field -am k -ab ject -ðŁIJ ª -you thin -table lands -ta de -sewer age -sau sal -ro la -py rite -palm dale -mur doch -love capetown -ka unas -hur l -gib ber -ge stal -fu mbles -eu banks -down tempo -dae bak -cra ves -cal stampeders -caber net -be yourself -bay field -val ken -tow ner -terri ble -syrian refugees -sun lit -splen did -saf b -rapha elite -pseudon ym -p mp -night light -lo rele -kiran ks -in off -horror movie -gr und -gilli vray -col son -cas well -bu mba -ØŃ Ùħ -ver batim -she h -scu le -regime change -r cd -pla id -os sett -mobil isation -mel d -marcel a -leg day -ick ness -fo lic -farm bureau -f hc -dee pp -cli ft -cla dies -bu gged -adel phia -shel p -ok av -nav ami -mclou ghlin -femal eartist -ed r -e juice -dissec ted -din er -clean ing -x tra -we tt -wa ii -w vb -vi ana -ve das -tal le -stat er -sale en -sa iler -s do -onas sis -o der -nitish kumar -new garden -lea ke -ho kie -h ds -ge w -fu qua -dor g -chlorophy ll -brain y -ai bo -âľį ï¸ı -âĸĶ âĸĶ -๠ĭ -venezuel ans -teren gganu -syl lab -sling ers -shar pe -san ce -re es -mor k -mill man -mick le -lo ser -jor dyn -horse shoes -gr ath -dre cht -dar ley -bow en -ar beit -aero drome -aditi rao -ðŁĻĮðŁı½ ðŁĻĮðŁı½ -® . -w dr -voll mer -vis sa -vermic elli -v ÃŃ -un de -son nen -po da -md wx -ky an -kilo grams -j ko -gran tees -gin ter -for acause -en coded -ela er -el sen -christma sparty -alk maar -оР² -wed ged -war crimes -wa ja -virgin atlantic -su bro -stabili zing -sc ab -ru f -olivi a -medi o -mc iner -je ka -im onday -ho va -hier ro -grey hound -great day -gibb ous -gay travel -footsc ray -far had -alon te -your say -tri state -the box -sed don -sb f -re sol -op als -nay sayers -mcco wn -m atia -jab ber -gg c -ft ar -fr anti -f ndn -ess endon -elyn n -at it -the on -som m -share mondays -polish girl -pic ka -pi ped -p mu -nave en -mus ch -lal it -hollywood bowl -fow ler -d ga -cor on -car leton -brow ne -b blf -as ante -wr n -vol ker -syste ms -state park -seduc ing -san de -row lands -riz wan -pakhtun khwa -kri st -ka sia -hudder s -frac turing -f yn -esmol lett -dc b -brisbane broncos -becer ra -ak ir -ðŁĩ ³ -í ĸ -Ú© ر -vil les -responsi veness -rain maker -pig skin -marti ans -mariu pol -h wc -ge h -gar ra -fre ire -flight less -di biase -ðŁİĦðŁİĦ ðŁİĦ -wwww wwww -ti pu -ti amat -succes ful -shi seido -nas akennedy -mu x -mu swell -methyl ation -live from -li est -lavin ia -jes u -glynde bourne -g atti -fro thy -coinci dences -bou lud -bizar rely -ber nad -avel ino -ast enders -Ì µ -v sa -un finished -soci ologist -seaf arer -poly glo -pa chi -ki as -ke th -karthi k -jac qui -ha ik -g cl -ferr aro -cornu copia -brock port -arte fact -aj ah -trun dle -steu ben -p gi -opportuni st -mussel burgh -mat ar -innu endo -hawk man -h under -figu arts -ey ama -exter nally -dun gy -debu tante -con sol -chand ni -bin d -au den -ak ari -af ood -ãĤ Ĥ -yu mmmm -yellow fin -volley ball -to gs -sidi be -nür burgring -newor der -len ient -lar imer -justanother dayinwa -ill aries -hamid mir -fine gael -bri enne -blog tour -be ter -bar to -ard elli -yotu bazos -tah itian -spit als -sin sider -see ing -parisi en -over hauled -op lan -mic kie -long shot -la pierre -hoag ie -heel ziggler -gi les -ge to -fossili zed -eu g -di ot -bhar ath -ðŁĺ±ðŁĺ± ðŁĺ±ðŁĺ± -ðŁ¥ ķ -ä¸ ī -still man -redchilli es -pan sies -newh orizons -mouth wash -mi shaps -mad dux -lincoln center -ju mble -here for -dr illers -congr at -chi bi -charlese sten -break water -big dog -aro se -viv ant -rac quetball -pu ffing -plei ades -par di -nar gis -michael phelps -lec ce -has sen -escuch ando -dun garvan -dou ce -de ff -cy sts -a vide -⬠ħ -tr anger -the west -suri gao -sn sw -re touch -re smi -r mnp -peaky blinders -mu bar -mi gs -mi glia -merc ado -koo ks -inu yasha -firec rackers -debau chery -cress well -cat suit -cast a -aim i -y ne -v q -unfa thom -sp ind -si sta -shay la -s ago -one minute -nu ka -n aki -leomin ster -ju iced -institu to -hi ja -das a -co so -chan ia -cav anagh -be amish -atay ulu -applic ator -y v -var ane -uni dos -tarte cosmetics -swin dle -sli eve -run disney -ren da -per ly -p ft -or gullo -on lookers -notal one -jet team -h spa -gu ic -fox boro -exoske leton -earth worm -das co -cu ppy -cro quettes -brook dale -bo lo -b ht -av ac -z sbp -y alla -vou ch -smo or -rak shab -push back -pardon ed -news watch -ic ma -god se -eu stace -er aces -caesar spalace -by city -bun ga -bu oys -al iso -ðŁĺĪ ðŁĺĪ -ðŁ¥ĩ ðŁ¥ĩ -un assuming -studi os -p md -mcclu skey -kq ed -hol len -flash cards -final y -fam erica -f ds -cre dence -commonwealth games -built by -bri xton -bar bac -ago v -å Ł -à¸Ńภ¡ -yo gini -wing stop -virtu alastro -stonebwo yb -statu ette -sc ad -san juan -plo sone -pe ga -op ah -o id -dg m -cir rho -charm ander -bur rard -anti gen -aless andro -ðŁĴĥ ðŁı¾ -west papua -w fm -u mentary -u fm -thereal stanlee -thereal pcb -tham endment -t fp -steep er -raff ling -nicolescher zy -maxim ising -list ers -kn c -ke tu -h itech -gymna stic -goo oooooooo -dra gic -de caf -cor dero -aster ix -af at -visu alizations -v uk -sadh guru -rais ers -par thi -on ah -oc at -nav rat -n pcs -minu tos -kin tyre -fun dy -extinction rebellion -broad side -bro iled -brid port -aard man -ze id -sun sport -sle igh -sg v -se on -ran ching -our e -ol p -mi stress -mi ff -me hr -lym ington -knowledge ispower -ine ke -g dl -cro ker -coom bes -centa uri -ber ber -ann alise -aditirao hydari -to pp -sk r -si do -sch ef -ross dale -redwaver ising -q as -princes scruises -pap ier -ol v -mohe gan -levit icus -dun stan -ci e -cav uto -ðŁĺį ðŁĻĪ -w mu -st pat -sd lp -samsun gg -pu tters -paper cut -ous er -ma sin -kla us -john sen -fictional death -explore archives -esc on -edel stein -dig beth -chair men -ch ert -can elo -cali entes -bath rugby -asvpx rocky -ash mi -as sed -ys d -y aqu -un seat -un detected -twee dle -style z -solidi fy -skull candy -s loot -ren ss -my y -give away -freu dian -fluid ity -fix ie -di ren -de ers -dani ele -d ta -bry de -bla kes -ben ji -un boxed -thir sk -si phon -ra val -park uk -moham mad -mish and -major a -indist inguishable -inbetween ers -immigr ated -i watch -fro d -fav reau -digital media -cra bb -convin ces -bb age -aerop ress -wor dy -thel im -pil af -pand a -mcla in -lieb herr -her me -hart land -grou puk -e wc -compli menting -chur ra -bl unt -bhand ari -andre wr -ãģ ķ -war paint -tu tto -tom ball -spur t -rescu er -rein hold -pump rules -muscle cars -jo chen -har py -gowan us -g hai -en uf -eli an -counsell ors -carcas sonne -af ters -// / -âĿ¤ï¸ı ! -âĢĵâĢĵ âĢĵâĢĵ -shoo tin -qui pe -n inger -my girl -kof a -h ach -fer ris -dy l -choic efandom -us open -ugh h -snet terton -si as -s mat -racon teur -r iting -par roto -one u -of saa -k ich -k agu -i voted -gai den -dog training -dis sement -concor d -color ing -career advice -at ori -aro tti -woo w -votekathryn fpp -un requited -uc sd -thir tyeight -tan ka -sti pp -sear chers -schar les -sandr ingham -sac o -men sbball -jun ko -j ho -fang oria -djash ba -chip set -cap tives -biom aterials -back ing -ambro sia -ald ous -ãģ Į -âĿĦ âĿĦ -wim borne -tr icking -tl ds -q azi -melbourne cup -lord ship -k loss -inti fada -gate au -f ss -edmun d -debat able -civil war -cast leton -bb els -è° · -ãĤ ® -twi zz -tere rs -sle aford -shar mar -ru es -ran gra -pro state -porti shead -pe ga -oz una -mad hav -ino id -happy anniversary -e tten -demoneti zation -cryo therapy -corru pts -bre mbo -ban us -app are -aphrodi siac -al pe -ade t -visi o -tail wind -steeler snation -som ers -rtr naps -ra si -pilip ino -o poty -montag u -merri on -lv mh -lec ter -kan chan -fabol ous -da ad -cb g -bulbas aur -# , -ðŁİĦ ðŁİĦ -âĿ¤ï¸ı ðŁĶ¥ -âĻ¥ _ -tit os -the spi -re schedule -pin o -parroto td -my k -me athe -jou sting -hockey hallfame -hcp ss -guys ss -gri gor -dat adri -dan o -dam son -aren dt -aero postale -a jan -ðŁĶ´ # -t ars -sh ola -se vier -piero gi -pe ma -in undated -heck ler -gu ignon -escap ade -em mitt -debun ks -ann nn -y ve -williams racing -shack led -rn as -reyn ard -per ros -par fu -or op -nurser y -nol te -mac as -j inj -d áil -citi bank -chocolate y -cbs sportsnet -bott i -ðŁĩµðŁĩ Ń -trot sky -tre view -the big -shoe less -s brewing -quar rel -p ellic -longh orn -jou bert -jo yof -ill is -george harrison -g win -comp il -camp agne -beth page -b gr -í İ -zzzz zz -ty pic -sarcopha gus -pre nd -mol inari -lynn wood -luci c -house party -harbha jan -hall yday -gram pa -gos ford -gator nation -endangered species -di ke -cs v -comp action -clemen cy -ca iro -c tures -ðŁĴķ ðŁİī -v ra -us ag -se gw -nh v -negoti ators -mer yl -long island -lgb thm -irrig ated -intellig ently -humay un -har row -har dik -gul bis -gera ghty -fusel age -classi est -charlotte gshore -bar tram -ban ts -ap lin -antiqu arian -all ank -ab harat -!! âĿ¤ï¸ı -âĨĴ @ -sky new -serv itude -ri mb -ra pa -port is -on ya -need ling -magno li -kath arina -eco was -bru lee -bro o -any on -anti microbi -aller gen -wham mer -western bulldogs -star key -spar ty -rheu matology -ren dell -ph un -p out -my o -lo ol -ki yoko -icy cles -hi sham -gener ale -gag non -fitness model -dev ries -con descending -christian sen -cassi opeia -bi gart -af remo -ðŁĺĤðŁĺĤ @ -take back -stimul ant -siri sh -silic ate -rh cp -prisc illa -port ation -pic kings -ph ering -mu ppet -mo tu -lost boy -liveli fe -in ordin -grind house -col bert -ch onews -!! : -ãĥ į -âĿĦï¸ı âĽĦï¸ı -zu mb -ww u -vi bram -tra verse -squ atters -sandy hook -saf f -oper able -iraq is -instru cts -hotb ed -finger less -en ame -cul ling -cla wed -cam is -be que -back splash -apocaly p -Ŀ ¼ -sand burg -resi a -repul sive -queen su -perse polis -om ag -n elli -minor ity -me sen -li sp -la ku -hor seri -ha im -extre m -d mt -am am -ðŁ¤Ĺ ðŁ¤Ĺ -zachary levi -wis bech -ut f -rule book -mel on -ko on -kh oo -k ame -jj watt -imit ates -he ine -ha vering -elk horn -co sproject -aldub big - ¬ -wat auga -queen of -photoo f -paraphra se -mol oney -mcve igh -lap sed -kim soohyun -ker o -jennifer winget -jason derulo -go goi -fish net -fest us -e tam -den i -be eld -ðŁĶ Ń -ðŁıĨðŁıĨ ðŁıĨðŁıĨ -t mm -shar ps -richardd awkins -rev d -rag doll -north port -i was -gw ent -dun away -duff mckagan -br f -as pi -acon gress -war head -w mc -v sb -tec tonics -ta ki -ste pin -slo b -re at -ram m -race forlife -perma frost -ni kova -new age -nb cc -k hair -cy pres -college bound -bungal ows -brain health -bad rin -à¸Ńภ¢ -tu h -street scape -snick er -shoe string -seacoast online -scar l -red neck -pu ddin -post war -normal cy -mobi us -man airport -l hs -krati ka -in el -hom mage -har uki -g wr -fas d -end poverty -em path -ctv news -cho wski -agu stus -ac aci -âľį ðŁı» -tad poles -sw ane -st man -sher rod -scot ties -py m -oster ia -ned bank -ma ar -leon idas -la ssi -jeze bel -je h -inform ations -feliz lunes -commu tes -ci stern -bo car -black er -akin dele -ah oops -ðŁĴĻ âľ¨ -Î ¼ -way finding -w oun -tend ons -swi ping -smi thy -side kicks -red start -ra ith -pt w -pre requisite -n ti -mitt el -kw k -hand maid -fren s -boo hoo -bal ti -arte sian -ammon ite -ðŁĴIJ ðŁĴIJ -z ena -warr nam -val do -tu pper -shot show -ru mbo -poe sia -n ha -mp loyed -lion pride -l tg -kaiz er -gru mble -fin lay -end lich -egre ts -econ dev -chlo eg -alo vel -afi b -ü e -zoo keeper -we believe -vers al -ra ked -politi k -om u -n ff -mu sky -kath ak -jack kirby -j ell -iron bridge -in ab -il se -il f -en suite -de ira -change the -blah nik -bin ny -author itarianism -add ario -ab do -wildlife crime -un productive -the shelf -sou mya -soleno id -re surface -pro geny -out fitted -ne mann -lam o -innov ative -g do -forest of -fam e -am ars -admir al -ðŁĩ·ðŁĩ ¸ -wear orange -utr gv -t mann -stur t -sm ita -sit coms -sit ara -shani atwain -rangasthal am -pe dition -lo ggins -life hacks -lan sky -it sli -info tainment -hol lander -go wer -g mat -fore casters -d ack -abre ast -a if -âľ § -wester ville -theat reco -ste yer -sp ite -sam ad -ra sk -ple bis -p vam -lar ne -koo t -kill joys -ig ital -ent z -ðŁĺŃ ðŁĴĻ -world juniors -stre aking -s worthy -s les -s du -read venture -prabhu pada -pan elling -nat ick -li anne -gre cian -condomin iums -cam as -bur dock -be m -ðŁİ Ĵ -ìĨ Į -âĻ łï¸ı -wri gley -van adium -the dead -sti val -steve z -sh ink -saint john -ren ae -pres su -p anned -mat tw -ju ssi -hill song -harrison burg -exagger ating -crum pets -ash leigh -apha sia -ach il -___ ^ -wb pictures -valentine sday -un godly -ru mble -ric he -pun x -pren der -pet shopboys -mp ong -liqu ors -lion fish -ka hani -jan esville -hom icides -gar yline -fla pping -five thirtyeight -empor io -ecker t -bo hm -tab ul -t storm -sw l -starmagic phils -sound city -sof tail -so i -sheffiel duni -re joins -perform ing -oh my -mari anne -lan yards -jan oski -ab original -⾨⾨ ⾨⾨ -us ask -te tons -spani ards -sk elli -shop aholic -post box -poly propylene -or mond -lau der -last man -kr k -f art -eli k -do ff -cli m -cat life -cas sy -af ta -whol eness -wer un -tiffany young -thai food -riot fest -re starting -pill ay -lor rie -le do -inf antino -bi fur -ali gn -ac el -( +) -ðŁĶª ðŁĶª -we hr -ste ppe -stat on -si ed -sher wood -pic ar -palom ino -mp w -me her -mack y -lati sm -home wares -fre und -fin ner -false hood -ero ses -er ster -encapsul ated -en tra -ec am -brown stone -brain tu -bed and -band b -bal ven -ðŁĺª ðŁĺª -veri fying -sto sur -sp leen -scoun ty -ready tor -pe aty -pan tages -pal it -museum selfie -milit arized -ly le -ll sif -gr annies -garyline ker -ed g -ber ne -w engen -toy in -tin en -sky view -r mc -n oooooo -lib spill -leyton stone -jama is -imper man -im min -hall yu -gal es -f si -de ye -bra id -ber ths -bar z -bake house -b ttf -av illa -ðŁ¦ Ĭ -wizar do -thegreat khalid -south ie -pur ging -p ago -mu mble -mo co -mand zukic -kat v -jay araj -gav inde -fore hand -el aide -distill eries -ani el -ali enable -al cal -ak kar -advis able -unil ag -sial kot -schro der -sc or -pe ws -nh p -mon is -md anderson -les bos -kasab ian -ink l -heart strings -freder ic -eh y -drop ship -bian ca -adhe sion -vor one -tumb lers -t reading -poly carbonate -papadop oulos -on this -mer cia -ludo gore -koo ky -klu ber -he mato -gar on -depo ts -dan son -bo seman -ac q -ðŁĺį ðŁĴŀ -å Ĭ -women leaders -wi est -okav ango -mathemat ically -mar isol -jack al -gum by -el az -du is -brown university -biaf rans -ban go -wn cn -w ily -us m -um h -thra wn -sath yaraj -ricken backer -prox ima -por ches -over seer -meri den -ma jum -lt fc -leg ge -kir ke -king z -har low -cor nette -birthday y -answ all -time zone -smart contracts -si do -ro day -mendi ola -hou ma -gu ang -gran dio -dil aik -contradic ts -cardi al -cad rought -breakfast club -* ( -âľ Ŀ -âĺ ĥ -trin it -tom ato -six ty -refu tes -phant asy -perpetu ate -ol c -ny cosmos -needle point -milan ese -goog leglass -gold stone -fle tt -ev ar -de kh -cas ings -bic ic -bi ddle -at ay -ar z -ar rl -ä¾ ¡ -virgin ian -team followback -span thers -siyak eram -shu g -prince sse -po em -mu ka -metro logy -major crimes -la res -la byu -ki ffin -kar o -kah lil -gay pride -g app -fire base -every town -e su -cust exp -af faires -ðŁĴĶ ðŁĺŃ -sec toral -prod mgmt -omni um -lindsey stirling -ki pper -gar rix -freel ance -explo res -climate emergency -bu rak -b com -av eni -air fix -x jr -wan ton -un sw -tur kiye -teacher appreciationweek -sar ay -pay ment -param us -neuro degenerative -kumar vishwas -inter nets -fri gi -dy nia -did cot -de formation -asset store -antibiotic resistance -wa ver -vel ocity -ted by -tat tered -suz ette -stom per -sm outh -rs g -plant ings -ott olen -mel low -life and -lad bach -kat es -infl ate -head in -he ung -fr inges -food banks -depreci ation -chipmun ks -bro ski -ale ister -ac ito -ëĿ¼ ìĿ´ -tin ction -taf rica -sau ro -rio ters -raila odinga -queu ed -out stretched -one time -ni y -leg olas -jun ky -fo il -du as -dah mer -cell ent -bull er -bt posse -as ket -un cc -snow bird -rhin oplasty -oro ad -mala hide -lu ma -la four -king wood -kentucky weather -jun hoe -inter planetary -har ada -fla ppy -ek g -di fc -cool pix -char ade -bl ant -vene zi -sw m -sen ko -samsungg alax -run yon -party poker -parmigi ano -moder ators -me ac -lu sso -live chonews -ken nard -ig in -h mo -fren chart -exxx otica -do err -; ))) -" < -ðŁĺĺ ðŁĴĭ -ó s -worm wood -with hold -vell ore -stan cia -r ma -phil ae -mocking jay -mag en -luke cage -kur d -hearing loss -gau ri -e spor -den ounced -clean sed -cay ce -cash el -boo ing -athen aeum -art station -ais dproud -a qi -ðŁĴľ @ -v liet -tx s -tamaram c -spin ks -small wood -si th -severe weather -ny sph -morning motivation -for lorn -car ino -bul len -b bott -ðŁĴ Ĵ -ste go -smith son -res se -par ise -levit ating -haw ick -go bert -fl s -cor ding -bu ell -bbce astenders -arctic monkeys -angel us -ðŁĶ´âļªï¸ı ðŁĶµ -win stead -vor acious -up coming -tn hs -sof london -on me -o rec -munch kins -li x -kookab urra -hyper car -he sh -gow rie -gen es -film works -dev illiers -daily deals -co pilot -bad gley -alex andro -agr arian -worshi per -vor tex -up loader -tribe chat -tex ash -su che -r dm -o possum -hal ve -fer mi -e bt -der on -chee ky -andre ss -zin da -yard ley -whit acre -u os -twith aca -trophy hunting -sy a -spa ghet -pixels website -ox for -newbury port -mier coles -get ready -flor in -ev ely -city con -argent in -åĭĿ è² -tsar naev -tati an -symb ol -spar c -sou ffle -skid more -sh restha -ru pan -rehabil itate -ratche ts -pp age -pla za -pb x -op ark -ma ille -lilli es -le be -lari at -kapam ily -aaaa aaaa -)) )))) -ì¡ ° -wee i -vibr ator -ta kan -scifi art -les mis -kb tribechat -jant ar -etru scan -esc alante -edu chat -dy che -di shoom -bal once -ak ye -! ðŁĴĸ -writers fest -timi glia -time less -thi op -syn apse -sop ho -sh ula -repu di -pu rab -ori ver -of ford -monster jam -m ph -le mak -incumb ents -har dee -ety mology -eey ore -du du -do van -cou leurs -con served -codenew bie -co ton -cau sal -audubon society -alle gra -al eph -ðŁİ¤ ðŁİ¶ -worl demo -west country -touri st -tost ada -ran khan -plat te -ou el -nz herald -nu a -nouvel le -no th -new by -mo salah -kidnapp er -he morrho -har lingen -gat o -ent ric -dot com -color less -chir u -an kar -ê Ĵ -vijay antony -tt ura -senate dems -mh sm -ja une -hoo tie -han e -friend liness -fre shair -formul ations -fit ri -dr do -dee pa -c int -c illo -bathro be -. | -ಠł -y ello -white man -rust ling -per ley -mush kil -lead ville -just ina -j rm -ira ins -gro an -fu ton -de tt -damn day -d mac -ca hu -black foot -apar ks -af lock -adun ham -ðŁĴĽ âĿ¤ï¸ı -zi pped -sn avy -qu ater -mus c -mal ai -ing am -gi let -ge et -el ich -crow borough -chan woo -bobi wine -a ali -ðŁĺį ðŁĴĹ -with it -win ec -weing arten -website design -vo v -ut tox -sequ encer -sc su -save children -sat yam -sa eng -s ace -ri be -pos sums -non ton -instag rams -h da -dw drums -commercial realestate -auth oring -apple tv -ð٤ŀ ðŁı» -zwe ig -wyan dotte -u bu -the dj -silve stri -sil t -pre pper -pay less -pax west -log itech -lec tured -l tw -kari sh -j dk -h tf -cheng ladbach -anup ama -a field -ðŁĴĸðŁĴĸ ðŁĴĸðŁĴĸ -v illian -tw ars -pro pped -min den -lay am -lady antebellum -ktb ffh -ha iga -e www -delic atessen -chill ico -broad moor -anthropom orphic -ale ks -sef ton -ron nies -plant sci -per ini -pay ton -orchar d -m pm -k ym -jan ovic -golden boy -f ana -dynamite comics -dorje shugden -cr inge -co ombe -ation of -activ a -ç · -you are -ren zo -man spla -kelving rove -kat ara -ham den -furn aces -favor ably -f wp -coch on -Í¡ ° -zak kw -wealth management -touch stone -resi stance -ras ool -private jet -officialu om -lc f -kit ch -keto sis -it alie -hy enas -grati fying -futur ity -b di -ðŁIJ ĩ -ëłĪ ëĵľë -vol ine -tiger s -tamaramc cleary -potter more -on elove -mc fly -m ffl -libr aries -j zarif -irish bizparty -hy thm -hon a -hail state -gal le -fail ings -brand is -br ons -w ry -ve sper -uch el -ta is -spro te -ser ato -save water -re des -psyched elic -miss guided -lin na -la vie -gui dic -green span -gor ing -gold water -fi bau -fan mily -dro go -cr c -chee to -bo son -yu ka -wnu krt -web master -state farm -sp ero -ony mus -mel aye -lou i -i fm -engro ssing -empirestate bldg -dissol ving -boo tle -blue bonnet -b mr -thr ace -ps ch -pic sart -per fom -nuf field -nar rate -may u -l tu -elder berry -dibu jo -desc ence -buoy ancy -bay lee -bald ness -ar ish -ani ght -aj hl -activ ator -z hong -vorone zh -sing a -road trip -property management -ple tt -pin inf -multic hannel -mill sap -male model -ma shaba -lubr ication -loc ate -kin nick -kid z -fe h -defund pp -dd icombe -cu tch -chun gha -bard stown -> $ -year sand -veu ve -unit edin -p ire -oxi dized -or ada -mug ler -mom sen -matur ation -kol be -gl engar -father sday -farm workers -family planning -fact sheet -dilla shaw -digic el -c whl -c sur -c ite -and read -* ^* -ðŁĵ ħ -ã Ħ -âŃIJâŃIJ âŃIJâŃIJâŃIJ -photo contest -n ü -lat te -kwaz ulu -ici ou -hy lton -ghost town -funkad elic -for theday -fen nec -eviden ced -do ce -dige sted -cor sten -back drops -un said -supermari oodyssey -retro spec -oligar ch -mispr on -la as -il logical -galli ano -flash fiction -clou dera -cab oose -brian mb -bon bon -ac ep -ðŁ¥ ī -âĻ¡âĻ¡ âĻ¡âĻ¡ -thunder cat -smoo thest -sing e -si eve -sa ko -par co -muse elou -miy uki -mag gots -led better -it ous -integr ator -grow with -gir t -fal a -day an -arden nes -ag ence -trias sic -samuell jackson -painter ly -nar d -mcm comiccon -mari anas -mahon ing -i est -i ba -hills borough -greg gutfeld -genealo gical -g ys -em pi -de spi -bla ire -anciente gypt -alo vers -ac lu -ä» Ĭ -оР³ -tt x -sy ke -q ai -pad ron -ma her -it so -fa wr -de ee -carmel ite -# " -wo i -urban isation -theli br -s daily -pri ve -my ers -k vm -ic hand -fol au -ext inguish -edger ton -daf oe -aro va -âĿ¤ ðŁĴĭ -º c -yy carts -seab ed -pal acios -me ik -mck ay -mb ti -ma stin -lu pe -love u -le ero -lc ps -ine quity -fastand furious -bund aberg -bu do -ap ort -ðŁĺį ðŁijı -willi enelson -ut el -tri force -teas dale -spell ing -shi h -san down -mer sin -kh at -incit ement -ho smer -ha ier -follow me -do ggy -deer hunting -day sun -d no -christian kane -candel abra -*__ * -te gan -slu mber -scrib bling -ran di -plat ini -n sl -mo relia -mel amine -le ee -kash ima -h nl -box y -audi olaunch -ad ro -= ( -yahoo finance -sho ai -out smar -men ding -ma ks -ki ing -jami ro -gn l -gio vani -gain ers -ent rap -duplic ated -dublin town -dar lo -c sh -breastcancer awarenessmonth -baff les -åĭĿè² ł -un justly -ste mmed -smol dering -pd fs -men do -mcdon nell -lat on -lar yn -ing field -hell eni -head z -fron ting -e wen -dur rant -cas s -af oto -âľĮï¸ı # -w cm -verton ghen -ve ils -ste wed -span k -sen ews -selec tively -san usi -retin ol -re build -prou do -pene tra -oo pam -nar c -millenni al -m clo -kat z -inter ned -hot docs -for honor -fitt ingly -fan gio -fal lo -egyp t -constitu tion -chri stos -$ â̦ -Î µ -watch making -wat an -verte brate -sand a -nu mba -mikethe miz -mans bestfriend -leedsr hinos -le sm -kal an -in ah -b han -admini stering -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -ঠ¤ -غر د -z ot -sup streamers -shab by -pachel bel -mer k -ki da -inte ger -hear ne -goodwoo drevival -cro oner -cl ings -ðŁ¤· ðŁı¼âĢįâĻĤï¸ı -t kach -soo ke -sony pictures -ros acea -psycho logically -pl srt -ligh twood -lib ations -j ony -home style -geophy sics -disco verer -des se -bu ie -bbc tennis -bar ri -astoni shingly -arre ars -and drive -ad vices -x fl -weightloss journey -tyne castle -tran k -sweep stake -sw wap -russ west -la ure -icant breathe -hol len -ha ptic -go ty -fri zz -bay o -b ich -ar au -âĶģâĶģ âĶģâĶģ -vol tron -vis cose -un scripted -twe ens -tor res -tak umi -swansea uni -stav ros -rold an -rev ents -re da -rc gp -ng ong -meteoro logists -marl ene -kil ns -janel lemon -induc t -hur ler -hok age -hend rickson -happy customer -gow yo -dag h -d med -bron ner -trans figuration -topo graphic -the doors -shang ha -sam mam -sa wn -rom ita -re pub -pho logy -pe que -open gov -mul i -laz are -hon cho -ga bel -dun leavy -disembo died -as pa -aqu es -amitabh bachchan -ad dle -ðŁĵ ¹ -âĿ¤ï¸ı " -vik toria -van zant -sre sorts -spoon bill -sp az -sho sp -shau ghnessy -mdanderson news -making comics -kal amata -gri sly -gr g -go g -encroach ment -en ate -dw t -di sch -cu ra -buffo on -bi polar -b inging -ago stino -yo ssi -valent e -tram lines -tal lies -sydney is -sun dress -sci atica -may on -mali k -itt t -har ri -fr anny -drumand bass -crypto currency -community policing -com po -chan i -buch holz -ba hu -apex legends -and l -an aya -ðŁĮĬ ðŁĮĬ -âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ -your shot -swe e -summon er -sul king -spy ware -si stance -ny eri -mon om -mar lena -m nufc -ky ler -hol z -gre alish -far han -em outh -dil ma -chenna irains -cam ren -axx ess -amy loid -wa aaay -us man -sparrow hawk -porth cawl -pad man -nysph saa -new por -n mnh -n dr -march on -magh rib -mac ie -indv spak -gar son -g and -f anny -british gt -bit o -bam berg -asiap acific -al w -al omar -è ¦ -zu ber -sausal ito -ro ath -po table -monit or -mk ts -mis searth -me ity -har mer -gin or -ei ji -charle magne -bere ts -bel tel -apo gee -an two -am cham -________ __ -stead fast -rot ana -iw gp -im b -disco s -contrac tions -cal listo -be great -an w -a eng -௠Ĩ -walking dead -th ener -rem and -mom entos -m clu -lou lou -kacey musgraves -hol ler -fh saa -det tori -de es -cu boulder -arra ign -ach icago -= $ -ðŁIJ Ĺ -ðŁı¾ âĢį -zun iga -widow maker -tz at -sportsp lex -sla w -shi pin -re booted -pr news -kha kis -ka se -gam al -fro ck -da inik -bird seye -tat yana -sw ac -ste emit -mc x -ho tri -fu ries -car nes -bassad or -at ka -an mol -ak g -価 æł¼ -zy deco -z ouk -yessi r -y ck -ty cho -tot ame -tor u -too tough -syl vanian -rat i -nswr l -n gad -martin dale -m wd -legu mes -kha ya -ho je -gan net -eco x -aj s -ðŁķ ¸ -wanderlust wednesday -w ym -tech nik -sri kanth -soul calibur -sof india -ring wood -read more -psychedel ics -oak ridge -na dir -mlb tv -kareen ak -ishi kawa -climate justice -at test -abstin ence -wal low -t pi -sel e -scissor hands -s do -po der -paddy power -next level -kid der -ker alam -he ber -for this -ban ton -b him -am ali -al gore -trafal gar -thir ties -swan se -rol fe -rang oli -ke z -ja wn -go etz -glo bular -face timed -fabi ano -fab io -e cht -cu ticle -chloeg moretz -car io -blo s -bap s -art by -ale em -zi ed -whatyou do -wel ders -water ville -vt poli -tourof britain -tight ness -ten able -some on -sar g -pre sh -me gg -iow ans -french tech -ei hl -death core -da ichi -co com -chan ak -b ga -at eness -a op -( ^_ -ÙĪ Ø± -yp sil -tat su -taor mina -stradi varius -son ali -pk p -pil lage -or it -he wett -dug dale -chi pper -busk ers -blanken ship -tt ner -sub tweet -sh eu -season ings -ni thi -mn m -l sk -kay den -favor ita -cu touts -coloni ze -boat sforsale -ðŁĵ ¦ -ðŁ¦ ĸ -y ll -y hm -wit tenberg -t cea -steve ston -sci rocco -sal ud -portad own -n pas -lo dhi -ke hoe -k anda -jo en -ivan ov -han h -ge f -anc s -ðŁĴļ # -ye garts -vege mite -ri ofer -ri go -mb fw -mar ki -magnific ently -li steria -kar zai -dar ragh -d prin -chu ka -car as -c ys -be w -ast o -æľ ¬ -tan zan -search engine -ross on -prab hat -pan tene -noti fying -mo dig -micro scopes -lak elife -j hene -fre w -dom o -christmas gift -cc su -cas sie -anc ini -² ¨ë² -yo ffice -tr iti -the street -st aw -set zer -re doing -pun ts -on slow -nv me -night gown -narco tic -n its -hb cus -gi el -farm stead -ding ton -ct vo -cinnam on -chatta hoo -beren ice -audu sd -æľ¬ åĭĿè²ł -worldemo jiday -vie ques -truth fully -tru bisky -to ss -t auto -st event -shu ll -s ff -pol arity -off ing -must do -mc cand -magni fied -jor am -gab or -f ld -danny wood -c mm -aurobin do -wood head -women ssoccer -the state -hi roy -en suing -ac lan -w aga -u wp -u rian -tar u -swer ving -stou ff -shi mizu -pun ite -psychop ath -pap aro -n sca -moisturi ser -khand el -fu gel -fro th -cocon uto -ca in -bil al -x v -tootough totame -succin ct -scot twalker -ray mon -pom o -pluton ium -phen yl -nd f -music inc -marble head -leg it -l si -kan wal -jour n -jesu sis -gall antry -freeform tv -fo aming -fish burne -crink le -bur a -blu em -bla q -ak wyz -adap ts -a ip -trevor moran -ten i -sl ate -scuf gaming -re printed -quad ro -polar vortex -ot ol -marou ane -m fr -is this -har ker -fra zetta -fon daz -ed c -dc traffic -cor ky -cal las -bulgar i -x pro -write up -wat che -w ds -veterin arians -tuil eries -toy photography -th apa -staf fy -sha i -seng illibrand -pand an -oo ts -grocer y -goog les -fitch burg -eye on -dre es -di zation -di eng -de vise -d sl -book keeper -bean bag -aer ts -² ï¸ı -take da -stre as -sal lah -royal mail -memor izing -mar lee -m sport -inner peace -i wc -ge en -fighto wen -dra iders -de spon -chou dhury -can tar -al ola -ðŁİħ ðŁı¼ -west indies -wan stead -univ of -smi thers -sel ene -rose bank -red necks -na hyan -l pu -invasi ons -independence day -har bin -gri ddle -eri ot -ell wood -dul ous -cover reveal -bel mond -beach ed -architecture photography -al stom -¦ Ī -un rated -tu u -tri met -simon pegg -remou lade -prover bial -over berg -normal ity -mor ticia -kal ra -fuer za -fightowen sfight -diver sions -ðŁĮ¹ @ -ú l -vo igt -tal on -scu ri -saw tooth -pen ning -n sm -medi alab -m ty -elisa betta -eer ste -cute sy -ceru lean -adap tability -âľ ´ï¸ı -tumble weed -thi en -tex arkana -tar ch -t fb -st aked -seduc tive -rogu elike -oste opathy -os good -eye patch -ami x -> # -ðŁĺĤ ðŁĺģ -ðŁ§ Ł -tan ager -sun way -poly com -jar musch -j anta -iber o -gian luigi -er win -dit ty -compre ssing -brae head -bo cca -ap hor -ac ey -yeah that -wa il -vap ers -tyrann ical -st augustine -saf ari -raj ni -min to -medi acom -me ander -human ly -ga illard -fro om -dapp led -cum bia -cro co -bol le -bi ght -an itta -a stru -us ana -twit ty -tun ers -pe h -no es -ni mr -ll f -jay cee -it en -ik is -hur led -et r -e pics -dro id -dis land -car play -briel arson -ar w -anti septic -ai do -Ï Ģ -thelance t -thel ong -th ongs -tart an -sper fect -sli ghts -ser ling -prie to -mu sso -khal ed -kareenak apoor -in uk -fe res -fan atical -boy y -ban jar -( âī§ -ãħ İ -wim p -ti gris -ta ye -propag ate -pl it -pin ar -ph vote -parab ens -on ces -moo i -mark down -m fi -li fen -ko smos -ka v -jhene aiko -hello bc -ha qq -girar deau -fe ster -el gin -de q -de ena -ar agon -amazing race -ëłĪëĵľë ²¨ë² -wu thering -whid bey -tam pico -sh ami -ri day -out landish -itiner aries -gu ha -e katerina -cul vert -chronic ling -car dona -because itsthe -reci di -re evaluate -pal u -m fp -lun enburg -kr one -hyper bole -hydro carbon -fr n -fir kin -def er -bowhun ting -bird gang -ðŁij¸ ðŁı» -ठ¼ -write tip -tv shows -sag arika -ray sup -l so -hic cup -ha pe -gu len -din wid -but lers -brock ville -bang er -b lec -ad h -ðŁĺ Ł -ðŁijĮðŁı» ðŁijĮðŁı» -wf sb -we ft -twer p -stri ping -scrupul ous -sab in -ros lyn -rev ving -rack ham -ra ph -mp as -m hi -kor ver -kar k -jewel led -heath cote -dv m -duma guete -door ways -detroit become -cru soe -connoisse urs -c we -brit tain -blood pressure -blemi shes -repent ant -pi ana -otta wac -open follow -ndam endment -la homa -kicau promo -ju ste -invis align -inthe house -indi anews -ibg drgn -gri gg -gene seo -force awakens -bode gas -ayk royd -âĦ¢ . -ye eee -ulta beauty -u ol -tomas z -ter berg -tam ina -stepp en -sam m -q g -practic um -oro x -kri stie -inter governmental -in ce -g anna -dom ino -di yar -dar ter -cr amp -cad aver -bru beck -bo tu -yin ka -spaul ding -shun ter -shir di -sam ia -recidi vism -r to -pi quet -kis i -karli ek -jordan spieth -ip sos -dr x -datsy uk -cute eee -critic schoice -bernan ke -as inan -ak ery -soren son -nucle o -ne ice -mis read -max is -le am -ka ise -gur r -fre sca -cat oftheday -birk dale -wi h -w ct -vi aje -vere in -spice girls -soccer am -sar am -reflex es -kam insky -gu tta -gli ano -dick head -depu ty -as r -air con -yu val -sec gen -q af -ob in -nv wx -mellen camp -kenne dys -k pm -j ini -i mas -ent wined -end en -dyspla sia -dl m -book love -bon appetit -wahe guru -vacuum ing -tt ler -tra ut -sun moon -ro sado -new stalk -ko bani -janellemon ae -ine os -houston chron -historic england -geo technical -gag ging -g tg -do ren -cla ses -as ai -ap ride -super valu -stro ker -si mm -scar le -quo it -morbi dity -lam ma -jo anie -finger board -ethnic ally -eson oma -el ab -dou bly -attor ney -ðŁij ´ -viol ent -multim illion -l pr -k norr -fac toid -dou la -de valuation -de ker -aw allace -ðŁĩµ ðŁĩª -year sold -vol up -ver lag -tar avi -stre eter -sh bo -sclero derma -rabb in -pro x -mary kay -lic ht -l pn -ka as -j ame -haz al -gru ppe -coun table -bri gg -ah in -way a -walk for -vi dic -the dan -tar nished -stand for -semic olon -phy sic -naz im -n cb -mun ds -kre uz -i league -hy m -gli des -fees mustfall -dr ano -dis av -daw lish -classic car -ch olo -w tg -tax day -spec ks -sen feinstein -salom on -pe ppy -par kh -new ssydney -mul k -liber alis -le apt -ke di -heav ing -grand pas -gno sis -fiftyshades freed -edg ware -digiti ze -cel t -carnou stie -aa v -âĻ¥ @ -world photographyday -tack le -swane poel -sound scapes -sole watch -rise ofthe -pe dan -oregon standoff -newyear sday -mir th -kratika only -kil la -je ann -gir ly -gate ways -gall eries -et now -eli ana -dark seid -cur bed -chim amanda -bit finex -bell atrix -and company -an engineer -a beer -y fn -vit or -vag rant -su u -ryerson u -retrac ement -pal az -mtvlakpop bts -im l -gour mand -dim sum -dah lias -as li -ari sti -areth afranklin -am alie -ac r -wini fred -ven ky -uni q -un known -over done -nofilter needed -mu mm -mark sman -lin ares -land care -kel lie -ferran te -eng i -cigar chairman -y k -show grounds -sho ts -seren ades -sal inger -roman ov -resi dues -refre shes -prop els -news mornings -n mp -monte bello -mat sui -make money -lady bugs -inter scope -house plant -fugel sang -fu hrman -du que -dil ute -co ss -c atie -bar stow -abu ela -a beats -wut ang -warrior nation -v tc -uk an -trans vest -super stock -su won -su ll -sto cker -stgeorge sday -r pl -pin head -kul u -kareenakapoor khan -je wala -i ffe -heck en -glamour mag -gan ay -g ous -et an -el ric -disper sion -coch lear -bb p -analy tic -amal gam -af cf -_ @ -å· Ŀ -ud all -opioid crisis -neel am -mo j -methan ol -lang s -ka oh -iv re -ho z -he bri -ash etty -as port -arson ist -.. : -zi ja -trac ted -solemn ity -samo yed -rapha el -premon ition -pa ver -mis demean -karliek loss -jor g -hann i -ga unt -fork lifts -ee en -death wish -cw p -celebrity news -car ty -brook wood -ae gon -we bbed -polit o -ph ari -miami oh -mel le -lind gren -kath arine -ja qu -it down -i em -gradu ate -gluta thione -gardent ags -fundament alism -eu l -ck less -chi ri -br w -bla k -bayley wwe -a pres -ðŁİĤ ðŁİģ -ìĸ ij -un limited -super fund -sun id -rough ness -pam pa -on em -nong mo -ick son -hospit alization -geophy sical -fra ge -folk life -fo ley -fi z -fa wales -ek h -din ar -cc ps -ben ard -ar up -zee bo -var da -tou ting -space suit -so aks -sm rt -si gil -sam aj -potam us -mi f -ludogore ts -lu z -kit ti -jacqu ie -io logy -har tz -ex hu -estor il -duchess of -cake decorating -animal rescue -adobe summit -yo ver -work house -wil lo -stand point -rockef eller -renss elaer -pres stitutes -n ene -maison valentino -ken to -hail storm -fre era -disapp rove -co bourg -ar q -and ru -ê³ µ -Ï Ĥ -sel wyn -ocean view -i book -donat elife -dani ell -da hiya -cas sin -be em -wwed aniel -wwedaniel bryan -ta pen -stan den -rainbowsix siege -pan ip -noir alley -new brunswick -ja ir -ill ation -d ous -brad bery -bar kha -ane jo -ag ir -winter hawks -thyro id -out did -ni vin -museelou vre -lalun asan -inhi bits -anti gon -amazon kindle -un tested -thunder struck -stor ks -sp age -run the -refur bish -qu ed -oh y -law and -l me -its bayleywwe -ibc show -gr ü -dr ams -denomin ational -b fm -ale o -ðŁĴ Ĭ -ðŁİĦ # -ãĤ¹ãĥ Ī -wn e -who dey -un credited -tu va -syngent a -su ther -sax on -resu mption -po gi -pen iel -on wheels -magi karp -i ñ -harid war -funinthe philippines -frame less -fer vent -eros now -eradic ated -doo dy -di av -ce ci -br il -ber ge -are i -ard or -ar sal -ani ma -alton brown -ð٤ĺ ðŁı¾ -wil ke -vi aggio -vas il -un sold -studi op -speed ometer -ment ly -lli ott -jan ata -go bucs -gar ay -g tp -fract als -et p -en bach -ci do -be bes -arc teryx -ðŁĴ ı -wha aat -ventrilo quist -vel azquez -un likely -umich football -sober ano -sideby side -sick kids -r bb -na hh -mustsee iran -mam ta -luc ina -ll in -li pped -j da -innis free -hb p -franch ised -fen nell -ever deen -deci bel -chom ping -cau s -bon illa -al pur -âĻ¥âĻ¥ âĻ¥âĻ¥âĻ¥ -voucher codes -ree ks -rand l -pot ash -north yorkshire -n sb -limon cello -lah ti -la stest -ke o -hat rick -freera if -feliz martes -extremer ules -contracep tives -cam illa -bru ch -bri bing -........ ......... -⾨ âĿ¤ï¸ı -whe c -spectro meter -rter adio -pe stle -ma am -k war -je mison -jai mie -j mm -iko yi -hav ant -gu tting -dis banded -compe l -but tocks -at birth -am ann -su su -sk en -re pos -petal ing -pechak ucha -ordnance survey -mis spelling -kit ak -ig uri -hal ting -gou ging -evis cer -es and -dept vetaffairs -con man -city v -boer ne -blooming dale -b md -astron au -ðŁijħ ðŁijħ -wwe hof -win ski -vg punite -ur b -un usable -u pan -lar gs -hf player -gri p -god ley -gad ing -co whide -weigh ting -ste gen -st ling -somerse thouse -sh um -sa kai -s é -pic h -mul o -lt gov -lan gui -kh q -juli o -j aga -he ep -fig ma -epide mics -daman sara -cold well -chro matin -chic hester -arbor ist -amo vement -agent carter -ìļ ´ -âĹ Ģ -Ï Ģ -tzat ziki -tas ker -in appropriately -host ilities -gar r -epic a -disc world -cra ps -christi ane -caf és -tipp ett -team b -strou dsburg -rose water -pu ig -n psl -mick jagger -lik able -ig inal -ic ata -huawe ip -guid ing -fil my -fer c -fearthe deer -embelli shments -cho e -ch il -blue book -big band -am sey -alli ster -\ _ -the sam -steveaustin bsr -spiderman homecoming -so bie -rich field -pr ato -parac ord -o skar -non profit -lar val -im at -daniel andrewsmp -cly des -blen heim -ban ne -avin ash -alad ha -ðŁĵ¢ ðŁĵ¢ -âĦ¢ , -zombies quad -wor f -vas sil -sc ada -profan e -over t -ny man -man zoor -li vers -ko taku -kin go -glit zy -fre igh -equi valence -env agency -en sen -en liven -den ouncing -crest view -cl ere -city beer -chanc ery -atle tic -ag ang -wra paround -v italy -to remember -stun ted -slap stick -se phar -op w -newyear new -may ak -li ev -ker sh -fou st -ef g -bur ge -au vergne -ðŁı ¹ -ëłĪëĵľë²¨ë² ³ -xen omorph -uk iss -to ic -rifle man -phal lic -per turb -leg ac -isu ke -hyper baric -hall er -elg ort -don an -con fox -car ron -cab lecar -baby daddy -aby tes -wh nt -war zone -treasu ries -swal e -scal zi -pes ach -p ous -norman ikor -montal cino -mid gets -kourtney kardash -jo dre -hy person -hi di -her by -har ra -guj ran -gu ppies -family first -f ach -con ical -ch ace -ar mie -ид е -soli dly -shay na -segw it -rough necks -may im -macro economic -ler oux -len adunham -k tg -in z -hend rick -gui mar -furry fandom -dest itute -z aire -sun fish -ro za -rac esonoma -r po -not withstanding -is chool -hydrange as -ham ra -generale lectric -fon te -fe w -fairy house -comp tia -bet as -bed head -b drm -ag ini -aaron paul -ðŁļ © -ðŁĶ¥ âĿ¤ï¸ı -ðŁĶ º -ॠIJ -w golf -te ater -ren ter -re so -qu are -parti ality -lac quered -krasno dar -go cu -dyna sties -dublin city -cle ef -ban try -advent u -abhi gya -a hai -) / -ìł ķ -yarmou k -wie der -wal est -u zo -tetsu ya -success factors -schwar tzman -ne bo -me ttle -mc man -hol kham -gandhin agar -esp nc -e tro -bo st -bel u -av ari -ðŁij ľ -zombiesquad hq -wal dman -wa cha -v tv -sh hhhh -russi a -ra itt -prest wich -normanikor dei -mar zano -lu as -liqu or -lig and -k ck -k anna -insta video -gul shan -ge oc -fright en -dr tedros -die mannschaft -cheese board -biom imic -an ze -ag oo -vi b -tu le -tele pathy -sd j -raaj jain -humber to -go ku -fourfour two -den berry -co weta -bur go -albin ism -ac án -vasund har -to bin -sol ange -sof tens -shadow run -pro mis -pre fix -paralle l -p fd -more ira -larcen y -kann ad -j cw -hl m -her ne -grand in -gi deon -g lynd -fertili zation -fc w -dun woody -deserve dly -by ung -bar king -ar har -... $ -wu shu -vital i -too ooo -s theatre -ren ditions -pto sis -par ley -o ja -na x -li vi -jetair ways -indian railways -hand washing -guidic elli -el ottery -che sters -bern ini -b cr -art fully -al mere -ab leness -zimmer n -westand together -new vision -new belgium -mit zi -lux ur -luc cio -ku mble -is aw -he sa -gom vfc -gh today -french montana -cro sley -ce b -caro winds -bal do -b ps -adder all -w gm -ve era -vai o -taur anga -ta shi -spi king -sch winn -or ica -of o -jay am -im patiently -final sweek -fe thi -fa wsl -cu pe -cla shing -brett eldredge -bookof mormon -ap al -ac tress -ac amp ->>>>>>>> >>>>>>>> -âĺĢï¸ı ðŁĮ´ -ื à¹ī -vest ment -swi pes -step mom -ste dman -sr n -sa warenessmonth -redchillies ent -pri zm -pal ais -nd football -lea ver -in paris -i pos -give blood -else vier -el lus -de ann -clu ck -ber wyn -!!!!!!!! !!!!!!! -view fromthe -un founded -to da -tin ge -ta itt -od ors -mu di -money ball -max ie -herpe tology -gad i -fortw ayne -drey fuss -dissatis faction -care rs -adel ante -âľĤ ï¸ı -è ge -ten ement -ssss ssss -snor lax -sc ymru -personal development -ma dero -kor d -ki shi -it re -implo sion -fu x -eque stria -ei vissa -chic ha -å ¨ -Ä ĵ -tu bers -tin a -the ads -tamagot chi -sy k -sun n -sd ar -sammam ish -rene ga -prun us -ponti f -pier rot -oak mont -kur i -joo heon -howard stern -he o -ge stapo -gas kets -gab bard -conven er -brazz ers -bol ly -bajrangi bhaijaan -" :" -ðŁij · -wi dened -watch maker -vit ru -un ico -rough ing -poly phen -m the -led by -in tv -h vy -end is -cumber land -cn traveler -choreo graphers -chan te -bar nier -bar di -ë n -to ting -pa stry -o hi -mis eric -m venkaiahnaidu -kum amoto -kis sme -kin es -iq rar -h gh -envisi oning -c acci -bla ss -beauty tips -ather osc -x cel -the standard -sou q -ram er -pregn ancy -periscope co -n scc -mariok art -lass ics -ko shi -k itu -flo yds -er ma -endor phins -e aux -de compression -ðŁİī ðŁĺĺ -ðŁħ ±ï¸ı -unfa zed -te ak -set ti -má laga -mur ch -let go -is n -is awesome -inf lection -he cht -g bc -fra pp -combu stible -cali ph -black mirror -at last -ðŁĻĦ ðŁĺĤ -view finder -us af -un ta -tommy hilfiger -so wer -rug ged -nav in -lu ks -loyal ty -hs football -harry and -gal eria -fic titious -fair hope -croche t -al ver -ðŁĻĥ ðŁĻĥ -wf mu -tel enor -tai wo -sb w -sam pauk -real saltlake -reac tionary -progre ssions -makeit count -is om -inst an -ib h -holo grams -ham pered -game grumps -dole zal -di wali -cutie pie -ch ung -cal low -be coming -ag irl -ae gon -welsh man -wel ove -weap onized -slaugh tering -repre ssive -q m -optic ian -milk man -kazoo ie -indemn ity -imit ated -form aldehyde -chlamy dia -car radine -bur gun -am ah -è į -اÙĦ ÙĦ -ú s -vent oux -thel aw -the bridge -swed u -sir pat -s medley -nov ate -nectar ine -muir head -mam adou -ii um -glend al -fon ten -eas ley -cre sts -col wyn -chelse ac -cart wheel -bead work -a jac -z official -un seasonably -t singh -sul fide -steam ers -ra uf -predic tors -phe v -lg c -imo gen -ic chio -hallucin ations -dev ry -crow bar -bri sco -bonafi de -ball ondor -b wv -b hr -att as -war horse -v ss -un due -teletub bies -state less -pom o -ohio state -offici ally -no ddy -n rel -mu layam -mix radio -indigenou speople -hu q -golds miths -fin ales -f ti -dra ven -corn eli -architecture mw -å ĥ -âļ ł -wi j -vietnam war -th acker -sub set -sk g -pun x -pre made -ox bow -op cw -mo ba -man an -mal lee -kra kat -inf on -hu tto -en car -ann eli -aer c -wick i -un sweetened -tar dy -shil ton -q ts -per ri -on ite -official corkgaa -nf hs -lit mus -lan ie -kul ture -kend al -ja emin -is not -innovate uk -gran ite -gavinde graw -for far -diss enting -couple goals -br ano -bill ingham -bi ffy -whitney museum -wh d -vadachen nai -tin ned -si bility -sea ver -re cast -pru sa -orthop a -multi dimensional -mick foley -k ory -it am -haifa wehbe -diar rhoea -chau d -brun el -ðŁı Ľ -ðŁ§ ľ -wallo ps -un helpful -thecar ousell -tex press -terpen es -stereophon ics -sh ic -quanti fying -play ball -nh art -lo so -keep calm -ine s -in coherent -heat map -hayes grier -grizz led -glycer in -gin u -ex changer -auto bahn -am me -am fam -ag lobal -ðŁĻıðŁı¾ ðŁĻıðŁı¾ -work ington -under scores -su ju -sti mu -n ft -mus lin -mani sha -gran ad -forza inter -end cancer -eli est -der bies -by law -bran agh -ben assi -at man -asapo fficial -v festival -tt tttt -to ps -su mo -si ak -rin ne -play test -p ba -om ission -na ke -mu ji -mu i -major lazer -holocaust memorialday -h any -guay aquil -goodday atlanta -forever alone -disco gs -cro x -con cave -calde cott -ar ap -wind surf -teenagec ancer -reali gnment -rav elling -ram adi -rall ye -qu id -prest wick -milli meter -jud icial -intric acies -fear n -dur ch -bur ly -bigart boost -as part -ãĥĥ ãĥĪ -Ê» i -tr ous -slovak ian -red land -nev ans -mi ggy -m pp -je y -haw kers -edi th -eccle ston -despic ableme -deir dre -ad sense -... ðŁ¤Ķ -. ðŁĺģ -ภĵ -à® ´ -vi ation -the usa -sirpat stew -sad at -re ylo -psycho analysis -po demos -pap aw -ncaadi ii -mc cool -may be -her z -give syou -dun blane -cnn brk -b xl -ao d -american express -aliab hatt -ìķ ¼ -Ú © -wheel base -var und -untouch ables -thu d -squ awk -riofer dy -re assured -r ted -ph p -pan do -o dot -late ch -la hiri -l sm -ken zi -eh lers -e ko -dro ves -copernic use -be tten -be ti -ame e -) _ -vibr ate -to pa -tel o -son nets -seam er -re aves -poly gamy -pan zer -milit arization -mandal orian -h ingham -elfon theshelf -dom ore -contamin ate -con s -ash ar -akam ai -áµĴ áµ -à® ĩ -zach arias -wy re -undul ating -thank fulness -star sand -r mb -need n -n our -minig olf -march of -m ings -je u -fr yday -fau l -eamadden nfl -door man -com passion -biker ide -ay yy -ðŁıģ ðŁıģ -ठ¦ -wad dup -ug lies -ti aras -ther ia -soul cycle -s bli -ran cic -psychi atrists -pis o -p ve -p tx -nu it -mar as -jama ican -illi am -holling sworth -heir looms -hallmark movie -emir ate -chimpan zees -sweett ooth -self made -ru mpus -pl on -land es -laid law -ken ham -insp ira -hh m -cook stown -con ran -cm ll -clyde sdale -c mas -berli oz -bel mar -apal ooza -antwo ord -ale wis -ت ص -ó n -westh our -v tec -un wrap -snoo ping -she es -proof read -pride and -om eters -mani p -king sville -impacton pop -hi biki -fal un -evo ice -ash ura -aer ation -a ana -wheelie wednesday -warrior s -w enders -v fa -up side -tech summit -sli ms -phil hecken -l mu -kun s -kon da -kol hapur -g pd -embroi der -demetri a -car dy -blue jay -bay es -% ... -ঠ¯ -ze alo -wend i -v ats -unforgi vable -ms ft -min haj -m hockey -kab an -ju kes -dracon ian -damsel fly -bhagav ad -bernese mountaindog -tosc ano -ter rap -te vents -te an -sl n -share able -restaur ateur -ok cupid -modern family -mei sel -mcal pine -keerthy suresh -haiku challenge -fire dup -fer i -ail sa -adop tion -wies enthal -what sin -ugh hh -te jano -tar ry -snat cher -premi os -peter man -p mot -nch saa -me ter -kit out -gre inke -fa had -dispen se -dd l -bru dda -ah lul -z uko -wh er -way s -tid ore -staf fs -ron de -mon olithic -lolo lolo -leigh ton -kaoh si -hersh el -foo s -cha sh -centri sm -cen sors -boo z -bloom ers -black top -athen ian -you saf -sun dried -stouff ville -sj ws -renais sance -re don -ra gan -plun ger -ma bles -josel ine -infu sions -hig ham -heart soup -ee b -e bike -de wine -comer cial -b va -an ons -!! "@ -ðŁĵ¸ | -ãħłãħł ãħłãħł -ö l -y aaaay -world smileday -usc is -th as -tem po -taravi kapoor -stereo scopic -shus wap -sco ff -q aw -over stock -oppre ssors -mil d -hi aw -h ous -eviden ce -ek taravikapoor -dream scape -dar an -cle burne -cla shed -ben ig -bau sch -amer on -aly son -afri day -adel son -ac og -abi des -ðŁıĥ âĢįâĻĢï¸ı -âĢ¢ ) -waron drugs -visual studio -vis ors -theart bond -th usi -swe st -sp hd -soy inka -sor lando -sadh guru -ra isa -pe ds -ozz yosbourne -occupy gezi -lo ke -ke ast -h wasa -fashion tech -em ichael -ec rash -differenti ating -collec t -chi st -bart shealth -b dd -ase an -ag ü -z ang -wales coastpath -w ten -thresh olds -tatoo ine -tan king -sch ner -rock fish -pro bono -photo gram -ne ye -nar gis -marie curi -gau d -co fe -christi ana -berk ham -bebold forchange -be ery -b chl -archi ves -ar bys -ãģĭãĤ ī -power bank -pas ko -nefer titi -nasr allah -maur ici -mary se -mah jong -j he -it aylor -free ze -fatal moves -dispat chers -buck horn -ate day -asi r -ar bour -á´ Ģ -turf grass -tu gger -track nation -topo fthe -toen ails -sof ar -pic hu -ong ar -na seem -klin smann -ip w -impro perly -im parting -good will -gat tuso -exer cise -escu ela -de jong -bridge tte -bloo p -abull dog -âĹ ĩ -௠ĭ -w bs -v elling -tu pp -spun ky -sl fl -sin f -rad he -p tero -martin truex -mad u -le mar -ka ws -je ta -it na -fu jian -cruis enor -boot sy -at la -astrazen eca -al ani -triple j -tri z -resc in -proye cto -omme gang -make rere -ko en -har iv -excell ently -cab rio -be han -ba shes -ðŁijī ðŁı¿ -the smiths -the scotsman -tak oma -sath ya -r ri -pu bg -pi anists -patri c -p bm -nov us -nj wx -mcke on -mang led -m dot -kir ti -kar yo -informat ica -his lop -gu apos -fren chy -franco ise -for business -extra dited -deci phering -cremat orium -color ation -ble ecker -bell is -ðŁĽ ł -zi o -un saturated -sarato v -ridg eline -rare bir -r sherman -orti gas -nu h -metaphor ical -m gc -jab ra -hom os -ganesh chaturthi -foam rad -de ac -d br -bbcle eds -ar ran -ðŁĴ¦ ðŁĴ¦ -z ama -vol beat -ur ple -thick ening -reduc er -pp able -nw f -ib g -geo de -form ica -dis ra -amir mateen -adar sh -' '. -ðŁĩ¨ðŁĩ Ń -whis ker -v ars -sunny deol -sar fraz -run nings -resi sters -pi relli -mustaf i -mus ici -mc combs -liken ed -i ep -hu u -hover craft -home steading -halla day -green beauty -f adi -calis then -box e -af aso -á´ ı -wunder bar -whatyou love -var nished -v aw -toom uch -st marys -pro sen -pere tti -mu so -mo bo -mistre atment -lo dd -kno tweed -im magine -hydr ants -he se -girl scout -german ic -bu cci -australian labor -addi son -v ru -v pc -s fox -repa ira -po wai -paranormal romance -o tero -no so -ni pper -men ko -i op -em poli -cory monteith -col ts -best place -at kin -ç Ī -woo s -west man -w bay -ve ti -un regulated -the blaze -tan ja -schri stmas -power plant -pocon os -pleas ure -pa sts -official csa -nabe el -me iner -lo ath -li pids -kom atsu -iy engar -hit list -em cees -car lit -arron dissement -anky lo -al bac -afric aday -ठĵ -waxaha chie -transfer able -titi an -tar des -sus ann -shel bourne -sf mta -pizz aday -per ris -paren ts -or ting -op tion -nyc council -more to -mill ington -hur witz -eve online -dayofthe year -daes ang -da bears -car nations -ar ae -ðŁĺĺ # -ðŁĺ©ðŁĺ© ðŁĺ©ðŁĺ© -ãĤ·ãĥ § -wra p -vari o -the mighty -tas mani -so go -sierrac lub -neu ve -may ed -ma demoiselle -lu ne -k lux -hoe down -glene agles -di ga -dee dee -d cd -co vers -black thorn -bass line -bad ass -alife time -æĿ± æĸ¹ -â̦ ' -wild man -u pre -t are -stroll call -soor aj -smart watches -ro tors -radi ocity -q army -mi res -mi ac -me deiros -mabu hay -krau thammer -jaz zed -in ny -hai der -f dot -eli ka -chal ky -celebr ant -з аР-vas cul -sli braries -sas ol -pyl ons -pom me -pal pit -ol factory -missing person -kell in -inf j -fantasy land -er j -beÅŁik taÅŁ -b st -aw aaz -arraign ment -wood ville -su priya -seri o -sapar li -re va -palm sunday -keen um -gri eg -eye health -east sussex -dol or -derers fc -dand ridge -cor gan -contr arian -comm ited -blan ton -athei strollcall -am mon -ac te -ðŁļ¨ # -ðŁIJ Ģ -ãĥ ľ -à £ -the dream -scon ce -sc orn -ow c -n agu -mort ars -me sti -massi mo -lat or -johnlewis retail -j world -islam ophobic -ho ey -glu tes -ed avis -duf field -boiler makers -ba illie -ac ampbell -ðŁĮº ðŁĮº -wonderfu lindonesia -u iowa -tor bay -shi geru -sare coming -pu edo -im printed -homeof cricket -gh alib -drou in -di di -aprilfool sday -ðŁijĮ ðŁĴ¯ -wool lim -to lex -synchron ous -rag gedy -quarti er -penetra ble -new post -k sdk -h cr -char ds -call out -ca ip -agu in -zo ë -z un -you ve -urqu hart -thunder clap -single malt -sequ ined -mornin ge -mor tis -lu ga -lib or -li si -ken net -kell ys -jail house -iqrar ulhassan -ham mad -grey joy -gorge ous -gi el -delle mc -cun ha -?? ?) -ðŁĮ Ŀ -val lab -v é -sub surface -sl its -person ification -perfu me -olympi a -mik lan -kel pies -jo ko -h kane -doo h -dialec ts -cruisenor wegian -connach trugby -buc key -an cho -ðŁĵ£ ðŁĵ£ -âĤ © -zak at -wur z -westco aste -vac aciones -tel fer -sch ou -roll tribe -pinstri pes -on ine -musli mah -leather back -la ziest -i drc -fox la -fis cally -ever last -euro vision -ela ar -dream league -corn ing -carre ras -bu ech -bru den -bridg north -brek ky -bat ang -acu ity -wu z -thur les -thor ne -shaw k -shak o -se gel -res ins -rajapak sa -quint in -purp lish -mcgra dy -k sl -jam meh -ilo u -escap ism -e well -e mar -defra govuk -configu rable -bu dur -blue bloods -becauseitsthe cup -aw en -ashraf ghani -ðŁĴľ ⾨ -vehe mently -v ries -un se -tu tte -stan wawrinka -ro lo -re home -rashi d -pre side -one pride -ole k -n sh -mug shots -mu ggle -ma sia -li ot -ju lexis -helleni stic -ham let -gr ating -forfe iture -fat one -divor cing -de porte -british flowers -bor go -bb ca -an sa -ÃŃ guez -wor tham -tr w -tele phones -sur plu -sque aling -sab c -ken e -hu gg -g ath -face mask -elastic search -daysun til -cr t -cheese burgers -cast elli -busch gardens -bu cker -bhu tan -amber alert -all llll -accom od -ðŁĺİ ðŁĺį -ðŁıĭ ï¸ı -womenin biz -with her -wa el -tech talk -orang ery -ne ots -im plant -il ani -ha gi -fool ery -donat ello -do sis -de frost -co host -christmas jumperday -cham pa -break age -al so -academy awards -ac iam -war hawk -se ys -rodol fo -pizza express -pec toral -mon str -mag ome -itz hak -iam stevent -geop ark -fal do -f fier -embelli shment -electric vehicle -deliber ating -de mille -cat ello -ar yo -% " -ðŁĺ § -ðŁĴ Ĥ -world bank -willnever getover -uro vision -tribu ne -thu b -sky lights -re et -ol use -mccoy dl -mc bride -ly la -john shopkins -iceland air -i vi -ge tac -gam ut -fu fu -div ing -descar ga -ctv morning -corrup tion -clint bowyer -char on -bull i -boney ard -blind fold -be ca -ax e -artist ically -af ra -ðŁĮ IJ -um kc -ui uc -ten or -tam sin -ski ff -si ar -plo v -photo shopping -peter head -pe des -online business -no bis -mum ford -je bel -ilove sydney -gy ros -ema baras -di mmer -da hyun -co xon -as ds -af ton -word smith -whit by -up with -tuf nell -pi en -nr j -kak is -hr va -ghos n -get me -gar of -ft x -deta il -demp ire -bomb shells -bnppari bas -ben chers -abbrevi ation -åľ ° -woe fully -way ward -shizu oka -sche ese -qpr fc -prosecu tions -pc g -ori enting -nanop ore -mon ta -limous in -la ther -kry stal -hor ology -h ks -geo sciences -delhi police -alo gy -waz a -upperdeck hockey -shar mila -se pat -rock fest -ran ji -pd illon -musa shi -mumbai rains -mi zz -mccand less -mahesh wari -ma vin -fol lett -de young -con figuring -cbc ns -ðŁĮ ķ -ye i -what sup -vivac ious -tru tv -tre sp -tagh euer -t veit -pat oran -nswr fs -mu mps -mi reland -leed sunited -gau ze -efferve scent -de mont -cham plin -canyon lands -boss lady -bo az -at noon -⼠ªï¸ı -vel u -u wa -ter a -sportsc aster -sme g -s loop -pininf arina -pe ori -o ire -mur r -gla de -flood plain -esri uc -eco logically -cier ra -car bo -bu stos -b dr -un wrapping -ta stier -shop online -sch lo -sau dia -run r -pod squad -nm pol -moccas ins -mix ta -mi shaw -mam oru -jin der -gin obili -f kin -ep as -bu z -bel tr -bar ran -av ance -age orge -zx spectrum -thor o -ox en -noble man -mobil ised -min ato -manche go -il lop -hel ix -g local -etch ings -energy transition -dj b -dead beat -cul p -cor ps -cheap ly -carru thers -big boss -b ny -ar ray -and u -ack man -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃ -tsu basa -strong women -river bend -reale stat -nvi diage -n abc -me dea -ko el -kefal onia -kar una -invo icing -igu o -i ola -ham strings -hah n -fresh man -flat mate -ferre ts -di ppin -dez bryant -de regulation -crab apple -bo va -ari ki -ðŁĵ Ģ -ä¸Ģ æľ¬åĭĿè²ł -à¸Ļ à¹Ģภ-vijay fan -t du -sli dell -si won -serv ing -sam os -sa ker -riti ka -naw ab -mer le -jar rod -james gunn -i anc -hiro shige -hil t -green sburg -gilli brand -gibber ish -fire and -fin ch -bing ley -bi di -bati ste -» , -widen er -wash ere -wait list -traver sing -tooth ache -sr r -spir aling -space port -ra hane -prithvi raj -power line -plumme ted -pien aar -mo ven -mac i -lat oya -kil ly -gu thealth -ex olu -emp ir -ec ake -direction er -ðŁĺįðŁĺį ðŁĺĺ -z ta -y eng -ted der -surfri der -stone street -micro organisms -mar ra -man ly -lovel i -lee jongsuk -labra doodle -hy at -heen an -har v -gwyn ne -galvan ised -alam os -a ami -ë¬ ´ -toby mac -theno ise -stronger in -selfie with -se edy -sc alex -saurabh raajjain -q ash -new girl -mccut cheon -madewith paper -lo le -he ure -fet tered -el it -dur in -de cs -coffe elovers -chil tern -cal aver -ble ach -ad block -ac wri -worri some -wi than -vic enza -ushu aia -under lines -tax able -tanzan ite -t elle -sa ith -l wa -kr ant -j anc -harne ssed -hadri answall -h isa -gw p -fam itsu -ex tran -dux bury -d aci -cow boys -air tattoo -ag io -acqu ittal -south african -ski jumping -shan gr -postp onement -plo s -paro dies -nr dc -mar z -lynd hurst -le ón -ki ele -jo res -hb k -hb g -coconuto il -car bone -- [ -yaz idis -vijay an -urban sketchers -sub traction -na je -lin dam -gran it -courage ously -chillico the -carpen ter -barn stable -agu y -wo y -ur r -t sun -star ting -ro ssy -prin cely -pin c -mak si -luty ens -ker rie -ke tones -it was -isab elle -ilove dn -hubb ell -euthan ized -eid aladha -ci h -chapp ie -ce ans -anthro con -! ðŁĺĥ -zar ry -wb ff -wag amama -travel er -thi st -tbl st -sleepy head -shau kat -scar ry -qu orn -porter house -nu ck -mu gen -let splay -l mt -jo eye -hereford hour -d row -bunny men -bra ham -blow fish -biop la -bee zy -ba char -am na -à© Ģ -yemen is -y ola -tr b -sur tees -sc af -sa quon -sa j -quintess entially -pertur bed -p mg -ottolen ghi -no fthe -new ness -n elli -mar ish -k illu -g tas -dari o -can ales -adi ge -a thology -wich it -vos ges -sweet corn -shear water -schul te -sch uh -ruleof law -re played -land ing -lampp ost -hyder abad -fo co -en listing -electro pop -d fm -buoy ant -bewit ching -bethen ny -aryn go -ac offee -a world -un cool -tl chat -ther u -swin don -pang asinan -ox ing -ne stl -mp s -mic o -mb it -let them -ho ge -fore sters -fl aring -divin ely -de ano -bron n -bl m -and az -ai ai -ty us -tn bc -st j -snu bs -shun ned -see ya -rodri gue -pi ppi -mish ka -horo scopes -harb ors -gge tt -game over -fl gov -emp r -eldr itch -clemson fb -ch ri -cate rers -car ine -ban zai -authentic ated -ano ka -ali d -alex oloughlin -adam schefter -! ?!?! -were ld -wa il -rock it -pa stic -le by -kel pie -j ln -fe tch -d afc -ðŁĴ · -ðŁİĤ ðŁİĪ -z ild -wolf hound -wa st -the talk -sar geant -no reen -mom mie -jor is -hen ch -doctor s -com ida -colo red -aggreg ates -⼠ħ -âĶ ĥ -w ll -to ka -tipper ary -super villain -shou se -sach sen -practi sed -pi ons -pen sa -nk la -iq baale -infan til -huffle puff -homo gen -her ders -haz lewood -ha q -flyair nz -elg ato -du chy -demp ster -day na -d aga -cp f -biele ma -ald ana -mass y -leather head -kur z -i ar -h cc -gra sping -gan nett -explores ask -ðŁĻıðŁı½ ðŁĻıðŁı½ -Ù © -vox el -vig go -tw ay -thunder cats -thru way -star ke -shepp ey -plat ts -no val -k pr -john cornyn -h sf -gu ppy -fitzro via -fe stuk -enfor cers -de con -chall ange -bodh is -bet ch -beach comber -ðŁĶ ¨ -un corked -terr aria -stone house -slee povers -she th -puls ating -pan os -p of -julie plec -godal ming -ever more -cli pse -cal les -bio blitz -bi olo -bi ggins -bang tan -aw nings -ali stair -îģ ĸ -ypsil anti -wtn h -we ver -varun tej -si willnevergetover -san fran -sab athia -pers and -ogil vy -ne opla -nand it -man no -lac a -kar r -im plantation -i big -elin or -du bb -ar dro -af ca -y ric -west cork -vic ks -valeri o -trin am -scep tre -rusty rockets -osc uro -no daysoff -kvy at -khu x -ic ha -ho ge -haz are -han eda -gugu dan -fr mr -fireup chips -fer mil -fay sal -brit ann -bran stad -ben del -art inez -am bar -ak wx -w smv -tow ski -ti am -tam many -step mother -re dre -pas chal -n fd -motor happy -marion ette -litt lec -keeping it -gri eved -gl r -fit a -f of -coloni als -chevro let -canop ies -can ale -ad z -ðŁIJ Ĩ -ðĿIJ ¨ -ye aren -ultra book -truck load -to tt -t gr -sx c -sick o -scru bber -sant ander -republi k -post mates -pic stv -perovsk ite -most wanted -ml g -me k -labor dayweekend -kir t -ka f -heart breakers -gym khana -fl ange -es rc -d pd -bush els -ban field -ðŁij¨âĢįðŁij©âĢį ðŁij§âĢį -ula ganay -then ational -sp ly -shari ah -sh fly -radi ated -ordin ances -offe l -mar bling -link up -like me -ke effe -k tn -jack daniels -her m -henri ksen -hen shaw -han sa -guaran teeing -gi ster -fin minindia -dest abil -dental care -dad ar -d tg -bc ndp -archite k -à® ° -vincen nes -spino za -sold ado -sale sian -mal uma -lyn sey -hit s -famil ie -c ingly -> :) -âĺĿ ðŁı¼ -tam ils -photo shop -pe art -palliative care -mar tie -lagun itas -knuck lehead -j pop -inf er -ep am -cor ded -che mise -cal atra -blo ons -ðŁĺįðŁĺį ðŁĺĺðŁĺĺ -z ima -ww r -tour n -t sub -sinu log -r na -p ith -marj ory -listen in -l gus -kil im -home ostasis -hal lett -guil foyle -gri g -go har -ging i -fre ts -ca ked -bul b -bike packing -band anas -ally son -ag gro -wag oner -v te -urban i -tu tus -too faced -the musketeers -ten et -spoo fing -se es -san fl -qu ash -prism acol -per ton -pe ddle -mk z -mer cs -kon ia -inci dental -gimm icks -fur r -erkenci ku -dra wn -devil s -cont in -burkin afaso -belaf onte -ðŁ¥º ðŁ¥º -wit ting -stef ani -sat com -ole h -kru l -joshu atree -hy omin -gest ational -black bear -bird watching -bai lee -are al -ak as -ðŁĩ¾ ðŁĩª -ã̰ ã̰ -yaku bu -ty n -thin nest -sand bach -p msl -oo da -me so -master node -mahin dr -la ferrari -ice hogs -g pp -for ney -brant ley -bl ick -ari za -al il -ðŁĺŃ . -ðŁĺIJ ðŁĺIJ -ðŁİĥ ðŁij» -wicke dly -w fan -thecomedy store -ta pos -sensu ous -se ul -rol ly -re sent -pon ta -pleas urable -on el -military history -jhan si -je wski -infl amed -god like -eic hel -dres sup -dist al -cru d -bun gle -bol sa -boiler maker -as ch -abo ys -à© ģ -zam ani -ur man -tic ino -thegood wife -thecat reviewer -taylor caniff -sri vastava -river boat -random actsof -pen e -pc sos -or zo -ny ias -ny ers -montp elier -migh tier -la autoshow -ku li -kal ani -ju ta -in comprehensible -i believe -hunger ford -gam boa -fore sth -dee gan -day break -cr ouse -carp fishing -can i -boy zone -blo ating -bil as -bharatanen enu -an ac -amo red -ðŁĸ ķ -y kj -w mas -ti red -se apor -ro i -pe tt -op kins -multi sport -ineff able -in capac -i ji -fat ass -es lone -document ary -clip board -ani mas -ang sty -am ou -ag irls ----------------- -------- - ¼ -ucl an -the witcher -that awkward -shut tered -sen ergy -pres stv -por scher -mis aki -ke zi -inser ting -ha veli -e ap -dispo sals -di keh -da egu -cur rants -cro pper -charol ais -c una -as f -yorkshire day -villa iny -ve ga -ruben stein -rack space -pr onged -pon i -ow ings -nikol ay -ne sh -mu mu -mck end -ma ka -ly s -kis sing -k offee -jon jo -indi ec -incon spic -fl atten -ex h -essential oil -ec are -dock ery -dis illu -d wan -coer cion -^ ___^ -super gt -sne ij -real mike -par taking -michael b -man cha -lak me -jab al -green s -doyou know -dis ation -cur tain -cat skill -believe tour -amalgam ation -ag itated -un registered -sl at -sha ho -ou thouse -mel in -ku stom -jc poa -grenfell tower -es ar -er yn -eff lu -cau very -c sa -âĸ Ī -ur is -traver tine -thevoic eau -teen top -pry de -ple isto -pan tries -pack the -or r -ntv kenya -mahin dra -kar los -juli us -ih ana -harle quin -gi fu -gen stein -der ails -coted azur -control now -bi kin -bc ferries -bb ca -ðŁĺĶ ðŁĺĶðŁĺĶ -ðŁķ µï¸ı -ðŁĮ§ ï¸ı -zulfiq ar -zero es -wester nu -vit iculture -ver don -teen mom -sun oco -snat chers -shorth and -po real -net z -me do -mark ruffalo -lo kesh -led ley -knit ter -insta story -fishand chips -fat i -di mon -bk b -artstation hq -vis cous -rehabil itated -pin kett -not meus -ne scafe -j ka -gareth bale -co ch -austral asia -ale ssi -adi pose -a ou -ðŁĻı âĿ¤ -à¸ļà¸²à¸ Ĺ -viz sla -tw n -to pi -schwar tz -scep tic -red is -po sto -pieter sen -n sa -lu mi -favour it -de throne -cy d -youn gh -tan ked -strick er -strategi zing -sho pee -raj ah -nic om -march ant -kam ra -joong ki -is ur -ipad games -i fu -green space -gen cy -e sport -din c -cru k -bis sell -bec ca -ay t -aq ours -andy bvb -ðŁİ Į -Å « -win ked -welling borough -twitch sharer -seg all -re cht -p tt -or dia -open text -matthew daddario -last day -kat sucon -just ins -invo ked -dk pol -cac ophon -bre yer -beck en -az ar -ars ène -ari o -ageof sigmar -villalo bos -torch light -saltlake city -pon ty -piece of -nw l -ne gev -l ente -l ci -k wok -e gh -dise mbar -cor sage -consi sten -charli ec -bow ness -blo at -bel tand -antic oup -ðŁĴĵ ðŁĴĵ -shul man -sho ver -sha shi -retire ment -remo tes -re wa -r ci -protec tionism -ob d -mr l -mountain side -mit el -let stal -jami emc -hil de -hey its -german wings -flex es -bush el -blu dge -and hi -age ism -ab owl -whi ley -un reported -ter prise -tam pines -som bre -selfie for -sd mf -sciencen ews -radi ators -periodon tal -ny la -nascar hall -mer z -mechan ical -made of -i wish -e akins -capi strano -angel ine -ai ja -?? !!! -ty ra -th aroor -seat ac -red men -red fored -pl b -modal ities -li ms -incroy able -hol lows -gu ing -flann els -cu miklan -chel yab -bjö rn -bb its -ðŁ¥ ŀ -will ingham -v tech -trek kers -tr al -tel cos -st wee -represent in -red hot -nepal quake -nanomat erials -minn elli -lau ter -kon ta -kail ua -jo cks -hi eld -fanta stique -fal ta -echi dna -cler gy -cl oned -calatra va -be prepared -bat ts -bak o -anch al -à® ® -yu u -tennes see -ta chi -snap matic -seam stress -sab lon -rie del -ri kers -rakshab andhan -qu asar -nach baliye -morecam be -ko koro -epi k -di marco -day sout -blum house -a vision -ìĹ ´ -ãĥĥ ãĤ¯ -vish alkofficial -tho th -s girl -ro zier -painting warhammer -observ ant -nie wski -l ous -jan ey -itch at -ge bouw -gam elan -fin nan -day star -dance moms -crou ch -city police -ch up -archi medes -am aka -alien ated -world vision -usa af -tuni sie -re constructing -pag li -over seen -n lr -min of -il ish -glu m -f pd -et ze -e bu -de ft -conqui st -bc storm -bag ue -al te -ah our -ãĥ Ħ -zi en -work life -va ing -ur inals -tren to -sou ness -shopper shour -provi dent -new ood -le sean -le hill -iron wood -ic ab -ib t -ia af -ha pless -gar ag -fibro ids -dishon or -day challenge -curve ball -crow ther -cn f -cataly st -bal to -Ã Ł -vel aik -su ey -si ed -shav in -sant as -pro prie -keen ly -j ima -extre madura -differen ce -cham an -á ħ -zor an -y ari -x w -wh acked -un diagnosed -trade marked -shrun ken -sap ling -revel stoke -mu la -marqu and -man irat -ir reverent -international yogaday -hai kyuu -gl or -gh ari -done channel -cau k -awaken ings -ventil ating -t list -su wan -sam ir -rain drop -quat ro -pro fi -polar bear -normali zation -mcle more -mb as -math ru -mar ino -man ya -maic hard -littlebig planet -intermedi aries -i hm -her rick -hel les -emer ge -consequ ently -ay az -allga ier -vote themout -visco sity -tu mp -ti ber -tar ps -take uchi -t illery -special offer -shop now -parmigi ana -parisi enne -o sso -minneso tans -micro chipped -merci lessly -kaw an -kar li -indi gestion -in vert -han uman -hali k -guar dsman -good tobe -ger ani -ero dgers -emer cury -desp ised -cu pof -bir n -bbc wm -b town -ðŁIJ Ĵ -ws g -wi thered -who vian -vel d -thal le -t ach -sub standard -stock dale -sal ar -oba femi -g ine -fal ter -disal lowed -book blog -bl v -awesom en -âĢĶâĢĶ âĢĶâĢĶ -yellow jackets -woo ow -water brew -un tapp -speed test -sin action -sch elling -sa ic -ru pi -re fried -line sman -k se -fi v -euphe mism -do bie -bur go -anupama here -åĪĨ ä¸Ģæľ¬åĭĿè²ł -vol te -truste d -states men -pre release -pag ina -osp rey -op reps -oec d -north view -int ol -how ser -haw i -evapor ated -cros by -cor rer -cine mark -bur ling -biom es -bhag wan -bedand breakfast -b union -aure us -am z -⼠· -wre kin -winter green -walang pasok -traf ford -tn ick -sun burnt -sf jazz -remembrance sunday -r tn -pi rie -nor n -new ts -la ika -knock in -ju mi -fertili zed -f ns -el ang -change over -canandai gua -argon auts -ur s -so cin -ske wer -sioux sie -since rest -saif alikhan -jav anese -fe sto -e ren -dog gos -descan so -body building -aid s -yu to -tab ata -stry der -se red -scre ed -phon ie -phen ia -o er -mach a -jeong yeon -jen nette -in saf -gloucester rugby -da igle -bollywood news -biop rin -bay nes -autumn watch -í į -æ° ´ -ãĥ ½ -usc ap -tol u -the score -the brave -over used -myo cardial -ku biak -graph y -fast net -eth ylene -enjoy life -da ikon -chir p -be inte -ur vashi -tro cks -shi ki -se id -pri ya -pasteuri zed -ma en -lu gan -le ann -ho ddle -g we -fran zen -dyk stra -car ding -bum rah -berk shires -bed spread -ax ton -afremo v -к а -we ire -se my -ro sin -ra es -jor din -flo pping -affin itweet -abse iling -; ). -& , -ðŁĻĭ ðŁı» -ys f -wake man -teign mouth -syring es -sy p -se kar -sav ind -po co -panther a -orient al -myo pia -mind less -med twitter -man se -log on -lis ch -ju wan -inter active -integr ated -ha pha -gigan te -en compass -d ce -cr ane -col ate -chil is -chelyab insk -bridg it -ashwin i -alt press -ðŁĻı ðŁı¿ -yoak am -woo zi -vets get -vetsget scanning -spin nin -sa ida -reptil ian -pinot age -ok ayama -man hunter -kle pto -jarry d -ip sum -ii it -hi rez -ger rit -fr ill -euro millions -c mm -adic hie -ðŁĻı # -ðŁĺ ¾ -ë ł -thur t -theli ght -stra bane -sko kie -sk al -rid ley -re introduce -pro ge -paul ding -open studios -li se -la velle -go stars -ev ille -ename led -corpu schri -clau de -cir que -cin é -child like -bobs burgers -bi ersack -al jaz -wen lock -then ame -tele portation -taste the -something new -s je -ricky pdillon -py l -ox in -om kar -nau ld -mile sdavis -law al -kha bar -ke mang -jor die -homo sexuals -euro stat -d do -cor rhi -ala qsa -ðŁĨ Ĵ -transiti on -ni ge -mx n -mam iya -m ki -kings ford -he yyyy -formul ate -dar dan -d reading -cb sphilly -cashi ers -bra ver -ater alism -abbo ts -] ' -á ¥ -trick ery -ter me -spi sil -space time -simple mente -sc ac -ru sa -ra za -ore tti -mon ico -max imo -la ia -holt by -ham ann -er is -ener gie -duf ner -cha eyeon -canap és -ab t -vo re -thread less -storm watch -shre w -re loading -ph leg -lewin sky -iu fb -gel ly -cross ley -am iller -al pert -ว ว -zand voort -worship ful -woman sday -wg tn -ultr amarathon -ty la -tat ty -supportour troops -numer ic -nom en -newsp aper -net book -meridi en -magome dov -leav itt -islam orada -flouri shes -cook off -convin cingly -choco bo -camero ons -bo ggy -awa ke -allfor one -ai fe -à¸Ļà¸ Ĺ -wel comeback -trit ons -schoolboy q -pew pew -mor onic -mail day -laure us -k sr -jer maine -j rn -gun nery -ew b -be is -ap ap -ðŁļ £ -ushe red -swild cats -sp here -secon f -ra jan -pun y -pi po -ma ffe -lesp aul -lar naca -il orin -hu guen -hate m -for mosa -chri sd -c jp -bla zing -barak at -ah t -aga th -ac cts -` ` -ìĶ ¨ -wester ners -villa in -un responsive -tu scu -sof ia -sli ther -sh mu -sen doff -quarri es -ninj atur -jaff na -jacqu es -intensi fication -il ang -gu b -glad bach -ero ding -env agency -elec t -ci pes -chat el -ca ñ -btsx amas -am h -aber nathy -ðŁĹ ¡ -ta ze -sthlm tech -stein meier -sing led -sal ta -pleisto cene -pix abay -mel k -ma theny -m hu -intere sting -ever green -eng l -em sc -cz w -amir kingkhan -" @/ -whats next -the empire -swith out -ss as -say onara -save d -s women -rite sh -repleni shed -po il -pecu li -lu vin -in or -ic ac -e os -cryp tom -cra p -ch evening -bristol uni -boe heim -bewil dered -zano tti -ye wear -tre acy -tc w -scu pp -sant amaria -rc car -h gc -faith less -do como -ch ug -cal oric -bureau cratic -anth apuram -yeg traffic -wellcome trust -we ve -vac aville -ump iring -son unig -road america -qu itter -pic story -pag en -oak en -miro slav -masterche fuk -lou se -lon eliest -har ney -gal eri -ga shi -fi fam -eti ha -d tr -bab o -abi ola -. $ -wit ching -wi erd -warner bros -tou rette -seung kwan -refriger ators -post al -pics depot -par an -mega force -m golf -le imer -l wb -khe dira -je y -ha asf -gra hn -gerald ton -en actus -eat drink -cat en -brat z -bian con -b ge -wha dd -w so -the food -subbar aj -sty lo -secre tion -r do -michi el -ko b -hay ashi -haw keye -full screen -dinwid die -de fund -cullin an -cloud less -bl g -ãħłãħł ãħł -wr on -weight lifter -team dcs -te ve -student s -sr ry -san key -pinec rest -mu sta -kas ama -jan ath -fren z -forthe win -ev ga -bath time -auto zone -all out -after work -ðŁıĪ ðŁıĪ -z epp -tempe h -siob han -sho hei -rez nor -rarebir daler -peter sfield -non binary -na hl -mer gency -kar sh -gu er -etsy handmade -din the -crock ery -cri ss -broad sheet -black town -balac lava -athin ai -" @. -âĻ © -wor rell -wal le -stpi india -ro mi -rel ink -q ty -pent land -ngin x -mo xley -mar ten -mar cos -m sla -jar row -in ton -huff po -he ave -flow ers -fc cincinnati -dr kumarvishwas -brain injury -blue planet -bed ded -ann u -anag i -âĢİ # -zen desk -win dle -ven ue -the color -tg v -t bex -st pauls -san dow -parish ad -of cal -north coast -mujahi deen -mu mm -miit omo -lin ce -ksd knews -kat ona -jud waa -jou le -im all -heart ening -head canon -gou rock -golf course -fan photo -er of -dro cks -dime bag -david lynch -cur itiba -az ov -aft union -" ] -âŀ¡ï¸ı : -âĺ Ķ -wil lesden -wg tn -trek kie -sx swedu -sta vern -sh f -ru mbling -re counting -pot ence -mo stra -luch alibre -lower show -kab ila -hir ani -gavin newsom -dur r -chicag om -bi ma -ber ni -bab oy -arri e -ðŁĻĥðŁĻĥ ðŁĻĥ -اÙĦ ÙĤ -y pj -vis itu -v pl -phil omena -per pend -ot sego -on zo -n bi -metabol omics -mac ri -ll n -kap i -ju ries -indiscri minate -hosse ini -hal vor -goldeng irls -gargo yles -f bu -equ ates -du moulin -chi ma -char is -al derson -âļ½âļ½ âļ½ -âļªï¸ı ðŁĶ´ -ww wwww -vick ery -u lus -u eno -spol itics -sol aire -so hio -sar ang -saf ter -protec tion -peabo dy -mol lie -l fg -kail ash -k kriders -itu ate -ingle se -hand sets -drag way -car pedi -car ib -az el -zag ato -street z -ps g -pl atten -pal las -mapu tra -hoo ky -flame thrower -elly wood -dir tb -dig ans -cli o -chal ce -cap ris -book oftheday -am ra -am ite -wor thing -wis c -who soever -v bc -tom eter -stac i -souff lé -shoul dered -ship wrecked -sethu pathi -sch loss -o dern -jess a -ga fe -g cu -dar gah -ab dou -ðŁĴĽ ðŁĴĻðŁĴľ -women and -vern is -tam asha -re pr -rarebirdaler tuk -poiti er -live install -le ly -kla ssi -kha i -d bd -cl in -cann ery -birch wood -beck er -at ara -anamor phic -american horrorstory -tur bot -thunder dome -ter remo -size able -r fd -mus ics -mask ell -l bl -kap adia -gam bian -car vajal -bl unders -aker man -wi the -tembe akenya -si mar -ri jiju -q w -press o -pr ins -pad dlers -morgan stanley -mali ki -lin ne -in j -history museum -dat af -cou lis -cor onal -compla in -be gum -amo e -ai me -a hier -åĮ Ĺ -wc i -ve ster -uni vers -uil state -ser kis -r dg -ohh ill -ni gg -ne sco -mccla ren -li zar -k het -indi annavy -his ense -fi ably -do ze -digiti zer -cardiff city -aw ssummit -as ami -ãģ ¿ -âŀ ¨ -xk cd -w ounding -ste ff -ni shi -mun ger -mil ks -manife sts -man ju -front lines -fro id -fri ended -fall colors -du san -dream cometrue -da iries -d nc -п ей -zer man -tomor o -the aviators -sing ed -shelby ville -sch wab -port lao -plov div -pi pa -over coat -muk ka -marke table -ma zza -k lum -is as -ginu wine -fortun er -dur g -dri vel -claus ura -cardiomyo pathy -brisban eroar -bo des -bak ery -b dl -wo donga -wi shi -utr ition -ther ain -seman gat -sali h -po catello -p â -olympu suk -oc kets -inci sive -fas cial -dr dre -cushi oned -concert photography -cathar tic -carol ina -c ze -bunde stag -bas se -ban on -b fr -b afc -altrin cham -westcoaste agles -victor ias -tar aba -rock smith -rizz oli -pe cking -my lan -f pi -dazz ler -dav es -conjun c -cal f -associ ating -world book -safe ties -s fo -r jal -novel a -monash uni -mi do -meth amphetamine -luci d -le mond -k bo -innis fil -glen core -du sh -buck ingham -bo ssed -bhu shan -bb cdp -atlantic city -ac kie -ðŁ¤© ðŁ¤©ðŁ¤© -çľ Ł -wasps rugby -us fs -ur umi -o vid -monster hunter -ma aa -kant ar -jer om -i photo -ho si -beefeat er -a ef -ðŁĩ¨ðŁĩ º -ðŁ¤ Ŀ -water stone -vit ili -tail gat -squ es -pro phy -mendel sohn -lazy sunday -kaizer chiefs -joh o -illi ps -hau gh -ha kan -fortn um -dro bot -do wager -do ily -cfis d -canon photography -bry son -bri erley -an sible -am persand -tall is -summer holidays -sof icial -sa wing -river bed -q mul -po zo -onen ation -nah j -mon davi -kop p -h db -columbi a -co burg -bar rell -bankholiday monday -as sn -ang ara -andy warhol -amend i -affili ations -absen ces -ðŁĴªðŁı¼ ðŁĴªðŁı¼ -âĶ Ĥ -win sor -victor ville -uk awa -tor sion -tau t -sport sin -ski ed -shab ba -sab in -popul ace -nir up -mari elle -li mping -kaohsi ung -high ly -h fa -forç abarça -flam in -don is -de iro -character ize -cay o -b he -ano tha -ach o -ðŁĺı ðŁĺį -wind proof -uw g -up lifted -un tv -shum pert -os oph -mr kt -mi amic -me dev -maser ati -levit ate -jack s -gr at -fru tti -dee ks -cor oman -apar k -íĶ Ħ -âľĮ ðŁı½ -yor ku -tra fic -sur charge -stro gan -ster o -ste acher -shad ers -ru tte -roadto omaha -po dge -ou trigger -o wo -narrow boat -mu ggles -mo hun -ket chikan -kawar tha -j cm -ine scap -iguo dala -hang gang -gra do -colle n -cn h -cla sse -cir co -car afe -boon docks -ðŁ¤Ķ # -wheel house -out crop -nith ya -ni hil -m per -gad v -d rick -cowh erd -clear view -catalo gues -bit torrent -af el -yo be -wrong ed -u maru -tom s -stat ler -sle eds -sal uki -ropp ongi -pi ston -not so -na ilers -heterogene ity -gra sse -eddie hearn -cle e -bau delaire -yellow ston -vintage fashion -ur mston -trevor noah -ti veros -tar yn -sul ley -qot sa -pay ne -no wak -nevers ay -n zo -medical cannabis -magell anic -keepit inthe -ing rained -in l -im penetrable -i fr -for u -flouri shed -em mam -e steel -ba ikal -asse tt -app development -al con -aj ag -zo on -v anya -she kar -schizophre nic -pp pp -new books -mon real -might ily -man bij -lau trec -ke eling -ho omans -god smack -d vi -bo gut -bene detti -au ma -apprehen sive -ðŁĴģ ðŁı¼ -woo bin -sof ig -shepp arton -sa ira -pro t -petit es -ms gr -maddie ziegler -fu zzy -fu kin -f te -check lists -c fe -au der -animal planet -yas achi -wan n -ti poftheday -subsi stence -ss a -scrat chy -mor oni -kle z -estre llas -eg f -creed ence -consi dine -candy man -bull frog -am ash -ðŁĮ ¤ -Ø§Ø ª -y assi -spri ze -sick ly -sab s -ro we -ro sco -plumme ting -pi ven -oooooooo ooo -ni rav -na bel -moo cs -man ors -loit ering -lib dem -gi acom -erik son -den bigh -cur cumin -bi har -ar ob -ac cc -¿ ï¸ı -wall st -tri but -suscep tibility -sgo fficial -re solves -pig gott -p end -mb aa -john nie -job sin -iri global -inqu inn -gav askar -fl amed -es ss -ecc mid -di acon -detroitbecome human -c cio -bronco scountry -berg kamp -" ðŁĺĤ -yach ty -survivor ship -st itt -s open -pt sa -mo er -lec o -kgw news -hel la -grand national -ett one -esthe tics -dent ure -corn meal -bt f -beat plasticpollution -ani sh -amand ak -ðŁIJ¶ ðŁIJ¶ -ta pa -so iled -shou trts -nol a -no sh -n wan -love me -li zz -gene sis -gas ser -gag ner -fre donia -fa q -euph onium -dissi dents -dev t -col angelo -cirrho sis -cas sia -br ack -ap ink -adverti ses -пей заР-yo lo -u is -tay tay -sub titled -par se -ny ce -no ve -mor zine -mar imba -mac eo -lanc er -iam beckyg -i know -h ml -go lic -exoner ated -eco chic -dis agreed -cy non -bruden ell -ðŁijī ðŁı» -win sor -tv o -tul la -tranqu ili -town home -sport media -sel ig -sebasti en -sa jj -resili ent -re joint -r hum -oneminute briefs -na oki -ke shav -kam chat -kah f -jeff lemire -co rel -bo gen -... ?? -ðŁ¥ ļ -wish in -wild ness -we bbing -wales online -vent ana -trash can -spor tage -na it -ló pez -irr fan -i ago -hl hockey -had dish -fug itives -free stuff -f bm -ey ck -bi mini -anakar ylle -ail ment -acadi ana -aal borg -tae il -stylish ly -saran ac -republic an -linke din -l na -kirk ham -gor ams -google edu -getty sport -ener gi -ding ell -com eau -co pes -climate march -cal ver -bro d -as mara -ab j -ðŁĵ ¬ -าภ¡ -пейзаР¶ -w dsd -vaing lor -stap hy -soo m -rangra siya -ra bb -prie bus -pre f -pessi mism -mega store -ku ku -joey mcintyre -in fact -harsh est -ha x -dont drink -dock side -differenti ates -dalry mple -constra int -buck thorn -ami ya -ä t -yeahthat greenville -world animal -tri ppers -sav ills -quer cus -psal ter -pow dery -parine eti -over took -oscill ator -nor throp -ni igata -ms x -mine field -liber a -k att -h gs -gyne cology -glori fying -for tin -elliott wave -ech r -denver channel -b mr -as cott -ab ul -vu du -visit ca -te ve -tara strong -stone haven -sm its -show a -rep tour -rayy an -puni shes -pol dark -mu laney -mu cky -life s -lever ages -land mine -kick stand -ka aba -ig u -gu shes -green wall -gr ans -go sforth -fair ing -dies es -chape co -chaffe e -britt ney -blo bs -bat wing -av entu -angelique kerber -ì ¿ -اÙĦ ØŃ -yellow tail -stu ous -sorren tino -sc ular -pura vida -piggy back -pav an -past i -on gress -o hr -more e -laet itia -je tz -id week -fal kirk -emphasi ses -arig ato -abhin av -ìĨĮëħĢìĭľë ĮĢ -va isakhi -trinam ool -take ak -stre tton -slim line -ski ppers -ro on -ri ends -prat ap -o log -m wr -louisi an -lok pal -infalli ble -fan fave -en dish -embrace the -distor t -de wa -cher t -bull head -bry don -auto parts -åĽ ½ -wor li -tex el -reign ited -quir k -qu ila -procu red -pick ling -pan athinai -o he -nigh trts -mall ards -lob bied -lady like -kid sin -hh of -h mh -cro ft -close out -cl k -band z -agra ha -ad ela -ðŁ¤¦ ðŁı½âĢįâĻĢï¸ı -é ķ -woo die -up l -thorn bury -thiruvan anthapuram -ther mals -sh ames -se un -ren u -que ers -post natal -panch ay -mcg lynn -keralab o -jump ing -jon i -its janeoineza -glu tin -flo rez -everyday sexism -ee ting -d cre -cher o -centr alia -centr ale -bon k -beauti fying -am usic -af ern -ac ure -ðŁĺĴ ðŁĺĴ -un gu -thrash metal -pelican snba -mo ley -mis am -make over -loud speakers -lifelong learning -joy sms -ima gem -ic ho -hu lu -hover fly -foo duk -financial times -conven es -bo gan -ajith kumar -ac cola -un capped -r ws -pav illon -new job -nay yar -mccle lland -lan ter -kar n -go iu -game spot -ey yy -ero oms -dun ford -di reland -de ire -ca stron -ay es -av ar -amb iti -ale gria -ãĥ ¬ -âĶĪ âĶĪ -summer land -mor ing -march ing -ke ying -jeni fer -hun dley -hick en -have fun -fo y -bett ing -ba che -ล าภ-Ø ¥ -Ã¥ rd -werri bee -v ba -staat soper -song kran -scand i -re zz -p mf -n flu -lo onie -l rs -ku ech -krist aps -kar ang -hey it -gur l -freel ander -flo ater -dy o -be ady -. ,, -Å ĵ -wai ving -ts in -tru mbo -toen ail -star dust -se ki -richmond bc -punc tured -protest ants -propon ents -ow usu -orange burg -official wrc -o ju -nade shot -le tran -kir ti -kex po -in gest -idi ol -gh el -fictionaldeath siwillnevergetover -f pj -escape e -dianade p -v lad -titos vodka -te so -ser na -scar bto -robo tech -return march -r mr -modisar kar -man gas -ma hot -lan ky -l gs -kel sea -ing live -ho ffa -global ism -gb bo -g itex -eco logists -dev ening -darkk night -cour tau -catalo gs -bha ya -vir unga -v ta -un punished -spectac led -si ghtly -semin arians -role models -ro ble -paw nee -palmi eri -n ter -m sa -in stock -gan is -f hs -ene e -castell ano -bun cha -bl enders -र त -wca x -uuuu uu -us dt -strat um -ser gior -ri ad -prender gast -muni z -magni fy -kah n -in considerate -her ma -har nett -gye ong -ginor mous -gar ra -contempl ated -chit own -aun ay -alla h -ulster uni -sting er -sho to -sh urst -profess orship -prit am -pi af -pe dometer -momo fuku -missy elliott -mas oo -loh ri -infu sing -gustaf sson -dg ar -co ord -clock tower -cl orox -bro kaw -boxingh eads -ba hahaha -ab ba -witt ingly -uo it -steuben ville -sie te -sco l -re tract -re ce -pre scrip -north devon -lam bic -jack rabbit -dough boy -do remi -d ff -calabre se -bre i -bbc breaking -ar ce -aper tura -a jr -ൠģ -ww week -tour neys -soft shell -sc news -ori ans -one goal -nyc feelings -li ban -lash ley -k eli -interven ed -i idx -fut ility -du sit -disillu sioned -china sea -che if -ath u -am my -a ichi -" $ -ĺ ï¸ı -what com -w ani -te ahouse -tat amotors -ste ws -so led -sin us -scram bles -retri eving -pe as -p nw -owen jones -metal working -la hey -l man -l ct -kk b -k hel -go ven -for sk -fl ation -clon ak -can tt -can lit -bur han -aur is -warner archive -torpe does -te agas -stat em -sm iler -sha rec -san die -rc sd -profu sely -po spisil -opp of -ml r -li bra -ki xi -ine uk -edge of -crow ne -cri bbage -castle bar -book cover -an heuser -ì¹ľ 구 -âļ¡ï¸ı âļ¡ï¸ı -tter dam -ts itsi -tri balism -st je -snag ging -ri den -re press -r we -pre clinical -pat ap -om and -mu su -del tas -cun ard -cre wed -bath y -ar mes -am ino -íĥľ íĺķ -zaf ar -yan ke -ti was -rous seff -ro tarians -pol ina -hic cups -hall andale -g add -electro lux -eas a -duchen e -ding y -d xc -city centre -che sham -caloo can -ant am -tiem bre -rela is -refin ancing -pre stat -otter bein -mul hern -lin er -ha irex -fel ons -de ducation -surviv alist -ri u -r ra -mil ken -louis farrakhan -lam bie -kom i -hassan rouhani -harpers bazaar -gre iner -foo se -di leep -bay ne -baham ian -arin en -ðŁijĭ ðŁı½ -wild about -well man -under score -un democratic -u tta -tr h -ta eny -stri ding -sil lu -sal li -sa avn -radic alisation -rachman inov -ot en -medi al -m nc -lot sof -ku hl -kov ac -kor ner -instaf ashion -infatu ated -har un -gujran wala -fan ia -dor n -do work -confor mist -be ena -antidepress ant -alfre do -a ang -ðŁį ¤ -war ring -wal ru -vo sa -thru xton -the dragon -senior bowl -ree der -raven swood -pro té -pag ans -ome tti -o des -ng v -na hu -multit ask -mr g -market screener -great returnmarch -festi vity -chang in -cat ty -cad u -c ta -annab el -an tti -allot ted -ðŁIJ ħ -íĶĦë¡ľëĵĢ ìĬ¤ -un install -steam ship -sou le -san go -opp olo -ol ap -nicaragu an -mixta pez -las se -kran z -khair ykj -kar sten -j rc -infiltr ating -glan ville -freecode camp -fox new -el ation -edtech team -clow ney -by nes -bis bee -ad av -a unch -ðŁij ¾ -ye w -way yy -wa ir -tyler g -thursday aesthetic -stra il -st room -shor ting -read out -pri mero -pic hai -pg ce -par rilla -par dons -nat us -manirat nam -lo kal -lef thand -king fish -jun hui -isa ak -indi scre -gorakh pur -going to -far ted -east gate -demysti fying -de ek -d wan -compil ations -cel a -cath arine -book pro -bl p -! ðŁĻı -ðŁıİ ï¸ı -ãģĬ çµµæıı -âĢĵ @ -yun hyeong -yi wa -wd bj -tourism day -terri fy -specul ating -ser u -pal umbo -pal grave -or wellian -nithi in -lu pine -liais ons -h wang -gb g -fi sho -ed chat -christmasin july -antic ancer -ys k -tor c -tom es -ta pas -su st -stag gered -shanmu gh -season of -s mond -qu ally -o sun -nou ghts -mm w -leg gett -kabo b -hu mi -ha fez -h dc -fin ne -every damnday -cw l -curren ces -bige ast -ash more -ar and -ad pi -absor ber -wil ders -paparo ach -me ma -mac rae -law y -kar is -jä ger -inter nazionale -heart month -freck le -financi er -en gi -coast mag -character istically -bur ford -bour guignon -b ph -ar bonne -ap in -sty les -sl icker -s mas -ro cio -pyth ons -pur beck -pil a -patter ning -over saw -ky ung -ke gaard -im balances -hin dering -head stones -har to -ga ster -fab ia -euro p -done ws -de du -consci ous -cas bah -c mn -bever idge -ðĿIJ¨ ðĿIJ -ู à¹ī -w sh -tv line -tri ste -tany abur -solidi fied -snow balls -smir ks -size more -shu ayi -sam an -ris me -pot m -porsch es -p ining -ni sts -nar mada -n dc -ma wson -khandel wal -jeremy scott -infatu ation -for congress -fon z -anom al -ãģ Ļ -v anda -rec at -pan cies -numb ing -no doubt -newmexico true -mis mo -lat ers -lac tate -ko ck -gustav us -gat ecra -fujifilm x -force d -f bo -don ni -conven tion -ber on -âĿ¤âĿ¤âĿ¤âĿ¤ âĿ¤âĿ¤âĿ¤âĿ¤ -ठ¥ -zo v -yo semit -wolf gang -shu ster -rudy ard -pres se -ic en -fun nel -cryp tid -back roads -at aturk -ar ga -yamaz aki -trento antonio -trave münde -tele serye -shrop shire -sco ast -sb st -resc ence -pi es -op tioned -o ssie -nick las -low y -joey badass -i hi -g its -cuv ée -ct xwx -cat arina -calisthen ics -c bu -buzz horn -bil ia -âĿ¤ ðŁĺĬ -а ÑĢ -win wood -under paid -tran sa -sum lin -shan kill -separ ator -pat an -no fear -nau m -metr orail -lam poon -ke shi -ian mckellen -he garty -flan ker -encry pt -dilu tion -chattahoo chee -am ellywood -z ino -ym ca -wildlife refuge -thre es -teach able -sydneyis skyblue -swami ji -row th -need ful -nano tech -microne sia -go greek -gandhi ji -en right -edit able -cin ia -carbox y -ble u -ach ine -wall decor -vitam ind -vibr ational -rodr ÃŃguez -redd warf -re gains -mac laren -leh rer -la uper -khar kiv -j if -in usa -her mana -gur das -embezz lement -domin us -dh b -car ro -bloo died -ari sto -aravind ha -af ree -? :) -ðŁĻı . -ðŁįĢðŁįĢ ðŁįĢ -zol tan -wine time -w ach -terrap ins -tat ton -sycam ores -ssi onists -plau ction -pir an -pick ard -per sson -olu fsen -net ty -ne etu -mean s -lu ft -joo x -gu is -ful la -ev ant -bt k -boxing news -as mile -anim ity -an up -yan uko -wareness week -vel de -val ais -upl ink -sar faraz -rin gette -public library -mill icent -mcder mid -let ang -lee filters -il p -flam me -e gs -decor ates -br indi -bea stieboys -bark sdale -albor an -! / -âľ ´ -è ve -women sequal -ut ama -u igh -shoel aces -se kai -re trial -r kelly -peri yar -past as -na o -monte pul -michael gove -gode acs -eno ise -dizz ying -cho ta -che ong -begu iling -ale gacy -... âĿ¤ï¸ı -ðŁĺĤðŁĺĤ . -ðŁİĪðŁİĪ ðŁİĪ -âĺ Ĥ -workout wednesday -w ft -u zi -u ve -tn q -substanti ated -su x -st c -shankar shanmugh -plo s -play group -philharmon ia -p cie -n vc -me on -jer zy -is ds -if y -hut son -fe ig -fare ed -entrap ment -eh f -d sson -cut lets -cur ragh -chlor o -bizar readventure -ðŁİ Ĺ -wy ld -wies baden -unis wag -tur rets -tre m -sor aya -pg l -nu kem -lucy lawless -haute couture -google doodle -can nes -by ram -bo ch -az eem -albi hariv -ah sfx -!! ðŁĺį -yu ge -whit ley -west sussex -us ola -tn m -sen edd -resemb led -read abook -re develop -pri a -paraly sed -n intend -my photo -mass on -lori ent -jan ak -im prison -heart failure -go wen -gar rard -dumb bells -discre pancy -am pe -Ñ Ĩ -wr ds -we itzman -viol adavis -verma elen -tweet chat -subsidi sed -shi g -sf h -samson ite -ri sc -re dit -q doba -nv da -e let -continu a -co kes -ba jan -am iri -:(( (( -ðŁĩºðŁĩ ¾ -ver dasco -that matter -schnei derman -rebec cam -re mor -quie test -pulit zer -princi pality -pre rog -pr ssa -monta igne -lo tus -kar te -k assel -hy phen -ho ang -g aga -fruit cake -fan te -ew f -el fs -eate mu -defense less -caw ley -air d -ðŁĻĪðŁĻī ðŁĻĬ -âĻª âĻ« -th ich -t sk -su is -stat in -rr t -rand hawa -psychopath ic -petra eus -now showing -lu u -little hampton -here is -ha zi -green bay -gli ac -em pren -dun drum -di ac -demo graphy -coul thard -australian coins -apply now -a ham -.... !!! -vidyut jammwal -un leaded -un friendly -un favorable -ug by -th doctor -rac c -quiz up -q ol -peac ecorps -pas scode -oedi pus -notic ia -mari ka -mal la -ki official -khur ana -ke on -kaw ai -ka sim -hi f -ger alt -ay ut -ar ara -ap x -you go -wer the -t ila -stol ler -stam per -sf dn -sch ick -sat suma -raf bbmf -r ter -police week -pen field -p de -nit to -mono po -live united -lib dem -in sole -i official -her sey -doubt fire -dis mayed -dic hro -char don -cal v -ad ra -zi ppers -tri ste -sm alley -scal y -ram y -it ens -i one -eeee ee -du ps -de cries -criticalrole art -bug gies -boc cia -bigh ero -argent ine -alyss a -z eu -west view -vo ta -un sealed -teenchoice fox -tam ir -sympo sia -ssang yong -solve ig -ofe urope -ni pped -mol dy -kom en -ken ley -k ws -har pist -gon na -dh all -desh pande -cruci ate -coroman del -bo ssi -... < -ðŁĺį ðŁĺģ -ðŁĺĩ ðŁĺĩðŁĺĩ -unfathom able -ul ter -trit on -torto rella -thumb sup -ten ets -ten ergy -tan quer -soo kie -scuri osity -sar don -sar ath -ri mmed -polkad ot -om ak -le se -ke te -k una -jun aid -gr iner -golden rod -gig antes -ful crum -ell an -di ani -currently reading -broad view -ber al -am bode -< ) -ðŁij© ðŁı¼âĢį -âĮ £ -wr angler -week nights -under foot -twit ching -turn berry -su dir -ss is -shangr ila -ser rated -sea forth -rubber maid -rive ted -read ers -re marked -p bloggers -out flows -non verbal -ni v -nabo kov -human ity -fin den -er f -das soc -d vs -auction update -as la -angel ina -.... ..@ -( ? -the ak -ste ffy -lu blin -k win -g ago -full metal -for bes -ell ars -dd is -car mina -by d -boardgame geek -ber wick -auto bot -as ura -ap hex -ander pump -air brushed -your way -wil more -tur ki -si a -s later -ro ared -pur itan -om ori -nbc philadelphia -mor cha -mi me -ku char -ken newick -kb ps -indie book -hen do -ft th -flo of -bru sco -ben elli -asser ting -aqu atic -ठ£ -sur real -st kil -shet land -sed bergh -scots magazine -ri za -playlist live -pa il -mi us -mh k -lor as -leicester tigers -lc g -hul la -hu ms -help me -gin and -ea f -dungare es -don tw -deterior ate -dar cey -dal al -d wr -conspir acy -ch ere -bander as -all iteration -* âĢ¢ -âŀ Ł -xen overse -wheel in -u al -tur bos -sfor kids -saturday kitchen -s ja -rand olph -pr b -ou w -o in -new look -nd wx -lew ski -incur sion -gr rrr -car shal -buc ca -ban an -asset management -arau jo -apo logists -af ly -ðŁijģ ï¸ı -you got -wax es -toile try -stow away -ste adi -standup to -si ski -sel tine -school s -pho t -miamis up -lore tto -lam ba -kr ita -ib nlive -hin dley -frank ford -exfoli ation -diabe tes -de cer -cra gs -bin dings -bat cave -aj j -wo www -waveleng ths -w abe -toysfor tots -rash mika -pizz o -pha ser -ore l -musso orie -la pp -hit t -happy independenceday -ga ius -colon oscopy -ang ing -adidas football -yon o -whit eli -ton ks -stumb le -solemn ly -ru r -ragh un -qi ao -pay gap -mal an -lisav anderpump -ku be -k son -ib l -homemade tools -gw h -favor ing -ec lamp -deven ter -deceit ful -dag en -cur ling -can ey -big brother -bau s -ah ri -winter sun -willi es -wi bw -twer k -table spoon -t eli -sze chuan -super tramp -reminis ces -rally finland -quizz ing -papa johns -naco gdo -mccre a -i zzie -fitz william -fal le -de j -dar relle -canti lever -business women -bush fires -yas sin -vander pump -th als -t dn -ri ko -proce dur -opti k -omo vies -nai doo -minute man -kasey kahne -fo olin -ex chequer -corn rows -black mailed -bl at -bil derberg -ar twalk -ðŁļ Į -ðŁIJ Ļ -ëĭ ¬ -å § -ye eee -thaw ing -shak ir -ra zed -pitto drie -p atta -mccre ady -jack i -inside the -fla m -can am -camp sites -ban nock -at si -ar bo -ao g -anch ine -vand ana -sw ade -show and -rishab h -pi raeus -phar md -mat son -m gp -lau g -kal inga -injec tors -hypnoti zed -hil bert -fric king -e if -du sd -do herty -de bi -cab a -brah maputra -ber rys -ban offee -af fer -] ." -ðŁĻıðŁı» ðŁĻıðŁı»ðŁĻıðŁı» -âľĬ ðŁı» -z ele -thom es -te ide -super marine -stress ors -sing ing -si bi -self care -scalex tric -pres que -podi atrist -p mb -naval ny -mother ly -ko ku -ingh istory -do pen -cj reform -chor al -as amy -ampli fying -ali i -water ton -vw fc -unex plain -strangel ove -she sh -qu bool -pre via -person i -offic in -gn on -g ps -fi est -farah khan -engul fing -energ ys -.. ðŁĺį -ت ع -y anni -warnerbro stv -tor rid -summer sale -or bis -motor cycling -mojit os -le jeune -hippo campus -gil pin -flgov scott -fin dthe -edwards ville -dsw d -d mi -cur r -bon neau -blue eyes -b bo -am ills -win sford -weid man -upcycle d -sung yeol -shi shi -re setting -ravic hand -r ty -nt australia -dham aal -da res -d cd -cb colympics -bapti sed -bab yyyy -adi an -ðŁĽ ģ -wil ford -wak aflock -sp ink -sie ge -sad am -qash qai -phra sing -ling a -kin ka -indigenouspeople sday -il ie -gin ho -giac ometti -extru der -cand or -callthe midwife -bow erman -bague ttes -at oz -arche types -anten nae -without you -to cin -th ts -th aya -sh int -s guild -musk rat -mc gre -man aus -mag nit -lun di -lumin escent -lap ses -kin dof -je han -if ad -gu iness -greg ori -gi jon -gg is -foo dgasm -floor plan -f sg -ess ss -di marzio -dd ata -clu mps -al at -ãĤ ´ -ze en -y cling -w eli -trou p -tote bag -shre ws -scur ll -repjohn lewis -or te -ma ho -kaz i -jor dana -irrit ate -ha vi -ge c -f ici -avi e -ari jit -am rit -am gen -wre g -wit a -tor ide -ti died -shu bh -se mua -ride share -r vc -outfit oftheday -nypd news -novel ties -kid cudi -khali stan -k ren -ide c -gru p -gon nam -conne ct -confe ssing -cere bral -bal am -ash u -won k -twom bly -river ton -repaira ble -re constructive -ra west -ple at -play writing -paul kagame -nurse sday -lo dz -ghou lish -dra xler -dolom iti -de te -cru do -billy joel -atom izer -as ol -al car -y cfc -we sl -under floor -tre maine -te tr -sween ey -sket chaday -se ba -s sec -rjal ok -rin der -rally gb -pr ine -port as -jam mies -horseri ding -gra phie -gi menez -gar oppolo -gar dai -ey enews -clun y -cavan augh -cal lie -cal ey -brou gham -berline tta -ben tham -arou sed -wh aler -vo les -ty ner -twee thearts -tor na -si ap -shu ja -sar avan -sand awana -s fr -quik silver -pter odac -pm harper -ob tains -neo geo -mog wai -mid year -mi kasa -eh ne -droit wich -conservative vw -cho l -bigten network -arach no -æ¸ ĭ -ur bo -u sta -sub prime -sle aze -s ber -ru sia -neb biolo -man al -lun t -it ori -is good -ho ard -hel dens -go ve -fla gg -et at -emma watson -cas so -as aba -aro ha -am ica -alfar o -wer den -tri glycer -to ho -re ema -punx su -om nomnom -ol de -mack in -li vor -kw gt -kh ris -john c -harpsic hord -gal ent -francis co -dr g -come to -cater pillar -calcu lators -bbc world -augu stal -ad sl -tran spon -tra eger -string ed -sr hv -sowe to -sle ad -se ur -santac ruz -run happy -nhs bartshealth -ken cen -it all -hot sauce -good fellow -gian franco -ec ap -b ening -aha b -take flight -symbio te -sou da -solar panels -si gue -ru bric -ri voli -rema x -ome gam -n kandla -mores by -mik ado -migno let -may bank -man gum -makar sankranti -kam eron -i ero -hart pury -gab ay -ft nhs -ever son -come dia -color blind -be aune -bank stown -amend ola ----- ---- -ðŁĴĹ ðŁĴĹðŁĴĹðŁĴĹ -ðŁĴª ðŁijĬ -ðŁĩµðŁĩ ¹ -à º -ÑĤ е -ve sting -up keep -traw ling -team breezy -star scream -ss av -sper son -slu mps -shin ya -re package -po were -po ort -pla b -pic hand -ok kad -o brien -nu ff -n ani -illi am -harold sinnott -green party -glen elg -ge er -dreamleague soccer -diso wned -constan ce -cas sandra -al gui -ty per -tore ros -tan us -swar mapp -sin dy -shee ting -sham si -sep tiembre -sar ita -palae o -indv swi -fiel duni -david walliams -cool down -color ador -camise ta -ap ul -ad ac -wet shaving -van hansen -tw ard -tou areg -syn ced -str ang -sp w -sh acks -sati ri -ron it -reali sts -pramo d -ori ol -fann in -en nale -embro iled -cul vers -chat room -buff ing -ban e -ac m -ðŁı ĸï¸ı -writing life -vasundhar abjp -un desirable -tho ckey -ram anu -pa store -nin ian -ly tton -knu dsen -gg v -fi z -emble ms -emb arc -dispen sers -ca sid -asu tra -app y -ðŁĴŁ ðŁĴŁ -y ut -wb ball -vin icius -pre dation -pa sting -noplac elike -ne wark -mammo gram -ma ji -luch ador -ilove jax -i plauction -espar za -el ley -contempor aries -clo aked -cele stia -car ola -bt x -brave hearts -bi ghead -benand jerrys -ar len -ap it -ap at -anjun abeats -am erika -ãĤ¹ãĥ Ĺ -Ø§Ù Ī -y aba -wau kegan -tw p -tter man -stra ddle -statec ap -rash tri -quarte ts -plat num -pax aus -morg ans -li baly -leopard stown -kro hn -it security -hun ty -here dia -gra ined -express oshow -d he -ak f -* : -á Ĺ -yanuko vych -ty ger -sun limited -shealth care -sc itech -oppre ssor -m tt -he ssen -gon gs -funny picsdepot -flip side -fam iglia -du o -cathedr al -bal anchine -af pphoto -.... ( -ðŁij Ĵ -tho o -seaf loor -san kara -rac ial -open air -ner ve -mat ryo -kilo gram -khal il -it weets -he is -embo ssing -egg man -bachar ach -att va -ðŁĺĭ ðŁĺį -ðŁĩ³ðŁĩ ± -vox dotcom -un learn -super cross -ros ita -re paid -pan ettone -nor fol -mii verse -mari ai -loud ness -ley den -j dc -fm news -fasci itis -eye glass -eloqu ence -daw ned -chron ometer -chri swe -cho i -carling ford -bhar gava -bbc mtd -bal tics -uof m -ty d -swasth abharat -stor noway -shu ffles -sen o -reson ated -re ag -no via -monster cat -mb ank -lo te -kir ito -hoo ligan -her up -h ite -fox news -early modern -derby shire -day trip -cudd le -consecu tively -bli c -black out -be mis -ar ash -âĻ¥_ âĻ¥ -vishwar oopam -vash on -trajec tories -sine ad -sat ri -pu fc -new lyn -natu rel -min tz -d pan -cru k -bor u -ta ko -se and -s america -pri yam -navar ra -monte cristo -mill is -ingh ope -hep atic -hall in -fc ity -electro chemical -dr martens -cj ad -as rc -weather ill -varund hawan -teh reek -stocke xchange -sko ol -shi be -rubi dilaik -n pe -mo ko -ma ic -indi ak -in takes -impedi ment -il ent -go tye -getin to -fing ering -clau son -c ni -bal o -ann andale -an ju -an ers -am g -al goma -womensequal ityday -tew ks -sugar land -prospec tor -mil ian -man made -li iga -laz ada -hum per -hb v -green bush -ep k -con tro -biomimic ry -ठĤ -uk tour -the happy -scro ft -punxsu taw -on the -newmarke trace -me ca -lie tta -itsmore funinthephilippines -is born -haringe y -fri sch -eye candy -electro des -con ant -co done -w br -sch y -rad wanska -newn an -nei man -nb poli -megam i -ma da -lunar newyear -lei va -inthe sky -i vs -glend ora -foreigno ffice -fashion photography -eu ticals -d kr -c st -c ftc -bri stles -bic ent -az family -ai ff -ðŁĴ¥ @ -ðŁİ ĸ -wa aay -up u -tho d -sle dging -sig ne -oire ach -nor ad -noel gallagher -new comb -ma suk -kra b -ken ner -jet star -in ert -hon ore -global ed -bur pees -bs v -bett man -at sushi -arjun bijlani -airand space -ab bin -ó r -sonunig am -se mat -ro vin -nat galleries -natgalleries sco -nar co -miz rahi -lero y -kno pe -hi ker -hang ing -comple teness -cha vez -cab ell -bil der -av m -ak y -a are -pretty much -po ta -over arching -or nl -kovac ic -ken n -kam ui -hel f -har r -ga stonia -fo h -fidd lers -fac to -aren al -âĿ ĩ -zol ciak -toyo tag -tan gier -spot ligh -spo ols -san bernardino -s burg -ra pati -p dd -n age -mu cking -j io -is cool -i mus -hassel beck -har shad -gn g -forex trading -du es -borgh ese -bi kaner -am uk -al wys -waist band -w league -tot alling -summer house -srin ath -pun gent -pe dr -pab st -mulca hy -infr inged -fir daus -bur ka -brian cox -bi ola -bc bg -ðŁĺľ ðŁĺĤ -x el -sul kin -sal ve -rafi ki -pan ky -pag lia -na aa -malibu comics -lear jet -lac una -keen eland -kau ff -her acles -hair color -fur st -cor rin -cas al -ale h -ب ÙĨ -y aaaa -vi ra -te sy -styli stic -strong bow -sport pesa -savi o -pyram id -may er -mante gna -light sout -lease hold -lan n -kit tel -kick solution -jet set -ic at -f gr -donttry this -de jesus -cw lps -character ised -buzz words -bail on -awesom esauce -asi ana -articul ating -abra sion -ðŁ¥° ðŁ¥°ðŁ¥° -ãħ¤ ãħ¤ -Ñ Ĥ -z hong -worth the -talking picstv -sen goku -r é -pic o -nit ric -mr ti -mal u -la ster -jac ke -is simo -gra fia -game audio -down for -do something -di donato -d fir -chal ked -adi t -accor hotels -ab rac -âĺĿ ðŁı» -wt kr -wl tx -vote redto -ve sper -spur lock -sc limate -s mid -recen sione -paper clip -oom ph -national birdday -ke shav -k df -ichoo se -gmt games -di mm -dan ews -clo seness -c se -al tidore -after thought -zimbabwe ans -za id -wizardo foz -un flattering -thar p -tal ong -sump ter -stein brenner -sn w -sb n -sat o -pl d -mar com -mal ina -luxury cars -kho bar -j ss -ice house -hicken looper -dead by -d loesch -cas sino -budo kan -bi zz -amar one -tic e -sou vla -sin uses -seam us -samu elson -pre poster -news rooms -mel wood -maest ros -ma gus -lyn x -kav i -ir f -hal eso -get out -ent in -dog walk -cu al -ðŁIJIJ ðŁIJIJ -âĺĢ âĺĢ -what evs -wex ler -vi stara -swag s -soc biz -sneij der -sm on -si se -pr ancing -le ff -khadi ja -j sm -hill toppers -emer il -dar nold -comp o -chan tic -can aan -bl inn -ðŁĴ© ðŁĴ© -york ton -yl i -world building -w syx -u hi -stre l -stop kavanaugh -space ships -ski i -sel as -rac oon -pri mula -platnum z -paren tal -pal ah -nim rod -min doro -mc mullin -lo in -il en -em merson -cricket merijaan -ze o -w afl -thel oud -specialty coffee -soap y -say no -sab adell -rosam und -ravi dubey -pray ersfor -patrick dempsey -ower ri -oc u -mari as -lifeis beautiful -go tto -d wee -circu latory -child less -bag ay -awol nation -analo gies -aldublo ve -ðŁĻĪ ðŁĴķ -troubad ours -tou te -timb ur -so dy -see the -rachman inoff -n tt -mol ars -mo tta -love ukweather -k ates -il keston -hol gate -hair styling -fel onies -chen ille -camp grounds -am asa -å¤ © -© @ -st ape -sl ung -righ ton -plan es -p oul -mic ha -methu en -kore y -ke ener -ke ck -jarre ll -in fidel -il ona -herb alist -ff re -dog meat -cur sed -cron k -centr a -cam rose -bright man -as ce -ac cade -abas ket -ys ers -wy se -warsz awa -vik ander -ver onika -unfinished business -su ter -steven age -startup grind -roth stein -rio olympics -name plate -myrr h -mer cu -me aux -low nz -lin seed -ir un -i aw -gi ani -fij inews -ef an -early ed -detoxi fication -deta ins -cor rado -burn sville -bri thday -bri stle -bodle ian -bj j -bau t -aude mars -as ys -ðŁĺİ @ -yan ong -trayvon martin -suf ism -stern show -stainless steel -sp all -sant ini -ripp on -panathinai kos -musko gee -loo ts -local elections -la yan -kit teh -khur shid -kel son -iron side -illi c -hick son -ha aa -gooden ough -brand en -ann ast -we ger -va o -uk news -talking dead -spi ers -sculp ture -ridg way -re sets -ra ved -nex gen -nat aka -ligh tened -lie ber -inter i -goe bbels -gal lau -free play -bu kan -at ani -a of -ðŁijĢ ðŁĶ¥ -ï¸ıâĥ£ , -sy ard -squ alls -ran deep -r nb -qui el -proudtobe abulldog -pom eroy -o brig -moe bius -kar ine -juni e -jou st -joe ys -jo k -ir y -ha is -gin o -ester o -del ands -coo t -bbcradio wales -assimil ate -and ouille -ðŁijįðŁı¼ ðŁijįðŁı¼ -wine fest -wai heke -ve sic -star tribune -sid well -scale up -sc cm -pru ett -perfec tionism -night marish -nca aw -nc f -in bkk -hirsh horn -he tero -griff en -green e -fat test -faceof mlb -el r -chuck grassley -christ oph -chip tune -c itt -brick ed -bo ga -blasphe mous -ber m -are dux -thel and -sk op -shak er -o ems -mciner ney -k ween -i ppo -gas ps -col mar -cla xton -castan eda -? ðŁĺį -ðŁ§Ļ âĢįâĻĤï¸ı -ìŀ Ī -wed ded -ve te -uka id -tribut ary -syracuse u -san pedro -on location -ngr president -mon oli -modig liani -luxemb urg -leg anes -iam will -ecclesiast ical -du plass -ded ham -comp els -blan ch -bill nye -âĿ ¦ -âĻ« âĻª -weight watchers -wax man -tede sco -te zuka -sneak peak -rec ir -ran dee -radio times -py re -oom pa -messi anic -hawks bill -ha ga -glen livet -gil mer -fabric ate -edin son -eco smetics -colorado springs -co tte -bag a -b ä -b anta -antarc tic -ambro sius -a sea -ðŁĺij ðŁĺij -th il -te avana -tam era -shann ara -sch aff -s ence -rhe e -re ta -pe al -mari ach -kri dge -ic co -fratern ities -endic ott -dere cho -dam er -cad mium -brick town -ì º -v pa -tau s -ta rek -sun downer -rose burg -pel agic -pa es -ou nos -nicol ai -lindel of -libt ards -leadership development -laure ls -hot star -goldend oodle -gi untol -dand c -cros sh -ch ym -cannab idiol -bure ss -bmw motorrad -blin ky -bel asco -apol itics -am bler -ale sha -ðŁĺ® ðŁĺ® -white boards -wa hoos -us y -stro de -sar as -pro visioning -oni giri -may ank -mal inois -low ell -ke chara -hyperson ic -herbi vore -hard castle -blue star -bio diversity -av os -and white -ware house -viol ators -v asha -tul loch -tor fa -th ony -sh iller -pun tac -proce ssions -piec ed -p ca -mayo clinic -ma shups -la goons -in suff -illustr ative -golfclub sforsale -frie sen -drizz ly -do ane -deare vanhansen -cross bar -bri on -au rea -aro berts -aqu al -ðŁĻĤ ðŁĻĤ -weis man -uz bek -traumati sed -switch board -st app -smo vement -sa arinen -re growth -ra wing -nu ke -melissam c -hun na -glasgow warriors -dict ated -bv l -balonce sto -amar al -ag dq -velo ce -the hague -tet ley -tattoo ed -son us -sc india -sar un -preemp tive -pr oro -pi dgeon -mon tel -magi k -ke ylor -ine x -h pt -f cbd -cyril ramaphosa -co ppers -chri sho -bur r -actor jiiva -trans verse -str one -stin kin -pil atus -occupy central -nephro pathy -looo ong -le ight -language learning -l rb -hy annis -di ppy -col ville -cho ate -central coast -car illion -camp y -bol dest -b hay -all ston -xplo rer -wy wx -w ur -ur so -taver na -summer nights -rock dale -re supply -qot dapp -pan etta -pal azz -oh well -monon oke -loe we -listen to -l eri -kun dp -if p -i onia -fro mm -cé sar -cu enta -col ley -be gotten -ang rier -ad are -abhor rent -! âĻ¡ -ðŁİģ ðŁİģ -za al -v sp -there min -su br -s doh -qaland ars -presi des -nup tials -mis behaving -im ams -hc mc -happy tuesday -fru iting -di abo -datam ining -augustal sina -an zi -!!! . -ļ ðĿIJ -ðŁĴķ âĿ¤ï¸ı -ðŁĩ±ðŁĩ § -ëĵ ľ -wise au -we artv -war ne -te pper -strategi sts -stargaz er -sp ann -siss oko -sal a -physical activity -newn ham -na im -n cel -me aden -mar cin -kay aker -j iz -hagger ty -gun ge -gu yan -ernie ball -di splace -de el -code pend -cay etano -ay yyyy -ar irang -adren alin -achan nel -ston eroses -sto ga -sport scars -solom ons -q hu -ph nom -palla dio -lun gu -lo i -j ari -hob goblin -gathe rer -de volved -come and -celebr at -bra inde -ba atar -avie more -as ky -: \ -ãģĬçµµæıı ãģį -uro logical -un declared -u ob -su ess -sc ura -sc ast -sam en -roo l -ri pen -raise your -ra ju -pra bang -pinar ayi -paign ton -os int -lake wood -kon an -je ffs -jacob whitesides -incu bators -ichi ban -hb l -fr illy -fo gerty -conju res -ain slie -. ðŁĴľ -wor te -wol ters -wo wow -tra gic -teleno vela -smar athon -shaw ols -sex ta -salvation army -quan tu -pinnac les -on itunes -nestl é -myelo id -mu y -mit er -meg ac -mc kee -jo van -heart break -gas ped -func tioned -freak out -endthe stigma -disab ling -carne vale -cam uto -bernar di -ðŁĺ¢ ðŁĴĶ -âľ ³ï¸ı -ÃŃ as -un ni -ter p -sin op -pre co -opi ate -men in -mandu rah -lon gu -integrity tt -hr tech -great north -fr nd -eli k -dad dys -construc tor -conce ited -can em -ðŁĺį " -su ll -oper andi -on ster -mm x -lost cat -leg less -karim loo -ju ga -j sp -hand rail -gri pen -glori ous -di mming -bury sted -bt c -be eck -am ai -algui en -youn es -ti sham -stil t -soul ful -sid cup -seg awa -p ex -open shift -mechan ically -hd x -har tigan -dhanan jay -cu atro -canal side -bon gino -berger ac -as cle -an ju -ag low -ag et -.... !! -âĺº âĿ¤ -tom er -the us -teac ups -sa urs -real mickfoley -perman ent -pa chuca -matric es -loud phillips -kof i -k ago -g cr -flu stered -de anie -bloo diest -bis u -am ni -selen ators -sc ens -rine hart -objec tivity -moving forward -masa hiro -marath oner -lom i -logitech g -koin ange -is wa -ing ues -hyun gs -hi ther -end anger -ele v -consu mables -caval cade -cap ilano -black beard -arte misia -arian ators -actor madhavan -yo c -un win -u am -shahe er -sci der -s mbs -p ish -my mixtapez -j oma -he yn -gui do -federal reserve -fair mon -dist t -direc tories -cab rini -ber ri -beau voir -be the -a head -y sle -warrnam bool -up market -tv personality -tuesday morning -schri stie -sar gon -re bus -r bu -presi den -pow ells -nfl draft -nacogdo ches -music group -kis lands -insomniac games -il or -exter iors -end res -der ot -de composing -das ani -camp agnolo -but ted -br ann -anti gone -ahistoryof paint -ठ¯ -thim ble -the stor -sul ly -starwar sthe -sc avenging -red wood -palah niuk -nove mber -mat eria -longmire posse -kerrang magazine -ing els -industri alist -i dai -ghe alth -dont miss -del any -cook man -brain child -book nerd -bland ford -backto back -+ ] -ðŁļ ¿ -ye z -v ash -un stuck -summar ises -pen manship -mumb o -minimum wage -maz ur -mar cas -k ray -id wx -gold in -follo back -ear pers -É ª -well being -var g -ubis oft -tom brady -some where -qu ire -pax south -od ar -london bridge -justin formmva -it ar -ha at -gup tas -gom or -glaci er -ge b -gan ic -cam ron -c pap -brianmb endis -brantley gilbert -bow doin -boo z -ale jo -ag at -âķ ° -th f -ta zar -sex tet -sam osas -pl is -pel tz -pedestri an -oo t -newh am -mc williams -koinange jeff -k tr -ji be -gas lamp -gar ou -fit ment -ened ict -en tail -duck face -coin age -co ale -car very -atho l -aj lee -afca jax -ðŁĵ ĺ -tra it -tor ms -stri bune -snow boards -shadowhun ters -sere mban -prefer able -pesc ara -nz mustdo -nar ine -multic oloured -les by -g att -ey al -en fin -day made -congre s -ade vi -accoun ting -! ðŁĩºðŁĩ¸ -ðŁĺ¤ðŁĺ¤ ðŁĺ¤ -Ë ļ -z illion -yel awolf -un question -thalai va -shay e -savag ery -poly cystic -nh ra -nc b -mathis on -made a -jay as -indul ged -ho well -f mt -erud ite -drash tid -d anna -cire bon -ch ander -ca ity -bay ou -ant en -alban ese -æµ · -âļ ĺ -zom at -v si -tay la -sultan ate -sagarika ghose -rt l -re eses -re charged -pla zas -pi eters -passi one -p mt -merry xmas -men of -marti al -ly can -ku antan -jojos bizarreadventure -is ac -cullo den -chef s -cam omile -bean z -an nette -a itor -ãĢ ½ï¸ı -à· Ĵ -whom ade -whi ppin -sun corp -ru lings -obl ong -marsh mello -ly re -live mixtapes -lafar ge -je anni -hot chocolate -ge ty -fu rio -for all -fall a -ez ral -eun kwang -cumber nauld -c gr -bleacher report -apo pka -al italia -agil ent -ðŁĺĢ . -ðŁĩ» ðŁĩª -wed d -tro ika -torch relay -terrori ze -t inge -t anger -stat ics -ron y -re assures -ra ze -pre so -pl am -orph ism -matthi eu -fun chal -f sn -est ation -en el -e pos -dist o -den ys -dam ore -da hi -car natic -bur un -airtel india -your self -wonder woman -wi eners -tv m -swords man -so ha -seductive sunday -pet kovic -oil oncanvas -jugg alo -hu dak -home automation -gu mmi -go ch -girlsin stem -fli m -electri fy -dig nity -commissi on -canon usa -av ro -american u -ag f -a adi -up and -under arm -team adidas -sta westland -smd streams -single track -r sn -quanti fied -pocket camp -pan kaj -oxy tocin -outlaw queen -or rin -of time -nigh tof -ke ter -k sg -jim lee -jeopardi ze -jax a -janath agar -j harden -ho isin -h kd -giuntol i -fra yed -for trump -doo zy -deli ghting -del ray -dair ways -chir ico -car crisis -c dj -arin ers -thre sher -strictly comed -sp akistan -seas capes -scal pel -ro mulus -pro po -prin z -pre clu -pat in -kis sin -kareen akapoor -gl eng -flam borough -dece mb -d andy -cli k -⼠± -âĹ » -wo u -v oom -th it -seven teen -serv ant -sar ovar -sam er -quinter o -qadi r -puj ara -publi sher -pla sia -per domo -pc bs -nau seous -n gn -lom poc -jig gly -ir refu -hero escon -he sp -ge er -f wiw -exempli fied -exemp ted -do is -d xd -bang sam -ban jo -av n -wed gie -thom ason -sway ed -sv cs -spen ny -slam min -re starts -orm skirk -meadow lark -mar scuriosity -man sa -maith ri -ma sato -li saf -ko ehler -kab e -ja key -gar lic -flori o -du pont -dd ler -ation week -arsenal fc -ye k -y ss -true detective -thel aw -sun beams -school memories -pra bowo -oi af -life times -lank ford -k ci -in sead -howdoyou pixels -fthe year -down grades -dam mam -cor champs -colle gian -aul x -ðŁijĮ . -wo h -sc um -ra ham -play hearthstone -pagen aud -nik ola -mcl ane -lucoz ade -lake tahoe -lac tation -kno p -kei fer -janu zaj -home bound -hol lowed -heat on -gor gon -fur baby -fox glove -fau cets -colbert lateshow -barnet fc -agar h -! ðŁĴª -thab uri -statue of -snee zed -singapore ans -perth glory -patho genic -orthopa edics -odysse us -mq m -k tg -far ouk -cw f -creative bizhour -bo ice -beo grad -water parks -vitam inc -re broadcast -ph enix -perfec ta -palm beach -ni mh -my croft -mu tv -liber tarians -lang dale -l tm -jad u -ine k -har macy -gun day -fair lane -entwi stle -csur ams -canni b -bu tane -aveni da -afe ty -.... ) -ë§Ī íģ¬ -wax wings -video game -un daunted -ther yman -staple scenter -plu gge -nis d -nab e -mari el -lor il -leather face -key ne -kam o -hu la -herb icides -gw apo -grego ire -flav on -fion n -fatt y -do ke -disab led -dam ion -col as -che quers -ðŁį ŀ -ðŁħ ° -ë ´ -zon da -yuz uru -whe aties -under took -u bl -tu sc -sonn tag -raz on -pu kka -pe ssoa -nab lus -mus kie -misam ental -lo pen -lar ch -lan downer -jame scharles -gra cht -gly col -gi onee -g cm -er ob -cé line -cay e -c no -air liners -ag era -abdu r -ìĺ ¨ -æ· ± -wing tip -violence against -throwback tuesday -sound s -servic es -rin aldi -pun ting -porscher aces -p wr -luzer n -ind re -for humanity -fair ford -ent rada -dan mark -ati st -ati me -and blue -à ± -wwe shop -vitili go -ur bandic -under hill -thisi sour -tex a -slan ted -remote work -radio shack -molo kai -mid somer -mb ap -jar od -ih sa -har rah -fir mer -fa ure -cla ires -car oti -c ang -b gp -assi on -app u -af fo -ðŁĺī ðŁĺī -web md -swarth more -ste g -re efer -rab ino -promo code -play land -o wain -mill ersville -le anna -kuech ly -hypo thyroidism -green build -forthe many -fair ley -er ice -di sing -cv g -busines stravel -brun e -è © -un itas -small youtuber -nal cs -move the -morde cai -micro bit -jack gilinsky -ir vine -graphi x -gra ha -g live -fri pp -disgu ising -chuck todd -amal ai -zan esville -worshi ped -wart burg -u cu -star ter -sol way -sag na -ro den -por tra -mer cad -li ane -it sd -illumin a -hu shed -fc p -experim ental -e ol -du val -chri e -belmont stakes -beis bol -ant ander -al fi -ðŁİ¸ ðŁİ¶ -ðŁĮ² ðŁĮ² -whi pple -water aid -vin b -un wittingly -str ana -sd wan -reson able -notori ous -nang arhar -li sas -lfc family -le ic -hump day -h mr -go the -evo king -ei der -detoxi fy -con cili -cin tiq -bla is -bar ris -au bin -andri y -alder weire -ðŁĽ ¡ -ðŁij» : -sand hya -quar ry -pol ley -oc currences -nvidiage force -neverstop exploring -mo onee -man ed -helenclar kundp -gag ged -descri pt -da shes -cl ang -car dano -can geo -av ond -as sa -wwe sheamus -wut ang -wewill rememberthem -we know -vibes only -van canucks -u tiful -tür kiye -th l -talk talk -summer side -str itch -roo tedin -re ous -quay le -obe ying -grand sons -cnn money -chat sworth -char tres -br att -au dia -ae ter -âĿ ķ -warrior pride -virtual assistant -va sia -tre de -talk za -sal ou -ran ce -r fi -pir zada -pd b -pa rel -os ler -oh p -need lessly -met all -meado whall -mcel wain -mccull ers -eldor aspeedway -dele phant -del tar -budge tary -alternat or -addic tion -ys jagan -wood carving -u ffici -turkish airlines -triu mp -stephen ville -silhou etted -shant anu -scottish fa -ro aches -pe dra -p mc -nu de -looooo ve -li velo -kis er -kar on -k ma -ho by -com pas -cau x -bre ch -author ship -ar mer -ðŁıĢ : -woe ful -wode house -un categorized -tiwas avage -stru ck -ros se -r ps -prithvi official -no bs -kor ma -ken zi -jone stown -jav y -il it -ga ad -fe ei -esp a -end childmarriage -do en -cooper ates -ci bility -bigg ar -alex morgan -al x -aa ahh -ìłľ ìĿ´ -u ria -t ve -so you -share my -rother hithe -pierre pinna -nts live -not en -ni ks -mark gatiss -lifeat purdue -law lessness -lati me -kru k -kn b -hyun day -gre end -din n -del aney -d tl -combat ants -bon gos -athe ist -all that -a bet -ðŁĸ Ĭ -ðŁĩ¬ðŁĩ Ń -we al -understand ably -thel ake -te kno -tamanna ah -street lights -squ an -shul er -sh inn -seth macfarlane -ro stock -ren an -plu cking -n vw -mariai rene -kor da -kad y -itti had -hov ski -hobb its -gr ates -fern and -digital artist -ball fanfave -bab bar -alessi acara -travel news -sw g -sau gus -rou n -re booting -pre is -pe ps -ota ku -nom o -mce ach -k official -k anti -in sa -glaiz aredux -fuller house -f q -cw bb -back line -actu arial -í ı -å ¦ -w pro -ver anomtv -un happiness -un developed -travi ata -synap tic -singlet ary -sharp ness -se gun -sam berg -ryan j -ro ca -pin al -pi olo -per ro -par khurst -nc sc -kri stol -kat rin -gra dy -gn ats -glyce mia -fall back -cyber news -cor netto -catching fire -bom berman -ar ris -aless and -accor di -ðĿIJ ŀ -wat kin -ty co -tri gg -ta int -sv m -street cars -store house -sh esthe -se aly -rou ges -r co -quere taro -py c -pre zi -o oni -nyo vest -mar rao -mall on -gio ia -gau dy -ecoun cil -dan ang -confe ssor -clo ister -bio engineering -bac carat -az central -ta hi -sport stalk -ri pper -phoenix raceway -mon bebe -min ds -mal ad -kyle larson -kri shan -hul ls -hi att -h fh -ge tters -follic les -duis burg -diss apo -dele te -cu bist -corn field -con ec -cat an -ag ta -ðŁĺģ âĿ¤ï¸ı -ðŁİĬ ðŁİĬ -u op -tyl desley -streaming party -st pi -smoke less -si gep -shut up -scot tho -rose gold -reinst atement -pre sti -pil i -out performed -laser jet -lale ge -kine tic -je evan -jam m -humb u -grand erson -dress ings -cr üe -cal dic -c cac -bhar ath -amy g -amoun ted -âĿĮ âĿĮ -tol entino -terrori zed -som s -sah in -real bencarson -re introduced -ovarian cancer -nam ah -monte z -mis fit -kamp ong -ice age -gum tree -gou sa -gli oblastoma -gat royd -figue res -er ror -entertain ments -ec an -dream boat -dis membered -di mble -cro m -cor win -conspir ator -colle tt -bon ney -apir ateday -ðŁĴ Į -v ts -tiff ani -sof tened -re collections -pom pad -mis adventures -li gab -kal an -intermedi ary -hammer heads -gal ata -frat ton -ea rena -din h -big bad -be hringer -bab ad -alder ley -Ä ij -swi zzle -sri ram -sp hl -so wn -rit su -r ga -pur u -pointless blog -pide mic -opinion ated -mo stafa -mel ange -heaven ly -fort nightly -first class -essay ist -e ons -crump led -cri ver -c ór -book signing -bicycli sts -bb ys -ball ston -ap arelli -amc theatres -ðŁ¤¦ ðŁı½âĢįâĻĤï¸ı -èĩ ª -ym posium -war heads -wan de -usc cb -un suitable -thomson reuters -syndro me -ste tson -smart grid -rut ger -r nc -pro gs -pre to -pre text -pla gues -pink socks -pathe tically -musk ing -memories of -list e -kylelarson racin -ja hang -hos anna -follow vintage -du ong -de arie -bol lards -bey blade -archil overs -antho logies -ãħ ľ -yo shin -yeez ys -vv vv -the mike -stone work -shuff led -par c -osp ina -mu mmers -mouse trap -maz dar -h sathletics -future leaders -f dl -don nar -disney sea -can seco -ab use -? "- -âĸª ï¸ı -าภģภ-yofthe week -uk books -to sh -to live -semen ya -seep ing -sa die -non toxic -n ss -ma dre -kin k -kim xi -ki ef -j angp -fré dé -fo low -etiha dairways -cro s -car le -bou gie -ak leg -Ø§Ø ¡ -w sf -vali antly -u pe -titus ville -th ill -sto wers -red wave -pan et -o ea -ne mt -marketing automation -m cafe -la borer -k tt -iron pigs -hero clix -gart ners -fran ke -fate h -carly rae -cab ela -c jr -brill ant -bj b -back court -babe sonparade -adri anne -åī į -z umi -uk smallbiz -t zen -rancher o -pho ton -p tc -nav ara -mea gher -maced on -juli ab -intro verted -gar issa -ga rena -f nd -eco s -do tie -diffu sers -c tober -bt vs -bi deford -al roker -ab stain ->>>> >>>> -ðŁIJ ĸ -w lv -the perfect -sun ami -retweet tuesday -ragn i -or ally -newsma kers -ne ster -lon im -in ra -ido psis -ham es -h sg -gra u -far a -fac simile -dar rel -d nb -craf ter -cla as -羣 åī£ -âĶĢâĶĢ âĶĢâĶĢ -vol tag -ts field -tech nom -t and -stal ban -st witter -peace makers -noo dle -newvision wire -monty python -iloven y -hein lein -hard son -ge sch -fri mpong -door ne -doctor who -derma bra -ban que -adder ley -ãħĭãħĭãħĭãħĭ ãħĭ -vol t -vine et -ok in -no pinion -ker n -kal goor -hender son -grey ish -dharam sala -curmu dgeon -crab be -cade t -boden see -ax i -arab ian -ðŁĴľ ðŁĴļ -world teachersday -wil m -thi eving -strol led -stre pto -sting ers -st aves -soil health -sharmar ashmi -prince strust -pontif ical -pi der -nu trac -meteor ites -mag z -ma zes -lu dd -grl probs -fresh eners -ev asive -endanger ment -diab los -coney island -can tata -bra bus -bou lt -boo oo -at rol -amazon as -al bom -ag oura -ad dress -à ¬ -worl de -whati s -ser rat -re pack -pinto fotografia -per dana -noo t -neuro muscular -intol erable -ib sen -grandio se -fe tz -e sher -drunken ly -d back -cadill ac -bou l -bex mader -ak al -âĶ » -z ir -win star -vent as -teapo ts -team hendrick -stick man -raw food -ol vera -octag onal -ms dyn -mo et -mand alu -ly ne -le im -kim brel -gill ani -ent in -eno ist -dog fight -by passing -brisban elions -bir git -au snavy -ake em -ac v -âĻ¡âĻ¥ âĻ¡ -âĻ £ -x tc -wer n -tu uk -tapen ade -smo ther -shar o -roy ale -reach higher -prin tables -paci fist -on or -o ken -mi ps -leg en -j bc -im h -hell man -gri z -cin c -carmel a -at un -accentu ate -ti pal -ti ghe -ss ds -si ba -sas aki -robb enedict -resign ations -quo c -pag anism -oshe aga -om ur -naw al -mariairene ali -mack lin -mach in -kriti ka -gran bury -glo zell -endo scopic -da im -d able -cu si -cn p -cl ann -cken ya -brown band -bo jack -ze hra -vote green -then yra -superhero day -se phi -ro sa -or issa -metro bus -magand ang -ke ster -good man -fox star -fer min -educ ational -eat well -colling woodfc -cap ed -bww ings -burn the -ban y -ag enocide -ad x -top team -sycho logy -spaw ns -she ela -ru ffin -ri mary -puni shments -pan ting -pal es -nun u -mal lika -lip man -let itia -jody highroller -id li -hot pot -franco is -fer rig -fa sted -end es -domain names -dissemin ate -disp leasure -dem ire -council ors -citi group -bougain villea -bau x -band mate -bal list -ðŁķº ðŁı» -we sto -vi als -uffi zi -sp ud -souther ners -solar impulse -shy ness -roo o -re ma -pin ker -pin ay -pal ati -pacific o -northrop grumman -matricul ation -master nodes -ln sm -laugh in -gw v -gui ana -fis cal -den ovic -clifton ville -cham ps -âĸ ł -ver hoeven -thr illist -ta vi -synthe size -stre u -shih tzu -roth fuss -rajkum marrao -per it -os orio -oak ridge -nov oro -musi al -mc comb -ik oro -i ap -gh mc -esp ero -der ri -be tul -abbey road -ur m -tony goldwyn -taker u -s onal -pet food -pare kh -or in -mo dao -men ino -love va -lince cum -le is -form is -dou lton -corn flower -ci h -chair lift -blog share -auto trader -amin u -air power -we ig -ta han -s from -re apers -peto skey -out i -meson et -lo ar -ici est -heal dsburg -he mant -gom ariners -go ong -for texas -for hire -for go -fa zer -cor nel -cancer awarenessmonth -can cion -bo shi -ab ena -म ह -umb ai -ta ffe -stas era -shar ps -sar torius -s vo -s mex -ro co -neutro gena -neg at -mac arena -light bulbs -kam ar -k aki -jor di -hc ps -fre elo -edi fice -eat er -dream job -disgu ises -cre di -ðŁĹ ŀ -w psd -talklike apirateday -rosh ni -rock lin -remun eration -re forestation -pp ls -philipp e -pan as -ni ere -ne geri -n sic -long beach -kenny chesney -joe budden -jap onica -hair ston -go ths -funer ary -fig ment -f ps -emabaras syourbestfriend -durg apu -dul ci -craw l -blo oper -blizz heroes -battle star -bamboo z -bail ando -aust intx -ë ¥ -Î ¿ -tide water -tech radar -t mn -stro op -queen ofthe -plebis cite -om ggggg -ngad c -nay an -mi il -md pi -loy alties -ili ad -il au -high point -gal ang -gail simone -fro u -epi der -dynam ism -crand all -cou ture -bilt more -adam o -ðŁijĬ ðŁĴ¥ -x prize -well er -way fair -sym ons -sky warn -men ards -ladies night -kaz oo -hin denburg -geor gi -fun da -d sk -bren ham -au ght -annu cci -ë t -team sheet -sho k -sa org -p silo -ow al -oure ux -ortho tics -ofex eter -ni ers -mil am -mcnam ee -ma def -laid back -l mbo -kiran bedi -jav on -ha vel -ew g -dol ite -dar na -chi eng -book binding -ban jos -ab gt -âľ ¯ -yoo jung -wee den -thick ens -the secret -t wa -swi zz -sor ter -sec under -resi dential -per y -palmo live -oculu sri -nerkondapaar vai -mu ddled -lif ton -knickerbo cker -ke b -gri dge -form er -fo gnini -en im -dream like -caille botte -bourne mou -bar res -abbrevi ated -[ $ -Ùĩ Ùĩ -ws dot -well fleet -we ss -uof g -pic oult -orange army -oph on -op aths -ohi ou -mar ton -l ory -keep sakes -jhb traffic -hutch ings -gendere quity -entrepreneur life -e pee -dising enu -dex trous -ð٤ŀ ðŁı¼ -ãĥ© ãĥĸ -we an -t cnj -sunny side -south chinasea -solange knowles -serap him -saq ib -sa thome -re mit -r df -pan cit -our revolution -op r -my corrhi -mi ike -mamo vies -liberalis misamental -jam ila -hen dy -hatch lings -fy fe -fi aerc -er am -ecclesiast es -de forest -crystalli zed -beatsby dre -) + -é £ -âĸ ¬ -Å ¼ -west ph -un os -tu olum -stra hovski -stop watch -road tothe -pl unk -non stop -mohand as -ma saya -lik ens -leon ora -ide alism -half pipe -hak flak -en ji -desi igner -co si -bro gue -br ith -bil la -yam mer -xi u -wait angi -vell yn -temp us -scot tw -sal ukis -ren ne -rec ou -r ft -qe ii -pun an -por chetta -ot an -malcol mx -leg azpi -lady birds -ket ts -head line -grey friars -eu council -eclamp sia -bri ghts -balik papan -archie comics -a ok -Ø ´ -vs det -swit ched -sw it -stre aker -st ela -sojour ner -sam a -re ham -rak shi -prit chett -modao zushi -leaveno one -kai ley -jo sie -har sher -ham esha -hal ston -genu ine -gant t -for rent -f me -exfoli ate -exc o -dru sh -di um -chau d -carri gan -av anti -ðĿIJ ļðĿIJ -woo oooo -twit cam -twil son -schul er -pump er -pro ve -pd k -moti v -mary j -l mb -key blade -jam un -invicta fc -helen zille -gome z -ge co -fi ero -effec ting -disra eli -diction ary -core tta -compul sion -colouri st -at ella -an ant -ah at -ðŁıĥ ðŁı» -âķ Ń -wing o -turtle day -sw k -sv k -sun less -stay woke -starwar scelebration -ss k -sam bal -por gy -pollu ters -pedal ing -mo een -ming gu -mb led -lar ose -idi opathic -holy well -franco phonie -felici aday -ear piece -citro ën -car ies -business growth -bu bs -bree zy -big thing -bend tner -bank head -au ssi -arab idopsis -afa ith -upd ate -side winder -ser p -red hot -red bone -rash mi -radio x -pom pey -news agents -ne sh -kui per -ko td -karl lagerfeld -hun e -har po -frau ght -fe brero -contempor ain -ben q -ban nock -b db -aus law -annihil ated -acquaint ances -x n -wood shop -stdavid sday -row ski -re le -par acet -miro la -man college -ki sii -ken ora -inspire them -hor ati -hodg man -hal ong -fm ri -eto wah -dol led -asap ferg -ab ac -âĨ ³ -tre au -tram ps -tn b -time in -thereal luke -srk universe -skr tel -shu sh -peep les -ni yo -lom ond -lew ick -il over -hy d -hand lettering -good night -givesyou wings -giuli ano -galvani ze -forget ful -fill on -en q -echo ed -dou sed -card holders -bel ve -ar leg -af o -ðŁĽ ¬ -ì ½ -water craft -tw omen -tu bu -tren dy -ton ibraxton -thermom ix -straf fic -si su -rac lette -phal lus -n sic -m hl -ke zi -irish water -ido u -he igl -gc w -eman ating -ema scul -elias sports -con fers -bay ev -atch ison -are public -ÛĮ Úº -weare bc -van te -un lawfully -typic al -thro ck -sumed h -pro mul -pre d -phan atic -pen ge -new born -moor park -lu ang -lock up -lind as -kir sch -is wonderful -ger st -g pr -fast post -diabete suk -dc p -cy st -con nell -bo bo -big gio -witt genstein -victori abc -vi ajes -the bes -tar r -re ignite -pon yup -out performing -my be -kr ingle -keepitinthe ground -interro gated -ghos thun -gant eng -dio des -dhar mamovies -devil man -carnegi em -beu lah -ant or -ðŁĻıðŁĻı ðŁĻıðŁĻı -voten o -u icide -the social -stag n -st outs -soul music -ratt les -qu be -pru e -n online -moon byul -magni fier -mac neil -lil ia -kon stan -ily as -ik shank -hen stridge -gu cc -faze up -cor relations -cham bered -caf a -braun schwe -bb cy -b indi -am mi -ðŁĴħ ðŁı½ -vi vor -vare se -ta pir -spe ach -schiav one -sam buru -rose marie -q ms -philli pe -over cooked -on point -mtv teenwolf -mo cca -le febvre -jess y -i gen -ho to -head scarf -hazal kaya -gar cons -dru mmer -cur ricul -ap hid -am eri -ah ps -о Ñģ -whee zing -tam pered -soul j -shaz am -pap ill -nadi adwala -mor ts -mil ag -joburg za -jen nette -in at -hoe ffer -ha ylor -gol dust -fri uli -fertil ity -con spire -co ty -cityof joburgza -ch ac -bu bu -ðŁĩ¹ ðŁĩ· -will and -white washed -suri yaf -sun burned -summer vibes -sr g -si re -se gue -pur ve -po what -ou ster -opp ress -o donnell -mur i -market watch -ka ir -jazz master -j lc -hu ss -ger ais -elo g -e ject -cho sen -boston terrier -baahu bali -ઠ° -xxxx xxx -ton en -the family -sub strates -savi ors -sand banks -quel wine -pel vic -one onta -nur ul -news live -n pb -mat ar -le eroy -jmi quelwine -char ley -chante relles -brack ley -art as -ap f -aene as -aap tards -ç ¬ -tro po -til ton -tan u -ster ne -stefan ia -scar sdale -ra bia -post mortem -pen ob -nk jv -mu sha -mor rill -mal functioning -jag dish -individu alism -im presi -im at -husband ry -hiking adventures -heritag elottery -free assange -diyar bak -cro que -bear dy -west ley -truck suk -tran scribed -ti vo -shi khar -she f -pour quoi -pinck ney -nam joo -lexis nex -ladi esof -kun d -keep on -inspiredby pets -he dral -ge ss -fry denberg -dominic ana -def y -cour gettes -bnpparibas open -all size -ad lington -absc ess -ve toed -v log -us opengolf -tin ley -tech i -strictlycomed ancing -so kol -sil ences -pic u -p nd -or un -or l -no th -meet and -jennifer lawrence -huay ra -hu evos -fant abulous -fa ery -but land -bul lah -balth azar -ba ster -ar pels -v hp -un sightly -t ny -sag amore -ri jeka -resc ent -pokemon sword -mar rone -mag alona -kra bs -indic t -her mit -hem phill -erkenciku ÅŁ -e dem -den zel -d jer -bre mer -blac kie -bir nie -big boy -be si -arabe sque -aap ke -a erie -à° ¸ -à¥ Ī -ö ping -week long -ur ination -un bothered -tropic a -tb k -super saturday -si rac -scri m -ru an -qu als -pe avy -ow w -nu ova -new menu -little things -lepidop tera -kil ts -ire v -frat er -footh old -du tyfree -corrup ting -cor aline -conven or -consul ts -cl amp -carrie fisher -bra himi -br annon -bab by -ap ics -an thea -à´ ® -ب ÙĬ -wou ter -west allen -vi bra -tsun dere -tin isto -thic ket -ter io -su z -sarah k -ph lox -nick els -nat sume -ma sandawana -joh na -i fl -extinguish ers -de spe -cunard line -cor ley -class man -chang eling -bio logy -ap supdate -???? ????? -: ** -ðŁĻĦ ðŁĻĦ -w fa -to we -the dress -the day -ten emos -so viet -sam ine -queens way -pho tonic -n annies -i ae -ho xton -hel met -ha be -exam en -ethere um -e ks -de ion -day project -ball mer -as me -aber dare -~ ^^ -wy clef -u wh -the magic -stan dish -st ich -ss np -rc navy -pile up -pedago gical -pav el -p ings -n mb -keyston exl -gin ni -gam ers -fer rier -ex if -du plo -dillon francis -dash berlin -chi vers -carm ella -bre chin -bloom sburg -ar nt -aji thfc -ðŁijıðŁı¼ ðŁijıðŁı¼ -ðŁı Ļ -ìĿ´ 민íĺ¸ -the alex -t ance -soho theatre -smart city -skyline skaters -ro atan -nu vo -nouvel les -ms j -jave c -is let -inspirethem retweettuesday -gov au -ge ver -g ling -dermabra sion -corn flakes -coo gee -ck nw -chul z -candy land -ðŁij© ðŁı½âĢį -wel k -tr onica -tex om -supercross live -shin ola -san at -pav arotti -pan cake -lunch break -ic g -hi bachi -head room -han gul -gir aldo -gen isys -elo pez -bed time -bar won -akin ator -ahlul bayt -í Ĩ -zac brownband -w cu -stou demire -states ville -ser p -se dia -scru b -schle singer -rick ard -refe c -propri o -pro cycling -ou ya -ma ston -health tip -h mm -gradu ations -for tify -fitz simmons -far oe -fang ir -collu ding -bit umen -aram is -ðŁļ´ âĢįâĻĤï¸ı -zig er -y ell -ve ttes -tree house -theor ville -telefon ica -sub version -sizz les -shi an -secre to -scot national -sco ps -sal ley -pflu ger -peace ful -ning bo -mor kel -mo ise -kra k -kn itting -hul man -gwyne th -ge z -fe c -f ête -c aceres -bjö rk -at twood -as cor -armp its -animalsin churches -& - -̵ Ì -wales rallygb -tink off -tb t -shin ers -rock man -ro skil -ram ped -ra bil -om agazine -nu st -ntl museum -may war -le wa -huer tas -ha gley -frigi daire -flori das -bu dg -brock ley -bly th -am ath -åı ¤ -zin nia -wyn ton -work men -wag oneer -ru stom -resi stor -patt ys -new suk -nan di -mock ups -laid back -jer rod -j oun -inglori ous -helve tica -go transit -chint skap -abdul rahman -ðŁijĬ ðŁı¾ -ðŁ¥ ĵ -z adi -wonder kid -wad er -ro vell -rafi que -pi el -or gre -o da -newyork redbulls -negro es -mother well -li gat -ki a -institu tional -im pulses -epi per -cu ba -commiss ary -big news -az is -arse guidores -wo hl -west mount -voy ag -vit i -valtter i -tinisto essel -tan tra -sto ddard -spres ents -pre quels -pran ked -ne gril -love eeee -la kh -jetz t -hel vellyn -har grave -dun barton -buck scounty -bauer hockey -aw b -asi fa -as v -art print -ar al -= # -ãĢ °ï¸ı -ô ne -verme il -unfur l -tc disrupt -sat ch -sapp hi -ou da -oh c -na sties -man liness -ky w -jo sue -inter op -import ation -her alds -f nm -education forall -dimitri vegas -de ana -day yy -datam anagement -cy no -ct ags -confi dence -cho ge -chang sha -chab ot -bi gh -beck i -bae kho -b enda -ðŁĶ¥ ! -z ong -ward ell -u dc -ticket master -the ss -symboli zing -sch muck -salt illo -rive ter -pre history -pe ven -pain relief -over powered -mis understandings -mark tremonti -l ats -kemp t -ili ve -h sk -gir th -eve rest -dol enz -doglo stuk -cost adelsol -che ep -bc age -banan arama -anti etam -ì§Ģ íĽĪ -thi every -sp unk -skel ter -secunder abad -sav arkar -re upload -pt k -pelle tier -peep ers -our self -oku ta -never know -mitsubi shi -le dges -john stamos -hindr ance -harmon ize -fau n -er ases -duncan ville -classi fications -califor nication -barstool sports -ðŁĩ¸ ðŁĩ¦ -¦Ī ìĽIJ -vs ne -vil ma -v ater -think big -str al -sta thletics -speed y -selfish ly -sad dens -pride inlondon -pressuri zed -pre ece -nicol l -na ï -mm pr -mj f -mega watt -l zzy -l ks -hou d -fi zzle -cole optera -ch aca -carcas ses -yo kai -ym phony -y one -ww j -wat cha -vir g -scep ticism -rc ti -ra fin -pic ts -patron us -ni fty -mess ner -merry gold -ma hila -lor dy -hou sley -hom i -guadag nino -glo sses -gim na -fil my -di ssing -daniel j -ci f -bad ri -adju vant -trek bikes -too funny -than g -ten ney -stri b -sin ab -ru sev -rhe umatic -residen cies -ren jun -pathan kot -mil ena -lin dos -libr is -le mma -k age -hy poten -hur dler -fanci er -expo west -aug gie -ar ted -an w -accur acies -a ek -à¹Ģภ£ -ye ahs -win some -un adulterated -s nel -publici zed -pren sa -pos y -patri o -o cre -ne cker -hann a -go lightly -glenn beck -explore r -el ita -di sta -delephant day -debon air -dawg pound -cone jo -cc v -brick man -bc it -b pt -alli a -ab dn -ãģ Ĩ -âļ¡ï¸ı # -wet suits -vad os -thelasto fus -sun room -sin do -ser re -rob zombie -region ally -ra uch -prs guitars -on elast -no ct -nay apakistan -mu q -mo vin -ma ite -leavenoone behind -lake head -l vs -jau me -gre itens -gr anda -firstrespon ders -down beat -di mash -cy nd -ct c -crimin alization -chriso donnell -ch b -c ades -us al -ting gi -shon dar -s rising -russell ville -rp crd -pu es -ntlmuseum sscot -nick erson -mika el -mand an -mainten ant -listen live -leader shi -ic hin -hugh ie -hod son -gun j -first time -essendon fc -d apps -crad dock -by un -bu ehler -as signing -antiqu ated -ad dio -ab acha -/ âĤ¬ -ðŁį ½ï¸ı -è Į -zh ny -race horses -ob r -nor co -my cen -mur u -len c -ka en -j mc -j dr -iran talks -icha bod -encel adus -emmy lou -doper ahouse -dige sting -day sfor -cher u -cast elo -black book -al mirola -Í¡ °) -ze iro -xi o -un altered -tra desman -tiber ius -span ked -sha ho -sal len -rabo bank -ma der -ke ren -irresi sti -gan on -g by -far fromhome -ever e -darren atics -chennai yin -cedar ville -bo stic -bla det -why te -wa ig -vi dar -urbandic tionary -tal c -stret ford -som bor -skir mi -scam ming -rec ali -pic tou -p lies -nil erodgers -locomo tion -kar don -kag iso -iz h -hon iton -ho wie -gas ly -g ci -ent endre -b ami -yam ig -v st -tran scanada -toend abortion -spondy litis -sky rocketed -player one -oscar del -offici all -nu ms -mi umi -lo vi -land locked -ky les -juli eta -jac ke -hard ing -fine baum -ess ar -emptythe tanks -dun gannon -desp acito -cul ly -cow les -clover field -clean ses -casca is -bus k -be same -arl berg -al bie -ag onist -wolver ine -valtteri bottas -tomoda chi -the wild -the play -termin ating -tan may -tall ships -ta queria -stonebwo y -sta hp -sou rav -sh allows -ra ison -pan day -nam ath -mumb aic -mor ricone -medi ators -lon dra -h ould -e mus -demi god -dee per -deduc ted -cru ikshank -correc tor -chichar ito -cer cle -backthe brits -asper gers -as aurus -acci on -w ylde -un dress -tro ms -tee hee -raw son -pollu tes -pi ri -oro so -ni mmo -me taco -kill y -juilli ard -iihf worlds -hockey canada -gusta f -ge ddy -faul kerson -f sog -elizabeth town -crowd sourced -cnn philippines -ba aaa -ash ington -ap ni -aha h -ì ħ -udhay stalin -tra eger -te rest -spi ros -so com -pr or -petre l -or ita -not ables -nai jap -monc ada -mol t -mo sel -mediac rooks -kari joys -k ente -ig man -heal thre -goo o -fro sin -do ji -dan is -cur i -creep show -creati vity -cliff side -chil islove -cham ba -cele ste -be tro -aven ir -are se -ðŁĺĤ ðŁĻĮ -ìķĦìĿ´ì ¦ĪìĽIJ -u da -swimming pool -st impy -se ol -sar di -redu ce -passion passport -pappar delle -nit v -new collection -mil burn -make my -kam au -go friars -en core -ellen berger -den on -dal by -cri pps -cooke ville -be u -barbac oa -ari ane -ðŁĺĦ # -zi le -world music -wo wing -w br -w ades -strogan off -sax e -s mee -myri am -moon light -mo ko -mn dassoc -mirad or -lobla w -lam beth -jeff sessions -har una -h yeon -glu ing -game jam -fascin ates -donagh y -compens ating -chennaiyin fc -cas se -bi um -au die -anag an -ag d -* - -the pink -sto y -sli ppy -scham pion -sag as -ra sia -ra az -non ame -nb g -mer gan -marin ating -kr c -know sbest -is enberg -fa king -er land -day swith -coloni zed -at orian -amer sham -:) :):) -ðŁĻĪ ðŁĻĬ -ðŁİĦ âĿ¤ï¸ı -yas por -van s -under class -story boards -so true -si bos -roy ally -pi dgin -not as -mand rake -mal as -ling ual -kari us -k ry -it sabout -hugh laurie -hist sci -datac entre -d hon -bro iler -bis was -basti a -as pr -am tv -ac ry -ê²½ ìĪĺ -wol fs -ve sta -tor ship -t po -t ela -sg dq -san deep -sa ia -ru sse -randee phoo -py jama -pre owned -pax man -knowh ow -knop fler -institu ted -home building -hol sters -end polio -dun ker -ds world -do sti -dixi eland -berkham sted -bat son -bal ert -amand apalmer -all time -al ys -wi relessly -thank ateacher -superst itions -sec u -ri vets -pole star -photography isart -penguin random -olim pico -o cal -nor ovirus -much hal -mlp season -michigan stateu -matryo shka -lu ms -lu ann -kuro ko -hu th -far hank -et as -do gged -di dy -dent ity -dark wave -cruel ly -cr inging -capit alizing -bizz are -beach boys -american gods -al aves -zach braff -un important -u vb -the wrap -repleni shing -pin ang -pi guet -pha blet -per spex -pelopon nese -pe tere -paracet amol -marty n -lat ingram -ir ala -gi ada -gemin itv -gal ahad -ery thro -el stree -const antino -ch ali -car den -bro wer -yu chun -world wetland -vibr ant -uri el -tim ms -tanyabur r -tablo ids -pau lus -para ben -oz plants -manitou lin -intrin sically -i ros -hol by -gaz es -food bank -flu ted -farhank virk -co ster -brian stelter -bil o -ben atar -arch duke -well deserved -ven lo -v á -un informed -tre m -trading cards -sp lu -shondar himes -san ci -re vision -punctu ated -pott stown -ot rends -nishi da -in za -ig es -g music -firstdayof school -espo o -cath cart -c aya -ast ounded -app el -am ik -action bronson -ðŁĮ ¨ -war craft -w mmr -super models -st ich -spor k -sc ituate -pal er -leil ani -lant ana -la fit -kar th -horn church -gat land -fir ming -fal low -den za -de vising -day er -cher ubs -cab i -black comb -athle tico -any an -anten atal -å ĺ -Ì ħ -wi ese -vig no -tattoo ist -s media -s mbc -run way -resur gent -re plete -rd v -ra bly -r mp -pit ty -pis co -pan erab -nj e -lets ride -l ally -k lay -imbi be -here tics -haw kes -go bills -extra judicial -car port -bird sup -bf v -b sy -appointe es -è ¨ -ãģ ¡ -Ë ¢ -z iti -w ence -uuuu uu -stev an -skag en -sech skies -rin ds -pu ggle -oni on -ob tu -mer ito -kis sel -king maker -goo f -fab i -ex alt -drex ler -co del -can io -c sir -brook land -bre c -as king -as ado -animat ronic -andre am -alleg any -acces sto -yas u -y cc -stin the -sch aaf -pati entex -nathan son -mc vie -matt goss -lorele i -kom bi -innocent ly -illu si -hosp ice -gr dc -cw t -coronation street -c end -bi ddy -apprehen sion -anime art -ancient aliens -. âĢĭ -âĺº âĺº -you version -voteredto saveamerica -voet bal -ur c -u gs -su mn -self publishing -ro el -ref illing -re generating -peninsu lar -parker sburg -pan sexual -music uk -hus kie -glad ness -endo thelial -earth en -dram atur -bar negat -aq ha -ani tha -and al -al ag -ye quipment -un failing -tu dyk -ti mbs -th old -stra p -st ly -single handedly -sid har -red hawk -power ful -pou lton -phant as -maur ya -mal ai -load shedding -i acp -hamp shire -h tl -girl crush -fy ne -found dog -do wer -ander ton -z ink -yez idi -world photoday -whin cup -uu tah -tri ggs -sig nups -reen act -rafa h -n phc -min dedness -mc entire -kru pa -kni ghton -in town -grate fulness -gi one -en dive -c ji -b ws -are wa -allank lownz -. ") -ðŁĴ¤ðŁĴ¤ ðŁĴ¤ -⼠· -zombies quad -v fx -turn stiles -ti guan -si kka -shat ru -sel o -salv ad -red shank -r football -one ys -obam agate -kal in -k con -gree ter -extend able -beg ining -aver age -ari ann -ak om -ðŁĴģ ðŁı»âĢįâĻĢï¸ı -ðŁĩ®ðŁĩ · -ur p -uni fied -u mah -the ia -schre iner -schaf fer -san e -rejo ices -portlao ise -ntv uganda -min ke -massi mili -mari juan -lma oooooo -leis real -jo dor -immigration reform -illusion ist -i wa -h tv -fren chri -fe ction -di ure -dg ingly -d banj -criminal isation -cr w -bu p -bo ban -black women -av as -alpine stars -å ´ -you ss -y gg -tat ay -stop light -sick ened -sen de -sag ar -oculusri ft -oak ley -nor den -mash pee -liv uni -kam akura -heat stroke -gre ggy -fo ward -fc px -em ura -den n -dec ry -cap ello -buc s -bu ono -bal khan -zeit ung -younger tv -wee tab -si sy -se el -rv life -o ho -neutr alize -merri ment -m vr -long boat -lay in -kinder gartners -homeand away -historical romance -gen eliad -eric ho -asser ts -abhi man -æĺ İ -âĮ Ĵ -wordpress dotcom -winter watch -w gal -vi da -valky ria -universi ade -tt inger -tillam ook -tamar aws -stra us -she ehy -reit man -re de -pan gea -nhl playoffs -male e -ma ite -joseph morgan -ix els -ici er -fe ist -fair haven -epis co -dat av -dar ken -dal matia -cur zon -cityof pg -chec s -char lo -can tante -bas c -androgy nous -ac risis -ab iz -ãĤ¤ãĥ© ãĤ¹ãĥĪ -wh er -tube less -ten ant -tell tale -sun dog -so red -sigur dsson -sig rid -samsung mobile -rat ner -randeephoo da -quote softheday -pitts field -mu tombo -la wa -l sl -j vm -j ii -ing mar -hard woods -happy girl -grace helbig -glasne vin -footy show -fa wl -choo ks -c and -bo res -berser ker -ðŁĴ¥ðŁĴ¥ ðŁĴ¥ðŁĴ¥ -y im -vo ici -vai bhav -tt n -that cher -supri sed -su plex -si op -sen bob -sa wed -rr l -ri gat -q so -pro tour -pat oo -nat ed -mis d -mar ke -ma thon -ker at -hypno tist -go huskies -g atta -es group -em pt -dol ittle -del ancey -cour bet -confer ring -carlyrae jepsen -canon usa -beat ings -a holics -ðŁĺŀ ðŁĺŀ -verte bral -str ac -stat eline -regin eval -regineval casid -real blackcoffee -on myo -offici alo -mar dan -lar osa -k ny -in conveni -ilove it -hi ms -hand ily -fan n -fan acc -f to -ech ever -de activate -cn w -camis ole -ay outh -ar wen -all and -ab ot -ðŁĶ ĭ -wr gb -wh iny -toy fair -sun glasse -ste x -skull girls -rab bids -of hope -mumford andsons -mou ton -mel vyn -mc diarmid -le mont -ki ir -ja wor -ef c -dyr dek -broad com -basspro shops -ar bon -all kpop -ðŁĺİ ðŁĺĤ -yrs ago -un dressed -ste pson -short ness -se vic -respon dent -re decorating -pessi mist -ob en -ni f -lland aff -ke f -hurricane maria -h pp -grenad ines -ful fil -exam iners -equal payday -daysof ourlives -chec kitout -bell flower -befri ended -beaver creek -azerbai jangp -all sopp -aim an -whis ked -ur du -sho tz -seque ster -sau ter -pro tracted -oy w -oun cil -on ight -nit ride -nca as -kim brough -kh in -home forsale -gra ber -gol die -flui dic -erst while -der vish -con temp -child hoods -captain americ -cade au -c ft -bron c -bri ones -ale vel -agar den -adri atico -' ), -ðŁį ĸ -vivid sydney -up stat -re elected -re cluse -quad ra -prime knit -play fully -par ik -ny r -mill iner -mate o -kil ian -jin shi -ine quities -idin amen -flim sy -d wayne -bi dge -bare foot -bannock burn -amu st -ag ut -ade kunle -ðŁĺį ðŁĴĭ -wic ket -tur rell -tr all -stu ttering -smo thers -slu gging -sl benfica -sam ut -saj jan -re turner -ran unculus -ow asso -litho graphy -le son -jef free -ha das -gurud wara -gaspar illa -ffff ff -fah my -es ny -dha ba -de bru -content strategy -canonusa imaging -can tin -besto ws -benz ene -ame er -al mir -Ñ ħ -w uk -te ena -spand au -sl acks -shra van -se er -ru x -re can -popp unk -om arion -ob gyn -li ppi -i robot -gun ship -gu dang -good to -for gettable -el isse -dis lav -cc ma -bud da -brod sky -britt a -bon avista -bet we -arth i -ar vada -acor ta -ä¸ Ń -tweet storm -sal u -ro mu -perpend icular -partofthe pride -o dometer -moncri ef -mad lib -lur ch -kon go -jam il -injec table -hu y -gal lego -g afe -freen az -dunbarton shire -disney infinity -da han -bar ingo -ballant yne -ba je -al ors -ab devilliers -ðŁĴķ . -ðŁĩºðŁĩ ² -yar brough -whit erock -vee am -tw ales -sk ai -septe mber -ring git -red sea -ra fred -quig g -pollin i -ofthe world -madein britain -kz n -kalin ingrad -j sw -hawk nation -h la -glen rothes -em mac -ear nit -doug ducey -condo lee -as sis -ane es -acci es -worl dradio -veronic amars -tele prompter -tee public -sailor moon -rat ed -mon ast -mark it -makon nen -mad ness -leh ner -k ca -info en -gi ms -ge sso -fr amer -fi era -f sb -down ham -darshan raval -daddys girl -ab hay -vicari ously -twee p -tom aso -tik har -season ality -prime val -onec lub -nargis fakhri -me te -mag fest -fre ida -fat ma -donington parkuk -corpuschri sti -confe d -chuck ling -bridge town -b halla -anticip ates -! ðŁĺĬ -zon do -worl delephantday -wis ley -win c -unsig ne -su cess -ra gg -q ar -olim pi -linde mann -kali l -irrepar able -gab bie -free books -em lyn -e brahim -dam busters -cu pola -cham berlin -bro co -av atar -at albihariv -amar nath -af ish -.... .." -" ?? -wb ko -vel ly -tho b -streas ury -stop km -sec tor -ride sharing -plum mets -mill ville -mary beth -mar bury -mal ini -is chia -im pu -haver ford -happy womensday -gh ero -fo e -expe dited -charle voix -cc p -ca o -backthe birds -ab bs -ðŁĺĽ ðŁĺĽðŁĺĽ -Ùħ ÙĬ -walk athon -ver on -tra ktor -ton igh -tes ers -ss ons -sam and -repra p -o bra -nir mal -niq ab -national park -mat adors -mal evich -g sn -dun lo -dh fc -de tal -citi field -ce ded -cait lyn -ausv pak -art fest -appropri ating -all women -z ella -web hosting -to pra -sy s -spiel man -snapmatic art -scent ral -refr active -re frame -pat ern -magic rock -khush sundar -hemp field -gab i -g war -fort inet -dark ening -chick lit -cer velo -bag gio -ap t -ðŁĺĺ ðŁĺĬ -ب ر -´ ´ -wel ford -uck field -td garden -spi vey -septic eye -roll wave -reboun ded -raf ale -pu rohit -promon tory -plu cky -museumo flondon -mu fc -moon walk -le sham -kol lam -jessic am -head winds -fre mont -fla ked -fit ton -eto ile -brain less -be tel -ar be -ðŁİģ ðŁİĦ -âĢĭ âĢĭ -wei maran -wat ts -wagen ingen -w mo -tual atin -tro d -til de -strategi ze -stewar dess -stan sfield -propor tioned -per ot -official aldub -mun da -mo ong -mid lands -marine tte -k roc -ham idi -gri pper -gob bler -go ins -euphor bia -dreams cometrue -di adora -def lection -cyan obac -collin sville -claustro phobic -ce dia -cal lus -buri ram -as jad -à° ® -uc ine -tun s -tory canvass -sun tan -ste deli -sensi bilities -seed less -sag al -ruby rose -preten se -n fb -mon tes -lo sal -lar oche -kar isma -jen s -gru dges -fore al -excav ators -enni o -emboli sm -el dora -di able -cou se -cor ic -carr boro -aa e -a oyama -zo zeebo -zar co -val eri -uni ofexeter -tram onto -tra sk -t dk -subli me -ro ys -resurrec ting -pro vision -mari sha -mare mma -looking good -lex po -kutz town -kop itar -jo ed -jay ryan -inferi ority -hil le -gol da -fashion police -fairy land -ex im -euro pol -clif bar -cir illo -brit to -atul lah -agor as -accu radio -. » -wood turning -un disturbed -uk h -sp liff -sher rill -sh elli -sale stips -sa chi -s ld -radio logist -o sten -nan ette -miami dade -lat ic -kil roy -ki zer -kh en -ke shar -j ci -green building -g md -femen ino -empan ada -candle sticks -bye bye -bul loch -blo tter -around the -alli ving -wal u -um or -ther ton -tal war -ss mann -sha ile -run t -ro ze -p ander -ny lander -no zzles -naga i -maz das -martin i -ly ca -loving it -ki owa -eras ers -cas save -bis co -am ini -íį ¼ -ti gard -th ig -stateof mind -slu ice -sitting bourne -sham bhala -red list -quiet ness -o iq -nbas ummer -metax as -mat ts -mar ling -ma ad -li ed -j ina -inter laken -inte xas -hand shakes -gall bladder -g br -far relly -boston college -asyn chron -ar le -antiques roadshow -and ed -an ahi -ador ns -xi ang -world vision -wood hall -rutger su -ro main -pronoun cing -piec ing -nai vasha -mishaw aka -lamp work -jay ce -ivan hoe -indivisible team -idol master -gab s -final level -fe tc -f jb -di sses -decision making -cro stini -cour sing -car ves -an tof -wine spectator -ver it -un kind -spinn aker -sle p -seper ate -pre loved -ous mane -min econ -mal zahn -love day -lav azza -kl inger -kac i -for us -f ú -f se -et tore -deer hunter -cand ela -bobble heads -bel tre -ban do -bab i -b illu -acu te -z sl -wat ling -tele com -t gm -surpri se -super valu -sevier ville -sch o -sa hi -ren dang -regi a -perpetu ating -par veen -mood board -mer lo -me go -kom al -ki efer -in extric -i dar -hu ish -gon do -foot notes -cham bord -blizz ards -bbc africa -b fc -aq aba -ais d -ðŁĽ ¸ -wal nut -un selfish -uf ti -timoth ée -tewks bury -summ ation -stephen asmith -so dom -selec cion -ro ya -repa ire -prosp ero -pha i -ou ston -o zy -mel vin -love thi -lamp shades -kh t -k eng -ir ua -in cur -iam steveharvey -howe y -hom icidal -he cker -feed backs -du pon -de be -blood thirsty -ar ni -and uil -Ä « -y eng -we izen -springh ill -sp rig -sch ler -np bot -min aret -maha shivratri -littlemix offic -le van -lab ours -jj ong -iko shi -hy olyn -hat o -ha sten -d mn -cycl amen -chicag op -black heart -bl yn -barne veld -ambi valent -ðŁ¥ Ľ -w bal -tu ft -sun downers -subsi diaries -set tembre -rel td -plan ed -mar mara -mad town -liv uni -jar dim -jan is -harry hausen -eu a -est reno -do able -dissi dia -dis ordered -ca at -annoy ingly -al ax -Ä į -ww y -wr ing -ur ner -twee d -tw ire -thought fulness -sho ji -sar co -pho gat -ohio ans -ny rr -nov a -north westernu -nac ac -mour ned -mam mukka -mal tesers -lan sing -edin boro -dr ones -depra vity -conor maynard -cherry blossom -ch oli -biophy sics -asse en -( / -vi ento -sri man -sf chronicle -schol z -row lett -ribb on -ren ga -rec tal -rascal flatts -mi v -materi alize -mag say -koo p -invinci bles -imacele brity -hello ween -gor ica -gi ge -fire starter -fe p -enqui res -be jeweled -ang ana -albu mo -si sulu -sand paper -re designs -raff i -quad ril -over paid -n gw -megam all -mac ie -he avies -ha aaa -h itec -f dd -by catch -bla in -ax stv -ar ocks -ð٦ģ ð٦ģ -wor ke -ve stas -shin di -percep tive -p wm -ncss bethebest -navig ators -lu men -ligh tup -kak amega -jake owen -in conceivable -ha gee -green hills -got land -garda ÃŃ -docu sign -dalla spd -com mas -bra gged -biz arre -bat ov -ag nes -aam u -Ä Ł -ulaganay agan -s ited -river ina -palo alto -o shie -never more -n land -mc coys -maxim al -ho bie -h cg -frome arth -exor bit -exe ge -copy rights -clear field -clai mants -cau sation -bu stam -boo zy -bon hoeffer -bam m -aw ur -?! ?? -wholesal ers -super sunday -richar do -re packaged -pr iti -penguin ukbooks -pas aden -ot m -nigh y -mi ao -maz ari -ka oru -ju sth -incre ment -green man -glenfidd ich -for st -f ourier -este e -e speci -dallas news -cuad rado -c pl -bu chi -brace bridge -ben guet -bella ire -b heem -aro oms -abi ke -Ñģ п -toyo tac -thir u -team envyus -star sky -sol ent -smar ty -shine y -ric ki -penn sylvani -montepul ciano -me sports -kail a -j one -ine u -gun controlnow -go slings -foot fall -far rier -el ucas -el nella -de composed -ch andy -black ford -beat rix -alma gro -adden dum -ad ress -abduc t -vidy alaya -vent us -trol ley -tin tag -speci alt -roo sting -pur ported -pa sta -openstreet map -mu ang -maxim ili -led bury -kel seab -kat u -k weli -is ra -hoard ings -gc b -fu ze -friendship goals -cyr illic -creepy pasta -ce zanne -bon zo -bo thy -blur ry -aziz ansari -ami right -ys weden -woj ci -va shi -thevamps james -stee pest -shahi di -puneeth rajkumar -pack aging -over valued -mu tha -motor ised -mend i -la an -k old -jas pers -idinamen zel -i vers -gas ping -elec tors -dur rani -col li -chi est -ch utes -bmw motorsport -blo bby -wend t -week ende -us weekly -type faces -tor ts -spr i -prank sters -pancre atitis -pak ka -im pro -heart day -hab sburg -fresco es -expedi achat -car pooling -be jealous -a iga -ðŁĺĤ ðŁĺľ -ðŁĴķ ðŁĴĸ -ys c -w annab -tra ger -tor us -the bar -sy nes -swi the -subordin ate -sin clar -si ab -sel ing -scienti st -s rule -re told -r inge -profe ss -pra chi -nat al -ma soud -ma ble -lou pe -load ers -j wt -ice vic -hebri dean -fountain pen -fet ches -de ems -child labour -bo ren -adu ba -vi f -torpe do -sla inte -sar ada -ono van -maxine waters -mach u -intra venous -housel dn -gwang ju -geo graphies -gal eries -fein berg -e my -cross breed -cre ston -consisten cies -col ou -be mo -b hel -au tre -au ch -astro biology -air strip -ag andhi -advantage ous -! ðŁĴĹ -x ts -uzu maki -tin foil -teenchoice awards -tad ashi -sonymusic south -soci ale -se urat -san tee -re th -ppor tunity -newsad elaide -mol en -metallur gy -jamiro quai -ir anga -hydro therapy -g les -fran che -fra se -eri sts -dam as -biele feld -aller ini -ðŁį Ŀ -y ax -trans media -sur y -summer tour -su iza -si ra -sh ada -reminis cence -pro tists -o soy -nf ld -mar mont -magic johnson -lan c -jessic aal -hur ley -had leigh -ha dron -gui seley -fo td -b bau -au berge -acti vel -ye m -vac caro -under study -un fulfilled -un ca -su chet -seaco ast -ready playerone -ram ey -plussi ze -pai va -newer acap -min oz -m pe -li ske -legion ella -kom men -kate y -iv lp -in m -hr vat -finger ling -ea thealthy -e jer -disinfect ant -dark horse -cro que -cow bridge -ast an -ðŁĶ Ĵ -ðŁĩ» ðŁĩ³ -ðŁ¥ ¤ -ÙĦ ÙĪ -un clean -tuesday treat -transcri bing -tain an -sing hal -sher rie -shako pee -sarab are -s ward -ro ams -r ct -plane spotter -ol x -off ame -n als -muñ oz -me chs -maz inger -m hd -len ow -ku bert -know the -hann o -flat iron -er ys -en chant -conquer ors -cd x -bu shido -bonfire night -auto bots -audrey hepburn -as signs -ak ara -tit ania -sub han -stat oil -som alis -pun cher -pe sci -pal as -noir vember -mathru bhumi -li mber -fo iling -ffxiv snaps -ecoun ty -dou cet -deli c -ble tt -bar ham -aard vark -. ðŁĶ¥ -un affordable -um al -ty ke -the war -she eps -sc old -retin opathy -pol ski -l illi -k you -jan ina -indom ie -hor wood -ho gue -glob alists -era iders -embarc adero -co ddington -canvas sers -bird seye -bein sports -art an -amaz onia -am studios -allevi ation -alas kan -al vi -ðŁIJ¾ âĿ¤ï¸ı -ಠµ -à° µ -yen press -ud f -the golden -t kd -sequo yah -sap teched -ray na -ra ad -py ard -ph m -p yo -oli phant -morning news -mar den -mandalu yong -lu mina -irrefu table -i wi -e oy -di dier -desch amps -cornwall hour -brooking sinst -bor romeo -allthe time -adr ille -work spaces -train er -su th -stand swith -sc ola -ru mm -quag mire -pad er -ob or -nu er -motor ways -mohe gan -mi en -me mp -marke dly -ku chi -koth ari -kelseab allerini -gi ana -geom agnetic -fu m -fri se -en ick -di vide -cyber sec -clá sico -bro c -be fully -au stral -atu ral -yoko ono -university leeds -sti glitz -shre wd -restaur ante -oo ja -oh tani -monte zuma -mit i -marsh mell -lo zi -kkkk kk -gov mike -el ane -e pr -cra ved -cr anium -cc as -boy ce -bo gged -bill erica -ar sen -amp stead -ðŁĺĤ ðŁĺı -ðŁĮŀ ðŁĮŀ -z j -wo ve -win a -walla sey -w swan -tin ie -thr anduil -tal mud -stom ach -squ ished -small youtuber -seri en -salam anders -s ness -one big -lloyd minster -kim ble -kas sandra -joey bats -hamp son -gli zzy -gle d -gg j -es cott -erick a -e um -de gale -da che -confis cate -bul gogi -arthr itis -ali x -af er -à®ķ ள -war mb -vander meer -u in -so co -oiq fc -lu gs -ll bean -ke ma -k rush -j mp -hi x -flori stry -convolu ted -cle a -chil ies -ar vin -tin dustry -th une -syri ac -survi ve -spark lers -shaho ffice -sem ites -sag er -ry le -re kt -ra ita -quad ric -psilo cy -path ophy -oak well -ni antic -n acion -mis using -lpr tg -ler i -k music -jet ti -god wit -gn ition -fer vor -fel ter -fe mail -dream world -disc ou -destination wedding -de clutter -curly hair -ch hs -c gc -bournemou thecho -bil ge -ac ac -+ - -ðŁĺī @ -women shealth -wack y -van wa -twee tuk -te wari -te che -swal edale -summar ised -psych ics -par os -o euvres -mill ward -long march -ke k -ka sem -hower ton -g su -fon ds -de posed -crack head -bad en -arri er -ann en -ìŬìŀIJ ì¹ľêµ¬ -âľį ðŁı¼ -zax bys -z df -terremo to -tann in -se ph -rebec cas -prioriti zed -octa vio -i funny -haqq ani -eu m -ef o -dan one -d lo -cordon ed -che p -bel itt -anat oly -al h -ste iger -s friday -present able -mar ama -man on -ji th -jaf frey -ha sa -glu tamine -fre shies -foo ts -el den -dese ret -d drive -clear the -campaignfor leo -bangsam oro -angla ise -amand at -åĨĻ çľŁ -wi spy -v fr -urban ist -touch line -toffe es -the ben -stri l -qubool hai -preci o -ox en -ov sk -nov ello -no yes -mar gre -lou ghe -jess ical -gid dens -gen ome -challeng er -caroti d -bly the -bl am -bi v -bam ma -bally castle -ac am -âĢ ij -zab aleta -wip wednesday -twitter india -tunnel ing -trans world -t ween -stilt skin -stab enow -sarabare illes -san desh -quizz ed -penob scot -pal ouse -pa an -of fi -mer rier -m we -k way -ia wn -em un -egg shell -cou turi -coo ker -class less -chi os -cag atayulu -bay reu -ap ie -an son -am stel -agronom ist -è ± -y gent -weare rs -vla anderen -very one -sp s -pl ers -nivers ary -neiman marcus -ma ut -la gers -kalgoor lie -gl t -ge ena -dictat orial -cwm bran -be ee -ठ« -w bal -vit ally -ulver ston -te tanus -tab oos -sthe band -sta an -sque als -seab reeze -savag ely -r mu -p be -n ke -jo ven -j mo -hypo theses -hen n -health ily -guil lo -feliz jueves -dn cle -de de -crossh airs -clow es -british airways -ami ka -alcar az -" : -ye aaah -wol ff -un reached -twiz tid -turn tab -sal im -read ership -quin ones -quanti fication -over lays -national cheese -low brow -lang ton -la fayette -horror art -gr ls -gib ney -bow tie -ble phar -bit co -band leader -anarch o -acker mann -๠Ĩ -wall ington -tab c -t md -sm ilers -ri pened -ra ging -li ri -lg v -kn oll -jak u -im be -elo him -dono stia -d hr -cyber aware -chit wood -ðŁijįðŁijį ðŁijįðŁijį -à© ĩ -trill anes -thought works -te ared -san gel -out shine -nr b -ni bbling -mueller report -mehboo ba -m jol -kali spell -inv ade -inf ante -iggy pop -high lighters -dd dddd -contra ils -coer ced -chil dri -caterpillar inc -cad dies -beef ed -bar ajas -aco in -a joy -ðŁĮ ° -wq ad -wn a -twis cone -suz an -sm kt -sche id -scham pionship -sav aus -sa hy -p sin -nj transit -nanop article -mine strone -marshmell omusic -lanc a -kings go -gas kell -friday feei -fel tham -draw something -cri s -casablanc as -ver ges -schwar ber -rr m -rise vans -revel ry -requis ites -prestat yn -ping pong -no fx -nine veh -napp ies -le up -in decision -i gre -ho ka -hass ell -hard case -gau dreau -flex ed -fat to -eber le -dissi mil -defin itively -cra ven -canu ck -best life -be better -am bridge -ach risevans -¸ .âĢ¢ -y aj -vi as -t sh -su ji -sar my -rose hip -radi ok -on gan -ner oli -mi ja -long sleeve -lis beth -er ocks -ef lower -doc ent -ching ford -cb k -byz antium -am r -! ** -ðŁĶ ĥ -ãĥ Ń -à µ -y ma -whit estone -ur k -theri dge -sandown park -p bp -nw p -no well -mr david -mill s -ma gia -little john -ku ra -ko ski -hur ston -g night -cor ina -com el -be fit -aro y -ab ney -. âĿŀ -wiki data -war minster -tro yes -todor oki -stat ins -re touched -pen ting -os metics -nin h -nick jr -min it -memory lane -man cy -l ce -kip choge -kal k -il hoon -ig ami -han rahan -fridayfeei ing -fly away -coldwell banker -co ady -cha el -bo gge -ar xiv -amar ok -af ir -acadi an -ู à¹Ī -urban outfitters -un spoiled -tab riz -sun deep -stom pin -ru ido -rep ton -re activity -rav ana -pre debut -na ito -mr in -mill wall -lind strom -ki bera -jo ve -intelli gible -inst as -indiana jones -hedge hog -fre itag -el ana -dau sa -cham ois -bil lowing -anti freeze -alice springs -ðŁį Ħ -yu su -wa xy -wa aaaa -vir tus -tin gh -soor aj -sh kh -sal aried -pray toendabortion -nor di -motor cyclists -malevol ent -ig lio -homo e -here we -ger aldo -fron d -floo daware -ep src -e prix -e bel -du pri -cu nei -americ ann -ðŁĻĮðŁı» ðŁĻĮðŁı»ðŁĻĮðŁı» -v sc -the si -ten bach -tel kom -span x -sp eller -ni am -nathan thewanted -man nar -m cla -l alla -ko at -kar pov -kar la -journey to -hu esca -ho ffer -guang xi -gone but -ek ur -egg leston -ca ire -bo hen -barr haven -avoc a -army strong -ano di -??? !!! -ðŁĮ¹ # -åİ Ł -âļ ľ -zi am -wa th -tun n -te p -scumb ags -sco ffed -rol land -right move -raim ondi -que e -pushawards jadines -notori ety -ninjatur tles -ke dar -g sg -fro wned -de bo -d da -court land -chi seled -and ad -af ri -$$ $$ -" & -Ø ° -zo i -w ska -tur lington -the young -ser ai -sec tarianism -re aper -on ico -om yel -nam ur -ink master -har vin -gle b -fatt ening -ehl ers -dwar fed -com it -cly burn -bas sa -ant one -altern ates -ðŁij ĵ -ðŁIJ ı -yn ch -tv week -tu ta -tomat illo -som mar -scho en -pv t -prop ellers -prior at -na stics -ma aran -lu lac -kin sler -ke mono -ke keke -grub hub -gridi ron -gir lin -fe hr -covent garden -boom boom -bianc adelrio -bas sin -abcf pll -ðŁĶ ¦ -yoland aph -wel ton -thel ord -ten zin -sav i -ren ée -r ne -phys ician -nu ig -nd win -michelle visage -merck x -measura bly -manfro tto -magne to -jae bum -inst at -in azuma -hurrican emichael -hali burton -g bt -disco vere -di po -cas c -blue bird -blu efish -at ali -art scouncil -andrze j -anaphy laxis -american made -albac ore -ð٤ij ð٤ij -zav ala -vacuu ms -shopee my -sch nee -rez oning -play makers -pin ups -part out -narcole psy -nai ro -miil kkk -man owar -kis met -hau ght -fish el -f anime -er ici -ed sel -dutt sanjay -dun ce -de music -cer novich -bor at -b days -ang li -w tp -souvla ki -rec ti -nah in -lovewhereyou live -li gon -jo hal -im movable -hil son -hesper ia -gn at -f tt -ess el -en amored -elton official -ed a -dee speak -d wa -d don -cumu lonim -be avis -an ji -af lgf -ðŁĴ« ⾨ -ðŁijĮðŁijĮ ðŁijĮðŁijĮ -ðŁ¦ ī -оР» -wm police -wan ita -v sd -uro pe -up ton -sure ty -stef on -ru sten -recir cul -press uring -p ela -mc alister -lin na -l nr -kri swu -kim jon -ish ment -industrial design -hr g -hi mesh -fer ri -del aunay -carbure tor -blu en -a home -ðŁĺī ðŁĺį -wish art -up o -tu it -tri ennial -sema show -ram iro -pur posed -private eyenews -plough ed -onthe beach -minne haha -man ne -inj al -gwend oline -geor gel -fle mington -ed b -di ouf -creation ism -cran ford -bin du -ìĹ Ĩ -è ³ -yn z -uk g -trans iting -thr itis -smu dged -si en -shin in -sher rod -rus set -roman ceno -repri sing -plan er -photo bombs -oc f -mo dic -kejri wal -k umi -hemi spheres -goo devening -financial planning -dy fi -distr ito -cor ian -cel i -bur nished -aw el -art ph -ag ging -ud l -thedaily beast -tax ic -ta kuya -stair cases -stag ger -show me -pre ble -pitu itary -pad gett -no bun -maj o -lumber ton -lime house -leagu ers -l sat -jam an -it isation -hedger ows -go pichand -g eld -doub lec -de bby -daily qotdapp -cu neta -chri schristie -chain mail -cake p -bir ks -amy klobuchar -ðŁĶ ŀ -â̹ " -za ar -town hall -topo logical -timmc graw -sel on -sbu x -quick sand -pin nock -o strava -mp ath -le lo -kar ang -kag i -judge ments -ju tsu -inf antic -go kingsgo -folk art -fli pit -ever grande -dav el -cut ts -custom isable -con c -commit tee -blueno se -belfast giants -barn acles -bar nhart -b tech -ar mani -an adol -agh an -ag ie -ê² Į -é ¢ -yorkshi rec -vote uk -tur no -ther mic -stu di -sre eni -soci ete -sil ken -si rs -sami yusuf -qu acks -pren tiss -national nightout -mp k -mono logues -mo hawks -ma vi -ish tar -ing our -han kins -g force -embarrass ingly -ek ay -dil i -de boer -chester tweets -ca pper -ash mole -app or -al yankovic -after taste -(* ´ -ãĥķãĤ § -wave form -wa hid -un recognizable -sos fam -scien cer -re la -po thead -nu buck -ni st -nai ja -mot ör -mo sses -mc quarrie -mak ro -m provement -luton town -ih ra -hay y -first post -et ting -dance day -cough lan -car ti -ber cy -barca stuff -bal ms -axel rod -ar trave -amit shahoffice -âľ ĸï¸ı -Ø§Ø ² -ty c -speci es -senator collins -re wire -pepper corns -mo sman -mer ly -lo ssi -kany akumari -health ful -he pp -g wc -debr ame -coor slight -centrifu ge -budd has -bed sheets -bate son -b ingen -anurag kashyap -ãĥ³ãĥ ī -âļ Ļï¸ı -yo gesh -y alls -wh q -wait ress -tortu gas -stir rups -still born -rcb tweets -pft commenter -pc u -ow y -neer aj -mar yanne -mar ga -let us -le chon -kin t -joh ny -ja hn -ing apore -hou lt -ho dak -high ball -hh h -e fi -dosto evsky -de th -custom isation -csk v -clu bbers -anto ine -aci ously - ¢ -~ âĻ¥ -yo gap -w era -vishal dadlani -st ena -quan to -poyn ton -open university -music city -maz atlan -mag pul -lavor o -lam as -kar ak -ho wick -her me -fore told -daw ah -chak o -bron zed -bron cs -bro king -beard foundation -ba sho -an museum -a hino -Ñ Į -wood worker -wood s -woo dro -winkle voss -ve toes -tb buccaneers -t lc -spen ser -s mike -prof briancox -pomegran ates -o chi -night ers -mete ora -liber tines -kamchat ka -hel ter -grass fed -god liness -germin ate -gab o -du pes -dead heads -croatia fullof -coach es -cas sand -bram bles -biz ness -bath ory -aw ks -at ma -ðŁķ ¹ -visit canberra -unear thing -rott nest -ross iter -r tt -pau lg -moul trie -loan ing -great ormond -gil ding -ger tru -gal era -discred ited -d fe -cand ler -ani ah -ah sa -ab orig -yamig autam -y ie -the original -sun times -sh n -sal ahu -robin hood -re introduction -kap o -jan el -it each -intri gues -fas s -enter shikari -en dow -doyour job -can ova -au tres -anglo phone -ab n -ðŁ¤ Ľ -~~ > -v ally -stromb oli -star fox -smir king -s su -ring tones -ragha van -po sta -news x -mc cam -matty bra -jag ex -itali c -i see -goldeng ate -girl probs -gipp snews -fin borough -dun c -de formity -clam ations -chand an -bu ra -bree ches -ash ford -anti pasto -ಠ¡ -za hir -we rent -ty len -th inspo -ta kas -t sen -suwan nee -sor vino -sold by -sch amber -per ty -pas orob -only fans -mic hell -mc quaid -ja und -garri do -franchi sees -foo ds -entit lements -elector al -cy rano -convo ys -christma ses -bapti sms -ðŁĶ ½ -ðŁĮŀðŁĮŀ ðŁĮŀ -ÑĤ а -zipp ered -tu li -speaker boehner -slam mers -shake el -ser bs -potter head -poe tr -pen test -p noy -ophthal mic -ng u -lock herup -lance bass -l tz -in numer -granger smith -facul ty -du four -der ham -decou page -cull is -cri ps -cen tos -blackcat appreciationday -bal lester -and juliet -weare in -v ax -v ata -und son -tem er -ta ichung -sun bathe -sni ffles -re painting -nore aster -nel spruit -master s -ineffe c -har as -gn ar -ff g -end ing -em ple -ei shq -din as -deaf ness -cor in -ch g -bly ton -ann coulter -ac utely -ðŁij ¿ -walk to -wal o -shire en -restra ints -poo ches -pdd ancing -palati al -north westhour -motiv ators -may ra -j ury -in me -field park -exuber ance -cre ased -cond é -c gr -bor ing -antic li -am av -ðŁĺĤ ðŁĺİ -ãĥķãĤ £ -à± ĩ -wol sey -tu gg -so ws -pick wick -panther nation -nell ore -mul sanne -lime ade -lee ann -hul lar -here foryou -he as -gi v -fun with -fi real -fascin ate -dream weaver -daniel howell -cushi oning -cou leur -birdwatching mag -bar at -b ation -ail y -acknowledg ment -âŀ ¼ -س ÙĬ -z ine -ws bt -ur thy -u ce -trouble shoot -tin os -super natural -states boro -she ree -seaf oods -ori flame -neu man -nau d -n la -n ky -model er -mi av -le ck -intu it -hyper market -his sing -harbour front -gon ski -gam ay -dok ken -de construction -cute cats -cran field -confeder ations -co ex -cd h -car lito -c moffice -bar ga -af fa -yy am -whi shaw -trigon ometry -tal ento -rothe say -pet m -pa via -lug nuts -lu kash -lash ings -kali ko -fe men -e disto -bike shop -ape l -anc ou -zin hle -veu ve -tu ohy -to td -sue ño -star ck -smo del -rigat oni -prostate uk -ple bs -nike basketball -narasi mha -mu sty -mehboo bam -mano euvres -lief eld -invictus games -infe cting -i ber -hor sley -ho om -gau tier -fat tuesday -f pm -ezral evant -ex x -ec ity -derby day -cali gula -boc elli -besse mer -bed bugs -beat cancer -at m -arom agna -an ica -ðŁĺį âĺºï¸ı -âı ²ï¸ı -ा à¤Ĥ -w bur -ul ere -sk ap -ration ality -preci ou -pay ee -ny it -mor tified -man us -lon gue -lets gov -kerr ville -hitch hiking -good stuff -fy ingly -flood light -feu ds -ero ad -end as -donny brook -declar ations -blant yre -balloon fiesta -aki ha -ver ia -su so -sportsm ed -snoo ker -science day -reboun der -panerab read -lon ged -klez mer -inec nigeria -hol ker -grand addy -for no -fast ening -e migration -dri de -dis location -davidar chie -dar uss -che viot -bogge ss -barn stormers -bar tel -art life -angel fish -womenin music -wi union -travel alberta -ti zen -st pete -sp amal -sexy saturday -screen awards -sch rute -ru mple -om ele -nase eru -nar rati -n una -n mu -mo slem -mc minn -madeinthe usa -lu jan -kro enke -he pa -haru hi -gri pe -ear then -diverse books -dan go -ber rien -b mb -atar decer -ðŁĺļ ðŁĺļðŁĺļ -ñ ez -yo b -trump er -soci alist -sig an -scher zinger -sch au -refurbi shing -ra gga -qu ero -ncle x -massimili ano -mand alas -jaund ice -is right -ir acle -hrd ministry -grand er -gra ble -f bn -desp atch -bul bul -brasile iro -bor age -bend is -bal zac -baad shaho -aku lam -a ahh -ठ¿ -zack ryder -wr dsb -wai mea -up to -tech review -tar k -sp ick -scaf ell -sa chets -rod denberry -r ø -pl cs -pac ey -mono type -lot to -lich ens -le pto -le of -just the -juli ag -j rs -int c -in deci -ic dc -he ze -di anna -dhru va -dab ble -cumulonim bus -clairvoy ant -cat on -bu mi -bl on -ar ai -a ich -. âĻ¡ -ðŁĺģ ðŁijĮ -ðŁij µ -yar nold -umh langa -tra itor -the beer -sun aga -scar am -regar de -not to -mil ani -m me -le man -ko by -int u -hu li -energie wende -dn v -cor tona -car ted -calaver as -c scs -bro il -break dance -birthday party -wardro bes -w lu -v au -tw t -tigh test -thcentury fox -startup week -sports india -se hir -sch mu -orient ations -nv leg -midland shour -ly mm -k ps -ish am -gish wh -geode sic -est ado -emer yville -du lehill -dg ates -den ne -cou cou -bun sen -bo id -bal k -ado gs -주 ëħ -èĬ ± -zombi ea -ze ch -wre aking -synthe sized -swir led -sto o -ske in -ren ounce -photo grid -no pain -nic obar -network rail -metron ome -m di -j ski -hd v -hal gh -h war -gar l -e gp -dic o -di ggle -con ker -cat at -c myk -book makers -bo ding -ang panahon -________ _ ->> > -(( (( -we ill -val era -truck ing -tro polis -tam mi -so fu -scho ir -sch aller -readi ed -pou ty -o clock -nemt sov -mo rec -mal te -judge jeanine -gro th -f fie -brooklyn museum -ðŁİ ŀ -wake forest -tro pa -thi stime -sle ek -rival ry -q bal -pinstripe pride -op ti -me stre -kings bridge -eso ter -danand shay -cuten ess -be amed -ani ya -af owl -zhou mi -voc acy -vel and -vander bil -stan wyck -snowmob iling -sheu gs -se us -sc itech -sand hills -rit o -re serving -quintan illa -pollin ator -ph s -per p -mu ti -mehboobam ufti -matthi js -maj ic -ly tle -ki is -k oun -ili ana -go ggins -gi verny -gi anni -geo grapher -fu gazi -fir stalert -em ic -don at -cro c -cn x -city and -ch acos -canadian forces -bon nard -bleed ing -asym metry -amy peruana -> < -ðŁĴĭ âĿ¤ï¸ı -walt disney -udu pi -u sher -tread well -rit mo -rev ved -rash mi -pre ssies -pompad our -patric ia -lg d -ko sta -ko balt -kidi ki -in cis -himan shu -fi baw -fan service -dist ancing -chav an -cassave tes -aqu ab -ant ana -adventure sof -ad tr -ab ut -[ - -ðŁĴª ðŁı¿ -ðŁİĤ ðŁİĪ -weather tech -vm ware -viz media -vic votes -ut v -the mentalist -ten fold -stun na -skill fully -pl ent -other side -men sday -medical devices -li sad -kush al -kas umi -k era -juri spru -inno cuous -in conclusive -iamk sgofficial -hit z -gri ft -go pies -gam os -def ame -dd lj -copernicuse u -car low -befully informed -arach nid -ap n -amp at -air crew -âĹ ¾ -zan elowe -wh ooo -wet ter -wat c -vs den -vas u -u du -syllab les -surf side -sur ly -sg u -revital ise -palpit ations -padma avat -maup in -mano euv -len s -le beau -kne ad -insuff erable -hun s -home coming -guitar center -eu geni -equ it -e discovery -bro ma -bot net -ber ita -beinte haa -and r -ale conomics -ðĿĹ ² -âĿ¤ï¸ı ðŁİ¶ -á´ Ĺ -te tsu -t anda -symboli ses -spontane ity -sou per -shan ley -san skar -sab it -r ils -r dd -pul len -ple xing -pla guing -ntv tonight -north park -max field -madhu bala -inst illed -hea dies -hal perin -earthen ware -discou raging -crustace ans -black mailing -auror a -ar der -agro forestry -ðŁļ ķ -âŃ ķï¸ı -yorkshi repost -val lee -th ut -tar di -sp hero -skin cancer -se ms -sc ant -sach sen -s combe -ru hr -or vis -night line -nes bit -m sl -love food -kni evel -itt ance -im patience -i vr -fis alpine -ferrig no -dedic ations -collar ds -chipp endale -c ren -bbc scot -al ten -ak shar -y sa -wal ford -v so -ucl draw -time bomb -tam pa -t oun -sear cher -ran za -pedu to -p ch -nov ato -mb storm -love sick -lov sky -long worth -line han -l va -he ures -freddi emercury -er im -em conf -eli g -decent ly -brain power -astar isborn -zhu hai -z uni -wi the -un in -tortu ga -stream ys -specul ations -sol vang -smil ing -seed orf -sajid javid -nab a -mil ford -mb assy -jim carrey -jay ant -hippo potamus -har kins -gray scale -daily caller -dai go -carpedi em -calgary expo -by rn -brek ko -bre thart -br rrrr -bon is -an ther -actu alliving -a ameen -whar fe -vigil antes -u ee -top sail -the res -soul food -so cs -se op -r bd -preju dices -postpon ing -neander thals -joh ne -i pods -hal es -ed mnangagwa -cham beau -calibr ate -cal vo -bul ma -bobby bones -bo sse -bl urs -bei ber -arn auto -ðŁĺĺ ðŁĺĤ -tylerg posey -t als -sur ulere -stur gess -sat nam -robb in -ra ster -obste tric -nc dot -ms dyn -mobile marketing -mel rose -maj in -li kud -kas bah -infl ating -ether ington -dic i -at axia -ðŁıĥ âĢįâĻĤï¸ı -ðŁĩŃðŁĩ ° -âĺĢï¸ı ðŁĮĬ -wunderbar films -ta vern -sr ila -square space -sign post -riff trax -pe qu -nave ed -na stiest -local history -life skills -j br -it now -ipp o -in bev -gon salves -gargan tuan -g dm -drop kick -dr harshvardhan -d yo -conver gent -ci hr -blueno te -black girlsrock -befri ending -b nl -anadol u -alca sid -abhi she -a asa -visit novascotia -un st -tri un -tod morden -super center -stay ing -rocke ttes -ric flair -pe ac -p janic -p dac -non league -mediterran ean -lounge wear -hal al -geo chemistry -fi ra -feel good -fag ans -eff southafrica -e urs -du an -circuit ry -childrens book -caro tene -broc colini -black day -bar ret -ball antine -annu als -yyyy yyyy -tm x -testic le -nu man -men newsdesk -letsgov cu -kids fashion -kak adu -h ink -ger tie -fir me -fe v -don gho -diete tics -depri ving -coolmore stud -clu e -che etham -cat trall -c ja -bio chem -bache let -b hil -teentit ans -sw tor -strugg leisreal -stone brewingco -sto xx -rock st -nil sen -muk hi -mo thra -metro pcs -mael strom -ma zar -lo oney -land i -kay y -in aba -ikoro du -g ade -e migrated -e iger -count ach -che sil -bus i -breast feed -better with -beatthe heat -be stro -íĥ Ģ -wright sville -wom end -us ar -tees dale -t fi -scra pes -s weather -run de -repe at -pend le -pav lov -ni ang -line wed -kaz uo -grand final -gi mli -cal ton -bro kered -bo stick -bo sley -arrhyth mia -wak and -vaill ant -ul alaunch -tw op -th ac -str ated -str ack -stone chat -stad t -sh ingo -scooby doo -oci c -mp u -mira da -l np -ic ey -hh t -handle bars -gup till -e he -duplic ates -consol ing -arti slife -al x -acar son -ðŁĨļ : -âĺºï¸ı ðŁĺĺ -à ¯ -work shop -thegreen party -th xs -swoo ping -skar du -siz we -sas si -rebe kah -po es -pap p -panor amas -mou sa -mel an -matt son -lee ward -keu ken -kar un -joeye ssex -hobby craft -hal cruises -go ps -giu lietta -dog town -dat ang -bu pa -bow ties -advers arial -ðŁĺł ðŁĺł -ðŁį© ðŁį© -ðĿ ĸ -ุ à¹Ī -zakkw ylde -yo wl -un r -un jab -the am -ta shan -raven ous -rain n -pe ppery -micro grid -long line -kak ao -intellectual property -ice ster -houston isd -hon oka -gravit as -forthe planet -flu or -fin kel -en r -en cant -disc ourses -dem ers -comis key -but thead -bring ing -afl ame -war dle -tre bek -stre aky -some body -sci fit -roch dale -ro fl -restaurant week -prophe sy -over street -mill field -matti as -len to -kla asen -ke ough -jo ji -ii ac -ga there -fe ws -excep tionalism -dragon born -daw a -d ants -ch elli -canton ment -black sails -bhu tto -ban shees -au teur -ðŁĴ¯ . -ðŁ¤Ļ ðŁı¾ -zakkwylde bls -y rago -wom bats -wing ard -tb oll -plo ve -philly police -pat snation -pam ban -meren gue -ma hira -long leat -light sabers -la ine -ju pil -i believe -hour ly -fli ppers -e ffy -devere ux -deire zzor -bu shing -br ined -bor u -bi dity -bi a -adju ster -unexplain able -the block -software testing -smu ts -rim mel -pro audio -per verts -nsc lc -nab isco -manchu rian -j cr -ic ant -house democrats -ear worm -disc olor -cv m -coal ition -chanak ya -boe hm -bla stoma -aldu m -af on -? '" -... ?" -* "@ -æĹ¥ æľ¬ -whatsfor dinner -weetab ix -un masking -turn up -trade war -the sly -tako yaki -ta pps -t vo -soulj aboy -sf ed -sco tu -rick ville -pend ragon -peep er -o it -norm alized -no ël -lake michigan -hy der -haci endo -gru bs -gazian tep -fork sup -every man -disp leased -darley stallions -crime watch -ck enzie -chron i -baji rao -auror as -@ $ -wy ck -ver hof -sti le -sna red -pin arello -nick o -n we -mod ell -min ess -lyric ally -li ason -lar ra -la ges -kimber ley -kas sam -jennette mccurdy -gret sch -gl ances -feu ille -endo za -dam ir -cre er -black panther -bas er -av t -wy the -visual ising -tr oughton -see ee -raw lins -pu dong -pu ddle -pl k -per ignon -ow ill -misss aig -mc duffie -kay akers -ire l -ing ol -gol son -gay er -deep dale -crowd funded -az o -awal ker -asi f -" ?! -âĺ® ï¸ı -zion sville -tvd family -sha sha -sh ko -s act -out smart -nu z -ni ac -ner c -ma iz -la pin -kou fax -ji ani -in ing -ii b -freenaz anin -des well -cra ke -ay din -al monte -âģ¦ # -wrest les -un blocked -tre al -ten sei -ski pp -sf aye -serv in -rw f -rodeo houston -r vi -nastur tium -mike and -hon es -he gel -haz arde -get to -future stars -emo ticons -di pi -de gli -cul peper -cat oc -bu gab -bo cuse -âϦï¸ı âϦï¸ı -y se -worldwetland sday -volu metric -vey ors -un comfortably -stumble upon -sto vall -star dew -si ro -shout factory -sc ca -ro wett -metalgear solid -mal me -lam pas -khati b -imperson ate -home team -happ i -hal fords -gri maldi -fri ez -en vo -dani e -cow per -conce aling -channel newsasia -cen k -brussel s -at ak -angelina jolie -vend i -un obstructed -thermo plastic -t ds -shkh rasheed -reti ro -ps supt -phyl lum -ma us -ma doff -lyn ton -ly so -kth opkins -just giving -jou les -eze quiel -euse bio -ct ms -conce ssion -by er -book sand -a od -tu ft -thespi ans -st thomas -sower by -ran tham -news network -micro cosm -maya angelou -m ka -ko gan -inclu sions -htown takeover -hil ty -har ge -happ ys -h fm -gra zer -gd ns -digital clou -digitalclou dgal -dero ga -car vers -back hoe -art studio -ðĿĹ ¼ -x er -usu al -the kid -tal us -stu tter -sh uri -mcdo wall -match room -marcel ine -man nan -kel sie -k ler -it ol -gi onal -faysal quraishi -farqu har -cooper ated -abraham lincoln -ðŁĩ¦ ðŁĩ· -wswan derersfc -vrin davan -vivi r -vau ghan -sop ra -scal ping -quad ro -pit lane -per ip -omni potent -n tn -mobile games -lc v -kej ri -intercep ts -fil aments -ed f -bo eck -arab ic -aff le -ãĥ ª -Ú Ī -wrink led -worship ers -vibe z -vari et -to sin -sp ica -shel vey -schi aparelli -riot games -pfluger ville -perme able -online store -me igs -ly ss -jen carlo -ig r -hr r -hom elo -hi jo -hen ch -drashtid hami -courte eners -cor vus -cine mathe -ar aman -ad ur -vijay rupan -tran scen -the jazz -spill ane -son tag -smite game -smash words -sav eluci -reu ben -pay e -ol entang -nc sa -manj re -knock off -inv ite -ge sund -flash lights -fau quier -engar dens -en r -el pha -eh san -combat ant -co it -clydes dales -cir ce -chu cked -cent com -bi pasha -barbar ism -baha wal -ay ear -ar slan -an bu -ãģ® æĹ¥ -à® ľ -Ùģ ÙĬ -аР² -vigne ttes -tur namc -sab ra -ram part -ra iz -pollin ating -peuge ot -perfom ance -pe dag -out performs -new season -murch ison -ministryof sound -market places -kul tur -k lat -ham blin -fu bar -ci mm -caro ten -canon australia -bo euf -bibi mbap -bapti smal -your story -we my -vijayrupan ibjp -tad pole -sc ud -sau ter -ph ol -park race -mono gamy -mom en -mat alan -kwi buka -hol bein -hoff man -hart son -go vote -gira ud -gar cinia -fu i -critiqu ing -cotton tail -clip trends -cabe za -bethe difference -ar ancini -ðŁļ Ľ -z war -white washing -weight less -vide otrends -valtter i -ser vi -nomen cl -morris ville -milk day -male h -legal ise -le ke -kar as -incrimin ating -hydro carbons -ha ftar -gra uman -g of -diminu tive -congreg ations -cit ric -chan sung -brum mie -broke back -à ´ -vo ile -under wire -tru deau -tro i -steve angello -ste aua -sr bija -reliance jio -perthglory fc -ml scup -mez ze -lo stand -in ck -he j -haw thorns -flo ating -en cum -empathi ze -dra ping -deli o -dar wish -curricul a -cold play -co dec -bf bs -bant en -as sun -art design -anup ama -al films -] ! -ðŁİµ ðŁİµ -tz in -thisi sla -sti fle -serge ants -rose parade -restin peace -reasons why -r mac -p wn -or wx -nar rower -mystic messenger -manip al -luv urself -la gann -he mming -he brew -er furt -draw backs -coim bra -breakout artist -al ar -ag ay -actor life -.... ' -yasi el -v ff -u fs -thr ong -spider web -russian art -re fraction -paddy sday -oy ang -ne do -nai ve -lo of -lat o -kar m -interro gate -gur up -cc pa -amar avati -ðŁĴģ ðŁı» -éĥ ¨ -z r -y alo -whet stone -thri ved -tc n -pre workout -onthe hill -novi embre -navig ational -mp tourism -mol ton -l tl -ko ster -ka el -jyo thika -in un -fur stenberg -food share -fi les -famili arize -exempli fy -detoxi fying -che se -char lies -cag le -bir r -biot in -ar ounds -af am -ðŁ¤¼ âĢįâĻĤï¸ı -wh iz -wee dy -volu minous -us dcad -ud get -there is -th andi -super draft -ss os -solom id -snow plow -ru ge -rock solid -re section -raj dhani -rain ham -psy locke -pro line -passion for -pa ster -nipp ert -medi ap -ma sts -lock port -ko il -hor vath -hair brush -gi lets -g ants -far fetch -f xc -dissi pate -debrame ssing -co sco -by product -braz ile -apho bia -ah gases -/ /@ -ðŁij¯ âĢįâĻĢï¸ı -the bell -sun spots -scrim mages -ra úl -poly math -kum ite -khal ili -jon ty -j ku -hyper allergic -hugh ton -histam ine -gul la -e ib -d la -civil society -chicago ans -bu di -be ile -aviva prem -are ers -ann s -zo or -yan tra -vand ross -val k -the truth -sy oung -spu blic -se thu -rel la -refec tory -pi z -pen elope -ku shi -kangar oo -jan vier -h lc -fan sites -decep ticon -clif ford -chec kat -bl ouses -ah db -ado g -xi sts -var ia -thibau lt -the power -sh oring -scu omo -resul ts -pot belly -ne ary -low ther -indi eartist -h als -goo s -gl f -fel e -disingenu ous -dese mber -del acroix -co ya -bou le -b sm -appet ites -ye ux -walt zing -vac om -ump qua -truck er -siti o -sham u -pvam u -phar m -on ne -jap a -it ek -it ad -in bend -hugh ley -hu mi -gen too -free style -fa in -f q -di zon -agu stawestland -ach ter -ðŁĶ ģ -ðŁijĬ ðŁijĬ -ðŁ¤¦ ðŁı¾âĢįâĻĤï¸ı -âĽ Ķ -âĸ · -y team -wis d -v mt -um w -tw h -tt an -ren wick -re mix -po polo -pad am -la er -kno b -jag ran -hol bycity -f dom -eng arden -bocar aton -alex x -a ÄŁ -è ij -uni ofe -u wcl -swin son -sco p -pe gida -patter dale -p fm -o if -mc ity -materi ality -m gi -la di -kick boxer -jor n -fat man -eo ghan -einste in -dc n -ch ala -bullet ins -bla sey -bird life -am ol -akade mi -ah all -acor tes -ðŁĴİðŁĴİ ðŁĴİ -ìĹIJìĿ´ íķijíģ¬ -ëī´ìĿ´ ìĬ¤íĬ¸ -س ÙĪ -wi ak -wen dover -van ovic -val an -twin kie -team youtube -so ppy -scru mmy -sa ath -rick les -ra dy -pun kin -pro j -pim m -pete wentz -pal abras -news worthy -nascar onfox -nan of -mit osis -lawn dale -la die -la bi -jay anthi -jason isbell -iti me -hol lands -h sd -gam ora -ferr and -f anned -em meline -dol by -dal oo -burling ame -ben cher -ballo u -an ational -victori apolice -v ds -tah le -sc olds -ru be -ragaz zi -paro chial -no stril -newor lean -live for -jor ts -ip b -im plore -frigh ten -em aci -e ering -don nab -dat u -ch avis -benefit beauty -ba ited -aun t -ê· ľ -wor rall -wijn aldum -wag ering -vel oc -ucd dublin -tooth picks -su raj -st ec -sriman thu -spirit day -sleeping beauty -sethro llins -rec ites -philipp s -per ú -mcle ish -mau rier -ma he -loan er -kne b -ic bc -how den -hail stones -doc fest -ck es -china open -cd baby -bper rion -azale as -alo ka -waffle house -util isation -ti b -si ge -qu aking -pre zzo -pol ling -nu its -mobile game -mb om -life size -l fb -ki ee -ke hinde -in semin -how l -hin sdale -hes key -fon dest -fe style -evil regals -den bigh -cri bbs -bhu van -be on -aga dir -after all -ye dd -un fettered -theli ving -tad alal -suche tadalal -musician ship -l ali -ky l -kath ua -kan tai -k ds -it sn -ini b -hyun joong -her ps -head wind -head lamps -he pc -gay est -fit out -es in -eric garcetti -ef it -down syndrome -con sig -bperrion ni -be see -b sd -asi k -al ki -ðŁĽ © -ঠ¦ -Ø§Ø ¯ -to ki -te ja -sy arief -sq u -rho ades -result sday -prerog ative -pik min -no z -mile post -mc nab -mass illon -is sing -ima de -gr ito -globe master -f dj -do dges -corin ne -anthropo logical -+ " -zam ir -ty nan -thenorth face -tam ang -super imposed -son d -som i -ret ards -pre ying -person able -paradig ms -micro s -mer we -kit son -kel by -hul t -hand print -fun icular -fu me -form in -fifty shadesofgrey -fari da -escap eroom -eil at -dep an -daw ar -by blos -billi kens -bed minster -bad hopper -awo lowo -anand ani -çĶ Ł -âĹ ĭ -ÅĤ aw -tib co -ta seer -stal ag -spro mo -snow shoes -sick er -sal om -s sey -roof top -pari ah -ow asp -no gain -night wear -nak amoto -mc ourt -ing lot -ha es -go tops -go dukes -g staad -fe it -ear marked -chinese food -cats rule -black lightning -bir dof -bet tere -bbc south -as sss -art for -amo ja -aler t -wh igs -ur kel -spray berry -sol vents -so v -roth man -rec ool -proc ter -pew research -p ci -nic hes -nflu k -ly all -jail avak -hybrid cloud -hahahah haha -green peace -g za -freedomof speech -eat your -e ep -den ne -commu n -cheri shing -cc gs -cbc mtl -bar as -wash ten -topo graphical -toler ating -sc ool -no ssa -nab il -n ool -muzz le -mis sed -mg lit -loop ed -jo taro -jam tarts -i up -h ys -fre re -f dm -e mile -e bp -defense men -cro fton -chis ora -cha ren -brun ton -bra vado -artex hibition -am ro -am ac -adn ams -ðŁ§ ¢ -wy vern -spam mers -shu g -schoo logy -rec to -pink berry -pak vaus -p di -or kut -nat ch -mr r -m vt -l nc -john fugelsang -hur u -hum bucker -horn sey -high more -h cd -gods end -dun nes -comm enters -ale b -administr ations -a itch -? !!!! -ðŁĺ¢ ðŁĺŃ -yu ji -worldanimal day -war by -tribun als -tow ne -snow pocalypse -s wine -run away -rob ed -rad ley -ph ang -ol lers -official wolves -n li -m andre -ke it -ke er -kasi h -kal pana -ici ously -had ley -depra ved -dd as -cough ed -co ates -cher bourg -capit ulation -al tai -ì° ½ -z ow -wool worth -wigw am -trum pre -propos itions -pork chop -over flows -ori ana -megal odon -meat packing -mcder mitt -le graph -irv ington -inde cency -ge yer -fre tless -difun dir -case in -ben oni -wat ford -un ravelling -uhcougar fb -thibo deau -sme aring -revisi onist -pi de -phylo genetic -lu an -loren zo -long meadow -livor no -kit sil -joe gibb -it syn -her ac -great war -free bsd -fermil ab -di still -cu sh -clear water -can ela -brun s -bish kek -big dat -ðŁĴ ¬ -ภĭ -war th -ver ticals -top cybernews -stat utes -sob ti -sni ffed -sky lab -shin ty -ro ane -mentor ing -mag andhi -liveon k -it k -g mo -endear ment -east africa -dom us -ci w -carlo tta -bos combe -bath gate -ë§Ī ë§Ī -æĿ ¾ -z ny -vit ara -v enda -twizz lers -tor d -spen cers -sel den -se bo -mcar dle -lasz lo -l ra -karthik subbaraj -h no -g fr -fri gates -franki ero -corn huskers -bing bing -al ite -ภ® -son us -ren derer -point illi -phil ic -novo sel -let down -l cp -har v -fuele dby -fra w -er ving -duke energy -dan ko -circumc ised -chandra yaan -carli sle -can onized -c vr -bor ine -bor ge -bl dgs -a opa -بص ÙĪØ±Ø© -week of -turbo prop -tol bert -tam ika -t lan -seuss ical -scu ll -sb h -pp es -pet ar -my la -m busa -le and -jo gia -ha gi -golden hour -finger tip -er rat -dog life -cy nic -chi ral -b ty -av irus -ani shi -ag day -ðŁĻĮ ðŁijı -ðŁIJ¶ ðŁĴķ -thru ster -th ya -t wat -solic it -so tl -silver tone -signor e -shu ckers -shi bir -sha in -sepul chre -por irua -paulin ho -listo wel -la ba -ing with -ho sh -har ari -first net -dischar ging -de tr -chi quita -bullet club -bachelor inparadise -audi om -ade eb -⼠ĵ -Ê ³ -xx ii -woodin ville -wheni was -tra shes -thu man -te soro -supp ers -special ities -sean ad -sch at -ra if -professional development -mi est -mat osis -life science -kal mar -juni ata -jump a -ir ctc -hoor ah -guess who -gra fted -f da -essi en -dt lv -carpath ian -ca hoots -bi ps -alex jones -al n -wu pper -w gr -use i -ston ight -st martin -rev ellers -photogram metry -parson age -na oto -muff led -micha ud -metag en -lee ann -le ford -kow ska -kookab ur -invari ably -grand central -gar nacha -future ofeurope -frank turner -eye let -ed modo -dro d -dre sse -den nys -chil aquiles -buc co -botan ica -be ppo -bar ron -b ti -ar sed -ak ova -: } -yo ak -x al -wv tm -te er -ta pit -mo vado -mexic ali -may pac -leav ened -joegibb sracing -is sar -i ag -go away -ge ve -fedex cup -emphasi se -dis continue -den ials -costu mer -by night -busc ema -bi ju -bay eux -bar codes -alco ve -al ast -ac enter -ðŁĺľ # -whodun nit -var ga -us w -tre s -ti ko -the fallen -som an -social ising -she mar -sevasto pol -se cc -s movies -rye grass -reser vist -re joined -re factoring -py roman -ox ted -nw u -magi ster -lu cena -lind ner -ide a -hill house -gam el -franken muth -fla sher -emul si -election swith -demo lishes -creati vel -av ita -!! , -xrp community -tru sive -sneak y -sal an -og awa -j aren -hin son -en grave -e itc -datab ase -ch he -brind ley -blue jay -baux ite -amig urumi -alfre ton -actu ators -abra r -abduc tions -ðŁijĢ ðŁĺĤ -âĿ¤ï¸ı ' -⾨ ðŁĴĸ -âī ¥ -wright son -u op -tober mory -supervalu irl -sport fishing -sl ates -sin h -schedu ler -sch nabel -re cumb -rab bani -pur nell -power tothe -persu ading -natural england -mou lt -me use -l ans -haz ell -go oner -gal leon -footh ill -fav ed -exhib ition -em path -elo die -dvent ure -den arius -dementi afri -defe cation -ci x -chor ro -bar dugo -are qu -arbit rage -a defenders -yah t -to sk -tele conference -taylormade golf -tan z -shaw ls -red fm -post secondary -kri ss -kaik oura -juventus fc -ity ours -i verse -hi jinks -gri f -col gan -blueri bbon -bips luvurself -altaf hussain -alam ance -ðŁį ½ -w ux -un ic -tr ically -tam bor -success ful -spo wer -si rena -sc roun -sab ras -re itz -physic ality -park sville -par aded -oo per -ne va -mu gi -lv motorspeedway -log ica -lec at -kram er -k hama -infantic ide -food lovers -civil engineering -c wd -c boe -brown sburg -aviation lovers -ani dol -alo ck -ðŁ¦ İ -âĪ Ĩ -veri fiable -tri k -ti ang -she go -self catering -reimbur se -prefer ring -por thar -mk to -ka am -fun dac -filip ino -dre lief -chart mill -caf frey -assinibo ine -afro punk -ab lo -wutang clan -ur ry -uni formity -t ferriss -sub pop -stom pers -sand r -sam bar -sad i -robbi es -rec oup -r itch -national volunteerweek -n td -midd lew -lau f -kun ta -ke ppel -immun o -hor wath -hereis gina -goo des -faber castell -ef r -dor ic -do da -de paris -conju red -carol inians -cali stoga -ben ching -bat aclan -af cofficial -ห ม -ร ะ -wild in -ud acity -tra dio -theo do -the is -t bol -sque aks -smorgas bord -shawn michaels -pon go -no stradamus -nike store -mor sels -j ó -in exor -igne ous -ig nific -hodak otb -heb den -hay ride -ham on -ge v -gal an -chapeco ense -bun combe -bu o -bod acious -bb ard -authori zing -auctione ers -atta che -anatom ically -ak id -af oe -af fiche -ðŁĵ ¡ -ðŁIJ ļ -yu uri -ye c -u ja -trans fixed -ti bia -te cho -sol ilo -school work -roof ers -re zz -pur veyors -pu z -pokemon sunmoon -ok oro -mahat magandhi -lu e -leban ese -laura prepon -kam enri -je han -intersec ting -happy humpday -golds boro -ga im -fro lics -f ads -encar nacion -ce vic -cat sof -burysted munds -birthday yy -at ai -ap ital -alter yx -ad ua -you andme -t bb -supplic ation -so gno -rah ma -puntac ana -pat cho -pa ar -om it -naz anin -mar kovic -ma ssed -legis late -ko irala -k re -imbec ile -hot seat -he eded -gran ules -ge yman -fran chi -e pm -ds all -d tes -crepu scular -cer ise -bermu dez -ben anti -ay umi -ater ally -ap us -answ erable -an pur -ac omohoy -ãģ ij -y omi -wing field -tw all -this was -thereal sambora -smooth ness -roh tak -produ ce -pro pen -private er -pa jero -mre azi -mou la -marku ss -maneu vering -lo ki -k sw -ju ma -joshu a -jon freier -in ion -cozy mystery -cor ot -chicag ol -carl son -b ink -ampl itude -ìĭ ľ -worldradio day -wb ca -th x -stop bullying -sat mar -sa aa -rock ymoun -qu ade -press man -nabe el -ma sdar -lic eo -im passable -frod sham -f du -ex chang -eric bolling -dick en -del on -cou lee -construc tors -bri er -ber ardi -bag pipe -ba j -b pp -alder ney -= - -ðŁļ´ âĢįâĻĢï¸ı -ðŁĩ¿ðŁĩ ¼ -zer rie -wer d -study in -sh is -sch wimmer -rhi z -paul smith -oscillo scope -or ca -nav as -nag isa -n np -len ore -ir repre -ima b -im alt -hand craft -gravit ate -gr anny -gam u -g bag -dis agreeing -diar mu -cor tado -bring ers -am ies -alber ts -ad han -abram son -ðŁĺĴ ðŁĺĤ -ìĦĿ ì§Ħ -young adult -y si -wx w -ther cn -roc kett -rb news -milwau ke -laun dry -jung shin -hon olu -gym time -dv rs -all livesmatter -y nez -xenob lade -u mat -sign sof -profe sional -o stric -letter box -l lap -ke in -jar ring -hon d -g tl -fraun hofer -fo ort -du brow -crown theempire -cincy wx -c ley -baw al -ann al -adon ai -ðŁĩ ¶ -yu rappa -wor l -wei gel -trin oma -syndic ation -side walk -shaan xi -sci ver -saveluci fer -sar aha -r sm -prophy laxis -pine apple -ol bermann -mo fa -lori keet -lec am -iow aspeedway -exac ting -ent or -engv nz -dream house -dove tail -door stop -d stv -cy borgs -bou gue -bal on -awo ken -æ Ĭ -âĻ¥ âĻ¡ -Ãł idhlig -uc ca -thenand alfilms -stop and -sk b -sen ryu -rovin j -pare sh -n out -lu gosi -kro eger -kon k -ki awah -iy anya -hawthorn fc -haber dash -freef all -fla iling -expon ent -en doc -drag queen -cove red -com mies -char ice -ch ima -ceme tary -at ria -are k -an jou -al ented -ac igars -) -- -vse vil -verhof stadt -var sha -val ov -un sworth -uk on -show manship -seal ofhonor -ph alan -mel y -me tered -match day -k inston -hs baseball -he tty -fulfil ment -ful ster -earl ham -dev ita -d my -contradic ting -braini ac -bon et -bau l -bar ong -astr al -app er -an tim -.... .? -Ê ¸ -world toilet -un um -tit ling -sol vable -sant an -sa bel -rall ysweden -r boy -ocla ure -numis matic -natural skincare -nano tubes -mass dot -marcel oclaure -kitt le -greatormond st -e gm -dire k -bos sho -bj c -b tw -b enders -adel le -âĿ¤ï¸ı ðŁĮ¹ -ye vsky -w aki -spon se -simil ars -scol ding -pou dre -penn dot -offe e -mol i -mc sorley -ma char -green hill -gon oles -freer ange -engagementr ing -dundal kfc -defibrill ators -che ick -cam bo -atx wx -ar mid -am uro -aber ration -ľ ï¸ı -ðŁĩ§ ðŁĩª -ðŁ¥ Ģ -wreck ers -we stover -vad is -un box -ste ver -spic tures -smo kin -shah nafisa -never winter -nad ar -mcpart lin -mayo ress -mart ÃŃ -lu cker -love cornwall -lam brusco -kol n -ismail i -if tikhar -h mh -good ale -ger ar -gau ssian -eag er -du lux -do die -bvl gari -als icebucketchallenge -ðŁĺĬ ðŁĴĻ -ਠ¨ -zack snyder -yi ppie -world turtleday -wind storm -vin oth -vene tian -ve olia -ti f -than gs -steppen wolf -schi ffer -say lor -po pp -philanthro pists -park bogum -ni va -ne ct -me hn -love ya -lo zada -hidden figures -her men -fin nish -feng shui -ex ude -com al -cabar rus -biof ilm -bam bu -all endale -ł ãģĭãĤī -ðŁĺĬ ðŁĴľ -ìĤ¬ëŀij íķ´ -tylen ol -tro it -transpor ters -to pinion -spi key -sand or -rec tangles -q ian -preposter ous -p supt -mb or -gor dhan -gl anced -figur a -ell chat -di mm -dat ors -d bo -com ically -cli pe -bige ast -bienven ido -battlestar galactica -b hal -albert son -ص ر -twitter world -tren ton -town houses -surger y -sun bird -stan niversary -sicklec ell -shrink age -sh and -semat ary -sassen ach -s food -pu lido -one way -nose bleeds -mccr ary -mar din -log book -kn z -injec ts -infl icting -hu da -hems ley -health ier -great lake -free styles -ear ley -cunei form -clark sburg -ap bio -an h -accompli shes -ðŁĺĬ ðŁĻı -âĿ¤ ï¸İ -ti ra -theroo ts -tex aco -teach out -sop with -sack ler -route master -quil ter -pyth ag -per dido -panel list -opho to -k pd -ilipp ines -how lett -hau g -g fl -faber ge -ek ka -e iz -dream actnow -corru pt -chaffe tz -bu ggers -austral asian -as us -alon dra -twim bos -to ku -so hard -sla yin -sky watch -san som -official gaa -now ay -ni mo -mori moto -local isation -jack y -for our -emb ol -ed j -dra vi -col ai -ci ene -bar rick -bal dock -bab oons -auto pha -ar nd -âľ Ĵ -x lv -wil mington -vo ids -ven ise -tw ingo -saint srugby -pep far -our ay -op n -oligar chy -nat an -n do -moun tie -madein chelsea -ma ze -humboldt strong -hipp oly -hello ooo -good by -frat elli -ev geni -es mo -ensla vement -da chau -char train -am entor -' âĢĶ -ðŁĻĭ ðŁĻĭ -ت ر -yl la -willow brook -video conferencing -then ci -tat ter -sw aff -sp illage -si pa -sev yn -sa head -ry che -pu sheen -poly phonic -oc tane -no irs -national gri -n wi -lap dog -l vc -hun i -holocau stre -h wa -guinnes spro -flash sale -dv la -dav uto -d sm -d mf -causal ity -car illon -be cuz -wa hi -tintag el -the deanambrose -tat in -shan n -searchengine optimization -pl se -petiti oning -pand o -o gi -nucle i -missi onal -magnific ent -k ks -isc out -imp d -fa kir -evil dead -emul ating -dish washing -des jardins -clothes line -caver sham -ba ikon -anno u -ani er -al mu -ah rar -a sexual -! ðŁĴļ -y aka -wish ful -vi gan -unisouth ampton -the buzz -tan amon -taffe ta -stopp ard -sin ker -sha araw -schu man -reck lessly -pro pping -maran ello -ma sal -lol ll -hoo ooo -ho ban -gas monkey -er dem -det ach -darius rucker -clean water -black heads -biop harmac -belve dere -bart lett -ask ren -ðŁĺŃ ðŁĺ© -ðŁĩ· ðŁĩº -trav eller -tor na -theop hil -succin ctly -stan bic -smith ville -sikh ism -se pa -rayn or -plas mic -over heated -optimi sts -mo si -meetthe press -mc so -lamon tagne -kirk us -in ne -har vie -hallucin ation -green ham -gre xit -gas karth -errone ous -ef arm -cook son -con over -con don -care n -burgh ley -belfas thour -be du -bash ful -ariad ne -anim alabuse -acrob ats -ab ap -wann acry -un incorporated -te b -spor tnz -sa ari -ro vio -rad ler -pra c -pi voting -ph ono -pearl man -mun day -mon ch -modern slavery -mi yu -md zs -life way -k sm -jas oos -hor ta -galac tus -fossil fuels -ex us -end it -c leg -bron fman -beef steak -ar but -akiha bara -ðŁķ ĵ -womens month -torri don -t je -spring bank -spin elli -shab bir -rock your -poc keting -parliam ents -meal prep -mathemat ica -mar q -luxury living -loo ong -lar kana -ki zomba -ig cse -him mel -high st -head lands -gl m -da ines -corn elis -bett ys -beck mann -bb ons -b sp -ar ks -am iss -. ðŁĺĤðŁĺĤ -wol cott -un accounted -sub consciously -splin ts -sa onb -ru per -pader born -n bag -mid south -march esa -lu sty -lu cario -ky go -juli ette -inter feres -hypo xia -gand u -free gle -fra ggle -far ren -fac i -cryp tos -change therules -cap iz -bru ford -b ge -at re -activ ations -ðŁĹ ¿ -wood craft -us ama -tun stall -so ch -sm cr -sin an -salfor duni -punc tual -proud moment -pr icks -poe tic -pine cone -oscill ation -nag i -my fav -mer aki -man gold -makemoney online -letter head -k hoo -interstiti al -hyper ten -hick on -gul den -grey houn -galla gher -fit tipal -ente ast -end u -ecol lection -dr v -dis band -del f -decor um -com ikaze -cob web -chatter box -c fos -bo zz -bionic le -ar ke -voc ate -vo g -vai z -v ry -twi stle -ti ba -thro es -the wave -tender ly -shaz ams -sc avengers -re organized -propag an -port meirion -n gi -my chal -manipu lator -lam enting -kr w -kilo watt -jubil ation -iron works -hon y -hiaw atha -hel plessness -he mb -gil ad -gen ovese -en actu -dor fman -csir onews -corri entes -bore ham -ben ni -bath house -ath ur -arcade fire -amon te -al tus -? ( -yi u -wk tv -wer u -vsp hi -ve stal -synthesi zers -super sporttv -stra de -sag en -ravichand ran -rai ya -o doi -medi kal -live able -le vity -koch har -jessicaal ba -heral dry -harryand meghan -glendal ough -gil ley -ed n -drive club -devi ous -denu clear -cy o -cryo genic -cho gm -bu ssel -brou ck -ar moire -aj payee -ab ta -a aya -wool sey -unearth ly -ultra fast -spinnin records -scot te -res ellers -read acrossamerica -n cea -mcqu ade -martha stewart -loosen ing -j harris -girl talkza -g bo -fin nigan -elias son -bri ley -bow land -boo bie -blue field -actu ary -ðŁIJŁ ðŁIJŁ -ë¹ħ ìĬ¤ -y pc -y ager -un skilled -u gle -ty pi -tric ity -tin ie -thomas ville -stran raer -ssf crabb -ssfcrabb itohs -sk ic -reic hen -ram e -raj deep -pu shy -pic ad -p wi -oo f -naturo pathic -n ps -mccl endon -keshar ose -jeremy clarkson -je ster -in bred -h pp -f cr -close ted -c ton -ash tabula -an cona -alla board -ìŀ IJ -wad dy -voyage urs -tanamon geau -pr r -pon ti -pgc ps -our g -metro id -lauren laverne -kri ya -kohl rabi -key bank -kar ag -kal ab -is adora -grow nups -der osa -datadri ven -dan ks -ast one -ames bury -alife style -ภį -vijaysethu offl -t shi -ron don -pu s -planet jedward -pen alized -observ able -no sso -nca c -mon santo -ke se -ka ur -in en -i fl -greyson chance -golds worthy -gocu bsgo -foolish ly -fat cat -esqui re -dise mb -bon di -body con -birk beck -battle tech -av ent -an the -z cz -w ä -w drb -une ven -un peacekeeping -u er -ti gru -the vampire -sorrow ful -ru stle -ru hr -print works -pe kin -omni present -musking um -mool ah -mid point -mi hai -mar cie -jit su -ireland sanci -ham pur -gh ome -fro gg -fix ated -fer oz -dead stock -city center -campe che -ca sia -br ampton -blitz krieg -at first -ar tur -ushu aiai -ushuaiai biza -urve di -tph online -sympathi zer -side tracked -sf gate -pal infoen -man sur -ly d -li mos -jacque es -gun sup -gli se -ge thin -fri e -fen u -dy spra -cla ym -chap a -c gl -bar rens -an isa -ī ï¸ı -world tourismday -w oc -w ladi -van itas -sudir man -shab ir -ros icky -pre eminent -potter ies -pi awur -ne eti -my fitnes -men or -mark j -love dogs -k hou -ir anian -insi stence -flexi on -exorbit ant -du ele -desk ill -dd am -cy tometry -box wood -ben avide -assimil ated -ade e -ÙĦ ÙĦ -~ ^ -y ps -w iller -vali dates -u kes -tone itup -tom ars -she ared -rush ton -plu gger -pir ro -nar sissi -lynd say -lyn c -liver ies -k jr -inner most -ho tham -herman miller -h var -fanta stico -ec anada -dd m -daily motion -bed fellows -arbitr arily -am cham -ye son -weekend reads -vast ness -tre molo -the greatest -sil oam -sar pong -sandal sresorts -r grosjean -public transport -power ing -neuro tic -nan as -moo lool -mol itor -mi am -m sr -lou w -kra v -gab f -fier ro -f mb -don lemon -del ong -boro budur -ar nav -agro ecology -ac to -wür z -wil helm -v ingly -travelo dge -thre ep -the irish -staf fel -sta ats -snic ket -p gt -ol ab -o sts -numer al -neuro diversity -mat ters -la ga -jay ant -jaw breaker -in lays -home builder -gray don -gis borne -gas pard -fethi ye -fear thewalkingdead -ek ad -crum pet -cr h -cc sd -boar dof -backin theday -ðŁĺĦ ðŁijį -ãĢ Į -vetri maaran -tri ad -tough ened -ta hu -sp litters -sher riff -polar is -pe or -or ab -one year -nam carey -mu ito -make ityours -m no -l ch -juxta posed -jussi esmollett -it works -isthenew black -irelandsanci enteast -har z -e zz -dimble by -de wayne -de mic -co ves -cav y -cancell ara -bridge gate -bougue reau -bore ham -balu strade -al righty -ðĿĹ ® -âĻª " -wj hl -wi ffle -war rington -tony the -thi opia -spir acy -sp ry -social ise -shaaraw y -se dum -roman esco -ri ssa -red dog -rare diseases -rain i -plural sight -pau per -o dense -navig ated -made ley -len ape -k ys -k afe -home buyer -eul cs -dip tych -cube sat -ch isle -car nar -be ko -baf fert -av ai -ع ÙĪØ¯ -zombiea pocalypse -wit ton -unequi vocally -tri angu -thero ar -soccer grlprobs -roch as -revi e -pic ballot -meer kats -kr z -kq ed -kon kan -ker stin -innumer able -gu is -gu ber -ely ria -bo gu -aly zer -alphabe tically -alban ians -ade cco -ðŁIJį ðŁIJį -ÃŃ k -w under -te ow -shi ga -rick man -n ph -micro brewery -mi ffed -mazdas peed -marchi sio -loo b -lea v -laugh ton -kear ny -ip aded -i think -hod der -glen more -gle aner -exper ian -co bs -cau tioned -cab bage -border less -athle isure -ale do -a ard -ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ -u tu -tw al -too ting -spr a -sky tower -sal ado -rex press -pub med -om usic -no fficial -ni hon -i ams -h mt -goo sen -giuli ana -elpha ba -dream girls -concor ds -clover dale -citru sy -bra w -boun ties -barang ay -ase prite -antw on -an ja -aller gan -ðŁĩ²ðŁĩ ¨ -zal giris -wesl aco -um sl -tree top -tarry town -tac tically -slo pp -said haram -sa wan -sa kur -pan african -not good -nick j -must be -mul lets -miss ary -mand aue -lab ors -kam er -he met -gar rity -cre ases -ch oline -bro ch -blemi shed -zapp ed -ulter ior -turf club -sur fact -su leman -sk n -pre rna -on campus -nu dging -n up -matrimon ial -lore tt -ine sday -in mar -hydro phobic -hawkn poke -eury th -em ts -dun oon -cott en -constru ed -be red -ba sher -ðŁĺĺ . -ðŁį ¼ -z ze -ying luck -y de -vit als -ve day -tropic o -tra ynor -ticon deroga -the farahkhan -st asi -ss v -sk lar -sal icy -ro sne -rackete ering -pennstate fball -p bi -o ji -o doo -new mark -my fox -mor ies -marke l -mar oney -mac ra -ke izer -kal ak -human ists -hazarde den -fis sion -fe der -dy mium -buy art -at co -ash an -al sa -al kali -ë° ° -à¹Ģภ¥ -ver bo -th air -sas ol -s vel -nu f -mil lais -mc cook -mackin aw -light speed -lethal weapon -impal ed -hoo ten -hat ers -fil o -fantasy baseball -del isle -bu cked -blo t -ax mi -ash vsevil -aristo cratic -acro stic -ac rime -< = -!!!!!!!! !!!!!!!! -ìĿ Ģ -w cyb -vau se -uw tsd -suffo cate -special report -semi o -sat anism -ric or -ra res -pm modi -livel ife -le lla -ir inha -i Äĩ -hor o -her bed -ham mam -glen view -extrac tive -down loader -christian grey -chae ology -bur nette -bow more -bor ini -boo geyman -big sby -tu ffy -th unk -son air -siddi q -sch nell -rook ery -read athon -ong ate -men shoops -melis sar -meal time -kh ough -ju sta -ger ton -fal mouth -es as -ed and -der ian -da unt -d pl -conserv ator -concert gebouw -chi raq -char leroi -bull fighting -bon efish -ban stead -ðŁı Į -æ·± å¤ľ -âľ ī -tun der -to ffs -theli st -swar ms -snap chat -sk ra -shot gun -sch ee -s be -pros thesis -pink shirtday -or adi -one health -mp ha -molin aro -moisturi ze -lac i -l á -k ult -ide m -ho bi -gam eface -fittipal di -film struck -ed ens -cow town -com media -carte ret -blan cos -barbi eri -atra vel -amal u -alway ss -al tona -ye katerinburg -y israel -wal msley -w wee -under funded -u cb -tim ento -thomas fire -sho spitals -shail ene -sev ak -ru stin -romantic suspense -provo kes -pic ku -pe rel -pe en -pap ad -paleonto logist -minneso ta -kie hls -inde pth -e ero -concer ting -co valent -ce st -cardiff devils -bro da -bra k -ash bury -apprais als -appointe e -y ir -xx vi -workin ghard -wing suit -us borne -ra shes -patientex perience -ocho cinco -ny l -new kirk -myfitnes spal -made on -l atta -hu ys -ga jah -finger nail -eart ening -drew brees -do vico -diso wn -dan ai -colori zation -catter ick -call ing -bulk head -bo kuno -b ice -aul lah -ab ai -ðŁĻĭ ðŁı¼ -ı n -wil ber -upcycled hour -swor dar -sum é -steve smith -sinn fein -si dra -rochel le -ran n -raim ondo -polit ico -ph rine -outdoor sman -ne smith -nc pa -nal edi -mo len -ma show -m fb -ke bbi -im mo -ilo ilop -ha itians -gill iland -for christmas -escar got -download fest -dev gan -colla b -clonak ilty -click able -cali endo -c wx -blackandwhite photo -bangla desh -av y -ang ala -aj in -ze b -usar ugby -twitter sisters -turk sand -tee ism -sou let -se squ -sculp tors -refu te -reas oned -q iu -pie day -oyster catcher -oo st -mo da -ma ach -kah lua -g fp -fr ys -flood lit -dul hania -dan ne -cro ton -col icchio -cle x -ch boursin -cb cs -bern at -bat um -ì ¼ -ëı Ħ -z ori -wi thering -wang ar -teas poons -ske em -s gm -recuper ating -rattle snakes -r sh -po vich -mil en -m out -ki edis -her mos -her mon -garri son -gam ist -ga etano -cu bana -cru zeiro -chig well -ato se -ar bu -annihil ate -agu ila -ðŁĺĤðŁ¤£ ðŁĺĤ -y zerman -y po -wwer aw -tw iler -tal os -sw p -sw ab -shaz ier -ry ans -r pi -pur ples -phyto plankton -pha r -pa ise -motor homes -mccour ty -lun as -lauren tian -kol i -jim caviezel -gen io -flex friday -fair lady -ema ar -down the -devan ey -cre tin -ca shire -blu ey -blo is -black jacks -barnar dos -axo lotl -ashvsevil dead -zyn ga -tomo fromearth -sk ine -se wol -reu ters -promp to -por cello -per ron -pash to -paedi atric -oo z -oo kie -lich ter -leder hosen -leather man -jets fc -ippo iloilop -im pede -howard donald -gent es -ev ms -el co -dan tonio -coch ise -chil dish -á ¸ -vish u -un berg -ti enne -t fr -sir car -ribb it -r be -pla gne -pike tty -pi rit -personal injury -my lar -lzzy hale -ku ria -frau en -foot stool -farmb ill -fac inelli -escam bia -e we -cw o -chelseac linton -char ades -and ile -ac kee -yo soy -wol d -usp oli -us na -u val -tusc ola -toy ama -the sia -tac it -super ga -strang lers -steph mcmahon -solo travel -sh ampton -sa enz -robu sta -re framing -po ch -life insurance -la day -kar apar -jur gens -guild ford -ghir ardelli -ebb s -diav olo -crowd sale -chester zoo -char r -bigg boss -big cats -bhan sali -bad boy -at sea -as sent -Ï ģ -trek ked -touch pad -tim buk -rob portman -raku ten -pre trial -party nextdoor -os g -o tom -no yer -madd ening -jon son -inlovewith switzerland -gro ped -diam andis -big little -b me -aw t -ak ingly -wat sons -wat p -vote onedirection -u hn -tweetapicture thatdescribesyourfriendship -tr anny -son gof -sim racing -she par -sebasti án -scarec rows -sal cedo -o samu -nurses week -ner ship -narsissi st -n saina -mole ster -machiav elli -li ek -lc ms -ip fw -infon doro -infondoro tweet -gre tath -gerani ums -ent v -earth pix -du bh -dimit ris -corner brook -cor respond -cic er -chir py -cheltenham festival -bom bus -b fl -ai den -adar na -aber ne -a hir -unt angle -tu shar -stein bach -señ ora -schlei fe -offen bach -nobel peace -margo tro -hi ac -ge ma -eze kiele -ed ers -cule bra -comor os -win stone -way point -war pedtour -trick ling -su dar -spring cleaning -shaf en -pin oe -pg w -ola ju -leit ner -le se -ippoiloilop np -induc tive -hhhh hhhhh -gretath unberg -go tto -exo tica -erec ting -ea res -di ary -der os -de meter -co wie -che ema -books beseen -bo to -bb do -av aro -as of -am mer -a joe -........ .......... -violenceagainst women -under weight -ter r -t sing -sty l -stu bb -spi er -slack ers -shal f -public an -plo tter -os ment -nuss baum -moor fields -money penny -mal thouse -lu ka -lament ations -jai brooks -hel t -hahahahahahahaha hahahahahahahaha -er lang -emo tion -dy son -dro it -dorse twildlife -donkey kong -di anne -craf ted -cn m -bad ham -ay c -ari ate -ðŁIJ © -âĶ Ĭ -ü rk -ymc mb -wat ley -w toc -virgin media -super sonics -sh it -sch ilis -sad da -recycla bles -pu shin -pro xi -per reg -new shq -mother f -mo red -mal ak -love struck -kre ss -imam ali -hel msley -gri sel -flemington vrc -far scape -el ge -chi rag -alphon so -. ". -ðŁĺį ðŁĶ¥ -âļ½ï¸ıâļ½ï¸ı âļ½ï¸ıâļ½ï¸ı -âī ł -à¥ĩ à¤Ĥ -y ayo -way o -vi jender -tamar braxton -tamarbraxton her -student success -spi ece -sker ries -sha shank -sche de -pun dit -pt cl -perse vered -omg its -nko tb -ms deskill -msdeskill india -mr na -motor sport -mon ics -mcgon agall -kitsil ano -k vo -jo enbc -jas s -it em -ilo g -ie h -fe est -favour ited -far in -debar linea -comp ton -cheryl cole -bree ch -brac kett -barrett jackson -ðŁ¤ ¨ -âĺİ ï¸ı -yaros lav -us ace -ti do -sw as -sn hs -plu sh -pale olithic -out set -net eller -natur alists -naje eb -mi paltan -mer ce -lock lear -ley man -ip h -ini x -in ed -fre dette -entomo logist -devo tion -can g -boat man -b bow -ak ou -;; ;; -! âĺºï¸ı -ðŁĩ©ðŁĩ ¿ -羣åī£ ãģĬçµµæııãģį -wist ful -ver afar -the time -shon en -saidharam tej -po kies -paris i -no stro -monso ons -mix up -mith un -min oru -mb ball -man to -magnac arta -kalash nikov -hy phen -fist ful -expo se -day after -co gic -co bia -cin os -ber oi -ber at -an ki -' / -tre foil -tb p -tan en -steu ben -sportsc ards -skynew saust -pri stin -pay phone -onto logical -nikel ab -milli ken -mendo ta -k lasse -indi ain -imp ounded -iam nehakakkar -hal sted -gat ling -for dre -far ne -dump er -di dion -decre es -d ph -book suk -barber ing -ace c -ðŁĻĪ ðŁĺį -ðŁij ± -åĨ į -winnie the -tomb stones -thin ned -sty a -si pho -pseu dom -propagan dist -pe ct -over tly -ound ingly -o suna -nu er -nk peace -ni gg -livel ong -li ott -l sg -gom is -farming dale -ec ko -e iri -dsw d -deton ation -de voting -clu n -burn s -bring backthe -bo pper -ber l -ale i -al ba -zo iep -yo yp -tl eroy -te res -suit ability -sk ales -sa inte -reprodu cibility -puri jagan -pre ys -pr l -phy tes -mo there -miy avi -mc vay -lo ya -ko ke -green back -goo oooooo -giant s -fl studio -feather y -extraordin ary -dow son -defaul ts -dar wen -d ms -cur tin -clark sdale -ci les -chan elle -cassin is -ain u -á Ł -ya ari -wall ach -w tol -usf ws -twing lish -turn stile -sunil grover -sensi bly -schul ich -pro claim -prana v -peter borough -perreg aux -per nod -ne use -m lt -m ko -lyn den -ky n -ho ole -hali de -ha ys -friend lier -fer ment -f sw -er ing -enti sts -dis ch -cth agod -bor iso -bo wels -bam bam -au dis -angel s -al arabiya -ðŁĴ ½ -âĿ¤ï¸ı ðŁĴĽðŁĴļðŁĴĻðŁĴľ -woo lies -wdw today -to pper -te ap -super computing -sp angler -raise high -queens ryche -pri sms -opor to -mt mte -machi da -jan kovic -in excusable -gu ile -finlay son -dram edy -doo san -dayofthe dead -col gate -caddy shack -bt toronto -ammon ium -ami ami -ðŁİ§ : -ðŁĩ¦ðŁĩ ¿ -zoiep almer -want age -w ma -voiceof obrien -ver di -ve o -towerof london -sté phane -stur ges -sti ger -soci alized -sie g -rhy s -pro bert -over thinking -ole ic -no a -mikas ingh -ki per -iv d -ing rich -hyper active -gear best -followthe whiterabbit -fic tions -ec ou -darshanraval dz -commercial isation -catalo ging -ben evento -amund sen -aim lessly -- &- -ìĥ¤ ìĿ´ -ü yü -vin er -sutter ink -sp g -rotherham iswonderful -ri au -re deemable -pl lc -paw sup -or pol -le vent -lan come -kk an -ish ra -ha stag -gue ira -fil bert -eth i -d su -buis ness -ben ik -arre sted -al lover -agin court -wwe games -unra vels -twin sies -time management -tean eck -scar fs -r cl -pur ley -power houses -po stures -pedro ia -painst akingly -ow let -ope th -motör head -mol de -hugo boss -g oud -fri a -flo tsam -el dn -dan ai -ast side -ap apa -ans ys -° ° -vikram prabhu -up endra -sli ving -sky uk -si hh -show stoppers -see king -sc imit -reading challenge -ra du -pod bean -piawur tzbach -pel ley -p wn -os n -open banking -old timer -ol anus -mel ano -kensington royal -fc x -cp im -coss ack -comic strip -comb ative -co sida -ce v -cb w -cassinis aturn -ari jitsingh -app o -amee sha -adobe max -( $ -ðŁij¸ ðŁı½ -éĩ ij -voc ates -un habitat -tur vy -tro be -today schilis -tipp ec -sir te -saf es -ru dra -red white -ph ala -nag iri -multivit amin -me wes -lu ttrell -j ole -intrac oastal -in ici -im fnews -hand books -ha ft -go lo -crypto trading -char grilled -centra al -british bakeoff -bas set -aust ere -ali wal -ad ini -yw am -wor cs -tran scribe -to winit -sou py -sie w -show piece -shamrock rovers -sc ry -rou lade -re finished -ra vin -par ter -ou tit -ole ander -oh ms -neer ja -mag all -machin ima -job seeker -fun der -distur bs -bo dine -bm ps -as oiaf -ab atement -ìĬĪ íį¼ -worldtoilet day -victor iam -su ave -state university -smi l -sentin el -punxsutaw ney -patton oswalt -pad awan -modest ly -minim al -lass iter -ku b -ingh urst -hu lt -ho ol -hierogly phs -hay ter -hag ler -flan igan -fish town -fire brand -fel dy -et b -em at -el rey -doctor sday -dc family -daily pics -bro mide -bal aton -baff in -app raiser -app omat -aad har -ÑĢа ÑĦ -your future -war burg -summer hill -ro sses -patrol man -omyel itis -may tag -madein france -ka the -insur mountable -insig ne -happy christmas -gru mp -fo yt -draw this -disser vice -cur va -brigh ter -brad lee -ar cos -ħ ï¸ı -ì ± -wand le -w sw -university challenge -tag team -stel ugu -squ otes -so dex -script chat -ril is -rap monster -r ind -pre acher -ph rey -ly love -lur gan -lark spur -fair tax -dro opy -comple t -christi es -carri bean -box office -an eta -aggi es -ðŁ¤ª ðŁ¤ª -⼠ºï¸ı -us dot -tr r -roa stery -reson ator -phenomen ally -matt jackson -ley town -j elli -ic ana -ibi za -hy n -guess work -goti t -episo de -el veli -dr kent -boor man -ber kowitz -an hui -ah me -! ðŁıĨ -ðŁļ ¤ -ðŁĴĥðŁĴĥ ðŁĴĥðŁĴĥ -âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -water for -val d -under secretary -stren ds -sten house -soci alization -snow globe -sil van -romeo andjuliet -rhode sia -phnom penh -ou est -nu thatch -month of -mm ys -hierogly phics -fanci ful -er ac -e studio -com i -cab anas -bioprin ting -be ggin -bak ula -ausv nz -am ado -)))) )))) -wh our -weimaran er -triump hal -so ju -serv a -serp ents -scu detto -pol qc -oli v -o die -ma hou -lover boy -la sa -jeff bezos -irish examiner -indie booksbeseen -ill amas -hel ical -fear lessness -ezekiele lliott -e ys -de gu -dat are -cool er -cointe legraph -chu gg -character isation -cb insights -ca ppy -bel lucci -alt ars -? * -stevenage fc -steel series -shu b -shabby chic -se bago -scream ing -real i -plu meria -o wat -markuss chulz -jar ra -il ot -il lah -el ight -edgar wright -don cic -domestic abuse -disinfe ction -den by -bull snation -bel in -bech tel -beau te -bar bi -اÙĦ ÙĬ -wonder land -vote march -ther anos -ston ing -shipp ensburg -sch mel -sa chat -s farm -rafin ha -po inci -ode on -meryl streep -masam une -mary anne -mammo graphy -m oooo -links ys -ke ez -ka sie -gel o -deid re -cher well -cher lloyd -cardio twitter -cal z -boo zing -bar mouth -as ma -aquas cape -amus ica -ðŁij¼ ðŁı½ -á¹ £ -zak yn -xl viii -wgn news -ti as -taken ote -syner gy -stabil isation -sacri lege -ro ark -re action -radic alization -pla sters -ph ala -om ingo -new sprint -mu ffet -mr at -lique fied -le gui -iz od -ht p -frenchri viera -ca hn -arquitec tos -a ari -ðŁķ ¶ -ðŁĴ¯ # -åĽ ½ -âĿ¤ ðŁĴĽ -ا ÛĮ -vide ocon -verafar miga -v min -upper cut -uo fu -spire ites -sor bonne -sol t -smooth ed -shiv am -sand point -reli evers -lang u -i ze -how son -hil ic -glam is -g antz -fle gends -dispen saries -discoun ting -chri sb -ber tu -âĻ« âĻ« -z ky -wen zel -wbc boxing -top shelf -spike tv -spic er -sp engler -sh ate -sev co -pal mers -om undson -ner vo -marsu pial -lec kie -ld h -kili fi -kiel basa -jerry lawler -hy eri -help fully -finger printing -e son -depend ents -cyto sis -chi on -bom p -bai lee -astro gaming -assassinscre ed -ashmole anmuseum -an ouk -alejandro sanz -al ys -ak kuma -a sec -ðŁĴģ ðŁĴģ -y annis -u bon -troop ing -spamal ot -sn ood -sa kin -ruth lessly -remote sensing -r ines -pp k -pedd ler -meet southafrica -mcminn ville -mas ri -ma ggs -keyn sham -jaun ty -israel news -hell skitchen -have yoursay -haar p -diab y -delmar racing -ch ury -carav anning -can in -bur pee -ballester os -ar rambam -ar ge -ani am -and ys -an nett -ach io -y f -west mids -ultr amarine -tip tree -te mu -st z -spl int -shan ker -pil ate -pel i -panam anian -new land -mu bb -mis informed -mer sea -me ate -mc stu -may fair -lu pton -kud row -ke dge -it ae -indv wi -iam chris -en sor -dien st -d po -cyr ille -barro so -ari de -alternati verock -ak ak -ze ta -we iser -thero of -tani sha -super fruit -shin suke -sex smith -needto breathe -mr mark -mol inos -mar ussia -llan beris -kin ch -jupit er -ho thouse -glyco lic -ge auga -fu la -fish n -fa fighting -dar ned -bin ib -an airlines -주 ëĭĪ -ve in -used gov -timeto talk -tail or -suffo cation -san lucas -re ek -queen su -prece des -pen day -pad illa -oc ad -nopain nogain -man ton -lor ing -li vigno -keto diet -k anta -juli puli -heral dic -giving day -gabor one -g pt -ft fc -f ack -el agh -dc g -colli erville -brit ches -af w -ðŁijĨ ðŁijĨ -water hole -vladi mir -tec ate -switch blade -str t -sr kians -shailene woodley -re fle -rat ch -r fm -pre vost -pae dia -nas arawa -mug am -mc gi -land lady -lalunasan gre -ki ama -keen an -kan eo -j rock -im so -fl inch -fix er -fe mi -fc bayern -electric car -e chs -destin ies -cav ell -c vi -borsch t -bore lli -' [ -ðŁ¥ ĭ -Ñ ģ -Ð · -the is -thalai v -stom s -sco w -san kran -salon edel -redd it -pu paid -pas wan -mar lies -magnific at -ma ther -lisi eux -jamshed pur -its showtime -ick man -ical ondon -heck le -gang land -ep dm -cur vy -cre mona -colon el -co aster -cab rillo -cab incre -big ten -as z -alger non -Ħภ² -une vent -twin ing -ton sils -sso cial -south ridge -shop ian -pied ra -oo i -naka jima -music industry -mcafe eshow -mar sters -liber ace -green ways -g couros -for cible -durham bulls -cru mmy -cp k -clam ping -bri dged -biri yani -ac me -ðŁijĪ ðŁı¼ -é» Ħ -wash rooms -u eda -swithe xo -so ds -sel im -rau sch -port stewart -phi v -pacific rim -or on -ond ins -masu da -lan ey -kurt cobain -i ku -he ik -gir ondins -fre o -etsy specialt -do val -bur ra -ìĿ Ħ -ìĭ Ŀ -way zata -wall er -w mb -ty an -sinf oni -rud dock -rejec t -rav ish -ra skin -pre mam -poly graph -player pro -pen tel -pa ix -on dp -oh rid -nur magomedov -meadow brook -l ill -kr all -jac inda -iso u -ie o -go tit -fri dge -fer d -ec ream -disintegr ation -cultiv ar -cp b -city tv -bishop s -bel um -bb camerica -bat b -ban ega -ba isakhi -assembly woman -yoshi kiofficial -ym nastics -xmen apocalypse -wy cliffe -water world -val or -street fashion -show boat -river keeper -realestate investing -pha sma -nen agh -mur ciel -mc andrew -match less -mack en -lu ckey -less than -ic ici -holiday inn -hasi dic -gla w -g aping -di os -dha k -countdownto christmas -c dd -boy o -berk us -b kc -are sort -ap ra -an tos ->_ > -ðŁĶĬ ðŁĶĬðŁĶĬ -zet terberg -vex ed -tril ateral -trans america -the sm -str act -sti an -stern berg -spl enda -sh iso -rat ing -photograph e -ou te -maran atha -len nar -j oli -hyun sik -hoek stra -halli burton -for days -fo k -ely see -diversityand inclusion -butch ering -bro gues -bo hr -ared itor -ar ul -app ts -add ington -vintage toys -ti ppin -reson ating -mer ton -kad ar -kab ab -happy stpatricksday -gishwh es -game z -fra gran -ee baftas -drunk ard -chaper ones -asur geon -arnauto vic -ar ow -ãĥ Ļ -velo so -tur co -t ello -sth lm -spati al -rak is -raisethe bar -pr ying -or ris -ol ong -never quit -ly u -lewis burg -karun anidhi -gru po -flu tist -fabi ola -end hunger -develop mentally -dean ery -da st -cu bao -cou pland -bv m -br attleboro -bore hole -bar ked -av ino -are ma -animal lover -am ora -al vor -un tied -umb i -tory burch -thr all -sv w -snow birds -sheik ha -ri dder -re ars -ontari ans -olentang y -mott led -ma thi -leich hardt -kim f -keuken hof -janathagar age -ir say -hisham mu -he ssian -fest of -fa hd -ensen ada -enforce able -con cub -co k -ca world -bran di -boi ster -bar ram -ar pita -al dgate -wearen ato -uch ak -toa stie -te jada -spin el -show biz -seun ggi -rajas thani -r mg -mon signor -m radio -ke pa -judd apatow -isab ell -gir on -gi p -gam bier -fal vi -ero y -eli ving -dis concerting -cu ellar -cap illary -bin ski -angel os -amo sa -ðŁķ ķ -tuesday selfie -te ste -suni verse -sud ha -sap d -over population -numb ness -nicol let -min o -mid way -mag an -le bon -koz hi -kn ell -kli psch -her rin -hd pe -car crash -atlantic council -and soul -and son -am ple -ac w -x ham -vo td -vo ssen -trade smen -sper th -spear heading -sky dome -shin ichi -registr ants -prime iro -p tom -mou che -ko oning -kind ling -gad ge -ful i -fos dem -dis qualify -dan ab -dae jeon -d ja -com patriot -chlor op -blood stained -baikon ur -az in -... ðŁİ¶ -! ðŁĮŁ -ðŁĮ¿ ðŁĮ¿ -å Ģ -â̦ @ -wol seley -wie be -up surge -tony robbins -swan ston -sal vi -s ä -rouss illon -raj ag -od ile -michael son -me ted -lombar dy -li san -kait lin -h sp -get z -ger ia -gathere rs -f elly -emc world -ed reform -dor mir -dish eartening -crit ter -cre ta -ash le -ar ini -an sley -actualliving scientist -âĹ ķ -winn able -uni fi -te ka -ta stic -supermari omaker -ry lands -raven el -r le -py ke -prun ed -nam rata -n qt -min ator -melissab enoist -mante ca -inform a -head hunters -hard ening -fent y -est ac -el kin -east land -dal trey -country file -comb ate -colle tti -arup group -ar ka -anno poulos -an kle -ãĥ¼ãĥ © -ãĤ ĵãģ -wein berger -vir o -thames link -skim mer -rush den -roo y -ram sey -pas sport -or atorio -nct m -mu gi -ma adi -litt lerock -la sor -junky ard -fis sure -fay dee -fare wells -draw down -dom hn -distric tn -cout ts -cori olanus -clam ped -bumble foot -ay ne -an it -amit os -vo hra -vladi vostok -tun ities -syndro mes -symp tomatic -sun pictures -sim provement -reb elling -quer rey -photosof dublin -no ther -min nows -matern ity -ko ti -jo vial -inza ghi -imp hal -idio cracy -ha bis -cele stine -call sign -c cr -?? ?! -transhuman ism -the cus -ta ek -studentath lete -sho rey -sa sharo -rv n -rish ta -pac er -new ydd -mol to -mel ting -medi atek -man jima -litt en -li bres -kuznet sov -kir yu -karak oram -kar gil -ill matic -hafi z -gan o -d bi -d acosta -chee ked -cast es -bab in -b wb -ay ia -and country -wh ig -the mba -tat ra -stro man -smash ville -score cards -rav ello -ran z -pi pi -ner ton -national day -mg sv -mali gned -le mmings -j ev -intram uros -inf a -ij en -hopkins medicine -gal ant -far ring -deta ining -boun cers -arequ ipa -ðŁ¥ § -ze etv -zal ando -vo ces -vil let -vent uri -su do -sm r -sil marillion -shap ing -see you -sam sara -rod well -resi ze -radic chio -qui ps -predat or -par ky -manu life -mahot sav -m ge -lat itude -krem lin -khe er -jay lon -i den -ha bla -gru en -fluctu ate -flappy bird -fab le -denny hamlin -centen ario -bun ce -broom sticks -an ut -ðŁļ ij -ìĥ ģ -wid ths -waf b -the word -te efury -spy ro -shi el -sch lumber -sa ppers -re launching -pal ladi -mon a -li q -kum o -jan ae -is si -im ate -g ile -e missary -coinci ding -chalce dony -cal do -apo el -an ole -aggre ssor -ðŁĹ Ŀ -à¹Ģภ¥ -w day -under pinning -troms ø -te faf -super mom -stri als -story tell -sco in -s need -roo d -plain ly -pac ade -ne brown -mtk global -margotro bbie -kir ch -khq localnews -jim mies -holo cene -he em -fu ta -fetu ses -dysp hagia -dayoff all -cu tbacks -cb ssunday -cas soulet -bul wark -ban al -an del -am sat -yas meen -will ful -west isbest -u ds -tw ice -thel ab -stove top -ste es -patho genesis -orel se -ogil vie -of the -of ten -of ici -neuro blastoma -more ll -martÃŃ nez -loss less -k lip -har land -handicapp ing -hal ima -gau ghan -gar ia -dd ance -cu man -cru sts -chiroprac tors -ben ham -baw ling -arthu rian -allevi ating -ac ole ----- --> -ðŁĺį ! -âĿ¤ï¸ı âļ½ï¸ı -ঠ¸ -yo jin -ye u -y pa -vand en -v gl -us ada -tsingh ua -thousand th -telltale games -sho jo -sco ville -sat ori -repe atable -quent in -mari me -malac añ -ma kai -lat en -kin kade -kil lam -hit maker -h th -gram app -ge um -fri z -fe ek -daysof activism -chur ned -chico pee -bu j -bet w -berk man -ah f -worl dar -women crushwednesday -vi kings -vanqui shed -trit onal -super series -sn afu -rimb aud -rally for -quie ting -music city -mattybra ps -mac ias -lovelo velove -lees ville -k chenoweth -jaz min -inter vening -ilooklike anengineer -ho pp -ho ice -hex a -gri ma -goo glen -gener a -g wan -der z -birken stock -bend re -bel en -be ira -ath ar -aerob atics -ðŁļ µ -ðŁĺŃ ðŁĴľ -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ -walk away -vallec ano -v end -swtor family -stro s -splat tered -robo to -red wing -or gin -oak lawn -nat u -mclaren auto -m ti -it sy -immobili er -ido o -her she -gir der -gamel oft -faroe islands -east link -do bbins -be sok -atri ots -artic a -altam ont -ðŁĵ Ĩ -ëį Ķ -zar ate -world champs -wil tern -tele mark -tang le -ste ppers -sp ha -smith field -smel ter -sleep iness -shor thorn -se hat -scast aldi -ricflair nat -ricflairnat rboy -ra un -p cy -noon time -mercy hurst -lo ling -little field -it su -ich allenge -homopho be -harmon ix -gar wood -fu a -ei p -dam ani -cla es -chal dean -brass ica -barcelon a -ar tweet -al om -aj kt -ðŁĶ´ âļ« -z ita -z ari -ur der -studio ghibli -sk ys -shareyour weather -seag rant -ry k -ou at -no guchi -meeting profs -man av -ine ar -gul ly -gul lah -guan lin -grow up -footb al -explore tnq -del acruz -creation ist -asphy xi -as ings -appreh end -alton towers -_/ \_ -year books -whoo pi -thel ady -temp tress -tatian amas -tatianamas lany -tab er -sur fed -sheep shead -ru c -ro tax -ra yan -post mark -op elika -olim pia -no bigdeal -na sti -n fib -my city -moon walker -metro linx -medev ac -mal ware -li gh -l fr -jah lil -icecream day -hon ky -h ô -gas ses -from italy -fc sp -eu erasmusplus -dol i -di mond -cor bridge -chic ane -bully ing -ball z -aggie up -world champion -ven eta -var ley -v aren -swin ford -story boarding -sor um -short films -self driving -sci reports -salv age -quat re -prime time -pat mcafeeshow -pand its -news max -ma zi -lo ko -kan mani -it ri -ink drawing -il ha -horo witz -holistic health -heath y -govmike huckabee -gluco samine -fredri k -fran corchamps -fenerbah çe -er mann -en ame -dor m -doit better -ch sler -cdn hist -bat shuayi -atmo spheres -ash urst -ant s -acu pressure -? ..... -. -- -whit lam -unab ated -u ky -tu bab -tear drops -sor orities -rekind led -qu ails -pat re -pad me -north allerton -n se -my nd -me gha -k fest -ima i -hy ang -fore du -ff un -favor ito -fashion designer -esz ka -disney sm -cheese cakes -cd k -bq quinn -:-) :-) -wic kes -un supported -squ inting -sam iz -pra gati -pk ats -nab o -like this -le scott -ku fball -kar imi -fl ink -eul er -dv d -da ke -bon in -bha va -bennet ts -ay cliffe -avali able -archi vists -al bar -çī Ī -à³ ĭ -wu f -wis in -trade govuk -sha fiq -rey k -phi fer -ow ry -n chs -mi strust -la chen -kal ki -je er -industri ous -iiii ii -for ked -dot news -desp at -dd ry -cycl onic -chief tains -ce des -bra yer -boo ba -blan keted -anti gu -alach ua -ðŁĴķ ðŁĺĬ -utilit arian -uss i -tantal ising -su hr -stri per -sal thill -re wing -ophon ic -o vember -ni ble -mc griff -ma hara -ju mla -ink well -i pt -honolu lu -green grass -fer net -ear muffs -d under -coted azur -bra ves -boy sen -asun cion -al ynn -ðŁĩºðŁĩ ¦ -ภł -yo day -vi bing -up do -uc ci -so do -si rah -seattle times -rp dr -reluct ance -pol ak -ot c -mcco ist -malay an -infe rences -in nis -ha shoah -h ga -giov anni -er ith -davin cis -compag nie -char less -blue bell -bern al -art therapy -al son -zan si -ye su -yan is -transcen ding -tommy flanagan -swal well -stick tennis -sp v -ro ms -ranjit rophy -progre so -pro bosc -nord schleife -mo jang -mill work -mase kela -laura bailey -kaz im -jaeger lecoultre -in is -hol ness -hit omi -gno l -gillette stadium -gett v -front end -di aper -d tt -country living -clo jure -clark county -bbcscot weather -ba thers -ac mi -abe okuta -ðŁijĮ ðŁĴķ -⼠ª -wanna one -un complicated -tyra banks -twitter land -tro u -tre a -tb aker -re drawing -no bodies -naom ic -md gs -mar wa -mar ly -made for -m de -la sters -jen elle -hairex tensions -green ville -ev h -ec ce -eatemu pkats -du ka -discolor ation -der mott -dc publicschools -clen ched -cart mel -brow ner -brainde ad -benevol ence -bel vo -bed worth -bab ly -auto dromo -at ak -armad ale -.. "@ -æľ Ģ -æ ¯ -to ver -tn p -there tte -teagas c -spar adise -solst ice -nott oo -n kc -my oung -mass aro -man av -hin do -h fd -fur yk -estudi antes -en ay -didd ley -cul led -comp as -cham pers -britann ica -bluer idge -bill ington -be funky -b ort -aw sm -ang gun -v ab -tol ley -the don -ted to -stro king -sm acc -shivar atri -sepul veda -ry del -poly morph -phy no -personal ise -o ing -nor ml -nerc science -mk dons -methodo logical -meas ly -landsc ap -kamp f -hel fer -gui zhou -gu ins -glengar ry -fo ghorn -est ella -embo dying -day bed -categor ically -bo yes -bench tm -beltand road -bead les -be stre -aric ci -afar ber -achri stie -ðŁĺĬ ) -ðŁįķðŁįķ ðŁįķ -x bone -worshi pper -tran som -sn elling -savit ri -sar miento -sab aton -re vocation -pd sa -mol ino -min ni -men y -mar at -macas kill -lj mu -li zzo -le aker -l ti -kimf coates -jit endra -jak ks -it zel -immer sing -hend ra -gold rick -giovin co -gal vez -food blogger -comedi enne -circuit americas -chamber sburg -bech del -à° ª -z ug -yak itori -walk ley -vocab ul -serendipit ous -sa dia -rug gi -roo ke -rit zy -resur faces -ren veen -re padam -rand burg -o vitch -nko si -motherwell fc -mo tul -mis interpreted -madi rakshi -le maire -jo you -instinc tively -hench men -haddon field -flavour ful -ex a -en al -el um -dow dy -do bb -cumber some -cervical cancer -buc ssport -bird watch -wr anglers -vi ña -vesti bular -sar ma -op g -nsm q -mag ny -kitch n -khan i -in x -hu ggy -he uss -he din -gn p -gau teng -cum be -conjec ture -carshal ton -bumble bee -black cats -ber yl -be mused -bal kan -at ron -ðŁĩµðŁĩ ± -าภ¢ -visit dublin -valent i -trampol ines -thenand now -ta hi -suss man -staff suni -slo ss -sinnfein ireland -sigh tedness -scar pa -ro ga -reen acting -po hl -plai sir -paralympic sgb -now t -mill stone -midr ange -le bat -kun ming -khur ram -kat amar -kale e -i shaan -hy gro -ho jo -go z -gar ni -gamer rter -fle ming -dv s -dru ze -done gan -deb at -carri er -ben ne -ar thurs -aly syarief -al hilal -af flu -ac una -ìĺ ¹ -ãĤ ĵ -yeah hhhh -xi ong -x man -wood haven -wan athan -ut ler -u manitoba -tweet the -top soil -tam angpanahon -starwars story -ru ba -pomo doro -per le -optimi zer -multil ateralism -mor phe -man ay -luxuri ously -kon ya -jess amine -iowac aucus -in ay -guardra il -gu tt -f pl -ern akulam -dimini shes -di sa -cort landt -coo lest -cas ita -cal vados -bo ying -blen z -bio similars -billu ps -billing sley -be res -be brave -assail ants -asak usa -an coats -ac te -æ·±å¤ľ ãģ® -ãĥ¼ãĥ « -your best -womens fiction -vibr ates -ve tri -tsitsi pas -t plf -stone ham -sq a -sk inst -ru sting -polic escotland -pet zl -more ton -k rock -jeffre ys -jad on -fu fa -fe v -donnar umma -cu jo -bun ty -brighton fringe -boling brook -ar oos -anant nag -am ando -am adou -ad dle -ðŁĽ ° -ðŁĮ ī -yn ne -wire tap -war hols -vivi er -virtu a -tv dsb -travel in -sun flower -retro viral -pre schooler -mu zzy -mdc ps -mary hill -mand alay -mah n -lil durk -lan den -la paz -ko te -jac inta -gun ny -elap sed -el son -del ap -de schu -cu eva -ci ampa -ca dia -ba iling -ay ay -ati ps -amorph ous -Ò ī -we tn -vi ver -tb in -super bugs -spac ed -sh lomo -se gas -sa is -roskil de -rag out -pie tr -o euvre -north brook -mc clar -ma su -m he -litt ler -li una -kno tty -holy land -h ku -gate keepers -fcc ca -far ma -de ka -ctv atlantic -cro zier -comedy club -co se -bryan fuller -aw wwww -ðĿIJ ¢ -ì¹´ ìĿ´ -zealo ts -vikas khanna -thel ook -terra pin -south ington -sj ö -segal ink -ring wald -pur suit -porter robinson -n jor -n able -music week -maneu ver -loc as -lat vala -jo esp -jill stein -je pson -jar omir -gre ener -gh lan -den na -cre vas -ca ja -but kus -barbecu ed -ban ia -ba shers -and als -ðŁļ į -à ¾ -Ùħ ع -za har -wa af -v uni -un hurt -sasharo iz -sar gas -rag weed -pri mers -persu asi -old town -na sim -mo sey -megab us -luci ous -lle ida -ku ka -ke sler -katy cats -juventusfc en -jale el -gri mac -form es -echo smith -dw f -deser tification -chat uchak -bol land -bec kett -bad boys -australi angp -amaz igh -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺįðŁĺį -ðŁİĵ ðŁİĵ -ìķĦ ìĬ¤íĬ¸ë -woo ing -wire frame -warwick uni -vere en -tag a -s dorf -ruther glen -ri gger -pu renew -ound le -ophthalmo logist -nov as -mess age -lang en -ki ke -jj j -instru ctive -im cr -hud l -hahahaha hha -h nc -grow ls -ffe d -extrac ellular -egal itarian -dere khough -casc ada -cand lewick -bra chi -bi shes -aspen ideas -aro ck -am gen -aguin aldo -wit wer -vi sta -taran tu -stor ie -stenhouse jr -skin ner -sj hl -sel fi -se ck -se basto -salt ash -re turners -po ach -paras ailing -pali o -ot ti -nav ya -man gala -lil uzi -l fs -kier kegaard -kei ki -hop sin -g linda -fun e -flying treasures -first dayoffall -feed feed -extrem ities -chow kidar -bright future -bra que -bodle ian -abb vie -wait resses -vo se -streu sel -squee zes -so ham -si skin -scri vener -pied ras -pan ts -oscar noms -os weiler -multin ationals -melis sag -leibo vitz -kit na -ki h -jan os -int led -industri alized -henri k -glo om -gilets jaunes -gar ratt -door darshan -cu vee -bu hr -bbcworld service -b ita -ausv sa -ard show -zero hedge -twilight zone -treas ury -swind ell -shaha dat -se ance -s lough -quer ying -plain view -pas co -p na -me tu -maxi mum -kur uk -kare v -ic f -hur tado -hiro ki -hac kett -gi spr -chit wan -chan tal -cann ae -band ar -an pr -ad ley -acivil war -ðŁĴ ¶ -water sheds -tol an -see thing -sain toftheday -reham khan -redsox nation -pol man -nicky byrne -new build -mn r -legion naires -kw ame -in lombardia -hur ghada -ge omor -fra c -fr fr -el z -e warren -counter culture -col ney -boondock saints -ble v -be proud -bar dem -alam w -ye tic -univers alist -tiffany andco -si ar -ser pong -propag ating -preneur ship -org ana -on da -neu en -ly coming -ku ga -indv sa -glee fully -fore boding -energ ise -dr congo -diamon dre -de sar -d vp -cuck oos -cop en -coo puk -camp bel -cal pe -ca shes -ber batov -band ito -bab ushka -as sos -artist s -an cora -akat suki -yearsand years -w tb -twee ting -tre l -transgre ssions -stru mming -someon eyou -ski athos -san on -saddle dome -runny mede -ru ms -poo ts -pardon my -new son -national boyfriend -melani el -mc carter -laurabailey vo -kn br -jop hie -ic se -hu ddle -gra zed -go blets -ff ner -cham el -cedar wood -car per -bex po -bakh ti -adverti sing -ðŁıĢ ðŁıĨ -ठ¶ -vicer ylle -ust fccca -sten gel -spear fishing -sheep le -p ke -nol and -mee eeee -mb ol -leon i -la than -kru m -kan agawa -gyneco logist -ga ap -flor is -eu logi -ef p -ec n -dee j -cyber men -cross an -coin treau -cody rhodes -chori sters -car ls -belle vue -asylum seekers -ðŁijį ðŁĺİ -íĻ ĺ -women day -trun ning -to god -tali esin -spo oning -ro ve -proxim al -mr bobbybones -maul din -kel is -kaf fir -iw m -il ai -go ssett -g Ãłidhlig -fly tying -f pu -est evan -dysp horia -dosto yevsky -decap itation -dai wa -cl anton -ci ut -ce menting -ag ara -ðŁIJ ľ -ðŁ¦ ij -ys z -wel led -u sso -tu li -tok us -the futurist -t illie -st itt -sofi acarson -scrib ner -rudi mental -robert kirkman -resi stors -re gon -ram ana -r nib -po du -no tes -mount sin -inhabit able -hu i -grom met -forthe city -fore stry -ding ers -dend ritic -d ins -brown stein -ay ahu -... â̦ -team coco -sunday lunch -sub tract -si ssy -sen ran -sapi en -ro go -ro f -reggi ano -re integration -re imagines -pl ices -ol on -ogle thorpe -objec ted -mr b -motor cars -mathe w -ma fi -lil ah -l pm -j balvin -inge stion -gu lies -grun ts -gior gio -gi ma -fre elibrary -fmp sd -fe is -far k -fal staff -expos é -donate aphoto -deci ma -cu c -cri eff -co sti -choo k -bridge water -bab bling -aureli o -architec turally -alt itudes -alfar ome -alderweire ld -yaht zee -ver raz -upper case -tro glo -te il -st legion -sli me -sin hala -sh uk -se ps -schen n -nc ss -mart ello -mar ka -khal e -intelligent sia -ic b -happ yn -epic games -edward barber -dy nat -colour pop -cal var -bur wood -bo dom -al tright -ãĤ ĭ -young min -trab zon -tra xx -sl ington -sim mered -ren fro -pu ke -phala en -nax al -mx r -mun iland -mac i -ior i -her p -fx networks -ec to -deb ina -chrisl hayes -cbs newyork -campbell town -bat esville -av it -ash wednesday -aco b -ðŁĺĤ ðŁĴ¯ -zi ad -wo tc -tu sh -the return -tem kin -suspen der -st j -st bat -spe kker -se án -quad rup -or os -moh sen -me jores -mcbride melissa -iri s -insul ate -holl ering -hear ns -gau ging -frosin one -fe bre -entr anced -elik kol -durgapu ja -disney xd -d max -cormor ants -cis c -chief keef -c wru -butter mere -bre tta -boycot ts -be al -à± ĭ -xanth in -wannab es -w me -tr at -too thy -tom ography -tin elli -th ack -sw ati -soda stream -pul sed -preserv ative -n ced -mon ad -mo bbing -mica ela -mar it -lor awan -khu da -jam o -jackson yb -ill ine -hor wich -hen sible -gol deyes -go or -fitness friday -f na -ett ner -echo cardio -dr phil -dema tha -cas cade -can yaman -box car -bar den -b nt -, : -ðŁļ ½ -ðŁIJ Ń -Ë ¡ -york s -un hrc -un funny -trump ers -tra k -today i -thesly stallone -tab ak -shi l -seg mented -se idel -ri ple -re man -nep tun -lie v -kw ad -he swall -goe sto -gad or -g ones -g had -fer gal -cu rable -cb cott -bu tta -brick house -beat ers -an m -# âĿ¤ï¸ı -venice beach -ved monton -team o -stedeli jk -purve yor -ponto toc -pit loch -orange theworld -o isin -nw bb -ni hr -naijap als -mark r -ko tori -heit kamp -hal pern -ha use -cor s -change maker -ai ke -a hahahahaha -à¶ ± -wil kin -wak in -v gma -un inspired -superbowl sunday -sport snation -son wheels -sha ik -sel ife -sat yar -restric ts -most beautiful -jor ia -jodor owsky -ic ho -homogene ous -hen kel -han kook -goh mert -godz illa -g we -g ative -ech os -diso bey -car milla -be head -ðŁĹ ³ï¸ı -ðŁĴģ âĢįâĻĢï¸ı -ìķĦìĬ¤íĬ¸ë ¡ľ -⼠µï¸ı -wer ner -steve martin -sn us -shr ine -shira zi -schnau zer -n ée -mat ting -ko bach -kevin spacey -keral atourism -kam iya -in nyc -green up -gi golo -gar lands -gam ec -floor boards -d gamer -coinci ded -buli mia -a starwarsstory -í ľ -âĺĢï¸ı ðŁĺİ -ಠ¯ -ç on -way yyy -takethe crown -stri b -serv al -sa vic -rown tree -mn ths -long ley -lagun abeach -kin folk -kap iti -kan tha -ev ah -disk on -dar lo -crystallo graphy -cou n -chocta ws -chis nall -cast leg -carab iner -c pa -brock well -ban bridge -. ãĢĤ -ðŁĩºðŁĩ¸ âĿ¤ï¸ı -wu ff -van den -un loads -theti ser -shop clues -ri si -procter gamble -pom pous -photo books -ph ic -mon clo -krav maga -keep fighting -k als -i ht -exacer bate -dh l -de sil -cat chand -bo te -all and -:) @ -... ??? -ðŁ¤· ðŁı»âĢįâĻĢï¸ı -wear it -underestim ating -u en -tw m -ta fa -scen eso -ru dely -real dj -per re -pe gula -par at -or ji -oluse gun -o tha -o af -loving blogs -late ef -lamin ating -kingof pop -james bourne -j gh -in ya -har ty -h py -gore tti -go team -follic le -explor atorium -e checs -dt k -climat ecrisis -can wait -brun er -beck oning -atherosc lerosis -all road -ðŁĶ Ī -wee hawken -ty rod -ti enes -tail ings -sur fing -stam ford -silli est -self driving -sco splay -sav ini -sa kit -rock of -re snick -que an -pic ci -om ac -melani ec -mccar ran -marion spekker -mag ill -mad cap -lie w -ko bold -kee ch -its great -har ring -gw ash -fire wire -fenu greek -exagger ate -down size -davi dro -comple menting -br inson -book marking -bo chy -aln wick -alek sandra -acon vention -ãĤ ² -yi dol -water line -v co -thom sen -scor ned -s martin -re union -re finishing -pu king -photom on -nr g -n lg -megapix els -learnto code -kuri haran -kis sward -inter sper -hi sten -hae chan -go won -gn ash -func tionally -e by -colla ge -chris delia -ang in -anc at -worl duk -wee ms -un ranked -traff icker -thru sters -ta wan -stü n -stephan opoulos -sp reps -sc ouse -sa hib -rec itals -promo tional -pan nier -mic he -me scal -mar rickville -mal aise -her rington -hallucin ating -h mg -grapp les -gl int -ge thard -g dg -ful via -fow les -esp er -en mity -dream scape -don ville -dab bling -d sh -cu ck -constitu tionday -consci ou -by way -barbar ap -an elli -ad vice -ðŁijı ðŁİī -âĤ Ĥ -б оР-yuk ata -yogan anda -way forward -uk ku -twi sters -tr illo -tire some -tho don -the jim -tat as -quin ce -quattro porte -pre ening -perfect wedding -pad dies -p ws -nick kyrgios -mumbai kar -mai read -l ations -jacinda ardern -his d -h mb -gi sele -gener alist -gel in -gas lighting -gainwith xtiandela -fre unde -flat ley -fabric io -expre ssion -duni ya -del ores -brou wer -bor ro -bmth official -ðŁ¤ ´ -ãĤ ĵ -under growth -tuesday tips -top news -til lage -sceneso fulster -prince george -pitloch ry -ol me -ok sana -na ha -meg acon -mat ica -kh q -kab b -fashion style -enrich es -craft brew -chair man -canes football -c inv -be sted -ba ia -ba che -at oes -acci dental -absolut ely -á ij -un spoilt -twee tin -ric heli -re trou -rat u -raj ni -ps ys -po sta -pes ce -michael buble -mc naughton -match stick -mach ar -mac dougall -lur k -loren zen -lore m -lit any -len k -kw ong -ju gular -jhel um -inescap able -ha zen -farmto table -estim ator -do seof -cri mcourt -campan ile -bri les -b hoo -ar gin -aq ib -am ending -al bin -agon izing -ðŁİ¶ ðŁİµ -twitch share -the ed -speci esday -r th -ply m -patriot snation -overwatch league -ori ya -ny quist -nick jacksonyb -mo thman -me mentos -love whatyoudo -loo ser -jan itorial -hemo globin -hass elt -galla cher -electro static -ed ch -annot ate -andl rai -aan andlrai -a inge -ðŁĹ£ ï¸ı -ðŁijĬ ðŁĴª -ðŁİ¸ ðŁİ¸ -è ¥ -years of -wu yifan -w up -theo dora -ter u -sil i -r wn -pont chartrain -on tana -mon ae -men ara -leve sque -kell ys -kay cee -k cac -jun ichi -joe manganiello -in america -hir su -graffiti art -gra fx -geor gios -g eric -focu son -esqu imalt -eas tham -drun ks -do ku -diag on -de fuse -con dit -chery lofficial -cast aways -c jc -bring onthe -back track -îIJĴ îIJĴ -ç ao -z ic -waven ey -tol les -to sser -silver back -sav an -rebel lion -random weather -our ne -neen ah -monte verdi -hill is -giz aka -ge ms -emerging tech -east end -dev yn -de humidifier -dau d -com ission -campi one -calam ities -as it -ar ney -ðŁĴķ ðŁĴĭ -ê ® -âĦ¢ : -zel da -yu suf -win dia -urin ating -the st -ste w -spring y -so ga -sardin ian -ro mer -p tar -o el -lle welyn -kyo cera -key shia -hopkin sville -green eville -exi ge -eric trump -e aly -at ale -/ \ -yric fm -wyn dham -umb rell -th s -t ented -sur names -shilpa shetty -rtel yricfm -recumb ent -re combin -pit ter -om ari -no ster -no gizaka -nig th -master work -love song -kozhi kode -jerry seinfeld -itv thismorning -i ai -give it -fu so -fre dy -dor k -dit is -cent e -ca ches -balven ie -an jaan -aj ide -z hiv -um ali -tre vi -track pad -t illy -sw o -south port -shopp ixels -sac kett -rantham bore -q as -pa olini -n lc -mu tch -mcke sson -mc ing -manu al -ma sher -illamas qua -i ww -hoste sses -grim ace -golf digest -gen dering -from within -eis ley -dur um -cr tc -con toured -book birthday -ald is -ab ú -ðŁ¥ © -zul ily -wac coe -util ity -swar med -sky tree -rm hc -pot pourri -plant life -mor rie -jock owill -j eng -im en -fly trap -eleven ses -dog gett -do po -ding wall -cup ca -col n -bic he -beat ncds -bad ge -aun tie -amer rell -âľĶï¸ı âľĶï¸ı -yves ant -web kinz -warri er -w of -tu ras -tin kle -terri fyingly -ter t -stu yvesant -sk us -river dance -revolution ising -par ing -pag al -mull ally -mck ellar -mc nish -le et -kur la -ken zie -journe ying -jen kin -hux table -hsi en -gra bbers -go leta -flav oring -fenway park -escar dio -ed da -clu ms -ci mb -bo dn -birthday cake -arc light -ðŁĺİ âĺĢï¸ı -ÅŁ e -z ef -whit elist -w azz -vi mal -ti har -specu lators -sin di -sheh la -road master -rat er -petti grew -palaz zo -over power -omar athon -no ora -mu kul -moon child -mon biot -logo type -lash kar -kau shal -ju jitsu -jor ginho -jockowill ink -ing out -haz leton -harri man -group love -dre gs -dil ation -de mary -dar lington -counter productive -castell anos -cas satt -carly fiorina -ca ines -burn ell -ar nica -. ðŁĺĢ -wo che -whitecol lar -tu tored -thal asse -star crossed -school days -ridge crest -re shma -public health -post master -pegas us -one spn -nicky romero -net zero -national geographic -mineral monday -medi as -like a -kwa k -ke pp -jordan peele -honor é -home stretch -hock en -ha en -gla ive -gany mede -franchi see -fab rica -elo ad -du rex -dou ala -bluec laws -best dressed -an andi -aic pa -ðŁijı ðŁijĮ -â̦ ! -zakyn thos -uru gan -uj jain -twitch yteam -tit mouse -thereal roseanne -tel lem -t anti -suppre ssant -suffra gist -su pran -racing post -paint work -of mind -nyc dailypics -nin er -nie meyer -n va -mur ti -maris ka -m gi -lit zer -klo k -kent state -jad akiss -han dof -han de -ger shon -ge kko -ga ja -fu hr -en zi -e pe -del auren -cur ragh -colon nade -be govic -aquare lle -aor ta -william sville -what not -vote btr -tor k -ti sa -tam mie -skysports newshq -si ge -shock proof -s research -reh man -q ade -pumpkin day -per on -mp b -megh na -materi alistic -lead enhall -lav ell -lac c -intl crimcourt -immu table -hat o -dw ts -cent r -bo di -bhoj puri -any ou -ahan nock -xox o -top notch -sal lam -sal afi -red rum -pon o -pis cina -on r -old days -mus well -merry christma -matthe wk -locker bie -ki i -ic pc -hendo polis -gal rani -finger style -dr seuss -collin s -aron ofsky -annn nd -ach other -è ¾ -ãĤ¸ãĥ £ -âĹ¼ ï¸ı -Ê · -win o -what ley -vint ners -t reads -stevemartin togo -sg x -roth bury -raj kumar -quad rang -pro publica -metaphor ically -mat ey -life after -ke mer -i etour -gou ge -g fi -frees at -fis d -elisa beth -eh le -ech ino -drive train -cór doba -cla ud -cl wyd -chaf finch -bla den -bad asses -aren o -am ita -ðŁĺĺ ðŁĴľ -ðŁijı ðŁĻĮ -wor s -weare wayne -w mn -victoria justice -tsa ww -tram ore -tecno logia -tap out -ste inem -social change -shu tu -ong allery -obsole scence -new tg -napp er -missing dog -mil ked -machu picchu -lv n -lolo lololol -li day -le moyne -kann apolis -jr h -inter mountain -ibm cloud -hang eng -fruit less -emphasi sing -divi ders -dh t -daft punk -bil as -anatoli an -ðŁĴĽ ⾨ -zeec inema -y ae -under fire -tuf te -stu mpy -rochester ny -prou k -preci pice -patri ka -mon de -lincoln city -iti onists -in ism -im m -ice fishing -duba imall -den so -dead pool -datac enters -darren rovell -d hol -co field -celebrate monday -cattle men -broo dy -broad hurst -bid vest -bal sa -ath el -an ke -an acortes -ad har -action aid -... ?! -ðŁĺĤ ðŁĺĬ -åĽ ŀ -w underground -view able -seclu sion -sali da -river dogs -re cline -quick ness -ol one -nx ne -l wf -ko ba -king stown -kevin richardson -kal ani -ju u -i us -gafe summit -estate agents -e mad -deme tri -born day -bent leys -! ðŁĺį -yedd yurappa -van gi -tristate wx -se molina -ro tarian -pou ssin -phosp ital -or de -okal oosa -newtg ingrich -me ar -lo pa -laidback luke -l fe -jefferson ville -h sb -gan assi -frédé ric -fli t -fla b -expect us -escap ades -discre pancies -clo ison -car sharing -cado gan -bird news -ba shment -ag rande -/ ) -ðŁĶ´ ðŁĶ´ -wit tering -waynes boro -tobo ggan -tn l -tho rens -tele pathic -sport sperson -sho bha -se ef -rit is -raghu ram -popl ar -pol onia -po tu -park ville -nomencl ature -nas cent -mtv news -mi dem -la sco -ku h -jay ate -ip g -ill or -hor rocks -ho co -gar forth -fr itos -fish monger -ebbs fleet -dru ck -del is -color guard -ble dis -av ni -as ker -arti sth -ac ast -, $ -ðŁĻĮ . -ì§Ħ ìĺģ -zo brist -za e -w pu -v rou -ut tra -torpedo ed -sur o -ste tter -seaf oam -sam sun -ring leader -resusc itate -rare bit -r gm -pointilli sm -pen fold -o aa -mc suk -ma ug -liveon wlos -kiwan uka -john tory -hyp no -ga hanna -fr ing -end al -en ation -dere ham -decor ative -customer success -ciene ga -ci marron -char o -card game -bra am -bom bo -bal in -aircraft forsale -ab ela -... !!!! -ðŁį» ðŁį»ðŁį» -âĺºï¸ı ðŁĺį -ا٠ĩ -wai lea -unitethe union -tippec anoe -sympathi ze -suppre sses -sinus itis -shale en -sac c -pro syndicate -pra vda -ph oops -off grid -novel ists -kx ip -kol ar -k ort -intern at -h plc -gu ss -gan nets -feels good -fan on -encu entro -devil ishly -cul pepper -cro quette -cho on -ban aras -bad in -ba ji -ari falvi -ai se -ðŁijıðŁı½ðŁijıðŁı½ ðŁijıðŁı½ -ðŁİ¶ " -wi ggy -tw u -tri partite -swa in -si van -re ham -per plexing -neve ren -morro wind -mono clonal -manu kau -ic ad -i at -hy wel -ger bera -g go -fra zzled -esc ul -el lef -dj fresh -confe ction -c gp -ast anglia -aldub nation -ad vic -ðŁijĮ âĿ¤ï¸ı -yu e -wy ler -wh ome -water less -uto pi -unquestion ably -salut ation -not ching -mans bridge -man tel -mali gn -lil ongwe -jon ge -iti zation -hunger strike -hol ter -hit the -f pv -dy brand -dun st -crumb ly -cr r -city scapes -cheap trick -catalo guing -born today -ban gui -ðŁĻĮ âĿ¤ï¸ı -win net -vi xx -un detectable -to co -team canon -seatur tles -santo sh -ro timi -rake sh -p illi -mon otone -m fa -m dd -luc man -kun z -kag ami -hometown hockey -giorg i -fl ings -eu lar -down wards -brae mar -ben ihana -be kaa -b ors -b nib -ar ko -." -@ -ðŁĴĥðŁı» ðŁĴĥðŁı» -îĢ ¢ -ìŀ ¬ -wladi mir -wash ing -u tero -tom an -super soul -su iko -sk ou -s museum -pi h -pen folds -parnas se -osoy oos -omni vore -ml u -mc minn -koda chrome -kno cker -harpersbazaar us -fit for -ep ine -e bu -dublincity uni -de bre -dav a -c gt -boy zi -adap tive -sto dd -shenando ah -s ella -run a -rickman sworth -re agents -prece de -pre meditated -poster deal -ou chi -one for -noti fies -n awa -mo by -middle sex -ket one -illumin ator -ghe art -fac tored -ess aou -en visions -davi dortiz -ca iman -brain wave -ba ine -ba illi -an ari -ak id -ab ry -ðŁĵ ĵ -ê³ ¤ -âļ½ï¸ı âĿ¤ï¸ı -vesta via -un subscribe -ste med -sp hero -sound stage -sol ari -scrun chie -regen sburg -pet friendly -n aff -mell itus -m wp -lump kin -liluzi vert -lets getit -lavish ly -laver ne -l ba -jiggly puff -jd mahama -jac opo -hermos illo -grou chy -gr nd -emb u -deb ase -cyg net -couturi er -can tile -buckey enation -bel monte -ar buckle -air tight -ðŁĴĸ # -⼠° -yeg cc -ye chury -that cham -tele marketing -tat chell -tai mur -sy doperahouse -re targeting -per missible -notre dam -mani kar -kel si -k pc -jurispru dence -jab alpur -il way -holly wills -hem poil -harvard health -h cf -fro sts -eaves dropping -cu zz -con ews -cle tus -beach wood -alicein chains -af ana -abbott abad -äº ķ -à® Ļ -zombi eland -un playable -tu o -super highway -stir rup -sri sh -se tx -rock bridge -re tails -quo d -purch asers -pen shoppe -pashtun s -pan ola -ou ettes -nai robi -menin blazers -long bottom -lo sc -kü stün -keralab lasters -kaf fe -jackal ope -is sn -in consistency -hug gies -hock ley -hedon ism -hack ing -good son -go jira -gil lett -ge ther -gad fly -fanta si -expan sion -enri quez -ef es -d li -carnit ine -bom bard -bod ys -be sigye -bas ara -aggrav ating -ad hering -ab rera -; @ -ë§Īë§Ī 무 -veti ver -tri athletes -su itor -shi kha -pun tos -p aged -one and -n wilson -n atty -maternal health -lat z -l nd -kal ai -ka sim -k ka -jean ette -in accuracies -ic x -hu elva -ho ch -gur un -gou ld -expatri ate -en jin -ed show -du cked -diffic ile -culture night -contain eri -cho pper -can vey -bas splayer -ai ello -acre w -a ahhh -ðŁĺĤðŁĺĤðŁĺĤ . -ðŁį ļ -ðŁĩ±ðŁĩ ° -ï£ « -w ens -transp ired -top side -skysports f -six flags -sh art -seasi ders -sas saf -pun cak -po b -pbs kids -passer by -parfu ms -p sd -ol low -ne ill -mo sse -mid d -mag u -li thi -ke aton -k won -ho x -eleg ans -ein horn -cu base -conce aled -bourne mouth -ab ata -travel life -thank god -relev ancy -of god -nu ttin -mic hy -martin elli -london fire -lin sey -kx an -in ada -hy mes -gar min -fun do -fox borough -fal setto -eliza be -e ston -cu buffs -co dw -cast lerock -car z -cal mac -boycot ted -bor th -bal ing -apocry pha -anz stadium -ade mola -ze sco -zam or -wel t -v alla -u ve -twitch creative -ta virus -strad broke -steme ducation -soder bergh -smo ck -slight ly -shoel ace -shab alala -sabras radio -s art -rockst areditor -red bud -real c -li oni -implement ations -hiroy uki -har well -gu any -fish friday -fi af -elic it -dli ssing -dis organized -buzz city -bo panna -bap homet -bah ria -avi k -ap ids -alamo dome -al cala -the east -the bi -speak out -so rel -sel ly -sch ofe -sa thi -rice university -re joining -pon tus -out liers -on able -md politics -lun n -logi stic -liske ard -letsgo ducks -l ha -kar ach -jet son -hur n -hern ández -gautam gambhir -e hhh -dun gey -dem is -defe ction -dagu er -chol ula -cav alli -capri ati -bol les -we aned -til ts -ti bbs -thor son -th yssen -quadrup led -pho tons -ny quil -irrepre ssible -inst ab -ii p -holiday ing -hee hee -gym pie -frene mies -fero city -exhib ited -environment alism -el lish -dol ant -cw b -confor to -b ny -az n -) ", -ðŁijı # -ðŁįģ ðŁįĤ -yan dex -vent nor -thin section -tao ist -takeak nee -si sto -sebasto pol -seas ick -sat yr -ro settes -nc cc -mont clair -micro focus -ma quette -kil main -je mi -gur jar -gold frapp -g ce -dont buy -di ssed -d model -cru shers -carpe ting -buffalo trace -art work -ar men -an sett -an ha -al ah -é º -è che -wes sel -val ve -tu v -tran salt -sol ym -singapore air -sch ap -revit alized -reg is -priorit ising -min ny -mi dri -mcmaster u -loo g -kon i -know le -kin ders -internation alization -i he -fab lab -ed filmfest -dad on -credit union -ci ent -che ta -be kah -batt aglia -ag ny -ðŁĴĹ @ -âĿ¤âĿ¤ âĿ¤ -x le -son top -so ko -powhat an -pe try -our ts -mo chrie -lau drup -l co -k cl -hi ye -handmaid stale -f end -diade m -d hara -case miro -bud dah -ano vic -ad sb -ðŁ¥³ ðŁ¥³ -� � -æ Ł -zam bales -wheat en -v scot -the legend -pri mos -pri madonna -pri ddy -pas i -official marko -must watch -lou yanong -la batt -jag ga -iti m -i ha -h pr -gal d -founders brewing -ep ers -e spark -clou gh -c tic -bha gy -abo at -ðŁijĩ ðŁı¿ -ç ļ -е н -zoom in -z oil -xbox onex -wa aa -tis rael -sw art -subpo enas -stu ckey -sor did -sic ario -sant é -rog elio -radic alism -play bold -p elli -op ta -nu l -norm and -ni shan -metro losangeles -medal ofhonor -ma iam -ley den -koko da -impregn ated -im ents -gw t -gar ri -edge hill -e cet -d cy -cu esta -col lie -cali sta -boxer dog -bishop sgate -avent urine -att weet -ak kara -ðŁĴī ðŁĴī -work mates -wal lof -town beer -south shore -roof er -rib fest -ri et -reimbur sed -ra zi -prayer ful -po pa -paignton zoo -out fitter -ni hal -m fd -killu a -kc ca -iron de -h ita -ei lean -e gr -din sider -di stance -de shawn -dart mouth -cinnab ar -boo ze -bi det -! ^^ -vach eron -uttox eter -ur fa -uno cha -tri stram -ten ough -stam endment -siski you -ser ing -scottho ying -rag brai -pay day -o gl -mcstu ffins -lbor ouniversity -kill inge -imiss you -graham rahal -flip grid -electric cars -city line -br annan -bad la -av ola -annie mac -ad one -.... .! -ðŁĺ«ðŁĺ« ðŁĺ« -Ñĥ ÑĪ -wild food -wic om -war ping -walu igi -vi agem -tr oughs -speci fying -say aka -piercethe veil -orig en -nh d -ma wx -la han -k Äģ -is better -inhib iting -i wu -holy wood -h fd -goosen eck -ga ine -g our -fm sa -f also -ey news -elope ment -dew point -che tty -ca org -bas qu -am ra -after shocks -tyler perry -tread mills -then y -terri fies -stor r -statu ary -sl tchat -shuffle board -serv ation -sc our -sam cro -rif kin -rebe ca -re tweeters -peanut butter -ni ah -national beerday -nas ci -mous er -me ji -lea rena -kristen sen -ino e -he mmer -grac evander -goo ch -go socceroos -go j -e tal -domest ication -do zing -dev net -b mar -amb az -air bu -acol lier -ðŁĵ ĥ -ðŁĴ ® -èªķçĶŁ ç¥Ń -west chester -un friended -uk raine -toll way -the americans -sty dia -stein metz -sar ong -sab ir -nieu we -mor mont -marry me -ma plin -kni k -kni fed -kash thefuturist -ih f -g wil -fun n -dianna agron -bry anc -blues y -anton ella -an ar -ðŁĺŃ ðŁĴĹ -ðŁij ³ -ðŁİĵ ðŁİī -ਠ¸ -ye hu -wil bon -to tten -ti zation -ssi s -sh anti -sare gam -samaj wadi -rot ted -realtor life -qu alls -perez hilton -om gb -never settle -nationalboyfriend day -matthar dybrand -mart z -lovel ier -leg omovie -lat rell -je sh -iam diddy -hypo chondri -ho ppe -great night -firestone walker -engv sa -dr k -di of -counterfe iting -counter attack -c wc -be shear -ar chang -al mas -ag oo -ðŁĻĮðŁı¼ ðŁĻĮðŁı¼ðŁĻĮðŁı¼ -ðŁĩ±ðŁĩ » -z oll -ton da -te shwar -su ara -ste mon -se moga -sau kee -sage brush -running day -ru eda -re install -rancher os -quean bey -our home -obse ssively -mike e -ke x -k ila -in wards -ill man -he ske -hasle mere -free birds -dist anced -clich y -cen sure -cb gb -b ateau -aspart ame -alti eri -ad mu -ðŁĴķðŁĴķ ðŁĴķðŁĴķðŁĴķ -ãģĵãĤĮ èģ´ãģĦ -whoopi goldberg -the chew -thak ur -tele text -su tro -spo tt -sa iz -rak ash -prismacol or -penn jillette -one gin -molo tov -mat sunaga -ma ir -kristen bell -kil by -ki z -ine ss -in cul -immun isation -hur tigru -hur rell -holocaustre mem -he me -girl sbball -ger al -fo or -earth works -dic tation -di one -dead head -de ts -bru le -ave dra -at rust -amp as -> :( -t vin -signi fying -pon ce -n gh -mon grel -mo sko -mil ind -jor d -j df -ide olo -hari haran -han bok -g ander -et c -dere ck -ce ca -cau sally -car rol -bbc cornwall -ap co -antigon ish -allo f -aldubeb tamangpanahon -warby parker -wam u -trader joes -ter an -stock yards -soon er -season al -pra gue -most ly -medi am -kul fi -kor tri -j mb -i yan -hershe ys -her be -entr at -dur kan -digital trends -cot terill -chante relle -cen ote -cantstop wontstop -bro mpton -british cycling -bo of -bo cas -bayreu th -b oud -ayo tzin -aw ing -al ans -agra phics -ago e -ê¹Ģìŀ¬ ì¤ij -ye vans -wy mond -wu xi -vil sack -un processed -se quality -s foundation -s bts -pho g -pang s -oc b -makeover monday -loner gan -live streamed -lister ine -ku be -joe perry -iron clad -hur ls -gro ening -ff x -e set -dian amary -cyber tron -clem ence -c we -ber gin -belli ssima -a op -welove bath -up v -un consciously -the avett -tashan eishq -tari fa -t á -sport car -song sinfo -snar l -sho ves -sco tref -reli shes -prob ationary -pre ity -park head -mazer unner -lin ed -kan ak -ich u -i et -hy pere -heide gger -g ms -esteel auder -ec ook -do ws -cra yon -classic ism -ch ail -cello phane -cathar sis -bri stle -bra thwaite -boo o -ba az -ar vi -ald red -ag ama -you can -visit bath -v fs -trust pilot -stree twise -random ised -r sw -pur pu -perman ence -otol aryngo -me gumi -may pole -lo dg -lan tau -kuro da -kill switch -its jeremyscott -infar ction -gul lit -go shawk -geno type -g ó -fal tering -du ms -de be -corner stone -chert sey -bul u -bu tting -bol dt -bo ser -bay sox -al ph -ab lett -ãĥķãĤ© ãĥŃ -ÙĪ ÙĨ -wire tapping -tom eu -shapp ening -rev war -qhu beka -pla ine -or adio -maynoo th -lo td -lets gom -lee ches -larry fitzgerald -ju le -jrs bbq -humb leness -harve sters -groo te -go saints -dru zy -de ws -dag ga -con tu -bbcn wt -arts fest -anci c -yan go -woo dridge -triple crown -the ft -t ton -summer iscoming -sub text -so ori -sarah m -refriger ant -real preityzinta -re sourcing -pol amalu -out land -nihil ism -naw al -marig olds -m ite -gu ti -gro sses -geni ality -fear ne -eu referendum -ehlers dan -dig ne -cre em -co design -blon die -abbe ville -ðŁĺĺ ðŁĴĸ -âĶ ³ -w fl -un flinching -trump is -ton ton -thinsection thursday -t tam -sun land -sr j -se ast -re pped -r studio -quarant ined -pbc sd -outer hebrides -outdoor living -off re -neg ation -mm ering -martin freeman -man cup -mac ewan -lobla ws -lin ke -kav ya -kam la -k lo -histen vscot -han gry -green wood -gar in -flori sts -flash dance -fe scue -dic ey -deci mals -chris froome -cdn health -brit a -bono bos -bl ay -bil lets -ber na -barley wine -apit ol -abb formulae -⼠ı -ਠ¤ -zieg feld -winter bottom -vo cs -tou jours -team er -te em -rohing yas -ra ba -pasorob les -n cube -mel in -mega watts -medical device -kuan lin -kinder morgan -impac to -gom er -fu taba -fu shimi -emb o -elu ded -ed man -discre etly -dan afarber -cypri ots -cot illion -boister ous -be ee -appomat tox -am strad -am ers -al tro -abhin andan -wwe tlc -work site -womenin leadership -williams ruto -v rt -trede gar -tay y -sf old -se te -ril akkuma -palm trees -na day -mil in -mas ada -mad res -live and -ktg tool -fir man -etsym ktgtool -dren the -daz ai -ctv montreal -cre asey -ci en -bor as -beem ji -and ries -ach amber -ðŁĸ ĭ -Ã¥ land -wink les -wallpaper wednesday -walk ability -w amp -tre tweets -transfer news -thevampire slayer -srimanthu du -shu bh -shrews bury -rei dy -que sting -pun a -par cours -pan jabi -ori ente -opp y -ne em -magsay say -m tech -m ended -london live -log ÃŃa -leaf sforever -kry stle -krist ine -issu arez -insan e -employment law -comp ounded -clin cher -carr é -bethe one -beach volleyball -ðŁĺĤðŁĺĤ # -x press -victor i -tm gt -sulph ate -si mages -ri ffing -ni guel -ne ke -mouth feel -main net -mac tan -ke met -john shop -inter dependence -humor ist -hawk girl -gu yer -fi des -fab b -dele o -dairy queen -bartol i -anor ak - ¾ -y anga -wood men -wh is -wade bridge -vindic ation -v so -uw bb -u in -th z -sun life -su as -steam whistle -spoke mon -spaghet ti -snicker doodle -pan ik -on music -north we -meach am -lin nea -kun ingan -kann an -ith ia -id night -humboldt broncos -hick ok -hershey park -ge ol -freder ica -flu oro -ex uma -dro ols -dispar aging -con air -cler k -bu ick -bi du -as ync -argu ment -an stey -wait for -vz la -ver a -vand a -u ot -tur ke -the creator -te arooms -tam as -t shirtday -sou bry -sand castles -re mixing -pleasant ville -phi le -park wood -o gc -n cap -moris ot -mo hs -mary dale -mam avote -kap alua -justin bieber -hal sall -greate scape -far myard -empowering women -bra him -black burn -biaf ran -bar be -aff able -ó nica -zombies run -wi der -wh ence -vig our -tu bal -stock piling -stan ton -shaf ted -phra sal -o ÄŁlu -mo wat -mascar as -mark levin -lion head -j nk -j ati -he mming -gr ice -ga it -es wara -el ora -ehr lich -drawthis inyour -deu ce -dan ge -coming outday -b ise -am ad -aldu bang -al insky -aggre ssions -abbrevi ations -wol dt -vh sl -trueto atlanta -theloud house -sub ha -stat s -stanis las -stag ger -self build -saha bat -s bo -recap it -rajni kanth -puri st -paul stanley -nau lt -msg networks -mon ts -mo selle -michael strahan -le may -ky speedway -kiri bati -infin eon -ilau per -hg se -henri kh -gc as -fi bs -fain tly -encapsul ation -dham i -de mer -cynd ilauper -brisbane tennis -boss anova -arom atics -ðŁı´ âĢį -à´ Ĥ -yo d -x fre -un concerned -tu am -to gram -tar kovsky -syl het -sy mph -ste g -school boys -scho ck -sch ill -sas sa -sas i -ree led -re hydration -psy chon -pro ffe -pon zu -play testing -official asroma -n anny -mon ie -meg ach -lo wes -kot tay -kai den -k gal -inter fered -hydro cephalus -ho fe -green well -ge urope -fried lander -flick ed -fishing life -dyna stic -digital humanities -di vino -dail yui -coral reef -cit rus -chow dhry -capac ity -bro yles -ber isha -austin dillon -:) # -ç » -ste mi -shoto kan -sh xt -sem rush -poly ps -pap ag -mo dot -marketing digital -mal lows -lad ner -inver ters -im pair -frost burg -fin is -enchan tress -em ol -d kk -clean room -cit inews -c ck -beat mania -b ican -ali ef -al bee -âĿ¤ï¸ıðŁ§¡ ðŁĴĽðŁĴļðŁĴĻðŁĴľ -üyü küstün -ze v -ygg dra -y upp -web designer -ve tter -tune up -tri ffi -teng ah -spi ker -silen cio -sat ara -roll call -red cliffe -re routed -ran k -ps news -per so -n radio -n cri -mun ros -mitch grassi -mis er -mil hist -mar otta -mac edo -lo am -kim a -kenne bunk -kati punan -in wed -highland park -far ms -engul fs -chym al -catho de -back board -attach é -ane wh -akhil akkineni -è ¿ -w lan -tend on -suvar nab -strou d -signat ories -reedtimmer tvn -my t -mohegan sun -ml f -marmo set -letterbox d -lane gan -is caring -inst illing -ine jad -higgin botham -gai ag -four thbewithyou -forti fications -dj p -dige stible -dic h -bath letics -ayahu asca -z cash -yan kton -wendy williams -twom ey -ti x -tar nish -super lig -sle ft -refugee week -ra st -pan ova -nectar ines -mao ists -make it -made jski -jah re -itas ca -iam su -honour ary -ho ve -hin ojo -from is -fl atul -down wind -dom ini -dark art -cp w -ci dade -che gg -cas am -ca reless -buffy thevampireslayer -boreham wood -bc tf -ðŁĺĶ ðŁĴĶ -world star -ur ine -sunburn festival -strang eness -snyder cut -ser ums -screw ball -sauvi gnon -rust lers -rag land -q ed -po va -past imes -over stated -os l -ne cc -me ed -marydale entrat -lv mpd -lin q -ja anu -ick y -i ghter -how toge -guy fieri -gro ans -ell oni -ele k -dax ter -cor sic -bread sticks -andreww k -ai st -ãĥ ¦ -âĿ¤ï¸ı ðŁĴĽ -าภ£ -wa shoe -ver is -spoo py -spe ws -spark man -snee zes -sn hu -silver dale -seth meyers -sensiti zed -sen yor -san ton -s fe -rosal yn -play adel -pe ale -ovi ya -newcastle jetsfc -mun dine -meetand greet -m bia -looks like -jo vi -jimmy choo -j ls -isu mmit -heritage week -e chuca -dro ga -dream warrior -ce ren -captainameric acivilwar -capit alized -broad water -blu est -be ppe -bar dsley -zild jian -ye mi -weigh ty -vas ant -tu tto -tex tural -te b -tag ma -streng thin -step ney -sta u -sli pper -sel loff -radio logists -mole sey -laver ty -lan er -ky humane -katamar ayu -hay lie -god ha -exc itable -e gov -dis arm -chak rav -business week -bil son -ðŁļ Ķ -ðŁĴļ âĿ¤ -ìĦ± ìļ° -wu stl -wr angle -ve ers -val polic -true man -timbuk tu -sch ris -sam s -sam in -salt burn -re affirming -pu ffer -pp b -po yet -par ia -p life -ow ww -mono tony -lon avala -l cc -kir st -ju sty -jan ec -is ay -ino u -inci sion -ha segawa -gust avo -fn ce -fag en -eric fisher -eng rish -dino vember -dharam shala -deutsche bank -best jo --____ - -ðŁĶ ¼ -ðŁį· ðŁį· -ðĿIJŀ ðĿIJ -ula an -typho ons -tree tops -spra ggan -sb x -retur nees -r ila -pro ff -play pen -performing arts -newar tist -nd lovu -nascar playoffs -mur rell -maren go -ma kenzie -k ays -jun ction -jhal ak -ired ell -i der -glo bu -for res -fon tina -feel slike -es n -epitom izes -e tive -disp elling -db x -cro marty -co que -clip studiop -cher as -ca os -c pd -bomba stic -bed sheet -av ca -ac im -aay yub -za o -vo cm -va sec -tic ians -thom ond -sta at -sm un -sep si -re ton -pun g -peri ences -pel ting -pay checks -ome dia -o ban -o ake -nh wx -multil ayer -morpho logical -media set -fran cona -flat mates -eu gen -elrey network -digital skills -cross walks -col ten -bv b -aw wa -andy black -anand mahindra -è » -à¹Ħà¸ Ĺ -ú a -z enger -yn w -yel chin -x plore -woun ded -t fully -sv n -sky bound -shu bert -sg l -se de -san ews -ri ds -pu chong -ost ent -live tv -keegan allen -inver sely -gle aned -f hi -edu tech -dy stonia -del r -dar rell -cor am -bou les -be vo -ar nott -anci en -alo of -water stones -u buffalo -sweat shop -sto icism -spot ted -show box -read ability -rav age -raj e -r ze -py r -mip com -mi edo -mcdonnell mp -john mcdonnellmp -head first -glu ck -for india -fon terra -fill more -du ero -cam il -anthropo genic -and sara -amandat apping -al lee -èĹ ¤ -y sp -y hu -winter thur -trabzon spor -sumat era -sta i -six pack -rum ney -re style -ple gic -pal lotta -music therapy -metal heads -maythe fourthbewithyou -matth dgamer -magi d -le pen -l sr -kim s -kala ign -jun co -jamie foxx -it ates -imagine ering -il son -go snell -glen ville -gam ble -fibre glass -el dar -doing it -classic tv -boo lean -ba yof -b ster -art scape -aj p -zind agi -visit cz -verraz ano -un scented -uhur a -thevamps brad -then ame -sh ama -serious ly -sas m -rose of -red foo -ra chi -r bf -q al -orlando pirates -mor ra -mission impossible -me hl -j elle -hilde gard -ge eth -g nd -fro sty -family friendly -chris stapleton -cb cradio -cacci atore -bur ne -bak tan -aussie grit -astro world -archit onic -an col -alban o -wil kin -vindic tive -troglo dy -ti sci -standup for -sm tv -relais chateaux -propen sity -mmmm mmmm -li ppo -gett in -get better -fil ia -em ilion -e sen -dol in -cityof vancouver -cal oun -cairngor m -bay hawks -ate er -amer it -âļªï¸ı ðŁĶµ -vi st -tit ic -sur rep -sty linson -stu sa -stego saurus -sonam kapoor -sau cep -rat aj -pv l -pike ville -pando cruises -ny phil -news space -nand ita -n du -megam ix -m musi -lmfa oooooo -jeff flake -j anne -ir n -implo de -ger da -fi ras -cra gg -con fig -cle ave -ch anna -ca stration -bor gata -bellige rent -as cs -ab kiba -âļłï¸ı âļłï¸ı -wom w -ti ous -te sh -syl vain -summar ising -soccer aid -sk or -ra om -oe il -north norfolk -mo ët -mjol nir -litt lerock -le var -le pt -kelly rowland -k hul -jo kic -io an -hedge funds -ging a -gi otto -do ink -dianamary sharpton -cow den -com d -chon dro -cal eg -c sh -ber ns -americ andream -wa ster -v ons -t fg -sud ha -stoo ge -spl ace -so chi -seal ants -photom ag -pedag oo -mc muffin -mammo grams -lat ure -i in -gram pians -gemm ell -for ager -ev illage -de toured -day fiance -cor ry -con notations -ch ink -biker un -ar ima -ado on -ìļ © -ãĥ« ãĥ -иР¸ -Ä Ļ -whywe do -villar real -twy ford -thelo cal -tc cc -squee ze -si sson -scoundre l -sam mi -planet newsspace -peek skill -p cr -one india -near pod -ms ba -malay alam -jail broken -jag gi -grou pe -go bulls -gi ds -g fe -fra ga -fox tail -fitness goals -fero ze -evolu tions -en trust -ecu rie -den pasar -culmin ated -confis cation -ci oc -chem nitz -bron cho -agu ero -.... ...# -æ £ -ãĤ¢ ãĤ¤ -ãģ¦ãĤ ĭãĤ -valentine s -turksand caicos -tubab üyüküstün -tour ing -ta von -stay positive -star rs -sa af -ro isin -pollin ate -plan ecrash -phoen ician -o des -mt z -mau ro -manag e -lafit te -l sf -ki ka -house guest -hispan ici -fin tan -dead liest -ctv windsor -cop p -coon awar -come froma -chel ly -charn wood -ch up -brown ed -ar amark -aerop lanes -z elle -willand grace -watson ottawa -v elli -un recognisable -to ti -ti bi -talk live -so st -show tim -ser co -re tort -pd ate -moren cy -mor ita -mil pitas -men udo -manag ed -m wm -kh saa -intern acion -incar nations -helle bore -gas a -as ra -alternative facts -alca zar -ðŁĴ¸ ðŁĴ¸ðŁĴ¸ -á¹ ĩ -ve sey -underthe stars -tre bu -thisi sa -sp azio -sau dades -ruf ous -represent ationmatters -re wrote -ram esses -profe ssed -pay ette -pa quette -ontari oparks -nam ish -mill in -men dip -man es -jic hang -ja ide -ice a -hos ny -glu tton -es ke -es fc -cabo sanlucas -bla ine -big fm -ben salem -bc m -ame obi -: [ -Ê Ģ -wi es -wak ulla -thelibr arians -the bo -strong sville -sportsman like -spe aring -skri pal -sc aggs -repub blica -q asr -pix ect -op har -ontari op -national lottery -ko ss -k lassen -k ere -jungle book -jav an -intervie wee -home maker -ham ara -ha ssett -gar ages -frank sinatra -fin ning -england hockey -df n -dan ske -d pg -craz ily -com patriots -but an -bor thwick -bel anger -anu sha -an b -al mighty -âĻ ¨ï¸ı -va stav -tis ans -te yana -tay to -stay lor -schen k -sanc erre -recy cling -priyan kac -pau lma -mu see -monte fiore -mmusi maimane -load out -kis an -k los -jim watsonottawa -ilo vers -i ate -hun ga -holiday shopping -h pu -glo ssier -form work -fir dous -far well -falcon pride -en our -craftbeer hour -co ren -cat on -car news -c isa -bam f -ad k -a hari -ðŁĻĢ ðŁĻĢ -wall flowers -visual arts -turk men -tanquer ay -sol des -sla dy -sch nee -sar ina -rick grimes -revolution ised -pu gets -pra ga -post ables -mt scores -moder na -min are -mar ula -man tic -long listed -llu via -lawren son -lament able -kil dare -fr and -dri dge -devon days -de gea -dar c -dang an -dal is -coral reefs -con gee -col bie -bo ji -be sity -barn well -ak zon -ĥâĸĥâĸ ĥâĸĥâĸ -Ø§Ø ² -wolf ville -um news -tran ada -tin sel -tar ah -son gh -skill set -see red -sad hu -ros anne -rober tir -po zz -po we -nb p -lasor da -l sb -kun dan -ke b -ja ques -ind superleague -in oc -haku sho -gri eves -gov ph -gi kwang -f mp -eni or -ditch book -cut scene -bergha us -bander snatch -ant ena -an adar -agap anthus -íĤ ¤ -thur ber -thoro good -spe zia -sh eckler -sea ham -sc aa -re learn -punctu ality -prop eller -prayfor paris -pen se -p caa -os er -nam ib -mic hu -mcclo skey -mac laine -legu me -la ba -kc star -ir cuit -iam rashmika -he ol -ground skeeper -flower pot -f mb -e online -du bose -di atri -corn ering -chi ari -cad ena -cab an -bussel ton -brock le -big ly -au kerman -y ellin -wal der -ut leg -tahle quah -shat tuck -se min -rosen feld -republic of -ren aul -re star -ok ine -n naji -mumbaim irror -mar joram -ki elder -jump y -john sons -iran regimechange -in bloom -hom iny -ho ssa -hal as -ey c -eff ler -dynam ix -di vot -den sities -conceal ment -cha v -buri als -bs official -bloomsbury books -armid ale -ador no -$ / -ðŁ¤ · -x wb -uc sandiego -team liquid -taze well -stefan o -ramsay z -people power -north sea -neo dymium -multit alented -m els -losange les -kh u -jo yl -idy ll -houseof lords -en gram -diver ged -dheer aj -dash on -d abo -cra bbing -cr ony -cor rs -christmass ale -am supdates -allyou nee -ðŁĵ Ħ -ti bi -ryan lochte -roysoc chem -ro ddy -por tre -ol av -oh m -o dac -newh art -nbc chicago -n no -mont parnasse -mid ges -melbourne fc -marin ecorps -magicrock brewco -lu da -kay lie -i pac -hed nes -hand els -gameover greggy -frau en -fe as -erici dle -end ura -e hi -diarmu id -cp n -blue bombers -anat ole -ab bie -. (: -åħ ¥ -ãĥĥ ãĤ¯ -ü h -yam agata -vin as -vi di -thro bs -the journey -reli efs -quiz let -preco cious -pre fall -por ation -pe irce -ox x -no gi -mallo famerica -mack ay -kin card -ke g -kam m -is af -gol maal -giveblood nhs -gha stly -gh illie -fo bs -earth worms -deo dato -craw dads -bobb ins -beile in -az ul -alab s -ach em -... ðŁĺĬ -ðŁijī ðŁı¼ -tor iyama -tnt drama -sherrod brown -scru tine -r gt -poo ps -obtu se -ny kaa -mul ching -makin ghistory -latte art -laken heath -jet stream -ir by -guine vere -fion a -eni ghts -de ped -cat girl -carnegiem ellon -vill ers -uchi da -ski v -si fu -sc a -sbspop asia -s ape -plane tearth -pic os -pet z -parsi pp -metac ritic -lu sting -le tty -in humanity -ima an -haw ke -graven hurst -grand i -glu tam -en gie -devin nunes -dev fest -cur ving -bud ha -ave o -atalbihariv ajpayee -ao ka -agu st -adri el -aco splay -* ¨ -ìķ Ī -ãĢIJ # -za die -wat ney -washington ian -unfor given -u oc -tax on -sul k -squat ter -sp asm -side bottom -shut downs -sand bag -run with -re producing -r br -pal ast -op io -novoro ssi -nin aturner -me shu -ky d -ju rist -jen nab -jami at -in chem -hy bris -gracevander waal -dav on -dak ah -care ers -carbon ite -car ley -bun a -bal four -amazon video -al cor -ac is -ðŁĺĤ ðŁĴĻ -ðŁį· # -ð٤ŀ ðŁı½ -ìĥ¤ìĿ´ ëĭĪ -åIJ į -⼠½ï¸ı -wee ded -v tol -temp ers -sc ute -saf dar -reha bbing -purenew zealand -pul liam -publi b -pri sma -poun cey -polit eness -mccl at -maggi el -kil mac -juic eplus -it sha -i fa -i ava -hir t -hak one -fac tually -explore more -ell c -discover tasmania -day lights -cosmon auts -cer rito -burgess dave -bron chos -ap ter -ani mus -ale g -ab ag -ðŁĺħ ) -wo ky -wag ers -wa as -van go -un refined -u streasury -trum prally -too ele -t acked -soldby auctions -sk ank -sirac usa -pu mm -prote us -parach utes -or nothing -olympi atheatre -mus kies -making memories -li ard -ge mb -g ch -fr its -eu stis -esc congress -emotional intelligence -di mmed -culo ttes -chall is -cer ner -books thatmatter -bo das -aperiti vo -ad ice -ðŁĺķ ðŁĺķ -ãģ Ĭãģ -zip p -your mind -whe ad -v ap -u co -trav chat -thuman ity -te abreak -szcz esny -synchron ization -su stran -ssi o -ske cher -sati sh -reconc iling -rec tified -ra wi -petro bras -nu dges -nom us -mor ag -mag de -hr l -hel mer -h lp -fear on -fa strack -euro gamer -drunken ness -div ar -den nard -d cli -conserv atoire -club app -bu ty -bloom ber -bart els -bam ako -angel as -اÙĦ Ø´ -Ì Ĭ -u za -thupp akki -shu te -sandra bland -s assi -re play -pasi fika -p vi -monstro sities -malay sian -macca bees -ki ps -imper ator -gam bo -g pac -eloun or -bha g -ิ à¹Ī -whit sundays -voy agers -river head -non partisan -muri el -matsu yama -maje stically -macro phages -insu fficiency -inhab iting -ilooklike asurgeon -high smith -guitar ra -goti ges -flu ential -fai led -fac man -de ten -clement ines -chu u -carolin elucas -bre be -bigg le -ajay maken -affo gato -ac abo -ðŁĺį ðŁĺı -yu ga -will mott -wheel ies -wee l -wb ina -squ ids -skeem saam -scar cely -proud mama -poc keted -plac entia -penn zoil -paulstanley live -nak ano -mir zas -mcke ever -mc michael -mc flurry -m dn -lion sofficial -lily ach -le louch -indi gnation -horse head -frie sian -food drink -eval ley -eric church -drum set -co rel -brze zinski -bit sch -banned book -alar sson -abscbn news -yebo ah -wehr macht -w out -uk nikon -tar heels -sw y -southern charm -sof ty -smi there -sk impy -sk ane -seatur tle -se ely -s fund -s da -pois oni -ok an -mn n -k any -im possibility -ico tin -ho cks -hed berg -head stock -he aped -flo ss -eng lander -delinqu ency -debut ants -crystal palace -conven tionally -cich lid -car mody -boyzi imen -both vote -atat ürk -ann ag -ank sha -air o -abra xton -ðŁĺ³ ðŁĺį -ðŁij ŀ -âĺ ł -youn tville -y air -v cd -tv f -te gel -stor rs -si han -shi fa -shaz ia -q az -picture cumbria -pass more -pa ined -pa bebe -mar rs -lu y -ju x -jam at -happy thursday -guing amp -grand daddy -f aya -daruss alam -bol zano -bol din -bar is -ax n -ali as -under pin -tu to -tall i -styli sed -simp kins -santam onic -ry lance -preserv ation -ppy grewal -pix er -om t -oireach tas -obste tr -namish taneja -na res -miro tic -mini me -m ta -kaise ki -ities news -hay ling -government shutdown -go wildcats -ey er -dra win -dol f -discover on -di bble -del la -d jones -crun ches -clo p -ban yu -bali stic -ba at -as alonga -an tuk -alber ti -? ðŁĺı -ðŁij Ķ -ðŁ¥ ĺ -ìĪĺ íĺĦ -wa ir -unevent ful -unbe arab -sin os -scottish borders -q o -puri fiers -por i -pl ena -no pd -nj siaa -neu schwan -neck er -mun tin -mill z -ma ith -lost dogs -ld jam -laugh er -k ml -jal sauk -irrit ates -il us -hr h -hope for -ham line -ha be -google analytics -god spell -ge x -edu n -dreamwarrior pic -dave mustaine -che yne -cel so -cal umni -besti ary -bankof england -bab ie -awil de -ad achi -unir dg -tu chel -then est -swar aj -sedge field -resor t -qur anic -qual ms -ok on -nak ai -na oko -macau ley -locu sts -leve son -le sa -le oni -juven il -j ere -iv c -in ane -h acc -guyan ese -gor tat -goal ball -go kul -gho strider -eddie redmayne -ed int -cor tney -claw sup -ba ar -at ap -ar mament -anim es -wat u -v ski -tre ve -tr x -timp son -th wa -tcs nycmarathon -song joongki -sha po -sapi enza -ram pride -pdx tst -patcho gue -p ki -ori be -on uk -movie challenge -maren morris -kore as -i en -hell omy -hallo we -em mi -dar ke -co stel -chat urvedi -cassa dee -c sun -broken hearted -bel ag -an dia -اÙĦ ب -vacation rental -ultra boost -trun cated -to pline -revolution ary -ram pling -proudof you -peace keeper -pe mra -pare to -mote gi -mass aging -je de -hell fest -f illi -en cores -ell amy -deb tors -dayo faction -cs ra -bro z -book mobile -bm l -bar field -apel doorn -air conditioning -ach ts -wash times -ut ela -u ia -through the -te il -sri dhar -sal af -ruido so -ro tat -ro ka -pom pei -mc d -mar nier -mar ga -lumin eers -leagueof performance -ken z -gl ings -gau tama -forthe throne -for ger -flam es -fin landia -faul con -fall fashion -ent revista -den ard -dc moments -cold stream -chak kar -cal exico -bun i -bi annual -bar kin -ar ola -aj stream -âľĪï¸ı âľĪï¸ıâľĪï¸ı -stu cky -sn er -shol ay -pre load -modern ise -kal ki -jo gi -j pt -in def -hen rie -havan ese -hau schka -ham an -g df -em acs -devi ations -dean er -chisle hurst -campbell sville -bu emi -atal ks -ðŁĴļðŁĴļ ðŁĴļðŁĴļ -ðŁij½ ðŁij½ -you uuuuu -womenin medicine -then e -tat v -sv u -sla c -single payer -sanjeev kapoor -pale stra -ork ney -or ono -nor well -mtv india -melo die -la gov -kri ek -kashi f -jon z -jeep ney -iu bloomington -hop kinson -high wire -go st -gho sting -fren zied -even ingen -eg ham -dhan teras -cla wson -camp bells -cal poly -ashi i -alek sander -[ .] -y ero -vu eling -union ism -ucl g -u vam -u pei -tuolum ne -them is -summer field -su ss -ssi d -sni per -se jeong -sand rine -reser vists -pe ville -palme iras -of d -ni ans -ne uk -mo el -m hi -kim so -har borne -dim mable -dali o -clever ley -catchand release -brac ey -be leagu -bar bra -art prize -ar ana -weill cornell -vi dence -tax onom -swash buckling -sre mmurd -soe karno -siddi que -sergio kun -scu ff -screw drivers -sa avedra -sa ag -pen ns -overe ating -noo bs -mar vell -lingh urst -lau rier -kel ton -jo ists -horowitz la -hann aford -fro mp -flu tie -fe tty -eric sson -duc kett -ash ree -aguero sergiokun -adam horowitzla -ðŁij¨âĢį ðŁį³ -à¹Ģภŀ -x ell -vic t -tvac tress -sub vert -spam mer -sch ade -oore doo -nicol son -mu tag -man iz -mal avi -lilyach ty -ky n -kra borty -k ady -j ons -hy u -ho he -her name -h su -du ally -dru k -dai kin -car digans -bread winner -bick i -ab lack -!!! "@ -æĸ ĩ -âĨ ªï¸ı -zee music -yiel d -x ilin -to pol -t fd -stu mping -sk f -sd hc -sau té -sab le -po so -pink man -ph ere -north olt -monday night -malign aggi -lo to -le si -jon sson -indigenous x -hin n -gour ds -glo vers -gir ard -essaou ira -ci ales -broadway world -be lem -ar shad -ðŁijıðŁı½ ðŁijıðŁı½ -yugo slav -us fw -ug adi -testimoni al -star mer -sleu ths -sla ving -shrey as -she in -re drew -pan ag -pah lavi -pa kenham -neu tering -nar al -jor i -jan h -ig we -i sherwood -harge isa -gu al -gandhi jayanti -copic marker -che atham -candel aria -ba red -apat ite -ani maniacs -am phora -adel anto -abr live -yh wh -whoo p -vernis sage -trini da -sugar man -sil ber -shir ting -sande ul -ques ada -problem solving -pear le -nu disco -ni zar -nando suk -mit ri -life e -l br -ie ga -ide alistic -home away -ho ley -free mium -eli pe -ed ler -d ld -cinque terre -centre ville -cat rina -c gy -c bus -beau tician -atx traffic -ani o -american history -ag v -. ðŁĺŃ -é ħ -âľĮ âľĮâľĮ -âĸ½ ` -y arm -wkc dogshow -velve teen -travel leisure -the ists -robert carlyle -rir insider -rachel notley -ra ashi -qual it -pre conceived -par lo -out live -national hot -magall anes -ma io -lend l -le witt -kra zy -kir tland -ir am -im r -ho bos -hess le -friend shipin -far c -ev is -confe ctions -com atose -ch aga -bi hu -bas si -back strom -alexand ani -acti o -yu pp -yak ult -we work -w cr -vi enti -uk m -ti ge -the hunt -the edge -sop hy -si sig -sher bert -pur ged -pu sat -pon ca -po blac -ob ed -n any -missing persons -ling aa -lat us -kay tranada -ir m -hunter sville -gl itchy -fa ia -eve do -ea w -doc ile -detroit gp -de cryp -carrick fergus -c vo -ble h -bd ch -back links -ade st -wood chuck -w ch -u maga -tol kien -theologi ans -the bachelor -stro mbo -sk ara -si z -say re -ra ppin -past es -of it -nutri bullet -nhs ft -napo les -mu gan -mc men -mari bel -mar ker -m haw -le elan -lauren cohan -kidney disease -kell an -ke efer -kach in -j ts -j ins -ili ke -go bain -ex tram -dru pa -diver ging -cove ting -clark ston -clann ad -cel yn -carolin ian -canad are -calibr ating -bis ley -b pg -b marketing -un cooked -tumb lr -st ong -spi zz -slow food -sapp ho -rich mix -ran aayyub -por tic -pic ante -pand i -nat ely -li sette -lais sez -kingsc ross -joon dal -j tf -it weet -incub ate -ill u -hor vat -heen im -giant spride -fr action -del in -clay pool -bul ous -bo ka -bir acial -benedic tion -ame et -ë ĦĪ -yo del -wangar atta -stefan ovic -sp gh -sno p -sm oul -sk ream -re iser -re considering -pr f -out looks -msle asalonga -mi j -materi alise -lib ation -k ise -jar din -ho yas -for b -flu shes -decentral ised -car rer -barre tte -bail ona -ard ley -apol lon -antic i -ð٤ĺ # -æĹ¥ æľ¬ -ÙĬ ا -uni studios -unfur led -tat to -roller blading -recu se -ponty pool -omi dy -oc cas -nav es -music ph -move over -mas roor -ick off -hunter ian -dum fries -dermal og -cy tic -boy er -ask me -an ina -aggreg ated -> . -ðŁĮ¼ ðŁĮ¼ -z omg -yorkshirec cc -uri sm -together for -th av -sub unit -su ture -schn apps -rosal ina -re investment -planet shakers -ok t -npr music -moor lands -le ff -jr nl -jaf fer -hel looo -he ere -gre endale -gho sted -fo zzy -ex moor -esthe tician -ed om -dc w -crazy richa -cham blee -catholic church -by laws -as ou -arm rest -am ada -alessand rac -ðŁķ ¹ -âģ ¿ -zer ian -une ce -u bin -stop ing -stad ler -smi k -re balance -raw story -prabha kar -path finder -pas h -mimic ry -marsh acollier -low life -ini sh -ha pa -gal legos -elimin ations -coqu elin -cli max -chi aki -boot co -ath iy -alle tti -allabou tit -active snp -,, ,,,, -ÙĨ د -zo ids -xx y -war angal -roo h -qu b -pc po -par x -nv q -mt x -mc sally -mahar ishi -ke on -islam ia -i fic -g attis -fabric ator -f pr -es am -ear tha -draw bridge -don ie -dean sgate -dak h -cul pa -cran leigh -cor fe -clon eclub -c panel -bo p -belfast cc -barre led -ìĬ ¨ -ê ¶ -âĨ ª -viole ta -toic itiesnews -stat uses -sol dered -red bird -r mf -ov ulation -no ordinary -niz ami -mi gas -lucas oil -ley enda -lear ned -laser disc -jose on -j lr -j har -id fc -harro ld -gestal t -ger m -d bm -cou g -cooking with -commun it -cardin ale -bu gg -book cases -bol stered -blended learning -bir do -bha dra -atra k -andre ea -anast acia -ÑĦоÑĤ ог -wu b -wrist watches -stake over -spir a -sexy list -sa pere -rhi wbina -rady o -quantum computing -pin son -person alizing -path finders -ny y -nag be -mat zah -margar ine -knock hill -infin ito -ic lei -ic ate -en slave -dream coat -death note -ct b -cre ar -city winery -cic illine -christi e -cat man -cas kett -bre guet -blue hens -apa thetic -ani as -ald ine -ðŁĴĭ @ -æĿ±äº ¬ -wen o -wel ter -van ek -u hhhhh -to cando -swi fty -suriyaf an -stu tz -sch eveningen -per lis -paulo coelho -over hang -lin ley -hul kenberg -hot z -he man -google foredu -funinthe sun -fl travelchat -dynam ical -dutch men -die ter -deton ate -co gan -boule h -benavide z -an ek -x js -wor sted -win mau -win ded -we wan -ta iz -step daughter -sten cia -so wed -si si -salut atorian -ryo bi -philat elic -oned ream -nx tuk -namo in -mar can -mak kal -lille hammer -ii da -guil dhall -g illy -euro group -ere bus -dy isi -disturb ingly -could be -com ex -cl and -chat field -caf cc -biancon eri -bet z -bar da -az os -aeoli an -ac tof -<< <<< -zhiv ago -virgin ians -vi vam -uni brow -ti ques -sten holme -stel e -soundof music -revi v -resc ind -poblac ion -oscill ating -oo ol -om as -nex on -new statesman -ne sham -mu ffin -mi ere -mar rero -ma este -li ans -leopard stown -lakme fashionweek -kin o -kav u -history vikings -hair salon -h cb -gaz er -f out -ex ander -esp ress -end times -dra wer -docu mental -con geniality -chi ddy -charlie hunnam -carlton fc -butter finger -beach soccer -atp finals ->> << -å¥ Ī -zam an -the hockey -sad da -roy alist -rough ed -ross man -ram parts -punc tures -por sha -peripher als -outdoor learning -night watch -nct c -mac lin -ma gher -loud oun -littlebig town -ligh tens -le quipe -lake superior -kawar thal -if sc -hit ya -her iot -gold key -gaw ain -eh fcl -ee oc -dig weed -de tractors -dat um -dami ano -cho be -auto complete -app lenews -air mail -ac char -wow zers -whit ton -to rey -stan ly -sju bb -sir leaf -rusten burg -ron en -richmix london -pun it -people first -pauly d -pan chami -no emi -ni pping -mc devitt -mayor bowser -madison ville -mac dill -levis stadium -je sper -hyun da -hydro thermal -hed lund -hadas sah -goo dread -gla res -ge ysers -frene tic -firm ness -filip inof -feder ations -exer tion -e glin -d pf -creative cloud -cre me -con an -bro thas -bill cosby -b ings -ar mer -ap on -aer os -ðŁı¼ âĢįâĻĤï¸ı -íģ ¬ -âĻ¡âĻ¡ âĻ¡âĻ¡ -war plane -te ton -te star -starwarsthe forceawakens -signat ory -sho bha -shi rer -rh ône -repre hensible -ra es -per ma -ob stin -nap ster -mo ses -marime kko -iq ra -i thome -hun tin -hun stanton -haleso wen -gal as -g ica -dis repair -bra vos -awas see -apol o -alb ace -ac ls -ðŁļ¨ : -ya q -whit ef -w bf -stewar tha -soap stone -slo th -ru el -re mender -pe che -ng v -mu ggin -me es -maken na -khoo b -it jobs -iphone photography -hu mus -honeymoon ers -go st -ge stu -fran conia -fill the -en cen -eli verpool -disp rove -din ck -cy ru -chef jose -canad ago -bom be -aloha friday -ê´ Ģ -wa chu -up swing -un occupied -tuc kered -topo f -to go -sh ills -sch itt -sch eck -royce da -ros lin -pu bl -post office -or ga -openg l -om adrid -nal u -mini mizes -meteor ic -maryj blige -mam y -jump suits -he ft -hahahaha hahahahahaha -great devondays -gen ki -fla il -epicure an -dan sby -coffee break -char tist -bun des -ape hu -ap tn -ap aches -ag ios -a aye -ðŁį ¯ -åĺ ī -trent bridge -tor rie -thi stime -ric ker -ri bena -po sses -ple be -ph iri -ni vin -mike bloomberg -meh reen -martin sburg -lu cho -kapil sibal -kant or -joey graceffa -isol de -is ks -im vu -ho be -gis ela -gene therapy -f sx -earnest ly -do by -display port -depos iting -de mba -bart lesville -bald acci -ay az -at mel -ar ang -al shon -al fc -aau w -:" "" -Ľ ï¸ı -ðŁĩ®ðŁĩ³ ðŁĩ®ðŁĩ³ -É Ļ -zo g -where fore -web isode -travis barker -te mi -synthe tic -stinger sup -spra ins -specul ated -sob scura -sleep walking -sd u -program m -ne igh -mur ata -mi is -merri weather -mar mel -lul worth -jack septiceye -i fo -he mo -guest book -fú tbol -dais o -co sponsor -charity miles -cat son -bou ton -belgi ans -avail ing -at ou -at ennis -ਠ¹ -tip toe -the biancadelrio -st d -s wr -ram pal -priyan kag -prett iness -pom mes -out grow -ny fa -nov ak -nam ik -man is -lo fi -livepd fans -liveon fox -le ol -ji ao -is les -ida hot -haverford west -esk o -elton john -eamonn holmes -dau k -constric tor -choose chicago -bu mbling -bau me -band aged -aw amba -ar it -al ongs -af finity -us ns -tor rence -the kiranbedi -teessi de -sh antan -scra pyard -rade be -r hc -outer space -nf ca -nbc chicagofire -mon zo -me da -mary poppins -k db -jug ando -indent ured -hoo ting -hard shell -ghaz ali -gal it -foo dies -em mie -ee et -ech of -dru mpf -dontdrink anddrive -dol drums -d ury -calli ope -caff è -br illo -arte mis -ao sta -and rus -alessandrac icc -! ðŁİ¶ -ðĿ Ķ -z ile -yu sef -vivi ane -vi os -v lt -v angeli -un scrupulous -trom pe -to ph -thorn bridge -the gro -stra ding -soul child -sav el -richeli eu -red ruth -pr illy -por ing -our world -on ca -nerv ousness -nap h -mc bryde -lam e -juicy j -j fc -ine fficiency -igh i -femin is -farring don -dublin ers -dj e -cli psal -cassadee pope -bodhis attva -bar bies -back page -as ab -anci o -ance stry -all rounder -afro futurism -win et -wa ah -tor um -ta vr -superlig aph -nau man -mu stered -ly sis -kra i -k las -jac kier -j hon -ima go -horn sea -hed da -ger bil -dontmiss out -conserv ators -conden sing -cad well -bru der -bra he -af in -? " -âı ª -ti fo -th ara -steam roller -shane west -sa a -rye dale -rou ts -recover able -punche stown -p bn -our perfectwedding -opio ide -on on -obl iterate -no kom -nc n -nam ara -na seer -mart ingu -mar xists -lasal lian -kar ky -int aglio -hi u -gou let -gabbar singh -fur fest -florida state -editori al -cnn news -cal tex -bush mills -blan chard -bel it -bab as -ðŁĺĪ ðŁĶ¥ -̶ Ì²Ì -vaul ter -tokus atsu -ti ddy -stanis lav -sports woman -spor tiva -sor t -so cha -q pac -prime ira -overwhel ms -out lying -ott omans -nm leg -nk f -nelson chamisa -ne gri -mother jones -mir na -love u -li gier -ku yt -in ou -groo t -great again -ghaz ni -gh unt -fal ken -er om -colon isation -cb h -c md -bra vas -bougain ville -beach day -av chenko -ar ashi -ap ac -anton elli -z its -tre lle -t sing -stom ped -sky racing -should be -shan ice -san ur -rain nwilson -outsider art -ore ver -mer kle -lon d -la ith -kiwi fruit -killinge ve -ir shad -inthe morning -international artist -goul art -gla u -fin efood -e ki -dejec ted -dead lifts -coer cive -coder re -coal itions -cli ss -class ica -cab aye -c dd -bu hler -bin dra -basto gne -as sey -white wine -water quality -the dj -solar city -sir tis -sin ning -scar ia -q rs -py thon -portugue se -pick guard -pi pi -path to -noti fs -nl m -mo sca -min sky -mat ers -hot tub -hoo f -ha ws -g agan -fo amy -fan expo -e wan -deci sively -colouri sed -cash in -care r -callof duty -blue mix -bino che -bel tane -bel ding -be are -anim ated -ðŁ¤ ® -âķ ij -Å Ĥ -xylo phone -we tin -w tw -time stamp -sunny brook -su bre -stal ker -she el -season s -rootedin oakland -privati ze -o hhhhhh -marin as -la zen -insp ite -good year -god z -family vacation -diagon ally -del hs -cru ick -becken bauer -at so -ðŁĺ· ðŁĺ· -welo vel -usarmy reserve -un surpassed -u ty -tor tie -su mi -springe quinox -sp roles -riv onia -one ill -oly nyk -not be -mar g -kurz weil -itu al -hand sworth -ham mond -haemorrha ge -gan gre -for zan -fla ke -financi ers -fashion illustration -fal i -cli mes -cin q -champion s -cecil thelion -az ion -ash burton -ðŁĽ °ï¸ı -yo ffs -wi ston -velo ster -unite here -un surprising -u fos -ton ko -the punisher -sudhir chaudhary -sh mup -rou sh -pal lett -omak ase -nod ded -ne ste -milli e -loui stom -lam ine -i believein -dun kel -der r -cap taining -bowman ville -billi ee -afric as -adon na -ãħİ ãħİ -¡ ¡ -zar alarsson -uk manufacturing -the zone -sun ity -suicidepre ven -stan n -st johnam -slo cum -re caro -pil ger -par fitt -maur itian -marac as -leon or -ki drobot -juer gen -job centre -inter tidal -hen shall -gom usic -fire blade -ers music -duck duck -di zzle -dain tree -cour teney -conden sate -com poses -cc j -cbc sports -aki ko -absen teeism -zo on -win nick -the division -talen ted -song birds -sam bit -sam adhi -rs x -rob ic -pu ka -pro tons -patron ising -omele ttes -ne hra -multil ingu -lovel an -ko le -kn au -kam at -j ica -induc tions -hiphop music -heide cker -equal ities -coat bridge -bre nebrown -bi gro -apolog ising -âĺ » -о ÑĢ -zat anna -your voice -w co -ub ens -suzuk icup -shif frin -roch ford -rob gronkowski -queen sugar -q aida -pre scot -po plin -ph ool -penetr ated -olemiss fb -ny ff -mu ggs -monro eville -min oan -magical realism -lovin dublin -lo ths -len exa -ky loren -kof app -iam amyjackson -hy ou -hednes ford -green castle -gi rish -gi gaf -fa as -du miny -dev astate -dee ley -cav allo -casey neistat -bey hive -bas sman -babat unde -bab er -ann ina -am oo -zu lia -un warranted -spen ny -re homing -ny university -neon icotin -mini mized -ly ing -lit toral -lear nin -ke van -i sto -hyper trophy -honey cutt -gre ve -gal van -ecra ft -dol phy -dar ron -dal last -calcul ates -by rd -ar jo -alu shta -abi y -ठ§ -yand ere -woo hooo -win oo -uu ut -tri plex -toad stool -the struggleisreal -sou le -se ger -sam buca -re aver -ra gi -pag ar -ozar k -orchestr ating -o pere -new forest -mo have -ma dan -lu bin -lo ha -lac ie -kr at -ka elin -isth mus -house guests -go derich -fu shi -ema w -defec tors -d ö -colour way -blues man -bac i -amers foort -aly st -ach tung -ðŁIJ « -ãĤ¯ ãĥŃ -ty ger -town post -sunday vibes -sunday business -su goi -quick enden -poinci ana -play fulness -pin ar -par p -nom o -neuro biology -mul t -mu re -metro trains -maug ham -marque ss -k maq -jin xed -james martin -il ink -edge worth -delicious food -de eps -bal lets -bail ar -tall ying -suvarnab humi -star sportsindia -shan klin -se caucus -sc alab -san che -robo calls -re organizing -pwe de -pim s -ol ate -nas pa -nam aste -n te -log is -kr antz -heck ling -hate breed -haj duk -fcv afc -em iller -ear nyour -e hc -diamondre sorts -cri mp -ci ac -car no -brun swick -bir ches -aman ecer -ad s -âĻ¥ "@ -à´ Ł -vi on -these us -the hashtag -slo van -sk d -sab yasachi -real m -rai ola -pam yu -p chs -out boards -nieu w -moor house -mid stream -ly onne -leopardstown rc -leather jacket -kha yel -j st -im pres -illini football -hyper ledger -hair streak -f agi -es x -dor je -do bro -copic markers -che son -blanc s -bit trex -ben oit -barran quilla -b dubs -av ilion -é ļ -Äģ h -wido wer -un called -tab bouleh -t tered -ste ps -sk inning -se bo -sar um -ru ka -ross er -ri ves -real joey -po pov -ped alling -mc call -man ni -ma ile -inge sting -heather ton -han ami -ger mania -fla bber -este pona -der ren -de construct -buy backs -book end -book aday -black y -bengal ur -bar bz -ay anna -an tra -ak hen -ah ra -ad disab -academic twitter -... ðŁĺ³ -å Ħ -ÙĬÙĪ Ùħ -zeal anders -wv prep -w bb -se jal -rossi gnol -pvt ltd -print makers -pict spam -peter loo -pc v -park zoo -o go -mitro vic -mis i -love d -leaders debate -ki f -ker ato -ju e -hawk pride -du it -con currently -chocol atec -calmac ferries -bu escher -bon spiel -biggle swade -belo ve -al ama -! ðŁĺĭ -yo gali -viol ator -valpolic ella -th ave -tet bury -t fo -sway am -sati rist -richar dg -raj yas -quadro phenia -pho resis -pert ama -mon roe -macro economics -lymp he -le der -jam bi -healthe quity -hatec rime -gre as -gil do -fre m -france sa -far kas -drug discovery -deepp urple -deco rex -bride groom -bodleian libs -ben es -bapti ze -anomal ous -alle mand -a design -ä¸ Ĭ -vm fa -tre von -topp ling -tay ga -steff an -ssk roughriders -sal maan -rc w -rc m -police brutality -picker ington -or ad -maxim mag -m go -lat os -lam pe -khalee j -ka an -in safi -ick le -ge in -fian akis -ff ootball -exhu med -emily deschanel -emb ellish -e br -cro fts -bis sau -beaver townbeer -be ggs -altar piece -al sop -ak kad -ab be -aak ash -@ : -ðŁĮ Ń -ðŁĩºðŁĩ¸ . -zer i -yeh rish -uefa euro -star nes -softhe week -sig i -siem reap -rou ille -rocke teer -ric ko -perse id -pac io -ol tl -monopo lies -mo ak -mill on -micro controller -lu anda -look oftheday -l nb -k adam -jan ko -idol m -ich or -hul ton -hon eye -flori dag -flor issant -ex terminator -du puis -din fo -de sco -cran bourne -con cho -ch m -cal kins -ber tel -aw u -al una -aim er -ðŁĺĬ ðŁĴĸ -ðŁĮ¹ðŁĮ¹ ðŁĮ¹ðŁĮ¹ -ðŁ¦ Ĩ -ãģ¦ãĤĭãĤ ĵãģ -vi ken -twitter carclub -twit pic -trainee ship -tis one -tal en -sh oma -sar s -remo percussion -one ok -on ville -ne whi -muntin lupa -khe de -jack a -ja se -is nt -igu al -hrvat ska -gut tering -fre et -foun dry -fied ler -fang irl -du pdates -dish patani -co za -chu seok -braunschwe ig -bo ole -ban os -are zzo -ap so -ali p -æĿ±äº ¬ -un satisfied -tra wl -tom oko -tam blyn -sto we -puff ball -n ays -marsh alling -marqu ardt -leti zia -la chie -l vt -kid naps -ke em -fur la -f uring -eli ghts -dan aper -bear s -bay ani -ball state -azadi march -aldubeb forlove -ð٤ĺ ð٤ĺð٤ĺ -wau wat -ulaan baatar -to eing -thirl wall -then ick -the week -the queen -spe k -sham anic -res life -nuf field -mag lia -ku jo -kof fie -kat amari -jan o -ja j -is ches -hu fc -hai b -gu ice -ge man -fe tte -edch atie -dulci mer -condi viso -con dor -buck fast -blo o -bi sexuality -alar con -ðŁĺį ðŁĻı -ðŁįĵ ðŁįĵ -ìĺ¹ ìĦ±ìļ° -ë¹Ħ íά -ver mont -un an -to kai -te uk -sports medicine -schul ze -sa hir -roy alo -que ta -pit er -pir a -pd g -ound table -nor rie -mal oof -m tw -li zer -ki yom -ji p -its just -has well -gy le -gu ar -ent rees -dd f -carto grapher -bor ger -bin ns -apple baum -ali ste -aer in -ab ile -ðŁĺ±ðŁĺ± ðŁĺ±ðŁĺ± -ym all -wol k -von ne -vivi ana -thero se -team spirit -sto at -skeleton clique -pn co -pi gging -on trent -o za -mar chi -manc unian -jum mah -i gel -hier onymus -fer rie -el ston -e per -do ig -day dreams -comi endo -allu sirish -ade p -¨ ¨ -yan del -vi shak -togetherwe can -tel ing -tann ery -seaf air -scho enberg -re appear -r hen -out bursts -or han -motor city -mans field -lilly pulitzer -lg u -le derer -fun es -fle mming -dis assembled -da stur -car ranza -cam isa -bush land -bolly woo -bick er -anae mia -an jum -al war -ðŁĺĢ @ -ìĬĪíį¼ ì£¼ëĭĪ -ãĥ¼ãĤ º -à ¹ -wi ven -wfa achannel -w pr -vol ition -vi en -tw ani -tf n -supran ational -stre ak -star oftheday -sr c -sheikh hasina -roger s -red angel -queanbey an -qu as -penn ants -peace fulness -over passes -mg d -ku wait -ko hin -hu ber -head strong -gr b -gift shop -floo dgates -dai hatsu -cryo gen -compli ed -ame h -ðŁĴļ ðŁĴľ -welsh pool -vegas baby -v tr -tri sk -tall grass -sl soccer -sho veled -se date -school yard -sac p -sa chem -re ville -rath lin -public is -p sk -mis understand -mechan ized -later ra -khatta b -kemp ton -ke rem -karan ka -jur is -jk live -hin cap -ha ze -guitar player -gran ita -gab bert -g sx -esper ando -ero b -dom ina -di q -danai gurira -capital ise -book plate -bi ka -aus veng -arun vijay -anec do -*__ _* -ðŁĺľ ) -ðŁĴį ðŁĴį -ðŁĮŁ @ -ï£ ¿ -å® ® -âĿ¤ï¸ı ðŁĴĽðŁĴļ -âĿ¤ ðŁĴķ -wren ches -w out -ulla pool -tiger day -stan more -shop keepers -sacramento proud -nam or -maras chino -mammal watching -ma wa -ma af -lar isa -kab i -jennifer beals -irish research -idoli ze -htt yd -high mark -ga ve -frequ ented -ec j -dogg one -dic ke -de compress -dab ba -dab a -comedy fest -co production -ch igi -cent relink -br û -artsand crafts -Î ½ -valedic tory -ten do -severy one -prodi gious -pri stina -pathophy siology -pa ho -neh wal -ma estro -london life -lad die -l mr -ky aw -inter milan -hel ier -good job -fu mo -fenty beauty -ed s -don ghyun -ce f -bli ghted -as sal -wc g -waron women -von d -twee ks -toyn bee -thi ep -steacher sa -saw yers -sau dio -roche fort -quand ary -pu be -penetr ates -ouro boros -o stia -ma hersh -jim iny -in star -head lock -he v -goal posts -geor gie -fle d -faun tleroy -et oo -danaper ino -castle field -buil dyour -bar gained -ay eeee -asiap rince -arunvijay no -api ary -am peg -ðŁļ ® -x un -wh ig -ve vo -square ly -squ et -spar ingly -pas cag -olympi akos -ob and -middlew ich -kottay am -inar ow -illu st -hi rise -head hunter -hall marks -gla x -girlswho lift -fla ppers -el vish -cryptocurrency news -ci bul -car wyn -autom ation -ato dd -and still -aga sta -à¤Ĥ _ -what areyou -voyag eur -v vd -v awa -ufos facts -stra ddling -snap chatting -si pper -sch ut -ra wa -power lines -plit vice -phar r -one family -michelle malkin -me ze -me dec -mc daid -man tova -m ws -les miserables -lav anya -k assie -inter lock -ic ef -hi fi -fuj ita -fo on -e gen -dram atics -craf ton -black pink -berg dorf -beer men -audi ence -app ic -ant al -ãģĵãĤĮèģ´ãģĦ ãģ¦ãĤĭãĤĵãģ -ãģĵãĤĮèģ´ãģĦãģ¦ãĤĭãĤĵãģ łãģĭãĤī -women swrestling -wag g -wa ite -vienti ane -tu bri -tru ong -throw away -swift lang -sab ino -re acquainted -or ff -op us -ok azaki -niam h -mu ga -mo yet -mlb theshow -mag no -mad max -hay fever -gali fianakis -for president -foot ings -faiz al -esp ada -er ase -encro aching -eleon ora -dun o -dre ws -date just -com rie -cause way -caf tan -bbc wales -band t -ba day -ant el -ani on -am co -... ðŁĺĤðŁĺĤðŁĺĤ -ðŁĺĤ ðŁĺī -ðŁijĮ âĿ¤ -âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ -ye t -well spring -wander ing -visit nepal -under line -spe terson -so cean -service man -ro es -ra yo -prud hoe -pi aggio -p wp -out played -ou h -ny dd -nhl pa -n zi -more ls -mol le -masa ki -maj id -librar yof -legui zamo -larry hogan -ka hi -indu bai -hun tly -ho ki -harbour side -ha shing -grain ne -for ties -ell ar -doctors strike -cle o -cap ito -asser ted -ðŁĴĭ ðŁĴķ -ãĤ·ãĥ £ -yo suke -u houston -sue ños -spo kan -si moes -ren contre -re installed -re authorization -press conference -po logy -pl zzz -pitts ford -phono graph -over reach -nun head -nil joshi -moon beam -may ur -lugan sk -le hi -jag dish -ilo ves -h mn -griff o -gold link -fresh water -e woks -chand ran -casi mir -cannes filmfestival -bush man -bir ther -ball inger -b df -ac ke -ðŁıĬ âĢįâĻĢï¸ı -yan is -who are -ver dugo -thatawkward moment -solic itation -shine on -sg n -segu ir -science daily -sau dade -ry ley -re traction -r vr -om u -o sam -neo pets -marlies live -malt by -ly si -lisam ur -le ats -hay nes -hat chie -ham ming -gold star -flabber ga -finkel stein -e mobility -devil may -dag ens -cen te -ðŁĺİ ðŁĺİðŁĺİðŁĺİ -yyc food -ven use -tv nz -strati fication -ste pan -samar as -rec t -re te -re conditioned -pres sclub -plant based -p has -on ata -oko cha -nfu tweets -natural stone -mil ka -metabol ites -mega star -mahi ma -lums den -len sing -kool aid -insp irit -im morality -hor nady -heck led -frees avchenko -fle uri -fi annaf -fab re -dre her -de acon -dam ar -crewe alex -cosmetic surgery -com en -cham bre -card board -b sh -ap layer -ak awa -ðŁĴĽ ðŁĴĻ -âŀ Ļ -à¸Ń à¸Ń -à¸ķ à¹Ĥ -zac atec -water jet -un itary -tri athlon -ther oom -ta ze -su dah -ston ington -sta sh -sp ano -shi atsu -shak u -sen den -pa izo -neti zen -nar ok -mull en -le manoir -lali que -l rp -in fest -h day -gaiag auden -evapor ative -en ver -du tty -domest ics -c mpd -book trust -banne ker -bab ak -ar j -al anya -.. * -wig gum -warran ties -wan o -tv one -tin type -sy ah -stjohnam bulance -shi ko -on live -moon landing -legg i -latenight seth -la vas -juvent ud -hart ley -gra sped -ge ren -gales burg -fa sts -ero ica -davincis demons -d fg -coffe eco -can do -buy ing -bar ang -ac app -[ : -ðŁij º -vale ant -upri ght -thel p -subi aco -som ni -shir k -sdc india -sal vos -sag u -sad dlers -recur sive -pu w -petro s -per shore -ou dna -oro chi -opioide pidemic -nbat witter -nathan iel -mun chin -mounta inde -miscre ants -mis communication -mbar ara -lo rela -liberalismisamental disorder -le andra -kentucky mbb -je tt -jav el -iri descence -indi av -im potent -hend ri -geth se -desper ado -cra dio -cr x -col nago -cla vier -cadbury uk -c sb -ame in -âĿ¤ï¸ı , -yoga everydamnday -win with -west wood -w eri -w ce -un sound -u wo -timor leste -tat ar -street sof -strato spheric -ss man -spre sent -spit ze -soli man -si pped -sau li -pterodac tyl -nc u -nash villec -mariecuri euk -mani acal -m ni -love bug -length ening -kw aku -kud low -kpop starz -ken yon -ji ve -he gan -greyhoun dracing -go broncos -formul ating -foot balla -foodand drink -flip the -e stevez -di she -de meaning -capy bara -blu emountains -ble ek -billiee ilish -bi partisanship -az ania -army bowl -a hoe -âı ± -wild west -whit eface -ver ve -sung jong -sunday roast -sixx am -shar lene -shame fully -se dated -ra pinoe -r dra -quo ted -post paid -ous ins -obscen ity -moust aches -midat lantic -mal achy -lee man -la gan -kot ler -jalap enos -hyun bin -hing is -gi gg -gam s -gaiagauden zi -fair weather -excep ted -duck hunting -do vi -den e -de my -cork cityfc -chem bur -che ons -bokuno heroacademia -biom ime -back es -asu g -armou ries -ðŁİ¥ ðŁİ¬ -ðŁİ ŀï¸ı -ëıĻ ë°© -ãħĭãħĭãħĭãħĭ ãħĭãħĭãħĭãħĭ -व र -ym ed -wol laston -weare family -unsigne dartist -travel tip -task master -succu mbs -stimu lants -st luke -si vas -shu u -s ve -on sea -o orah -lo lli -lex mark -ke ham -kar man -jr f -jol ts -iu lia -hai le -gar land -flow y -fant agraphics -fan sof -exolu xion -ex el -espnc fb -dr iller -dogmeat trade -consen sual -codw wii -clam shell -bou illon -bosh off -be for -ar jona -ampli fies -agric ola -ab ora -ðŁIJ ¿ -with purpose -tom oe -to bar -tend rils -slam mer -richmond hill -pur ser -po el -nuer burgring -messer schmitt -mant le -m vd -kirk stall -key shawn -ke tel -inthe uk -ho ppen -god parents -gn ano -g itta -g dg -fle amarket -fi field -down state -down sides -de contamination -dae woo -ch romeo -busine sse -british tennis -bat anes -avoce t -alarm ingly -al ann -ðŁĴĭ âĿ¤ -wight man -who ami -un appreciated -tou bia -tf si -terr an -ta ven -stol tz -shemar moore -sharing iscaring -ring ling -re gi -pune et -phi fe -par ables -pandi raj -mun de -mo ke -metat ron -inver sions -ic ap -ha plo -fu uu -f ounds -el gato -desi re -d hal -coraz ones -col y -bush ra -bron ycon -black sheep -beam iller -badas steachersa -aw ang -arch digest -ad at -Ì¶Ì²Ì ¥ -whati m -was i -under performing -to tt -th ile -st anger -rod stewart -pulp fiction -polar bear -pear ld -pan ics -op s -nord see -noo bde -ni mes -ne sa -nas sau -min ette -mar maris -levit town -leng then -kaz iranga -k hid -juda ica -ic hat -go canadago -gen sler -funny bones -dyisi sit -dress making -dj ur -devi ate -cu id -crustace an -crank shaft -co bie -bar one -b hl -aven kat -ass ate -ac ab -à¹ģภļ -Ã¥ s -y ath -waynes ville -valley wx -val ens -touri sty -suk hum -splendid ly -si oning -shiv anna -ser ine -sar ahe -samar inda -sab ar -ry ano -ring master -ridg eland -rat cliff -po gues -oi shi -ne gga -nam en -mur ree -mo omin -mil ia -lin um -kit tie -ki x -i dent -g ä -ffun ded -est ars -elvi shistory -eco sport -dress maker -dc tv -costu med -con ing -chi vas -bin aries -baj payee -! ðŁĺľ -yel love -wil s -whitt ingham -sky rim -real kevin -read allaboutit -r cl -pun o -par li -na ghan -mun e -matchroom boxing -la sd -kal os -k ring -ind ye -hero esof -ham ber -gg t -fac ey -diab lo -ct vedmonton -bre de -bla vat -be ssy -attenti vely -as ot -aristo crats -ane ws -ðŁĺįðŁĺĺ âĿ¤ -á´ Ľ -yo ps -wom ad -virgil abloh -vi vel -vat raffic -va art -toly mpus -the ip -tas so -sn ak -skill india -sie ben -rod ham -pr ata -po ors -pic kn -need s -mx px -ll er -le ers -latic sofficial -la pointe -kago shima -k mb -ju anes -it our -he da -ha kka -gu gu -growing up -gold standard -fen ce -den r -cur tesy -cor ban -beh rens -am isom -air drops -- . -z ville -youknow youre -vi dor -tsaww assen -thiswas cle -suni elv -sunielv shetty -summer stage -spark ler -sise puede -sag esse -p mk -nj c -mephi sto -lam our -kg bt -kaw as -jets ons -is berg -hor muz -gif ted -fit spiration -evapor ate -el ain -dou se -chic hen -captiv ates -beleagu ered -as ms -acup unc -a ec -@ ____ -ut tam -un wise -tri xie -tag g -style awards -sati e -sap na -san gram -sam pras -ray donovan -ra zi -pt fe -pir ata -new day -n rd -mu schamp -ma user -lamb skin -ker by -iphone only -ilustr acion -ham o -glo ster -gi ddings -ful ford -films video -fe en -dri p -cred iting -clipstudiop aint -charles worth -block b -bir ge -bac o -az ia -ay ian -arrow filmsvideo -am w -ac adie -with my -us bc -to z -thre l -rock hold -rob ing -reha b -pu yat -pillow case -perry sburg -nur tures -normali zing -nee ley -ne eta -mon ona -mal m -m by -llan de -li pinski -lai ki -kris jenner -kon ga -kar ren -italian wine -gu us -ex ci -ema zing -d ya -buo yed -bick ering -bette midler -bed lington -ban ister -ban a -ation tv -agny aath -- & -ðŁĻĪ âĿ¤ï¸ı -ãĥĿ ãĥ¼ãĥĪ -ãĥ Ķ -tip ton -tal ert -switched atbirth -su tt -sp ren -ra sp -q an -pin eville -piccad illy -pf hof -over bought -nor ma -nic helle -navig ates -morbi dly -maha devan -ll r -hop wood -en field -em l -dr yeye -dee wana -car pio -biom ole -bhar ara -art sc -arre dondo -ac costed -@ ) -z ini -wee eee -union ville -ted die -st asis -spirit u -radiof ree -petro glyphs -oliver i -naj jar -mi jn -mammam ia -maid ana -jama icans -ig ang -ife anyi -ic hert -fore play -fergu sson -etsy aaa -de test -de ke -cor tisone -bon bons -bo tero -bajpayee manoj -b te -ade es -ðŁĴ¥ ðŁĶ¥ -ðŁıħ ðŁıħ -wilder ness -tabletop gaming -t bbt -submer ge -so dal -si ah -sexi est -sen n -rober tw -rit on -pro jo -pra ther -ovi ya -oj eda -oc ke -nar u -more no -mor nay -marshall town -kil meade -ja hr -independ encia -indef ati -in sel -imagin ary -halloween costume -georgi ou -edu ardo -east view -defen sor -de joria -clai rec -by erly -at c -anore xic -annex ed -ai aa -ï¸ıâĥ£ ! -ï s -ww at -wupper tal -wheel set -tru ecol -tor tas -tion news -thre sh -te vent -swamin arayan -rep elling -real ron -re prints -re directed -quare sma -pen ne -pat en -mur k -metho dman -malaysi a -lov sk -lo ir -kill ington -ke u -kat en -jo ven -janu ari -in law -hol ts -gun dam -gled hill -garof alo -free thinker -father land -fashion history -fall acies -ee sh -dom sherwood -desi ring -cm ha -brew fest -break ups -big game -batman day -an sah -alpha bet -, < -ðŁĺĤðŁĺĤðŁĺĤ @ -âľĮï¸ı @ -whit est -whang anui -us is -tsuki ji -thom ash -the toughest -summer in -sing tel -simon coveney -sidd hi -si yah -sen ile -que remos -presu mption -pair c -na at -mc cann -maro oned -mah alia -lon ga -ja sta -j ata -ill hu -hack aday -gi zz -ga em -fin ny -fault less -far rah -ali abbas -ðŁį ľ -ðŁĮ¹ âĿ¤ï¸ı -Ú© ÛĮ -س ÙĦ -zeph aniah -w dm -villa real -sydney roosters -pap illion -ne had -myster i -mult itudes -mil s -mate us -loughe ed -le var -kenny wood -house cat -ham mons -gw f -gr ic -gl ancing -frighten ingly -free bird -fetty wap -father less -fai ro -espn fantasy -dou gie -co sho -chan cel -cardo so -brooks brothers -anadar ko -âĦ ĥ -Ð ± -zu id -verand ah -upan ish -up north -tr ona -sm sports -skag way -sigh ed -shaf fir -sab ie -ry ang -re clusive -pyth agoras -pete gui -nonchal ant -mud slides -mor ant -mclu han -man school -ku gel -kirk by -ka ali -jaw ed -is f -helen sburgh -h series -fu dd -fan army -ex claimed -enter gy -dyisisit manila -di at -cru se -car m -break neck -bilingu alism -always be -aki ba -ad abra -ðŁĺ£ ðŁĺ£ -ðŁıĢ ðŁĶ¥ -ðĿĹ ¶ -âĸª ï¸İ -ye ducation -watche spn -trampol ining -tay side -so wa -sh allow -sema phore -q ew -proud teacher -perry man -onom ato -nether realm -mun y -metamor phic -man tua -legg era -le web -le ssing -le per -ke well -jw st -je el -go beach -fro gger -forever orange -edu topia -chippe was -c mh -brexit party -biz et -beat king -aw n -asap h -anal yser -ade sina -?! ?!?!? -ðŁ¦ Ģ -ëıĻë°© ìĭł -Ùĥ ÙĦ -york dale -wey burn -wex ford -ul loa -u sip -tre ed -sx onfox -sham it -sephi roth -sch in -proper t -mo ats -jain ism -illhu emin -hirsch feld -emaci ated -eddie izzard -demysti fy -deck ard -bush ey -buff ers -append ic -ant artica -adi k -yu kari -west shore -wat sky -w fs -vac ature -super moto -ste pp -roller ball -roc nation -ran elagh -r md -professor green -produc tively -person als -pa jar -nov onor -nn n -ni emi -new salert -mal ani -ma sco -lo petegui -jersey ci -inj awarrior -i aapa -gg p -dra c -comm is -coffee with -chi hiro -cc ss -bull finch -blay ney -aul kner -ar ber -ab dl -zip car -yu shin -win kel -vo wing -une n -the ory -t pc -t adi -sho witz -sherry rehman -ser ta -reci eving -r de -q rt -pollin ated -pear lv -pe th -off ood -north western -ni der -man dem -kennebunk port -keep britain -jal alabad -howi ed -folk tales -es ra -dil worth -chess ington -calab ash -br k -bal as -ato z -amaz one -adam saleh -' !!! -ðŁĩ¬ðŁĩ · -ëĵ ¤ -yl ing -wyn ter -will cox -vi vere -valentine day -transpon der -titch marsh -theavett bros -su ce -ski doo -sk oo -ros ine -rese da -perfu med -out lived -our ces -one world -nu dist -mcr museum -lake side -kaneo he -justice orelse -instant aneous -in co -hungar oring -gri moire -great reads -ghastly gastronomy -ger n -fun fun -fu c -foodblogger ai -dur ning -datav isu -cri mbo -clinical trial -cho tels -car berry -bou dre -bil ston -biblio the -bab ie -ay aka -as core -adele ke -ðŁĶĿ ðŁĶĿ -ðŁı¾ âĢįâĻĢï¸ı -we ge -washten aw -wal kon -w ads -vic enews -v hs -un shak -thisismy crew -ter adata -tan door -sw kly -stol len -sno ke -sni ffs -shali mar -seri us -sare back -sanc tified -res ch -pseudo science -philly now -matthe ws -manag ua -laun dered -hou lihan -hou l -hou ghton -hot eliers -hoo ley -go back -ero gers -elan eri -e chan -dur ance -dj sbu -dish washers -dial er -clever bot -ben ner -bas sen -ache be -? ðŁĺī -ãģŃ ãģ£ -ãģĵãĤĮèģ´ãģĦãģ¦ãĤĭãĤĵãģłãģĭãĤī ãģŃãģ£ -د ÙĬ -w bez -upperdeck sports -uk storm -trun king -three uk -tho ward -solo astarwarsstory -se gam -schul ler -sayye shaa -reposit ories -ram bling -r aro -prayfor us -poli sher -p mk -own the -mel drum -kimon os -intern als -ine pt -human ely -gar ters -g nev -fug ly -for mo -dispo sing -charlat an -cerebral palsy -bou ton -bhutan ese -assau lt -aran ch -am hara -ake a -ac cor -;- )) -ðŁĴİ ðŁĴİ -ze alot -yr insider -xrp thestandard -wend ell -tram ple -tour o -taver nier -ta fel -solic itations -sh yne -sf b -scrib blen -s brew -ren ch -ra dek -pla its -online learning -one less -one ers -ni xa -neo sho -mor d -mo bbin -md h -mb h -man tic -ma dara -kof ta -ig naz -hooten anny -gl eni -ge tin -fo ck -evin rude -en code -emanu elaneri -chon buri -blind side -bill yidol -ank ur -aaaaa and -ðŁĴIJðŁĴIJ ðŁĴIJ -ðŁİ ° -ม าภ-à° ¦ -x xiv -wri ggle -wp moy -vi ani -ve to -theme forest -super fluous -selfe steem -se lem -ru ffed -ra kul -ptole my -pro fil -old london -newh all -me isner -madam secretary -lu me -led ger -ke ir -histo gram -hear say -hay stacks -governor perry -gor ry -ghe tt -gate wood -fandom memories -easter bunny -double day -degre es -decemb erists -chal font -bus way -base ments -b ick -ah k -ìĦ¸ íĽĪ -åĩ º -zakhar ova -wh ist -wen urses -vicky kaushal -twor g -transi stors -thak kar -t vet -t no -south wick -rach id -r la -propag andi -poli sci -pl tworg -oh are -nov gorod -neuschwan stein -nano science -man nn -hyun seung -gandol fini -g adventures -descend ents -de ta -borde aux -bo se -beck on -ali dad -alar ic -å°ij 女 -ym atic -yav apai -whit bread -water keeper -tuuk ka -ti da -the greatest -tamar ack -sto well -sky sport -ring gold -ra bacher -r pe -ponti us -pc dd -oni st -mince meat -mattb ellamy -mar gera -mar cio -maite oficial -maach oops -lifestyle blogger -lake erie -kent ridge -homestead miami -gra phia -golf news -fur row -en tech -e stos -e gu -ch imp -cat rion -bl ings -big fish -b ava -armen ian -amazon ite -al tra -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ -à¹Ģภķ -à¸Ĥ à¸Ńà¸ĩ -z aka -warring ah -u mo -tough en -sta si -sque aking -south coast -sil at -sar dis -san te -richar diii -r mcf -punk rock -nas sr -n once -mould ings -megali thic -l ann -kamenri der -getin my -fl aco -fab e -ema e -dwi gh -deduc t -cor vo -ch ato -arche ologists -ar ys -appropri ateness -anu j -alo is -adrian peterson -ãĥĥãĥ Ī -vandy ke -toho shinki -tai res -sundar am -sal ton -ri hann -pro cor -norm ative -ly kke -lisamur kowski -ligu ori -leg oland -kwan kwas -kar lovic -kal man -insu lator -horse manship -harri ott -et d -ery thr -er ae -dg son -deple ting -den son -chen le -cand ic -ca thra -bal u -art institu -ame deo -' ?" -ðŁĺį ðŁĺĺðŁĺĺ -ðŁĶ Ľ -ðŁIJ Ħ -yog endra -ye ap -tu lia -trap music -thu ram -thom a -sling back -recuer dos -ram pur -punch bowl -prag matism -phalaen opsis -per pi -ok k -na iry -mah langu -m ht -k lip -humber college -hu gues -hal pin -hal fling -gri my -governor va -gal go -fol ger -fla sks -firstal ert -fab ius -ei sen -chi ppa -cam elli -bu sia -bag g -ba star -amb ard -aliabbas zafar -zim ba -you like -wych wood -u ac -the summit -sv d -shi vak -re publics -re assess -pro strate -pray forthe -pal it -oo td -onmyo ji -nam ma -mond ello -mo xy -m ld -lov ich -lom achenko -lia oning -le te -kas ingh -ju py -ingol stadt -hipp ie -grim lock -go wolves -gallau det -fernand ina -fac ile -ed as -cre sta -control lable -block head -bel size -bel ind -b ck -appendic itis -al locates -yu uki -vandy boys -vag anza -thom a -sy f -sy ahu -ste pup -sp ens -sch moo -scep ter -rho s -pyn chon -psycho therapist -philli e -o ii -nehad hu -n sdcindia -lu h -lo li -ke c -inve gas -hen ness -gun k -gin ous -fit fluential -en p -ek ko -dr john -dd p -cas ade -calder wood -bur kett -buck aroo -bri gan -bon ez -accade mia -ðŁĴģ ðŁı¼âĢįâĻĢï¸ı -wha aaaa -wh of -volup tuous -up ra -tu lo -trol lope -tri ano -temp el -syn tagma -sw ays -stone wall -star kid -serie atim -say an -s xt -ridge view -reflexi on -pul sing -poon ch -pearlv puri -on du -om m -official randl -nay arit -mur taza -min it -l ns -kn elt -home pod -foster thepeople -e bf -der bys -cyber war -chal king -bli gh -bambooz led -ayo ko -akzon obel -اÙĦس عÙĪØ¯ -wh ims -volk sk -titic aca -tim perley -spre ss -smu g -rhi annon -pizz azz -pile ated -percep tual -mu shi -mix uk -lori en -kin sley -indie pop -homer uns -hippo crates -gre b -gold coast -fresno state -deli ri -coffee maker -clover leaf -br ouk -bo ther -am ati -al annah -achieve men -accom plices -ãĥĿãĥ¼ãĥĪ ãĥ¬ -ze tec -zare k -xenoblade chronicles -wise guy -wi ddicombe -wan khede -vitri ol -vin daloo -ty tlive -te dd -share acoke -semb ly -sd h -say it -san kar -res ver -place sto -phan euf -pel ton -no thanks -nichol l -nathan ael -man gano -leu ko -infuri ates -hypnoti ze -frustr ates -extric ation -end points -e sau -du dek -deer foot -comprehen sively -candi de -camp den -bm h -bian che -bab ies -assembly member -any e -é ¹ -zel en -wednesday want -texom awx -sundeep kishan -suc c -six words -sergior amos -rugby canada -ruck ers -pol ys -plugge din -om ura -nic eville -min koff -meow th -kul lu -jet ski -im ca -her oku -hash emi -grammar ly -fier cen -fa him -epp group -dogsare family -d swt -cr ittenden -black son -autopha gy -aler tness -val voline -tom lin -the agu -silver smith -shou ston -shor ties -ro mina -qu ina -pub quiz -provoc ations -pad dys -ne scac -n fc -michael rapaport -mic alle -life changing -geor ger -eric ally -de wor -clari dge -chri ss -car yn -bo sman -ball ack -arbut us -altam ira -âľ Ĵï¸ı -way mo -vom ited -u ther -torna dic -storm tracker -sprote ction -rob thomas -poin tof -pl ana -pa ha -montes julia -mo sher -marke to -mark son -lar ts -ker ning -julie bishop -ig ad -he ver -fahad mustafa -em cc -do ber -d rich -cul pable -crac ow -cal ri -bur ros -blen cathra -bi on -bass inet -at vs -amand ab -ac ted -ðŁij¶ ðŁı½ -ðŁIJĿ ðŁIJĿ -ze peda -womani zer -wir tz -vaish ali -u wc -u ting -sop hos -sink able -silve ster -s mail -s lit -politici zed -po ca -pediatric ians -nick cave -nemato des -melani atrump -ly tham -lam ination -ko sher -j co -in vision -in box -heuss aff -han doff -gov tech -goldkey comics -garage band -g mi -false hoods -epic ure -en dy -dy ard -che alth -bright ling -bourn ville -blow ed -birken au -baster ds -aw bb -atla sobscura -amy freeze -ðŁĩµðŁĩ · -âĥ£ , -Ì ² -z om -tromb onist -stro me -shahe ed -secon dary -savechildren uk -ro bie -ric er -reu ter -pol perro -p ns -ny phospital -norther ners -mh eller -man up -lm k -kather yn -heart worm -gau ld -futu rology -fa wns -du du -dis aron -crash bandicoot -comb ats -co ti -christi aan -ce elo -carp inter -bm ws -blood lust -yak in -tu an -tri pling -thank smom -spot sylvania -sand vik -purch aser -no where -mohabb at -mc goldrick -kap taan -it sam -in built -illhuemin ati -i ita -hir an -haiti an -hail sham -ha young -fernand inho -feliz domingo -eli ot -drawthisinyour style -dorset mag -di wan -buy er -b wk -ang olan -ai hl -ag gy -ðŁĺĥ # -ë¹Ħíά ë¹Ħ -wbko wx -under writer -twitter ing -sun shin -sub par -start with -ri dlr -recipro cate -ra van -paradig m -ou c -nd g -mohan ty -mo zz -mass ape -lumin aire -lgb tiq -lea therette -la th -inve sto -im in -ik awa -hard wicke -from tomorrow -equ il -eco soc -e manuel -desecr ation -confe c -cam b -bel atedly -beat nik -av atas -an sell -acoustic guitar -win star -tarek fatah -super junior -som any -scic hat -salt spring -richard son -re forma -r our -q os -prep zone -ow i -moolool aba -mati syahu -la zing -kle iner -gr und -g aki -form ality -ferri by -determin ism -cut scenes -booking com -boo oooo -blu er -barclay card -al ition -af aye -adity aroy -ðŁį¾ ðŁİī -âļ½âļ½ âļ½âļ½ -âģ¦ âģ¦âģ¦@ -а ÑĤ -yo b -v rx -un tv -time form -ti ggy -the morning -sun star -stow market -ru kia -regrett able -popul arized -per dition -pat y -on ism -nobun aga -nad ella -mis ch -jack jackjohnson -iv orian -hu mer -herb streit -he iro -had ji -four square -faste st -fanta size -extor t -dor nier -design inspiration -deep mind -dav in -co location -cin ec -catter mole -anesthe siology -ana bel -am paign -all ura -yal ta -wur litzer -wp bf -thiep val -the horror -th v -sto b -qu aye -port able -peri sic -pe ut -ot way -ob je -nehadhu pia -mol dovan -log gia -lar kin -kyli ecosmetics -kari uki -jap ati -j ory -im the -gwyneth paltrow -grave site -futu ren -fen church -ero ad -endit movement -ei mear -e inf -david price -bo hn -beau maris -au drina -amazing ness -wy nyard -w ws -ven e -velaik karan -urban planning -tyn dale -theat rics -sup my -st kitts -se si -se kol -scor chers -profit eering -pi ro -peri operative -over loading -ne edi -lan sdale -itsli verpool -hood lums -hand el -ha gs -goose island -exciting times -edge computing -edgar town -d tf -clar ks -ch ads -cau gh -burn leyfc -bur an -bis muth -bella hadid -be active -bar tok -agath achristie -ack royd -ê¹Ģ ìĪĺíĺĦ -É ´ -wil lam -tam ers -st m -sk ys -shad dix -par iv -ono ghue -minu scule -mai sha -lu pi -kat ak -ka ja -jack daw -illu sive -hh sgov -gre ta -g ool -g fk -famili esto -facts matter -dwar ven -dont mes -diof avatas -car swell -bir kett -amid ala -alu card -ak il -æ ¬ -wedge wood -ti mc -tali bk -swaff ham -spla yoffs -spectacul ar -she i -sen in -satri ani -rhode sian -rashtra pati -qual icum -qu am -potter y -pon chos -pa ja -ne et -mzan si -maul er -mai sel -k mg -jackie chan -impac tin -hon ori -gun dog -fle abag -dru mheller -dr yan -do gue -dioce seof -cur tail -creative writing -chat elaine -car der -bri z -ber zer -b itu -archae o -add ons -a all -zap at -x ue -vancouver sun -van es -the bull -th hour -tel uk -spy gate -sm rt -shaw nab -sc si -sal alah -rowy so -red cros -rainbow rowell -radisson blu -r chs -pratt ville -poiti ers -pan n -oo ke -mu ddle -mor avia -michi ana -ky r -kli ff -hu ana -henry gayle -head butt -hair ball -g tn -fu rey -fram boise -evangeli zation -ec ard -destabili ze -de me -by c -badrin ath -amp ere -Ûģ ÛĴ -ver ney -uffici ale -tb wa -sof twood -soci ale -rede ems -q tv -pu bic -per ches -peoples votemarch -oni x -ol ith -oh su -novel las -mechat ronics -lunch ables -h ings -glass door -fc pa -fanexpo canada -edex cel -dict ating -courtne ym -child splay -caloun dra -birth mark -bar na -alway swith -/ + -ze is -y se -wil fork -wee ting -variet als -uof r -twee talong -sw ash -shar ad -se millon -ru bella -rap sody -phd forum -ny ce -ntv atone -no ice -ni biru -mu ma -mic hen -meaning fully -kawarthal akes -juliebishop mp -hu at -ha ff -gri eco -gibr altar -fire fly -f nb -dakah lo -buck cherry -bcfc tweets -bak ari -au dre -ash ly -andre essen -ai sha -ad duc -âļ½ï¸ı : -x uv -tu tsi -ti go -talibk weli -squir m -sound board -rehear ses -planet side -passage way -our time -os stf -ojib we -net ter -ne ac -n kn -mu ki -mo ins -matri arch -ma stani -laven ham -kiku chi -jan am -hinojo sa -fo etus -eye shadows -enig eria -ec rowd -dimit ar -did ger -di efen -defrau ding -bull sh -broom stick -back us -ar gh -xo los -squ amous -shu ai -shi ans -samo ajoe -sam ford -s llc -priyan k -pio tro -pic slip -or don -nol de -murciel ago -lu xion -lin ds -inst it -ing laterra -idoli zed -health insurance -harmon ia -h sl -financial freedom -ffici als -eu dora -con scription -clun ky -char lee -cap i -bannedbook sweek -baff le -back lot -b mcc -ascend ant -alu ddin -ðŁijĭ ðŁı» -ðŁIJ ŀ -zi v -x tr -wa ec -ve schwab -time e -thim phu -sh ree -r sca -peto sagan -palla dino -old victheatre -ner ding -micro beads -leven shul -larch mont -ja ved -ir ation -inf p -farc ical -f ars -dono hoe -dipo log -cho m -carnar von -can cha -bli ghty -ate m -wpl glocal -vive gam -ver sum -ur ne -twitch sharing -thap ar -shri ek -shaun king -ri is -re grow -raz ia -picture house -out stand -oo stende -ntn u -nav arre -mi micha -lamin ates -kilmain ham -kah le -ic a -gan za -figu ral -far miga -fa th -extru ded -central asia -buck town -bre ton -birthday staroftheday -basil icata -arri son -ðŁijĩðŁı¾ ðŁijĩðŁı¾ -wim pey -weis sman -visit maldives -vic eland -veget ative -um my -top ten -sp ss -som meli -sky diver -saw fish -partiti oning -n goron -n anga -mono grams -mercat or -mary mcdonnell -lush cosmetics -lc u -khayel itsha -ka ke -ji ya -it b -ic ff -hol dup -fur longs -eric prydz -car ys -buk ola -biennal ear -bay i -bari atric -aged care -âĻ £ï¸ı -z older -yes allwomen -western ma -vaill antuk -u indy -tric ho -tri as -the b -tar paulin -swing man -sun kissed -stump town -star tsnow -segu ri -romney ryan -real clear -pa chu -nulli fy -newh ol -mer api -lauren ti -kiss fm -kat er -jugg alos -jarre t -guil in -crun chie -climatechange isreal -bur dick -be ales -ba tho -b gb -b dt -adventure land -! ðŁĺ± -ver on -the deverakonda -sto wed -sp alletti -rhy ne -retrac ted -rail gun -pi qua -phonec ase -patri mon -nov elli -n serc -ma dani -lat am -khu t -indv snz -heine ken -guaran ty -golden age -fru mp -enne agram -do wie -digital ocean -darwin ism -cri stine -coun ten -chicken pox -carry out -buen as -bic arbon -bi onics -asci ence -) "@ -ðŁıĨðŁıĨ ðŁıĨðŁıĨðŁıĨ -çŁ ³ -à¸Ķ à¸Ķ -xx xl -woo oooo -wom ened -wa ren -vi ere -thun ter -thor se -simon baker -selfi mprovement -scul pin -sch wer -ro hr -raffa ele -ra yu -per version -pamp as -os seo -og u -nü rn -my i -mar ter -le vo -ko kan -im kona -ili ac -goo ooooo -gal antis -fed de -exce sses -compac t -citizen ry -cign al -che am -ap lace -an jos -amazon books -a av -wash board -u tti -tre ssel -stro h -sig ler -s voice -ride with -reliance ent -promethe an -pel ly -lie ber -kan azawa -k se -john cusack -ichand ra -ic ona -h ws -go parks -fire ball -fanatic ism -fal li -de ssa -de park -de mann -cur sors -cos ito -corn us -chelseaf lowershow -c ts -book maker -bne traffic -bb mme -baw try -avi v -au se -ae b -ab lec -è Ģ -è se -yng itis -ver re -ul mer -toy land -to ck -swill neverknow -sw va -stro mae -stephen hawking -sequ im -prop elling -po index -oun de -or ourke -nor vell -m zee -liber ally -le les -kim o -hit music -getwell soon -flir ted -fi red -et ta -don go -cibul kova -ci gi -ci en -ce peda -brad street -boo dle -bis cay -antiqu ed -ðŁĴĹðŁĴĹ ðŁĴĹðŁĴĹ -âı ¬ -ÑĦоÑĤог ÑĢаÑĦ -work stations -terre bonne -ta im -subli mated -stv j -so bama -sneak ily -si sk -sell s -scimit ar -s market -re ste -queen sbury -per vaiz -nat m -moh ler -meth adone -ironde quoit -ic si -gran ollers -gil der -fu jis -frie del -db fz -dark shadows -daily nation -d live -contra sted -clau dio -ch ole -canal etto -bor na -bigh orns -behind woods -arak an -air brushing -ac afe -èµ · -z wir -z ra -wor ships -truec aller -ss x -smithere ens -sket cher -re its -rapi er -poul sen -plan b -mersey rail -ligam x -l bk -kim hyunjoong -k alia -j ld -irresisti bly -insur ing -idol atry -en ice -elder scroll -dom browski -deltag oo -bryan adams -bou ff -bis sett -ay i -ari b -ali ving -al sati -ah r -un sun -twit ches -totten ham -to var -the crown -synergi stic -supmy tempo -snor ting -share tunes -righ twing -pos adas -pen rith -pantal oons -on z -moon cake -memorial cup -mel isa -le brun -la phro -just like -jac c -ja ina -ice box -gift cards -gender gap -ge il -fish guard -ene a -di mer -delam ere -bolshe viks -bland ing -bill murray -aqu in -winnet ka -watson ville -u dp -thrott ling -te pid -syn cop -st ere -se tit -ov ac -onthe wall -mussel man -midr and -maxi mizes -master ton -madon sela -m elling -lol lywood -lap ham -la throp -l ps -ith ac -ist ana -isol ates -hydro xide -hal ligan -gaz gshore -fu u -fli c -f sm -f ado -er ji -curi os -crusad er -conquist ador -chel e -bro wed -bourgeo isie -bol lard -anxi ety -am ec -al sina -ðŁĺĿ ðŁĺĿ -ðŁIJİ ðŁIJİ -ðŁ§¡ ðŁ§¡ -ìŀ Ń -âĨ Ĺï¸ı -yo gam -yellow card -welsh government -under tone -today fm -tan uki -sx sw -sun stone -slu mping -play warframe -pe ice -nole fam -my les -lukas z -ki v -kemp ire -hel den -gopin ath -foxstar hindi -ent r -deltagoo drem -dai ya -cheer full -care em -boon do -beno ist -baz zi -babys itters -as orock -artinstitu techi -ari elle -اÙĦ Ø£ -youn t -val is -uri st -twee ple -tra uma -t ck -suiko den -sco pus -ry th -round hay -re programming -pro sely -perfect day -pau le -negr on -ne co -ministry wcd -min ka -mimicha kraborty -madein canada -ly d -hi o -her peto -gi re -escu cha -equin ox -dontmes supmytempo -de gen -day dreamer -courte san -cate blanchett -bar ro -b hour -arch enemy -ad aa -. ðŁĩºðŁĩ¸ -! ðŁĺĤðŁĺĤ -ðŁĺĻ ðŁĺĻðŁĺĻ -wharfe dale -wall send -tank top -su hail -speed ball -sl cc -sim z -si gel -sau thor -salvador an -per severing -news agent -na poli -man olo -magu fuli -lac onia -kri stal -kortri jk -jan k -jac a -ft g -free all -fik ile -fan mail -ese tter -e ese -downfor what -doug jones -d appy -cur rier -croatiafullof life -costu ming -carpe ted -c series -bugab oo -bol ing -bas sem -app l -amo tt -a eu -ðŁĺĬ ðŁĺĤ -à¹Ģภķ -ts vangi -tr itt -spelling bee -small holders -ra ph -protru ding -pine al -pee wee -min en -mag is -la kin -karyo tic -kag eyama -is ca -inst alove -hy ste -hot pants -grun gy -ge ot -g naw -free holder -don te -ci al -bur don -bump kin -brun nen -ali pay -ah hhhhhhh -acram ento -) | -york university -vi burnum -un verified -tra ylor -ting a -theafric amentor -the michael -ros ann -pre teen -pre fontaine -pe tras -oz u -out sole -mo ylan -mc adam -markus feehily -mac fad -ko ichi -kin smen -heart breaks -gil son -equestrian hour -du ta -dog walking -dam eron -cosmopolit an -communic ative -chim ney -chick a -chester be -brid ger -brick works -boat life -ad ze -ðŁĽ « -ðŁĴĢðŁĴĢ ðŁĴĢðŁĴĢ -y erin -wn yt -we sty -twit tor -so g -se ob -sa ke -post uring -mer l -mandalay bay -leonardo dicaprio -kno wit -jor din -inf lexi -im x -ic ai -hisp ano -herak lion -ha thor -gyna ecology -gu lak -gib sons -gerrit sen -fund able -disen franchised -devious maids -crow es -cour ted -commu ted -col well -are port -aer ator -ya yo -y la -we at -ukr anian -truff aut -the ming -ta way -sre ed -sl ounge -sky scanner -sk nights -shirec cc -shil pians -san tu -rv ca -raashi khanna -py con -mur mur -mei ko -kur th -keep moat -hann am -flag ell -fen wick -en sion -dra win -down force -di gger -dese gregation -d jim -bucke thead -bran n -birdseye view -bel ittle -be dri -barn hill -ag assi -ðŁĴ ¢ -áµ Ĺ -yu gi -x zi -x rt -va an -ut agawa -un sinkable -twitch play -tre sa -town ley -tod rick -studi om -sc inema -rd chat -quoted daily -poun ders -pit zer -paul pogba -pack mas -pacade mic -ole ary -ok api -nic king -key tar -kay mer -immacul ately -hu leni -har b -h jk -goldenboy boxing -glent oran -f bt -eter no -edinburgh castle -ec lark -dun lin -clean ly -ci ps -chop da -burk hardt -bis bal -bil zerian -ap in -antag onists -yu ya -untapp d -tyd fil -twee ties -tol u -tn k -the cine -sun fire -sude ikis -sub side -spur n -slee pa -shop indie -rrrr rrr -ra ii -prin ted -ofthe game -le ly -ka veri -k zoo -just kidding -igu azu -helsinki uni -forts ask -fin ra -dur den -daguer reo -clu bber -cat ahou -bo vey -as ah -vr chat -thu gg -tele film -squ ints -sk Ã¥ -shock ley -ru scha -ripp ling -ragha vendra -pyro technics -progressive house -pen ter -over de -ni ds -newport beach -muer to -med way -man te -la place -k th -jo lo -gil dan -gh b -dong woon -de frosting -d how -blue gill -. ðŁ¤Ķ -ðŁı ŀ -ãħłãħłãħłãħł ãħłãħłãħłãħł -z tv -yo el -wine glass -think geek -succumb ing -se ast -schu tt -sa ez -s fl -ri jn -reform now -pit ney -pe ch -pan jab -ol ling -off sets -noct ilu -ne ga -mu bi -mot sepe -malaw ian -loo kin -le if -kr acker -it son -in au -ev aded -ed camp -ed accessible -e ich -d ju -colorador apids -clou dof -challenge accepted -bul ger -ba hut -ar keting -a oun -ðŁĴĹ # -ðŁĴĭ # -ðŁ¤£ðŁ¤£ ðŁ¤£ðŁ¤£ðŁ¤£ -ãħ ľ -z oku -worldwar ii -wich ita -wearein puglia -ur lacher -unh cr -tranqu ille -spear fish -saunder son -sau rav -sam each -saluteto service -ruge ley -re decorated -phy te -ot so -ori sts -nex change -ne gate -me any -jere mie -holly hock -he ys -guid ry -fre sn -earth day -defl ate -con oco -choice internationalartist -check book -caric om -ble ue -baji raom -aur um -asu u -ais i -ach ille -wu vip -wishful thinking -wigan warrior -weg ner -unice findia -summ ative -recap tured -pri ve -person hood -p anga -new jersey -ne squ -mac chi -le mentary -inver urie -infra structural -independenceday india -in fringe -ham mon -goo der -gn fnr -gla ssc -gh andi -d ations -chad wick -cacophon y -ca rec -butter ball -bu gis -be ale -appic oftheweek -a store -ðŁ¤ ³ -å ģ -~ ; -yu ju -yas ssss -water down -war machine -tu ggle -ton nage -ter ly -spite ful -spang lish -sleepy time -rox ette -rome sco -ren uka -pu mbaa -popup shop -perfec tionists -palae ontology -ne ces -nba allstar -mn d -mini mus -maz u -mag lev -lea day -ka ela -jap ur -ith es -dx b -by ng -buff er -ber glund -bak in -alphon sus -ðŁĺģ ) -vi ad -train hard -thisis the -t out -river men -raz in -pla ins -peck in -ling en -kom ori -kh rush -keepbritain tidy -kate e -jit u -idle wild -heze kiah -glos birds -genetic ist -frangi pani -dev aughn -crypto graphic -c ads -bu stier -ber ber -baby z -as ari -am ass -í ħ -å± ± -~~~~ ~ -xim ena -x cited -well nes -vin ta -v gm -unci os -torre ira -then ia -tejas swi -ta inte -schrö dinger -radio activity -poo k -ou is -oo tn -medi ating -k able -iss ner -ir ri -ingui stics -in pink -in fidel -ham ble -fra s -est y -dair port -cra pe -comp lies -boat yard -batt i -an thi -am era -actu ality -west morland -we ssel -ve sely -unear ths -underwater photography -un consci -theryan adams -the hill -shu is -sed ative -ralph s -pic ardo -onther adio -o ig -o bert -mom en -ming hao -mercy me -mari kana -mac gowan -lethar gic -johno liver -har ima -haberdash ery -guzz ler -good ger -frank l -feu er -dir tier -cas l -bol sters -ay ak -am bit -! âĺº -world childrensday -west ville -un justified -u hl -turn stone -theni asharma -tatt ers -ta wi -supportsmall er -stra the -stin ker -sm ou -slam dance -skil ful -sauter nes -ram madhav -r fr -quat re -protec tor -pal am -nut ley -movie pass -mfl twitterati -margol is -mar leau -lh saa -he wer -hawai Ê»i -fellow es -f ch -etsym nt -dag ar -cheer wine -change management -bust ard -bu h -bra via -bel lec -b pp -app r -aplayer sprogram -amic ha -accomod ation -åŃ ¦ -van jones -u stin -tri x -tam ia -sward son -siar gao -shou nen -repadam schiff -rausch enberg -r ke -prop ell -pe jic -oc toberfest -o sta -new gate -mo sas -mer co -lake districtn -ko sh -kan on -jo w -indv ban -hur tin -hondar acing -ho pper -hbo boxing -geoff johns -fru sci -fis kars -felic itation -deepak chopra -ddin h -dat in -comuni dad -ch hota -carcino genic -banjar masin -aut zen -tw an -tri bals -team bts -sub buteo -sr at -se ta -sal onga -per ig -over powering -mec cano -mccl ung -mar kaz -ke ss -inve steu -impe ded -ian u -hello fresh -gtas nap -extingui shing -entom atoes -eni x -edo dyssey -e mis -country music -confront ational -bin ned -bhu v -annot ating -ambed kar -x bmc -who ah -ut sc -tou l -th birthday -super yachts -sul la -stry per -smel ting -smar tin -sal sify -roberto cavalli -pill box -pga show -narro west -mye dit -moss ley -mil y -judge mental -her universe -he ver -go leaf -global citizen -gira ffe -fluctu ating -fat ales -cura çao -clay more -cap tors -bu dak -brad pitt -bir n -ba dia -angi es -an etwork -alla gash -al tho -al it -ac aba -ab ita -yu jin -wonder ment -turbo tuesday -su che -si amo -sho peep -shopeep h -s month -pokemonsword shield -paddle board -maz har -kick started -ker ja -kear se -kan chi -k you -hoo phall -gym motivation -gro ton -flam ingo -fair bairn -eury dice -etr ics -em press -dispo sse -dev das -cy press -ce di -bat ur -bar ras -bal oney -... ðŁĺī -ðŁı ĸ -âķ ļ -ಠ¨ -yag ami -vali ente -tinie tempah -thehashtag game -ss oftball -spiegel tent -slou chy -serre mmy -sa pper -pha edra -par to -p cc -ot u -o este -northeast india -ner dalert -merri field -li ff -kookabur ras -kitch in -ital o -housel ondon -han u -h waiting -gov nl -forwar der -f ath -equi ps -conserv atories -clo velly -boost mobile -bic olor -ber ts -bald rick -art twit -accommod ates -ðŁļ ģ -âĿ£ï¸ı âĿ£ï¸ı -âĻ ¯ -z berg -yel ena -south aven -sou ther -sketch fest -sel and -sc ut -roll icking -road bike -re amer -r db -press office -na j -mother care -meet stvj -inver no -ic ould -hulla baloo -hell muth -hall marked -gri c -bath tubs -at b -ìľ ¤ -è £ -âĻ ķ -à¥ĭ _ -ÑĢ Ð¾ -zen yatta -yess cotland -wh io -volksk rant -un ltd -tro oper -ti run -the cw -thal amus -tax man -st rood -sn elson -sm mw -sen ran -sec r -sch ia -photo copy -pakv nz -oak lands -o sco -nu pe -nam biar -mur t -mok sha -mam ak -lakedistrictn pa -josh lia -jay leno -inter course -gr ackle -gen ic -ge tu -ful ci -foo trest -fjor d -e cha -dhoo par -con ger -cau ght -buck wild -blo grt -band shell -azadimarch pti -amit ab -. ðŁĴĸ -% % -ðŁĽ Ģ -ëį° ìĿ´ -ëĭ¬ ìĿĺ -ãĤ¸ãĥ § -zum walt -z han -world con -wi ec -wag goner -uni vision -transl ation -the bad -temper am -sto pper -sla ger -sh q -s bj -rcb v -rb ma -rashtri ya -par mo -mano euvre -m run -lucre tia -ip sc -incol n -id ine -house hunting -gidd yup -epo ch -dern gate -dart ington -cop adelrey -co piers -chec a -catan zaro -carers week -cam phor -bustam ante -bul li -bou y -blay lock -battlefield v -bank sia -ascen ds -as san -antoni oni -americann injawarrior -am ah -alley ways -aldub meetstvj -alab ama -al amitos -worry ingly -ultra thin -u emura -tu sker -ti miso -ta kor -staphy lo -southern railuk -son ice -smoul dering -smol tz -save the -river fest -reading list -proclaim ers -po ss -ny d -ni kil -nbc svu -n of -mis behave -luxury hotels -lu kin -lipsy nc -ks la -ko ki -ju elz -ike bana -hot tie -hiker chat -hau ser -gi ang -emer g -cu shy -brat ty -bch wy -basketb al -as q -anti war -andalu sian -amherst burg -aber soch -' ] -ðŁİīðŁİī ðŁİīðŁİīðŁİī -west bridgford -v nl -so dhi -shutter fly -scar borough -sau ctions -sar far -round abouts -riseand grind -ric co -music biz -mari ko -le cker -l illa -ktn news -geel ani -fli ppy -doo kie -domin gos -close d -che o -cat rin -black star -be emer -a jun -ðŁĻĮ # -ðŁİ¬ ' -warren ton -visi bil -temple univ -t ny -sit ch -shel ove -sh ini -sequ enced -scu ola -quad ri -procrastin ator -pin kin -paper boy -naturo pathy -n ouri -milli kin -mac dowell -long man -le tras -krist offerson -kri m -ker as -ing dean -housing crisis -ham za -gra e -gh r -g sat -fac ing -eun ha -e oi -colli der -bri des -beach house -ar mit -all t -ad den -ãĥ³ãĤ ° -zacatec as -welcom escotland -wa pping -voice first -st ints -sav or -roof ing -ro shan -rec tum -out weighs -ms by -micro array -mar dy -kalaign ar -hand work -guardian ship -fore castle -fen ice -fabric ations -er rrr -ene ch -eat at -ds ound -consul ting -cm world -broad y -break dancing -bp cl -ban del -ak ere -ag pur -af lac -[ " -ð٤ŀ ðŁı¾ -what make -wakand aforever -w cracing -val jean -un ge -twit cho -t li -sy o -stru thers -sha and -mar cy -ma be -l wt -heim lich -heather wick -francis cans -field work -est en -del tona -cycle way -ces spool -bur nett -barba resco -aspin all -apor te -__ . -âľ ° -zoo logist -yor ba -we ard -wall in -tur m -timmer mans -ti ong -this ss -tat ers -sw inger -son dra -si phone -secre te -pythag orean -post modernism -perfu mery -over thrown -orac lec -news man -national pizzaday -mal u -m smes -lede cky -la brin -ke elan -i spossible -holder ness -hel ge -harle ch -giov ann -f örde -er rol -epi dural -dongh yuk -detr itus -cor yn -capital tv -canon ization -blow back -berg mann -be il -ba thin -aux ili -aggi eland -ðŁıĨ . -âĿ¤ï¸ı âĺºï¸ı -yo bo -xx vii -wind ass -we sker -wcc b -war rant -tol and -tele presence -ste ren -sp ath -se sto -sau der -ry den -qantas wallabies -priya anand -paris roubaix -o dr -nick cannon -ni o -magde burg -lo thar -kenny omegam -karen ina -jon ze -je ane -iti o -heath field -ex y -den ney -courtney force -cer ys -burn aboy -beig net -bag gs -ash en -anecdo tal -wildlife art -transc ended -ta via -streng then -show place -sanji v -sal les -returno fthe -princi pia -pau lista -ok amoto -nine inch -mu tu -min smere -manjre kar -lebat ardshow -kene ally -gh or -euryth mics -dub smash -chiff chaff -chi kara -buil da -boga erts -bin nie -ber ner -asi t -ary as -anj ali -agni eszka -abhi jit -ðŁ¤¦ âĢįâĻĤï¸ı -zen on -your boy -ver ry -vanda waterfront -un trained -un original -um t -ty ro -tendin itis -stra ighter -spring ville -simon ds -shop lifters -sapere condiviso -saint paul -prowrestling ts -plum stead -pi stil -phil om -petro vic -ne vere -multic am -mo go -main ers -ma wra -kab ayan -ji ka -hall i -gar lin -fuji wara -fri ston -fast pass -dep ooja -chale ts -c illi -bre reton -best team -b ni -ag ens -whitec ourt -whistle blowing -wau n -vre eland -un dum -uk tv -tailli ght -tag ua -sé bastien -retali atory -remo dsouza -rb k -progno stic -or ic -on star -olek sandr -la al -kennyomegam anx -jer on -islam ism -insu lar -hen ning -gal indo -f ter -exple tive -docker con -design ating -dam bi -culture of -cr d -con me -chor i -car ob -bookaday uk -andy burnham -am ick -aller os -acom munity -ðŁĴĸ @ -º f -z music -yel owo -wq xr -wido do -war path -ti maru -ssc napoli -smu dging -se itan -recur sion -re homed -progen itor -pra shanth -pluto flyby -peyton list -pend ra -mus d -lati mes -kwan za -kev yn -justic ele -jazz music -in consistencies -in cas -in ator -hoy lake -half moon -dementi a -dem ure -criticalrole cosplay -cornwall is -chuk au -chhe tri -car dale -bri anc -b so -autom aton -ar tha -anti thesis -alv arez -alex ie -⼠½ -à§ ĭ -yu kio -wcc b -wash cloth -vijay diwas -venuse swilliams -v li -tt ingen -tro xler -sor do -sl x -shim bun -she ene -rock a -re training -ra ha -proof reader -prolet ariat -pin ta -pedagoo friday -pe der -ortho dox -off shoot -nu gs -newyear sre -n wac -mor illo -man tas -m ure -law man -kishi moto -kenne bec -k anya -jummah mubarak -hiro mi -fan x -eye piece -esc p -eck stein -dichro ic -de aver -cra pper -cou riers -cor us -chand hok -cch l -cas key -biggreen egg -au ss -ag nus -af rance -! âĺĢï¸ı -ðŁijĮðŁı¼ ðŁijĮðŁı¼ -è le -your anon -year wood -un tie -tur nit -tor sten -thom asian -tb ats -swwap niljoshi -sop retty -simple plan -sil vana -se ppi -sat oru -s love -ph wx -mom aps -mir in -mer curio -loud wire -lexisnex is -ko do -kim mie -ki mi -ing ri -ham leys -gar misch -eu x -eng al -e wi -demon a -daily post -cul tists -colle g -c sd -c ason -body art -beer house -ald wych -alber ni -! } -yel ich -water mill -visit nc -unlock able -un attainable -u ct -traff line -tas ki -tal low -st off -space weather -snu ff -smash burger -shep p -secon do -school choice -riv lin -radic alized -pug sley -prime minister -old navy -o aths -nt pc -muja hid -migno gna -michi e -micalle f -lusit ania -looooo ool -le vies -kra ken -ive son -inte gers -immin ently -if ma -horror film -fpj b -fluid ics -f nac -es th -el b -eb bets -ci at -char it -apo ptosis -am bos -ðŁĺī âĿ¤ï¸ı -بص رÙĬ -ti ef -te i -tar ja -t ade -pd n -pascag oula -on asap -ni xie -nay e -n me -music india -mam mary -long board -krak ów -ken der -happy wednesday -girl band -fau stina -fan arts -do tting -dar m -con ium -cleve leys -broke girls -br inks -bas er -ash vili -asan try -ðŁĴ Ī -ãģķãĤĵ ãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ -âĹ ĸ -upp ere -twitchtv gaming -to serve -tat litu -t savo -sigh ing -sav en -royal randwick -ri ks -r tweets -play fair -p mi -nuff said -n mi -lick er -jawor ski -ing ia -ho orn -harvar dh -god child -dol men -dog and -co lette -cit go -bru g -bo asted -blu ecol -ambi dextrous -am ins -é o -tweeta pic -thur n -street dance -stau ffer -scra ppers -pu an -protec tionist -passer sby -pa ia -oxid ant -norm als -nir bhaya -navi o -nac er -ku ip -iri g -ide alist -hishammu ddinh -gro ggy -daver amsey -chukau munna -bla gden -ben ilde -barba rella -auto cratic -asqu ith -asham edly -addisab aba -xer xes -whe alth -val po -v yn -tar ry -tann adice -sw cc -san ts -re pulse -price isright -port ola -o zo -o tros -n gan -mohan shakti -mel vins -masqu reshi -mar ven -magni fi -l mi -krat z -jeff co -je v -intothe badlands -humper dinck -hu masqureshi -hu acan -gun ter -gautam gulati -gat t -e or -crissc ross -cre ech -coonawar ra -co ed -cheer fully -arn dale -app elle -æĦ Ľ -wool rich -vin dol -uk scouting -uf confox -ta ito -t ella -stu dd -si dent -shel ve -resver atrol -prestige diesels -per fi -new world -na ja -mr peter -may fly -lit ol -liberty london -kale y -ill ya -hill sides -head bangers -guard smen -existenti alism -en k -el icious -dew tour -deflec ted -ch lo -bum per -big weekend -bhu t -az kaban -argentine an -andron icus -up turn -u sports -tri vet -the heirs -thalasse mia -ter rains -t ates -sul len -ri ram -recombin ant -re decorate -pp ps -penguin day -pas ado -nottingh ill -ne ys -mugh als -mind map -lu q -ken sal -ig inla -hyster ics -hermen eu -heg depooja -h te -h li -garra way -fu bu -f age -di de -day lily -cri stal -craw lers -chandler riggs -ch eni -campan ella -caip irinha -caf f -bre tton -boutique hotel -be swick -av ens -and black -vol are -vick er -u ca -tri um -too ley -tin caps -super bad -sti fling -steel case -sh ero -sea hawk -persist ently -painst aking -ous d -negr ito -lo vi -laksh man -know lton -hol men -gol dring -gh or -event planning -copy right -contest india -cine phile -cayman islands -caf cofficial -but thurt -bre vity -bat tier -bas ile -bare illy -ba isse -ame al -al mon -ï¸ıâĥ£ @ -ãĥĹ ãĥŃ -âķIJ âķ -á´ ĩ -Ùħ ار -wh yd -uniof reading -under used -uber facts -twitchplay spokemon -test i -sta ite -sne xt -se belius -sa aho -s ll -ru lli -refu gio -qu s -pre dominant -pr ats -potre ro -period ical -passive house -of acial -moneti zing -mo ola -me igh -mandar ake -kh ta -ker win -kaz uya -k tp -issar ae -is y -ini shi -helsing borg -ham ada -gladi olus -g ort -fa sti -equ an -el fin -dough nut -disappo int -def tly -book week -black listing -ber ahino -bad water -as bo -a italia -ðŁĺĺ ðŁĺį -ÙĬ ر -wra th -wiki how -web be -vie to -vid ere -um titi -u mmmmm -trout man -thum ps -thisi sc -tab las -sub due -stra ding -sei bert -s met -releasethe snydercut -rech ts -po gue -pagan ini -oo sthu -nz xt -na har -my re -mixed reality -knight s -kam era -interi eur -infomer cial -h plove -field museum -fati mah -ent en -discord app -detri ment -coffee addict -chicag os -bou cher -boc coni -bach ia -ave bury -arsen io -ane ury -ago toronto -ðŁĶ İ -îĦĨ îĦĨ -war ung -vo g -twit t -the strain -sil ber -set ter -schi ef -rose wood -re sta -penn live -pad docks -ot al -o iler -mis diagnosed -minec raf -le ef -la way -kin ley -ki shore -karan mehra -jail ing -j angle -glass blowing -fau stus -e bru -dont cha -dfb pokal -de spot -cutt in -blan chfield -biop sies -ani zation -alec baldwin -al var -ðŁĶ¥ ðŁĴ¥ -ë £ -z au -wood sy -u haul -te oti -taste bud -stom e -spr it -so ave -sim co -si dings -rocke try -ri kerr -plan eta -par ivar -official pdc -nu eces -nineinch nails -ma zzy -lec tern -le ffe -ke illor -j vp -industrial isation -fl cl -de od -cra vens -ben tayga -bad ness -ba stos -ar bus -ak ame -ade v -. :-) -ðŁĴĿ ðŁĴĿ -ðŁĴĢ ðŁĺĤ -ðŁijĩðŁı½ ðŁijĩðŁı½ -whomade my -weald stone -vig ner -sma shers -simon schuster -sil ang -screen grab -sch aden -pre amble -pan elled -p imper -over turning -ordin arily -mindy project -micro blading -micha ell -mf gday -malvi ya -la gos -k ado -jer ky -ine t -h fs -gigab a -fr drx -forte scue -flo s -der van -crazyricha sians -check outs -bin ary -baltic sea -andre u -a oh -ðŁĺĤðŁĺĤ ðŁĺŃðŁĺŃ -Ë ¢ -ü ck -zare en -yr dsb -venkai ah -the irc -si ssi -popul ating -orange bowl -mrjames may -modern ised -ly nott -li minal -ju alan -inter agency -indefati gable -hi ze -hc dsb -havil and -gd la -fe tta -everybody in -er p -ed westwick -dal it -cu pp -critical thinking -back man -b fw -ari m -aid u -ðŁİħ ðŁİĦðŁİģ -иР» -zou ma -y von -worl dis -woo zy -vi um -urban exploration -tour guide -tom foolery -ti mmer -thri fting -t ole -su ke -sto ch -ssav elives -spoke sperson -shear smith -run nin -ro skam -pra deep -pein tre -oo h -nc ca -me ep -mal indi -m ts -la var -iv onne -in ara -front side -fanta sizing -extrac tions -enthr oned -el ve -draw back -cre atin -coral gables -chan try -black ley -behe st -zak ir -ver gil -v san -ty pal -tran mere -tor ri -to ques -tl x -ther mally -sil iguri -sei yuu -schwarz kopf -same tha -pum per -pre production -paradox es -pan j -ok ano -neck ties -naomic ampbell -mol son -middle man -mass i -mash ima -maj ik -lur ker -ld conf -la bo -k fi -h jel -g hay -don jazzy -debat ers -de vers -dag s -cut let -cole lla -can wnt -bb ctms -b ka -arm yof ---- >> -ðŁĻĭ âĢįâĻĢï¸ı -ëĶĶ ìĺ¤ -x au -would ve -vic arious -ven tre -tre anor -tra pad -touri s -su su -shorth anded -sed alia -r sb -ninj awarrior -new scientist -nd re -mun chen -mahog any -k rane -jo balert -ice gov -heske th -gored forwomen -fish bone -fi bula -endo scope -e gh -corin na -block ages -art ag -aristo cracy -. ðŁijĩ -ðŁķ Ļ -ðŁij¨âĢįðŁij©âĢįðŁij§âĢį ðŁij¦ -yn olan -va un -u zo -the elephant -ted talk -te sty -ta shan -ta ji -swis scom -sun power -scol ari -revol ver -rash ard -ram blin -ra an -prin cen -pin afore -pai ste -onther ise -naz ca -mrin poche -monte verde -mas thead -ma at -low en -kurt angle -jol ley -inter professional -guit o -gan e -fakel ove -eyeson you -do hc -dd ha -davi dal -cul tof -cre m -ch aus -cer ca -car and -be friends -bbow t -arter ton -air venture -ai der -aham sharma -aaaa aah -a ama -ðŁĺijðŁĺij ðŁĺij -ðŁĩ¨ðŁĩ ² -z han -wy dad -wra sse -we tv -w ente -vel shi -u hp -to so -spe a -re invent -pun j -pott inger -or nel -mitsu i -mb app -lulla bies -lin ville -kam inski -k anga -int angi -hpe discover -guen ther -gi zzard -econ d -di gga -chan hassen -ben adry -bed ingfield -battle ships -auto expo -amerit rade -ãĥ» ) -âĻ¥ # -âĢĭ : -tar anto -student voice -st ents -squee gee -son ography -sol f -sher rie -sac bee -s finest -red nation -py con -procor rpcrd -pin cushion -persi sting -nat con -mvp buzz -man ews -la ssa -ja jaja -ill on -ha bra -getac tive -fa ren -er h -e redcarpet -diabe tic -cra vat -cmoffice up -chor tle -care l -car phone -car luccio -baad shah -ak ua -water boys -w mtw -v room -tis land -ste ful -s ÃŃ -ruden ess -radha krishnan -post colonial -po sies -pit fall -perpi gnan -per ching -pad dington -nfu countryside -manspla ining -madin at -lett sville -lam bretta -la under -kap atid -jour i -jale bi -invicta fights -hur on -he seltine -hard boiled -grave stones -gel der -fant asma -dry land -desper ate -den otes -colon ie -cat chit -carter sville -bl b -bird bath -bab ul -ath ome -ai zaw -าภ§ -z ade -wish youwere -westhe imer -wegot this -un tethered -the vikaskhanna -ten dering -swim bikerun -sky force -sc ouring -ro sea -ram paging -pal co -out pacing -oc el -now lan -niall horan -negoti ates -my news -moment um -max illo -l pi -in my -hplove craft -hol loman -fresh start -et su -du jardin -du ffer -d acre -cr di -cosho cton -bro ach -blo tting -be do -bal asu -ar ousal -ðŁĻĭ ðŁı»âĢįâĻĢï¸ı -ðŁİ¾ ðŁİ¾ -wt cr -un reserved -u lic -tre sco -tote ms -til den -stylist magazine -spor tin -shi van -sad af -row es -raw ling -rav ages -quim by -qu ary -pra ger -or omia -ohi op -odes za -ober oi -nz warriors -mor ano -mon stro -mign ano -maj u -lit ty -ki hei -jim ny -im thereal -ham p -hair piece -fi ggis -es ong -embol dened -di oni -cu pra -cam an -call ander -bil o -amc bride -al ow -ë¯ ¸ë -zi zi -wreck ing -wo bbles -will o -wen i -uniof bath -uki ah -to kun -the matt -shutter bug -ship men -pu ddy -prah ran -post en -pon son -pe yote -pad don -p vs -nad ya -mesmeri ze -mel ayu -m pho -lar ri -kani ka -kam el -hipp est -go panthers -first lady -farm house -dont giveup -dispen sation -concealed carry -citron ella -ches nutt -bri sk -boho chic -beer festival -ba rents -auto cross -ar ndt -accep tably -ðŁIJĿðŁIJĿ ðŁIJĿ -ðŁİĤ ðŁİģ -yaroslav l -x pert -w pt -tat u -steve carell -ski umah -sal uda -rothen berg -rever ted -re shaped -r li -people sclimate -nik ah -long wood -lew i -la jolla -la chapelle -kun da -julianne moore -jichang wook -holli ster -fruit vale -for gave -flat line -fin nick -edex cel -dou te -de tract -confec tionary -char min -bru hh -bri dgers -bo im -bo ggle -bicarbon ate -bad ami -av aram -ðŁIJ ² -Ì ¸ -wolf s -whywedo research -u moja -sukhum vit -shrie king -scoo per -pin tail -ol ha -o stap -mur al -mid gard -mck ayla -le ps -in ad -if pri -hen man -gwa ii -golden eagles -geo location -freef ood -fly high -extravag ance -e ji -dar uma -care ssing -book sfor -bon nell -ble ch -bac illus -ಠ¥ -whoo per -wh oooo -vik ramad -usch amber -us kin -trojan pride -track xc -taylor sville -sy outh -stray kids -spe wed -sco ffing -ric kety -re map -pro polis -po is -plan che -on te -o bra -milit ancy -mc ferrin -man nix -l hc -kat ter -infe ction -hun s -guil herme -forthe future -faber books -end bsl -edgar do -dl x -ce sa -brick lane -australi azoo -ameli or -agn elli -Ùħ ÙĦ -ya ounde -vidy ut -u mang -travel bug -sur in -sol vay -sim plex -shu ka -se cord -sa hu -re illy -paster nak -pag a -ol lis -lo hud -kum quat -he wit -hau gen -gren del -gl k -fo tboll -f br -dr acu -devi zes -cur rington -chun ky -brood mare -be aked -baf f -aero sols -^ ~^ -ðŁĮ © -ìŀŃ ìĬ¨ -zildjian company -you ha -x f -va ar -us amb -the fox -substance painter -stable ford -si mo -red light -pat ting -pag osa -off loading -of fu -magh reb -madele ine -lad der -l alli -jun ge -j ml -j ago -in alienable -im maturity -hell enic -hate speech -frogg att -forever young -flan ks -cruise ship -craig david -clu tha -choke hold -chick adees -carriage works -cam bie -ber tin -aw it -) [ -è ¼ -ãĥ ¨ -áĥ ļ -zi us -web fest -voice mails -tr and -stre gis -sla dies -rub ino -rafi q -quit smoking -mu gu -mo ira -mati st -master race -lin nets -law l -head hunter -gou ver -golds gym -games workshop -franci acorta -fil son -eth at -cro hn -col ander -car sofinstagram -bu ta -ble st -b wp -as occer -am bur -af air -uniof adelaide -un cler -u indy -tow nie -tin ib -the timmcgraw -tau ghtme -synthe sizing -strang ler -stac ia -shar ry -se ssed -rockn roll -re pubs -ping u -ork spolice -or éal -opp enheim -oo ther -o eb -nor bury -lang ou -her cule -hard wired -green bay -for ma -fol lette -fiercen ess -em elis -den ser -de urope -dd f -dan by -dag u -cul tist -chil la -brig antine -blood sport -amazon deals -al bon -Ù ij -wor thy -tse mrinpoche -tool bar -tiv itis -ti krit -te rex -tag es -south bay -simon sinek -sam bil -rupi ah -rough trade -ro saries -ra ffy -poz ole -polar ised -phylo geny -parsipp any -os de -ol dro -obey ed -na jaf -my lene -moo sa -michel a -mariob atali -juno awards -ju ez -jab ar -inst aphoto -getit live -foo k -fm la -far rer -eviden ces -ennis cor -dopp io -dele uze -crime prevention -cleveland art -cam elia -bl acking -be ac -bar illa -ar rr -and newton -yodel ing -ym d -vi enne -tur ban -tsvangi rai -tin o -tas chen -sli med -sex toys -schneider lin -savethe planet -rhett and -rebel de -ran bu -nau tan -mu p -leish man -le jos -ke inishi -jer k -jav ur -j pa -immol ation -h wi -gr n -fried kin -fc g -euph ori -esk en -cypri an -cosmo logical -comra de -cold ness -at erial -ash man -app raised -ai ken -ðŁĩ¸ ðŁĩª -ze bo -za hara -wa dia -unitedwe stand -underwhel med -touri sma -to pr -tam ron -ra sk -pri z -per spiration -pann u -me tan -lor demusic -ki pl -kar ia -joondal up -ilo vic -for bids -fi o -desro siers -darry l -christmas shopping -bajiraom ast -as anas -ane urin -alla gash -alber ton -acos metics -ðŁıĮï¸ı âĢįâĻĤï¸ı -ðŁį µ -ç ı -wha aaaat -w pix -vege tarianism -under lining -tam al -stun ners -squad ra -spondy lo -slow cooker -ski b -si wa -sh aya -s for -ru ts -ru iz -rhine beck -nec ke -nam ba -ludo vic -lc n -kl at -john jay -jin go -j fa -ij m -ha ki -go pi -gir van -gau ss -expat life -dont stop -cre denza -co stam -cat amount -car ville -cac i -bicic leta -abbot ts -ðŁij ³ -âĿ¤ ðŁĻı -âľħ âľħ -âĻ¥âĻ¥âĻ¥âĻ¥ âĻ¥âĻ¥âĻ¥âĻ¥ -y vette -wymond ham -wack o -tu ris -the tical -the offici -strat is -sin clair -simon j -ry uji -rest i -ra gamu -porth madog -page antry -over laid -newton ian -nbas ummer -mor phy -me drano -mass oud -mam aron -lu ig -lor can -longre ach -lon ey -lions gate -ko ga -k lara -ir ma -impe dance -hydro gel -hidd ink -gore gaon -fr ink -emb laz -dg i -dark fantasy -cq uni -cor pse -colon y -collo idal -che shunt -buck shot -boy ds -ba ab -amazon smile -ag waii -aday in -% ] -ye ye -white hurst -toron ado -thaw ed -swe eny -shri gley -rival ed -rit ts -play date -pep ys -pemb ina -pas olini -ori de -mit ral -mccau l -mar ies -mac bookpro -jarre au -incre ments -hp cl -green screen -gar dn -foun dries -doo o -dispat ching -ched in -char mers -bri ano -ble ak -be veled -aw omen -asi ancup -anar ancic -ahmad inejad -yeovil ton -will fully -water tight -water son -uv acha -standardi sed -smok ymountains -sm rookies -sha ad -se mble -scar pe -sb news -re mmurd -queen sc -phen yl -petter sson -patron ize -nest ling -mor ta -mis ssa -m elli -ly can -local ities -jo bim -i oni -home builders -har f -h sh -ga sification -fre snel -flu g -e ireann -drag con -dj embe -del son -config mgr -christ ina -ca ity -c moh -business development -baltimore sun -ani um -am adri -whot els -vp debate -tsu ki -tra ste -timiso ara -sti ffer -stat o -snoo ty -shi koku -reggae music -rede ye -pur cell -pro getto -pir s -perl mutations -par tof -oooooooo oooo -national girlfriend -montgom erie -la bi -kari ba -in ard -har deman -hal in -gurup ur -gu shue -ge stern -food bloggers -en ola -dy ckman -dee zy -d illion -con wy -cis f -ch inst -cb stv -black thorne -belag avi -az lan -ay oub -at am -ang ina -alumin a -ðŁĴĦ ðŁĴĭ -ðŁįķ ðŁįķ -âŀ Ŀ -zeec ine -z apper -wild horse -u play -tt c -terry crews -sun chat -spe ke -slu sh -se eyour -peshawar attack -pel ted -pe tul -omor row -nizam uddin -neur one -mi dair -mer win -megal om -mc duck -mariska hargitay -maine coon -kran j -kev ins -inter con -identi fier -hale akala -gro win -gre ssion -frusci ante -fo zzie -eric clapton -dri ppy -dor drecht -dip set -con nick -ban yak -anderson ville -an iso -acur ry -a afp -Ï Ĩ -wx brad -wd tn -un painted -tripp ier -travel addict -tar kan -super i -spiderman farfromhome -si ddle -shu cks -san ada -ro st -ra as -poe ia -ov ate -old bury -ne yo -n é -mor pur -mix in -k fox -ine tt -in ab -horton works -h va -go sden -fay go -er de -em h -dragon force -day e -davie ss -dark net -clo the -by ker -bi ggy -audi os -ðŁĵĪ : -ðŁ¤· âĢįâĻĤï¸ı -Ñģ к -whit son -vise grad -vel led -taste makers -stefan os -sm s -over do -nul l -ne wey -min uto -mil on -makeyour mark -mac chio -lor in -lor imer -ko bra -ke cil -jcp sky -it ag -ham achi -free ways -fo v -fl inging -dig al -blo gg -bel grano -bel court -autom ne -ar rr -ale mania -ad ow -ðŁĴĻ . -ë°ķ ì§ĢíĽĪ -young ins -with ington -us amy -un following -tunn elling -tam arin -tag us -super footy -strat en -spla shy -spec tru -smart doll -po ps -out work -of icial -nap o -mir vish -metro poli -me arns -mav tv -marke tin -m wal -levenshul me -l ho -know able -ke itel -jb hifi -interce de -hatch ling -go warriors -for duk -ex ol -ed to -dreamscape ph -dor noch -cou pero -corn el -competiti ve -comm ander -col let -cla pp -centime tres -ca is -bubba watson -bro der -bren nen -blit zed -ber als -ay on -au du -aru ah -ami able -aitch ison -a pop -ðŁķ µ -æĸ ° -âĻ » -ym ama -w q -ver tu -tribe caf -trans fusions -tit es -thereal dj -taitt inger -summar ise -shor ts -sbst df -remember when -rammadhav bjp -oco ee -ma sar -le cular -lar key -king fishers -kimjon gun -ke vor -k voa -hel berg -heal d -for success -en circled -dan kie -co fc -chain link -cb j -ca chet -b ams -australian army -all startrek -¬ë ¸ -zale z -zain imam -z anna -z ala -yuz uru -well y -un reachable -u len -tom king -tin ting -tin ny -tim bre -the history -sy sco -spr itzer -spect ating -sor in -sioux land -sher gill -shad well -sarath kumar -sang akkara -raes remmurd -quick step -night clubs -meal worms -me ager -le om -it ri -hygi eni -huss ars -goe son -gid get -ft n -fat belly -ed ta -de whurst -dann o -da q -cri sler -columbi asc -ch inn -brac co -blu emo -big ny -bexley heath -ber tone -: .. -! ðŁĴĽ -âģł âģł -à® İ -اÙĦج ز -ye hey -wool ton -wang sa -twit tter -tul low -toler ates -tik tik -suga red -star girl -south wood -skybetleague one -see ps -sajj ad -sad ar -ru ki -ri dings -pin tof -pi eta -octopu ses -non invasive -n kt -mobo awards -lat ur -its whatwedo -is of -is ba -ij esse -icha el -ice dogs -hum vee -gl sen -gb chefs -frac as -f á -en vi -ea v -dw m -dori an -dar n -come down -cla si -cib sunday -c dot -bu tuan -bob weir -am ys -agar za -ac ri -åı ° -ãĤ¸ ãĤ§ -ал ÑĥÑĪ -y agi -xia omi -wizard world -vince staples -the walkingdead -so ke -sil er -sheff docfest -rhe on -retro wave -rad ke -r mac -pu tit -nissan usa -mi sper -mawra hocane -lindsey vonn -lam an -la hinch -hu uu -fu ad -flam ini -fa hy -f cu -de aton -cy lon -cr ê -chi kun -chi bis -cel is -calri ssian -cab ra -bi let -ay esh -at tock -ade wale -ú l -z uki -vi dal -thur so -sun anda -shake shack -robert son -red un -re balancing -rag ana -psilocy bin -parti r -ny te -mer rell -mel ane -matt smith -manay unk -l leyton -ju mba -gw b -guy ssss -flori dab -e bron -dout zen -cotte sloe -cavall ari -can ti -bre ll -bi gil -bc ps -ba is -ah ha -. + -ðŁij¼ ðŁı» -ë¯ ¸ -ÙĨ ج -yak ov -word camp -we ssels -uk hashtags -two some -trac ee -tag le -sun bury -spin ney -si mas -shar at -sep tembre -ran some -plexig lass -p ng -ni bali -mor tel -mahar ani -kur nool -kr qe -kl u -kick backs -ket u -karan singh -kar tini -kaleido scopic -international womansday -ice e -gre ll -ge tolympus -forthe cure -fc s -f ends -ev angel -estu aries -chro med -cer ny -catalo gued -canad as -cab are -bri mley -b ty -acom ms -âľ Ĥ -zo vic -tar ia -stereo gum -space balls -single market -si wan -satyar thi -sar rain -rela is -re stur -parachu ting -palom afaith -nike id -nau ts -mal ti -liber tarianism -leu co -le mi -jung frau -ijesse williams -fri dakahlo -fawl ty -edint fest -deli verer -bre ra -av x -amin aj -ðŁĺģ @ -çĻ º -ãģŃ ãģĵ -Ø ¬ -алÑĥÑĪ ÑĤа -wal led -tribu taries -tobias menzies -ther lands -tax co -sc ie -repri manded -pud gy -power tools -polyglo t -poll ster -pe les -p soe -or lean -moroc can -men no -mamaron eck -loril oughlin -ko kop -keepthe ban -julian castro -hand hel -gull wing -gro k -gi k -gen na -ge ir -g ddr -der ringer -d sei -cre sc -cor vet -clavic le -christma slights -chhat rapati -chap ters -can iglia -butt ress -bhu sa -( < -ราภĦา -young justice -the athletic -success story -so pot -sav y -rosne ft -ri pert -rhi mes -pw me -pol lok -nirup am -na deau -n saa -n eng -mu sprime -melan in -mag ners -khrush chev -intrac ranial -hy ori -holiday makers -goe bel -gh el -four somes -fal well -fa sia -ev ski -dw g -coning sby -cinemathe que -cbstv studios -cardo zo -cameron mustgo -assassinscre edodyssey -angeli ka -aly te -ðŁĶ ħ -ðŁIJ¾ ðŁIJ¶ -ðŁıĨ âļ½ï¸ı -ðŁ¤¦ ðŁı»âĢįâĻĢï¸ı -à¸ŀ ร -w end -viv ah -ure thane -un funded -ul ar -u ol -tur bans -tal avera -ta di -synchron ize -stil well -reve ille -re ye -p co -o ac -mono gamous -love bird -lav any -lang ar -khair a -hay lee -hair by -food borne -fix the -dru ck -docu series -con fed -city hall -chu bby -calf skin -broad gate -bit urbo -be eline -barr head -bar ti -amar th -ãĤ« ãĥ¡ -youcan doit -wh acking -vrin da -vam si -unra veled -ty kes -toy z -toron tomar -ti zing -thor sten -the gef -ss bu -sou dal -sab tv -s only -pollu tant -pedd lers -pe geeks -pas qua -out fitting -nup es -minute beachclean -mb ar -lin oleum -li sk -lar acroft -kel apa -kab uto -jun ji -jel ani -home depot -gla swe -gla dio -ger ber -follo will -er ato -ene ws -eager ness -cultiv ator -cir c -car lil -cap rio -c ge -c fg -brand in -blu eraiders -bin das -bar g -attribu table -ðŁIJij ðŁIJij -ðŁIJ¢ ðŁIJ¢ -wal singham -w da -vy pe -sushmit asen -sp ana -seven th -sam path -rhe ma -paris nice -neal on -mu lat -mbapp é -let ons -le tra -ki sha -keye tv -keinishi kori -k hari -ji mo -honor ably -ggg boxing -ekur huleni -cbc north -cathay pacific -bu ba -bri die -ax y -ani st -andre scue -americ ang -ðŁİ¤ ðŁİ¤ -wel ds -top con -tame impala -stock hol -sta edt -sa em -rin os -religi ou -rekind ling -pr an -porthar court -play az -photo de -opp er -nl tweets -mest alla -mean ey -ku rian -ivy league -gr illin -fe kir -dig itech -dau x -chro mic -cap s -bun dle -behavi our -bas so -bang i -ar kle -agric ole -aer is -ðŁıĬ âĢįâĻĤï¸ı -ðŁĮ ¯ -âĻ¡ ~ -well park -wat tage -tor menting -taun ton -tablec loths -sub machine -su eur -sonus ood -sate en -sam claflin -sachin pilot -ro p -re plant -om gggg -od do -nor dea -nev ins -nashvillec mt -melbourne city -mari ucci -mangal uru -lind ell -jake paul -i abc -hurt ling -hood lum -h re -greek life -grapp lers -global goal -gaz ed -franchi sement -fo glio -el ms -delo ach -cu uu -coupero gers -commercial property -col um -canber ra -bob tail -blan kie -bet victor -arrow verse -anni ston -zu bin -tv onetv -t mea -sme thwick -sme e -small world -skyl er -rose mcgowan -rit ers -re productions -phleg m -nonleagu ecrowd -nandam uri -nab ila -mid shipmen -mal ham -live chat -lar ain -l ancing -ki b -inadver tent -in life -higg inson -handsom ely -green lee -goo dy -go tz -g posers -fd m -encyclo paedia -en co -doug benson -d tw -con tending -circu ito -char ly -chaffe y -ball room -au ster -arch ies -a him -££ £ -ye oman -x ls -vo da -un conference -tu rok -to dt -thro yd -the moon -tal ai -symbol ically -swar agini -suffo cated -success ors -stream lines -sh aked -sei fert -ri so -provi dence -pric eline -policy making -ply mpton -phin ney -ot ar -of ootball -much h -living room -ku cha -integr ators -great dane -gg ah -ethi er -el roy -dra is -dr mike -de seo -copen hagen -caric aturi -bill kaulitz -benadry l -ben thic -bat as -aminaj mohammed -ys i -yaa as -tø p -swoo ped -sun shade -stan tial -shre ve -sel wood -se hr -sad dening -ri op -rep elled -raj ak -promis cuous -prioriti zes -platte ville -ncaa season -nbasummer league -nak shat -ment on -lie der -kare t -ka al -jav ad -ital ics -id sa -han bury -fifa u -fass binder -dj paulyd -dispon ibles -ch ex -c wi -blin ked -bio hacking -as ur -âĿ ¥ -wh ky -uttra khand -tri bble -th ak -ta ik -sin city -sco ffe -saul nier -riot ous -ric oh -raw k -rac s -olympic torch -novosel ic -news beat -mit ter -mir field -may bin -ma har -lymphe dema -love good -limb ing -lemon twittor -kle en -k sat -img models -hil aire -ha spel -gel ert -ffr f -do se -dick enson -dicho tom -del bert -dc tech -commi sion -c slewis -b ink -aur yn -ar ica -abyss inian -ðŁIJ ĵ -æ ¢ -wicom ico -w bls -vesti ge -upad hyay -un suk -ty pist -ti en -ta kuma -soap awards -shi els -saucep an -salt ine -rut land -re eland -pre dates -pp o -plac a -os asuna -mill town -mari huana -mar ro -kush alt -kis a -john j -jess op -jailavak usa -ino ble -illumin ate -heav yequipment -h ry -g th -dim ly -de sales -chin atown -bier stadt -beat les -aser rano -ab ly -ðŁıĩ ðŁı» -ye eye -vid alia -u ip -ty ron -trump ism -trouble makers -total itarianism -the arjunbijlani -termin al -ted med -sp ack -scon ces -ru ber -rapp elling -pu ppers -plan tronics -pay s -mrs funnybones -modu lator -mill y -mandi ri -m smar -laksh mirai -kam ba -kal lie -ka un -k ome -il ab -heat sink -hawk ish -half moon -gir ders -gand ang -di vis -desig ni -cl dr -ci aran -celo teh -camp agna -bestofthe best -bar ilo -ban dido -b movie -a ala -ðŁĺį ) -ðŁijĪ ðŁijĪ - ¬ -wil bert -wi at -viking river -us ine -tou cher -t ills -sque amish -spe e -shapo valov -sgo ing -saty agraha -quin cey -pryn ce -pac i -new mont -mis ing -mi gan -metall ic -melk sham -mahon y -luc kier -lets goo -lab h -la vey -l ton -ke men -jabber wo -iphon ec -ilay araja -gi vings -fatbelly bella -ever rr -engv sl -eli ze -dre e -corr ales -conjunc tivitis -chang kyun -bunde swe -bis set -bio chemist -++ ++ -ðŁ¥ Ķ -Û Ĵ -ı m -usp hl -tow cester -sc ircle -sc apa -sam yang -ro shi -rin jani -rho des -raj cheerfull -projec tiles -oul ster -o hai -ne ce -nav jot -nat suki -mark ronson -mad dog -la hori -ke agan -inter woven -inter league -i ban -hof stra -hi k -goleaf sgo -foli gno -ex y -em r -du me -cyber jaya -crew man -cor ben -cli ma -chapp aqua -cel ly -bo ya -bi fa -bank s -apo lis -an kar -west cliff -weare thepeople -vo il -uygh urs -ur kin -tt le -taras enko -silver plate -sign ment -shin obu -set ts -sanjay uvacha -refor mist -or puw -nuev os -net care -na thi -morri sey -me tuni -li vy -laverne cox -ky te -kir kin -kei ji -it sp -irr ationally -in africa -heter onor -happ pp -gram edia -goose berries -du pre -cu bus -candidat ure -ca eli -ayotzin apa -as adu -ar os -anderson paak -๠Į -war n -v cats -under pins -u bm -tj maxx -thir deye -tele graaf -tassi e -slug fest -sla de -sh eng -rolls royce -regi ments -pheno types -petti bone -palin dro -pabst blueribbon -old car -nt sa -nepen thez -nat ali -mo tom -mal ky -la peer -kreuz berg -jyo ti -it rtg -invigor ate -honey ed -f ti -emory university -duck man -doo dler -direc tx -ding le -cloak room -chat swood -bur russ -beli al -anan si -am s -ak k -ack ley -:) ))))) -ì° ¨ -âļ«ï¸ı ðŁĶ´ -âĹ Ķ -ye tte -ye ssss -x us -w sm -vic en -v um -s link -puri fies -pleas an -nic olo -min uten -maker faire -ko blenz -isi baya -inter activity -ing club -hindo stan -hand prints -grac eland -glee ful -gi ff -gh id -father ly -equ alled -dissimil ar -cow art -bra sov -bou te -apol los -angle sea -af cw -ðŁĺĺ ðŁĴĻ -under utilized -tosk ana -timbur ton -suk kot -stu por -sou s -slu t -see mar -r mi -queen sboro -pur pler -prophe tess -p tion -or ical -mou les -lun den -little wood -lindsay ell -lid ded -langui shing -kel o -infec tious -hot box -fran sisco -fck in -evil geniuses -drum kit -drug by -dar mian -cop se -conson ant -cann elloni -can tera -bl ore -bab asaheb -** * -ðŁĶ´ ðŁĶµ -ðŁIJ¶ ðŁIJ¶ðŁIJ¶ -waig uru -w no -vincent e -us rowing -un m -toron tor -till and -spra yers -sik ora -share goodness -sal ama -pi galle -pe co -official slc -noi sey -n aci -mus ick -mo en -lu dgate -kc chiefs -jit tery -interior styling -inter lo -ib d -hum safar -hick am -her riman -harvey nichols -gu ttenberg -fire fight -fa hr -emi lee -eliza jane -doo han -disney onice -der showitz -denne hy -decep ticons -d ml -cn ty -clim ited -chess board -capu ano -bol as -birmingham mail -bird fair -back lund -b anca -apu lia -anou shka -ago ddard -. ðŁĺĤðŁĺĤðŁĺĤ -ðŁİ¶ # -ãħ¤ãħ¤ãħ¤ãħ¤ ãħ¤ãħ¤ -âĸ « -ठ¼ -worka holic -vo xbox -u daan -tur ds -tu ma -tro tz -suppor tn -stock photo -sp itt -si se -sawyer frdrx -road tor -re takes -rapp ahannock -picnic king -para pet -p nas -nordi ques -ni ente -mil agro -marit za -lu ces -lossi emouth -le ef -kyo ko -ko ppel -j lo -infini x -hu bei -godz ill -equality forall -en gulf -du uu -dopp leg -d als -bro ss -bounce back -bi weekly -bh x -bab ar -an gra -. ", -ðŁĴĥ ðŁķº -ìļ© íĻĶ -wel kom -w ya -var ghese -tri anon -time smag -tib betts -therealluke vans -ten sor -sel vam -sch open -ri zzle -re invest -pi ya -parasit ology -one one -om gom -neural gia -nat omas -mini game -mark warner -local ised -ll l -kat vond -immigr ant -ho ho -gra ig -freak ish -for mayor -fif pro -dra wl -art sy -ap w -al tec -acron is -ãĥ¼ãĥ ł -س ت -yggdra sil -upper classmen -un mask -tro ph -sk itch -sho shone -scrib bler -roof ed -re ining -phill is -o zy -mur ty -mind storms -liter atura -left field -l tb -ken ichi -k atta -gal aga -frankfur ter -fr t -fing az -down plays -dhi kr -cru s -con ning -chad li -call backs -apostro phes -adorn ment -? ðŁĺĤðŁĺĤ -é¦ Ļ -za ade -yeswe can -yellow claw -ws bradio -whel don -tori als -tip is -testar ossa -sweden in -su meet -sl sc -red skinst -re agh -nyc schools -multi racial -lu tron -ji va -hand brake -go tch -glo bies -embroi der -e iner -disney side -darke st -curragh race -cur ative -comedy night -chu chu -bur l -bry on -birch all -bar wick -b nr -aw y -an tro -americ ana -all ers -ðŁİĤðŁİĤ ðŁİĤðŁİĤ -ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ -ye aah -y ancy -water deep -un washed -uk as -tri alist -takor adi -sun tec -stanford med -shr iner -sa en -pg dm -pakv sl -of r -obrig ado -o tho -mini mums -langh orne -lam m -ksen ia -k and -je h -inyour phone -herman as -han sen -guadal canal -gru mbling -gor dons -friendshipin apicture -flabberga sted -eye witnesses -eun jung -drake bell -den ote -colle yville -cloud foundry -che sted -camar go -ba de -aren ado -alber tine -air soft -ç Ŀ -à¸Ļภ° -ଠ¾ -year ns -wire grass -thorough fare -ter idge -sco ped -s bay -rigo letto -ride out -reel z -quin ton -po ston -pa vi -may b -mar ae -kh lo -jun kers -jc de -j evon -ili ans -id fa -hub cap -hop kin -hig don -giac chino -exter nal -dn n -cru iting -cla wing -ci i -brav ura -bra z -beat a -anti fungal -ðŁĺ´ ðŁĺ´ -ðŁĴĻ ðŁĺį -zay to -tomking tk -thi am -theri ver -stu ber -strang ford -scent sy -ru la -polar bears -pen ess -no wor -marc maron -mar com -maker spaces -jor a -johnson ville -je te -ha ben -green army -gan on -fox hound -e gged -do logy -cer ys -beat itudes -bag i -ba sia -ati eri -acne studios -ðŁį¾ ðŁį¾ -âĻ Ķ -vampi rella -tri ver -th of -tee j -super cool -stabil ise -sit down -san ju -sag an -sa cher -ram bla -rag thakur -ra damel -puffer fish -play school -or pen -mel lows -long ingly -lin ney -la xton -k cp -high five -geom atics -ff vii -ent as -ched dar -ch azz -ceri dian -cardio logists -cap size -brew dog -bli the -becc les -as ko -acas sandra -yor o -y im -x lf -vijay television -verte brates -trans net -trans its -tik ki -the ahl -star lite -si achen -she reen -se el -saty ajit -ne ena -mam moths -kingsof leon -kat rine -jit ter -jd morgan -homo log -hl th -gro en -getz laf -g town -fluffy basil -fin ing -ex ofan -ever rrr -du ffy -dra bble -dis arming -de mian -cre oso -chro mia -casi ancup -capit ano -calgar ians -c ve -berl anti -behavi oral -bacter i -aw ani -antic o -ak oz -achi o -ac aster -ðŁĵ Ĵ -à¸Ńภļ -yar borough -wo je -wit che -w mp -v ire -ta kings -sp ats -rise up -quiz master -pah rump -nu mp -nikol aj -lu ar -kabo bs -ii hs -horse sho -hi spani -foun t -fl x -fif tieth -e gel -cu gat -cruci ble -close up -cate ch -cail lou -bott ura -bla ster -bally mun -as olo -array it -allo gic -... âĿ¤ -ðŁĺĤ ðŁĴĸ -ðŁİħ ðŁİħ -yyc traffic -we were -unic redit -un ashamedly -ta ppa -stre at -sar oj -roo ve -rhe um -red der -pir amal -ohio statefb -na sik -mo tha -mac ke -lo han -lapd hq -ip n -ing al -hyper local -hot point -honey pot -fli fe -fel ine -desper ados -dark stalkers -cth sfb -ch ora -cas ale -ban ar -and ering -aim high -adrian aci -adrianaci oci -aan am -!! ðŁİī -ðŁİī ðŁį¾ -⼠³ -vango gh -try p -st ice -st f -south bend -pl ats -pare sis -o sw -mon tra -mc on -lac ri -kho ff -inevit ability -high speed -he ena -hand rails -for tresses -fi eg -f wb -ellen sburg -dre th -dil g -cyst itis -chri sta -chauffe ured -bay lis -ahmadi yy -aerop lan -ðŁĩŃðŁĩ ¹ -ر ÛĮ -windy wilson -who doyou -war by -unfur ling -un ia -to action -thrift shop -the fat -substitu ting -smik kelsen -shape ways -re organize -re appearance -rad as -planet ary -p fg -oosthu izen -naz aire -nam u -moor ings -men a -mar jan -ma kha -lin dau -jay de -isle worth -hope lessness -hol combe -hel wani -flipgrid fever -env hist -ele f -cuteness overload -creatin ine -bun c -black sea -bhumi bol -beef heart -ban ta -az evedo -anton off -!! < -âĸ« ï¸ı -touri stic -tol man -syn ch -river land -rhettand link -over heat -od awson -mul gee -long form -ku k -intermedi ates -ink scape -in habits -ici de -hi stop -financial review -ef teling -door knob -dent su -de compose -cur ritu -co to -camp in -camar ines -bt fc -brendon urie -brea keven -bo iii -be ker -all sven -abhiman yu -a iders -x li -usa wrestling -uni west -tuscu lum -thar pe -tam ra -starbuck suk -sque aker -scor n -sa iga -ra shed -pra g -pla ice -pe ppe -pat audi -nr lgf -noplacelike home -mir ra -michel ada -melaniec music -lom u -live mint -la fontaine -ke at -je mber -it ai -inter nationalist -inst ago -i etf -ho gar -her an -gonor rhea -giam atti -fa jar -der mpath -den tro -dal y -co en -bigg a -anci en -âĢĭ # -yo enis -womenwho code -win elands -will mar -tu gging -too too -tai ji -stru e -sos borne -sk h -ring thebell -pro wein -pr out -play boi -pe on -pash up -nik off -mo town -mo hini -l alu -kar ne -kal ash -k rsna -institution alized -hay le -gan ito -flesh light -ess en -er ring -dram atic -dn as -di ski -darlo biz -crack nell -catholic stl -bsy bjp -bra ylon -ayian apa -(^_ ^) -âĸ¬âĸ¬âĸ¬âĸ¬ âĸ¬âĸ¬âĸ¬âĸ¬ -à¹ģภ¥ -wyck off -wu er -unison tweets -thermost ats -te stu -supersoul sunday -st annis -rim fire -pocket book -po ko -peace haven -music life -multic hoice -mi kol -mari os -lovel ocal -lake district -la ib -ku mail -kis smy -hero ileague -got thard -global edmonton -devotion als -der ik -d wane -crimin alize -cos entino -coach man -cer rado -bu mber -bo sse -animal lovers -agen arian -- < -ðŁĵļ ðŁĵļ -à´ ° -zig gur -winx club -wh yyyy -w day -vibr ato -ten news -te stino -taji k -t sp -t intern -si sal -rece de -po vic -new product -new life -melt water -manag er -malacañ ang -make peace -laz are -l our -kanhai ya -k ø -jor ah -holm del -ho wa -height en -head sup -handsome st -halei gh -green bank -fo st -en zo -downing town -dat sik -cu zco -craigh ead -clare balding -cal poly -brac o -biglittle lies -arte sia -af fluence -! ðŁİĦ -! '" -ðŁĽį ï¸ı -ðŁij¨âĢį ðŁİĵ -zz ang -vulgar ity -vom usic -tattoo artist -tab b -sos venezuela -somerse twt -shre dders -san ches -random izer -par tri -over draft -o shima -n aren -mc ateer -may ers -lund berg -lo ook -kni pe -inthe sun -instin ctive -in got -ilm fest -ilk ley -hoo ke -fer ne -evapor ates -eno y -dash ner -clamp down -chil a -boys and -ash mo -antico agul -": {" -! ..... -wre xham -wr o -top sham -til son -the istic -str unk -stell aris -sn app -screw sc -say hername -pi thy -p alli -osoph y -nor agami -ne phil -natural history -music ales -mls allstar -me ant -mari ju -ma ree -lovel ock -lionel richie -lawrence burg -kl int -k offi -jo is -jair o -ith as -is v -ine twork -in defensible -ill aria -hy men -gunder son -guan ac -gru bbs -gorge ou -golf week -go hil -gar ces -free tibet -fol a -exor c -emer aude -el abs -curios ity -char isse -cay la -can avan -brindi si -are view -antof agasta -am obile -ah saa -:' )) -wit tman -whi anw -whianw amos -watch band -the whisky -stone leigh -sher wani -sand pit -sam ira -ru ane -pmo i -picture perfect -p q -moor gate -mi kare -mass af -mandel brot -man nie -long bow -hel mond -ha ero -g ning -f áil -el mar -do tus -dish ear -di endo -cron ut -chol la -centime ter -bro adest -brigh am -bor rower -bodybuilding com -back ward -ak ah -âĿĹï¸ı âĿĹï¸ı -zor ba -ww mt -wheres mum -tru enorth -transcrip tional -tan kian -si mian -regin acassandra -pre cept -pin cus -pat ella -nbc dfw -my boy -marco polo -kar ylle -j di -iv or -i eri -good nigh -go el -geelong cats -engel bert -din ny -de ary -dae jun -ctvo ttawa -bur khart -boser oy -bel haven -be lew -bbc theoneshow -barbo za -aston ish -ari f -amp ong -ab sten -a hou -ðŁ Ħ -youknow you -ye pp -wy c -w kn -v anni -un made -tot ton -thre ef -the script -south am -shepher dess -set tee -ri fts -port adelaide -nocturn al -n ly -live s -kish or -issu u -in um -helf rich -hay wire -fe tti -fau stino -es ma -er mine -end tb -el ake -dwi vedi -dani pedrosa -cross road -co lima -carac ol -bow a -bbcradi oulster -bab bitt -anesthesi ologist -am illion -air race -abu elo -ab rand -ðŁĵ ¼ -ب د -yan mar -white people -we ts -wal do -w sh -voting rights -u albany -tiny house -tar zana -tai ba -switch back -stitt sville -son ico -si v -serv icio -schopen hauer -ronit boseroy -ril o -re aps -popul i -playadel carmen -plastic ine -paladins game -pal ang -over reacting -o ie -moore music -men lo -maxi me -kuruk shetra -kathr ine -ka ve -k ary -hu ynh -he igh -ha rena -en daal -eli ya -eclip sing -cruick shank -cra dock -body builders -bas anti -anti bullying -ali da -ab ac -, .... -ðŁįª ðŁįª -ðŁ¤· ðŁı¾âĢįâĻĢï¸ı -ภį -yello whammer -y van -world kindnessday -visit greece -u men -straw bs -stom ps -star light -sn k -sign board -shi man -sham anism -scav ino -rue ben -que ira -old house -odi ous -ny on -lam pe -es of -dur g -cripp les -cra ggy -col inas -cnn sotu -braver man -bil ton -back yards -b ffl -amp abay -af front -ðŁIJ Ĺ -å¼ ł -ze ig -xx xi -wo v -wi geon -vid ler -vi pin -ver acity -under developed -ul ata -tu tel -to omer -thor burn -star cast -spo iled -spear man -sound z -she etal -rever ting -paraphra sing -neva eh -mati es -i quique -hy p -hi ragana -giuli anarancic -gigaf actory -free sia -dl day -dance party -crystal healing -chit r -cal stat -boy den -alad din -ak shara -abc family -a edes -) = -( ): -yan k -watercolor painting -us afa -uniof york -twitcho sf -toronto argos -the brian -tad caster -su kumar -stv news -sper mum -re vi -ra ssa -progre s -pri sh -pon dered -ophon es -nom ar -news reader -nat ic -n ll -mil ik -mil ers -meni fee -leg co -l dot -ki djo -hor ley -gulf of -fi shin -cycli sme -cro re -cat dog -bu sing -bla q -bike dc -barra gan -ane ously -ali zed -ðŁij¸ ðŁı¼ -е ÑĤ -wol ford -warrior cats -w dd -thur low -thor sday -ter mine -tepp any -south devon -sky football -scraw led -ol k -ocr acoke -objec tif -o thman -mu gger -mean er -kay e -joy division -jayson dmx -iz awa -ir vin -ing olf -hun ker -huis man -ho bb -ha py -go jacks -ferry man -fern ández -eth no -don aire -deplo y -dan neel -co sette -cli mactic -ceph aly -bro chu -bon ec -aventu ras -ap mas -al mira -æ·±å¤ľãģ® çľŁåī£ãģĬçµµæııãģį -ಠª -whit comb -west lands -var ina -tx la -tit el -swee ting -sun cor -sper ling -smith town -shoe shine -sg news -publisher swkly -per ver -p nd -ny ssa -nie man -ngr senate -monad nock -l pl -k ve -just acard -indi ra -hygieni sts -her mand -har dison -ham elin -ha agen -guardian news -grass root -gn ine -forthelove of -er ight -emblaz oned -dr ons -confront ations -cell ino -bar aboo -. ": -ìłľìĿ´ íĻ -vibe fm -vi krant -tu tt -torch bearer -t ve -sw elled -smo kie -skate boarders -shan ties -sean astin -paw ty -ow ay -nis sen -neuro imaging -music lover -mor ais -mk v -mi kan -mc v -mar j -maison ette -lt p -kn x -kagu ya -james roday -histor io -herni ated -go tg -fur ore -disser tations -char la -bureau crat -box score -bh cosmetics -all on -" } -! ': -ðŁĶ Į -zam brano -ymm fire -witch hunt -whoo pee -whang arei -w pf -vs was -tra ppers -tom mi -tiger nation -tere za -tab by -stevie wonder -si uc -sen si -prilly bie -pp fa -poindex ter -pnas news -pern icious -par men -oba id -mun ich -mu di -morpur go -monc ton -mi red -licen see -kis sables -karansingh grover -josef newgarden -j ke -gif ts -gad sby -fle shy -false flag -f online -del ac -cim goi -chut z -cattle ya -burn notice -bulldog pride -b dx -ar ula -ar q -ar da -anwar ibrahim -^ ____ -ðĿIJ¢ ðĿIJ -ìĿ´ ëĭ¬ìĿĺ -âĻ ł -âĢ Į -áµ IJ -~ . -wood sman -w sav -vel t -u dd -thegame awards -solo ing -schlumber ger -rox ana -quaker town -qu eda -pan tan -oz awa -ner vy -mik ita -mi jas -lang lois -kare lia -hutch ence -empire magazine -emeraude toubia -el ad -bott oming -aven u -arm strong -and ing -and az -ðŁij¼ ðŁı¼ -ãĤ ļ -à° Ł -zucker man -y th -wolve sup -winsor andnewton -w ati -so ane -sin ensis -ri les -re a -ra wr -pub schools -por o -ostric hes -ok onom -oceano graphic -oc cer -o oms -novo sti -ni dh -mcmur try -make re -let tieri -kur upt -kil winning -imp ure -ha jar -gun ya -git lab -g shock -edo ardo -dam p -chri sle -cause were -catahou la -car pus -c pe -bull horn -beck erman -bath es -arto flegends -amandak nox -ad ur -aber avon -ç ³ -yu cat -thorpe park -this way -tam p -tai ka -shu ga -s bag -r ving -pre forming -of amily -oak leigh -no fly -ne ven -mu ld -minim ising -lea key -law es -ky w -kok kin -kar nak -k lg -jessic ani -hel ms -har ini -har ika -gur preet -gun rights -grapp ler -eil idh -e one -con oc -casser oles -carol kirkwood -bost wick -bor laug -big boy -bell ing -armb ands -alamo gordo -!!! : -ðŁĩ¸ðŁĩ ® -íĺ ķ -was sail -ty vm -tu la -ten uous -su pr -str oup -soc sci -save timeless -sau ti -ri al -re positioning -re dra -rd pro -ogun quit -ober hausen -nas p -mtv awards -mo fa -men shockey -me to -mar cha -mar ah -lyric ism -ke qiang -iy ya -high key -green ies -grange mouth -geology page -f hl -de march -conver tibles -bron chi -bilas pur -az rael -ann ular -an jana -ambi ent -albu feira -ìĭĿ ìĬ¤ -w df -viter bo -tesser act -te ad -subsidi ze -spring fest -safe house -rich y -re em -pleasee e -pin ko -pen na -pe cha -often times -nuev as -ne id -n ary -n andy -mi sprint -man illa -lav atory -lakme fashionwk -la sci -jy p -it ai -international isation -induc ting -gom era -george strait -gang tok -eri g -enz ymatic -dog mom -di ppers -c ti -break beat -beau teous -bal eares -arch on -appalachi an -ak is -*-- * -âĿ Ľ -whit ep -whatsthe difference -wel ty -tipperary gaa -the boyz -tere sted -svit olina -suppor tw -sou ped -se ann -red hair -pino chet -oxi des -o dc -na hi -musli mb -mein l -mcman aman -mary borough -manish paul -left behind -ko zak -kil mister -kamp en -ing don -ic cb -hoar ders -goss age -flu min -fel is -ebb w -del fin -columbu screwsc -bum bum -b ents -ac larke -ðŁĺĭ # -ymoun i -water borne -walk den -va is -umb ridge -traste vere -they come -thei et -ten zing -ta as -scriptw riter -sam ra -rah way -psycho billy -police dept -pi pped -nc cu -motor trend -me shed -margre the -mar wah -ma tha -ly re -linna eus -libre office -ke vents -ir raw -ianu ragthakur -i vert -he ren -han well -ham ps -guer nica -go td -emelis ande -du ddy -dan ae -cr ampton -brian eno -blu t -auto immunity -ðŁĮ´ ðŁĮ´ -visit oslo -sain thood -sa chi -ru mmer -roblo we -prohib ited -pre ach -pepit o -oun tains -on dre -ob ello -maz in -mal ka -lead som -l orie -kohin oor -jhon ny -jac i -ir b -ip bes -hyperten sive -hu ri -glow y -fifam obile -fer dow -f gf -epic entre -di ao -del man -cc bc -bul mers -body armor -bett any -b bi -ay sha -apic ture -am all -yo shino -worldof dance -work tops -vic olu -vicolu dovico -ver adio -toy box -to se -roe hampton -ro ymouni -ren nial -rath mines -ram al -photo realistic -pawn shop -p dd -mo styn -micro electronics -lef th -kiz una -itec ture -hu ddling -gre nadine -giuse pp -fa khar -do tt -do decan -diffu sed -debor a -co zza -cho kers -childri ghts -brom ley -blue andgold -bh of -barbra streisand -austin carlile -ar la -amoun ting -alo ves -al vis -uku leles -susan ne -stun ning -stok ely -solar system -shear ling -se ge -sarang hae -sa kh -rv v -run around -roh de -receptac le -reas signed -quadrang le -q om -pur na -otter box -mck it -mary lin -leigh centurions -lee du -le xx -la pak -king kong -kil more -katvond beauty -he ta -grave digger -giving tuesday -enz ies -caul ker -c vp -borrow dale -ar ket -an esthetic -âĻ¥ âĺº -xzi bit -wol laton -wee se -uy uni -turk ington -tar kin -su rest -su darshan -ste ach -smoo t -smo tor -sa wh -rising stars -ripp le -rescin ded -re ak -rale y -r alu -plac ings -or vieto -ky ne -ko ren -k ure -i spy -hon neur -fire watch -es sec -du rai -deadliest catch -datasci entists -credit card -cox swain -corner backs -colin firth -bio tech -barilo che -ave e -ac ep -x japan -wr dw -world heritageday -wis sam -wheat sheaf -water marked -viver ito -town end -thro at -thom tillis -st lv -spu rious -sig ned -sar c -s who -remem br -press ings -oss ington -newsma ker -nar ang -liberal aus -li ffe -kal as -gre ati -ga jan -functional ities -fi ord -esper anto -edu tainment -der rida -dat t -com pare -co terie -chakravar thy -car vin -cap com -cam borne -bode gas -ben no -anir udd -an ted -al ula -al liston -zz top -yi annopoulos -wheres the -wee vils -watch the -visitgreece gr -tru ro -tram iner -thi stles -thames mead -tejasswi prakash -super b -sumit omo -stru st -shi vin -sh v -señ orita -sd schools -ro or -pom elo -partner ship -om ata -nad ja -motor boat -mi guna -maun gan -le land -joke ster -flat out -finish strong -dami ani -cru gby -con serv -chang elog -castle town -aw r -austri an -amotor show -afern andes -ach ei -ðŁĮ ij -vic pro -transduc er -tr ico -ti ro -tennews qld -talle res -sam aha -salt marsh -rou ble -rie woldt -regular ity -re dribb -raven scroft -public radio -nwo su -nodu les -mark hoppus -kur sk -im practical -harrison ford -dugg al -drau ght -col aba -boo kie -blu ffing -bis ch -bier mann -beatrix potter -be wick -basil isk -ashwin ravi -ar isa -alz association -all dog -al pen -abnormal ity -aber uni -tugg lenation -tu te -tranmere rovers -thermom eters -stin iog -ss oci -rosel yn -ra sul -pho be -pan aji -orange y -mango steen -kun ing -ke im -kady rov -jupil er -iti zen -industri als -ho pps -gre ca -gal ina -gaf fa -fon so -fast ened -fari bault -f mm -comment ate -cli matology -ci g -ba sten -austri ans -al bo -adi zero -ac en -!!!! !" -ðŁijİ ðŁijİ -ðŁĮ ĥ -à¸¥à¸²à¸ Ķ -wis sa -what would -wer ther -was son -vig ils -ud dy -tt as -tri alled -st annes -slike us -sli mer -sal ot -relin quish -rap star -ram zi -pas ch -ou chy -oc l -ngoron goro -new ye -michael rosen -meadow bank -levi ed -lea side -kr zy -ke uchel -j ita -ho sta -hay dn -han on -gri stle -girls night -evalu ator -ec afe -dylan n -did that -ci pe -chefjose andres -bud va -bu e -be hati -bailee madison -au rel -asynchron ous -af casiancup -ðŁIJ Ĥ -ðŁİīðŁİĬ ðŁİī -ãģ Ļ -à³ ĩ -Å Ħ -zen trum -wil len -water ston -vivo azzurro -universal studios -transplan ting -top coat -ta kata -she mar -sen do -sam paio -r dt -port moody -oneok rock -ny ah -nouvelle photode -nor mie -nan u -mic rons -le fevre -key note -kah neman -just a -jung frau -interro gating -glen brook -em is -ed ger -dista steful -dictionary com -de anne -dark ness -d ago -cé zanne -craft manship -cor des -chil lax -cash app -card stock -blur r -bb src -ayut thaya -arkham knight -acol lection -ac cia -ab ass -; __ -yard birds -w ice -un assisted -the how -t km -sud bury -see it -sadhguru jv -pon tar -pol son -per fusion -palak kad -nor iega -non stick -new supdate -nature news -mac ale -kin ser -julianne hough -joseph muscat -j pc -instac art -ilike italy -i dos -fri zzle -form alities -eu fau -ep isd -chap ati -bul on -bu ya -bla den -ben n -ar ita -appar itions -ant in -abed in -z ot -verdic ts -ta ffer -solan ki -snow making -sle ight -sch uk -rubber ized -rosen borg -rigi dity -ren al -rem pel -ray ama -pu ls -past is -mel man -mc dougal -marcas ite -maha vir -luxury home -li or -laphro aig -la familia -l ø -kw skenya -ki baki -kar mic -ju e -jeann ine -ii y -houston strong -hali l -gyo za -go tom -glu g -ghe gan -fric tionless -fic t -engi klan -end ales -dr jd -cro ome -cor ing -carni vals -caly x -caity lotz -bush ra -bladder cancer -bee hives -bang yongguk -ðŁĺĤðŁĺĤ ðŁijĮ -è¥ ¿ -ãĥĪ ãĤ -öster reich -xbox e -vil anova -tu valu -ti ge -thre shing -thomas sanders -smoo thie -sec tioned -schim mel -sam wise -pal en -p tb -not forgotten -mcco vey -lam peter -john ston -io anni -headhunter z -hat su -h wan -gian forte -ger wig -fin ks -elo u -eli ff -dyspra xia -do heny -dil se -chancell ors -ch ford -capital official -beat o -ba sit -ati enza -!!!! # -ìļ Ķ -us k -up stage -ulti maker -tower bridge -telly chakkar -squig gle -se iler -se bab -scape go -sau x -re manufactured -probosc is -poke dex -om et -officiald gispr -oc bc -no ya -n ort -mili eu -levit an -lehigh valley -hyper activity -hoi berg -gre ed -expend able -endoc annab -dol ci -do sha -devilmay cry -deschu tes -con ta -coc cin -ceremon iously -avi anca -architecture lovers -apar icio -al ga -] ( -à¤ Ī -á l -yellowston enps -x am -vadi velu -termin ates -spac emen -se gui -schitt screek -sc media -rel ent -pu esto -pic kerel -pi vx -n assim -kh c -jack als -ishi guro -isab ella -indi at -i mei -goo dd -gol maal -fashion news -face it -dor cas -cun y -cli brary -cent rep -cath mckenna -catchit kansas -black wall -basker ville -bahawal pur -ar bol -am har -acom pany -unear ned -transvest ite -tor ching -than ku -sul t -sine stro -sho ppin -sel le -power tv -polyphen ols -pel argon -pax ton -over achiever -modi fier -michi ko -me el -mcmur do -maungan ui -masch ine -mas l -li mate -ker mode -k mm -jessicani gri -inver cargill -indi es -in cep -iam r -hyung sik -hav arti -gwin nett -good game -gar and -fan bases -ef ans -ed w -dr pepper -demon stra -con migo -cioc col -cere bro -categori ze -both well -barre to -bar ia -bal rog -ari anne -anal ima -abat toir -aaas mtg -ðŁĩ¶ ðŁĩ¦ -ìĿ´ëĭ¬ìĿĺ ìĨĮëħĢ -м ак -zwir ner -westph alia -we play -vi mto -ti que -st out -st james -sp ps -siri sh -shav ers -sha we -ry ker -retro fitting -re boot -pre en -phalan x -oom ba -nas scom -moment when -men ingo -mas ked -ko wa -ke ets -jat engiklan -ir ked -intern alized -do vic -dei dre -clar ins -cis sy -c no -buck man -bt p -bin aryo -beel ze -bapti sts -auto repair -att oo -apho to -" ->: -âĿ¤ï¸ı ) -west life -vince mcmahon -v ass -us afric -twin ings -toast master -tkach uk -the blogger -shahid masoo -sen cha -savethe crew -sat night -river hawks -revi ver -rad har -poly gons -pir ated -organic food -nigh to -mur rum -mil house -mark ell -man v -lac son -ke uka -k bis -infe cts -huw stephens -e tho -counten ance -clar is -bo sso -bo sc -bit defender -bio char -and am -american legion -ab l -aaaaaaaa a -ðŁİ¶ ðŁİ¤ -ys gol -xal apa -west f -we want -trending now -ton college -the word -teppany aki -slap shot -senior year -sam m -ridlr mum -repatri ated -reic hert -phosp holi -op ines -mm en -mau ney -mangesh kar -love this -lo do -ka sha -jar ry -in operable -hol lie -fran ko -fa kih -en schede -ellen pompeo -du kakis -co ste -cl é -christ in -ant as -annab ella -alberto contador -ak io -y tretweets -wiganwarrior srl -vi render -together weare -sw abs -so a -sil sil -reticul ated -publi que -pool er -ph un -op b -okonom iyaki -offu tt -nov ara -mockingjay part -miami university -metall ics -le ade -kra bby -ke em -jos lin -ja ha -hom erton -great food -gla zier -gin ni -fram lingham -den nen -conferen cia -city lab -cari produk -bol asie -blue sky -app am -: , -ðŁķ Ķ -vainglor y -urband ale -urban photography -unconsci onable -un kle -ubi qu -twee tur -tro ppo -sunday blogshare -stewartha asr -stewarthaasr cng -ste ams -st joseph -slo ane -shi agenocide -say e -sat chat -s ze -red car -r nz -qu ill -paris fashionweek -michel s -malme sbury -loch leven -incre ible -ima gen -home remedies -he fe -hb f -fort collins -einf ach -ea i -dou jinshi -disin fect -cr antz -conspic uously -cole sprouse -chri scuomo -chin mayi -car pa -bread board -brass ard -blu sh -arne duncan -amu ck -aku prema -acet yl -ab dl -ðŁĺ¨ ðŁĺ¨ -z inga -yasi r -tup date -top ham -tirun elveli -the muppets -sukh dev -spani els -sof theworld -sn art -shi bata -shel drake -sa hb -ro dy -park ar -our moment -nau seating -nal c -magnific o -kopp ar -kin ane -inthe dark -i home -hon nold -he cho -gla vine -game over -fr ye -fitz simons -ferdow si -dal ÃŃ -d ming -char mingly -buc cle -bo akye -barang aroo -armi sen -ar cola -ap cc -? !! -ðŁİ ² -wool sey -wh b -vene cia -ti aa -team lh -str fc -sports women -sph illips -shay k -shan tel -shahidmasoo ddr -sepul tura -sc ally -sarcast ically -s run -ry oma -ru is -r bt -port es -mock umentary -mill creek -mik ki -kincard ine -itz ky -ir mo -ip tl -imbu ed -hot plate -gow dy -facil ity -epic ness -cu ffing -cohe rently -co akley -card well -bo ek -black list -bit main -b ently -b app -as su -ah shotel -adventure sin -ðŁıĥ ðŁĴ¨ -楽 天 -à¹Ģà¸ Ķ -á r -wi elds -tiff anys -tel mo -te me -swordar tonline -sk p -salt fish -ru dd -ro xx -recei vable -question naires -pros thodon -pre torius -personal ity -ok oro -occu pier -ns ffunded -mi sto -meathe ad -life house -kelly and -helly shah -grind stone -free kick -e be -didger idoo -cro tone -clan cashire -bu lu -bri ain -art ans -ab aco -ðŁ¤Ĺ âĿ¤ï¸ı -vec tra -union jworld -triple tt -tmr rw -ther ud -ten ses -te co -t god -sb dc -ryan higa -ritt z -paint september -nax als -mul vey -mu subi -mon the -mn t -mb ab -man in -lor ne -ling fieldpark -lans down -kuro saki -ke tv -hyste rectomy -har dees -gray skull -exam iner -es ack -digital banking -cric kle -collegi um -castle maine -can te -batt a -ar ds -ain bow -ว ย -wr ack -vin atieri -ti gue -t bird -sor ties -sla yer -sha hb -se sse -ro dd -ray y -nap ak -money team -mb ah -materi alized -lich field -lam er -ky alami -kut z -jo ol -j hoo -ir sc -en ron -down patrick -dispen sed -cor um -chateau briand -bnw photography -b wi -b gn -at war -ago on -aggie football -ðŁİ¬ ðŁİ¥ -ãĤ ģ -wy ke -w dr -un break -uk f -tru di -the gac -subsi dence -sports bar -sno tty -seque ira -sen ca -ol fo -nu bes -nie mann -mouse hole -mc queen -martinluther king -mand la -lal onde -jura do -jan in -it sour -intre pid -haemo philia -geo survey -fle xo -end homelessness -dom enic -clau dia -chan e -ce pa -ahu ff -ach ingly -âĢ¢ @ -yo gal -women power -wild fire -tili kum -tegan andsara -surro gates -sun ning -stig mas -ss op -sk unk -si son -shari fs -san kofa -repu gnant -represent ational -priyankag andhi -pric eless -pre phoops -practi ses -pan ahi -ob lak -now y -n do -metro centre -matt bevin -li thia -keele university -jin ny -ic orn -herald scotland -hef fron -he wn -happybirthday tome -gl bt -gear box -g prs -g ks -fol gers -far ou -epen ny -dev ent -derwent water -de val -david hasselhoff -ct m -chief tain -ch ten -caton sville -back ground -arjun kapoor -and more -all ways -admi rably -ac um -?! ?" -ðŁĻĬ ðŁĻĪ -ðŁĺĺ âĿ¤ï¸ı -ðŁĮŁ âľ¨ -ðŁĮĻ âľ¨ -wax work -un am -u sca -tril by -trapad rive -timber wolf -tam ba -sla vin -si ana -san ka -roe derer -random house -pro filer -print shop -perse cute -pe up -pe k -pat atas -nuclear bla -news queensland -nep tune -nar can -miller coors -loud mouth -knut son -kha der -jharris jayaraj -gender paygap -gate ch -fu dge -ev ar -d tech -care llo -bre cker -bo ingo -aspir ated -ag el -ìłķ ìļ©íĻĶ -vod kas -united airlines -under carriage -un played -un interested -tou pee -theli ghts -tb icycles -su go -ste warts -so ja -rom sey -pil ato -pe kinge -mra dam -mad han -keswick bootco -jazz fm -j q -inconspic uous -hi w -gro u -glit ched -ger mani -follow cii -fat t -dmu leicester -demarch elier -daily drawing -cyano type -cy mru -concur so -clive den -braam fontein -bl is -bir k -barri e -apo l -ante aters -am ri -ðŁĺ° ðŁĺ° -ìĬĪíį¼ì£¼ëĭĪ ìĸ´ -ب ÙĪ -yo pen -wur zel -war locks -ver um -thelast ship -ss nyder -sports writer -so bew -relati vism -quen cher -pan eled -nr p -nau gatuck -national comingoutday -nat atorium -make th -leeu warden -inn ards -gur dy -friends giving -free will -euror ack -creoso te -bottle men -bb clancashire -bas ques -bar well -ast bury -ar ja -ani i -ðŁĺĤ ðŁĺ³ -ðŁĩª ðŁĩª -íĻ © -undate able -thedivision game -syn cs -susann areid -stan ky -squad rons -spot ter -son equ -saras wat -ro ba -pandor as -p nl -mf n -llo ret -k allis -j se -i of -hym nal -gol u -g dynia -f bd -do fe -dj set -cyberne tic -bts festa -biglo tter -bb vacom -ball parks -bab el -after movie -zig go -whatson stage -wauwat osa -tur an -the vampirediaries -tele kom -su tera -scor k -satell ite -sar zo -sange eta -ready made -p town -only nikil -nen okkad -n ooooooo -michen er -leap fro -kwa ito -krau trock -kne ading -kal y -in icial -imag er -haid ar -guy ton -go blue -gang ster -fightfor wynonna -end rons -cott ingham -central ised -cau stralia -c sforall -bol la -bibl ically -ber ch -att oos -atri ot -ation ism -ashmo lean -al tura -ak lein -ad vil -ðŁļ § -à¯ Ģ -yan ked -wood shed -war man -vi vica -twee de -tg n -sic ily -rust ica -rox ane -rh shampton -pu dding -ol of -o ji -nas as -n tb -lloyd kaufman -kan ha -jewel ery -ii is -ig inals -grun er -glo bus -frey ja -founder sday -elgato gaming -do ting -del f -colon cancer -cn z -charlo ttes -caly pse -by passed -breath alyzer -bk n -bis d -big pharma -az kals -and as -all america -aaron goodwin -ðŁįĶ ðŁįŁ -yad kin -work mate -wab ash -vit ter -vil am -v xr -tom mcfly -sv end -surgical strike -staur ants -sh elia -rspb scotland -responsi ve -re ward -racec ars -primary rocks -pie tra -pay loads -p gf -om pidou -o lie -ne as -mel ford -lurk force -konta kt -kin nock -jor den -inf lux -im partiality -hau han -goo t -gal avant -ga ir -fe as -fay sal -fallow field -du bcity -d squared -cross dressing -cit rate -cere zo -carlil loyd -campbel town -bu hl -boo ka -black stock -bil oba -bec kie -b hullar -analge sic -ðŁĻıðŁı» âĿ¤ï¸ı -ðŁĸĮ ï¸ı -» » -yo an -ya seen -vi do -to stit -swal d -son ando -savi ours -re shared -nation ale -man co -love scotland -leg ally -had da -gist mania -full ers -day lesford -colorectal surgery -cine macon -blenheim palace -bal ach -ack bar -abram ovic -[ ðŁĵ¸: -ðŁĵĸ : -zeemusic company -with row -wh yyy -vas con -u ec -st ours -so arin -sm fc -shaleen malhotra -schö n -s global -ride ordie -resident advisor -ray gun -ra bility -pugets ound -out sold -onit sha -o iselle -n scs -myle ene -murder mystery -muba sher -mill saps -math s -la bu -ko el -kathy griffin -kam aru -jais wal -ide apad -hyatt sville -hal len -gun d -g wan -fu ma -education govuk -dress like -dh hs -curry wurst -choic etv -bu kuro -britt ana -brin ker -bandof brothers -ball player -alo pez -ภľ -yes network -wool dridge -w gc -vend redi -tre ze -tim farron -ti enda -tark anian -pender grass -nikol as -neighbor hood -nal anda -mull ens -mis elizajane -mf g -merito cracy -mccar tan -ki ren -justfor fun -jame so -il igan -go etze -fe ck -estate agent -ern ps -ec centricity -dv bbs -dragon age -com score -chris mas -can one -bul le -board ing -beren son -beagle freedom -ap tos -aleu tian -aldubbig boyz -ëħ ¸ -ãĥ³ ãĤ¿ -âı ³ -w ira -ven try -vas u -ul ita -ty le -stu ddard -street ball -space dotcom -s icist -pe to -pas sively -pap as -os muertos -objec t -nu pur -ner lens -nd b -n sk -mm vas -min da -mie shat -manag ment -mad smikkelsen -ma uri -lu hrmann -legal aid -le ander -kro es -k tu -jor daan -isai as -ib jjf -grass roots -glo bos -g ch -fr sa -fis cher -el mo -eeee eeeee -dian ap -cheap flights -bill o -art center -ab idal -ðŁĶ ² -wen k -thumb print -third man -therud ingroup -the players -stat eroom -sla st -shire en -sb snews -sambal pur -red ne -red head -pur ana -pou ille -pimper nel -par dy -nobelpeace prize -mash had -make dcli -ko erner -jen ko -jan u -hurtigru ten -how z -haric ot -g fm -for n -far yal -ephe mer -ed dies -do lore -de kha -dar ci -cl inte -chil cott -card holder -bw ana -bud u -bo ven -bed ard -be do -age ge -ðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬðŁĺĬ -ðŁijij ⾨ -work around -walk offame -uni mas -the jeremy -th picture -symboli se -stor a -speciale ffect -sn hr -sil v -sel ve -scriptw riting -r su -on iz -male y -li be -last word -guanac aste -gen entech -garden of -franco tv -formal wear -fore va -fel t -ez official -d tu -cor poreal -car ice -best practices -barri sters -barbarap alvin -avi des -attend ances -anun cia -am per -ðŁ§ ł -ì£ ¼ -z and -wi eg -tw ings -tox opla -ton sill -thisise gypt -ter ras -shi ekh -scot stoun -scol lege -royal ton -rin du -pon ga -over shadow -nus antara -nh tsa -milli seconds -memor ization -mari ani -makedcli sten -kis smar -infidel s -fi ano -envel op -defe ctor -dar ts -bt n -brock man -bran dishing -blow outs -bless thefall -big cat -b vc -agover nance -add led -ac ou -îĮ ¨ -y mp -x biz -tryan uary -stan o -spl inter -sit ra -seven dust -s gh -rumm enig -rummenig ge -ri elly -pokemongo app -pla ines -ph b -na jam -mira bella -mi raj -li pe -ld lc -kat ah -janef onda -j fs -im ou -gol lanc -fragran ce -fibaw c -f so -dig as -corn walluk -congr atu -chat tering -cb so -cat fishing -bou ghton -amu thu -alli simpson -af v -ðŁļ ĵ -ðŁĺģ ðŁĺĺ -ìķĦ ìĿ´ -yil diz -yak is -y combinator -xi ons -wil kos -wb k -tor ro -thet dn -spir alling -sen ia -scur vy -sam an -quik trip -pasqual ino -pad wa -om bs -millwall fc -mer tz -marse illes -mad der -lunch time -lu th -li gero -justi fiably -j oop -i mar -george hw -for her -eli vely -ele on -e gress -dis miss -dis engaged -de ighton -coo sa -co iling -cancer care -briar cliff -bol u -boe hringer -b ft -ay lin -are ddy -app ian -am dev -am aa -alexander wang -ðŁı ¸ -y tl -wonder boy -waitress musical -w us -virtual box -v atten -ucon nwbb -thing syou -super fine -sle ater -sig mas -sen thil -schul ich -sar ia -rapi do -ra donc -ra bo -pro pyl -polly anna -plan k -martin amcbride -kip nis -kan baru -hg tv -grave yard -glutin ous -gi pson -fre dric -fou rie -eng es -e em -dix ons -compac tor -com mode -cold fusion -ce fn -brink man -b gi -an um -an issa -yaho onews -wood ward -war da -vis or -vand alizing -v ati -un recognized -tiru mala -tac king -t mi -spe te -shr ill -schwe ppes -sach se -rho dri -photography wx -per tains -p lier -new berg -mor tad -moo die -maw lid -madein england -liberty ville -kop a -jer od -itu c -go leman -franç aise -food tank -fab inho -ep y -ep le -efflu ent -e wald -de wey -cyanobac teria -compos iting -bicent enary -bergha in -au i -african ism -* @ -zac goldsmith -wood grain -under tow -tonsill itis -thorn tons -tar aw -sp harmacy -sing lets -sho gun -sa unas -ron wyden -ris ch -po de -pekinge se -pal le -on aldo -official bwfc -nic h -nak u -modi se -mi sheard -mean green -lis bon -lig gett -kate esack -jes olo -james francotv -inter red -inte st -horse shoe -galatasar ay -er ol -ener al -com bust -chesterfield fc -break aleg -bra sco -bird lovers -be ed -bar an -bann u -ar mature -ðŁĩ¬ðŁĩ ³ -åĴ Į -âĤ¬ ) -way man -w ukong -us natarchives -trans act -top tip -su varna -sty ne -star wood -stam mer -shol lywood -p illing -overs lept -ni gra -morgen stern -mesen chymal -lagun itas -kin ah -ke ik -k usa -j are -irish music -ib mb -hr derby -hou v -glen avon -fire pit -executive goth -diet iti -di rim -di pole -craig y -cor vid -by utv -biolumin escent -bett endorf -bell amy -are ly -albace te -alab amas -ac cel -` *) -ðŁĹ£ ðŁĹ£ðŁĹ£ -âľĬ ðŁı¿ -à® ¯ -y oni -work room -woon socket -ward bound -wak u -vo ree -vest ments -tro oms -tr at -til t -tham bi -t ps -swir ly -sti mulator -pr and -mis ss -milli an -live to -lasse ter -la am -jon nie -jin day -jay aram -in ui -hinch town -hal ving -gu lo -ex ton -distor ting -death wish -chri sm -ce judo -bo ker -be ens -barn find -baj rangi -agu ayo -ad waj -ãĤ¤ ãĥ³ -é ireann -wi vind -vas anth -tm x -sympathi zers -survi ving -spo sa -span os -sece de -season finale -ro si -rep els -reli quary -real life -radhi kam -pre flight -portra yals -park as -oshi om -om art -nothing but -nicol a -mir ka -mieshat ate -me as -manufac tur -man and -ma hil -l bt -kab ar -j ns -fla s -dune din -down play -de dede -de cade -creation ists -con notation -community service -college humor -co stars -budge ted -bu colic -broo king -bo sma -bo gues -bli stered -beetro ots -an aa -americas milhist -ภĸ -wonder struck -war face -tran sis -taka o -stock stowatch -sto tts -soul ard -sk han -ro ache -rho do -re as -ra pala -pu tted -pollu x -perme ability -mul timeter -mar sha -mac u -lu tter -lor ia -lobo tomy -leon hard -keith ellison -ke diri -jon snow -jew ry -jen as -hay ward -ham ari -gher ini -ey n -dj inn -displ acing -diete tic -di ggins -dal vin -cham bliss -body boarding -big man -batt en -baton relay -anz as -za ara -yogali fe -we ise -vi pul -veuve clicquot -v uk -tom ake -sv ant -spot lighted -sky r -shil paf -she pperton -shape shifter -shal war -sen to -sam martino -s ops -roun del -pharmac ological -odeon cinemas -monic a -me anders -mak elife -kom bat -ik ar -ich mann -hump ing -hu ddleston -gul marg -gha ag -gel ang -for bidding -f np -electroly sis -een adu -dra k -ches i -cen giz -buzz saw -bo hin -be cs -ave c -amas sing -all iter -air frame -accu ms -ðŁıĢ # -zil ker -z eng -wr ks -way de -us q -thom s -thenation all -take care -sriti jha -squ aw -salonedel mobile -robust ness -quen ched -quan tic -propor tionate -pen icu -patoran king -pal y -pak ora -p min -oz one -l wr -l fk -kind les -k acy -incess antly -il ene -henry ford -hay ao -ha sa -group ings -fé lix -fen ner -es ade -eri shere -elum elu -eg ghead -e mini -du kan -dragon boat -democracy now -decre pit -de akins -dal o -cy mra -contri ved -con ny -cfl gameday -calle baut -bri ous -bal aji -as agar -art sin -a oba -ģ ) -ðŁijĭ ðŁı¼ -̶̲̥ Ìħ -zo es -wh ic -wa stel -vend ome -under cover -turn tup -tri on -ti mid -tam o -tag ine -squ el -son ee -qua shed -pp c -pi ku -overestim ate -out pace -orang enation -mon tour -mcclar non -madhu r -ma bo -love quotes -libre tto -lan ham -just add -inter viewers -hi iii -gsm np -galli um -ga en -fresh ening -dre i -colorectal cancer -bo ag -bar bel -bak al -' ', -ðŁĴķ ðŁĴŀ -year long -wn it -vodafone in -virgin ie -vi ol -tran ge -the fog -tab lon -sen dak -ren ames -re vin -rdpro cordillera -pat rolled -pat ri -pan is -pal ates -ow u -movi ec -men des -marty scurll -mana watu -lsh tm -lord taylor -koso va -ka ise -i back -hill y -h sv -global surgery -fo gel -flood water -enew york -d gaf -common er -code masters -c ty -boudre aux -ba ily -aren d -ak osi -a omg -èī º -Ã Ĺ -wom ble -with a -w tvd -votel ittle -vancouver pd -usu k -tt is -tat ars -tal at -sc ath -sandwich day -roo ghaag -pre ludes -ponson by -pho tor -p falz -owat onna -national post -nab oo -n gan -mtvawards star -lo qu -krz ysz -kind t -kin ki -kateesack hoff -join in -it sad -i ws -fle ec -fearthe turtle -f sharp -ele u -e jac -dodecan ese -do better -ch z -calli grapher -c aci -bend able -aco a -ðŁĺĵ ðŁĺĵ -zz ar -w ga -uro logist -talis ker -stra ights -sin igang -si biu -shi mo -sham us -royal welsh -row son -rose ate -rambl ers -r cts -poo ley -pett iness -overex posed -moistu rising -meh ra -marce au -marac aibo -lo omed -lo las -lets fly -la em -kick apoo -in dol -hen ne -ham tram -fort nums -fir hill -de acs -ch w -cas sian -brû lée -beyond meat -bald ricks -asdf gh -aqu in -andali o -abo l -ðŁĨ ĵ -zing ano -yaw l -vs no -voc able -vill ano -v dp -twi c -sukk ur -ss lazio -sh war -rudi mentary -rab anne -pur die -pro w -po tosi -paley center -no len -ne vers -mostre que -moor side -mill wood -ly sander -li o -ki jiji -k off -jack whitehall -ing au -heart beat -head ington -he afy -hal pert -gu ano -gr f -drone stagram -drjd rooghaag -diamond platnumz -cruci ally -col ly -channel stv -black money -bint i -ber rios -avo ir -au pdates -asi as -as sar -zapp ing -visit sunshinecoast -vic ton -vi katan -tx state -the bay -that girl -team pixel -su perfe -sour a -sli gor -si gur -shepher ds -schaden freude -red cat -ram bunc -pou let -par abel -oscill ations -nouvellephotode profil -national superheroday -merchan dis -m Ã¥ -life on -lem ke -lang it -jami ele -ig na -i frc -hu st -har rod -esp ou -devon ian -determin ant -de votes -d hal -confeder ate -chino is -book sare -bid dul -bard bits -apple pay -anna beth -ÃŁ e -w la -ther it -super leggera -sign aled -seme do -ri ba -retr ato -or son -newsc aster -negli gible -n ú -mot tram -mm flint -mathe us -mal co -gran ma -fox footy -finalfantasy xv -fallo pian -ex tempor -efl cup -disp o -dat agovernance -cor g -cf h -cart wheels -beer cat -band hav -bac s -autisma warenessday -au ke -ali yu -âĻ» ï¸ı -à° Ĺ -zoo ey -we iter -tel os -tatsu ya -swag ged -stead icam -sta ithes -smi ds -scan berra -sau lt -po ppe -percol ator -pad re -on netflix -neta porter -l antz -ku mara -ig nomin -hard copy -gold medal -ga o -ford foundation -food pics -evangeli sts -empower women -d hq -cran ey -cla ys -chief ly -cat ton -cas sano -bou chon -bos elli -boni ver -beg ru -ar tw -web pack -vivi enne -var usar -u texas -then u -the ac -tarantu las -su sy -startu paus -spar ky -s vo -retar dation -ren ergy -pur wo -postu ral -over state -mor te -mj g -me ka -master card -lovewhereyou work -loven ature -li ghty -lasc elles -ing leton -ignific ant -ho ists -ers life -cu ti -choice music -chee ze -by b -ber y -ai dy -aberne thy -ðŁĺı ðŁĺĺ -ðŁij ´ -ðŁĩ§ðŁĩ ¬ -yu sha -xer ocon -wor snop -u ba -tit ch -tion able -the fox -smo k -sen so -rohit shetty -pedic ab -pardonmy take -pa katan -pa avo -om bia -mol yb -mcgur k -mat tes -ma rella -liber sek -la palma -k latt -k bs -k alla -ji de -jablon ski -indie sel -in in -her re -head banger -ha koo -g valan -en ner -dir ks -de facing -cop as -co agulation -civit as -cath ie -braw ls -br annigan -bengal uru -bas que -band saw -and d -an chez -ac anthus -ab cac -Ø Į -white christmas -weas els -up staged -unshak able -theoffici ala -sugar hill -style book -stubborn ly -sla svegas -skin en -se vi -random house -rand oms -ra vil -r bjb -q in -persi ja -parti dos -ott bike -music matters -mol ata -mohsin khan -mike lee -ku st -kru ll -k aming -hol dthe -h ance -girl sday -em sa -eli ghting -dren ching -dread lock -dow chemical -decrimin alize -decre ed -daybreak hitz -d fat -cou ric -bha sh -aw ale -ap uto -wwe cesaro -wor sham -woo oow -winnipe saukee -whopp ers -toon town -ther olling -the gn -sar to -re sourced -pw ll -mus grove -mu ke -lo sin -llll lll -lek hi -k jrh -k dc -hockey night -hat soff -ha un -dream girl -dinesh dsouza -dend robi -cum nock -charleston shooting -chad well -cer nan -cade aux -ba chan -atten tions -al stro -ac oma -ðŁĺĺ ðŁijĮ -swee test -sport in -sony uk -sobew ff -sam mich -robin lordtaylor -rei shi -q arab -ot dh -mono tonous -me time -la zier -ki ane -kat ri -jencarlo smusic -ingo b -implant able -hope and -gurupur nima -gri fter -gor kha -give hope -g adel -flo res -ever bank -ety mo -esc ada -dream chaser -doo gie -deu lo -da el -d our -core lli -beart ooth -aziz i -au ght -angle terre -amor os -ak ai -; )" -world penguinday -tu d -tor ium -thim ble -th atta -ta her -sp ag -sou red -shape of -sche i -rub ina -rookie blue -ro jos -patoo tie -nutrition ally -mutu amadri -mutuamadri dopen -mirzas ania -mark wright -lar te -koscius ko -kn olls -kit schy -jonathan r -jawa har -hi gha -good by -desi pixer -dd un -dak ima -cicer one -can ty -cair ney -bor chetta -bm alik -bingham ton -bet sey -bernie orbust -ben nys -arm field -anni a -alla hu -aba shed -à° ¡ -yuzuru hanyu -ye en -yar sk -w bt -vic mensa -ver dad -ui dai -tra pani -tim al -sul lied -sooraj pancholi -slo wh -shin su -sen ow -scar fe -sab ella -office design -n le -mubasher lucman -mick i -li bro -juli enne -jo ef -ire lands -ingh our -hierarch ies -hailey baldwin -fri mley -favorit ism -eventi de -dv sa -domhn all -dni pro -digit our -democrati zation -dec tomy -dal awa -cre en -cos me -convey ors -ch apple -car ryo -breck in -bre mer -bell sbrewery -ba aaaa -ari ely -animal health -ê´Ģ 린 -whim per -west fall -tv channel -ton ge -thel oop -tam ir -stre aked -squ ibb -span to -slip stream -quir ke -post impressionism -oper ational -mcin nis -march é -lead ingthe -john w -gu ster -feren tz -er le -dar rah -criminal ise -cre search -cre che -coo der -chap ulte -bottlen ecks -bl é -believein yourself -bel videre -bbcy ork -all ens -al ito -ai zawa -adop tee -⾨⾨ ⾨⾨ -tac a -spray paint -smashing pumpkin -simul ates -se wanee -sac state -re agent -orno car -nesham iny -nar bonne -n ssf -n lu -my bestfriend -mu sto -mari ag -ko ve -kick flip -jor gen -gen tile -fun nest -fr and -fle dge -fa waz -en more -dirt bike -dd ar -culmin ate -comp ound -cityof sydney -bran son -beauti fied -beard less -b ils -b azz -ay une -auton omic -alli on -af cu -. âģł -ðŁ¦ Į -âŀ ķ -âķ ² -â̦ â̦â̦ -yak ut -whatdoyou think -ving ton -truss ville -tra g -te tte -taka hiro -taip ing -share humanity -rc bc -prob ation -pp reciationday -picka xe -ottawac itizen -nu ria -nn nnnn -nicol le -n was -mc nuggets -la zers -klu ivert -j va -gl bl -gat ton -for se -for ia -el speth -dun mow -de coys -dal ziel -cypres shill -cu ticles -bri mmed -break er -boge ys -ber rye -ber kle -au sag -arus sett -ap on -aom ori -ame hta -all tech -abi el -) .# -âij ł -ye gevents -virginia beach -upro ot -triun fo -thisi show -spl iced -smack down -sh appen -sco ffs -rt k -rocket ship -ro ber -re pub -ra as -pre dawn -p cb -om v -mu tya -mo sen -mel k -mckel vie -marac ana -love shot -ki zz -ka ar -joy sticks -j sf -hether ington -ground swell -giar dino -fus illi -freaky friday -famili ar -er v -emphasi sed -dj m -di rac -del ts -de ut -convers es -clo dagh -businessc ards -brown sea -bi ge -battle ford -b be -author confession -acl fest -ãĤ¸ãĥ¥ ãĥ³ -à¸ł าภ-Å Ļ -Ä ĵ -wit i -wheat belt -vi i -vector art -up g -th si -testimonial tuesday -ta kap -symph ony -summer vacation -shaheer sheikh -sh te -rums feld -revel ers -red skin -rebec cauk -rat eliff -pred nis -pablo alboran -p dsb -optic on -mou lin -men don -leib niz -leah rebeccauk -lam ia -kedge ree -ini quity -humidi fiers -gy lfi -gun n -green tech -ger ri -galli frey -gaem gyu -financi alliteracy -fall brook -fa its -ek ta -e ot -dj ent -dece iver -de ade -cor vair -com un -char my -car pool -blo feld -baj pai -att uned -alo evera -aha shi -ãĥĩ ãĤ£ -á ĵ -yas si -y str -wwe asuka -wissa hickon -whe len -wash y -vb schools -tra ba -ta ree -screen time -qu ills -oh v -nath alia -mir wa -magi que -li ppie -lebron james -land or -j lp -iam lakshmirai -hans grohe -gro se -great artwork -gar ish -fu ga -fever ish -fe tterman -fan euil -emph atically -dan um -cu u -cow ling -conco cted -center for -brig nac -baaa ack -amar ch -al shabaab -ach arts -ðŁĶµ âļª -Ë ĭ -vo it -ver min -un readable -tre sor -thi ers -ter is -simul ation -shav n -sha c -rule sof -rock er -rivi ere -r mn -pe dis -pal abra -op acity -nd su -multi level -marin os -lg w -jake quickenden -hos king -g ph -fn q -fle ish -favour ing -fa an -eye lets -ele s -dis assembly -counter measures -chikun gunya -car one -c cl -br anc -bl l -bio gen -asan chez -arch os -alvor d -ali anza -ÑĦоÑĤогÑĢаÑĦ ии -zach ariah -spe ier -so sweet -skid daw -salahu ddin -ri endo -py t -poor na -olaju won -my our -music ality -massaf elipe -mari ano -l ge -kal yn -in site -impeach obama -iaa forg -ha dden -got the -ge malto -fas ano -event planner -en forces -dream act -dit avon -deulo feu -colqu itt -chand ram -break through -b vd -b dd -asat ru -antici patory -annex e -ðŁijij ðŁĴķ -Ø§Ø ¬ -uj ala -u may -tit alia -thenew painting -tel star -stron tium -stir chley -so ti -sky lake -ske e -seduc tively -scrim shaw -scre amo -s ba -ru blev -roo ty -return to -ren ny -pre ez -par tha -oik os -menom inee -mc chicken -lucky girl -lot teries -it sar -inform ally -illusi onists -hir ono -crutch field -craig s -coz art -bulle it -bu tera -brush strokes -at r -at plc -arab e -antam onica -ancou ver -alast air -íļ ¨ -z ma -uni ya -tru k -than javur -sv l -shaf aq -scur ry -ren de -ram trucks -rabi ot -pi dge -nürn berg -megaz ord -m gwv -kra ven -jo bber -ip sa -i fla -hol li -herm ès -hear twood -geo cache -fur i -forzan apoli -forzanapoli sempre -for greatness -fly way -fl d -first weets -domin icans -chaf ing -cf meu -ca xton -botanic garden -ban trophyhunting -af on -a alt -"} ," -Ø ¶ -zz ies -yed lin -wiven hoe -web comic -wahoo wa -vers ace -un banked -tu lear -top gear -the maine -stra vels -st ps -spa int -say brook -rss ur -plat forming -padma shri -old is -o tis -nic co -lafour che -kas ai -jer king -j ba -i flix -hind marsh -heath cliff -g war -fee han -eye of -ex um -dumb ing -duc asse -du cker -col lings -cb sa -canad ensis -basqu ecountry -art adventcalendar -ap un -anil kohli -ai doo -af air -ðŁİĥ ðŁİĥ -îIJ ĺ -ëıĻë°©ìĭł 기 -â̦ â̦. -wi veng -whe ats -we il -uniofe astanglia -tulo witzki -thereal ryanhiga -team tolex -tan o -summer set -start the -sh nikov -ru thin -rnc m -re ssa -r ä -pri vet -prakash raaj -pe sca -part itions -param edic -om ing -neutr al -lit itz -l nd -kool haas -kar cher -inst ate -i severything -gu ma -grou se -gn b -fu p -fu jin -fou ad -flat irons -fit etv -elles se -dre ich -derange ment -da hab -cr ana -contor tionist -chin na -change thegame -cad enza -cac a -brance day -bout in -boul anger -book able -ban ke -az y -amand la -allo way -accu m -ðŁĻĨ ðŁı» -íķ ĺ -wi shaw -wal ley -ur bann -tweet meso -tweetmeso hard -startup weekend -siyah bey -shawnab ner -sc cl -s conference -ru ch -ros ella -red skin -radi ol -pv r -porth leven -pen ciled -pac esetter -mol nar -militar ism -marcel ino -love travel -kr ys -kie hl -k oning -jo p -jin an -incen ti -in ad -h gt -greeting cards -gowdy sc -g mac -g finity -free zers -ex and -eco fashion -diffu sing -database app -chandra sekhar -cc ms -boot camps -bell eri -bar bas -as sou -art databaseapp -ani pals -alph am -aer ith -zo gh -virul ent -ts j -tru x -stru n -sl vind -si by -sch ak -sanc tus -re fundable -r win -player unknown -moo rea -mar burg -lo rescence -lo ofah -kiyo saki -kin c -ket k -j ola -inthe making -inter change -in ver -i if -gru m -grei pel -go chu -glamour ous -gh ua -ele st -confi dent -color fully -cha fee -cait riona -bu rak -braz o -b pf -air n -ack a -ab oot -ðŁĩµðŁĩ ¸ -ìº IJ -æĿ±æĸ¹ ç¥ŀ -à¸Ļà¸ Ķ -wind star -web bie -un trustworthy -tand on -sm cc -sambit swaraj -sad h -palin drome -optometri sts -o the -neu feld -ne uk -mp x -me war -knight fall -kindle deals -k na -jer myn -hh shk -guille mot -gad on -fer ne -evans drumheads -disappro ves -cp chat -cin di -agassi z -! ðŁİī -ðŁĴ¨ ðŁĴ¨ -ðŁį·ðŁį· ðŁį· -ãĥģ ãĥ£ -x scape -wilt shire -wi dge -un sanitary -uk biz -uc cess -u hoh -tu areg -top drawer -the go -st oli -sle x -scro tum -sa ja -re wired -pren ton -port more -pa hoa -nazar bayev -nar stie -nann akuprema -na stia -mo issan -melo dramatic -maz dausa -mal pas -ma rea -lin ford -lan ing -jab ari -home spun -hi stri -hell bent -global compact -ge tat -fck n -fallen kingdom -eee ek -dev summit -den ice -dan z -bur bage -bou illa -blu ed -bar tra -ali brary -agen da -! :-) -ðŁĹ Ĵï¸ı -à® Ł -ठı -Ùħ ÙĪ -you ghal -win inghour -wininghour chat -west way -warnerbro sent -w music -topa xi -the crew -st offel -spu bs -so bers -shore wood -sf dc -sav ita -redri sing -pune eth -paradox ical -par ler -oscar wilde -nca avb -na dim -memor bilia -laiki pia -ki wami -jess glynne -jar rad -ibra him -holi ka -hol ston -hat ay -gran ados -gan go -ff fff -fari ed -er tl -e wu -dissip ation -dac ty -cor dray -cm hc -ci d -capital one -bon ga -bi aggi -atten burg -asco c -ano don -zhen itsyn -w tc -w kow -tit as -te agan -tad os -tablon dean -tablondean uncios -sof ts -say yid -sap business -sam c -sal ame -reform ers -ree sh -ran kine -pr grm -pic keting -pel ini -par my -out casts -organ oids -o ag -movie making -mik kel -me ti -matta pan -m du -hol lar -hhshk mohd -gu tless -fro wning -dab ang -cred itor -cnd poli -car gos -bid deford -ben field -baz o -ay da -ar nab -am ak -ðŁij ¢ -å³ ¶ -ر اÙĨ -work books -wah da -w brc -veri fies -tu j -th ao -str ato -sophi et -son al -regi stries -pk n -p libersek -nom ercy -mid sommar -mi ocic -men ial -martingu itar -love music -laugh ter -kun o -k tf -i acc -horror fan -ge ingob -gar nering -flaw less -fantas mic -familiesto gether -ex as -entre prise -enniscor thy -end all -dro yl -disgu sts -cin ders -carpinter ia -cant illon -brightling sea -ber the -be kind -bang sar -antimicrobi al -ai duk -ãĤ Ĭ -wear ing -ve ur -u gar -the mindyproject -spirit us -sp ade -sen iority -salicy lic -ryo ta -ramin karimloo -pat chett -on tein -mish ti -ly copen -li bido -lesmis official -kal is -ire les -habl ando -gu son -gaz ans -found ationday -fin ns -edel brock -dun wich -devon te -ck p -chris rock -canad agames -bok sburg -bohemi ans -bapti zing -b ju -aziz ah -au li -ar test -alter nate -al mar -air freight -abc grandstand -ðŁĺĬ ðŁĴĹ -ç elikkol -vin z -vi ajar -un mitigated -trac i -tor turous -taver ns -tal bots -stur f -star magic -shi zzle -shack elford -se vigny -sali v -sa xi -ru thi -rte sport -pro zac -nr n -nc ba -mor pho -middle ware -mc vities -man ion -kar ly -j smith -j fr -iron ore -humb ert -horse show -horse and -ha chi -gum bel -glo at -gil an -fiord land -fin u -f gw -europ car -dÃŃ az -dre view -dra v -dont judgeme -distribu tive -ches ley -che sky -bus ily -bon gani -arm less -air boat -z ut -yi ann -tren tham -trau mas -thu y -thomas mulcair -there val -tar ma -ste ichen -starbuck s -slu gger -sland ering -skelli g -sau chie -s vod -pot ent -ou zi -ou rown -oi des -ogl ala -occupational therapy -nin a -mine ola -mascul in -ly ari -luke goss -live blog -le clair -lam pang -lag atta -in boxes -hil versum -hal eem -hag man -gsx r -gor m -gio chi -ga x -frat ello -for zaf -first avenue -fil le -ern ary -el b -dw ana -dra wl -dhar am -dev ou -chab ert -carol ers -ayr shire -ato ka -anam ari -!!!! @ -âŀ ¸ -ê s -voic esof -ut g -tomorrow world -thenationall ge -th ors -tar un -syn c -re ubens -pro ck -or row -nath ali -my job -mu tin -mo el -meille ur -mcdon ell -mb ri -maryanne hobbs -ma dy -luc ado -kel lett -ke isuke -ke il -han shin -gare tt -el sa -dr ury -dis ent -digit ale -den nett -dan foss -bi wi -ap onte -ðŁĶ· ðŁĶ¶ -zom bi -yur ts -y ingly -vali er -tf xc -stu c -stepin ac -read in -rani mukerji -qu belfast -pir o -ph ole -pf as -or as -o gi -nu x -not cool -marke teers -ma bel -m res -lycopen e -lu en -ld cs -l ary -ku lam -kil ter -jumb led -h ounded -go sto -giann ini -e gger -downing street -co ola -bra am -bike way -be ve -bar aat -bak are -and le -accre tion -y one -waterloo ville -warren point -u rock -trum pet -the hindu -synes thesia -stra ya -smock alley -sin y -sidhar th -sa hl -re plug -re han -rataj kowski -pseudom onas -private ers -pre pa -per spir -ox fords -olu wa -nd weeksary -my celi -mu ell -mk hize -mi sion -mau ghan -lo onies -kn vb -kie ren -kha bar -insi stent -idiosyn cratic -i spa -hijack ers -ground nut -glo aming -gi u -fen rir -fel da -fe ts -ed ict -dra p -del ton -crook ston -chin ko -chi we -ch ch -bor gore -bio logic -berk ley -ðŁIJ° ðŁIJ° -ت ØŃ -zi kav -y awa -w fg -ved hika -un organized -un chman -step brothers -so pp -sam j -red ington -raf museum -pu shers -present you -om ial -ne wed -nation tv -n power -mor tar -modi fied -meri wether -mac ari -loch aber -lloy ds -l mm -ku h -hin ders -grl powr -gra h -go gue -fran king -fat in -f hollande -dom aine -co pro -cadu ceus -bas seth -arsen ault -anti matter -ano de -al tis -ach t -ðŁį¾ ðŁ¥Ĥ -èĬ ± -w ando -un deterred -thel p -tan cies -speed well -sp lo -so hee -snu gly -sen so -say yed -sar ak -roz elle -renega de -or ino -nutrition month -nosh aven -nemato de -mista jam -lax alt -ku ji -key sight -k ori -j manziel -human ize -hu ac -home world -hol cim -he bb -green halgh -ga elic -fur suits -franchi se -fibr ous -facts about -elin ski -du sters -dar rene -cr itt -cor to -comic market -casso wary -cameron monaghan -ca ched -brick by -atfirst sight -abraham ic -ðŁĵħ : -ze dek -yu van -winter garden -wad hwa -train sec -the tour -the american -te ac -so blessed -simon sen -refu eled -realc frampton -r ff -pe b -mor ato -min strels -mex co -lumin aires -long mires -london zoo -la ren -j z -inspiring women -ice storm -hom ony -histor i -gry phon -global fund -gasmonkey garage -fire eye -fin techs -el brus -doc tored -cy de -com au -clark son -chuk wu -char minar -chap i -cadill acs -bringyour dogtoworkday -blow up -batt ler -ap lay -an av -amazone cho -amazon studios -ðŁĵ Ĺ -ر س -youngand hungry -unbearab ly -turbo tax -tonko tsu -t gowdysc -subsi ded -si ff -shot ton -shi ma -semin ole -sar ms -ru mer -queens lander -pre zzie -nol ita -n cia -mostreque sted -michel instar -lent on -law breakers -kale o -journe yed -jay mes -jare t -in vigil -helen yu -google chrome -dun keld -dun ga -dry dock -depre ssion -dap a -clement i -char u -cer vix -career fair -brooklyn brewery -ben ita -ben de -bees ley -bb ces -bay an -bar ta -am ram -ad gita -ãĤ ¶ -âĿ¤âĿ¤âĿ¤âĿ¤ âĿ¤âĿ¤ -zen i -ye gre -whe elock -vis wanathan -video graphers -varusar ath -us at -uri jah -u ap -tric kett -tri ana -to sun -then ational -ssi e -rumb lings -rosen blatt -pil fered -pam uk -p nm -micron utrients -mic heal -match book -mac and -lumin escence -l dr -jo wl -j fl -j blm -itch y -is na -interven es -ho ag -hill head -hi der -h xh -gr fc -gle an -gas kin -f dr -envel oped -delav al -de stress -de gan -dar u -char i -cdn pse -care takers -bunk house -bu star -bty ste -bed ell -be ak -bally clare -al by -ðŁĻĮðŁı¾ ðŁĻĮðŁı¾ðŁĻĮðŁı¾ -ðŁĺ¡ðŁĺ¡ ðŁĺ¡ðŁĺ¡ -ðŁĴĻ âļ½ï¸ı -ðŁĮ ¨ -« @ -za ghe -w abc -the we -tech forgood -tam bay -standwith pp -spartan pride -souther ner -sj d -shoal haven -shan xi -ring worm -ri led -pu mice -ptar migan -ponte vedra -pk l -one shot -mon tane -mis awa -milos raonic -lo teria -little league -leam ington -l cb -kab ar -it se -here theycome -garri ott -food fight -et si -doctr ines -death by -c xo -bumber shoot -brum by -bral ette -bal and -baf tatv -awa it -anth onym -ðŁĺĤ ðŁĴģ -ðŁĩ¸ðŁĩ ¾ -yahoo sports -wei h -uni onized -tre svant -toor ak -tic ias -thought less -si thole -sfor days -sen y -sc eo -samiz ayn -sak al -s ó -rock wood -rit enour -r mt -precari ously -por tedly -ple tcher -plate au -or raine -ob server -no che -ne meth -nas b -mire ille -me zz -mb ts -massape qua -marin a -kirk wall -jr motorsports -jabo deta -inu vik -inger many -indv ssa -hend rie -glass man -george mason -fudd ruckers -fir mament -emb l -dri pped -dental health -d age -com piles -chase z -caffe ine -bug anda -ba v -al per -ago stini -) âĻ¡ -ðŁĺį ðŁĴļ -æ¸ĭ è°· -yo ked -wis niewski -wi xt -vegas strong -va asa -uni kent -tor oro -today im -thel oo -tam ari -t anni -stu der -ssen den -son da -sol zhenitsyn -sky team -sitt ings -sho liday -sand ys -rav n -ra him -que rer -oxygen ation -nbc grimm -mur alist -math are -mar ham -ma gov -le ee -kn j -k go -iy pt -inj as -in an -ibero star -her bert -gre molata -gran th -glass er -ex ul -enjo daro -end angers -eg fr -du damel -dis que -compa q -citi open -centrep ompidou -cathr yn -by om -break ou -aw u -assist ant -ash lee -ðŁĺ¢ . -ðŁĴĸ ðŁĺį -ðŁĴª ðŁĺİ -âĹ ¦ -you matter -yo glu -win tered -wid mer -vaqu ita -vap ing -un patriotic -the tom -t ation -swa thi -show off -secret smw -say les -ric ard -repro ach -rad ham -pul la -nov ae -new bold -me lections -match box -mait ra -ma sing -m views -le gic -kel ty -jocel yn -jave dakh -j hene -ink ya -har ter -gen os -fus arium -first day -fif o -faul ks -fast food -fa eries -el stra -dan se -chey enne -c mac -bohemian rhapsody -bar kan -argy ll -annast aciam -annastaciam p -ag grieved -ðŁĻĮ ðŁİī -æĺ Ł -âĿ¤ï¸ı ðŁİĦ -ਠķ -zu erich -yu helenyu -x aver -warren buffett -univers iti -tol liver -t pain -stop motion -spo etry -snor ts -shoai bmalik -ro va -re train -prep talklive -plan eson -op ale -omg adamsaleh -no dal -nike sportswear -ner vomusic -nenokkad ine -national pumpkinday -mon tero -mc cue -louistom linson -kha dim -ju ts -jens stoltenberg -ilan ds -ije bu -how ley -ho tting -he h -gun smoke -go crimson -flat land -fer o -ep g -elder scrolls -dsb math -divin er -dine en -dem me -che h -bo tes -arse hole -ali ans -ag g -acet one -ðŁĺį ðŁĺĽ -whywe march -wh als -ur prise -ul ysse -torontomar lies -st clair -spring clean -pran ayama -pneu matics -pat ux -par athy -oil seed -nie kerk -mon dele -mi strial -m ni -lu ri -kr ld -jim mi -impressi onistic -i lex -ho day -ha kata -gur ren -grow ths -gar stang -gal ician -food stagram -foo do -flori d -fitz gibbon -ff v -f atten -en chong -des con -de filed -cur ator -clou dy -bur bridge -be tters -bar cell -ban er -all good -ah rens -ach ild -Ùģ Ø¶ -zar in -wis on -val la -utri ent -twit con -timothy sykes -sur realistic -ston ecraft -she ek -shawn formmva -save me -ro many -ravi kumar -ram bles -pink out -pac north -osc a -of action -nichol ash -nev sky -mu kil -lang an -kra emer -khan academy -kar ama -john coltrane -iz quier -ingle by -hash ish -gho e -fort worth -excu sed -dundal k -dugg ery -defence hq -blackpool fc -b ingle -air amb -af le -ðŁĺĭ ðŁĴķ -ðŁİĥðŁİĥ ðŁİĥ -ðŁį¾ðŁį¾ ðŁį¾ -} } -zo id -true tothe -thic kest -the gazette -the beach -stab bings -scri bing -screen plays -savethe arctic -regi mens -qad r -pi z -pat sy -oc m -o yl -mr jame -mortad ella -m ve -kab at -jacqu elyn -ham zah -global calgary -ged ling -ga ijin -ft l -found lostdogs -fa ur -dec affe -d mo -cor nice -chutz pah -blun ted -blak elively -bhar tiya -barne sand -back pack -ba ila -an eri -ç ij -âĿ¤ ðŁijĮ -âļ« âļª -zikav irus -y eller -wp tz -woje spn -who i -way ang -ver so -tur alist -thunder bolts -te ko -tar leton -tab let -sol apur -smithsonian mag -school lunch -ron stadt -ny primary -no strand -mon isha -milit aria -mal lam -laz ily -lamb da -krasno yarsk -joker it -jer nigan -jami ec -insectic ides -home buying -hermand ad -good latte -garden ing -fu ria -frontrun ners -flatul ence -faceli fted -f naf -even tos -emul ated -dubcity council -ditavon teese -dir nt -con ure -cabincre w -ben icio -bamboo zle -badger football -arrow writers -wh anau -wa seda -w gp -w aco -vete ments -up b -t attle -sm k -pp n -pat er -pan ter -ou rense -n aco -my rick -mol ko -mo sin -live jasmin -lede sma -labra va -la joie -l son -job site -in seoul -i ale -helm holtz -hav nt -gru ene -goss amer -france s -fire walls -colo ssal -cau pdates -bloggers blast -ben edi -barbar a -au dax -as af -alhamdulil ah -al uko -ac ed -å² ¡ -ঠª -اÙĦ Ùĥ -z ani -vikas gupta -ur sus -twit chy -tube strike -try pto -trin os -the centre -tam uc -steve yeun -sp es -rashi dat -rang ga -quin ny -poo s -po stie -pe eters -oc inema -oakridge boys -o sk -n oura -mostrequested live -marche se -maj car -lou den -lazen by -lac om -high end -hal is -gon calves -go doy -fla re -fin ial -dulce maria -dr jimmy -da ag -credenti aling -co bber -charle ville -campan a -bunk ering -buck minster -brook stone -boe tt -bi jou -ay in -art majcar -are f -act ments -ac esse -ab z -^. ^ -ðŁ¤Ķ . -wah ine -w si -twit er -town square -torre vieja -super chargers -strike sback -south town -slip cover -si kes -sho ed -raven wood -parabel lum -orme au -moon ves -mil ady -matt cardle -mark cavendish -ld v -kwe k -kre ator -kh atri -jo ba -home alone -gige conomy -for tes -ff games -di ph -despon dent -del hic -cm tawards -chemi st -catac lysm -bu cher -all rise -air bourne -agli one -af g -z he -wester ner -weard ale -was dale -votelittle mixuk -vi ator -vasec tomy -thy ssen -storyof mylife -stan lee -spor ti -sin ki -shu bham -sha bet -serpent ineuk -ser an -saf ire -sa adi -red carpet -real kvb -re try -people mag -par kers -ol lg -ok awa -na al -n gp -mirand asings -june siphone -inextric ably -ibu ki -he ch -gong chan -gaunt lets -faken ews -doc ter -doc g -do tti -deci mate -dec ayed -char twell -boon ville -bal h -ayl mer -anthem game -andre arussett -ake over -af lat -adm ittance -!!!!!!!! !!!!!!!!! -ðŁIJ ĭ -íĥ ij -ãĤ¢ ãĥ¼ãĥĪ -âĺħâĺħâĺħâĺħ âĺĨ -zey nep -yn geal -wai ves -un plugging -u spa -tul si -the wcs -spar sely -shri mpton -sel fin -scoo b -re bro -quo in -preci osa -poo chie -patient care -om arab -no wra -mss arah -mon as -lack lustre -kar ter -kal au -jav ale -jac ey -in review -ifeel slovenia -global streetart -glam berts -gh ockey -gan ics -gab bi -frustr ate -facil ities -elderscroll sonline -el din -do ga -dis armed -din ium -cor uña -caul k -bu ah -ben nu -beer garden -att lee -adol phus -ab im -ðŁĶ´ðŁĶ´ ðŁĶ´ -ðŁıĮ ï¸ı -า à¹Ģภ-world pride -wil mette -vaqu eros -tresp ass -tas c -tal bert -sy al -shar ples -schu mer -roseof tralee -rob delaney -pu pu -pr dp -plec trum -obsc uring -nash villes -miz un -mc coll -maje sties -lov age -l sbu -kind hearted -kat oomba -ka a -k iting -ja j -is cuit -hot te -hell hole -fuji fil -free the -flo gged -epi pen -dulu th -dix son -defin it -de et -clich es -chi ette -cal arts -bt sport -bou dic -ben fleet -bas in -assate ague -arth quakes -ah atchee -!!!! ) -var adero -the work -te ha -story brooke -st weeksary -sa as -ri el -replic ator -rag sdale -qu okka -prophe sied -ple ats -photo walk -pastr ana -mone ys -lomond trossachs -ler ma -le eco -lac an -hair removal -globe business -gau train -fu oco -frank land -extraterre strials -eve e -dissoci ation -d bongino -cdc whistleblower -cavali eri -by your -buter in -bi dwell -ann alisa -acceler ate -ðŁĮ ľ -ze ej -x music -x clu -wur tzbach -we scra -wa qt -u dah -table mountain -sun nis -spro perty -sk cbc -shand ling -say eed -ref n -rambunc tious -radi ouk -o bre -neuro scientists -n st -mi tha -medi acom -m trench -lang en -kon ark -ke gel -jeopar dy -hurri yat -hon shu -h my -gu ant -expe d -em ay -cra ske -chou dry -choic es -ator re -ðŁĽ ³ -é ¾ -wx yz -w bai -up shaw -ude my -the tide -the adam -terror ising -t pn -sub has -spraw led -sport trust -sp cc -sol us -see der -sa hitya -ren do -ran kin -open innovation -nasci mento -nab ors -mumb ling -movi enews -media watch -maz ars -mar abou -lym pics -is key -il ing -icri sat -human ized -hamtram ck -ha ah -gra aff -gam ecenter -fr illed -fac undo -euron ext -eu caly -espn cricinfo -do oms -chil cot -ce ms -bon y -board wal -batt elle -bad diel -am bre -altru istic -allsven skan -ago a -ðŁį £ -wreck less -wing less -water ski -veggie tales -ve ge -ta pu -sk rill -sent amu -sch ism -sac ra -ric helle -reprodu cible -prioriti zation -pais ley -ny cre -nr ly -nd fb -mourn ful -me ja -mark ballas -malaysi angp -lock able -ko er -ko dai -kneb worth -kim mich -k ree -ic hu -iam sunnydeol -handic apper -geor gy -g tt -flau bert -ess i -ecker d -dar u -cole brax -cliss old -cle mmons -city year -bro ot -black kk -anti sm -anne mari -ank lets -anim ous -am bon -adam u -; ~; -åĭ ķ -zer flin -world catday -wo hooo -wedding cake -wa vey -val en -touch é -tor ito -tit re -th anda -tam anna -tal bott -stretch able -step ford -ss afa -sk ed -sch mit -reduc tive -re brands -pul ver -proble ma -pra yag -pag er -p wl -onep unchman -no elle -mar shaw -malti poo -lineof duty -lac rosse -jones es -impractical jokers -hsi ao -guill ory -gio co -galent inesday -fed monton -discer nible -cur ates -clarine tist -car ner -bori vali -blue apron -biz tips -bho gle -bas zler -b agram -ar mi -an acho -aguas calientes -âĻ Ģ -zi z -weather all -wachu sett -vo el -tu sd -tostit os -theo cracy -the toronto -tam ucc -sequ itur -saadi q -r ones -poppy appeal -p hey -ow sla -o sen -o cot -newsc asts -mol d -lo dha -ken tish -itu l -innis fail -gott alove -gonzale z -duc ation -d jr -chou han -char as -cdw social -cap tur -bra ys -aqu inta -al ber -ad dis -ach ar -ac ela -_ ] -â¬ĩï¸ıâ¬ĩï¸ı â¬ĩï¸ıâ¬ĩï¸ı -zu b -v tt -ur sinus -un lined -transis beautiful -than ts -sy e -sb kb -rebec cal -re nia -plo d -pc sd -outer banks -out standing -monte se -mono cular -mom odu -mo dano -mb y -matt mc -marie osmond -kra sner -konstan z -k shan -jis c -jen naf -j lm -i stock -hornb lower -he ure -gy atso -film club -fe ku -energy union -duckduck go -d eller -conce als -bi pin -bh g -be ren -az mi -as microbiology -anthropo logists -ðŁĩ° ðŁĩ· -ਠ¦ -wil mott -wasi mak -up in -tric ot -tri vago -ti ah -thegood place -test ing -temper ley -smo di -ship mates -sadda haq -sab se -rin cess -ram is -quick fire -pom pom -pla skett -pl td -ow ned -over hauling -old dublintown -mono chrome -lo iter -l pp -kur unzi -khoob surat -ju doka -holy cross -ho reca -hawk smoor -gr ich -go bble -exp els -er ath -elu de -d fd -clo aking -cc tr -c mac -bon homme -bo ga -bas si -bap t -ash esi -andrew scheer -all spice -ac ma -abrac adabra -ab all -ðŁĺİ ðŁĴª -à¸ķ ลาà¸Ķ -zay as -verme ulen -updat er -tweetyour lockscreen -silver tips -s design -ru chi -quintess ence -quetz alco -pul ation -pent acle -pan ton -night jar -my d -mouss aka -mount sinai -man gle -makar ova -let smo -jeong guk -i ef -hop mancup -honor arium -ha sse -go sse -g pg -fawad akhan -fair fiel -dur u -dream time -down river -culmin ates -cul shaw -co topaxi -chlo rella -chipp endales -chatsworth house -brit awards -br ina -asymp tomatic -amar aj -ai vaz -ag at -a stern -! ãĢij -âĢ ¾ -⤵ï¸ı ⤵ï¸ı -yu ppie -women lead -vape community -un deserving -t birds -sun niest -spring wood -sp reading -slow poke -see ther -sche matics -sa zer -s grove -ru drak -ran ma -quoti dien -ober st -o han -nl rb -me o -len nard -kon ica -escu dero -elli ptic -dubl iner -do brik -dike mbe -desig nations -dam pened -cun liffe -col burn -blo go -bann erman -with stood -want to -vanc o -twit tb -tu lo -trend setters -tor ists -the drive -tau b -syri acrisis -stay lor -skit tish -site wide -silen thill -show reel -rosson eri -rip curl -revo kes -por thole -north cott -no aa -musk ok -moy les -mountainde w -mopar ornocar -mont ella -middle earth -liven ation -issu er -human izing -highway man -he ee -gr attis -go bigblue -ghost writer -food love -fo tball -fabian ski -en si -dit ton -dead shot -calvar y -brown wood -best solo -b ss -apar ker -an ty -ae z -accessi ble -aa al -. )) -! ðŁĴĭ -your i -whar ton -wee tup -u tre -truff led -tro cadero -tex ts -syndic ates -street s -stal gia -skil led -shro ve -shin geki -sauvignon blanc -ro hs -rex roth -ra us -pi ggly -pc mag -pap y -pal an -out lasts -oss ining -min ecraft -mccl ane -lec on -le ws -kon zer -kat eri -j illy -j ades -instac at -henry lau -he elan -hal dane -gor n -frangi pane -ever clear -eric afernandes -el low -de sy -cat bird -brother s -breck sville -be ha -bal kh -av anza -au sty -ar ama -an ello -an berlin -about time -!!! ' -âĿ¤ï¸ı âĢį -âľĬ âľĬâľĬ -woo dgate -winoo ski -v old -turn coat -trail run -ti psy -thibo daux -theli um -the house -ter os -stoke ontrent -sp agna -soo th -sn c -sli mmed -sid ley -schle gel -ry uk -rive ters -ra kan -quiet us -probab ilistic -popu ps -pap is -oun ge -ner vosa -nat us -motor point -mit ford -mike portnoy -med field -mayo ck -lyn wood -local music -live shere -laun dre -im kristenbell -iheart media -har ps -go aztecs -gi vin -gc saa -gar bi -far sley -em ons -dw stweets -crou ton -coo te -captiv ity -cake walk -bud weiser -billion th -bath and -app sec -andrew zimmern -aj inkya -;__ ; -visu alab -us yd -univ miami -thebody shop -team exo -swi l -shadesof blue -sh murda -senran kagura -schnit zer -ra elynn -olivi awilde -objec tionable -oak ville -nis sang -n lb -mai ko -jon o -ir relevance -hollow crown -hel pin -harb ours -elle uk -dam pening -cobble stones -brooks running -boysen berry -boston herald -be all -ane mic -all new -alder leye -alan carr -ab w -!!! :) -ðŁįĮ ðŁįĮ -æ Ķ -zu ma -z v -winter land -wild side -where the -vu j -un du -tr onik -th ando -templ ars -tart ans -syl va -stur gill -screw fix -re discovery -q os -petiti oned -per ce -pan ti -oxid ants -out buildings -olivi am -nis sa -new stead -milon akis -mc neal -jobo pening -hub caps -hel med -grant chester -frigh tens -fin land -emoun tain -em eli -ef am -easter rising -cour vo -char tering -cari oca -can ing -cam of -br acci -bol tup -bobro vsky -bend iciones -bbc scotland -at tah -ag ner -åij¨ å¹´ -zapp afaye -yul in -wx w -tur vey -the clonewars -sh enton -rashidat laib -r fd -pu gin -pu edes -plat ino -pa ik -nichol a -n ough -mou ret -mal pensa -kou n -ke von -jit bumba -ji ao -jessic acap -imperman ence -ic ket -h anne -equ inix -distr acted -dis regarded -di ah -con focal -compac ted -clo ss -carat selcaday -cal lies -cai roli -bt son -bmw usa -bee ton -ambo seli -align ments -ali ghi -ya hu -y uli -water dog -w cia -tink ler -the star -thalai van -te f -subli min -squ ashes -sol arium -saveour nhs -ra gon -power breakfast -phoenix ville -nel sons -naz riya -mani folds -m spartner -jir ga -jaco bean -j rue -ite it -hon das -gu eye -go yotes -forest day -e ton -derby uni -dding ston -dac tyl -cum bre -cork town -congre gate -cincinnati zoo -chal ke -cado gan -breeze way -bol us -bernar din -avi da -al ooza -yo jimbo -yash ica -y app -wpmoy challenge -val es -up draft -sub nautica -stic ism -ss rugby -sr ally -sli thering -sli mani -ship ka -sex tu -sci fis -samsungmobile us -ram at -r nas -queen elizabeth -prou dd -playing cards -pe tes -park gate -pan vel -ola fur -mahan ati -lm f -kie ffer -ka il -harmon izing -har is -ge onews -gam bles -egoti stical -deac oness -cu sick -cruci fy -cheese man -cat amounts -bread stick -bla g -at il -as wj -absor bers -âĿ¤ï¸ı ðŁĴľ -âļ½ï¸ı ðŁĴĻ -yo gic -wil drose -vidy arthi -v artan -uch is -tw ar -think pink -team ireland -sw on -sho orn -selec tivity -sa ola -ron ces -ro it -rep mike -ra sen -pur portedly -pu skas -pu lang -plur ality -pi ppo -phosp hor -pet co -pad locks -osho di -mun cy -like it -la ssies -ko ss -kar ns -ha ki -giro la -g ado -fiel dre -ej io -dol ley -digi day -di om -destruc to -deci bels -coder dojo -cc s -brown ell -bon ic -aw adi -ath am -as pas -arag orn -an oop -." âĢĶ@ -ðŁĴª . -ðŁijĢ . -âĶ ı -visit nland -under shirt -un becoming -trans gender -thelim it -tat anka -su omen -stpauls london -shru bbery -shi fu -s bir -re dedication -play pokemon -pen man -p hair -oy al -ot tum -nam ie -n antz -mio cene -min a -marcel le -mali on -liquid ated -lampe dusa -isleof wight -iron stone -intell fusion -he ba -ellen page -e tro -dheeraj dhoopar -dance sport -cra po -co ghlan -clearthe shelters -cic adas -chec kyour -ca relessly -breaking weather -bor sa -bestsolo breakout -ati vo -ani versary -amnesty uk -al tea -ai guille -af ka -abhi jeet -aap g -] # -ðŁijŃ ðŁijŃ -ìĬĪ ê°Ģ -zed ong -wheel ing -wh oooo -westand by -v cp -un inspiring -token ization -to velo -tea shop -strongh olds -ri yal -re ino -ravin ia -not weak -marine insight -lo yee -krishnamur ti -junior doctors -jock strap -jabodeta bek -grid locked -grant cardone -gl g -ge se -ge mann -gas works -ero ticism -dru s -confed cup -ck g -christin ec -chick end -caitlin moran -brand new -bike toworkday -bengalur ufc -be sa -as ano -ðŁĽ Ĵ -ठī -zav vi -ye ster -wood field -winter ton -ucl h -sylvi a -stev el -si bat -shep ton -shab an -service members -sep ta -sassaf ras -sa ther -raf tery -press freedomday -posit ory -pi v -otr b -nino y -ne of -nag ra -n te -motor ama -mom e -met in -m tr -lis land -lac tobac -ky iv -kil bane -kat em -insinu ating -infr inging -ho pson -green blatt -gar nets -exp ander -droyl sden -cot ash -col an -clou draiders -clau ghlin -ca jon -bc p -bae za -ad hm -ðŁĺĮ ðŁĺĮðŁĺĮ -ðŁİ¶ âĿ¤ï¸ı -âĻ ¨ -x at -waq as -up standing -sy ny -skul leero -shan be -sham ir -scare mongering -s zo -ro mulan -re clai -quadru plets -pro enza -pop vinyl -plain ville -pbb abscbn -pati o -over nights -or sini -once always -old games -nam on -mer thy -may port -mat la -lo vitz -kul ick -jessicacap shaw -j wa -it c -hou ck -happy life -grey stones -fronti spiece -found pets -fer rera -fanta st -duck sunlimited -doom ben -deniz ens -costab lanca -comi enza -cli matologist -cheat sheet -brit geosurvey -ble a -ban corp -aquil ino -ann nd -aes a -ad ai -aa sen -ðŁij ĥ -word stoliveby -vesic les -vach on -unbeliev ers -un needed -sof unny -sinfoni etta -si pp -shin ny -shel agh -same er -rs gnl -real lucylawless -r wc -r ccg -pi ps -paste magazine -ni j -me tries -mc gavin -mc broom -mal d -low rie -k ericho -jam ma -in japan -i fex -heritag es -hb h -h z -green stein -gotg vol -ga ik -front page -fi endish -electrocu tion -des sen -cro ma -con sign -clasi fic -cir i -bab er -air drie -ðŁĺ± ðŁĺĤ -zi ering -zerflin music -ye ma -yam a -wk ts -wis sen -whir ly -wedding ideas -w rens -v dm -spin ster -soli dari -sj h -she tt -scot tories -sar af -roy all -raf al -po h -pirates ofthe -pd q -omg trolls -nz veng -north point -movi da -milk men -mer ri -ma ines -lecture ship -key rings -jil ted -hypnoti zing -hydro xy -heu sen -hal con -gro sir -grays lake -good life -fyn bos -equival ency -eg go -eber hard -cub bies -cri sti -coo ts -can die -brain pop -batt enberg -avi les -am fa -. ðŁĺı -ðŁijĮ ðŁĺĬ -ðŁįģ ðŁįģ -ðŁ¦ Ĥ -ðŁ¤ IJ -ãĥ ĭãĤ -âļ¾ï¸ı âļ¾ï¸ı -was l -uk team -transcend ent -tendon itis -su shil -son iq -sig g -si sodia -shut itdown -reali stic -purpu rea -pper son -pomer anz -pay o -oral history -ol g -nonchal antly -milton on -mid summer -man deep -mal uku -life boats -hor sel -glob alized -fle shed -el ta -do gger -dishear tened -di ko -den geki -cone head -cold brew -closethe camps -chino y -cbs bigbrother -ca el -bak ayoko -as per -alex andre -al chemical -al ane -ade k -~ *~ -wheelchair tennis -waj ir -vivid cloudof -vividcloudof wat -un abashed -thisi sp -stra at -stigmati sm -sel fa -ric on -pre pper -pearle scent -pac west -or geron -o kuma -liber tine -kw t -kot la -kar ai -k sn -iz he -human istic -gui se -fo ton -er au -ell sbury -ec chi -dischar ges -dead lier -daylight saving -bow len -bal ki -bail ie -avo ice -art school -air lie -yl land -ye urope -y eni -waga h -vo ya -stat ically -spo de -sou led -socin n -scholastic uk -real hiphop -queri do -ps as -pi des -pe lee -pass enger -om ri -ol ley -ni ms -n mt -mo pac -man ang -ma stro -m kiii -lili um -ky ary -ku mud -invic tu -hotch kiss -fu si -fro tterdam -fren kie -fen land -fair lawn -et ou -dor r -delu ise -concub ine -can by -baren boim -bad bad -ambi valence -alleg an -x po -wi ggle -whit ty -vegan hour -tu dung -tom asi -to too -thy atra -thankyou thursday -t dw -t aga -ss ay -srini vasa -siddi qi -sh ly -round houseldn -ra ser -r jr -nor de -myth ical -mel kwe -lin ch -kal ah -jes ús -illa i -hel ple -goodmorning world -gabrielle u -du in -crony ism -chy ler -boot strapping -at ol -ar apa -all ent -abra zo -aam c -ðŁij ¤ -ç o -wat kin -u fl -tom ica -taste maker -soo thed -shop local -sher m -sell ars -seasi de -ry delr -pro spe -pier ces -pho tonic -pe hle -p bt -own your -op ryland -one timein -npl vic -non alcoholic -mor ado -m gc -lim ou -l uni -jo well -iter ror -ink ster -gru ppo -gross mont -good boy -gaw ad -ft z -expe diti -ers onal -epsom racecourse -em men -edmon son -cri mping -con eflower -comple ment -chis inau -cal abar -brother sosborne -beautiful bc -au be -ari i -am historymuseum -alber tus -? ': -wir t -wer m -thie baud -suc i -set suna -seo tips -ro xx -ram ire -proge sterone -peter sham -pan op -p fe -origin ale -oooo ooh -notthe fake -noshaven ovember -nor i -nom ics -nd hakoo -mm ac -mau moon -lu pin -lo effler -ling erie -leyden pride -kinder sley -kinder chat -ken o -ke strels -k br -izz at -ie tta -hyper space -home schoolers -hesit ated -h nk -gre bes -gomor rah -fox ton -fairi sd -eating disorders -dart board -da ura -cy fairisd -chri smo -chero v -cetace ans -calum worthy -ben tos -amo on -ak rapo -a forum -" ...... -âľ ´ -virgin australia -vet kin -un substantiated -u tra -tun able -ston ed -st p -sp ong -sn h -shint aro -scsu huskies -robbin sdale -pre st -peds icu -n fi -meg turney -marin el -le stat -lb v -ker sey -katiec assidy -justin welby -ip c -international womenday -hy orin -for lan -f tbl -en ny -cra dling -christmas market -chand i -buffe red -bro u -ben cic -aspen cer -arsen als -aron son -air cel -ðŁĮ Ĵ -yeg music -ush our -twee tsnow -tru tv -the magicians -t ä -subjec tivity -sson oma -share it -ri vend -rap tured -pur l -public ans -prou lx -out lay -o ggy -net scape -navi mumbai -mu amba -med x -magnu son -ken es -ka jang -k ask -jay pee -j gr -its gabrielleu -imagin arium -horri fically -hello games -head long -hal ili -gul ben -good land -foul kes -fo ch -fin ned -er day -dissip ated -deadpool movie -dakima kura -d ort -chad stone -book outure -biof ilms -baf anab -b co -as besto -ali g -actor sathish -èĭ± èª -wei der -vitru vian -th appen -tele fun -tab as -summon ers -sugar ing -steel ernation -spring water -sla very -shore lines -rund gren -ro enick -piscat away -papu anew -n car -mo gu -megap lex -matt kenseth -man than -laurenti anu -la tha -hong dae -heim at -gil ford -gh ot -fle ure -fil ton -eo in -elizabeth may -el ander -dys art -death of -by ways -brush pen -bmw pga -au kee -ant il -angu lo -amyg dala -$$ . -ðŁĺĮ âĿ¤ï¸ı -ðŁİī ⾨ -weare winter -w tic -w shh -vintage hour -ven ir -the ta -ter race -tee tering -scri ms -root beer -rik mayall -ra fc -pic ayune -over party -over blown -ostap enko -optim ally -ool ers -ob verse -noble sse -myfirst tweet -mother less -micro biologist -metro schools -m ations -lipp mann -kh en -ion ization -iam ami -homes ickness -hin ton -h ce -gw u -gel b -fur lan -forum keralam -filmmaker friday -distinc tively -crowd source -by en -blon dies -bel ay -ar boreal -ak ur -a ford -ðŁĶ ĸ -water ship -voltron legendary -ul san -thereal grimmie -te sa -stonybrook u -star bound -ss si -snew video -sh we -sc bs -sar awak -sangu ine -rough er -re release -pro day -ns be -north vancouver -north side -myfox la -mur kowski -moo sonee -monte vallo -mohan raja -men ang -mehboo b -mac aques -jan itors -home kit -fond ation -family tv -emp y -e pl -dun ston -don ner -cowden beath -brun dle -blogg ingtips -blan ka -bick ley -bau r -bas sano -au rier -ari zzo -" ..." -ðŁĻıðŁı¼ ðŁĻıðŁı¼ðŁĻıðŁı¼ -ys rcp -wilson ville -wheat field -vo gels -vig na -v sl -tweeter app -special isation -song tweeterapp -sole imani -si mula -sher win -se ia -sanat an -reinvigor ate -qu arts -pou lenc -physi ologist -pas sa -own thefuture -ov ations -ol dee -oldee ire -ni ue -n pp -n joy -matthew modine -lin h -lam jarred -ke irin -kasi ak -ha ire -h pg -gn n -galatasaray sk -fran ky -eng sub -en nui -dishe veled -discrimin ates -dh s -cultiv ars -conco ctions -con tempo -cl anc -bu cc -bo bb -b aug -architec ts -ðŁĵ ¨ -ye ow -wieder sehen -web ber -vol le -visit ma -universal credit -star rett -sport bike -scre e -san jana -rssur jewala -re ssing -pr ings -plac erville -phi de -ou sp -orche strate -or ity -norri stown -nb hatt -mo yle -mil lett -meshu ggah -math ilda -ligamx eng -kra s -kip mooremusic -k ss -ju gaad -ital i -gon dor -extra dite -euro tunnel -eu chre -differenti ator -d weck -cru tcher -cor bi -co cor -co ben -cin na -cc ny -boun ding -boo ch -bit ly -b ence -ant ini -aden uga -ðŁİ« : -whi ston -vince cable -ver ratti -tur ton -tra ppin -thisi ss -thel akes -the sea -tam ago -tal cum -tal an -suc cotash -su ria -sig ab -shine e -select men -schar f -say ulita -san j -rugg ero -ren sburg -o dish -ne te -nah da -n ris -mo haj -mathi eu -mart ineau -khadi jah -kay ano -kanchi puram -ib mi -gun ma -gh all -form h -fl acci -first lady -equ alling -corrup tible -co bi -ci vet -ci era -cab alleros -bartol omeo -av ons -anjel ica -al ci -ag t -af tn -aci dosis -ðŁ¤· ðŁı¼âĢįâĻĢï¸ı -è IJ -yyc bike -x files -wit suniversity -web pages -wa ard -val in -un set -typo logy -su wanee -stockport county -startrek cbs -stan e -shor ted -ri stin -ray ados -pre hospital -pol di -pain swick -mou n -moto america -ido wu -icec aps -god splan -fre sne -for i -fich tel -fe te -f soe -embarra sses -ebon yi -disappro ving -comic palooza -cephalo pod -cassad y -bun tu -bu shi -bri ang -ana thema -alter net -adam m -ad mission -ac nn -. ¸ -ðŁı ° -yo gri -wh ey -w cb -vel ar -symph onic -star ted -spide y -se bring -sc abs -sankal p -prate ek -pleasee ee -per icles -pater noster -par ag -ob le -nr k -mun dele -maxillo facial -ma un -m jr -m clar -keeneland sales -k live -house keepers -her ta -gu mede -gor dan -fil oil -dor mouse -disaron no -di shap -d pc -col tford -cmn hospitals -caer leon -bur gas -bi shan -bha ag -as roma -armb ar -accept ances -âĨ ĺï¸ı -vit o -var gas -sv f -super fight -ste eg -sil ke -no ia -michael fassbender -mat azz -lax airport -ku bb -impal er -illa in -hyper pigmentation -hand ers -ha ken -good vibesonly -fuen girola -fixer upper -finding dory -f ale -ep ass -e sters -dr d -de mel -co ir -climb ing -cl attenburg -chab on -apalach icola -an tiv -ame en -ach ie -a sty -women entrepreneurs -way sify -us in -union town -stopthe cull -sport f -sper formance -show match -rw th -real sociedad -readabook day -ran ey -prosen jitbumba -per kins -pas cosheriff -palli ster -nic ci -mis representation -middel burg -mau dsley -lun gi -li the -le fts -hu at -hoh ner -gim let -ge tup -food land -fo gged -eco build -dee jays -chimic hanga -bug bounty -be hl -ann ada -ag st -ag fa -adren al -ðŁijį ðŁĺģ -wr l -wor tley -william levy -w eng -un pretty -u oe -tugger anong -tho da -st michael -son amoo -si apa -shar ron -shar pies -shape shift -rn li -rick ross -ri y -ra spy -q be -pe saro -parap legic -panch kula -p summit -nin anes -mis adventure -mb atha -march es -mar gery -lod ger -letit go -knife crime -kn p -ing i -i eds -fat ca -eh ring -e by -diecast malaysia -den ia -cur rumb -cran well -cooper ative -car tes -biomechan ical -bar letta -aw right -arm ing -and or -a ash -yadi er -whe en -wh k -wat o -war ding -v ns -ura wa -un determined -u dm -type setting -traw lers -the square -t world -rob it -r top -penny stocks -nic os -mk b -maroo chy -manzan ita -mag ar -luc ile -le eming -ix tapa -hamble ton -hall statt -hair i -gym shark -g omg -dun s -dendrobi um -de perfil -cister cian -ci pla -charli ed -carac al -boriso v -av geek -arn cliffe -ano u -al wa -ðŁij ĥ -ëĿ¼ìĿ´ ê´Ģ린 -ç Ĥ -е ÑĢ -| ... -z otto -wrink ly -ultr arunning -tric hat -sy ros -str itt -spider gwen -so won -sla ppy -shekhar gupta -sel u -sa hil -pre mi -plat er -phone tics -ph led -peter son -per sol -p mpt -ow x -nis bet -na ic -mor dred -mon da -moha patra -mess rs -me ola -lo chs -ligam x -just sparkles -joyl enz -journalis m -jig ga -j ore -ig d -hitch hikers -harb ison -hallucino genic -goe de -gg ing -garl icky -freak onomics -fr sc -evangeli stic -elem chat -dread central -do er -bu ju -blood drive -beau vais -bar fly -ark low -ard ine -zi pping -z id -winter storm -wedding inspiration -ward our -tothe top -that guy -tas cam -sym pho -stu dley -seattle storm -se ey -sc up -revo king -poon am -po v -philly dotcom -one z -mar antz -m tuan -lack land -ku chi -kno tes -ki do -ju mu -jo ve -je ux -jaco bl -irish music -inst ra -indo china -hy mn -greg james -gold crest -gingi vitis -electr icals -east ers -drif field -dal liance -dag upan -cra il -comic sgate -chinst rap -ce de -categor ised -cap sizes -camill eri -but chart -brom eliad -brad well -bee day -be ds -barangay ginebra -b wr -ay so -yo plait -west fal -wee bly -un restrained -team om -tang any -spo leto -so bo -silver line -redrock sco -re boots -ramach andran -pap o -ob liqu -nico ise -nanom edicine -my plate -mongol s -mo gherini -mn ts -megal ith -mac ap -ma ggy -luis fonsi -lor g -kooten ays -kne pper -king a -kar yn -k to -j ro -i hh -hra b -hit sm -guil lem -ghe or -geome tric -feed back -falsi fied -exacerb ated -durban ville -din ky -di ep -de pop -comp tes -co sima -class dojo -choreo graphing -bub sy -bet v -ana gh -adhe red -ìĦ ľ -yu rek -work group -win di -wal lowing -valley usd -un common -te rel -sky atlantic -si gi -scra wny -question time -pim co -pe sta -pap worth -ox bridge -os wald -on z -mont ville -maid stone -logi x -li pper -jc icki -isra elite -il ac -gr illes -g fr -feature film -fal las -dw news -drew scott -dd ar -davi da -craig avon -comefroma way -brox bourne -atri athlon -appu ram -ðŁĺģ ðŁĺĬ -vacuum ed -un seen -trick y -tri ght -tor ff -tachy cardia -standar disation -st day -sje arthquakes -score boards -sco ter -ronan official -rit ch -ra gu -ps ers -popul ation -paedo philes -over supply -oc dsb -ny topinion -nicky hayden -ne stor -nau gh -n devon -morgan ite -man al -makk al -lim ps -j ellic -hayley kiyoko -harro ds -ger vinho -faking it -fab u -ess ere -crime family -ci vi -che ever -charter house -cal avera -cabbage town -butter ick -biglotter y -bene teau -ba bette -at ua -ab abes -... :-) -ðŁı ĵ -west mead -west ford -voice overs -un motivated -t ander -stand free -si biza -shop front -sha am -sc ross -sawh ney -sau gatuck -re claims -r ht -quart zite -plough man -parab ola -mon ade -molyb den -marks manship -mari ja -mahesh nbhatt -ker ch -invent or -hun ke -hr n -hou sec -gary sinise -every where -equival ents -elu des -ebook deal -e ge -do ona -dex press -daniel aruah -coch lear -circum vent -chapulte pec -champ neys -blackkk lansman -ap ie -am yl -all ys -ðŁĴĽ # -ðŁij» ðŁij» -writing prompt -val ar -un tidy -sush ant -sport chek -spad eny -s gen -read the -quarter master -prati k -po th -pat aki -ng supereagles -nc bi -mand ating -mag er -loch head -kam ar -imper vious -hel len -he u -gi ang -geni ushour -ferv our -fast break -exor di -exhilar ation -europe o -envis aged -ed gars -ear drums -diabete sday -cor tese -chri smur -can ali -bap a -ðŁij¶ ðŁı¼ -ðŁĮĪðŁĮĪ ðŁĮĪ -wark worth -vra bel -vintagec lothing -u im -time a -south view -shol t -sett le -rc g -ra ws -pre positions -pr ama -pencil art -out for -os valdo -ore y -ni oh -nabeel rajab -med gar -lif ford -kol sch -kaz uma -it sb -ilove cornwalluk -heritag emw -gra p -gall eri -for dgt -flo y -fel stead -f ony -entr ée -dy sen -custom made -cole shill -car vel -cam m -brun chc -bmr tg -blue coat -biggbos stelugu -al pena -african american -afoto deperfil --- , -âĺĦ ï¸ı -âģ¦ @_ -zz ari -wood stock -visit the -trypto phan -ton katsu -tol d -stay in -st aci -sm ale -siber ian -runner sworld -pil on -on th -nun nery -nbc chicagopd -my ke -mp cc -milli pede -mark man -info security -il aria -hul st -horri ble -gli mmering -ge she -foam cc -eure ka -e glise -e buka -d allin -cru elest -col lo -chri sma -chi arelli -buen avista -braintu mour -atlas v -athom pson -adi za -ad ance -ze sti -yosemit enps -wa fel -ve ined -v ball -urijah faber -thanksgiving with -stu pe -sn krs -slen derman -si ku -retail tuesday -repul sed -re occurring -ra ed -qu tub -plac ido -nayanth arau -mutual funds -mi fid -mer ve -mat atu -mah wah -kri stel -ket ter -indi ant -groun dup -giftsfor him -g do -fume tti -fa sig -dak ar -d bp -croo kes -com per -clue let -cit é -chris van -cc sa -british redcross -bone head -blanchard stown -bbcradio scot -bab ington -ba is -all time -] ; -. ðŁijı -æĿ±æĸ¹ç¥ŀ èµ· -âļ½ï¸ı @ -zil ch -yn i -tri sta -ti wi -the team -sy phon -stellen bosch -selec tion -sand well -ri bcage -pest ilence -mh mm -mention someone -mb ale -made me -ka uri -hero ically -har um -gon nabe -field day -ec ats -droo g -do di -devast atingly -demarc ation -daw id -com pra -co die -ck l -chil well -cherry blossoms -cb fc -bet u -arn alds -ad ger -ðĿĺ ģ -öz demir -yogri shir -year old -yakis oba -tri ennale -to pen -ti enen -thong thursday -there ale -sá bado -sso white -so yy -pu sci -privati sed -physi os -p tf -over active -ob on -modu late -member monday -mc nairy -mai read -lex press -ken worthy -ke shia -kati emc -kap it -k icc -go omba -go blin -fo lies -far mall -eye con -dispen ses -di aph -bro y -bre r -bal combe -art scentre -applec ross -aldubi yamin -aali yah -ëĤĺ ìĿ¸ -z una -wil le -stock room -sk rona -sister patriots -sd aughter -river wood -puig demont -political prisoners -pharmaceu tical -pal atin -northumb rian -ninanes bitt -newstalk fm -mole skin -le hane -ksen ias -khor asan -kat u -jab ber -j ón -it ttt -ini sta -ic kel -hahahaha hahahah -gn ite -git te -fan cave -exc ell -encum bered -eden project -dism ount -chris webby -body positive -bc sd -ash land -ang mering -ðŁĴľðŁĴľ ðŁĴľðŁĴľðŁĴľ -ठļ -Ûģ ÛĮÚº -é ry -zzzz zzz -zet as -woolsey fire -vis ital -ve ja -uniof hull -tric kier -toon z -tom be -the of -step toe -sten o -sp ake -sho sports -sam ark -s bur -priv at -power lifter -mc sweeney -longh ouse -kitchen ette -impeach able -hy nde -gu shers -gre mio -de merit -daf ydd -carcino gen -bulb ous -budd in -boy yy -bla sto -bertr and -bandhav garh -are cibo -ar shavin -al mora -! > -ðŁĺĤðŁĺŃ ðŁĺĤðŁĺŃðŁĺĤ -çĶ » -xen ophon -ver dot -ton gar -sto ssel -sanjay dutt -road side -revi ve -rebu kes -rc v -p we -over flowed -onet ough -oik awa -ni fe -nfl onfox -miya jima -mg f -madewith love -leg aspi -lac as -kae de -k fm -hilari e -heath land -haw ker -hack y -gor ill -gl vc -gate shead -fli k -energye fficient -em mer -ele mans -eg gheads -ec rew -corri b -bot any -bol sover -bar oni -b we -alpha ville -a world -zur ita -un injured -uk zn -tri kes -ti ket -thick ened -tele scoping -ta ung -sunglasse sday -sun shines -smoo ches -sh ate -service dog -rhodod endrons -republi que -rating theraces -q urbani -p ma -no amnesty -nashvilles ounds -lucas arts -love child -lot ton -li bel -kar men -kad in -idy ll -iam johnoliver -hold out -haup t -groom sman -gri mmers -gl ay -gee chee -flap jacks -fir med -f pf -europe aid -enam elled -eco sse -ecker sley -don mar -disco theque -d mar -cad w -bri oni -ballin colli -avalan ches -alt adena -ðŁĺŃ ðŁĴĺ -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤ -ðŁijĩðŁijĩ ðŁijĩðŁijĩðŁijĩ -ðŁİī ðŁį» -ðŁĩ§ðŁĩ Ń -zul fi -yogrishir amdev -wu stl -white throat -ven ere -un furnished -un changing -truck loads -the artist -summer jam -sr ite -royalwelsh show -ro don -rickie fowler -reson ance -re scheduling -r witherspoon -quar les -pin n -pil cher -p kc -p conf -omar u -official pompey -mu ting -mla denovic -mi wa -mb da -mar v -kit ana -jar l -intu bation -her metic -ha ise -gl vc -first warn -et weet -breakou tedu -bor din -bee gees -barbar ossa -as chools -an elka -amic able -americ ane -am ap -a jones -âģ£ âģ£âģ£ -zi zek -zell weger -viz caya -visit mexico -truck tuesday -trab zon -the joker -sham bolic -sali vary -rico harena -re writes -prin ny -porti mao -pha eton -par bat -p sh -norman ton -memor ise -mar got -malle able -made easy -ker ley -k pn -izhe vsk -itt f -id c -hau z -han am -fu gate -foo ters -falling water -faken ham -david labrava -dab boor -cros scut -carni vale -camer ata -bridg it -çµ IJ -âļ °ï¸ı -âĸ¶ âĸ¶ -प र -win canton -wair arapa -volcan os -veterin ary -upside down -ua allamerica -the wanted -tao yuan -t elli -szcz ec -stu g -sp c -smat tering -sel vi -se jour -scar boro -ri sc -r iner -o red -ncaas oftball -mo jom -mit sloan -mak sim -lur ay -long ton -litho graphs -ley kis -jo by -ha chette -g yor -for tress -f outs -e om -dissemin ating -datavisu alization -conoco phillips -choice awards -chitr aloka -ca afb -bur in -bis son -ben o -bbc suffolk -athur sday -aravindha sametha -ad hoc -ab lue -ðŁĮĪ ðŁĮĪ -ãĤ ģ -world class -win du -visit kent -tubri dy -tra choma -take alot -shore bird -sho ko -she aserrano -sex perience -refor med -rece ssive -re purchase -re heat -pu trid -pb con -o thr -o som -norther ner -nit rile -new relic -n endo -mwan za -mv c -moreto come -me co -lac o -hud dy -gar ners -fresh offthe -find hour -er mene -e more -dv ar -dog meat -denver post -demon ize -dan il -car sen -bouilla baisse -blo gher -at andon -alibab agroup -ðŁİĪ ðŁİĤ -ðŁį¦ ðŁį¦ -z ameen -y ata -video shoot -venkate sh -the tis -temper ing -stra thro -stodd art -sel sey -ru ises -ri ski -re house -puzz ler -pr é -po phobia -per iment -pav an -pare ja -on ur -mi sting -melkwe g -mc gee -lo omer -kumail n -gn awing -ear nt -dismiss als -degan arseguidores -dai ichi -dad u -d za -chang sub -carryon blogging -boardwal kempire -blurry face -barn wood -balo chi -b hin -amra pali -adam devine -acom pan -ab ro -~~~~~~~~ ~~~~~~~~ -wo jcicki -ve ik -user names -ton park -super bird -string fellow -stel o -sephar dic -per umal -pat ah -north ville -noctur no -naom h -nad ra -mv m -manzan illa -ku cherov -kir il -k michelle -ip al -in ster -hub bub -hr rr -gu stan -fy p -eli on -dizzy wright -disc ours -dabboor at -cu tely -brain ard -beat boxing -ban as -as kari -abo xing -you ll -world mag -w ms -urin ate -thunder snow -super bloodmoon -sm sa -skulleero z -sick les -sh inj -sesse gnon -samuel sson -ru din -road racing -river hounds -ride au -ra iz -prephoo p -porto frotterdam -polling stations -poll sters -pap el -ottawaf ury -nure yev -method ical -le ix -jame sk -in situ -ho sed -het alia -green acres -goo good -fé ile -fri bourg -frankie j -end ay -displ aces -dee red -bluestar zone -bhubanes war -beli ke -bag by -atar get -as ay -ariann ahuff -ag adh -ab ria -[ ( -âŀ¡ï¸ı âŀ¡ï¸ıâŀ¡ï¸ı -young man -weekend kav -vi das -var is -tot ter -test bed -t pp -swe tt -soo s -rut ledge -reddog susie -recer tification -priyam ani -poo t -poly vinyl -pleas ert -part ay -na iler -mount vernon -mo za -mill o -le eps -ld k -laur ita -kwas i -jay bird -is r -imag azine -il ac -grim dark -episte mology -episo dio -de colonization -chinois erie -chag as -cd v -cam bia -braz oria -br icht -blu d -bal as -athen ry -as ps -apr ès -anu radha -alt balaji -... [ -âĿ¤ï¸ı ðŁĴļ -âģ īï¸ı -ó g -ye aaaah -visit jordan -u og -u dan -tso go -trench coat -tr ite -theroy als -th atha -st illa -shaw ano -sat anist -ros lindale -red ban -ral phi -quar to -pra d -pr ang -ottawafury fc -naom ie -mysti fied -museum day -mu ff -menstru al -mediab ase -lgbt pride -leop old -ke ley -kal ank -huski es -hebden bridge -harmon ized -gye on -green lit -geo ghegan -eye opener -every child -eneed le -e ure -dian er -di ers -day fm -cru shin -credit suisse -clon dal -cle ves -ci onal -c itta -busines strip -body paint -b ous -app enz -**** *** -ðŁĺ¢ âĿ¤ï¸ı -ðŁİī ðŁijı -âľ ŀ -wheat land -westf alia -v ade -time slot -t anta -svel te -stri pey -spring summer -seeyou there -schi sto -sang er -ryan seacrest -rother y -ross ellini -r re -pu e -porter field -pj m -oo voo -o lean -nephil im -mariach is -lole sports -kim ba -jung woo -jo anc -it ll -ish ant -herma ph -heck in -hair day -gh onetv -folk tale -eo cene -el wes -ed dsworld -don nington -distor tions -digital camera -dark wing -cor tin -chi di -chat man -cath ed -catapul ted -bra g -boat load -bo ddy -blow torch -blo cky -bio bank -beat la -bb sr -au dra -andre ab -afl womens -ðŁĩ©ðŁĩ ´ -à´ ª -z eds -your story -x j -wet ness -vla dislav -vin ales -ver beek -tw irls -thor ity -t chami -super be -sug den -strat for -stormy daniels -squan dered -south bourne -semin arian -sar godha -sa ima -reven ue -re tell -rb x -rain ha -post operative -perform ative -peck ham -organ o -or ak -oh en -nyc pride -nir mal -ni ños -manic ured -manas quan -makers market -london ist -ko jo -ker to -k bd -j tc -intermitt ently -gano derma -fa ch -ev gen -equal ised -e oy -e health -e harmony -don ee -ch strfc -bint an -ar man -ajac cio -afa una -wre aked -tul sigab -ti kal -texaste ch -t ative -sweet potato -stkil dafc -spar x -slip case -shady side -sal tz -r int -pran king -phe red -par ana -od die -o we -ni lesh -nar whals -n anti -mp hil -mat in -mag asin -lu mped -kop ar -ine dible -im bo -id leness -high end -gro aning -franch is -fo ssa -fo gel -em mons -e bbing -dro ver -co ppi -chin cote -ch ory -c de -bow lin -best memoriesof -be se -ap lus -a afc -" ??? -ðŁijĮ ðŁĺĺ -âĿ¤ï¸ı âļ¾ï¸ı -à¹Ģภ§ -wre aks -w psl -unil aterally -un predictability -tu bb -tofthe year -ti o -spenny moor -snug gie -snow cone -sims bury -segas aturn -sea eagles -ro sy -retro active -qu ail -polyam ory -par tisans -od t -nuev afotodeperfil -nca agolf -na ing -music photography -mun dell -mike trout -ly sol -le doux -le awood -jit endra -hus ks -he et -hazel ton -har rod -hamp stead -gor dian -glar us -gav r -fr ing -dend ro -d ch -com pline -cit ys -character izing -cel adon -carlo ss -bur ana -bun goma -bu bby -broad beach -at g -ðŁļ¨ðŁļ¨ ðŁļ¨ðŁļ¨ -yas uo -xfinity series -v itti -ut coach -the win -tex ans -ta kia -super heros -strang le -star child -space ship -s will -rin ella -penn relays -pede france -p nt -p lim -over bearing -off setting -n cm -more t -marin elli -makemy trip -lupe fiasco -love ireland -losange le -intu itively -go jags -gear up -g wal -esp adrille -dou jin -diam ant -d ace -c sic -bas inger -aspen institute -abcac tionnews -à¹ĥ à¸Ļภ-wel e -wee gee -wal mer -vol can -vintage findhour -un branded -thab sc -th ies -sp ars -serv i -sam ard -sabo teurs -pol icec -pal apa -olac abs -n cert -mount ford -mahin da -less er -her thabsc -ger aint -ep worth -do gara -degra w -de sc -cran mer -cn co -chand rak -bur han -buenos dias -be ki -bcb tigers -bab bage -ah gase -za w -y ls -x tr -trixie mattel -tis sue -szi get -sy co -spla yed -sd ell -ri pe -ri oli -pumper nickel -on thisdayin -ofici ales -ning en -mor bid -mc v -marcu m -lets be -l wd -khy ber -k tm -jig awa -j rd -hyper inflation -halloween town -greeng ro -disinfe cting -dis figured -dal keith -co ble -bon nes -bill mckibben -bar ç -bar uch -au dic -apol lin -ab har -william ssonoma -who ville -up state -tu tera -tilland sia -thedragon prince -the high -ta kra -t ating -super smashbros -schwe izer -sabar mati -rosco smos -remo ve -read ju -r tw -plagi arized -pi u -pen rhy -n nl -museum selfieday -mmi wg -minis kirt -man ek -ma ury -kling ons -k wi -joe star -g lowed -fol l -fl att -fi estab -eric son -eleg ant -e reader -du thie -di ano -col lis -car ami -boy kins -bor gen -bon do -bafanab afana -at ack -ar tra -acu ff -æľ Ī -yor ick -wa ar -w op -u jj -tun ica -ten orio -ta house -sum me -sel in -sec ity -sarab ande -ry d -reli ves -polynom ial -phyl icia -ol ay -nish ant -minneso tal -micro fluidics -medi agroup -make ba -mach an -long livelong -ligon ier -lam prey -karma pa -kar isma -kalk brenner -je ph -hot stove -her ath -ha stie -gro pe -gor ski -ga j -fene ch -fe ckin -f tii -ev ac -epitom ises -ch age -bran che -alim ony -⼠ı -wind shields -wi a -voltronlegendary defender -tulsigab bard -taxi driver -take action -swee et -spe yer -save ourocean -sarahk silverman -s dram -power of -phys icals -pe gi -pa ks -orec chiette -o ec -na vid -mn gop -mi ers -mel lie -lei ber -kit v -kil is -katah din -kar lo -jeff ery -imagin ator -huntington beach -hor ning -hereto help -glori aste -gloriaste inem -ghost face -fru ited -fac ci -f yn -er ac -ee h -e igg -dear ne -crow snest -compad res -charen tes -ce h -bo el -back rest -b fb -ariane space -alter na -alexand r -aldub happy -al ink -abolish ice -ze in -window less -vas anth -val entia -united for -tj x -tin ctures -thrift break -the mac -terra sse -te pco -sü d -so cr -siem pre -se sports -sar gun -reyn ol -rajasthan royals -rah mat -pro shop -phra se -phai don -per abo -p chat -ouri st -om nit -nex o -nebu lizer -nand an -more days -midwi ve -ll cr -li va -leadership matters -koto bu -ko he -jupy ter -jan ec -humer us -hindu stan -hac en -h mi -gun da -general mills -ever blades -en stars -dr ang -div is -di anthus -coll ated -car ditis -bu se -best musicvideo -au secon -alt as -ale igh -al tered -acet yl -wal ney -vintagec ar -vi pass -v qa -top billing -tac tician -t dt -t ct -suf fix -stu f -stick le -st ä -shen yang -se vend -ro sat -real talk -quil ty -pittsburgh pg -pin os -pil ly -perenni al -penni less -pacio retty -or onto -onetimein nola -off al -near ly -nau sic -mob wives -mandi ble -man ou -mal ing -jun gs -jer obo -je zz -je wett -hust led -hed man -fe tes -extr atv -dob bie -defi b -cory gardner -colum nists -charlot ter -certi fying -carne iro -book addict -blogger swanted -big fat -bethany joylenz -bassad ors -bas sam -ade el -ach ina -ľ ล -ðŁĶµ âļ½ï¸ı -ä» £ -ãĥī ãĥĥãĥĪ -ãĥ ´ -ye ver -world mcqueen -vir als -usav olleyball -to scan -time tables -thof july -te agle -takay ama -sunday brunchc -su port -solidi fies -shannon r -se cops -sch y -ru bia -ri gel -ravil ious -q ah -prof ited -pom mel -patri zia -paranor man -papuanew guinea -ou ree -nu u -neck piece -nag orno -mybe belove -mou thing -mot els -mar kelle -man city -maeste g -lu jo -jo sip -ihe anacho -hi dro -han se -go jack -fr amer -favor itas -down sview -cz ynski -contemporary painting -communic ation -bbc worldcup -ay be -... ðŁĺĤðŁĺĤ -) ," -ðŁijĮ ðŁĺİ -미ìĬ¤íĦ ° -wh darts -wal kr -vin ing -val spar -u ww -u ur -truff le -toe ic -team solomid -t tos -sub ha -so tw -sebo gier -sad dl -rob ina -re drawn -re counted -rand ell -pur slane -pt safety -pron ghorn -music ology -mur doc -micro transactions -massage therapy -mani kin -man museum -mal ley -mahersh ala -lion day -la pa -il x -huy ton -gugli elmo -gu de -for my -eu less -ess ure -elec tives -ea ste -dress ler -do et -dawn richard -dani ell -dan adel -cigar citybeer -ce ment -blue peter -bio based -be vis -b kr -arat ne -all ons -ai katsu -afri kan -ab it -ãĥĪãĤ ¥ -м и -visualab stract -un agi -ty t -tri bbles -the be -stau bach -so bbed -skel mer -scribblen auts -s fi -ride for -ric snews -red poll -r nation -quetz al -quat ernary -oce ano -noso tros -moon shiners -mika elson -mer rie -mam u -macy sparade -k ue -john wall -jay awar -ir fu -hu bli -h pc -gauri khan -feren dum -ejio for -eag lenation -batt alions -bajiraomast ani -any place -ann yeong -ang atta -af ton -:) "@ -ðŁĮ Ľ -ze ek -z ato -to ph -tin ta -te thering -sustain ment -stro ma -strading cards -still well -steven son -stepan ek -stella artois -so con -shi mada -se adogs -sabot aged -rob g -recuer do -ophy te -on nit -oc ceren -nap anee -nan os -naj wak -mis sal -marvel ing -ma hu -livel ike -ko co -ka isa -jimmy buffett -flo e -fla gler -fin dley -far row -even son -encapsul ate -el pi -dor ner -dhar an -del fino -de stro -conflic t -ch arest -canadas occeren -cad i -bj sm -being united -ban anas -audios lave -ati more ->>>> >>>>> -äº ¬ -âĿ¤ï¸ı ðŁĴ¯ -wx guy -wo akes -w ts -tro hman -tn pl -spice world -soft cover -row en -rock ingham -pul teney -plo ck -pa pped -note ven -mceach ern -manipul ations -loo keast -le mn -krist offer -jazzy b -iv ories -is am -i bus -horn ung -go in -gill man -ga iney -dis oriented -de akin -d wd -chlo ë -cannabis culture -ar oldis -anglesey scmedia -am iner -ø rn -yo v -woll stonecraft -weather live -vit a -uni do -tram adol -to inspire -sothe bys -shin ge -schne ide -sc ally -sack ings -sabc newsonline -ry bak -ro ku -reiter ating -photovolta ics -part es -north star -mu ar -moore stown -mondele z -mel ter -mark ley -mariab arti -mariabarti romo -lorela i -kkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkk -ki ani -jo en -ili as -ian h -hy des -high times -hen ke -healthy choices -hat ley -grand finale -gh ali -dr strange -dog sat -dj al -dictat or -cor responds -cool more -com promis -br ø -bas son -b flay -b du -arri ver -apar ty -an ting -an schutz -af tal -ðŁijĩ # -âĺºï¸ı ðŁİī -wom b -wag staff -tv i -tss aa -shigh ered -seymour duncan -ser ra -sch lager -row ney -pll tvseries -oskar blues -ola bel -nd spdwy -mo ai -me tric -marke ts -manic ures -key stone -jor ja -jo gs -hoo kups -gre entree -gi est -geaux colonels -f ford -en b -dra is -dow sett -d wood -d fi -cost of -coral ville -city lights -chicagol ndspdwy -chic lets -ch acon -cas sy -be ps -ave z -au sf -aristo cats -ao ty -alme ida -ali ghts -ale ss -adsor ption -aac ta -[ © -ðŁįĭ ðŁįĭ -ãĥ Ĭ -à± Ģ -र à¤ķ -yum miest -wi ra -what toread -uki yoe -ton hall -ti oman -th ira -stol z -spon gy -sitt ard -sick notweak -sa recool -rott entomatoes -rock well -road tri -r dr -puertor ico -primiti ve -phan togram -par igi -mar ant -led ford -ko tel -kell yo -ke aven -hyper link -huns let -humi dex -horse box -graham stown -g alls -fr l -fa eli -du sts -down ership -de pp -da aa -cy t -cu ld -ch d -by gones -au v -ar tre -ar lin -... ). -! ðŁĺŃ -zu o -yacht life -win dup -ut knoxville -trumpre sign -toma hawks -swe ated -sw pl -stress relief -sti dham -so tt -sharemy cosplay -roger son -road trips -rhe em -plen um -peat lands -our house -on cers -old hollywood -mp inoe -maz um -lessi g -lay f -l gi -krish na -kail yn -jo ek -incub ating -ilovemy dog -hei dik -h wt -gun smith -goooooo od -g vp -fu mbling -fru strat -fis ke -f mu -esp in -encanta dia -e commerce -dal ec -cou sy -cal mac -byron bay -as ner -ar len -an anth -ðŁİī . -ãĥ¼ãĥ ł -âľ Ń -zebra head -wwe ajlee -vipass ana -trade winds -teoti huacan -ta jin -stud land -skir ball -sand ymount -resc u -repell ant -pre g -pou lin -pa quin -p bd -mondi ale -mis smal -micro grids -met formin -me ber -low carb -kw gn -kil n -kiku yu -kett les -intercep tors -fr ant -fagi oli -f bk -eri ke -doo b -d mexco -clever ness -clai mant -chatt ers -bez els -ban sko -af oul -ðŁĴª ðŁĴªðŁĴªðŁĴª -ðŁijı ðŁı¿ -zo an -wur m -viz ha -v sn -up end -twin sburg -trac ee -tower hamlets -theip aper -sun rail -sm om -sheet metal -sepat u -sel bst -scri sis -sco tti -schoo se -saturday vibes -sa pe -sa ori -regi e -oti eno -ntv today -mk ultra -micro waves -me del -man ta -mam bo -liv ro -le conte -krush na -ki ku -ke it -j mw -inhal es -industri a -heral ding -her op -ha al -gros beak -grange town -fon zie -du soleil -do si -deliver ables -dar roch -chi ve -brit athletics -be yourown -b bl -ar ge -antonio brown -a ure -âļľ ï¸ı -ÙĦ ا -zero waste -ww l -with your -windy city -wi gg -wether by -wa is -wa hy -thor ns -the over -th uli -sun kist -su bal -sport stradingcards -ski l -regen cy -ray bould -pin chot -pel ag -nikki galrani -na iro -my garden -moom bah -metro fmsa -mari k -log es -li sson -kn aus -kend i -ip so -indian ola -in tha -h sin -grey lock -gan se -fraw ley -fin epix -esh agupta -ene me -disin terested -dis jointed -cre vices -council of -cap le -calvin and -bird box -big d -bar thes -are volution -al ympics -ðŁĻĮðŁĻĮ ðŁĻĮðŁĻĮ -ãĤ ª -| -/ -zing y -zar athu -young living -xfre watch -val lotton -us as -up dike -un paved -ten ey -swk play -st james -spur snation -sound bar -soho house -sn icker -smtown global -shun ning -sen shi -sem tex -s zab -recomm ender -ram bo -radio logical -pre prints -pent ag -p bal -on ni -o sn -nom er -my story -movie quotes -movi l -mc rib -mateo guidicelli -mal apit -mac phail -lat ched -land rights -kr ann -khal eda -ked by -jo deci -harro p -gethse mane -ff dp -eyewitness wv -est elle -en demol -cmoh ry -cam illo -ble p -bio similar -bat ard -bas ant -ay ud -awesomen es -alber tope -adi ya -ðŁĴĥðŁı½ ðŁĴĥðŁı½ -ðŁį IJ -ائ ر -vat icano -va id -under pressure -slu mb -shun s -she ahan -service able -seguri dad -sau da -s gin -ri am -prep sports -pol ices -overestim ated -oko boji -nick kroll -newtown ards -marchof dimes -mar sa -lip as -kitu i -king sholm -intersper sed -inter webs -iiii i -engl ert -el nik -di kh -den v -defend theland -char an -c ics -billo frights -bern ards -beg one -ag ana -ì° ¬ -ÙĨ ÙĬ -ye ong -wheat on -vid han -ve spu -v indiesel -transform er -terra form -ta kk -t lou -t ago -sun block -span ol -scri p -rudrak sha -rhyme sayers -rest lessness -pl oring -photomon tage -periodic als -pen with -ou to -os ram -o gh -mul berries -mo wn -min u -majo red -mac aws -lon gridge -lesm is -kiren rijiju -ken way -harmon ie -growingup with -googood olls -gle ich -ford models -fo gs -eto sha -e wart -drjimmy star -cou pes -chakra barti -car ms -can not -bol stering -bha vana -auto focus -af elt -a uro -ðŁIJ ¤ -å¤ ª -Ì µ -x ab -wicker sham -tu mn -ten ch -spe ts -sage summit -run about -raw ten -rap turous -ram sar -pic kets -pantan al -oun e -nu yor -nu tting -mu bad -mor tise -mc guin -mar sdd -lu cey -lingu ists -je thro -free people -forget fulness -e zzor -dis regarding -del monico -cyber man -coldwar hist -cloud security -clo vers -clo stri -cdr kelly -brew ing -bra ssy -bor del -bill ard -be quest -b pr -apothe osis -am yn -al oma -afgh ani -ae an -adidas running -a stigmatism -a hahahahah -ðŁij©âĢį ðŁĴ» -à® ļ -who dat -whit sunday -uz ha -universal is -un garo -ty rus -tur geon -terran ova -tan war -stam pede -sport sphotography -spal omas -sam pa -revers als -re tracing -qab oos -power scourt -pi vo -petro chemicals -olive garden -official ap -nh c -mer z -marque try -m brs -kir ton -kat ra -is ser -infer red -improvis ational -hu ey -hi j -haringey council -har pa -ganon dorf -gabbi garcia -full sail -fol tz -fly laxairport -fertili ze -ec a -e gc -du plessis -di w -d mh -cut ter -condolee zza -car reno -bothvote ssnp -bit ton -bi atch -bethe a -ber tens -bar ch -bac al -at ras -ashok gehlot -artist oftheday -am and -af ai -wo den -wfu v -t pf -syl mar -subjec ting -sub woofers -steve madden -station cdrkelly -sen ter -sea star -sc f -sal wa -sa af -ro sina -red path -recy cl -preston wood -poisoni vy -percu ssive -page ant -over dosing -not atarget -nb colympics -msin spire -milli second -masa shi -mary vale -leg om -kille brew -keep talking -ist ill -io annis -icici bank -ich mond -health matters -guar ana -goun a -gon ne -ginand tonic -gas coyne -first dates -fc art -f pe -f mv -du le -discoura gement -diam o -cu mann -cougar pride -c sac -blu bber -bettere veryday -archite ttura -arachno phobia -an cha -aly x -ðŁĨļ @ -éģ ĵ -à¹ĦภĽ -w basketball -ve rena -ut ani -usair ways -tupp ence -triple talaq -travel inspiration -the gentle -tan jong -stor t -sport shub -skelmer sdale -sel igman -se aley -sb ath -rncm voice -rad boud -ra jouri -ponti anak -pic he -pic anto -pass book -p illion -ng sop -music live -mul hall -moz hi -michael vaughan -mc glo -mantel piece -laun dere -hime ji -gooch land -gif tware -gfr dofficial -ft one -fre tting -cor nett -ci oni -chal ks -cadogan hall -bro mberg -ble ep -bill iton -aubre yoday -arca dian -a ile -ðŁĴ¯ ðŁijĮ -âĺķï¸ı âĺķï¸ı -z ick -york racecourse -wolver ton -tow nies -tor tures -tol ly -thor old -territ ori -tan veer -ss at -spam med -secret service -roger waters -ri pp -relo j -r car -q mc -politi que -po inter -ous life -open stack -official wmas -my coop -mam mut -liveon news -la ity -jami el -jag iel -investo pedia -in vier -i zzi -hic h -h inews -gu c -grisel da -fidel castro -fear fully -falling skies -f lec -e mison -dag mar -clu bbed -clair mont -cell press -cany oning -canad arm -bv g -buy in -bio sci -back shall -aga ins -zer g -wester ham -v and -ui w -tour downunder -to shiro -ti ao -sun din -stje pan -ste red -so tc -sarab ia -regrett ably -re activate -potter heads -p boc -on yango -night core -n mf -n drc -mye at -my gov -multi plicity -moore head -mid am -metat arsal -meath gaa -love film -kurunzi za -jas a -j mj -j mac -im parts -home business -hac cp -gr attan -equ alization -ent als -e vey -du bb -d ch -cric kho -cookie day -constitu tions -colo strum -centa urs -camp i -arche typal -ap rs -along korn -all Äģh -- .. -ðŁļ ¢ -zu iko -zeen at -you cant -wy le -the er -siri sena -rud der -ro emer -radhikam adan -pre server -pl onk -ol at -oak y -nus rat -ne pad -my all -mu thu -mar chive -lu pins -lin don -ky ra -ksenias olo -kham is -hawaii five -har pur -green side -greatnorth run -gollanc z -fioren tino -dub ga -caro wozniacki -car illo -brexit ers -blizzard of -bird art -bel den -be urs -bar anski -bab ka -b ci -az uki -ani zed -and ani -al kan -ac worth -ac credit -y know -xy litol -wee m -the mahirakhan -t illi -swa thes -s atta -rocky horror -rain ford -ple xi -parksand rec -paedi atrics -mt c -mon ro -moissan ite -list as -kri sta -jac ek -iw ate -it news -iron work -ing team -hima wari -head count -gener ali -g pf -fo kus -de porting -david warner -d pr -cut thecable -comman deered -cen taurus -cc d -candi do -ay p -art market -ah h -turan dot -thi elen -test kitchen -tar ab -sound clash -science march -s ooooooooo -ro mping -resurrec tion -print out -post gres -pere yra -parake ets -nico tero -new releases -mtl moments -medic als -lu issuarez -li pps -ju ggles -jo si -int j -hot ell -grand theft -dur arara -diyarbak ir -digital drawing -dge tt -clean energy -cd ti -cann ula -bull winkle -bu ssell -bu kas -biddul ph -ba cha -b win -av ante -anac mo -all infor -ye tu -wr al -way togo -vir us -trait orous -thyssen krupp -the shield -the hard -tal ot -synago gues -stubborn ness -stou te -smoke screen -sh anth -se ku -sapbusiness one -rei ka -re sus -ratcha thani -ratcha sima -pol twt -op f -oci gars -mini bar -may sville -laundre tte -her ded -h ool -fuji moto -fati ha -entom bed -eagle snation -dissemin ated -cuer po -co jo -clar ington -carbon fiber -blu men -blaen au -beach am -back stabbing -assess ors -ap bs -any ar -ano te -and ino -ail party -ac supdates -ðŁĶ ° -ðŁİī ðŁĺĬ -you sif -under writers -ugand adecides -tur ro -top knot -to ren -stre tto -smi f -showusyour builds -shi vam -sex ed -sensiti vities -semio tics -sand ilands -san lam -qu avo -portu gu -pla ye -pare ido -ound theworld -myo fascial -my yy -mik al -macfad yen -ko chi -kin care -kapo lei -k sports -jag gery -j assim -irraw addy -in os -healthand wellness -golf day -ghan ds -freedom works -fah mi -europe day -errone ously -do jo -cze wska -col linson -ck ing -cimm yt -ceu ticals -ca esa -bu youts -bu ssing -boys bball -bi ber -ban es -ati one -anti hero -aneury sms -alien ating -ðŁĺĶ ðŁĺĶ -ãģ ĭãģ -âij ¡ -zogh bi -v cl -v angelis -unzi pped -under current -thebig bang -tabletop day -sk en -sie bert -se fer -santander uk -sand blasted -salt dean -ru brics -rock show -recruit ment -port chester -planeson thenet -parlo phone -paralle lo -p ade -matte o -madhan karky -kevin o -kend ama -indv seng -hollowcrown fans -ho tair -gros grain -good new -gon o -getinmy belly -ge i -free agency -fair burn -dra gracing -djfresh sa -chroni xx -chad da -can u -c wr -bla ser -all right -ai zen -ac j -abhi yaan -wilder nes -wick low -up minster -trac ers -toron tom -tm koc -t lal -speci e -ske wered -si vi -sab bey -rox anne -r di -pla sen -par ma -moh enjodaro -mikas ounds -liber ates -kry sten -kingsme ad -ke sa -junior doctorsstrike -jin u -il co -ht brunch -hr sa -ho pat -har lock -hain anese -f als -electro phoresis -eic her -ei sha -e week -disappoint ingly -de kal -cour maye -com pra -cloud native -chum my -cam u -calvin ism -bra x -biz on -bee son -bart man -bab is -author isation -aqu an -ador able -ðŁĩ¸ðŁĩ ³ -ìĨ¡ 민íĺ¸ -we ta -waff en -vor on -vi vendi -verte bra -up shur -tuss aud -su hana -sply ce -serial killer -sav sl -ram mer -raj inim -queens landers -mon of -maha bali -m wi -loven orth -liber man -leap ed -lauder hill -ko se -kh long -karen gillan -ish rat -immuno deficiency -im hotep -hed rick -he st -h anny -go res -for culture -fe ets -fab bri -eun woo -ess ler -cru x -co ren -cle land -bon ing -blake griffin -bil ang -bi phobia -barram undi -baram ulla -ash faq -ar ico -al ani -ðŁĺĨ ðŁĺĤ -ðŁįĴ ðŁįĴ -ðŁĮİ ðŁĮį -writ able -wishyouwere here -where to -velt liner -u wo -tan is -swan song -star rr -sn ina -si zer -shor o -sedg ley -sar ai -sa wesome -red fin -pra shant -phil heath -or val -nise koi -mor ath -mit m -mau le -ma um -ly ssa -ludo vico -kha an -kat ec -hun ched -hix son -high wood -ha ddington -food stuffs -em pathic -econom etrics -dr w -curritu ck -cla ssing -ck t -ce tin -car neros -can ts -ca io -bus sey -assemb ler -armad illos -andu jar -ðŁĽ ı -xplo sion -wor dt -west stigers -under painting -th au -telang anacmo -tan n -suk ma -stu bble -spor to -somer ton -skol nick -sh our -sailormoon crystal -que asy -pri mo -pin sent -pickup lucifer -ot te -nationalgri dus -mu haj -moon struck -lange vin -ky umin -kapp ap -jaz i -jan ic -j yr -hu ffy -gg u -friday facts -finger lings -f bp -e ins -de dge -christin am -bor gir -boo om -blake more -black isbeautiful -badas sery -bab aji -b acy -appell ation -ali reza -al wyn -???? ?????? -ðŁįĥ ðŁįĤ -winch combe -wash ou -vez ina -tsing tao -timon ium -thermo electric -sj maas -singularity u -ron calli -rhom bus -ra by -pulmon ary -pre cht -pla smo -over protective -one k -non traditional -ngsop engardens -nest le -medic o -ling e -le baron -kam ay -ip se -hol liston -hick sville -harmon ium -gur nard -doom tree -dh ram -crime stopper -bjer g -b vr -arthro scopy -apar is -antw an -ame ss -ðŁĺŃ ðŁĺį -ãĤĪ ãĤĬ -wil sons -un challenged -thir teen -swat ting -stone age -standwith us -softhe year -social network -sd ca -sav ona -sam en -ru ggles -roc co -rick shaws -recep tionists -reak fast -rad in -r zr -pen i -nascar onnbc -mcge ady -living with -lethal bizzle -last minute -l ch -kew pie -just dance -hi jacks -gre gar -gra fts -fric ke -floren cia -first energy -dd n -cy outh -cy mbi -confi dante -chou dary -cal lista -c low -burg led -bo pp -bill haslam -believe it -am ani -ace vic -éľ ĩ -zeal ander -wh att -uz h -turbo grafx -trailer park -thro ck -thenew school -the av -tasty tuesday -sor olla -sin on -sil ico -si banda -scott sboro -saraswat ichandra -ruff o -ran sacked -ram o -puri sima -psycho tics -pin kie -pier point -pf aff -peter dutton -nucle ic -nov ambb -nico lette -nar o -metro dome -med abad -lagh ari -kol arov -king ham -ki eth -ike bukuro -id olo -get down -figure head -daz a -cros bie -conni ff -con ner -ce urope -brum hippodrome -bj m -bhogle harsha -berry hill -be ba -ang ar -amber rose -afil ms -ðŁĺĤ ðŁĴľ -ðŁĵ ¶ -аР¹ -uri ya -tsu ko -the power -takeover tuesday -seth rich -se wick -sal vulcano -ri vu -re gr -ques nel -qu re -pre mo -power book -polymer ization -poly chrome -pj morton -ouel lette -oklahom an -ok yo -oh su -occu red -nu ages -ni ku -mus yoka -moon roof -mm hg -mc cay -mall a -kre u -ki seki -kate walsh -k pu -implo ding -ib p -fund acion -du laney -dream car -dha an -cru ral -clu edo -cha hiye -butter cups -bun doran -bon go -bet ancourt -athiy ashetty -asin ine -albertope tro -aam n -ðŁĶ ¢ -주ëħ Ħ -wa ad -vilam oura -vege tal -u ag -tao bao -swi sh -shake out -shadowhunters season -sh air -selen afor -sanc tification -s ello -s dot -s bbq -ro ti -ril los -proton mail -program ing -pol len -pla sterer -peak sn -off stage -ny ra -na ima -moor croft -mil lets -mel nyk -maxi mized -marshaw right -ley ard -ler n -le elee -lat rines -jaime camil -jagdish shetty -im ur -im measurably -home show -hallo ff -h tb -go ga -exa directioners -ex omars -ell trust -ei fel -done job -der na -dark ling -chirp chirp -chatham house -call er -brad for -bon nar -ben jy -al tan -abre wing -abduc ting -âĿ Ķ -white space -up son -type cast -trump russi -to ws -theme park -stitch fix -shi i -sat er -register tovote -q lik -pivo tal -o et -multi generational -medic ina -like app -l tte -l ingly -kur ni -ku e -king fisher -jes mond -inver aray -instig ated -in ate -hit achi -har le -ha sson -gou cher -food allergies -expen sively -diamond head -cross wind -commend ations -chri stel -che ikh -chau vet -bun do -big island -ber thed -arthr itic -ardro ssan -ar dian -ad noc -???????? ???????? -ðŁı¿ âĢįâĻĤï¸ı -ðŁ§ ¤ -ðŁ¤¬ ðŁ¤¬ -âĿ¤ï¸ı ðŁijĮ -z hon -z evon -th ound -tend encia -sock ers -so hail -sk river -short falls -shi as -se alion -scab ious -sand gate -richland two -rell eno -rei ko -r rd -nokom is -my motorhead -mul und -mor iyama -monk stown -melaniel bbh -m ander -luc kett -koo per -kin ghorn -je ppe -japan town -hoku to -genevie ve -fun n -full moon -frankiej grande -firstal er -dancing onice -chan ter -brussel sairport -breakfast ofchampions -boli varian -bicon dova -betten court -arthro plasty -ðŁĻĮ ðŁijĮ -ðŁĺĤðŁĺĤðŁĺĤ # -ðŁijĢ ðŁijĢðŁijĢðŁijĢ -ð٦ģ ð٦ģð٦ģ -ç¾ ½ -ze on -z yl -wi ed -valenci ana -val di -u cluelet -tor adio -thra ki -thick en -t sou -sy ru -sun t -solstice publish -shim mery -sha al -se ec -ru les -resurrec ts -plastic surgeon -oye depo -over reaction -oh no -nc beer -mis rule -mic ellar -listening to -line work -lin dsley -lam eness -knight ly -ki yoshi -keep your -impresi on -ignati an -ht punjab -here wego -hand cuff -half back -futuri sts -fay emi -far u -f sg -f no -e mel -e gom -donor schoose -doni zetti -dissapo inted -dau n -crickle wood -cre es -cork airport -con serve -community day -clare more -chur che -cap shaw -bubb awallace -broad head -anne e -aly and -___ ; -âĻ ļ -âĸ ¡ -à¹Ģà¸ Ĺ -yoh ji -xau usd -work top -vol ks -vijay mallya -trend setting -sou ks -sm tx -ske eters -si rr -sa very -re wiring -quil t -prideand prejudice -patriarch ate -official bantams -o wais -nike golf -mumb ait -mo gg -michael myers -mcfly harry -lebo witz -land forms -k mf -harts field -han se -gö te -gri jal -eastere gg -dri shyam -deto fficial -daily inspiration -col lation -cheer fulness -che detofficial -breed love -bie shq -bapti sta -ðŁĻıðŁı¼ âĿ¤ï¸ı -ðŁijĮ ðŁĻĮ -íĻ į -æľ ´ -âĨĵ âĨĵ -world theatreday -vo tar -stragg lers -so yeon -slo ped -skin less -sha hs -se award -restur ant -r ks -plo ad -pau ling -par appa -oung music -no life -ne ston -n sports -mn k -mil ana -me led -marin eland -manchester pride -lund quist -low party -lar kins -lanc sccc -kim woobin -kal itta -k nar -italian ate -in yong -idyll wild -he athle -ha gan -gi one -freck led -fon nbc -fer m -febre ze -excep ting -eufau la -ethiop ians -er dington -domin ika -denbigh shire -de fro -dd d -cre el -cotedazur france -comp chem -char cha -catal ano -camo sun -bu to -bel mondo -assail ant -arthro scopic -ap fel -aali ya -îIJĴîIJĴ îIJĴ -âĶ Ĺ -âĢ¢ # -ಠ¬ -x os -wre x -wig ston -vol endam -ur sery -tru c -that one -th sh -t kt -t dl -sin b -scoun try -sam riegel -s comics -rian johnson -p mn -our way -ou sting -no tw -n ko -montra chet -mo stert -michael franti -mh w -max azria -living the -lind ac -k awa -incentivi ze -he mm -hat er -gi a -free stone -exer ted -eu storm -early music -d hr -cursed child -cross road -conse il -co quette -chill ing -cam brian -bu rien -bring ithome -blou in -biom edicine -be em -bair ns -ash ab -ar yan -anti fascist -and tobago -af acts -îĢ İ -æĻ Ĥ -youth olympics -un scientific -un repentant -uk trichat -tre bles -tinsel town -tear fund -tan ak -su sanc -ste gman -sor teo -sf g -sabo teur -roald dahl -rho den -question oftheday -presump tive -pre eclampsia -pot g -plu mpton -peace ofmind -path letics -naf a -my as -merci an -mc bee -mar ka -ma ira -ly tt -ing b -holy rood -holm gren -gom ocs -evely ne -embaras sing -em plaw -doc cubus -distr acts -cuff link -cour rier -cage theelephant -bro hm -bon sall -bar tz -af tab -af fixed -adel man -ac f -ãģ Ī -é té -yar ds -wolve srl -with style -wing chun -upd f -u ecker -tor menta -te kin -te ale -straigh tedge -star alliance -st century -spy glass -saniti zed -s indi -ros alia -ren ate -raz ek -q st -pu el -no omi -nast iness -mm viverito -mini vans -meso scale -marklevin show -luzer ne -lukash enko -lol cat -lizz i -land schaft -ko th -human oids -hoo poe -guil t -green man -gi ug -gh ly -from today -fra e -fire box -dramati st -dr oner -diy network -cover alls -counsel s -coc co -cardio thoracic -bibli o -arro ba -ann un -amgen toc -af rench -adi pec -Ä ĥ -wo wwww -w ff -vau d -ultra violence -u wt -the grdc -ten shi -tat ak -sunning dale -se et -scar diff -re order -push ing -pit ti -pic colla -pe stering -pal eta -notthefake svp -non human -ndu ja -mis steps -magnifi que -ma sta -light weights -lego set -ke ti -je g -ge dung -gag ement -fert itta -female founders -fal ke -du bo -dir ksen -din kins -de con -coo ties -concu ssed -chang bin -brian mcfadden -bel ford -begon ias -bal ch -an gra -ab log -... ". -ö n -we gman -wawa w -wav ves -u bo -take o -sto cky -son der -so ts -sle n -sky sport -sik ander -sar r -ri ana -pre order -ou p -on ore -om ax -off ramp -oc sb -mira flores -miki moto -ma res -lau rene -land sberg -ku u -ke mble -k les -joelo steen -j cb -i wak -hon o -hog weed -ho reb -hec ate -hammer time -ham pering -gossi ps -for ays -fall er -fai thin -equ ating -do deca -cott le -conom ic -con flu -chim ing -brook shire -bre an -br ani -bio geography -bay u -an zio -ðŁĶµ ðŁĶµ -ðŁı Ĥ -wy te -uuu ut -ut pa -un scr -tro om -titanic belfast -than niversary -ter schelling -sw ang -sur ge -smu dges -sin ton -scal ding -sat guru -sar py -rug ge -pur itans -ou zo -mukil teo -mechanic sburg -mall or -m ø -lim ite -lets make -lari mar -jaz ak -ir uk -init towinit -har tung -ha berman -gm fb -fri as -dysen tery -cat walks -brough ty -boston ian -ben digo -at je -ashken azi -arizon ans -appliqu es -wool ery -witch ery -travi stritt -ther un -the matildas -syracuse crunch -sun life -spl m -south london -sl ac -shur r -sa hs -rush cliffe -ren cy -reali gn -rab ada -r ld -preak ness -pl anta -over growth -mumbai kars -mpo fu -mozam bican -match s -mat ra -le well -kam in -jonathanr knight -j sr -intram urals -impressi onists -go sha -gau d -for u -for gov -fireal arm -fi xx -farmers journal -cu mber -cod fish -ch agu -celebr a -bulldo zers -blackfriday deals -ber shka -as ri -ark ell -ak ie -ad asi -ã ĭ -âĻ¥ ï¸İ -âĢĶ & -yoko suka -wi sps -westh ill -wc pt -vivi ani -vir ga -un days -tad ka -sre eram -squ in -schar gers -re introducing -phlebo tomy -peaksn valleys -pe cked -paid media -or lv -oke mos -nt p -no vic -mr peaksnvalleys -mad ama -liber ators -kam er -juliag illard -j nr -im ts -igh alo -hemorrho ids -ground hopping -go do -ge ely -fromthe field -for today -female filmmakerfriday -embezz ling -duc ato -dor ris -charlton comics -chann elled -british moths -as prey -art prints -adel ta -ìĿ´ ìĬ¹ -à¹Ģภģ -work at -wolf son -we sco -vin h -un cultured -tech y -tam ayo -sonn enberg -snar ling -sma k -se vers -s ads -prish tina -ped ne -patt ymurray -nr x -moon raker -mol an -mend elson -mcgu irk -martin omalley -kwad wo -i um -hor naday -helicop ter -gar an -en ot -discover yof -chin en -cal fire -british gq -brain waves -blue tick -ber ube -bent leigh -be aware -ave iro -are va -an unci -al sen -âľĮ âĿ¤ -x illia -wwe fanart -vigne sh -twy la -the secret -the poke -schi edam -saxophon es -pop sugar -page sen -outsi delands -nu da -nationalhot dogday -naj wa -n sac -music for -met as -lovemy life -london midland -la che -jar amillo -indoctrin ated -ib min -i dream -hellomy nameis -gn om -fur lough -fin kle -fil lu -ely xion -dug ong -do ren -ding ley -desc ents -day one -chateau neuf -charlie sheen -bread fruit -ben havn -bab oxing -ba rea -apol itical -ahu ila -afro pagesen -ad news -çİĭ åĺī -âļ¡ âļ¡ -اÙĦÙĦ Ùĩ -womend eliver -wis ma -v ro -us and -uk homeoffice -trinidad andtobago -tony stark -sweat y -stay healthy -sor chestra -smo thering -rober te -pra veen -poo m -pocaly ptic -obli ging -neg ati -na hs -n mc -man ville -ma zie -longlivelong mire -leg i -le ite -k hol -jun ker -joh anne -ja vert -j kr -inte c -hir on -heyn ckes -her mosa -hair goals -h mann -gaw ande -famil ly -fai za -dental implants -de haan -cat to -cas k -brock hampton -boon dock -as sive -arc i -aguil as -ðŁı´ ðŁı´ -åľ° éľĩ -yokai watch -wer chter -vil lette -va as -ubi quity -tor in -tol ly -stlouis rams -spo elstra -sn fonnbc -sco ggin -rahe ja -phenomen ology -ph reno -pau ley -nb ach -nati vely -napp y -mun g -major ities -lin ic -ka al -jordin sparks -gro ep -god head -fo ye -flavon oids -extro vert -dal ymount -com une -co hiba -bur sas -biz jet -bar maid -ar dan -amand as -aban ks -ðŁ¤ Ľ -âĺ ī -ਠ® -wi fi -vin tner -symph onia -sv su -stadium series -shash tag -recuper ate -ran jith -pe son -nun cio -neck wear -msport ltd -month ly -mont calm -mk tg -melo y -master softhe -mar gulies -mam noon -le bar -kro m -just jared -jessic ac -im pairs -im ited -i we -ho es -hi da -gu th -gott ago -fan sclub -e stancia -do olin -dcre birth -dash t -cou plings -compac ts -cagatayulu soyy -caesa rea -bootle gger -bar rington -al ak -å® ĺ -à´ ² -Î ³ -ya el -wi bc -wheel of -web tv -wang ari -wall en -uni onize -ther ise -the kitchen -swel come -stra dale -shannonr watts -sel anne -scap ular -san y -sa kic -ry dal -ru mped -pe mba -origin ation -ok er -mo til -mccaf ferty -max mara -mathe wson -li ken -lagun e -indiec ade -high bridge -hahah hahaha -hab toor -glass works -georgehw bush -fe ud -ez ine -emm erich -em mental -econ et -e og -dy ffr -du per -dissip ating -conversation edu -comm ittal -circu lator -bi sher -barcel o -bad azz -ay un -arm chairs -and on -ah luwalia -à¸ Ł -yd ney -whe eze -water lo -vi xen -vi are -ver ment -us oftball -un proven -u stad -tro xell -thank sobama -ster io -senior day -sal ir -rev amps -re married -re apply -pen umbra -pedan tic -oo sh -ok no -o gres -nz lv -no ch -newbury racing -nep sac -music ares -mo efcc -me ows -love grove -lavo ie -kevin bacon -jaco bus -j aki -infl ationary -hoo g -heg seth -gulben kian -fraser burgh -enrol lees -endo vascular -disc loses -coss acks -conju gate -comple at -call ender -broc kie -br ora -biolumin escence -belle fonte -beat s -bar sha -ax schat -atho lic -ap lan -amy acker -wi politics -wann ables -visit or -u shi -tor rey -ti fully -the shining -taxider mist -sw en -str ymon -sth attweet -rush hour -rh b -rebu ked -real betis -potat oe -phil us -petul ant -pe ten -pap oose -mon aro -mo sle -ming na -lei den -lec tro -leave your -kyan ite -kre t -k cra -jls official -inordin ate -in can -i die -huguen ot -horn castle -gluten free -fore go -emerald citycon -desecr ated -deadby daylight -danny devito -cu ero -coin marketcap -cavern ous -c fi -buenas noches -behavior aleconomics -ate am -at rip -adjudic ation -aby ssal -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ -ðŁĴħ ðŁı¾ -à® ² -world pressfreedomday -wheel don -water lily -v db -ul t -u am -sin ha -shah naz -scu ffed -scu be -sac ro -rol la -recon ciled -ran noch -pl ong -no joke -no bbs -muzaffar nagar -multilingu alism -lor ber -kis son -kill shot -jo les -insu la -hondar acing -hel lion -he vc -gri e -gracie bjj -glbl ct -flaming lips -en f -el mi -disneysm mc -craw ly -cost liest -cave men -car pi -bon ar -bal ad -ash trays -ar mm -a hia -ðŁĴŠ⾨ -ðŁ¤· âĢįâĻĢï¸ı -íĥľ 민 -ãĥ ¾ -yesu das -x sw -wor rier -vo kes -vi ano -veronic as -ve ered -tr anc -tl j -ti bor -ten i -tatt n -sober look -simon pagenaud -shin igami -sei ji -s bo -ren na -palak muchhal -mu cos -mit nick -misi denti -meta verse -ma zen -kil ner -james joyce -hol ding -hik vision -go bs -garh wal -fanta stica -e za -du lac -der mic -dan dies -conju gated -cil ia -c team -bri ssett -bf n -baw den -aim less -ðŁĺ ¦ -âĺķ âĺķ -wap si -visi th -un ironically -teach foramerica -tan ey -spring brook -showand sell -show up -scra ft -ri mac -rep tile -ram ires -radi or -pure foy -pal ong -oke hampton -ne cking -mun t -milla jovovich -mc millen -malaysi atru -lu ch -lin ker -ld b -kon trol -jame sh -info graph -infinit um -ib ers -high brow -hetero chromia -he th -grant land -gra il -flat bush -fl v -edge ley -dee wane -dan ko -cr anny -comi ket -bur rs -brum mies -b uni -air way -a press -ãĤ Ĩ -win stanley -vuj icic -vote the -vali um -v dot -un forced -tra bant -tony kanaan -time shighered -the beat -sau ton -saravan an -sarah palin -ribe ira -rhi anna -per rine -party hard -paragli der -olympic games -nas er -mckel vey -m cau -kidnapp ings -khali faof -ke gv -iso des -home ent -hal ber -great job -g cp -fresh food -dom enech -curren taffairs -cra g -cor lando -butter beer -boat sthattweet -bo wn -bbc devon -bal dur -bacchan al -actu aries -ðŁ¤Ł ðŁı» -wi kia -ver dean -un cf -ty dillon -todayi learned -teu tonic -te tus -speed ers -sou ter -soon young -shah bag -sd f -sauce do -psy ang -pri y -pote et -pheno typic -phar os -par khill -osten sibly -olin ari -ne tw -ne mi -mother of -miq balkhan -mill ay -may on -matti son -masa k -lu ss -le ci -ky la -kor man -katamarayu du -j me -glu teus -ge ylang -fitness addict -fish y -dro poff -devi ants -convolu tional -chrisy oungmusic -cat ra -carbon ation -bou ghs -beat in -bar to -b pe -as chool -aqui fers -am mons -aker r -aig ner -afri forum -ad ame -ab dus -ðŁĽ ¡ -ðŁijı @ -ìŀ Ħ -ëį°ìĿ´ ìĭĿìĬ¤ -y alla -wicke duk -we itz -u pe -tren ds -trans liter -trans am -tr boxing -theo dore -tamar indo -si def -se lek -sch ä -ra st -pot tawat -plun dered -ni wa -nap les -my na -man child -kaiser chiefs -j de -irishmusic party -invisi bles -inqui red -imbe ciles -hor ace -havas u -fever tree -fe urope -f ca -ek k -cint as -cgc comics -cat elyn -car care -bun crana -birth control -bell wether -arn prior -ðŁļ IJ -ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ -ãĥīãĥĥãĥĪ çµµ -âĢĵ # -à² Ł -{ { -worldstar hiphop -water slide -tz ler -tur us -tre ll -tommy robinson -tech jobs -ste phie -so wer -sar the -ren tice -real deal -pugli ese -our town -nu ern -novel as -nick toons -national zoo -mro lym -mel ding -mathi eson -lam berts -killer mike -kend ell -kate spadeny -indone sian -iale gis -hillar ys -ghol m -fichtel berg -dou gan -d hok -cro wing -con oce -com y -clondal kin -carav elle -cam pion -buzz es -bur slem -bra wny -bn m -barcell ona -appen dectomy -af ranc -ac chi -! ðŁ¤Ĺ -zooey deschanel -vintage showandsell -valent ini -turno ff -the x -stren ght -so har -sankran thi -ru iser -rober tb -quar ks -promp tattn -ponti ff -open suse -mtv base -mobi kwik -misdemean ors -marcu sle -magne tics -lovin leeds -kup wara -knife point -ke un -john l -it ay -inta wak -instig ating -ha bb -gray ish -geme ente -ge zi -gar onne -football index -fe is -fal es -evel ina -divo ire -dissu ade -cartoon ish -carry all -blame less -bigsky fb -bal intawak -an in -achak zai -accumul ates -( Ëĺ -âĢĵ > -³ ´ -yng wie -weare portadelaide -wat ashi -w to -w ka -victi mization -un steady -tri st -te gu -t the -sun ing -sports net -spell check -six teen -po do -mu ta -moz army -mar ta -malaysiatru ly -lon dis -infor me -hog sme -hi bbs -fisher mans -fid ler -estre la -do ee -d ss -d mca -cu l -con gen -causewere guys -camer amen -bun go -bmar czewska -blair gowrie -bio div -bett or -asth matic -am ru -aj ade -ag bon -abrew ster -: (" -ðŁij ĸ -å® ĩ -اÙĦجز ائر -win ny -v pg -v lei -up en -tu babu -track day -thierry henry -temp ts -tath lete -sta veley -sel kie -sc ampton -s berry -reyn aldo -recu r -pundit ry -pre loaded -pis cine -per gamon -par ada -oni verse -ne ame -mom ma -mc lean -matrimon io -ma spalomas -letit snow -ke ady -i is -hri shi -ho axes -henri ette -head pieces -gun ne -green house -glen cairn -gior nata -extermin ated -exi ste -econom ia -dja fro -dav ichi -cup ar -clinte astwood -cho ti -bla is -bethe match -ba hati -al thy -@ @ -ðŁĴģ ðŁĺĤ -wl m -twi sta -trul li -tra inst -tali tha -t df -si bo -seaf oo -se j -schre ck -sal dan -ren ge -re tren -r nn -r hul -r alli -prayfor boston -pp ey -pop tarts -p bf -ouse burn -of truth -no homo -night side -n wh -mor to -mor gs -mari us -lager tha -kick z -ki g -kal len -ju len -jo zy -hur lingham -huda beauty -he ter -hardy brand -gab aldon -fill in -fe de -encephal opathy -door dash -defam ing -cr ven -cor una -colt snation -co qui -away day -andrew gillum -alderleye dge -ak r -= >> -* ____ -âĮ Ľ -à¸Ńภ° -vol ve -to read -ti po -termin a -tau r -stan tec -smi ther -sar ic -salv aging -pre biotic -pim lic -perth wildcats -ow an -on evoice -old boy -oak tree -n gar -metr onomy -me sis -mar ken -malaysiatruly asia -malaysi agp -loom pa -leg er -laur in -land in -kan ak -isi dore -ische mia -induc ts -in italy -i mec -grun berg -exordi umin -cy steine -cra sher -clut ched -cho wing -bran ston -bat aille -bal main -aw in -asce tic -art scouncil -aho k -adam sandler -ðŁĹ » -ze et -yu ca -way nes -ver onese -unequi vocal -to stad -the middle -ter rel -taka ful -supp ing -sta f -st fx -sm acc -selfdriving cars -revolu cion -pga of -nf caorg -neu trinos -n gun -mor is -maz embe -mall ick -ma aj -lu tes -lovelan sing -li pol -lear ts -l hu -kodi aks -ko wicz -kit tery -kill iney -kam mer -josi ah -home schooled -hoka oneone -hm fc -ha bak -gy asi -gri bble -gen na -eter na -eller slie -disney jobs -dan slott -cu ar -counter strike -compo ser -cle re -cetace an -bag piper -bacteri opha -ðŁĺ©ðŁĺ© ðŁĺ©ðŁĺ© -y hs -woo h -will man -up close -tele hit -swi jk -subscri ption -sl ang -salt and -s bakery -real kurtangle -qual trics -proce so -poly thene -obe sity -nom an -nis sin -nal ini -n sn -n acs -muh ney -morning mika -min gh -mi thing -math schat -madel aine -ma pl -louis burg -le vu -ke by -jo ely -ingle side -indye leven -healthy skin -gu ises -gofor it -go forth -fren ds -forfe ited -epidemi ological -effe ct -dayafter art -dag estan -d to -d fa -cu mp -cri stin -con founding -co che -cho cl -celeb juice -ap m -anachron ism -aar yan -ðŁIJ¾ # -zar ya -warrior wednesday -vor m -vir ate -ul zzang -stol lery -snor ted -sin gel -sar ath -sach dev -pi az -oth ate -new sam -mr j -litt len -legend a -leelan au -le mos -last minute -jig saw -in le -hunter x -gh al -flirt atious -egg shells -deion sanders -dedic ated -dece m -de ce -cor no -chit rang -carol l -capit ale -bridge man -blan che -bi jan -back inthe -aro hit -append age -annu alized -amen hotep -usl pdl -un y -un remarkable -un dra -tun ku -tra den -thor nes -ther hino -the hobbit -stemc ell -standardi ze -so dom -shatter proof -sen mikelee -savannah guthrie -saip alla -royal marines -prem giam -pastic he -ove reem -outdoor life -out classed -nu ts -mün ster -mike o -marsu pi -li bri -l sv -l aci -kin sman -kegv raja -kabb fox -jordan b -il r -humph rey -gui led -guer rilla -green street -free ware -fl inn -exasper ated -esp en -equ animity -endo fan -dru gging -dialec tical -debby ryan -cu au -cro martie -corri da -con junto -colloqui al -co king -cam inos -calvinand hobbes -c mbs -bu loh -black watch -badger cull -as syria -apho tography -ana ïs -an ami -aerom exico -ðŁĶ Ł -⼠°ï¸ı -x em -vish wanath -um r -thenext web -st roo -smol en -sa ins -ra usch -pre ck -ple ine -p tera -p ko -over tures -other world -ol ding -no strum -natur alistic -nan ook -miseric ordia -men achem -ken go -kanchan aburi -k opin -hug day -hercu lane -har boring -gar p -dg d -dab ur -cro me -cre ve -complex ed -cabernet sauvignon -bel gie -ash vik -amorph is -alien covenant -ain tre -adjust ers -acapp ella -ac cross -z es -ys mith -yor u -yaw ns -vol leys -vill ard -unab omber -to stones -stau stell -sar daar -saq ib -sa isd -ro vers -real johngreen -raff led -premgiam aren -per ish -nu un -me hak -mccon ville -latino america -lah or -kag gle -jha sanjay -j lg -inept itude -hu ch -hooligan ism -hal les -gur nee -grac es -flo ssie -fer rum -feliz miercoles -elk ton -elabor ates -dr ale -cycle chat -cri mped -cha rente -ch add -celi bacy -biop hilia -band hu -adi r -acou stically -íĿ ¬ -virtu osity -too p -spati ally -showr unners -scree ches -resto rer -ralph northam -pit cairn -pend a -paramount pics -pa cham -our an -ou tran -monu mento -maken a -mad as -lou dobbs -loc kie -li pp -l bj -k li -howtoge taway -group chat -go bo -girl meetsworld -enh of -duches ne -donthe sash -devere aux -death row -dan ske -collin a -chin edu -cha g -cab inte -blit zen -be as -bar by -auto blog -ap su -ant unes -an chester -amy lo -al esis -ãĢij # -ع ÙĬ -yard bird -y land -wil ke -wat ty -w has -un cw -too bin -tema sek -sum thin -strathro y -sto wer -sst pierre -spiritu alism -sile sia -shower head -se st -san ghis -rod ger -rd weeksary -r tv -r fe -pon do -pin yin -phari sees -pen er -nex star -my girl -musco vy -mune er -mich keegan -mcly nd -mag elang -la gasse -kw p -kis ner -josh ramsay -ho pl -herculane um -he mel -flick er -ene al -elli psis -e mag -dy sauton -death squad -deal sweek -dead pan -darwin day -craw fords -char ro -ch ali -center point -bun gy -bomb squad -beach es -be efs -ale man -adi b -yu ca -youranon news -yaaa as -watu kee -wal li -u ge -therain bow -the wall -stu die -snu gg -se kiro -real world -ray ong -photograph er -mock tail -minu et -memori alize -me hl -mbom bela -m ella -log ins -le ka -kotobu kiya -kor u -hu on -homeand familytv -glo ssed -gh ul -gabriel macht -g was -free dia -ee u -disney studios -de res -cu star -columbi ana -co iff -cc cp -car pa -c bot -bri ze -al ks -abi erto -ab baye -, + -âĺº ~ -ymoun tain -wee tz -we taski -water tower -under pinned -un belief -tvac tor -te q -stipp ling -stargat esg -spac ek -selenafor mmva -se van -s gaa -s down -s baby -rie der -redd ing -red brick -real alicecooper -re tweeter -re ti -rain tree -r mm -por ker -pl zen -pl undering -phil ander -peckin pah -northan ts -nar ula -n ise -mic f -medit ates -mc mullan -mark os -honey man -hom ed -he eler -girl ssoccer -g ws -f ws -e op -drac ut -dog walker -del gad -cy pher -chha bra -black art -bi ety -bhagav adgita -beu tiful -ber ks -bbcradi olondon -av ori -alldog smatter -air gun -address able -wells fargo -wear your -w mg -ve ux -vamp iro -tu loy -today skid -sw illy -shadow man -reve al -real deal -r wen -preck winkle -pink ney -philipp i -oak hurst -native american -mis ation -mannar ino -mal ting -lak hani -ki mora -ken ia -ic asa -herne bay -hercu lean -guzz ling -george sstpierre -fron teras -fluori dation -exc ercise -eman ci -down trodden -do tter -cor ax -chry sler -cat fight -bot te -bo in -berg dor -barbe cues -anime girl -an ind -amak hosi -al exc -air tricity -ðŁĹ Ŀ -ðŁĴ« ðŁĴ« -çĻº å£ -âĻª âĻ« -yl icious -wf cofficial -warmb lood -tom felton -tokyo ghoul -test drive -steel work -sp ahn -skib bere -sad ako -s ldn -re selling -rawten stall -r pr -pi leggi -panet tiere -ox on -nat as -n ppa -mont lake -money laundering -ml le -marath i -last week -kent st -jer ald -intelli vision -int p -ha dou -grat itude -frie za -dis member -del una -cp j -coraz ón -con fine -chur a -charli ze -cha uns -centre point -broad city -bou let -bo al -bill fish -beath ard -be dok -av ella -as sia -app ice -ail intelligence -ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį -ðŁĺĬ ðŁĺī -ðŁĵ ¥ -âĨ IJ -whoo sh -wan tt -w abbey -vom its -us band -turnar ound -tor que -sz cz -sur geon -sop inion -sam stag -sali ba -sal ary -play ground -personal growth -ov als -or leg -on no -officin alis -oc varsity -mul key -muff lerman -mapu a -le baran -lamin ator -knight fdn -ki bo -k out -k ci -iow an -inebri ated -id or -ic emen -i dia -han kar -hamidmir pak -h ran -gulf coast -graham mctavish -gr acy -gover ns -fiannaf ailparty -exy nos -esp era -elit ism -dump sters -deterior ates -cu trone -con ciliation -chor uses -chin ooks -belit ung -b wh -as ong -am dram -ì°¬ ìĹ´ -çĮ « -âĢ ı -zou is -wylde audio -w rugby -ta ina -t db -snow melt -si sko -si ris -sap in -rous se -ra si -pv d -psyched elia -pretty inpink -power shift -pol ing -ou o -oran je -one il -o ving -o gc -nieu w -new sar -never land -n walest -my bag -mv no -mur tala -muj ica -mc s -lor aine -jam nagar -j rt -image oftheday -i wk -hol gor -gt live -for climate -food pic -fik re -enda ids -elli pse -di zer -da aaaa -civil iz -cherry wood -bu ggin -brick er -boy ne -bil awal -bibl ical -bi fida -bar and -bant ay -artific ailintelligence -an ser -ah watukee -aco ach -âĻ¥ âĻ¡âĻ¥ -wedne sbury -verment ino -us rex -ther ford -ter ce -te ssie -table aux -sub contractors -sty e -six sigma -side men -sand ro -ri scoll -re ddy -raider pride -psych ometric -pro life -pal as -p sies -om are -naf ld -mis rata -mar kie -ling on -lim one -len gua -kai ba -jon axx -jo te -hr f -har tz -gra eber -go jays -go ad -ge ce -fre cce -flex or -ed inger -dot net -community radio -climat es -braw ley -boy les -boo kish -bloody mary -best memories -barnesand noble -back space -arte per -ar cia -alleg orical -! âģ£ -âĶ Ľ -اÙĦ Ø® -uof maryland -un filled -u ti -tom os -thy ne -thisi stexas -thierry neuville -ta kar -star hub -sse ur -spe ers -sim cha -shirt dress -se guro -sch ü -scar ily -ruther ford -ru v -ru skin -redar rows -re considered -oy i -onof re -oh chr -number one -nor ah -ne esh -muse et -moder no -mo ku -meet your -mat tg -ma bino -lu can -lo tro -ks worth -khalifaof islam -kendra scott -kan ae -jalli an -ik os -gym rat -flipit blue -flip flops -dur amax -drop kick -di op -david m -courtney act -cir ro -churra sco -chel sie -cambo gia -cam bus -calla o -ayush mann -apost le -ami k -am ini -air berlin -a ino -ðŁĺī ðŁĺĬ -ðŁIJ ¹ -ãģ ł -zar ina -yeeye e -yarra ville -x tian -the shilpashetty -stitch ers -six word -sco ve -sat ria -ri ek -r tu -private er -pl dr -perry ville -particul ars -one stop -no sing -miscell any -mir pur -mary lou -mart ÃŃn -mar azion -man resa -len awee -le moore -kee bler -ka is -im mo -home going -h ni -h lin -ge ma -ga seous -for dracing -ear wax -diadel osmuertos -demo tion -cri st -canadi anti -can de -cade my -burgl arized -bun ge -brock ovich -british art -bed wetting -bas o -am ater -ace hotel -aber feldy -? ": -ðŁıĥ ðŁı» -íĺ ľ -ìļ° ì§Ħ -ë± ħ -à¸ĩ à¸ĩ -yr sonair -wood berry -wob bling -weih nach -vik tori -up shot -ulcer ative -ty win -tam ithas -tamithas kov -stat ement -sta i -soul jah -shirley setia -shaw nigan -ser f -sac re -ro dri -pu tz -pu jo -press day -ph n -passive income -oura bly -omnis cient -oklahom ans -ok ri -neighbor ly -naf p -manikar nika -k gv -in vi -hell om -grat uit -fu shi -for health -extr amar -eph rata -elvis costello -eic hen -e mac -dolce vita -di eu -devol ve -d ho -d fp -car maker -brittany ferries -blon dy -ax emen -at ore -ad moni -ac q -a festival -ðŁħ ± -we ghe -val rhona -urqu ell -thre ec -the tide -siyahbey aza -shep sut -shan kumar -scen a -rwand ans -rug ge -ram butan -ph ouse -perpetu ates -o snes -no tone -nic ke -nation sleague -mid leton -michael sheen -li w -le ghorn -keep smiling -international mensday -ic entennial -i view -hon daci -h selive -green week -fal ana -energe tics -dum plin -dubga aofficial -dprin tindustry -del aine -davuto glu -cul bertson -cre vice -commu ter -colombi ais -citrix synergy -chut neys -chin as -cam girls -ca za -burden some -bu ga -biz humanrights -bhav na -are do -annab elle -aldu bin -accommod ated -wor ts -wh sv -vit tor -under lay -ta fel -son ys -smoke stack -sl á -s met -red den -re appears -q ila -pg ms -penguin india -park theatre -or dain -o ses -nic hi -musik fest -music man -meal sonwheels -mc gau -lun sford -li zumab -lan k -kw abena -known st -khal a -jamess murray -hol as -geor gia -ff ar -fer moy -femin in -en loe -ecu ador -dr ilon -disobe dient -disen chanted -dat z -cla pham -chron os -ca sei -britt an -book man -bick er -barbecu ing -az arian -artof m -apple dore -an net -an cia -ðŁĻı @ -ðŁį ¨ -ze char -wer dum -voice actor -vo lio -ve ss -the shark -tam au -sy mon -sonic drivein -shu d -s ganguly -ro tich -ro hin -rejec tions -reco ast -rebel ution -ram im -qu d -orange isthenewblack -nesqu ik -my freec -muhar raq -mr an -molybden um -men inas -media eval -mcken ney -lu iza -labor ious -kon nect -kaf r -jer u -j mb -hob bie -glen finnan -gas kins -fra gon -film school -fight scancer -di ste -con dense -burgo yne -am ach -aggre ssiveness -ðŁĴ£ ðŁĴ¥ -ðŁİ¥ ðŁİ¥ -è § -àŃ į -é lé -za f -youn ge -yo kota -war fighter -wa if -toron tonians -ti gh -the in -the avengers -termin ator -tata steel -t shep -t gh -sunid hic -simon celli -seri eb -saniti ze -san ogo -sal adin -saf ra -rece sses -r lp -pusci fer -pla ud -pan za -pan cho -offici ant -o auth -ny ama -n sr -mour nes -mil lau -mid or -miami beach -lumin ato -let arte -la pid -kre ss -iu u -ing and -g wi -flint lock -fair clough -el mbridge -dress code -domic ile -cros stalk -cooper hewitt -commissi oner -ch ah -care home -bu ggs -ay ye -ao ii -alyn ch -ðŁĮŁðŁĮŁ ðŁĮŁðŁĮŁ -ver bal -unexpec ted -tsub aki -thesun newspaper -tel lez -rdra jaofficial -rafi eh -pu er -pop sci -phe tch -personal training -p square -ox ic -over ruled -oregon coast -nine ws -national drink -mr silver -michael mas -mer ve -mat thai -mar am -machar ia -lr sd -l its -kal kan -k ch -ju eve -in kenya -hor sforth -herbi vores -har p -happen stance -han ke -fatboy slim -eus kadi -ell man -dv am -doyou even -der ren -compar tir -bulldo zed -bray don -boozy chef -bet je -ben avides -ben atia -bb ma -artofm mignola -art forum -ap les -and rich -alum n -aln mouth -ðŁĺ»ðŁĺ» ðŁĺ»ðŁĺ» -á¹ĩ a -à° ¯ -wul lie -world diabetesday -wicket keeper -unbe knownst -un ningham -track suits -sey doux -sco ff -sauchie hall -sang amon -rv hs -ridge mont -qc poli -power gen -ottaw acity -n are -mun sters -movember uk -moore field -million s -mess a -man power -m ney -ler ch -lal upra -l ere -krun g -ken i -jae beom -inf el -imp ound -h ka -go yard -go ble -gid dish -fe do -eu u -doo ku -donmar warehouse -dilip kumar -de ek -dah lin -cur tailed -cro ak -bur da -bor ah -aston martin -ard is -ar sa -am manford -abscbn sports -aalt ouniversity -? "" -ðŁĺģ ðŁĻĮ -ç¦ ı -ت ÙĪ -zi ff -ye es -water front -visi bilities -ux e -universal ity -twitch raid -tur kic -tro o -then hs -the player -tele ported -swad dling -stal kr -slow fashion -seach ange -sas usa -rub bery -remodel s -oy in -o zo -ne ee -n ght -lin dar -le ath -kal le -hert ford -hb m -gtasnap matic -fo shan -e bird -ca ius -ca haba -buck ley -bha vi -beef ing -b cel -ascen e -arcan gel -akade mie -afar mer -ðŁ¥Ĥ ðŁį¾ -âĺĤ ï¸ı -zi huat -x online -tor in -ti mus -synthe tics -splash down -sensiti ve -sd su -sau ti -satur ate -red die -reall ys -rail analysis -pyr mont -por po -plo o -pi ent -personal branding -parksandrec nbc -out lasted -or inda -myo wn -mi gori -mac lean -lun tz -lu bitsch -lon gest -life drawing -key shi -jax son -infuri ated -imp son -iate fl -har oo -feed your -ev ades -enor man -ef itness -ee z -dele m -crypto zoology -bru schi -bew ley -ando ver -abra sives -ðŁIJ Ľ -zo wie -yam mouni -want agh -trans itive -tiam owry -thsh birmingham -the os -the bigh -t dor -t cha -switch backs -ster lite -star land -so bat -sel i -se ws -s deli -ree kie -pre maturity -pre di -phi phi -oak ton -nit to -mu das -miami hurricanes -mani stee -lud ington -lethar gy -ki th -k ariz -ja ani -inthe mix -insu lators -il ter -her balism -ham bre -gü n -got game -ge di -gar rus -ff n -ed berg -du hawks -dark star -collin sworth -coates ville -cast iron -carcino gens -boo tham -augu s -ati zation -arson ists -amon tes -ì± Ħ -x el -v un -v enga -uk cyclechat -tape worm -synap ses -sul ky -sho ku -ser ang -sel ite -scu ttle -saf die -ru sev -qu anta -pan arin -outa ou -om anc -oce anc -nigeri atoday -nigeriatoday ng -neutr alized -muscle fooduk -mo halla -ming led -metallur gical -lake ontario -l jung -kun sth -kay lin -jo inte -insu bordin -insi gh -health benefits -hau pp -h mf -fox worthy -fe ingold -far mm -ex elon -english men -el frid -ef sa -de do -d ke -co sy -boo boo -belleri ve -belk nap -be ton -ard beg -air canad -! âĢĶ -âļ¡âļ¡ âļ¡ -z acu -womenin politics -wi i -volo dy -ti rico -teha chapi -tatlitu g -suppo ses -shar na -rob ford -ps one -pass iton -natural sciences -naing golan -nad al -mont ford -michael s -mer kin -luci e -liber allogic -ho ku -head banging -fur tick -fu h -french men -fam osos -expropri ation -dont stop -develop er -cu illin -cr ated -caval era -c ne -buzz tv -bul ld -bul at -bron cho -beelze bub -assy nt -american ism -ak iz -ðŁĶ¥ðŁĶ¥ ðŁĶ¥# -ðŁİĪ @ -ãĥī ãĥ© -ze bulon -z quez -wildcat pride -wee py -waste d -uniof leicester -tric ities -thu gger -sy lt -sto pe -sp dx -snar ls -sky la -shan ds -seab ourn -school mate -rt gs -ri ans -re invents -rat z -pon tel -pho e -out patients -onit suka -new comicbookday -natur ale -muse odel -mck ale -max ey -marmel yr -ld sb -lal isa -kodai kanal -jan an -irwin dale -ili b -ianh watkins -har deep -gon z -fy re -f mo -drach m -do com -day yyy -cul p -con o -co founders -buffal onews -bu bonic -bot b -be co -baske tt -az aria -authentic ate -aquat int -apost asy -aa ahhhh -ðŁĻı ðŁĴķ -zihuat anejo -youn ge -y ce -un contested -to pla -ti et -teac ake -tar ter -tan ush -swee ts -sustain ability -ste y -sense wrds -satyam ev -roman tica -ri sso -qu ip -patux ent -paolo zzi -pang olins -o ley -north lands -new start -new sand -mer ingues -man gu -liv ability -lab view -krzysz tof -kam ath -ic is -hu izen -hat shepsut -harvardh bs -granul ated -goddam mit -forzaf errari -es guerra -dun kley -dre port -drag net -do xa -dissec ts -de activating -dat es -currumb in -cel com -cau sey -cat l -buck skin -broad leaf -br aley -bis mark -bet tors -bel ge -ass wednesday -am bra -akin wun -zee shan -yu uu -wk ly -widesp read -wether sfield -wash caps -w anga -table spoons -sinab ung -si rt -si fter -se tar -se sc -remedi ed -rajinim urugan -pri ssy -preakness stakes -phu le -per du -pavili on -organic skincare -occit anie -newsmel bourne -new bern -national icecreamday -mor daunt -min ouette -mar uk -liber ation -la wny -kis co -kassi dy -intra ub -hyder abadi -gwr help -fer land -e dir -die gom -cyto logy -cru den -chrisho y -cheeri o -chann on -carpe tb -cal vi -brother ton -brooks beau -brahim çelikkol -bour ton -bo gies -au fc -areyou ready -am bala -al ker -ai ea -aa ha -ðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬ ðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬðŁĺĬ -ðŁĴŀ ðŁĴķ -á¶ ¦ -е в -zam pa -wal sham -transgre ssion -su unto -staphylo coccus -sian network -showtim ena -shil o -sharec ro -shad ab -sekol ah -ru bes -q fa -pyram idal -primiti vo -pe kanbaru -par ok -no gueira -nh rc -nbc ct -me quon -lac u -la j -k srtc -in thenews -in aug -im potence -he us -grou ting -gri ot -goto ireland -gm police -fish kill -does it -di franco -date in -cu arto -copp ice -chen e -cas si -caper naum -barric hello -bally money -assi an -adam carolla -abun da -abe di -ï¸ı . -zesti ria -we yer -w sis -tom cats -todayskid swillneverknow -tex perience -te ale -tat aki -sna han -ser on -se ck -scot trade -por twood -poe tical -peck ish -nikol aus -mol la -minnesotal ynx -mad ding -lon ge -lale ttan -ki yo -kh ich -k nur -i ker -hun ni -hither to -hay ate -gen san -f co -employ able -dump y -dois neau -digit ising -di sko -cu bo -crazy ex -cnn politics -city am -cato institute -bell town -bake shop -bag dad -agen esis -?? !? -âı © -zarathu stra -woo ley -wit ched -ven ant -track oftheday -team trump -su h -sp aren -shashtag party -shang ela -sha stra -seoul day -seac ole -sas o -retri ev -real taeyang -re ya -race hub -od st -new grange -misi ones -mb ari -liqui de -lee ch -l tt -ky l -k rol -journey tomars -it raffic -inver ts -he eee -har lan -grey lag -gi ggle -gan su -for g -finu cane -ep ath -ec ach -cymra eg -crai gie -cess ories -cell cellpress -cam shaft -c wa -bren twood -bound by -bosc astle -boo tiful -archive shashtagparty -and ddd -ah man -admini sters -ac ero -ðŁijİ ðŁı» -åį ĥ -á¹ Ľ -zhang ji -z rh -woo seok -wake field -w gu -vikramad itya -v afa -thereal mike -the mark -tan guy -sug anda -sleep walker -sleep inthe -si bu -sh ool -separ ker -saf t -rock ne -rin aldo -popein philly -paraly ze -or ms -oad by -no ver -net as -nan ami -mi do -mar as -m trs -love box -light the -li mav -jap e -jam arcus -in fol -i ad -hot springs -honey crisp -heroes ofthe -fen o -dian aross -den zil -daysof horror -cloison ne -bul well -bar bet -at sc -amazing thailand -? !!? -ðŁı´âĢį âĺłï¸ı -zon der -we ren -v ct -turke stan -tree oflife -tr ate -the book -ter cer -super con -sho toftheday -seung yeon -sen nett -sel ton -ronces valles -rac kets -ra gusa -pun ia -perpetu ated -orino co -nor seman -na jee -masa ka -marian keyes -mar un -lu ff -len ght -la valle -la hor -l hhh -kstate fb -kid sc -khur rana -kais ers -k hus -joseph ine -iam jamiefoxx -gold awards -fu miya -flyn t -fil mic -face plate -en ames -dogsof twittter -cre sted -coryn rdr -con well -car ros -capp ello -c xc -buffalo ve -bri ggan -bow ditch -body kit -bentley motors -bee cham -barne ys -bah ri -arch top -aami park -ภĵ -w imp -vo tos -sven sson -sub atomic -stry dom -star lets -siyahbeyaza ÅŁk -simpson ville -shra wal -sab onis -robu sto -poli zzi -phantas mag -peru zzi -mat or -mat as -m out -kempton parkrace -kas ur -imperson ators -ic em -green stone -girl code -fur ze -f wp -episcop alian -edge combe -di kanu -dh f -dalla ssmith -cpt traffic -ci als -cen dol -bran ham -bbc lookeast -balay ya -ar get -am et -ag old -ðŁĴĽðŁĴĽ ðŁĴĽðŁĴĽ -íİ ľ -yt creators -yo gate -women mw -whin ney -vo los -val buena -up tight -twell man -tom on -t sky -surrey cricket -sun ri -stret chers -standupto cancer -sopho cles -sli mane -sl unch -sketch card -shri ram -sewick ley -rail fan -pur u -pc masterrace -ou pacademic -ottum wa -mississi ppi -meso zoic -mar lo -lee b -kin vara -jay cees -hy slop -ha sno -good friend -gen omic -fl ic -explor ing -den k -dashi ki -cri a -cine polis -ch anced -capit ul -cand acec -bre sci -bor man -ben shephard -bbcradi olin -att ari -ate pec -ate les -at alk -anir ani -al king -al hum -agon ising -ad amo -aberdeen uni -aband hu -âĿ¤ï¸ıâĿ¤ï¸ı @ -youtube india -wir t -w mv -ver nier -v va -tum water -tn n -th yl -tex ast -ten ths -st ami -second hand -sch atten -sam sclub -sal acious -s bm -red ken -qu eville -pumpkin head -psy duck -ox ox -or nette -or ke -mash al -lu tein -lo za -laure land -kat zen -ison fire -infra structure -iber ville -gu mmer -greater anglia -graf fix -gilbert son -ghid orah -euro league -er cy -environ nement -edin ner -di jk -desmo s -desig nated -dan ila -counter balance -col yer -by usn -ambigu ously -ag baje -acre ative -' '' -ðŁĴĸ ðŁĺĺ -ðŁĩ¸ðŁĩ ° -ðŁĩ³ ðŁĩ¬ -ðĿIJ ŀ -yo thi -walkr stalkr -walk s -springer spaniel -silver bird -ser pico -scott caan -ro bre -re xton -re appeared -pre vi -pc world -pash teen -pad hao -ox ton -octa vian -nico lee -nas c -naomi aklein -mon tel -mom in -metr ically -lu neta -kj ell -j sy -j app -ham mel -ha sna -ghat kopar -ge sun -free keh -fan fics -endo genous -eco system -drive in -dementiafri ends -de as -coo gler -chou inard -char din -bruce springsteen -bre ese -better pakistan -beatle mania -bangor uni -baahubali movie -b ily -az ade -av ira -at tires -as sata -ar ison -ab roads -ab road -ðŁİĦ ⾨ -yi shun -yann ick -went zville -valentini frank -uk coach -tu cum -tp ms -tap scott -so dden -sni de -sk og -same era -restor ation -re imagine -ra wl -ra iled -quir ino -pf tompkins -perse ids -p anne -over hauls -or age -nev ents -naz a -navar atri -najwak aram -musli ms -lo sing -letsgo places -lenny kravitz -jo ver -jo cko -jeremy kyle -i yl -hol anda -giu sto -fc st -fal set -entr ancing -ekad ashi -ead pool -e spiritu -dol an -defrau ded -compad re -ci pta -che teshwar -ch ra -boo ga -bbcradiolin cs -b sa -am bang -am ane -al loy -al al -acknowledge ments -ab crural -a abe -ðŁļ ĩ -âĺĢï¸ı ðŁĮ´ -yed wards -yar nell -what sapp -wall enberg -verde jo -v ka -roy e -rela pse -rajak amaraj -racing team -ra reltd -popo vic -pett us -palad ino -oy le -no we -narcissi sts -mrsilver scott -mor sel -mon tele -mis son -malag asy -lu bbers -loc alize -live son -limav ady -l pg -kell an -jordan abrewster -joni ernst -j dl -io res -ilove this -i ding -hilli ps -gu ld -go digital -form ities -fd bloggers -evapor ating -ep b -emo ore -eman ates -dro ll -di ep -cen zo -cas sart -cam h -brit e -blood donor -berg strom -ba hi -b si -an kush -an ahan -amend es -am pi -a eds -ðŁĶ« ðŁĶ« -ðŁij»ðŁij» ðŁij» -ðŁ¥ ķ -ç aÄŁ -weird world -walkrstalkr con -ti war -there sam -theater ny -spir t -smo st -schwar zer -prospec tors -por v -peli kan -pak veng -nis i -macale ster -ma sham -kler k -kat at -jak in -itt f -hu el -hoo ke -high chair -gro ver -for children -eraser head -equ itation -deep ened -châ te -chef symon -car sten -car max -ca ppa -bro gdon -book sale -alex hirsch -ak ang -($ ): -à´ ¯ -yu go -y music -whit gift -vi dhya -uki yo -tri fles -thug sof -ther ail -them home -stall worth -spe zza -sor ies -schie ffer -sain tly -ry pien -ray leigh -ran ul -pock lington -place mats -per ine -paras ols -noo dling -my sa -monaster io -min san -mill burn -mene zes -may hem -leup old -la sky -kirk sville -hopat cong -gu tman -gr á -g alia -fun kin -f ür -eu co -en um -em itter -ear wood -dogsare love -dean cain -cyg nets -bu kid -brock en -beir ut -be hn -atte station -amni otic -ðŁĴĻðŁĴĻ ðŁĴĻðŁĴĻðŁĴĻ -za beel -x ess -why im -where sw -were wolf -vin nik -uigh ur -tur cotte -trust worthiness -to di -te ff -stein hardt -sor n -son de -sne er -sk on -she in -sar aali -red headed -pri on -piotro wski -njo ku -khun nie -hae mat -grass market -grand ville -gradu ation -go ten -global halifax -gal ax -fore ducation -f du -doppleg anger -co gent -champion stour -brun y -bray ton -bhan u -be delia -at sume -as ani -ary news -alsati an -ab du -aac sb -âĿĩ ï¸ı -à¸Ĭ à¸Ħ -whar fe -weather vane -ul ani -tomo ya -tiem pos -szy man -sty lee -stafford shire -song sof -som me -snow storms -sjc drums -set anta -ser j -rober tv -pop caan -plaud its -penicu ik -pam uk -over zealous -one more -n pt -little woods -iu pu -hyo go -humay un -ha enow -graf itti -encan ews -du v -dra goons -do cometrue -dill ane -cupp layoffs -con ra -atour nament -as vegas -ari ella -arche ologist -apo yo -ali es -êµ Ń -à¤ķ र -мак ÑĢо -val c -usa g -up north -um bia -ucla football -tor rents -sur at -sto rer -stig mata -sketch pad -sik ala -ro tti -r vad -post rock -phoenix mercury -patriot sunited -ordin al -on amission -oak leaf -nu sh -nic i -ne ater -natus vincere -nancy lee -meg afauna -mav ado -mar cal -ma wes -lo belia -leah remini -laven der -kab outit -im prints -ibm z -hee renveen -happy happy -esk dale -er w -en berger -ecor p -dun dur -dig m -ci mino -cal vino -c tt -broo kie -bo ola -black smithing -best actor -bac ke -argument ative -alexander rossi -ahu a -ðŁĴĥðŁĴĥ ðŁĴĥðŁĴĥ -ê· ľ -ye va -wdr bnews -w se -vil ly -vic tu -un interesting -toll booth -tenn ent -tab de -sussex uni -ste pla -sn l -sleep day -revital ising -re aux -ravish ndtv -q ar -play tex -pi ko -pare il -nb f -mo as -mid wood -micro environment -metro west -mc dou -mar ita -kimmy schmidt -kan gra -k ile -k arti -jim beam -ish o -hu sey -heavy metal -haw kin -green ford -gra vis -foot golf -ffe stiniog -enjoy in -embroider ies -dr ys -dip tera -dio sa -d dot -co hasset -club hectare -clay don -black history -bhand arkar -belle zza -aston villa -allrise silver -ac z -> ,< -ðŁĺģðŁĺģ ðŁĺģðŁĺģ -ðŁĩ§ðŁĩ © -âĸº âĸºâĸº -zodi ac -wil ting -w tov -w ics -v xx -v loggers -ur bino -tune stweet -tu mmy -the giant -the chris -tap is -t br -supple menting -sum ma -seize the -sat suki -sa wi -reyno so -ran go -poor nima -pi gand -pfi ster -panip at -pa ani -orth coast -neuro fibro -morgan e -mcre ynolds -mari ella -llor ar -kk ah -instant aneously -i pic -hand o -goal tenders -ge don -fried chicken -fresh produce -fly tipping -ess ences -emergency medicine -e katerinburg -dwar fare -do bbin -disintegr ating -dep th -denuclear ization -de cc -cra pp -cr ame -ci ff -cheek tow -captivity kills -c ville -brawl halla -boston schools -beh ren -akrapo vic -ðŁĺ¥ ðŁĺ¥ðŁĺ¥ -ðŁij¼ ðŁı¾ -ðŁıģðŁıģ ðŁıģðŁıģ -ठģ -y vra -y ury -ven dee -vanderbil tu -txh shoops -summer time -ss aa -spre aker -ri di -renault sportf -re charges -raw linson -ranc or -rad ja -quiz nos -pv v -pokemon letsgo -nim by -news boy -nav deep -mu v -maj ed -ma khan -la q -la aa -kri stopher -j mt -inqu iry -infant ile -hor mel -hed land -heart sof -hearing dogs -head mistress -go shen -frank s -euro p -ers ley -eri ver -econom y -e waste -di ja -cu toffs -cine mac -cheap skate -chad ne -brill ante -br ana -awesomenes stv -aval anna -vote arianagrande -tri mmers -tic oke -thorn ley -team stallion -t cn -swil son -sou les -sketch january -ran son -r ge -pl v -people are -p bk -nr cc -n annie -mr nradio -mead ville -mcel hin -mar q -mal at -ma pit -londonis open -lindsay lohan -k tc -jim rome -jenny lyn -ian m -go gogo -ger lach -fre do -fra hm -form less -deschutes beer -d chs -cross ville -clemson family -chincote ague -charity day -calver ley -bombar ding -big blue -bedri dden -back water -arrested development -arq ana -ang am -aivaz ovsky -whitec ross -we tump -tu d -tribe smen -to jo -tele vangeli -te heran -tal ke -t seng -su bir -spit fire -sm hs -ri ggers -re planting -r sh -pic ke -par malee -page views -ostr ander -o ds -northe aster -nancylee grahn -mu ke -monster a -mc phail -machin ations -mac ademy -la gonda -kris meeke -ka wor -ji e -im ers -gro lsch -gaku en -fur th -fruit fulness -fe tt -fa del -duc es -con trail -brock en -bret baier -billing sgate -bha gat -au demar -> //// -ðŁį ¥ -var u -thebigbang theory -the gifted -spoo fs -slip way -schri ft -roc team -refugees gr -q aa -prest bury -op to -nerd life -naturo path -mon ac -mini stered -mercedesbenz ind -mary lou -mari st -lo hr -kol ler -ka hala -jor dison -ji hyun -iz aak -inten sively -int age -high court -h wl -glaswe gian -gil lo -gavin rossdale -edge field -cow bells -canvas sed -canadi en -bones onfox -bha bha -bell end -battleof britain -ast an -arteper larte -ahim sa -abdic ation -+ ( -ðŁİīðŁİĪ ðŁİģ -âĺºï¸ı # -wi js -u pup -twitchtv online -tree frog -tl k -tie break -think musicindia -temperam ental -sun woo -stock piles -sp atu -sco ach -sar nie -richie hawtin -reed ley -ra bu -phy ll -om ot -metal gear -metaco gnition -man ok -kun ar -klassi k -jal op -holocaust museum -hau ghey -han nie -gre sley -flag stone -explore edmonton -er at -crun cher -crimin alizing -cove do -chandra se -cas son -cari bou -cam argue -cal zona -bu daya -band uk -anton is -ami han -ðŁĻĮðŁı½ ðŁĻĮðŁı½ðŁĻĮðŁı½ -ðŁĺ¬ ðŁĺ¬ -ðŁ¤Ķ ð٤Ķð٤ĶðŁ¤Ķ -ðŁ¤ ¦ -Ùģ ÙĬ -yas i -welove it -visit ing -viol as -u ted -tre vel -sympho gear -stour head -se it -se ac -scrob ble -sath letic -ri q -resc a -replic ates -raz an -pat wari -our less -n tuc -muk ha -moom ba -mid hurst -medi acorp -mc kim -matu idi -massey uni -mar cou -mal ir -ma official -m ny -le disi -l ated -kri ssy -kr illin -kid zania -kell ym -jo ga -iam vikramprabhu -hi bbing -he les -har lesden -gly nis -global news -fly swiss -ex pom -ergon om -e bisu -don ell -ci j -chel sey -cha c -best day -be van -ban anagrams -are sh -am orous -ade cco -adam as -ðŁijįðŁı» ðŁijįðŁı»ðŁijįðŁı» -ðŁĮ Ħ -à¹Ħà¸Ĺ ย -x her -wild and -u zz -tom ando -todd y -tobi ko -thebody coach -swan ton -som y -sleepinthe gardn -sj k -sho esday -shat abdi -save sharks -sa sikala -roque fort -rad lett -pink ston -pe mex -os ac -on rails -om munity -nas agoddard -murdoch mysteries -mu dge -man andthe -lu ts -look down -lett ing -let z -law ry -kevin love -k assim -jagiel ka -iucn redlist -iru mugan -if n -holl man -go pleader -gear head -for hope -fmc sa -fit o -et winning -en vivo -ebay rocteam -chlo é -chic an -carryo ver -cal era -c js -breath in -bio control -be fu -ap itals -age o -action figure -. ðŁİ¶ -âĻ ¨ -اÙĦ د -ye si -womens open -willam ette -ver ns -ta ille -stein hoff -sp x -sly ly -se abor -room ful -r blx -piran has -newsp oll -news from -ne aux -na if -mother boards -mor row -marin ades -ma fal -m scott -lud low -li ii -leon el -lam ented -ky am -kube con -kov skiy -kam au -jab hat -hermi ston -gr ata -glen don -glam or -ger n -forex signals -fabi enne -evo ked -en otes -eg or -du jun -drop head -clap trap -bani shing -bak ke -bag got -b dk -ap ar -air lock -ace e -ðŁĺįðŁĺį âĿ¤ï¸ı -ðŁĮ ĭ -world championship -vote blue -virgin america -v mug -train ier -tor ture -theroyal ballet -tele fe -tasteof london -t lu -sim bel -sho tting -ro j -rain ie -pro bando -percu ssionists -nat tie -mush u -mu iden -mel tham -mat ra -liber alization -lepre chauns -la sgo -ken jeong -hiphop gods -high water -hi e -hell blazer -hei sen -ham mill -hack enberg -green vill -furlough ed -fie star -disemb ark -de cal -dap o -dag ger -comm munity -ce iba -care t -bollywood actress -blac kett -bian chi -be set -bal briggan -ar ken -an ze -a ecc -] ] -Ú ¯ -yuca ipa -yel tsin -wit bank -va sion -tothe moon -solilo quy -setti mana -seaf aring -par rett -o q -nedbank cup -nand u -mergan ser -mel as -kissing day -kin er -ha dd -godis great -disintegr ate -der rickson -cyano gen -chloe bennet -cau e -cand al -bla ded -astr on -ap ati -ak ashi -aha doop -ad jei -â İ -when ua -vo ci -travel to -t girl -super hot -squab ble -south central -so es -saunder s -ren teria -reic hs -q tum -nh lawards -n pi -my dog -mun sch -mon ki -mc morrow -mat ka -lex masters -les fic -kash miri -jim s -integr al -ic ra -holla back -ho kie -greek town -geomor phology -ge le -gallow ay -fo al -finalfantasy xiv -eri um -en coders -devo xx -depend ability -covers ong -coke studio -car ignan -brickby brick -blo b -bird watchers -bi ocon -bar low -bally hoo -bal ai -ash brook -arl ene -and back -ðŁĻĮ ðŁı¿ -ðŁĻĨ ðŁĻĨ -ðŁijĩðŁı»ðŁijĩðŁı» ðŁijĩðŁı» -ë ¡ -æ º -yan ov -x ic -wolf blitzer -wiener mobile -weare lakota -un forgotten -un aired -tt k -syri a -sunidhic hauhan -sukho thai -style uk -st fx -spi x -si op -sau ve -sam t -saddle bred -ru ga -rtop nb -ri bes -reyn old -pr ams -po kh -phar cyde -pe v -obstruc tions -o gall -mon in -military hist -medic inal -mc bain -max ell -mag ed -ly ttle -lc cs -kokan ee -kam il -josh mcdermitt -intru ding -igi ppygrewal -har twick -hand spring -ha gu -glori fication -giang inoble -gian tess -ferr ying -eric i -ec tor -ear thing -do thraki -dis liking -di eters -de sor -cu ento -columbus day -code org -chu mb -cbee bieshq -bristle cone -brazz aville -barber ton -baha dur -auto play -arun rajakamaraj -ðŁijį ðŁĺį -ìľ Ħ -ãĥ Ľ -âĹ Ģï¸ı -Ê ¸ -yo ong -vaugh n -upstat eny -ugh hhh -twitter les -tri ver -tre eline -thre dbo -the co -than die -tel i -taxi way -stir rer -st paddysday -sor cha -shorty awards -se tu -rock ing -ren ai -rejo iced -re stre -ponti fic -pitch fork -over shoot -okin awan -nam cinema -megat rends -ma hut -long legs -land rum -ky aa -king stone -kay seri -high five -gol fcart -go key -glen bow -get together -fly in -endor ff -em mett -e azi -defaul ters -deci phered -cl ymer -ce fal -cat fish -car rol -c ici -bo len -birdo bs -big city -ati sta -ar oun -ambi ka -amalgam ated -air side -adi ga -ade boye -ad ma -abram jee -ab aliga -ðŁijı ðŁĺĤ -ðŁijį ðŁı¾ -âĺ ¾ -yess sssss -wo k -wa state -vand amme -v aa -tree hugger -thr acing -thin line -the sky -synchron y -still organ -slum dog -side show -sau con -roar ing -ravi shankar -q assim -power rangers -nor din -mustar d -muscle pharm -mun dial -mo es -mc cri -mayor soffice -masse use -manal apan -lan z -kr gv -kemp tville -i aps -h co -gu inn -gol ders -fle isch -firstaler twx -fin ke -debu gger -cam i -beer and -be moans -appliqu é -alo ren -alan shearer -abr sm -ðŁį Ľ -ëŁ ¬ë¸ -à¹Ģà¸ Ń -youha donejob -yak ub -v ff -uvam en -trespass ers -theli gh -the pleasance -syco phants -sump tu -su ae -store wide -stal ent -se ago -reflexi ones -r ts -pizz i -pat in -october yet -low den -lex ico -khil af -jy he -just go -j izz -holist ically -hobby lobby -he adey -haz arika -hay at -hak yeon -fl m -fa onews -f loc -du fc -dow sing -del as -defra ud -crystalli sed -cr annies -clo tting -cl angers -chen ango -bu ku -bron tosaurus -bo sky -black head -bir cher -belo a -balde agle -baku gan -baili ffs -ac sm -ðŁĵ· | -е к -ul ang -tom omi -ta patio -sympath ise -sw azi -surve kshan -si don -sh oney -recon cili -public works -po ck -man el -lou ren -lo hud -li les -len nan -l sarsour -ka ew -jor nal -je wson -its showtimena -inde cent -gu age -fi or -envo ys -endangered speciesday -dur sley -dor chester -don nyo -de ct -co yd -cityo fedmonton -ci ao -che atin -ch ines -cavali er -careless ness -ban at -bal bo -annu ities -ad ac -yun jae -wa hh -usc annenberg -triple threat -ten ens -te go -szczec in -stock ade -si gu -sanat orium -s lon -run ic -rhy no -re directs -principal ity -petere gan -parag ould -out doo -olm stead -o yelowo -o stro -national anthem -mer lyn -man movie -mal ate -lin dros -like minded -lid luk -kent aro -it ni -gi bi -gen om -firstdayof summer -fireemblem heroes -ent iced -e hem -do lo -design by -da ine -cruci ferous -com frey -chennai floods -carami asg -cad w -blue grass -bio active -baz e -anth ill -alam at -ak ih -ab ron -, ! -ðŁijħ ðŁijħ -ðŁ¤Ļ ðŁı¼ -åĪ Ŀ -ÑĢ Ð¾Ð -za inal -wh ines -weare latech -wa shu -vote james -un guarded -tho s -su panova -ster i -so close -re position -rail car -paridhi sharma -on alaska -middle east -melt down -me sse -material handling -maj nu -len ka -lau dio -lamp light -lac on -kauff man -jets am -j ru -isit octoberyet -if ers -iche tti -hou le -gender queer -gad da -form ation -flick ers -firsta id -fil oni -excav ate -envel oping -eno va -ecol ab -do yen -dema io -de winter -d hp -chickend inner -canadas militaryhist -bo wi -ben dix -be ir -bat ak -bar ged -az eez -aster oid -ami el -alien ate -akhen aten -afford ably -ae jmc -.... ... -.. < -ðŁĺ¢ðŁĺ¢ ðŁĺ¢ðŁĺ¢ -ðŁĩ³ðŁĩ ´ -war saw -victim hood -under garments -teen wolf -st ook -soldi ering -sm tp -sleu thing -sebasti ano -sar tori -rock hill -rit son -port man -pipe work -pi ala -oregon state -o dai -na hm -memori alized -mc garrett -marchi onne -malin owski -lit vin -lan ter -la brie -ko do -jad en -industri alists -hobb iton -hi jos -hawaii ans -glen side -gan grape -fur lough -fre ind -flu me -fake cases -ef t -eden vale -dev itto -detroit basketball -cpim speak -ch ho -ca er -buffo on -baj rang -ayr ton -aval os -as pin -albert ville -( )! -w pp -vern azza -vene zol -umm c -super bug -spi ff -speed week -small businesses -sign syou -science irel -ridge well -retin as -realron howard -ra ka -peshawar zalmi -pag os -our pride -ou ric -orn ery -oke ke -nsw police -nor quist -ne gus -michel son -memb ers -li wa -leather necks -la vaca -hor s -har tsville -haban os -growth hack -gr andy -ghostface killah -fiddle head -f df -ever hart -dre idel -casting call -belgi um -= )))) -ãĤ Ħ -zam os -wetump ka -tre lawny -to dy -t cho -sym fony -student ship -scott sdale -sar g -robertir vine -qade er -pu ked -org one -mom i -mill bank -meat six -ma ila -lucky me -liv res -line ar -li zed -le ko -kor aku -kari ya -intimi dators -hypo glycemia -hjel m -hec paris -haver i -ham monton -ge el -fin ale -fi za -exhau sts -excre ment -etu c -diaph rag -de gen -daniel radcliffe -dak is -cri mel -colo bus -cloud waterbrew -chas er -canadianti re -ber le -banan arepublic -audemar spi -ane en -alessandro michele -ak at -af ric -ðŁı ¨ -ðŁ¤¤ ðŁ¤¤ -Ø Ń -ye syes -wait t -ve greville -uk c -travel tribe -trans sexual -touch points -tam es -swee pers -standrew sday -squa shing -squ ander -sam champion -sag res -radiof requ -pri mi -pn as -pearl thusi -patron izing -pakistan army -okoro cha -ner sville -natgeo channel -may umi -mah le -lu eders -lindi we -kri zz -king smill -ju lz -jan gh -hobby ist -heidik lum -h ti -gu edes -grac enote -gel atin -f ga -enic hols -dur on -du shanbe -drawl loween -don diablo -don ar -der win -counter intuitive -chi venation -chi da -chapters indigo -cat sprotection -ca hir -bun ks -brock u -bran cusi -ber rie -bel as -alun ageorge -# ! -ðŁĮ¸ ⾨ -ç ¿ -west world -ve ach -ti ree -tesco s -tar c -smoo ths -six fields -scam ander -san n -rad ice -queen latifah -pli able -pleasant ness -petr ino -pebble beach -otw ol -nano ha -my mind -mbo ya -man katha -ma ag -m paa -jonny bones -jn dsd -jeff hardybrand -jac arand -itsa adee -impul sively -immo kalee -if d -helple ssly -gi ppy -fair born -esthe sia -eric hie -dron field -deb tor -coiff ure -chow ki -calci omer -ca ec -bom anirani -bewil dering -beer me -bbc spotlight -bally doyle -az eri -aj inky -ach im -îIJ Ħ -Î ³ -y ri -wa ils -v de -un countable -ud g -thisis whywe -the story -spl x -si dh -qu iry -pit aya -pen alised -pag al -ober wiesenthal -o ef -ny ct -n ilo -mundele in -local produce -lign ite -lad ki -kill me -ht con -hill fort -hadi se -furio sa -fr r -enh art -emul sive -di yas -depress ingly -dee b -come dian -chi f -bc place -barak ah -avell ino -anti retroviral -ade ola -ð٤ĵ ð٤ĵ -zy na -zeej lf -yvra irport -x tv -vis itch -vari um -tol led -tin ia -ti dd -the weekly -the forum -tex ase -shed den -run jewels -rock pool -re doute -pyg malion -product pick -pol ity -north bay -neuro sis -neuro plasticity -lohan thony -kon ec -in af -grigor dimitrov -glori ana -girl scan -fre inds -fl w -espar garo -dur ack -dun ker -dor mand -dig vijay -dici embre -de sta -de ila -daven avarro -cor se -cor da -cohe sion -chin x -bra k -bote tour -bg v -bar now -ather stone -ari as -are ports -ar mond -ang elia -and ball -amand ine -akh shan -air heads -a discoveryof -ðŁĺĥ . -ðŁijį ðŁĴª -ðŁIJ¾ ðŁIJ¾ðŁIJ¾ -zeni th -ze be -z org -yetic oolers -wy d -was illa -wa iler -ton school -tier ra -thi stor -the challenge -te si -studio teabreak -stu ffed -stay fit -south coast -somuch fun -selen ite -sac ral -rgv zoomin -rad nor -quake con -privati zed -pat z -par ul -p wo -ol lection -ol ita -nu j -nhl network -navarre te -msu bears -mr drewscott -mand ya -mal tin -ma en -lil ac -kit ano -kar awang -k po -jo whiley -in b -holling worth -hefe weizen -gor leston -geo int -for ger -felicit aciones -fe ttes -es me -di mi -d ma -cross land -choosel ove -bet tered -bet ances -be tti -az or -aq ap -anti inflammatory -annab is -amp thill -al mon -ab riel --------------------------------- -------- -ðŁĺŃ ðŁĺĤðŁĺĤ -à ¾ -w ttw -ver ger -venkat prabhu -thi js -tar th -sym bo -sun ray -sto les -spokesperson mod -sn n -sel cas -see f -sar na -rock hurst -quavo stuntin -oc us -naom is -mo ston -min ne -medic ate -ma do -letour neau -lemon heads -lego dimensions -kwe si -kis sable -justin mcelroy -j de -inthe know -inter loper -her bes -hen o -gisele official -for glory -fel in -esp acio -elo ves -di aw -del ved -del tas -cour ts -cha w -brush fire -brook sville -bren neman -beu ys -ad dam -ðŁijij âĿ¤ï¸ı -ðŁĩ¨ðŁĩ ¾ -® : -you rad -val ois -the con -te ck -st ny -st ille -soni agandhi -ro hat -rey mysterio -real tim -re structured -raj yam -ra thod -play mates -pic tionary -nu is -non thaburi -new tech -nca alax -national dayof -moo ji -lo wn -knigh tri -kish werm -khai dino -kal er -k sb -join ville -jodie marsh -japan e -ham di -ha upt -gro es -gla iza -ge aviation -gaw ler -fir s -euri pides -e usa -don gen -cun dy -courty ard -com ent -co ad -ch bull -cast ille -can apes -bron cos -bo tch -bo stock -bas ford -bal tazar -as n -ark wright -ap hy -adju tant -activ ate -acou stical -ðŁĺģ ðŁİī -ëĵľ ë¦ -w ld -usa p -uniof newcastle -the park -te gra -still birth -south downs -sol fe -sm illie -sle vin -sink holes -sig lo -san ha -sam pha -pet z -pac ts -oto ole -ofer tas -o sco -nr j -noi sia -nc s -nar do -more than -mont ju -mohic an -mis judged -marou bra -maj olica -liber alarts -last pass -lali gas -kla van -kir u -kin ski -ka ho -k hera -ji bril -jack hammer -is ere -impro ving -hell on -h ary -g de -fan tom -erike strada -er an -duches se -dol lie -den one -delray beach -death trap -dean wye -daily kos -co ffers -cheektow aga -cancel ation -cab bages -atp challenger -ar ouse -ar ona -andre ws -al cester -adv ancing -ðŁĺĩ ðŁĺĩ -ðŁĩª ðŁĩºðŁĩ -â̦ âĺº~ -vish wa -uv f -trinida dian -travelo city -thom p -thank less -te ala -t bur -swag ger -star tle -spoiler alert -shivak umar -sc oured -rosari odawson -ren tino -pun ahou -prac ing -poo ka -pi pm -peg board -nor sk -news beeps -ndtv newsbeeps -mit os -me owing -majo rette -li der -lauren tiis -lady well -ko eln -kaz a -ka ap -ingthe future -imper ious -her mans -guar di -ginger snap -frit illaria -fran cie -extin ctions -eu budget -echop lex -dru mm -drake university -d fx -cro thers -cra s -cam cor -av net -ator ia -arama ic -alyss ahar -alber te -.. âĿ¤ -ðŁĶ Ļ -ðŁijĭ ðŁijĭðŁijĭ -Ä ħ -y ll -web app -treze guet -tothe world -ther ow -sy ke -suz anna -sultan as -suff ern -stagger ingly -son ia -sh anda -radi oc -pic sher -perit oneal -nar ain -mouse sports -mole sters -mobil ising -mish mash -midri ff -manhatt ans -maggie q -mac onie -look back -legend s -karyak artas -jor an -ib on -heis man -gru e -ge tti -fex cellence -et m -equ i -en lace -e bl -dill ards -cri se -corps man -centen arian -celoteh promo -castr ated -braw ling -bobcat nation -al brighton -ac bo -unite ch -ty y -sv t -strat ahadoop -sketch fab -shik sha -sant amar -saf flower -ros ling -par ta -on gh -nett leton -neck ar -n chc -multip liers -mu ammar -mor n -mor andi -mar ma -lan igan -kook min -kin loch -jay thewanted -ip x -im jadeja -i mee -i bec -hul se -hijack er -good charlotte -g elife -frozen four -en ine -droo d -digitale conomy -dep or -day ana -conver sion -com me -coloring book -coke zero -coffee shops -chat to -cat ena -c ally -bli shing -being maryjane -bat alla -bar win -argin ine -anim alia -af gv -âļ½ï¸ı # -âļ«ï¸ı âļªï¸ı -y strad -vand am -uniform ly -un convinced -ug r -si kandar -shan u -se poy -se mir -sb nation -pp ic -phra ya -nne di -mise ducation -lune ttes -list an -la ps -kyne ton -k nightmare -iver sen -inter min -ich ner -hod desdon -ha che -h mmmmmm -grijal va -gh illi -faryal tal -fairy tale -equi pos -energ ising -dragme down -do whatyoulove -do vers -degre e -deep ing -dam med -cs j -co chin -ci fss -chem trail -char tered -bray wyatt -bo hannon -bmovie maniacs -bi et -aff suzukicup -. ^ -ðŁĩ±ðŁĩ ¹ -ëĤ¨ ì¤Ģ -âľĮ ðŁı¾ -woo kiee -wc sh -was cana -ty lor -strangle hold -sl icked -shir l -shiel ds -sexu alas -scienti a -razz aq -ran il -pra bal -penrith panthers -pedo gate -p schools -osc ia -novonor disk -nether ton -mon archi -majum dar -lan come -kkkk kkk -kell inquinn -k offee -invier no -hunke moller -gu anci -go bulldogs -for ton -fashi oning -er za -ep ine -dro se -cul ligan -canvas ses -bun gay -bre mmer -ai ge -ðŁĶ¥ ðŁĺİ -ðŁ¥ģ ðŁ¥ģ -ìłľìĿ´íĻ ī -åħ ¬ -£ £ -week nyc -une ase -trun ner -ti gray -thi ele -ta ha -super book -star fish -spre cher -spirit awards -spin ph -skin head -si rota -se agram -schoo lies -sal oons -ragamu ffin -r dn -r bl -princen arula -prelimin aries -polit icking -pe ster -par cel -od ours -nac da -loveof mylife -l fo -kri styn -kirsten bosch -kat ar -ju bail -jarre tt -jan ab -jackson hole -j ta -ig bos -geome tries -ge hl -g ising -fa ha -der u -cracker jack -com une -car ruth -blu mberg -artif ice -al jon -!! ðŁĺĬ -íĥĢ ê³¤ -ye aaa -wr acking -wigg lesworth -wer der -ur vive -tv official -tru cco -trium virate -trevor project -top tips -time keeping -the ol -tat eliverpool -so ak -she affer -sh us -senor ita -s agency -ri dem -red ly -poit ou -par ul -pad d -opere tta -ol ajide -na dia -montal bano -mir ando -milli meters -man in -mammoth mountain -lok mat -lit chi -lin net -lam mas -l news -kun itz -kam rankhan -ka sher -hor st -hi stone -he most -flat top -fav elas -eep ly -dou bler -don avan -dh ing -cu li -cn es -ci opp -bin ion -banyu wangi -anti guo -ðŁĮ ¡ -âķIJâķIJ âķIJâķIJ -wizard weather -whit en -vision ary -villarreal cf -tu ria -tru ek -terri e -sti vers -sm h -sign language -shi ge -resource fulness -re directing -pr x -po to -os v -no sy -no ren -nat y -mu tai -micro fiction -metro boomin -maxi mo -manchester city -long leaf -le sli -l rg -kath ir -ji denna -hydro logical -hawk moth -gir on -flo aty -feroci ously -eli da -el bourne -ed ancer -dur ango -dhananjay ang -defl ating -daw gz -cosmo drome -cir a -cas agrande -bry den -ban presto -ay ano -athletic s -ðŁijį ðŁĺĥ -zen de -winchester bros -wh erry -wen di -we intraub -way y -voter id -vi asat -vau ght -under groun -un shine -ti mbo -stit le -scare ers -rodrigue z -rob son -rag wort -probab les -pri den -power metal -politico europe -narra bri -nan dish -n hi -matsu da -mae stra -lon go -lar c -koscius zko -kak ao -iso tonic -indv s -iloven orthcoast -hwar ang -hogsme ade -haz litt -gille speterson -ga at -f ack -ever quest -en gupta -dubu is -die thyl -desp an -danielle cormack -daniel tosh -dal len -brexite er -berkeley lab -anci enne -adri anne -ach u -zuk un -zee brugge -x da -wil by -who is -vie so -vesti ges -v apo -uu l -un selfie -ul tan -ud ta -ud hr -tre stles -timeto act -the valley -taver as -tamau lipas -subram aniam -spi rome -sh ila -sal ka -res by -rate payers -rashi di -rad res -ra x -pro ser -pr ance -photo sphere -pap aver -ob is -n anyang -my music -my exand -montal ban -mil nga -mil ilani -mb als -knowle dg -kir in -kar min -kak a -k alou -juven ile -its dre -ine ers -ic cs -hou gang -hollywood studios -ger al -gar butt -esc rito -ed enton -de vere -de kat -daf ne -character ful -chapel hill -camp fires -cage warriors -be me -bag gett -appal oosa -al et -aerop ort -ðŁı ij -zi yi -ym tn -weekende dition -weather photo -ved ha -ur mila -tri shay -torfa en -tom ac -thin i -spur ring -sophi el -slu shie -skor pion -shake able -sg f -scal pers -samark and -sam man -rose hill -proud lock -or s -open air -oneteam onedream -octane render -mu ang -mollu sk -mar wood -m skar -lam in -la zo -ku ban -k man -joel mchale -haw at -fu x -fluffy guy -flu ffed -fis erv -fa ile -f ts -ero om -eat fortheplanet -ducati motor -depar dieu -dd iction -cuer adio -crven az -clean er -claren ville -capp uc -c bridge -buzz worthy -bohin j -aph ra -an stru -an hydr -am ines -alchem y -ah san -afl finals -abvp voice -+ +++ -ìĹ Ķ -âŀ ŀ -âĿĹï¸ı # -z ef -was v -vc sk -v ava -up fight -tweet my -theri pper -th impact -talent management -sub group -sh tf -richar dro -reas signment -procrastin ated -pre existing -pic tish -pe waukee -over laps -odor less -nebu lae -muzi ek -motor i -mc fall -man fred -m mot -light years -legislat ures -leaf ed -lat ches -l nt -kofi annan -ko var -jyhe ffect -isi olo -invali des -innov ator -incan tation -hu eneme -ha boob -gy an -gall erie -g ately -frivol ity -fh wa -festi va -fa ience -euph onik -en em -di rait -da eng -cocon ino -cli braries -ci um -button hole -broad ens -birthday bash -bi vou -bbca siannetwork -baz emore -battle fron -bal mer -babys at -at atime -amon ster -amo vies -aly se -̶̲̥Ìħ ÌĬ -wil letts -ustin ov -urine town -un usual -u ef -twi gg -touch screens -thevamp scon -the bold -t lb -sty ler -sto essel -stal ley -slou ching -shel le -ser kan -scrutine ering -ro erich -ram ah -pod gorica -on film -o wh -north lake -lostand found -loc atelli -leather work -le hr -la ka -kat graham -k alian -john bolton -ingle borough -hase ena -gi ps -gal lia -fo er -dio cle -de g -dac eae -criteri on -coni ferous -car rabba -briar wood -ben alma -ay meric -avi ate -amy winehouse -abomin ations -yo go -y oooooo -wal y -wa an -universit é -ulti ma -traeger grills -to vah -theo bald -tar onga -tamir rice -ste ens -seraf ina -sat c -saar land -re activated -precision ag -par la -pann ell -octa vius -noctur nes -michel leg -me agan -mcguin ty -mc bean -maha bal -law ford -lan re -la gni -la gar -kel lam -international coffeeday -inter cooler -illu sory -ili za -her y -ha zz -gol fin -gho da -gh oops -gary clark -flatt ens -disper sing -defence less -cyanogen mod -culver city -creepi er -colorado stateu -cl td -celeri o -boston symphony -ber ate -bab ri -avn awards -au tau -arts festival -apra xia -ab els -[ ðŁĵ·: -:: :: -ðŁĸ ĭ -é rables -zan upf -wb afcofficial -vibr antly -tn w -tech expo -taun ted -tall man -skill man -skel ton -sir sa -silli man -shi ek -sc ler -sc afe -roo ter -redemp tive -re works -raj guru -pwll heli -pubg mobile -pic ka -oo dh -of eng -meningo coccal -lycan thro -j cu -home bred -gi ed -gas o -game informer -ex adata -con v -co axed -christma spresents -bov ril -bo ere -bj praj -bag chi -b ition -am aj -ale ix -ah b -achieve ment -ðŁĩ ² -ð٦ij # -your game -ya ÄŁ -wh oot -west lake -ut s -un tenable -the u -sucess o -su bed -soci ation -shi raishi -seb gorka -sam ana -power fm -pla smids -pil oto -phe t -per kin -pare shrawal -o gie -no ko -newtown abbey -neu tra -nc sm -mug anda -mu dd -mi stran -mention someoneyou -maul ing -mad dock -lyn g -lipol ysis -lind quist -le flore -kine se -khat am -karma kar -intel sat -in x -hear d -hay i -gi wa -genie bouchard -gear boxes -gap year -fu mbled -e utel -dustin lynch -dic embre -decaffe inated -datasci ence -corsic ana -contrac tually -cla in -center field -ce daw -car ton -be cu -bcm houston -bad alona -audiom ack -ashe boro -ar naz -appreciation month -aph mau -an zu -alli ant -af fair -ãĤ·ãĥ§ ãĥ³ -áµ ĺ -ঠ¶ -vi ff -un civilized -tx su -transfer wise -te ju -sy leena -strat com -stab ber -ss rs -solan ke -shoe boxes -scru bby -ruffi an -rou z -rom pe -ran vir -pride in -pl z -p gy -nick kristof -navig able -nan sen -n der -myo pic -mut tering -mr ricky -micha il -mccle ary -lov ski -looo oong -lof gren -lo witz -live sey -juli ano -jeff ersons -iam fat -hel ou -he pha -epic tetus -edwar des -du quette -dire wolf -confi de -cere us -build able -boudo ir -as ala -ðŁĴªðŁı½ ðŁĴªðŁı½ -wav ers -washou gal -vill an -vijayfan strends -us v -un installed -tom wolf -thereal juicyj -the sushmitasen -super vet -stall man -sany o -sam ini -reflec tion -raj ma -ra sal -power full -pareido lia -pa es -p mh -owl city -oli vos -objec ting -o jessicanigri -northern assist -mvp school -mai ka -lumber yard -lo ld -j ir -happy new -h nic -gu aje -gre tta -fin dus -family tree -est á -ep an -elli man -dre wh -cook ham -congr ats -ca del -blo ve -alighi eri -ali ber -ad ao -acu er -actu alit -ðŁĺį ðŁijij -ðŁį« ðŁį« -âķ ¯ -ع Ùħر -ö y -wi er -west dale -vish wak -ur ich -trailerpark boys -thro m -theatre royal -su bah -seat ers -scab bard -pit re -per nell -p flag -out the -nov anation -next year -moro der -jim gaffigan -hom ura -go visit -gim mie -giff gaff -fluctu ation -fidel ity -dash wood -chipper field -cen ar -ce sarean -cath leen -bur ping -bur kini -bru gh -bare illes -bad land -ba stet -ay atra -audemarspi guet -al lum -aj c -ab ie -aa an -- ,- -âĿ ĩ -Ú© ÙĪ -you rock -y ster -wr k -von en -vir u -vas ude -ubun tu -total led -tiny url -tell me -t storms -sy rie -suk uk -sterili zed -sr sg -sol ler -sb learns -rum ple -rox burgh -rose crans -ro ko -ri serva -r ancy -public sector -peter capaldi -ou glas -objec tification -oak field -nu men -norwe gians -nissang tr -ner f -my favorite -muswell hill -much music -moon dance -modern design -mind lessly -man spreading -ly gon -luc chese -ling usamy -le sabre -le mp -lam ber -ky y -kis sf -katiec ouric -kabo cha -go i -fat man -et ti -dom ide -dist as -daily monitor -cou lton -clay ne -c maa -bridgit mendler -bom an -be ate -au w -asymp to -archae ology -apple white -ak azi -ðŁijĮðŁı» # -vintage books -video games -up w -tyour back -thecine gogue -test net -tele gram -tele commuting -tal end -sw are -sugar plum -spring vale -sp line -smar ia -slee ker -side arms -shun ting -shef vaidya -sean spicer -se mis -sd pride -rae els -pet ta -pen na -peaceand love -pan em -new sal -me out -max xis -man imal -ma stic -lastweek tonight -laem mle -ke vine -kav an -k orian -k lock -inter lagos -infer tile -in nigeria -ibar aki -hump ed -heat wave -hau ck -h ili -gt sport -grand rounds -foli ar -feature me -ew york -equal ise -ee i -e am -do wag -de face -david beckham -choosel ife -ch elios -cast ille -cas que -bin nen -big time -bang bang -ay alam -aw am -am yo -alde baran -æĸ° å® -wy ang -world lionday -window pane -ve itch -van arama -tor mund -tom ania -ti ppi -ta zz -sy p -sho twell -se if -se amen -ru apehu -r ÃŃ -probin sy -poo led -poc ke -on fire -odi ham -nove dades -med ell -mad havi -ma dr -kul i -kal ina -ka stle -iphone games -ic ap -iber dro -gv k -gratu ity -gan apati -f blchat -evacu ee -erec tus -disney animation -decrimin alization -dayton abeach -dag on -dad da -chi omega -c fu -book oftheweek -bo fors -beaut yof -badla pur -av ison -accompan ist -ab hil -:) < -ðŁijį âĿ¤ï¸ı -ëĬ Ķ -ঠĨ -zun ino -y uni -weekend wisdom -virtu alized -velve eta -vap i -up turned -under a -to plo -this flag -th street -tat ting -serv atory -schnauzer gang -san kar -ri ple -re version -raro tonga -po shan -pil sener -pe ko -p kt -odd world -la schools -kr ka -kha dr -j kl -international danceday -inspire sme -gw o -goode ve -gio van -fin lit -fili ppi -fam as -co author -caman pour -by day -bun ning -bele za -ba jac -ante ce -alyssahar ad -ðŁķ ĭ -ë Ī -大 éĺ -Å ij -} . -y lum -who sunilgrover -wetaski win -wak ayama -wach fox -viol in -vi kk -vash ti -u em -tu pole -trou per -su kira -ster anko -stanley kubrick -sf bart -se z -saraali khan -roller girls -rex burg -renzo graciebjj -rc psych -ra dian -pot torff -pon dok -parkinson suk -olap lex -now drinking -ni acin -mur do -made ira -lu mb -lon ger -loire valley -live streams -le shurr -kon trol -j miller -inj kt -gol pe -gods notdead -go khale -gam an -g ando -fe ducation -eph ron -ehren reich -dougla sville -di ur -d hen -college ville -cla stic -benig no -be any -arm ley -arca dia -ale many -adop tees -________ ___ -ãĭ ¡ -ye sto -va he -u wais -trin h -tic to -the boys -ter ias -ten ma -tau ber -si rocco -sazer ac -sas city -roy ton -raven hill -r bp -pacnorth proud -oppre ssing -og gia -national sunglassesday -mc kie -marri ot -mal appuram -loveto read -lo ti -lieb man -li ddy -last ing -kin ne -kellys later -jan z -ig m -iam valc -hay ford -hasle m -gu bler -fuku yama -extric ated -emer ita -dru mb -dj ima -dis missive -day trotter -co zier -co coro -clo set -cla ud -chi gh -cer vo -bur gs -bri st -bra es -blur bs -be eler -bap at -bag o -augu r -american muscle -alway sa -ali an -a hal -a ata -................ ... -ðŁĺ·ðŁĺ· ðŁĺ· -ðŁĮ´ðŁĮ´ ðŁĮ´ - ¹ -yash hd -we z -wan go -w web -vene gas -vanc on -v pr -usatoday sports -uni k -stream ers -ster a -sodal ite -snu ka -ske tball -sho tta -sab ic -ré sumé -rise u -ra ig -perel man -pelargon ium -p iller -orn ge -o dal -ny g -north stars -nigerian army -mq tt -mis fire -mc mann -jen ner -jay da -inher iting -highland er -har an -gli dden -gh anian -fl intri -farn worth -extreme weather -duck en -do you -dhan jani -chef tom -cat us -bo ast -bestro l -bene factors -an amika -am rut -ale gend -ak tu -aaron ovitch -த à®® -wf h -tyler thecreator -tur ris -to well -tk maxx -the buffalonews -tailli ghts -swar up -sk oll -sho chu -sen ja -ridic ules -ren stein -re connect -r vt -plec tic -myfreec ams -mid ter -micro site -mechan istic -materi als -malo los -ma gog -m tweets -lo llll -kirk us -kap s -kalon zo -kal on -k gw -jais ingh -j ach -irish whiskey -internal comms -inten tioned -hyper ventilating -ho taru -god fathers -fre eyour -fortun ato -fire fall -fin ess -e migrate -dou cette -di electric -deltar une -co sh -clari on -brook vale -bjpraj nathsingh -ðŁijĬ # -ðŁijĩðŁı» ðŁijĩðŁı» -ðŁĮ¸ ðŁĴķ -ðŁĩ¨ðŁĩ¦ ðŁĩ¨ðŁĩ¦ -리 ìĤ¬ -~ ? -ye aa -wo tton -wi spa -wi ggs -white helmets -w tmj -vy rt -vindic ator -vi ste -tv writers -tuscar awas -tu mba -tir reno -stre p -splin tered -spe irs -sp readers -south borough -shant y -sen tai -seal team -se um -schwal be -sand erson -sag arika -sa ara -rs duk -ro quette -ro bey -renfro e -promo tion -pro fusion -plow man -photo realism -paula abdul -ou verture -nebu chadne -morgan ton -mccal lion -mano tick -mak is -loc ally -lily allen -lee brice -lang port -ko yama -ker mode -il ux -ic han -ic acid -geis ler -gall inari -ful da -fly te -fing las -fin an -en ki -east field -e pping -di bella -dar ing -crimson peak -chu d -chicago an -chi klis -ched i -car net -bas swood -bas konia -ba xi -auri emma -al app -air less -accou tre -ìĦ ł - µ -wick ens -vaxx ed -urban farming -trishay earwood -ther rien -sy ork -swin doll -seon ho -senec acollege -red breast -recti fier -priyan k -priorit ised -pp as -pic cal -peup le -perme ates -pau li -pan handling -pa o -pa ic -out grew -obam ain -nai as -na ep -mis quoted -master craft -mar ak -mag a -liter ati -law dy -kor oma -ked out -jan in -halle lu -guil dof -gentle manly -fu ld -frog man -fran ck -far hat -ech ols -disp uting -da best -critical care -coti ja -ci z -card captor -boudic ca -bou cle -bar ren -ball sy -at ell -ar ata -am artin -akh bar -ðŁĺ³ðŁĺ³ ðŁĺ³ðŁĺ³ -zoey deutch -y ook -wta finals -wojci ech -van illi -un kempt -town send -thar vest -swi ggy -sod bury -slic ks -ru si -ri mi -re building -pro fastpitch -prescrip tive -pp ah -persi ans -of ws -od hi -mom and -mimic o -me j -mccl anahan -marlene king -ly anna -low man -le ffler -je red -have you -haha aa -gw ire -gro b -geo g -ga ara -fv ck -fox croft -dicken sian -di pietro -d hat -cor ne -clam bake -carbon ell -ca ia -bet amax -battlefron tii -alex salmond -agre y -adelaide kane -ad hu -acade mi -ðŁij©âĢį ðŁİĵ -âŃIJï¸ıâŃIJï¸ı âŃIJï¸ıâŃIJï¸ı -yel le -tope leven -theophil us -sy t -sk mch -sd lc -sar do -ra ssi -point blank -outw ar -ou vert -orgul lo -ny it -nature is -mö tley -mo berly -melancho lia -mar cho -lumin ance -lau tern -lab out -kw ak -kru tch -kne els -k bm -ju suf -jockey club -jo inter -jer ri -intothe woods -implo ded -i mu -homos api -hap kido -g mv -for sure -fia worldrx -fel ts -fari d -far ma -fantasy sports -fan uc -ein ar -du y -choo sing -ccm hockey -cancer survivor -buil dit -bri gida -book tour -bew dley -be brand -ar onian -ðŁĺļ ðŁĺļ -à· ı -wolf dog -wo ols -vill ani -u kun -tupole v -ten no -tam al -stil bestrol -stem less -st baldricks -scholast ica -sau t -retro fitted -qu as -pas si -oste opath -noel fielding -myan mar -ly t -level and -ilove the -hunt music -hal ftone -gyro scope -guanci ale -glen bard -gentile schi -ge os -gay ath -gab es -freed elivery -fra gs -forsy thia -fc women -ex pository -elie bers -el da -ego ist -e par -ds bury -dl cs -d bradbery -cork city -construc tivism -con ut -cle ur -biodiv library -b ba -as che -and new -an ette -an er -? ¿ -ðŁĺ³ . -çĻ ½ -âĺĺï¸ı âĺĺï¸ı -vespu cci -vand alia -tri star -tall boy -sweat band -sunday night -st eck -shovel head -shop talk -separati sm -rivend ell -pho sis -pa chinko -obe ys -nomus limb -noah cyrus -nc g -mith ila -minecraf tedu -mc clinton -manic monday -m pesa -le ddy -lb gt -john r -jesusis lord -jesse b -insu re -in sti -im pa -hu tan -hoo ple -hol te -haroo bom -guany in -ger ontology -ful vio -fu li -ers ch -endodon tics -descrip tor -coaching family -clar isse -chi em -celer on -c gf -bogdan ovic -bo ku -birthday yyy -ba shi -att ell -as elfie -ar oll -an tastic -am bert -ad ink -a age -âļ¾ï¸ıâļ¾ï¸ı âļ¾ï¸ı -winni em -verti ser -unsig ned -translat able -ten newsadel -tall ent -tak har -stone gate -sky arts -sit aram -shi rai -seman tic -sal ting -rose mount -rac o -pieter maritzburg -pal encia -pa kai -non point -metro bank -manipul ates -man kiewicz -log ar -liver ied -kar din -k sy -indr ani -in trust -iam king -i kari -horni man -heav iness -he me -ge burt -gam in -gal lus -friday funday -fo ta -e tape -du barry -cryp t -cruel ty -compar ably -cle w -claym ation -che ah -ch ander -boy cie -black n -bel co -beat maker -bcli berals -arri go -acbo fficials -< ~ -ðŁĺĬ ðŁĺģ -ਠľ -¬ë ² -tul li -ter nal -spri ggs -so ce -sam smith -rutledge wood -robu chon -ri sha -potom ac -po tawat -pla que -patr oness -national tree -moombah ton -mm un -lyme regis -kill erton -jet pack -im posters -iamfat don -hf cs -haz aras -fit bit -enjoy the -eastere ggs -dismember ment -decarbon isation -crime sof -coffe yville -civil right -bu tyl -azi za -arn side -alex alltimelow -af it -adelaide oval -ad ad -âĿ Ģ -wicked tuna -vaccin ating -tu in -ta kagi -star ships -south fields -sing apura -shir ted -shi bori -sd learns -sau geen -saber cats -rep mark -r tc -promi sed -porter airlines -par r -p ome -ovi zioso -nou rish -ne ah -national burgerday -mou stak -mark akis -man sk -liqu i -la po -la goa -kuma on -ki zzy -ke ween -k dm -jal ali -inter scholastic -indi ain -i its -hunterx hunter -han alei -ghet toradio -g kn -fif ths -ff w -favor itos -exi de -duc ting -care x -camer ons -breast plate -break point -bhar per -beef y -azmi shabana -au bry -as cot -ann ick -andread ovizioso -agno lotti -ac delco -ab alan -âľ ³ -âķ ¯ -ya al -wunder bar -w jac -vers day -vas sell -twee gram -tourism goi -the emmys -the cur -the bma -tes se -sy rus -swee eet -slam my -sc lass -reck less -pu tyour -pre ter -over runs -oh man -of ra -nj t -ni bal -net i -minare ts -maim ed -magn animous -ma zer -m net -le stone -ko ei -kay lan -john varvatos -jj b -high light -hand fuls -guardian aus -go bearcats -gar dat -fort myers -flacci d -e sop -demb élé -chennai express -ce asar -bio synthesis -beren stain -baesystem sair -an ila -am per -alex avega -abur nett -% % -ë¹ħ ë±ħ -ä¼ ļ -ಠ° -world travel -wor mald -us mca -tyler j -tin fo -sw pg -sun sentinel -su tures -stre ett -ster k -sh le -schu ster -scam per -s yos -roc kie -pon ding -per usal -penn ell -noo tropic -mon tell -mee tha -mar tham -kuch rang -kor bel -kaji ado -i marleneking -hi gley -hi bbard -hei sts -haun ter -har der -gc sa -friend lys -fi daa -extinction r -er oo -e sign -draf tee -del illo -de red -de carlo -cooker y -construc tively -chula inn -cher ly -bou e -bm j -blo cs -atom ium -ann able -al resford -al con -abdel aziz -a hara -Ùħ اÙĨ -wiel ded -wang an -wal den -vin rana -track town -tit ano -te jash -subtrac ting -statist icians -st nyc -smackdown live -shop lifter -she ung -shaf qat -selec tric -sc ba -sad face -ré my -rur ouni -resto s -regal ado -re sound -rb m -pro fli -pre diabetes -pitch ford -pee phole -ostr aci -ok ita -ne bl -lau ria -la ffy -ky ong -jazz day -intro vert -immacul ata -how se -hospit alizations -ho tography -her dman -hard wood -go de -gh ulis -g ats -fox hole -f ellers -en acts -elizabeth banks -ee ep -ec ousins -dra ge -designi deas -delph inium -cor do -constitu tionality -can thus -cam ryn -bukid non -bri ers -aviation week -anti elab -am phi -ale f -agul has -a oc -Ùħ صر -é nez -ymur phy -yar o -x bl -warren sburg -walru ses -try fan -the martian -tele kinesis -stim son -soli h -shaw ol -rick santorum -por tor -plo tters -par vez -par sing -p mm -okon kwo -mu dgee -men cken -ld t -ko slow -klat en -kick starting -ker bs -jo co -in wardly -in significance -ilove makonnen -ig tv -i sher -ho vis -graphic novels -go aussies -ful cher -fon der -eu sew -equili brio -dogsat pollingstations -d tm -ce ta -can uk -c atia -bwo y -br aman -ay el -ash rae -art collectors -arch ery -amo a -adot com -" .@ -yu cky -un nao -team zay -ta ware -street pass -strad lin -speci ation -sk at -si sq -sal us -ravin der -peregr ines -p ama -ope x -o sor -nar di -nag er -mis fortunes -margin alia -mar gs -mak os -m sam -love art -lin zi -le gar -lam on -koi moi -je ppe -its thelittlethings -igh ty -hudson sbay -hei ke -hang ten -ham n -hac ia -g top -fore skin -f rica -embryo logy -el ounge -djafro jack -c gy -bin sky -bet wixt -ben alla -bas enji -baby love -b hang -ast r -ar av -amade o -altam onte -adida shoops -?! ' -"" """ -ðŁĺ³ # -⾨ . -xxxx xxxx -wjac tv -win ship -uniof herts -ubiqu iti -tit ration -sun and -soom ro -son at -sof ascore -so loway -sle aford -si stah -re ser -pro curing -porter ville -n kr -megam illions -lac ounty -ku za -kor in -koo zies -kill ary -jo ssa -it ta -iklan onlineshop -happy friendshipday -gul lane -gu zan -floof y -euro beat -enchan ted -ely xion -ec w -ec entre -cu bs -crucible theatre -crickho well -co geco -chiar afer -cal ve -burk ard -buffe ts -black love -atas cadero -ar nel -app x -ap lomb -ana am -al timeter -al pi -ðŁĺIJ ðŁĺIJ -ðŁĺµ ðŁĺµ -worldcup russia -wood sphd -win spear -wayne state -w spd -ver tes -ve ste -vas sa -uk biz -tol i -thor ror -tat ami -tan sy -smy th -sla gs -silver wood -rum chata -rsp ca -reme dy -ramim alek -q rp -presby tery -optimi zes -ol ena -nfl top -nbc agt -mo aarena -ma san -m pps -lit ton -len et -kw ana -ke z -ke il -kan war -ju ang -jar ritos -jack box -ir van -ir th -huski e -home grown -holiday sarecoming -haz bin -hagg ar -gir d -gard ell -fri go -for ca -fati hah -do to -dal more -d ci -cyber warfare -cil ento -chir k -che mex -born free -bat te -ban ham -austr alie -au spices -asp net -ann ale -ðŁ¥ ľ -wy ong -wood fordre -wom bles -war horse -wa aa -vesti bule -tre pi -then ext -the garden -sugar ray -seaw olf -sc aup -s victoria -ru pa -ro cin -ri ii -ram leela -plos biology -pang aea -oyster catchers -never too -nas m -n gee -mut are -mtn g -mr dan -mal ta -ma im -le tu -kar ratha -jol in -indy wrestling -hodg kinson -frank lyn -francis ca -dri ppin -dak tronics -con desa -co pps -claire richards -canni bal -caled onian -back flow -avent ures -ath ina -ar ve -angel cake -am be -ak hir -ai reland -agit ator -acol yte -a and -== == -ðŁļ º -ðŁĻıðŁı» ðŁĻıðŁı» -ðŁĺı ðŁĺī -ãĤ ĥ -â̼ï¸ı @ -z off -yak in -tre g -the junoawards -terrorist attack -st ager -spe cht -somerse tccc -shap en -sen kamalaharris -se mo -sav ard -re ee -pamuk kale -nutriti onists -nov y -newyork times -naught iness -nassi f -mari ela -maiam itchell -lun din -love with -key noting -ion o -infu ser -hep worth -harry style -harmon iously -good win -g tlm -fragon ard -fin sub -fantastic fest -er rr -eg mont -du ende -disintegr ated -courty ards -burde tt -bur scough -bot vinnik -blin ker -bier garten -bethe legacy -bed bug -anthropo id -al ounge -agu iar -adver b -a aps -âĺ ¢ -ÅŁe hir -up adi -un moved -u pa -the district -tech uk -straight outt -sto kke -sp ittle -soun der -snap yourworld -smi les -sharks rugby -ser re -sedge moor -sead ragon -rhe sus -recycle d -queens bridge -pri aulx -on ramp -ok ko -nen y -n cat -michel ob -mari byrn -lifeand style -li sag -li ann -ley en -leon ar -lar b -lam pert -kom pas -kof c -katv ond -hu bbs -guv nor -gro o -gal o -fo zzy -fer man -el bow -el ad -dar ty -cor ton -co ahuila -be kin -atta i -atori al -arts jobs -art ill -ðŁĺŃ # -ಠķ -à« ĩ -woodfordre serve -whe ezy -war ners -uzo aduba -uni strathclyde -un yielding -u hmm -tun as -team green -t bo -super jet -su je -strongh oldgames -sth all -sp ao -smash box -se jong -scale model -saber tooth -room ate -ron ny -roll i -ro mulo -rahul kanwal -philadelphi a -par vin -nws spc -nol en -ni rav -na hhh -movie goers -mm romance -mid gley -marav illo -mal maison -lori da -lef twich -laur it -kor ine -kamen rider -johnson pga -infantry man -inc ites -ge an -for ro -ffici encies -fam ished -extern ship -dwigh thoward -chuck le -ce ed -cab bies -bla zed -bet ws -be zan -bag atelle -ard ner -arc tica -al ata -ag w -? / -ðŁĻ ģ -ðŁĺŃðŁĺŃ ðŁĺĤ -ðŁĺĮ ðŁĴķ -ðŁĴª ðŁĶ¥ -youn gli -yorkshire tea -x p -wayof life -vu vu -volody myr -vasund hara -var dar -traumati zing -to give -there sac -teddy bear -su thep -sor optimist -sol era -sin ar -sch litter -sc ram -sa bet -rode os -remedi os -re settled -ran ka -qui vering -north cutt -nigel slater -nex en -moog fest -mark tuan -longre ad -lees offer -kor ina -klay thompson -kar mann -jesse leesoffer -il ig -hynd man -harbor side -han neman -ground lings -gin ola -ghome shi -fish mongers -fc cincy -ex claim -every thin -ely sees -dark phoenix -cy tok -co incident -cityof culture -ci mo -cae sarean -bel len -bcel xn -bar m -ba eum -aren ta -z no -yel lowing -xher dan -wood tv -wester man -w th -vo ith -v sat -tow bars -tattoo art -ta phouse -t sim -st ner -ssan tos -spar za -ship ton -scru mpy -scorpi us -school bag -rat tray -ra zer -plann er -piratesofthe caribbean -pherom one -pet sy -p sla -ofor i -od ilon -ning news -ni fa -naf tali -my dog -msk ristin -mm urray -melissamc carthy -li kee -le strange -lapak gue -lan chester -la via -johan son -iter i -house off -hor ny -gu aido -g elli -flumin ense -fire fan -fine wine -film linc -famil yo -fab ry -ec am -eb or -culture trav -cl ung -ch ack -cf ds -butcher babies -bru isers -brebe uf -bo ree -blan keting -bhubaneswar buzz -be wilder -asser tions -amber jack -ag y -ðŁĺľ ðŁĺĺ -ðŁĴĽðŁĴļ ðŁĴĻðŁĴľ -ëª ħ -w ciu -tun gu -scotts bluff -public ised -press ly -pie zo -pale ale -nix ed -newhi phop -ndam ukong -narcis o -mo den -million aire -mand ers -low rance -law we -lar king -la vo -kid suk -in und -immer sive -i ste -haunted house -gov summit -fuse tv -fr inton -f king -ell ora -educ ative -deep ti -cole us -cl x -ck enna -chant ment -chamber music -carl sson -can ad -c sat -bo bm -bio diverse -bet tering -b kk -aishwaryar ai -ag no -af ol -a uni -ð٤ĺðŁı» ð٤ĺðŁı» -âĿ¤ " -xavier woodsphd -wp gc -we chsler -uplift ment -to zzi -ti ent -therain makers -the herd -terror monitor -ter ric -sud han -str in -stl today -ski ba -selec ter -san guine -salu ted -rum mel -republic fc -ree per -ra sc -proud tobe -pro va -pau to -ote dola -news dict -nat arajan -mor ison -mono kini -mcen tee -maris sa -man ar -ma bee -line webtoon -li rfc -lancaster uni -la due -kat o -kan del -in lan -ifu gao -if k -dswd serves -dri d -das ch -corn fields -circuit cat -brunch bookchallenge -bow ker -boat building -bar in -az ra -axis bank -assi ani -applic ators -aper fect -ape e -aha va -ðŁĺģ ðŁĴķ -ðŁ¦ ı -æ ® -à· Ķ -with iel -wil iam -w api -veteran s -u selection -tvweek logies -thru sting -suf tum -stu die -spo tt -sor ors -sajid nadiadwala -robin roberts -ri kishi -red legs -ray music -randy houser -pat or -pap ix -omon di -od endron -nebuchadne zzar -memorial u -maroochy dore -lu rid -li ese -l tu -kit up -johnshop kins -iam santhanam -i arc -hy wel -hot ch -hang ings -ha vel -glo cken -fri gging -fit oor -fish pond -esp re -e hm -dy ke -du q -dave bautista -creep iness -comb es -co ds -claustro phobia -card illo -book fairies -bo caue -billa bong -bass guitar -bart let -aw yer -assi stive -ar ry -ap acific -amo y -al ocal -? ðŁijĢ -ðŁĩ¬ðŁĩ§ # -íİľ íĥĢ곤 -ãĤ ¡ -zo calo -va it -uma ir -travel agent -traffic sa -ton opah -ticto cnews -tah j -ta dic -sport stech -spa strana -shan emc -sep tu -sarac en -re hm -py at -pic oftheweek -part ington -park ade -ou dt -news comau -neutr alizing -nar berth -mtv movieawards -mo bb -mark t -mak ina -leth waite -la france -l ng -ju if -is landia -ink lings -ide ale -hol ac -hat tori -hat day -g benga -faken ew -fa zed -english wine -dead spin -da ves -cory don -church gate -carri ef -cari bana -cabinte ely -bryn ner -br ach -bon ington -block heads -bbces sex -athle tica -am our -am by -am bie -ale aks -ðŁĵļ # -ðŁijī : -ðŁ¤¤ðŁ¤¤ ðŁ¤¤ -اÙĦع ر -اÙĦ ÙĨ -york swildlife -yaz d -wine enthusiast -whit man -wam aga -ville franche -ve sa -valdi via -triumph antly -tony hawk -tizi an -tem pest -tat jana -sli k -sier ras -shau sa -sarban andson -red state -radi olab -plan eth -pis ang -pat ino -or cia -ome i -nor mans -mohamed nasheed -ma key -lower town -lo di -len nart -landscape painting -kermode movie -juni pero -ivy bridge -il al -hel li -gb ong -ff k -distor ts -dis assemble -davi dv -cn tower -chro matics -castleg ar -carls jr -ðŁļ ļ -ðŁij ² -ðŁIJ± ðŁIJ± -ðŁĮļ ðŁĮļ -yaz idi -whit ener -wal green -waf u -wad desdon -w enda -typo graphical -tweetyour friendshipinapicture -tricol ore -tou ken -ste yr -stan wood -spring ishere -smo ky -sle gends -sham ans -sav pak -saniti zing -sal z -s borg -quintu plets -post script -pin elands -pas sau -oscar ssowhite -on ate -nu ove -non surgical -nir anjan -ni ña -nex tel -morning breeze -mono block -mo hi -metu chen -men age -man ca -mal ou -lo xley -leop oldo -ki u -ke mar -kam ani -k mf -jail bird -j suis -j pr -hu ell -g ve -fle mings -feren c -fe asted -dere chos -cop eland -chur i -bu sto -braw lers -aug menting -as pl -als fan -ag ente -after burner -ðŁĺįðŁĺĺ âĿ¤ï¸ı -zoo k -z t -ware gem -vv v -vol kov -vand alize -un mc -udo biz -trans bay -tele visa -syl vian -shafaq naaz -sh h -sf n -sey music -sel mer -roald dahl -pr ing -pick pocket -pa atleti -o leo -nid derdale -mo zzy -mo loch -mis aligned -mets at -m sca -likefor folow -li esl -laureland hardy -la im -kw ant -ko ber -k pt -jun ot -hus se -hon es -hin k -hagger ston -h cm -gr atia -gor l -ga iam -fim mel -feed youra -enor mity -em ley -eli ver -dt p -dravi dian -din an -deathwish coffee -co pics -ck lw -chilis jobs -ch rom -bu ys -baeum ler -av ul -èī ¦ -æĿ ij -zi pl -your best -way fare -wamaga isa -va alu -v tm -um on -tab oo -tab ard -super smashbrosultimate -rhi zo -ra pini -public theaterny -pal anti -pack in -mrpeter andre -lu gh -lat ching -l ici -kuznet sova -kir stie -jos lyn -jesse mccartney -j league -im pati -hei ko -he flin -hap tics -ha art -gre ely -good people -fr aley -escape the -er oute -energye u -dis continuing -der de -defin etly -de ba -cu neo -cow al -clu tter -ci one -cd f -car ma -cal amba -bu cu -ba sham -apil ot -ap sara -îIJ ł -wood cuts -try ing -truth fulness -the aaryan -theaaryan kartik -th ire -tao ism -sound proof -sho shana -serv is -sarbanandson wal -sany al -sabre tooth -re distribute -rath aus -qu ed -nat to -nam ak -midd les -michi gand -liri ano -lig ature -le ey -kay lee -kal yani -in get -gran it -goli ad -g cr -fle m -fla bby -fi qur -fat burger -faith nomore -ero ss -ep stein -dry ad -dist ant -dent ons -demic assiani -dam nnn -daily productpick -coffe ero -bishop jakes -bene tti -bdd sw -ant inous -aise bhi -ðŁĴ¯ðŁĴ¯ ðŁĴ¯ðŁĴ¯ -ðŁ¤¯ ðŁ¤¯ -Ø · -ze tt -wr wc -wi gh -west palmbeach -wa hala -usac nation -un dr -team ol -stack pole -sport stv -soap box -sk ind -simon harri -sap hir -ph ung -par ole -ow yn -oli vers -ni xon -mo ong -mi fune -mel ancon -mas ry -m ÃŃ -lord mayor -lev ellers -kk tv -kh any -ken si -islam opho -inciner ation -her mits -gi gli -friend swood -for king -enchan ts -cordy ceps -copp inger -circu s -che tna -car char -caf u -boon en -bar ter -at ab -ang lin -amitab hk -Ï ī -wak ame -votejames fpp -un dead -tor chy -thejeremy vine -thankyou for -ster nation -steph eng -stein man -spir al -smallbiz sat -seabir der -richar lison -rec enter -q ca -puffin books -pel icula -p onto -ostent atious -opini ones -ony x -ome z -new comic -neel um -nau tique -mul laney -marque es -mark martin -leigh j -kodan shausa -kirkus reviews -ka fir -k mp -it ts -ise o -hil dreth -here in -ha warden -g sw -fidd ler -fi be -dy in -dragon quest -dispos itions -dha dak -dand i -cre swell -choreo graph -ch ir -cfis d -cash cash -bridge hampton -bally more -athanasi us -asso cham -anai vanovic -ðŁĮ»ðŁĮ» ðŁĮ» -ह र -س ر -vin oodh -shom rim -sh rank -savi on -ron gai -res ents -re assembled -qing hai -produ cex -prin ting -pal am -p mpc -op ene -ole ksi -oak park -nb m -mus que -mi ér -mg l -maje ure -lu met -line out -life hacker -joz ef -its worthit -iti ka -is ki -inter facing -indy car -incur sions -in breeding -hurry up -hir ano -grand ads -gal lie -fer man -endome trial -e les -dor gohome -djan go -dear den -dand an -cu pped -connol ly -colour less -character art -bu stelo -brech ts -breakthe internet -brack ish -bm z -blue dot -athar va -ala id -acu tie -ach ange -> /// -; ' -! ": -zu mbo -yo do -whadd ya -ver band -tri pods -tre p -they ve -the travel -the offic -st vincent -squ ib -spo or -sphy nx -r pw -pull man -pray ag -pic cata -per is -open gov -ol ture -nem ours -mute math -mu ti -miner ality -map box -lland rin -kim davis -jail er -id f -hydro graphic -hul ks -hollen beck -ho bble -har ken -han ews -ha a -gor sein -gal ton -es boeck -du guid -derail leur -co wer -close thegap -cell ini -cameron newton -br dc -bo or -beste ver -bas smusic -bam teddy -author life -actu alization -è ½ -âľį ðŁı½ -yn ys -y lo -vap id -trump y -tow bar -teh sil -str s -stit ans -standard bred -spring boro -shar ona -shand on -sh room -rand hir -rah me -privati se -pierre bouvier -pa kar -oy al -o qu -nye rere -np ci -ni dra -newss yd -ne ef -me v -m stad -lis icki -jen ning -ion ic -im bula -ick x -hy phy -haley reinhart -germin ated -gag li -fo ckers -flu sh -e sai -e gi -dise gno -demo ed -clo e -clo bber -cant stop -bu ttes -bo han -bent all -ax p -ari ums -argon aut -_ " -ðŁķ ļ -worker sday -wis den -w cbd -u at -trutv jokers -tre w -teat re -subpo en -si ad -sen ation -sap ele -sag i -rival do -ri probin -re vises -pott sville -ny cw -nt fm -nh mrc -ne ches -mun tari -magnit sky -kann on -kade em -j stor -i qs -hy th -hy fr -hog wart -gra ving -godbless our -global citizen -girl hood -galler yof -fabric ant -everything nyc -engag ement -ed cam -dul ity -dri bbled -dr amar -deccan chronicle -colo gy -code of -cap elli -c do -ban jara -atop ic -ati e -allen by -al pe -ah ills -ðŁį» ðŁį» -ë£ ¨ -âĽĪ ï¸ı -yuv raj -vi ver -v ahs -un buttoned -the in -tex change -tar g -swad lin -super conducting -sugi moto -sta ghorn -social marketing -si dious -schmal tz -sarrain odu -santi gold -sag meister -ru pay -rough y -oun dup -ou ston -oppos able -operation smile -min os -mhi esboeck -medi auk -ll ys -kir st -ke io -kate upton -kara age -jack wilshere -gal adriel -fans bts -dirtb ags -dialec tic -devi ated -dah li -cull er -crystalli zation -cory ell -club foot -cal in -bm g -baby bel -ark adelphia -ann yc -am organ -ðŁĺŃ ) -ðŁı Ķ -ä¹ IJ -âľ ® -ym ack -yax ley -wit ney -win on -wh an -ween y -w angs -vu illard -uc am -triste sse -th c -sun dogs -state lessness -ssi g -rox borough -remin er -racer mag -ra hn -qu alia -prab ha -poppy seed -piac enza -one championship -official mopar -neutr ons -ne hi -n hai -mat tox -lynch ings -lyn am -ligan ds -laur ac -kam elot -jeffre ss -il am -hottest dayoftheyear -hockey fightscancer -hi ki -hass ani -glyco gen -esc ola -effec tor -dor ma -din als -daz z -coton ou -cigar life -chryso stom -chick asha -chee tah -bug les -bu tina -benalma dena -ax minster -am ref -all round -ai ri -a ing -? ~ -ðŁijį ðŁĺĢ -ëĶĶ ìĹIJ -د ÙĨ -yum miness -yu bin -vinyl junkie -tra ppe -tony bellew -tn ite -tb ay -summ ited -st ary -skyracing au -simonharri std -sig mar -shi flett -school craft -saliv ating -s thetic -rot man -roadto state -remain er -oli day -mon star -moder ns -marie ke -main street -ma ik -li hat -kat ze -j tg -iter ates -hereto create -goo dridge -gli de -glasgow cc -fati gued -eric john -easy going -diver gent -digital marketing -di zi -derma us -de chart -dad aab -collecti f -chuck wagon -car suk -camper down -bran k -bou lang -ballist ics -ash verse -aksh aya -ðŁĺĬ âĿ¤ï¸ı -ë¶ Ģ -winter meetings -white water -v aper -tur kistan -trump f -thel or -the starters -the fin -t na -sho cker -shi ppo -red gate -pun i -pr v -or kin -om aldini -og more -nj rotc -new scenter -mv mt -monu sco -med lock -lec los -lal anne -ky lec -kt bs -ker bal -j anya -isd strong -inter war -hyde park -hoo kin -hockey roos -hei den -göte borg -grant thornton -factor ial -equal marriage -e gar -dev tools -del mas -custom ers -case book -cam co -calstat ela -ca ho -c gd -botetour t -bol g -bear sears -avori az -argen teuil -al ac -aco tta -abudha bi -ðŁĮ± ðŁĮ± -west word -tar bert -tail back -sush mita -stric test -science march -scal ped -sar dan -sab zi -sa o -run nels -ro tham -revol ts -replic ant -r ously -po ti -pilli ga -out look -nu ba -n mm -n ello -mind thegap -mil ch -messi aen -me se -malign ancies -liza beth -la din -ka at -ju mat -joaqu im -jarry d -j rb -iom mi -invigor ated -har un -govin slee -gon do -gil let -g news -freddie gibbs -fre sher -follic ular -eric metaxas -elo ck -dumb asses -dri vel -do pp -diver gences -cymbi dium -cs russell -coke studio -ce sena -brig adoon -bre h -blood less -blaen avon -bhar u -ber ke -bat ok -ban sky -bac io -asser tiveness -amag ansett -alwaysin our -í ŀ -zon dervan -wild pipm -widespread panic -wear mouth -wak ka -under sized -un cooperative -thin ku -st pauls -sinter klaas -shro ve -ru bel -robin ho -ro is -pre med -po di -pen alty -old photos -o witz -memb ering -may fire -masc is -mag ness -ma bey -london stockexchange -len or -kod ama -jim mer -it ap -im f -ie i -iamj hud -hypothe tically -gur sky -gh un -gen ge -fore heads -fo i -fli ed -fire crest -droo p -do olan -dim and -de value -d to -d ks -cor po -cond ado -comp sci -commit tothe -cla ver -carmel lawwe -bru mb -bigi deas -big bear -berth old -audi of -assassin ations -art sed -ar mee -alim ent -? ;) -ðŁĺİ âľĮï¸ı -we bos -water skiing -ve ee -v af -un bowed -to yah -tm hs -the wolf -te sd -tand ingan -takra w -symboli zed -sukh bir -spring day -sell outs -sc ylla -samard zija -re published -pv m -pu kh -os w -or na -north way -nico let -n gai -mun shi -mg ma -meh ran -me is -luke bryan -lef twing -lapakgue com -lan kans -james b -id bi -ick ens -hello oooo -hardik pandya -gatecra sher -fr ates -fountain head -duc t -donnyo smond -don iveson -chi pe -ce va -car to -car makers -bosch etto -bon dy -bo cc -big by -benson hurst -bel os -bal len -b pb -b dy -avoc ado -av ailed -as d -an ay -work days -union dale -un packs -tw all -thra sher -tan ahashi -tai sha -suf field -star sports -sin ner -pri l -pml n -pie tahouse -pic ot -pf n -or on -on ette -monon ga -mit suru -maus am -mat tu -maruk mani -klu tz -k tar -jo bless -jerry garcia -javedakh tar -iq bal -he marukmani -haz an -hay nie -gun reformnow -grav lax -gol akers -get loud -germany tourism -garyclark jr -for dyce -fen di -eu metsat -endy mion -eg ler -eco bank -du ffin -du ale -do wel -co klat -car nie -cant ine -brad l -bau mer -baf inals -ath omas -ar gan -ar dy -al kan -ad journ -ad ders -.. ðŁĺĬ -ãĤ ı -wor leans -wo om -with nail -wim mera -usc apitol -tidal hifi -ti sd -thelast kingdom -the dirty -tez os -tendin opathy -team depot -takeit back -stann ard -sp itz -smy ths -sheer ness -sen sherrodbrown -river island -regu lus -ray ment -ran z -plu it -phthal ates -per ham -nu c -naruto shippuden -mountain life -missi o -lore en -leon alewis -keeptalking mh -karam bit -kar rie -ka iri -jehan gir -jed d -himm ler -himalay an -hesit ating -gen tian -garden ingtips -gam mal -fl ory -ellis ross -el low -dayin thelife -cross winds -chen junga -broom ball -bi ffy -bi ani -audio logist -ard namur -amg medikal -alien ist -al av -acceler ometer -!!!!!!!! !!!!!!!!!! -è ¢ -ze st -yearofthe dog -wn bc -wit w -water boarding -w gl -vicky gshore -v ite -un pretentious -u id -ty vek -the jimmy -suz u -street sville -staple ford -spring iscoming -sp lott -sound proofing -sol on -sla bour -si que -schu ld -sc astle -rubber band -read me -pup date -prow ling -ped die -oli vera -nip gaming -ninj at -nation alistic -nand itas -n bb -mtv awards -ms morgan -mat lin -kum kum -keepthe faith -in frequent -hms gofficial -hi xon -got ti -fla ils -final mente -figur ativeart -f po -doe sit -do var -decor a -coupon ing -corn elis -cal academy -bra swell -blake man -bel inda -b vt -arthro pod -am pion -ali ases -ah alli -ðŁĺı ðŁĺİ -zim my -z tao -y co -war band -vent ura -v ayne -ut ty -tun sil -tu mh -truss ardi -trump sarmy -tol ler -the mad -tam borine -stir fry -spor ad -spe ter -shoo da -shat ch -seabirder saturday -rwin p -rele c -rel o -quatre foil -pum phouse -perfor ce -pas sy -ot ani -noctur na -my thri -mitsu ki -mil stein -mb fw -mason ite -lunch room -lingu ini -len ora -lat rine -l rb -jes elnik -jerus alem -jan ani -itsdre desu -gan ar -gad is -fa heem -east west -east of -dues enberg -dro r -disobe ying -develop ing -damian marley -bor abora -blo que -be les -bar ka -bar gh -ava asi -ash in -and furious -ab idi -ab ab -ðŁİ ª -yes bank -welcom es -wan go -vul ture -vel dt -tr ally -tongar iro -ten aci -team tennis -table au -syos set -soo th -sli ema -short listing -se ka -save your -sap o -sabi ersack -royal court -pronoun ce -phil amuseum -notyour shield -nit ya -mugi sha -mike brewer -me yr -mat to -ma ku -lang land -klein isd -kan chana -javedakhtar jadu -is ss -ip sos -hoop fest -heli port -hard covers -hangten stories -fresh ened -for ti -fern wood -entit le -end z -doubt less -del roy -davidson msp -d é -count yof -contemporary artist -climat ec -chri sabiersack -boy ardee -balance d -bal akrishnan -back a -as as -ar ant -apo c -anton newcombe -anab elle -amul ya -alexanderwang ny -ah en -agbon lahor -aa ir -âĺķï¸ıâĺķï¸ı âĺķï¸ı -á Į -à© ° -zheng zhou -zag at -y ago -x os -wall onia -vector ing -uni fight -uk ta -turn about -tok os -ther oxy -ta wak -sent ul -rae burn -purwo kerto -psycho logical -pol der -pin ata -palen que -pa the -out bid -moustak as -motor head -mel is -me can -mcne ely -koraku en -john nies -jj horgan -ish ak -ii hm -hypo dermic -honky tonk -gat sby -fru g -dog stagram -disav ow -cut cliffe -costu mers -chal isa -bro ssard -brittany force -bl alock -bere ft -atur als -and ina -al j -ðŁĩ¨ðŁĩ · -wh acker -vio list -van doorne -v iti -to kay -thunder bay -shar q -setit off -se kou -sare humanrights -sar bj -s ard -ruth davidsonmsp -robit aille -recor ds -pu ch -phyl la -pastu red -papix ure -omo tor -nostal gie -ni endorf -morethan ever -kun ene -kin n -ki kwe -jab baw -irish rail -impro pri -hotel news -hil ti -har preet -hah hahaha -gv n -gla dden -gam est -fo cals -fit ts -ferdin ando -drg pradhan -cros stown -clou tier -chain saws -blue green -black tip -berth oud -beati fication -b hol -aw riter -auto tune -au ren -ash tead -alberte instein -ðŁĺŃ ðŁĻı -ä¼ ļ -án gel -z une -ya ad -what eva -weekend getaway -v online -tx st -to iling -tm ro -te bal -takam ine -t mk -sv illa -straigh tens -sti fled -sizz la -sh tick -sav our -reallys wara -que chua -par ys -ot amendi -oc les -o ded -nom adic -mr jake -monument sforall -mo go -mikare yesss -kup p -ku ant -kho i -it Ãł -isak son -is sima -huss ar -hobi day -hel in -hay wards -ha dy -greas elive -gho stinthe -fla shi -ev on -el mont -earth quake -e wwww -demary ius -dead locked -de bbi -dar linghurst -bathin da -bat ley -arch deacon -aquab ats -ally pally -ad lib -:' '' -" /" -ëıĦ ê²½ìĪĺ -year swithexo -win ged -weather bug -walker ville -ur qui -unab ash -tor tola -the farm -stran ahan -stag i -sbu x -sachsen ring -ron it -reminis ced -press on -pop ham -pel ÃŃ -ov w -oc c -nne ka -ni jin -nc ta -national wineday -michaelrosen yes -mar chin -lec a -lanc o -kodak black -ju mm -jo fa -its cominghome -il oni -hur dy -ho pel -garden shour -g summit -fore shadow -f hq -esqui vel -elyn ch -drupal con -con kers -cityof ct -chantic leer -chand u -ce at -car bun -bru ja -bow doin -bl under -be our -baz on -ðŁĺī ðŁijĮ -æĥ ħ -âŀ ł -à¸ķà¹Ĥ à¸Ĭà¸Ħ -whitt ing -up n -tx a -twel come -tu cano -treve cca -tobo gg -ste ig -sol heim -soff it -schlitter bahn -sar taj -sanc tioning -rott ingdean -road cycling -re vent -press room -pe ver -pav one -officialap cng -ny bg -nau tic -moong low -melis sas -ma ino -limou sines -lil wayne -la at -kul bhushan -ko ka -khu d -jo ist -jesseb watters -io tv -hi ddles -gt k -gro dd -em maj -down grading -djen vy -deliber ative -cri scy -cram lington -courmaye ur -coo ley -clay field -chiarafer ragni -ar ani -aggrav ate -access or -ðŁij¶ ðŁı» -ãĤ¢ ãĥĭ -âĹ ł -zi elinski -y ena -w ly -vic fires -v air -tro ost -the current -stray horn -sile stone -shadow of -secretari al -scott aukerman -san sebastian -ro ke -richa chadha -refu ted -real radi -pom fret -par dee -par ashar -p sia -mu li -mey te -mer guez -mc garvey -kathr in -john cleese -job son -jair us -ir na -intercep ting -hu dd -hor sing -ho yo -free entry -fi zzled -fanci est -eve t -eti had -er ace -en ae -eag leton -dynam o -de met -com passes -circle ville -chennai fc -can so -bobbi brown -baili ff -assi sted -albe do -ai yar -ðŁıĪ # -ä½ ľ -âĪ Ļ -wide out -v agov -ub hornsup -tracee ellisross -tla ib -tin toretto -the stroke -t ling -sw oops -su mba -su ir -spread thelove -scottish cup -radi x -qasi mi -puppy cat -psychon auts -oz aki -octag on -nen u -mu mia -middle burg -mari ans -lu mos -llan ish -legal isation -ken edy -jazz man -in exhau -i xd -hear tened -hand wala -go camels -g db -funk master -forbidden planet -f ous -ex cori -duc twork -dom in -diethyl stilbestrol -dic ing -den ims -democrati zing -cre spi -churchof england -boycot tisrael -be fikre -badbad notgood -ab cc -... âĻ¥ -! ?!?!? -ðŁij¨ ðŁı¼âĢį -ðŁĮ ĺ -yn ine -wing men -wence slas -villar ai -vesu vio -verti sing -vener ated -un schooling -um ra -u van -tul lahoma -stit an -steff ens -stand upp -ss outh -squee zer -si bb -shira stweet -sf k -scrutin ized -sch wan -scani auk -sbar ro -sai fu -rin ker -rever so -re aped -ray town -radiofrequ ency -pur ty -psy chos -predomin ately -personi fies -ov h -oc w -nhra onfox -nde bele -nc caa -me sc -mc faul -mc ad -matte is -man die -mag anda -lei sha -la brad -kuant antv -jen nal -ichi gan -ib n -hill view -gro ene -gran ton -go di -french ies -fi ke -e ggy -du oden -do cus -din go -design studio -che oil -carac alla -canon ically -bu ssy -bean pot -be dd -bal it -ar landa -ang liar -ag euk -a ï -- ! -ðŁĴĻðŁĴĽ ðŁĴĻðŁĴĽ -z k -ya haya -un impressive -un ge -tri ppy -thisday that -the iron -the advocate -tempel hof -swa ins -sun valley -strengthin numbers -stop arming -si ums -si swa -sciento logy -sam bulance -ringling bros -rich thekid -reinst ates -pollinator week -perre ault -perce ives -nichol son -my home -mate j -l ors -kö y -ke mah -ke betu -join ers -jar rah -jac s -i afc -he rer -green market -gone wild -fun neled -fro ad -en cyclical -em dr -elek syon -ecol lins -e ol -dow o -cortic oster -comple ta -city uk -ciopp ino -ci roc -char bel -bok ke -bel ies -bac up -ant davis -an thers -a key -ðŁIJ¶ âĿ¤ -y pur -wy combe -ws ls -wo hl -white girl -whit elaw -usc ollege -telefun ken -tami ami -tal y -tal uka -su ed -steve scalise -so in -snow leopard -sean m -remembr ances -re ticle -ravens flock -radio grapher -port auth -pic of -pen ryn -pay nter -pain tin -mec can -me ara -magen to -lan yon -lan di -jag ex -jade ite -her iot -go cougars -g pb -fri ary -for tier -faf atl -ev enter -du ress -din ks -cu bes -cro zet -cri c -cou illard -contra ptions -chad derton -carly pearce -c sps -bur dette -blau grana -ap ahm -anc ar -am ta -ajit pa -abstr acted -[ [ -ðŁĩ ± -ãĥ» ãĤļ -ãģ¤ ãĤģ -win ce -wedding season -w apa -til lot -ti ssier -ther monu -tall on -take downs -super corp -sat yam -sam paoli -sam iti -sal tzman -sak ina -ry on -rust am -rother hood -road maps -rim less -ri ze -recon cil -ra ibh -puppete ers -prud homme -photo copier -pe cks -northern powerhouse -no isi -mu deford -mor tally -mi h -mediterran eo -mcclat chy -m ells -low carbon -lo sc -len n -lark hall -labrador retriever -kres ge -k nap -just me -jun gy -j ire -i shootfilm -hex tall -g ages -fin dit -festive season -favourit ism -fab ians -emplo yer -dur dle -dic en -con tax -clu bland -city schools -city place -cit sci -chi bok -channel tv -ch nie -box sets -bo zza -bertu zzi -bert adores -bar tomeu -back tracks -ba auer -ap lu -ang ad -ag el -adal ah -yeng pluggedin -w ck -u ys -u ppp -trigger fish -tri sten -traverse theatre -the onion -tax a -statu esque -stand in -sp ia -si vag -romeo ville -re eb -po tus -pherom ones -on wx -oak lawn -ne ave -movie star -ment i -made to -mac lay -kin naman -ingh e -il mour -hasle tt -georg elopez -ge is -fixed gear -femen ina -fan nie -et ter -en oki -eisen staedt -dusk till -dr ine -detroit news -cro tty -co sta -christinec aine -carn forth -card games -car jacked -bull is -bou lev -bo gue -blackbear nation -arm stead -amur ali -amo tor -ambaz onia -yu kiko -webster hall -war ning -wa ian -vic ars -ver bi -universal pics -therolling stones -tab ith -sun unu -sky fox -should ve -scen eries -sarahpalin usa -rehabil itating -re stle -re if -re grouping -po ore -pa ine -og bon -nl proc -n ere -mn th -loosen ed -lett in -leave eu -laur yn -lalupra sad -jrn tr -jen ison -jelli ed -j hutch -if w -i justine -ho ys -hann elius -guide tti -flo ppies -fiq h -eli zondo -donnab raz -do el -dham aka -cri sper -bon as -billion rising -be ers -bar rons -bann an -ake d -ah lu -a ari -( !), -ðŁĸĬ ï¸ı -ðŁijŃ ðŁĴķ -ìļ° ì£¼ -why alla -upri sings -under cooked -u fw -sp its -south mead -slo a -sisy phus -shr m -shon daland -pum meled -premier inn -phal ke -penn medicine -pel é -ol n -nun atsi -neder land -mon sey -mic drop -mel fest -man en -maho pac -lu mo -li kk -le ese -lat eness -kof xiv -ko hima -kh h -kab addi -k cci -iq a -in tosh -in cy -iberdro la -head ass -hal ab -go gol -g gi -fur babies -fi shies -fb live -ez ell -enric om -dun nock -don nas -crow ley -clo d -chu d -cham bo -cadw wales -bow ens -boss babe -bonne affaire -black wing -beast master -bay ani -bad dhan -ba ther -auton ation ----- -- -ðŁĵ² : -âŀ¡ï¸ı @ -yat sen -wing lets -ul in -trepi dation -thegn show -sugar bush -srk chennaifc -se ic -scru ise -roo se -ri mando -re ith -re installing -re gress -philly sports -par ser -oo ficial -offici a -nouve aux -n ton -my la -much acho -mc mahan -le wan -laura jane -kan goo -jeff co -ja ane -inspirational quote -indign ity -i iss -homen aje -high veld -g dd -fu lop -ende sa -dropkick murphys -decentral isation -daysof summer -cute eeee -com pos -certific ated -call is -bair n -bair dmp -aud peeps -ati ka -ac da -ðŁ¤Ĺ ðŁĺĺ -zeig ler -wick en -was c -u maine -twitter sphere -ti el -terpen e -tele performance -sw anny -sv f -su pramo -sap ul -sand akan -rough neck -rema sters -philli pines -pe king -op ta -mn dot -mcla urin -mar kan -ma sted -kore and -k link -indi gnant -glob ali -gentri fied -g aku -fuji mori -fright mare -euse bius -eman ate -du fy -dil o -de palma -dat is -curv aceous -cu co -cross man -crazyex girlfriend -cosme tologist -con senting -bull mastiff -bu shiri -brand sanderson -boondo ggle -ðŁİĬ ðŁİĬ -⼠¸ -z den -ye adon -whel ans -we del -wc p -w smith -w asse -ut is -ur n -thepar raeels -the bridge -tat atru -tail backs -steel works -sno biety -ru hl -ron icles -ration alize -photo g -p du -o tak -neuro sciences -narcis se -nam ethat -mo anin -metro town -merci fully -mccu sker -mas n -m ams -ky leg -ited fc -house ful -ho ye -heine mann -hed wi -har den -gri gori -gau har -frac tal -four ball -fok ker -estre lla -engineer inguk -electro house -education ist -dig cit -df v -crouch end -co sey -cin ch -chi z -ca steel -blood stone -bg ca -ben simon -barn storming -atul co -as ke -allu vial -ag co -ace tic -ðŁĺĤ ðŁĴĹ -ðŁĹ ¼ -ðŁijı . -ðŁij¨ ðŁı½âĢį -าภģ -ver sova -ur dd -tra baj -the blog -tem pos -tb day -super troopers -sto king -sep ang -secu isine -sauro pod -sas b -rose man -ray qu -pike sville -pa ig -ohmy girl -nl f -musque am -more in -mike bairdmp -mic hell -mi jo -med aled -mall u -m pos -lu bom -laugh arne -kar nal -inf en -hillaryfor prison -gri ms -fu si -fu cc -f ynn -ed ness -dry point -direc teur -dir ndl -del rio -de mond -de angelis -critch ley -conme bol -cam pa -brah mot -blu ray -bhak tapur -bal dess -art form -art challenge -aneur in -ad oodle -ðŁĩ¹ðŁĩ ³ -ãĥĿãĥ¼ãĥĪãĥ¬ ãĥ¼ãĥĪ -z acks -yil maz -yanis varoufakis -ya sho -un ang -trans cona -tran spires -tel enor -tar sier -talent less -ta kano -ta io -sp outing -si mic -seol hyun -scru ton -ruby onrails -rose au -pro hm -pro cli -po ie -plan ck -photo bucket -perspir ant -p km -northeast tweets -musc adet -micro fluidic -man ico -mak ki -ma ppa -lawn care -ko skinen -jet brains -iri ver -holtz claw -handker chiefs -fri sby -ef oundation -east lanc -dis engagement -delon ghi -de andre -creati vidad -cerys matthews -caram els -boy sin -bha gnani -beacon theatre -bak kie -azz arello -anima ux -ambas s -âŃIJâŃIJ âŃIJâŃIJ -Â Ń -yu li -y ts -x kr -x bo -wearec isco -wb afc -vs buf -tx stormchasers -tran i -tom ei -tam ela -super men -stef anik -stand aard -sor achi -si xt -shrou ds -short all -sh ound -separ ations -re negotiate -ra sha -pleasan tries -ple asee -plaster board -per chance -ost see -nsw votes -naval academy -mon donews -me sto -mar yl -ma po -m nek -ly ph -long stocking -local host -lead gen -l amaze -kit ab -k usi -k host -he ren -grati ot -go van -gen te -fri sian -fran nie -forever more -flu ker -em ine -don nam -dd an -cou verture -clen ch -citroen racing -chit ose -cast lec -cam bri -break free -bre ves -birch box -beach combing -ash ra -al mer -ðŁijį ðŁĺĤ -ðŁ¥ į -zer ot -za atar -wing wednesday -want z -wa chter -une qu -ul ti -tuf ts -thunder head -the super -the cup -ta ppin -side cars -seun ghyun -sebring raceway -sa qu -s stv -reas sur -pan jim -oro b -op ane -onec cps -on enews -o iling -ny mex -north rup -news comau -nbc boston -n ill -mo lise -mi miko -matthai g -mati gary -mane ka -man dias -mach inists -li dge -la dera -kal ama -je unes -jac c -ho shino -hick stead -haroobom kum -fresno grizzlies -f pt -erit re -eri on -en rolls -e plenary -do pa -dl ach -debor d -color ful -col wood -col oma -chuck schumer -cactu s -bot ley -am anita -ahsa pocalypse -." âĢĵ -ðŁĴľ ðŁĺĺ -ÑĢ Ð¾Ñģ -Ê Ł -yel don -wit tier -white mugh -whitemugh alsfan -volcan o -viri dian -vac lav -unstopp able -un shakeable -tru ancy -thu ggish -thra shes -tel les -taye b -tamal pais -t gn -swar t -suit up -su tras -su pes -sten ciled -st roop -sin hal -see me -sati ate -san carlo -sab atini -rpg maker -regn um -red it -profess orial -politi fact -phy llo -pag nell -oxidi sed -oss off -now youknow -navy seals -myx philippines -mor r -moor man -mon tour -man eater -mai ya -lub na -london portauth -listen now -lind holm -lib bey -la sti -kol ly -kir shner -khu t -j woww -j kia -intervie wees -ham ba -green edge -ghost stories -fire light -eng al -dü rer -dv l -doppel gang -deaf blind -dab ooks -conce it -career builder -beso tted -ber had -ba reli -awww wwww -at kowski -art ner -ala ji -ðŁĵ Ļ -âĺĿ ðŁı½ -Ñ İ -yi h -writing tip -w utv -uk football -tw rp -terr ill -tech con -super cut -sto on -stabili zers -spa ghett -slay ton -sin ful -si keston -shof ar -shamp oos -shal ala -rupert murdoch -rich homi -redun dan -rec co -pre biotics -posta pocalyptic -our cog -nib bler -mur mansk -melis andre -mat agor -marcu se -man hasset -lic eu -lead on -kelly monaco -kel ham -ini us -igers italia -hor nac -hei ze -free wheel -feed lot -far falle -eng olf -em beds -el mann -el do -compan ys -coll ating -ca thouse -be mbridge -ball out -b corp -ai ya -ðŁĹ Ĵ -à¹Ģà¸ Ī -zo har -zak u -whale watching -vern ation -up next -tek kers -t vos -t elli -swasti kas -sail ings -ricci one -rep tar -rah man -perk sof -os at -no thin -naomi wwe -mosko witz -merit age -mc ds -mar occo -mal treatment -mac leans -lu bav -lo ps -laro chelle -kun dali -kar jakin -k sk -j mi -inter media -ing u -in forum -her old -green port -fra kes -falken tire -excell ondon -eli ud -dru itt -dailypost wales -common ality -charle sd -cbc music -cat or -carri galine -black sweather -betje man -beh rend -au dl -atre yu -an cher -all ondon -all at -air date -afl swan -__ _: -ãĥ¯ ãĥ³ -zu ck -zeph yrs -was ay -w fu -the business -th ent -sp rep -sat or -sal ada -ren fe -rebel heart -rai ison -poly tunnel -pitts boro -phillysports birthday -newscomau hq -mat ure -mac coll -lam mer -keralafloo drelief -jay walking -james dashner -industrial strategy -horse meat -heal esville -he yo -gal ecki -fighting irish -fier stein -fear ne -escap ist -def ers -daed alus -costan zo -convic ting -cli st -celi bate -care sses -canop y -c tia -bru net -bir ger -bigre ds -ballincolli g -aus mus -aquar ia -an sh -al bino -. !!!! -ìļ° íĺĦ -âĿ¤ï¸ı ðŁĻĮ -who vians -who se -wey smith -vineyard vines -vex robotics -val mcdermid -under oath -un built -u dom -u cas -sy ll -swa e -stri pling -skir ted -she been -sea vey -scab ies -sag ada -repair man -read mission -rambling sloa -py att -philanthro pies -pat ently -out scoring -olympic team -off cla -nicole kidman -nes sun -nd k -mor aga -mahar ana -lsu football -low riders -lazy day -kle ptom -kas ka -je ena -j oos -inde scri -imc millan -il legible -hir sh -he tte -harri gan -happ iest -hacker space -gon y -fü h -fin dom -emer ia -ede weysmith -dynam ites -dejav u -co relle -can ker -ca ther -btv i -bm u -beath high -bb sr -as ing -ann amalai -alan dia -air dropped -. ,,, -æľ¬ æĹ¥ -vil ified -usur ped -ton sil -t we -t nie -svs zombies -stour port -sporad ically -slumb ering -sec md -sai dyes -rm wb -radio logic -proud principal -pho bias -pedi alyte -ong seongwu -nore aga -no limit -neu stadt -ne eti -ndi aye -nasty a -n mbs -me cs -massimo bottura -marcusle monis -mad child -ma ba -lo chan -ld in -kri sz -k anna -j hope -hy g -hornac ek -hau raki -griffin mcelroy -gli oma -free zone -fail sworth -ent ous -enamel ware -ema i -ec as -dre scher -de ment -dal os -cr p -cinemato graphers -bal ak -ar bo -ah re -ad oni -ðŁijį âĿ¤ -ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ãħ¤ ãħ¤ãħ¤ -« ล -west phal -watch os -valky ries -v ci -ut k -up govt -thought ful -term limits -su yy -spen sgen -skane ateles -san lorenzo -ryan phillippe -rw p -roller blade -rep aving -re j -po vetkin -per ine -oxy contin -os su -opho tography -occupy wallstreet -o dun -nth qld -nb alive -men ews -mar kel -mad catz -lov ins -loren tz -le ana -lal or -jr nal -it le -in stigate -i kes -hall mar -ha ggle -gn abry -fu git -fra k -eutel sat -dysauton omia -dre west -dew berry -demetri ous -deh li -circle of -by att -bi dad -au man -ar col -ak ure -aes q -advers ities -... ðŁĺı -... "- -ðŁIJ¶ ðŁIJ± -âŃIJï¸ı @ -wat aru -tra han -tex tron -spoke smodel -shon an -sh els -scra pple -re builds -phil mont -perish ables -patt an -pam ir -ondre j -night beat -nas s -mu ffy -mononga hela -melo di -maru ti -mall galleries -ly dia -lov ells -lodg ings -lin di -larry kim -la spal -la phil -kwankwas o -kokkin akis -je en -jayalali tha -ha sling -guerre ros -footy accums -folklore thurs -don ard -ditch ling -deli sted -dai ki -civil isations -celebrity cruise -bitcoin news -biaf ra -bi bo -beha vin -az amar -asante kotoko -as eries -ar imel -an nes -ala ia -adel ina -& " -â n -zulu land -yourad f -wa hm -tweetapicture of -tra duction -t illing -sun dries -story books -scul lion -san geetha -ru af -ro gel -respir atory -re sham -protec tyour -pra desh -pier cy -pf re -pc games -no h -night shift -nh lon -nat z -ms j -marti an -lö w -kids grove -justin ian -john abraham -itsgreat uf -ired ale -herd wick -haupp auge -happy customers -ham sik -haim theband -h end -gibb ard -fa thi -en via -ele vy -divor ces -digi mon -crawfords ville -cr its -continu o -clo thier -chow chow -change up -bukas na -btr tg -bern ina -bc beer -bal de -analog ous -am way -alz scot -allagash brewing -all lllll -aig le -ad na -ØŃÙħ د -ze h -wind blown -wid ne -ver if -val enti -u inta -tra vi -thisdaythat year -swe ta -support smallbusiness -spar alympics -so ong -shi ites -sere bii -sch litz -sa idi -s dorp -ruffi ans -rome tty -rl grime -resili ence -re possessed -pur pl -pride ful -poly gon -pearld rum -pae vey -out la -ote p -orient fc -nannakuprema tho -memphis redbirds -martin schulz -mal abo -lay den -l st -kom et -jeopardy sports -j jp -inmar sat -hode idah -ho witt -hi les -gri pes -ga iters -fric ker -ev aders -euro money -economic development -e hud -drop outs -der ie -cre tins -corro ded -ch ittenden -brutal house -biopla stics -bi zzy -bar thel -atit lan -asi er -à¸ģภľà¸¥ -z era -yam cha -wak fu -w wat -vo ted -try an -travel wi -th ais -swamp thing -stylish star -sour sop -son ido -sk erry -sham bala -sh renu -round tree -riprobin williams -re taking -penny worth -p slv -news round -na ila -manc made -mal ec -ma brouk -love me -long hairdontcare -ling er -li gon -jordanb peterson -jason voorhees -intrac ellular -infr actions -indu stri -iann one -hybri dization -golden state -glycer ine -gastro paresis -gad dis -future house -fur ukawa -fi stic -euro copter -en ye -emili orivera -dr aceway -disco lored -di paolo -dag g -com andante -clean ups -br ary -blom kamp -bir m -ber go -ba tha -ayy appa -american sniper -afl fantasy -ðŁijıðŁı¾ðŁijıðŁı¾ ðŁijıðŁı¾ -ì¢ħ íĺĦ -ãģ ĵ -wgn radio -wedding flowers -tz ka -to ye -titan books -then es -tere sa -tagli ani -so wers -slit ting -sel don -sch ul -ry ton -ro sier -rhin itis -raj shahi -r de -pretz el -offcla stro -now playing -new on -neverstop learning -marro quin -mag ers -lat kes -iy as -home decor -gl x -gg tth -febru ari -especi ales -engv wi -el mers -e tre -dj z -day book -common alities -clou ding -cat sup -bharat pur -ang y -aly ci -aer ated -abrew ery -. âĢĵ -ðŁİ¶ ðŁİ¸ -yor u -wi eland -wearethe community -vi bin -var nishes -thra shers -the mag -th warts -spil lover -sno pes -sno bbery -sin color -sc amp -sb ama -sander ling -roland smartin -riv age -r mk -q et -pre frontal -phal ar -pe pi -pal min -om lin -o dem -north london -muskete er -mo honk -mat tro -mart ellus -loren zi -kwi k -kis sme -kelli giddish -kar ri -ine fficiencies -head of -good wood -go falcons -gi ffen -gerard pique -foot step -eli roth -dou b -dog patch -dill ons -did actic -devast ator -del p -das d -cin i -bow sette -boogi ecousins -bbcradi omanc -ban z -back link -b wl -apache spark -allow able -ag rad -/ > -ðŁĺĸ ðŁĺĸ -ठĽ -y abu -wr cb -wir ksworth -wg sn -war um -twir ler -travel pic -tol er -to talk -tim ken -stroop wafel -scho colate -sam ina -sam huntmusic -rose buds -py arke -polys acchar -north lane -ni hal -neel am -morning starr -mechan ix -marin er -mal heur -lec tomy -l vr -kur ri -kud zu -koppar berg -jack lin -hodg ins -ha dow -grow led -gr rrrr -got ze -gav an -fire fox -fasig tipton -eye d -erc q -dul kalam -dragonage inquisition -down sized -devon wildlife -defend daca -de sing -de am -dark side -cross y -cich lids -cat tails -be kele -angel enos -and ris -alyssa edwards -adl fringe -ãģĤ ãģ¤ãĤģ -zur ich -yuri y -yun s -vivekan and -vit or -ven eno -ti pa -the hip -tear jerker -te eling -super max -suit er -ste ing -shape shifting -se chelt -schö n -sam pe -russi e -run town -pop tv -paren theses -oxygen ated -oph en -ne ato -nach o -mu hl -macro phage -lom o -kt family -kon ic -kha jura -je se -jam ey -jack white -ilovel u -icc worldcup -hopkin ton -hhhh hhhhhh -he mis -ga ston -fab a -ear shot -dog fighting -discar ding -dead andcompany -bru tes -bri ony -braun strowman -bo by -ben ic -bang aram -ba itul -aw ala -artif ici -appreci able -air wolf -ah rexpo -agri food -ae hoops -ac ers -zi ya -z ula -whitney houston -upp ingham -thru st -thero pod -technic als -t ftp -sy na -stand art -source book -schi ano -sch orr -rous sel -regener ative -reco leta -rc ms -puma football -pr ancer -port marnock -over world -nthqld cowboys -novel ization -nat v -nare k -me bane -l ith -jud icious -jabbaw oc -inser t -her azade -heathle dger -harvest moon -geor gio -g vc -fossil free -ericjohn salut -eng in -enam oured -du y -decolon izing -cram ping -coun tered -conju gation -burn tisland -brow sed -blue stem -be ekman -ban chory -augustin ian -asu mmer -arc as -abio dun -ab rown -) âĻ¥ -ðŁĽ Į -ðŁĩ© ðŁĩ° -ãĤ«ãĥ¡ ãĥ© -âĿ¤ï¸ı ðŁijij -zol ak -vaj ra -to learn -stom p -spe ktor -spatu las -soci opathic -sno wiest -shif nal -sheryl crow -sherri hill -shaw ne -sc ph -ru dge -quasi modo -publici dad -prou sa -poo per -pak vind -outlaw z -nil giri -niel son -new look -mon ary -mat ang -loo ses -le garda -landscape architecture -lamp kin -kish war -khali d -kello ggs -kay al -jun ya -jj ig -indi ad -im ma -hell bound -hair dryer -guest room -ge k -ga ar -fakel ove -erich mond -def r -dashi ell -cute dog -colombiais magicalrealism -co q -chor o -bren dand -boulev ards -boston childrens -ar ol -andre ou -alzheim ers -adap a -= / -ìĥ ģ -ç ĭ -vw bus -virtu oso -u del -tron c -to kaj -terri gal -sj su -sioux falls -se ko -se ay -schou ler -sar chive -saf arova -ro tavirus -rin ko -revel atory -quen neville -porpo ises -play ful -picto gram -obsc ures -my ka -mon treat -mckee sport -mar ler -lu ise -loveyou guys -lion snz -lati more -l mn -kurdi stan -kumb h -khan kk -kay u -kat we -jo hari -interoper able -icu eta -hor licks -hollister co -gochu jang -gary johnson -fy life -fein inger -feel er -fal ak -e im -digital payments -devon ta -deter ring -day with -davi dy -cc x -bu le -brock way -bridg end -bon gbong -bish t -bhav nagar -bg su -abra xas -ðŁĺģ âĿ¤ -å° Ķ -welling tons -wel ch -wasay jalil -vivo prokabaddi -val dis -trump in -toc queville -spiegel man -spe sh -sof christmas -sc asino -sar ki -sangh vi -rapp aport -qui jote -pon toons -pok ken -ornitho logist -o leg -ne agh -n land -n app -min us -mcro berts -mar zia -long field -la at -iam varuntej -halei wa -gro over -flav ouring -fc j -ec topic -county wide -copy book -con ifers -chi ki -centr ality -cas erta -car snapped -car gol -cal ver -c chi -b iliary -ath ul -are m -aly sia -ali do -alber tina -agar tala -ðŁijıðŁı¾ ðŁijıðŁı¾ -оÑĢÑ ħ -yn lle -y abo -whelans live -vogue paris -total afcon -time of -thelast leg -takap una -ta vira -strati fied -stir uni -star la -south fork -sou sap -sou rire -sofi ane -so dor -sequ ity -sel fe -s watch -rebel led -qu itely -proud american -paragu ayan -par ast -oren zo -open cup -om its -new love -multiv ariate -madri dista -libe skind -leg ault -laligas antander -kap ut -jackson guitars -it back -hotel direct -hen son -gram fam -girl shbo -fra zee -flor rie -flir tation -fan book -elph instone -eh is -dun ited -d ne -chin on -cellu lo -ce sca -boeing defense -bat our -bar bee -bag ot -az ali -av ratri -ari se -a ite -å¸ Į -ठĸ -wro c -world ph -wool ston -west park -uncondition al -tour nam -teo doro -supervis es -still sanders -star time -sp bs -sof rito -rock hopper -ro kh -rid ha -red alert -rain iers -poit ras -per tamina -p ation -otolaryngo logy -nise ko -ner ds -mis chka -mh ky -mate usz -man tha -ladies football -jan elle -hide aki -henri ques -he pp -he der -gra ven -gau det -fu era -forestof dean -ford canada -fl b -fan ation -fa anews -es md -en scon -em ms -du elling -dor on -dl wp -dead bolt -de pew -cross bows -croo ds -cou th -chri sch -cheri shes -cathe ters -cam ren -brah mins -bon durant -boiler plate -beech worth -be rens -bc care -arimel ber -ðŁķ Į -ðĿĹ¼ ðĿĹ -zag ging -z ord -trelle borg -tor no -terra forming -su pano -su chi -stran gulation -ster num -steph any -sny tv -skibbere en -shak u -se tc -ro sati -reno s -purpler ain -patrick sday -pa ko -oudt shoorn -nyt mag -nfl commish -mon on -lou dre -live with -laura benanti -laundere tte -itch ell -in ac -i bad -hum tv -hisp z -hare em -gravit ation -friend less -fe re -fanni bals -ellen berg -eden bridge -eddie vedder -dioni sio -de wars -dau phin -co red -boston pizza -bernal illo -bermu dian -all man -adver torial -ac ott -ðŁİ§ ðŁİ¶ -z azu -ye le -wur ly -wright stuff -wau bon -wag gle -w net -v for -uc co -u til -tony fernandes -ti mah -thoo thu -sport z -satter field -sanjay nirupam -sam al -sa ima -ro dan -rahme manuel -po pover -or c -only one -normal isation -na thank -my tv -mr michael -mo ir -middle men -meri dge -lat eline -laker idge -kr ack -ko tter -kex perience -kelly ripa -kan gol -joko y -john boyega -jet life -inter club -holocaustremem branceday -hat ton -gro ce -go wr -est el -ep md -e fin -dun das -du fresne -dro ws -dreams docometrue -dj zinhle -daw nof -continental tire -col m -coal ville -cbr n -casei h -brail sford -az pil -an anta -alfredo flores -af all -accentu ates -ðŁļ ¬ -worl di -wes thou -vs nyg -vil i -unabash edly -tx water -twitter firstfriday -ta si -stoke sley -stati stic -sig ners -sherwin williams -ri quel -reproduc tive -ramanu jan -quiet girl -quar rel -presump tuous -plant es -penn ine -over clocking -or lov -oni sion -of ilm -neuro endocrine -nen ele -mush fiqur -mrs gandhi -mis represented -mey ler -m do -liquid ators -lawy ering -ky ron -ku z -kindle books -kan ia -k andy -jo zi -jo ffe -jin ka -itsn ice -ha sk -gil martin -g tu -g greenwald -free born -fasigtipton co -europe ana -es quad -el sword -earth ling -e asons -donnabraz ile -cipri ano -ch us -cf n -bu hay -bram mer -bowel cancer -bil an -bbc sounds -bag shaw -as ae -appet ite -al franken -advo caat -ac rl -à® ¸ -Ø ¦ -zar b -yiann ch -yale town -whas sup -wer i -weare not -water spouts -u ffs -tri plic -th ula -taxon omic -t weddle -t kp -steal ers -sa irs -raj baddhan -ra thi -que ere -pre determined -pistol cliff -pist es -papp y -omin ously -jon na -j pn -gi er -gel ati -for less -faulcon er -facebook down -estate planning -ea day -don au -dit z -dism oun -delici oso -cre ighton -cont d -constip ated -buen aventura -bram well -bb cal -barra sso -alb ini -ak om -ðŁ¥ µ -âĪ ł -ठł -Ù ı -wob bler -wist fully -wind mill -win amp -wil let -war ton -vi j -ve j -u xo -tweet bot -tra ight -toon ie -teach sdgs -sport science -silver backs -seto pati -san tal -ryu ichi -retali ated -queens gate -pri pyat -patap sco -oxy codone -obi ang -nge movies -mst rooo -mor rone -mer kovskiy -mcan ally -maz ur -marche tti -mar land -magher afelt -lof thouse -la brum -l ÃŃ -kol l -kim jong -hen ao -hemat oma -ha ren -gun dlach -grass root -gla z -frater ni -flying scotsman -en light -el ang -ek lund -edgar allan -du plicity -doub let -descu ento -dat er -d princess -d add -confir mado -compu ware -cash me -car lene -cal vins -b mi -append ages -ald ale -al tere -ðŁĺĭ . -Ëĺ ) -wn ba -waldor f -vo w -vo ges -use able -us dol -up work -unc g -u hl -tur ducken -tre loar -tran spiration -thisism ay -th st -str out -show es -sher awat -sh alo -sh ags -scho harie -scaf folds -q atif -pre requisites -ol usola -nor ther -no ss -mud honey -mapu che -man gu -liqui fied -kon op -k á¹Ľ -inst amusic -impactin vesting -hoss am -hawk wind -gour ley -glory days -gh our -gar ma -g aren -fashion design -elevation church -di ar -das om -daf a -crow ned -cross way -cou to -con chords -cl unes -casi o -billie holiday -b bered -ath as -amade us -almeida theatre -adityaroy kapur -ðŁĴľ ðŁĴķ -ðŁĴª ðŁijį -ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ðŁĩºðŁĩ¸ -à¸ģภ¥ -æ r -yourboy myles -yard stick -werthe im -vege table -uri jah -twc news -tinder box -the trade -te sto -sun hat -smal lish -sho petsy -shi vely -shah in -sb nd -say reville -religi on -refurbi shments -real change -ptole maic -po cari -people problems -pd ga -o ana -nic ar -nev ill -mud cats -mon tro -modi govt -ly cett -long tail -light nin -la br -key worth -joan jett -it chotels -hit raffic -hill walking -ha dar -ha as -frei heit -food art -exc itation -eng strom -eng landers -doun e -de ben -cuck oo -credenti aled -crai gie -chill wave -bi reland -bastian ich -ax stv -att stadium -ar ski -allu des -ake up -abe el -\ = -ðŁĺį ðŁĴĽ -ಠ¹ -~ !!! -zou ki -yougot this -yo kes -whit well -wat ton -vin ni -un talented -un go -terri fic -tar ka -ta cht -t pl -t elia -ss acramento -sou sse -shi amak -sco ast -road tom -ro mine -ratche ting -plu tarch -pin d -o sti -new work -muk ti -mth atha -moon dog -mo hm -merrill ville -meate ater -marching band -loe wen -lo cura -le thu -laz ari -kay ser -kan th -kal k -k hang -he stia -gregh unt -gol feu -giel gud -fraudul ently -foodin novation -food panda -fon thill -electro cardio -e bn -dog tooth -der singh -den a -de gener -ba hi -avon lea -ap ay -am da -aber lour -aaa inspector -what women -wa hs -vin italy -van taa -thumb ing -thac over -supple mented -south worth -soo jung -sm tm -sl comiccon -sha u -selfe mployed -se kh -r uru -q al -pâ té -pyarke aisebhi -producer life -pieter se -p wx -odai ba -ni zza -mo shing -ml m -milnga vie -memphis mayfire -maple ton -mand era -m cham -led wards -lands downe -lamp lighter -lam bof -kuchrang pyarkeaisebhi -kime ki -ka inen -it smo -it ong -hur ra -hra wi -how tobe -hol lin -hapha zard -habak kuk -h lat -gas con -fur riends -ft lauderdale -f bal -eu i -ec ts -ea id -doctor ates -dim mock -comic stitan -ci reland -celi ac -cb seven -car nahan -calgary herald -bharat anat -beach goers -awh h -ast oundingly -anglo phones -amus ingly -am cc -air indiain -ab stained -ab asi -aaj kamrankhan -a ú -த ல -Ùħ Ø© -u vc -the bel -sunba enim -stop killing -stain d -soli dity -shoulder to -sap hana -ren cont -pur an -pnpp io -o ty -new moon -necker chief -mo shenko -me ireles -ki on -ka pow -irish history -holland roden -helve tia -hear st -hack aday -greghunt mp -give thanks -frontier land -franc avilla -fit mom -filip inas -ep irus -ear lobe -ea sty -dray ton -de ssie -dam ar -co work -chapp ed -cano ga -bursas por -bri o -billy graham -bho sle -b wl -aw omen -autor ick -aeri alist -ae reo -ðŁĺĺ ðŁĴŀ -white hill -what makesme -wal ey -villarai gosa -ve i -v usi -un reasonably -toyo tires -thirdman records -thing iverse -th ami -survey monkey -super giant -stre vor -sound checking -som met -scar petta -roberts space -reall orraine -rajyas abha -pun ta -po om -pax prime -oren dabooks -oc tet -ndhakoo ttam -museumof art -mom ocon -mo du -medium ship -maher zain -laksh ya -k abc -impression able -ho bey -hc so -harring ay -gram in -governor tomwolf -gor man -gam esa -found ling -ff x -europe forculture -dra ig -defence forces -cy clin -cos grave -corel draw -choo sy -cbseven ingnews -cam ili -br ang -bow ral -benven uto -ben zodi -be ware -bak kam -ar le -annihil ator -am antes -ales ana -ðŁĴªðŁı» ðŁĴªðŁı»ðŁĴªðŁı» -ðŁĩ¹ ðŁĩŃ -ö n -wy che -will enhall -w anne -united against -un box -tou cans -tick tock -ti jer -st pauli -ro bron -richardo sman -red backs -rayqu aza -raff le -por tree -pol gar -pil o -pen testing -oy en -owy hee -ott b -o her -mitt en -marga ery -lauren german -ki miko -jay apal -j yn -it movie -im perfectly -if es -hol ing -hesp eler -han abi -h mw -great american -giga om -gan dia -g ys -fury road -fondaz ione -ex s -esp nw -er wan -dee wani -co bol -city asone -cgr teams -caul king -carpa thians -ca el -bundy ranch -buckingham palace -basketball cl -audit orio -aq s -androgy ny -ame et -am ae -ak asha -agio ia -afro centric -. ,,,, -à¸ķลาà¸Ķ à¸Ļ -õ es -wrest ler -vi zi -un carrier -to pol -the orossi -symph onie -sr kian -sonys antamonica -sing star -shab nam -seri alization -semin ario -se aland -sav on -sak har -rise together -red coats -ralph garman -rag na -ra bun -pw f -proce ssional -perform a -pan opticon -p illa -oh so -notin myname -nit t -net beans -muh te -mm ell -meck is -marab oli -libt ard -lef kada -kay leigh -jac q -it sab -ind l -immort alize -ho res -giveaway alert -gin nie -fat joe -et sch -es xi -elabor ated -ein en -dunker que -du toit -dri l -doncaster races -don elson -de kay -d magazine -cre ssy -cin o -cil ip -chi quito -byte coin -bre ga -box y -ble n -anti gravity -albu ll -adv aita -ac chedin -ab nam -ðŁĺĤ ðŁĶ¥ -ðŁįij ðŁįij -z huang -y acou -x net -we gener -vas o -up ended -tri l -tran ter -tk pict -sun star -stic ation -spor in -sp ast -sham miya -scann ell -savi ano -sal ing -sal en -rat to -polic ing -pisto ia -pic hi -pate k -pascu a -over riding -or able -oo loo -now a -mo fthe -min ote -metall ers -merge records -mabu se -ma don -kine matics -indi s -hu o -ho tr -hal t -hal dimand -greengro cer -fri sell -formula drift -f ism -equ aled -e bd -dnb tv -da awards -cool fm -coo tie -chin ua -bot ts -bi go -ba har -ba er -aw aren -ap lusk -anz acs -an cap -alon ce -< # -ı ÅŁ -yay yyyy -vin ita -un cluttered -tutel age -tu mp -thal ys -tailgat er -sydney tennis -swadlin cote -super copa -sunday times -su ber -stat ers -silk worm -sign writing -si stem -shawn mendes -self shot -scrip tural -sch rager -punch lines -puj ya -prolon ging -polit ica -park way -paraphra sed -p sus -organ o -octo gen -nle sdca -niec y -nenele akes -na sha -missmal ini -mis eries -mens golf -men to -me too -mc gillivray -mc callie -manic urist -ma pfre -kabir khankk -k mk -k him -joss stone -j re -ir ates -inter faith -heartbreak ingly -gó mez -gro at -gie ter -gel son -fel ice -fav icon -fal lows -ex i -drift less -dog matic -digital strategy -de stiel -cop ters -circ let -chiar oscuro -chi pol -ch afe -calv illo -c ssd -c sia -bristol rovers -bo ac -ath en -altrincham mkt -albat ros -al pen -ak owski -: (. -ا٠Ĥ -wing tips -vo anews -ven able -vat er -v vt -trac ead -sweet water -sw co -sam it -resi zed -pluri potent -ny jah -natas cha -music lovers -me khi -majik ninja -maer sk -lambert ville -kl al -ki drock -khar agpur -k ram -joun ieh -jor dang -is free -insol vent -i asi -hu set -fother gill -fd tn -fac tion -evapor ator -endocannab inoid -e migrant -drunk pete -dragon srugby -dom ine -dispo ses -de guzman -cra in -cot ts -consu elo -con formed -castle well -by p -box park -bal ut -bal akot -ajinky ara -abo b -aaron carpenter -ðŁĺİ âĿ¤ï¸ı -ðŁıĪ ðŁıĨ -ðŁ¥ ij -ãĢ ĵ -ภĺ -à¤ľ य -with al -wemy ss -var ni -twitpic your -toi delhi -thir uv -stac os -somers by -solar winds -sh hs -recuper ation -rastaf arian -philanthro py -parenting tips -pa ster -mort lake -mil bank -ma iri -luq man -loc cit -letsgo x -l pf -kal ma -ja is -isleof skye -is car -in habitat -hyper spectral -hincap ie -gen do -fu egos -es waran -depo is -da hn -d sp -d lb -commer z -chi quit -center line -cas als -border terrier -bord bia -booz allen -black catday -big boi -baz an -bas ilio -; ] -! ðŁĺįðŁĺį -ðŁĸ¤ âĿ¤ï¸ı -âĻ ¢ -á in -y oud -we di -v twx -uncann y -u mas -tw ba -tim lin -teng u -sw ades -stoo she -sor bo -seatt lec -school day -reflexi ve -public is -prabal gurung -pink news -peter facinelli -pan gos -ordin ated -or cid -nintendo direct -nct dream -mur phey -min ta -mill brae -lo lit -lie ben -lactobac illus -kra ig -ko dagu -kiane gan -kaz un -k so -j alo -itu d -ho gi -glove box -gilli e -gil ded -gam era -gag olf -fall foliage -exp elling -e rez -dio genes -club life -bremer haven -boyer town -bota fogo -batter sby -bas uki -b ca -ayushman bharat -autumn leaves -ashish sharma -ashi els -ant ine -air mass -ai ai -ac ine -ac abou -: -- -ãģŃãģĵ ãģĤãģ¤ãĤģ -wi el -whites and -w tv -unbreak able -team j -sub types -sodom y -si ki -shel ton -sha key -sang in -redundan cies -red an -pv ris -pow is -piccal illi -pic hon -pan ag -palae o -pad let -olympi acos -olivi acul -observ atories -nur sed -na ac -man so -ma aya -l ally -kap u -kail an -ju h -jabbawoc keez -iz er -irri gate -ire m -il led -hut ton -fu ne -ferv ently -fc v -er re -endofan era -dr jillstein -di pg -de uk -darrene spanto -d sch -criscy borg -chante use -bless ing -bang ka -at theraces -ash ridge -ane sh -am reading -ad lai -ðŁĨĺ ðŁĨĺ -zimmy deanie -ze ks -yak umar -tu bas -travel more -thu mped -tal ha -sylvain reynard -sph ilippines -shinsu ken -scri vens -sco ding -sch zimmydeanie -sale sharksrugby -riseand shine -ris kie -ram en -pune city -probinsy ano -pos iciones -photom ani -oren zi -op un -nach man -montag na -mandi sa -mal inda -less ens -le ute -le ele -le ashes -la sg -l tn -kem pe -jur ina -je ana -jack alltimelow -ip in -hô tel -hu cks -ham ma -gir onde -george clooney -ge om -equal rights -dprincess maja -dense tsu -dare bin -craigy ferg -conor mcgregor -com fiest -co dd -cbs denver -cb ca -calli son -bring on -bio ta -be utler -authori zes -arte contempor -argent inas -an anas -âĸ Ģ -ภ³ -yew tree -worththe wait -world sleepday -whar f -u yl -swen sen -swamin athan -sub contractor -shoulderto shoulder -sc j -sanc tify -saipalla vi -russ i -record ando -ram kumar -quil mes -queer ness -prosp ering -percu taneous -onetough nerd -oj hl -mon y -mo tional -ml se -meis sen -medit ation -marine biology -mandy moore -maj ik -lasd hq -la ith -l ph -knap sack -je ev -ir g -indian wells -gin toki -forever royal -for ky -evo sti -et zel -ef rain -der p -de chambeau -cul tus -con o -cataly ze -buy british -bam boom -azpil icueta -auburn dale -as fer -am adi -acc intouch -?! ?!?!?! -/ , -ðŁĩ¦ðŁĩ ² -whodun it -war hurst -wag ggs -vindol anda -tum mies -sun down -studi of -street fighter -sti ger -ssi ere -sheriff clarke -sens ational -sd all -sc v -ru ssa -real radio -radi onet -r bn -quadril ateral -power pop -per nam -our nhs -ob tainable -non descript -n ith -mir chi -mars den -lul z -ke ck -k hara -jam ba -his i -gy aru -girl sof -gent ler -flag ships -fer tig -euro wings -et w -es fest -eq nz -el ys -do by -chin at -ceram icist -car rental -canad aam -cam br -c prs -broad well -brand icar -bird watch -argy le -ange le -ale bri -zim m -za an -ximen anr -vir den -vic roads -v go -unf pa -un u -tracead kins -than thi -tech day -spin drift -s res -rat nam -prop iti -piazz olla -ou lis -nor itake -nom ean -margin alization -margarit aday -kil bey -kevin magnussen -jas na -janu ar -houston ians -heart bleed -hadi ah -go po -glen field -dub bel -drak engard -dj drama -deut scher -de formities -dau lton -dab ney -cruise chat -cri sty -coven ants -con sho -clex acon -ci ras -christy chibi -chicago theatre -can can -camcor ders -calciomer cato -butter bean -bre vet -blondie official -black horse -back beat -bab ur -au jour -almo dovar -ag hast -ab ailey -ãĤ¯ ãĥ© -à¸Ńภģ -yate ley -y ron -ve ren -vanv leet -utah ns -upp al -uni body -un lit -un follows -ti fton -thr in -theis mann -th id -team mma -tae tae -ta yo -stro bel -stam en -sop ra -songh ye -smart ness -shell shock -shak il -seeyou soon -secretary zinke -se garra -reck lessness -per ler -pen netta -pakistan inpics -ov um -oce ani -n dm -movie maniac -mol ana -mobil ink -mass u -maric el -mar duk -maj ima -mac ks -lun ched -lsu baseball -lipp man -lau zon -kwin ana -k wen -in nam -hul king -higu rashi -hair dos -gri zzle -go be -gal ashiels -fortu itous -fe ckless -diure tic -dap ur -consu mable -cn as -clo cal -chou ston -chic ana -char ney -cen g -cav apoo -cam igu -bu uuuuuuuu -bu football -bo ak -bnppari bas -black series -bee ley -ban deau -back streets -at tired -arab a -app é -alex x -affe c -ad ani -zon ta -you kai -yo ann -wy nd -with y -vidy asagar -tru stin -trou pes -tre mens -tom welling -the kinks -swo ggle -swif tie -sun river -seung cheol -scorpi o -school mates -schom burg -rock hounds -ra ynes -quir ky -qu or -pu glove -plasticfree july -pain management -na ha -ms build -modern ising -match room -ma stro -long street -long shore -let golf -lein time -lal as -jacobl atimore -instant pot -in secure -hv ff -heuri stic -hen lopen -gunter sville -fe ste -farou q -est ates -eas ily -cv l -crani o -courier journal -con formal -com a -co ffer -church ills -cd japan -carrief fisher -carol us -c ill -bryan ston -bour din -bil ity -big city -ben der -at oc -apollon ia -am coll -a ice -ðŁĺį ðŁĻĮ -ðŁį¸ ðŁį¸ -оÑĢÑħ иде -оÑĢÑħиде Ñı -yam yam -yak kopin -yakkopin ky -well ens -wan and -vit aco -trian gulation -tip toes -spread thel -revision ism -re vie -rat rod -pun net -phal f -pe pes -palestin ian -p sn -op ic -mill port -mie sha -mer cat -mee m -mb a -kl ick -haw co -h sin -guineap igs -gn um -e stra -cubes ats -cu an -cro se -ce mber -car min -bran caster -bo gummy -bankof ireland -ban ana -bac ar -ath u -at tucks -at palace -am ante -ad ang -ç¦ ı -zu ri -yo shino -woody ard -we stridge -v ought -un initiated -tx l -tuk wila -team dignitas -sustain er -su ps -storage wars -starr music -st weed -sav ann -sarah g -ric kast -remo vers -rat rams -r pp -pharmaco vigilance -pax son -op seaworld -omnic om -nissan leaf -new species -motor cross -mo gol -mishand ling -martyr sday -lay la -labrin th -la weather -kir ra -ki vanc -k ation -jun ctive -j jang -inside edition -in super -import ante -i ims -han off -ham ar -grav att -glos biz -gar w -en rile -diet mar -di derot -deven ish -cyn ics -chu ang -chester mere -bay bee -bagh datis -b ör -b go -au lani -ato v -am ate -adam sbeer -achrist mas -. ðŁĺĭ -% / -ðŁıĢ @ -ðŁ¥Ĭ ðŁ¥Ĭ -íĥľ ìŰ -ঠľ -youn us -win dom -wil fredo -wi ve -whole grain -vit amix -v sg -u dit -ty mp -t mm -t caf -sw ed -st clair -selec tman -re validation -perfect ly -parrot fish -pacific northwest -orbit z -or miston -one um -oliviacul po -np cc -nor iko -mod der -micro film -meg gie -me sab -manner ism -maic hard -lucha elrey -looney tunes -kum on -j man -invali date -in consequential -i drive -house building -gü len -gir lish -gal pin -forever freo -f kat -every pony -event tech -even though -esper amos -eny imba -em mer -elev ator -dun ny -du ken -dream er -dow jones -df es -corpor ator -colo gic -clu m -clairvoy ance -castle reagh -c ile -bun so -brain z -bi ster -bbc sussex -bat ali -anu el -® ! -z drav -yo shimura -walsall fc -video tape -un fairness -tas i -tann enbaum -sti eg -stephani ej -sri divya -snell ville -side swipe -se amed -sa ada -ry lie -reth ym -progre sso -pen hali -over sea -nic olo -national rail -mi thra -mi go -marin ers -leap year -kress ley -kau er -j kenney -inter mezzo -incre dulous -hipho pp -han ash -gar con -fic es -ff le -faiz an -do ac -dis loyal -cu g -chem a -cann avaro -c bit -bron chial -braz enly -bra hm -bic ho -berrye ssa -ben jie -beis govuk -b young -b gu -ayo tte -ak m -ak iyama -ajinkyara hane -after buzztv -âľ ½ -ya akov -world skill -vi rago -un characteristically -u ric -u pu -tling it -thisis not -tech meme -subpoen aed -straw weight -south wind -sit well -side step -shu tt -serge y -ru tab -ro strum -river banks -ple gia -pi xie -phospho rescent -pete souza -paris review -oned ayat -official keef -notone more -n bo -ms v -moun ir -monte falco -mo xi -min nette -micho acan -metropolit ano -mall i -ly m -kn es -ke ish -john f -job seeker -iu pac -invite es -inexhau stible -indi g -here with -hal di -go blazers -go big -ev eld -et bu -dre dged -detroit ers -dar relli -crohn scol -col sen -clarence house -cas ado -cape verde -cap ac -by ars -boat race -blen der -bick le -bi ding -belo ved -bad la -azur lane -ardnamur chan -aqu avit -applic ation -ani si -ame a -after the -aa ic -. _ -ðŁĺ©ðŁĺ© ðŁĺ© -âķ ® -yad utta -vuni pola -tru die -tra bal -the wonder -the planet -ter abyte -tay schilling -swis so -sor ority -shus engupta -sati ated -s gottalent -revel ing -ref low -ranul ph -pirate pride -pen tax -pall one -order of -or lean -oli d -nag in -n tx -mor an -mi sti -mc gary -man jun -lyn de -long staff -lo sin -lo aded -lake field -krakat oa -kis ka -kim wilde -ki da -keke palmer -johnshopkins sph -ib ach -hen nie -happen ing -h ent -gunne dah -glady sb -gen elia -gaz eta -frat ellis -fra gi -for aday -ermene gildo -ear thob -du ino -dren nan -dor us -dal an -cri ollo -cot tawa -city west -callu ses -c gh -bu er -bra vi -an fc -ðŁĺį ðŁijħ -ë°Ķ ìĿ´ -âĺģï¸ı âĺģï¸ı -ÌĦ ) -ys ch -x all -wis co -western balkans -wau paca -uneven ly -tw ells -tric homes -to su -ti u -snape ee -sha har -sac d -rie ger -ri ada -revi led -reas ser -re den -power to -pla stik -phen ol -pen k -pati a -pat mos -par isa -pag ers -pa store -njpw world -nca atournament -muskete er -mini buses -lon ny -life son -ky gomusic -kinky boots -ji me -infiltr ator -in voluntarily -hom elands -getit done -gal á -fre ja -first take -enscon ced -emily vancamp -embroi dering -eli ott -dizz ee -dhe a -del ica -dana her -crusad ing -com ando -cog nos -clam oring -cine malaya -can mnt -c adel -bryn mawr -br onto -br iny -blu x -bas news -artof visuals -aroo stook -aral gon -and t -after school -adu tta -)))) ))) -ðŁĺį ðŁĺī -âľħâľħ âľħ -wim berly -vw camper -vin ter -v sm -usur per -unmistak ably -triffi ds -tis bury -ther iot -tcu football -sw elove -stair ways -spa rent -sommeli ers -slee per -six to -seal evel -rol lei -rit chey -richhomi equan -pra sar -popu laire -pl ang -pizz ic -nor disk -nom en -mid tj -mi versary -mal da -loath some -living legend -laryn go -inter twine -i play -harry con -hand maiden -gar ut -fre eney -fixed andfurious -extramar ital -esl proleague -emma bunton -east bay -d ze -courvo isier -clo onan -ce ee -bron zes -brandicar lile -bo boi -bluee conomy -black flag -be heard -b cla -are vival -angri est -amcoll surgeons -ali ft -ab bit -ðŁij ª -ðŁİĻ ï¸ı -writers room -wo d -west en -west borough -w dp -vidar bha -uu a -ut ada -tusc any -tivi sts -te eling -sun na -sla k -sc pa -sav oretti -sat nav -remember when -re locate -re interpretation -priv ada -prim and -pheno typing -pal ma -pa pered -ol ton -ohhill yes -nu tra -mol li -midnight texas -lu gger -kabat aan -jitter bug -im parted -hudson river -holo dom -go flames -gn ac -gaz e -ga hr -g sy -free day -fly board -fer rol -etsy vintage -en ca -done yet -demol itions -de su -cro cuses -cioccol ato -cin quec -chancell or -bo ic -bla blac -bharatanat yam -believ in -baw dy -bat boy -awild cats -as fc -ame morial -alli t -ab aga -ðŁ¦ ķ -yn on -wallace burg -ves na -un questionable -tu meric -thermonu clear -the wolf -th night -test es -squ ire -shaw lands -shantan um -sai ram -rock ledge -rever ts -r co -pun cheon -opportuni sts -nightri de -nau set -mon dale -mil ledge -mi kul -mcal eese -malware bytes -mail sport -ma vis -llan rw -koh samui -keep familiestogether -kat suki -jug end -j atra -itali ani -ib dp -hä agen -hipho particles -from the -frog mouth -essel dorf -du tty -dre ger -de gaard -de coupling -cun nin -ch ons -bur gin -brune tti -broo ds -bra den -blue shirts -alto cumulus -al ped -ak ira -aj anta -! ?) -ðŁļ ĥ -ðŁĵ ½ï¸ı -ðŁIJ» ðŁIJ» -yan sk -wn ers -what we -wen ham -too oooo -thorns fc -sy er -swa ths -suicidepreven tionday -splat ter -sco by -salz berg -s jobs -rwand air -rose bowl -rezz ed -relap sing -photo shooting -ou there -okano gan -oh dems -o logies -nas o -mskar inab -moz gov -metamorpho ses -lu ella -la vie -jo ice -ha seeb -grey goose -goo fs -fur rier -frene my -ern becher -edf energy -dy outh -die hards -di bley -darrelli ssa -carolin as -caf reeland -buc n -bu ro -bronz eville -broken shire -bra uer -bon n -battle bots -av alier -at ured -alstro emeria -; ___; -åħ ¨ -wim dive -wil kens -vine y -vine eth -viare ggio -umic hb -top stories -the specials -stang gang -ss s -sp cl -sonom acounty -sloven ija -shot ts -sche ider -sch auer -s fer -rob inette -river thames -re mco -rbg sydney -ram nation -raiison ai -rabino witz -ra baa -premi os -pon tins -pav o -pau sini -onof rio -oc ps -nik kie -n we -n tf -mir co -ma dowo -lotro family -leyton orientfc -kaisers lautern -in canada -humili ates -hon fleur -hol kar -h lb -gy un -gun gah -ge isel -g px -foreclo sed -fl aca -dutch gp -dic arlo -diam ine -di j -corn husker -cole co -camigu in -bu ti -bhagat singh -beu kes -baro ka -bar ne -bandain amc -bandainamc ous -al pu -a ben -zam mit -yu i -wa ks -upad hy -up slope -touch wood -the story -sun ray -sie sta -sbag ov -sales men -s games -ri mington -resi stances -rescu ecats -re we -ra hi -r ms -photo cred -pgat our -ob ye -nra show -now ski -ng ata -ne ela -nan ban -middle brooks -mahabal eshwar -mag non -lyn mouth -lud lam -lu glio -lampas as -kurni awan -ki ko -k ma -jump street -jis shusengupta -jai shankar -i ud -i acs -hvac r -hu gin -harrycon nickjr -gun play -gor bals -ger oni -free friday -fos sey -folklor ico -fly dubai -fen ian -face to -el si -do vish -dac us -couple s -con away -caricaturi st -cardiff met -bridge tt -bri sa -bit map -batt ambang -auto cracy -ðŁĺį ðŁ¤Ĺ -zi au -wg na -wer f -weneed diversebooks -wa aaaay -vi ja -uss f -un diluted -tr v -town sville -to st -sky running -shutt ling -seamus dever -sch all -save bangladesh -sal ander -sad owski -robert j -prin tz -par ai -paci fy -or moc -olong apo -north shore -nebrask ans -ne ft -mcgr ory -leighj alland -lap els -ku opio -kov acevic -king ship -kel and -kat ainen -ka appa -il ic -heli opolis -gote borg -gom bak -gi bs -fi ora -doug stanhope -do ds -desig ning -d ander -clock work -ci gal -cham orro -ca is -bu it -breast fed -bio safety -ay ck -avi ans -auto corrects -app arte -ðŁĺĤ , -ãĥ¼ ãĤ¹ -௠Ĭ -womens football -win ne -wh iotv -vo iture -ve stry -triglycer ides -tol leson -tip top -this sss -thel an -the steve -super charging -stephanie abrams -sp aci -sch noodle -sail ly -sab is -ru gger -rati mes -ra vo -r pn -putt ing -post in -pm lunch -plan b -pi pette -pen tre -pe quot -paraly zing -nasa juno -nano structures -myer scough -mskristin kreuk -moose head -mil lage -mal te -lam da -lam be -khan um -ker mit -insemin ation -in nn -ho bs -hel ford -gum drop -ger bils -frug ality -fiel dof -entor noi -en dos -diar ra -dead sea -dat ura -dam ai -commiss ar -cla fout -chill an -cau ayan -buccle uch -blu mer -bitt man -bb ish -b tb -au reo -ani sha -angan wadi -ang kor -ahmad u -afflu enza -ðŁĴļðŁĴļ ðŁĴļðŁĴļ -ì » -â̦â̦ â̦â̦ -zab riskie -x om -wie ber -wal berg -ven timiglia -vau cluse -un focused -tbur soni -so bey -ske han -sk ua -shau l -sax o -real shoaibmalik -p blchat -outwar dly -nofly zone -mu thu -min nis -me sop -marcan thony -macie j -ludic rously -kat vnews -kak inada -k lar -jai ho -j kovic -instrument alists -in atur -homec oo -hol mes -forthe holidays -fel sted -feeling good -e gging -duc tile -duc ale -diri gida -colour ways -celebr ando -brun ell -brain stormed -black box -berlin phil -be bek -bbc newsnight -baby boomers -allu arjun -all ato -ac ol -ab ridge -ab la -ðŁĴĻ ðŁıĪ -ðŁį° ðŁį° -åĨĻ羣 æĴ® -wool ford -wo wo -wo th -ve ka -tw f -tri gun -tr aralgon -tor x -to bruk -the legomovie -ted lieu -tand u -t fest -t enga -sky zoo -sa asports -s england -ri zzi -rhy med -r fra -plou ffe -pit i -op an -on ha -off f -mon ik -mon al -milit ar -mccaf fery -mb assy -lp live -leaf snation -lati fa -ká¹Ľ á¹£ -kod joe -kle i -kis ki -ke ble -jig gle -jeep wrangler -h dg -go bigred -ger ties -gal atea -food drive -f ani -eme lec -ely se -drum corps -do ire -demet özdemir -da her -criver side -crack pot -collision conf -chal upa -cele bs -bul gar -br once -bham citycouncil -baldess ari -arc am -ah lam -afl draft -ðŁĻı ðŁĺĬ -ðŁ¥º ðŁ¥º -å³ ¶ -wunder kind -wn z -warrant less -w pm -w mar -uval de -un deserved -u yu -tt ough -tru itt -tre ty -toyo tam -tit is -tel fair -tejash wi -stat esof -stan well -sp ada -shor tz -re styling -re primand -re compen -r inn -pra kan -polar isation -pil as -pega sister -over react -over hanging -ou uu -ou ple -on elife -nier automata -new ley -mor ang -mccol gan -mat an -lon oke -lau dat -la von -kra ys -ine ment -gu b -grey scale -go solar -galaxy sedge -fr acked -febru dairy -ex tol -edgarallan poe -dr david -die sen -di stefano -derry cityfc -debu chy -de hydrating -cu ffe -chu i -cas p -car stairs -bug ler -bucu resti -bc bg -baw ah -ardi les -ac tie -ðŁ¤Ł ðŁı¼ -yoko zuna -woo key -tru ax -tel om -tech trends -sw stheband -stor res -so ames -sni fter -sheet music -sav ana -sali x -robert deniro -ro tis -rhin elander -red shirts -ram age -pol oni -pluri bus -peter pan -pen nie -p live -over land -or feo -nic ek -mor ir -mix x -mie ke -me aghan -mazz ola -le du -land ol -kib butz -java ee -j den -ian wright -haber korn -gavi ria -gas lamp -fu ror -firstworld war -fen ny -f dg -end c -element ary -e trian -dit t -distill ate -destabili zing -dad ri -comer cio -comedy central -cav itation -c ó -boiler room -bick ford -bett ym -as anta -aj staff -adro it -accor ded -ðŁĮĬ âĺĢï¸ı -whati do -we tton -v ri -tro xy -the mi -t mag -srini vas -sport scotland -speaker phone -sho down -sh apps -scoo king -san dip -ro di -rail yard -q ari -poten za -polit buro -pi gg -perpetu ity -par lament -pal ani -over work -ourhome bts -ott is -ogall ala -ny cb -no ts -nis kay -new play -ne aarts -mc gla -ma fs -lu pone -lo bi -le red -kor ir -kel liber -john isner -illing worth -i ui -humble brag -ho gg -go yo -formula one -eras mus -enricom olinari -election ske -double trouble -dev ours -de generates -d models -cheong sam -baro que -at ower -affor ding -ad ate -ðŁĩ¨ðŁĩ ´ -wim pole -wh ish -waian ae -visit finland -turn downforwhat -sp lot -sexual health -ro cs -river stone -ri squ -poun ced -phoen icia -peace making -patient engagement -oz aukee -offic elife -news goldcoast -neuro feedback -moon ie -mcgill ic -mc cra -marti jn -labou m -la du -jon atan -ji ki -jam ali -ito day -inner space -hydro static -h ppy -ft c -friends forever -friend z -free charge -fish nets -evalu ators -esch atology -edu k -d win -cross er -crawl space -clayton kersh -check box -av otes -au da -an jal -alay na -al maz -ade sanya -ðŁĩ¬ðŁĩ§ðŁĩ¬ðŁĩ§ ðŁĩ¬ðŁĩ§ -ì ³ -âĺº ðŁĺĺ -x ray -universe today -tr ing -tor iam -toi indianews -ti sch -sing ler -sigi riya -se pi -rei ji -re all -ravens burger -ple dger -pk subban -photoof thenight -pete hegseth -pam plin -outsmar ted -net minder -mer amec -main line -ley burn -len ard -kha il -k bb -just ise -junk food -ju tting -ji k -hi h -har asses -gri zed -gra hn -god den -geop end -fuku da -fru gal -fre ear -f enti -en fp -ei th -east london -dan electro -crun ched -cod ghosts -co teau -cnbc africa -clu buk -carlo ta -bush master -belli ssimo -bel z -audi en -au chin -atta c -ast and -artex hibit -anat omic -alman ack -ðŁĺĦ . -ðŁĸ Ĵ -ðŁİīðŁİģ ðŁİĪ -âĻ¥ " -ॠĤ -yyyy yyyyy -u tters -u erto -u dio -tur fs -take my -social club -smur fette -sexy back -serv ite -science hub -sb way -sas u -rum sey -oper ade -nwan kwo -new belfast -never not -master piece -kho za -ke res -jan nie -james reid -insta size -hoar ded -hir scher -high snobiety -grun ting -gofor gold -gi vi -flu gha -eo sinop -ddf tennis -dal les -cro sse -corn starch -consho hocken -com posted -cod worldleague -ch ta -blake ley -bartol ome -bab os -anthon ynolan -air patrol -ðŁĺĬ ⾨ -wom yn -west pac -victor ino -v um -v tb -un appealing -uh v -tx wine -tusk sup -tram pling -tou re -tou quet -tostad as -tonythe sharky -th aa -tar por -tang s -su ger -stra sser -south bury -som bras -shand wick -sc ip -rout ledge -ri stretto -real ale -phillips burg -pett ine -palli ser -out station -olajide bt -nor cia -ni hl -monster palooza -mis shapen -midtj ylland -mi yako -mel ale -local ism -let live -ksi olajidebt -ko ston -k sr -jodre ll -jacob y -izz ah -gor khal -glori fies -gali lei -gal los -frizz ell -finns law -fe ms -en jol -elaz aro -don agha -di smo -dam mit -credit on -concentr ation -closing ceremony -ca ine -bay port -any u -an king -aku ya -aj pw -ab ndp -ðŁĩ¹ðŁĩ ¹ -youth voice -wy ss -wool ly -whir ly -westh ampton -walt zes -vill eroy -toronto library -torbay hour -ti thing -thumb elina -thrif ty -sub sides -steam works -ru ach -re dic -ow ler -napo ca -n olo -mess iness -me ira -kianegan wl -if taar -good girls -gi ef -gen icity -gar nier -gag op -frankfur t -e ban -creation ent -cr sng -circum navigation -christen dom -chapel hill -bor ax -beryl lium -bad der -austin basis -arca di -an bu -amber gris -adorn ments -aber aeron -_ # -ï¹ ı -ê¶ Į -å¿ « -âľħ # -âļ«ï¸ı âļ«ï¸ı -zechar iah -westy orkshire -well done -we zi -val tell -un aided -ul time -tur turro -tis me -tat sumi -tar heel -sub stations -su rab -ste eds -sp ittin -shinge kinok -shi vu -shef ali -sal ters -rome u -ro mps -ro mare -red book -rece des -react native -q ns -oli vo -ofcal dub -nu do -no bile -ne whe -mu tes -mbab azi -mati p -mag ali -lov atic -ley y -le mente -last chance -ko wal -ke ek -kav it -karas wisher -joem cel -jay dee -jab dulkalam -i id -horse tail -hit record -hill en -highe red -her li -gru en -ge te -fou lard -flyn avy -fled glings -fi ya -ferman agh -en ov -don tre -co be -cal ne -bat y -barbar amills -bak so -arba az -an pan -an ai -afric abiz -( ? -ðŁIJĬ ðŁIJĬ -â̼ ï¸İ -xilin x -whynot us -we ho -war de -v are -ute p -upl and -thir sting -taw fiq -su ren -st wo -squ ab -simple ton -si fted -pra tham -pay an -pa ez -osc on -nytimes books -no stro -nev ado -nay antara -natural health -nas wamy -mo chis -mk bhd -man ey -lu ma -loveli braries -la so -kiefer ravena -kat sumi -johnny gargano -inju rious -ine o -implic itly -hu alien -hoo ped -high clere -hey violet -he ian -ha ath -gm hc -fore arms -fer ny -en vision -en raptured -emer al -e bi -corne jo -commun ing -cedar burg -ce ph -cam ero -cabo olture -blon ds -bar ish -armi stead -apri mary -apo sto -acom edy -ðŁĵ¸ # -writers block -warat ah -vers ic -tom thewanted -ther adio -sp row -siva ji -ru tten -ration ally -par te -opol itan -o jama -nose dive -none w -ni osh -na as -myceli um -mor oz -monster hunter -merri am -maum elle -lyric opera -lutter worth -kron o -ker ma -juxta poz -j sk -inj era -indi ac -hu ach -hd fc -hak ur -gug ino -gl or -ging ko -gi ggled -g isd -fl yy -fen ella -fearne cotton -far ha -f kf -export ing -explore mb -es for -ent ente -down field -dol gel -day sin -da st -crowd funder -compe ti -code breaker -cla rens -ci bolo -cater in -cari boo -book plugs -ble eker -big ge -az ian -aw restling -atul ations -apollo theater -ag itate -ab ird -ðŁĺĺ ðŁĴĹ -ðŁİĪ # -âĿĦ âĽĦ -âļ¾ï¸ı âĿ¤ï¸ı -ynlle th -yel p -whi pper -vote ph -vat ore -usat f -uh mbt -that girl -thal esgroup -stop gap -sto so -stepla dder -spare ribs -si mp -shadow play -ser in -secon ded -scot thall -rvad ine -ruck a -row der -river ine -rik ki -radi okc -ra chi -profit eers -pp q -por ium -polynom ials -ple ee -phlebo tom -pear sall -pam ela -oli vares -nor te -nano tube -mar mi -ma gui -lisam arie -le mming -la hari -ky sportsradio -kk ur -kelliber glund -k ents -joshu at -if bb -iaff newsdesk -i leen -ho ax -happ ie -gar rod -from scratch -evoc ation -drewest ate -done z -dam my -d tu -cha ar -casta ic -bon elli -bo jack -besee ch -aw ai -au tun -aly sha -ain f -af ate -íĶ Įë -ãĥķãĤ§ ãĤ¹ -ಠ³ -youare notalone -yash in -whit worth -vi rage -veri der -the godfather -tame ka -tad hg -swami vivekananda -st witter -squ alor -spruce grove -snow suit -shi ori -sh ilo -san aullah -sa wai -ro ssie -rizz le -rhy sme -peppe rell -ony i -o el -ne dd -naz ia -navrat ilova -nar an -nam u -mul berry -magno lia -mac duff -lu ego -law ren -la scru -kam ma -jimmy page -jc cc -jag z -implo res -hur rying -happybirthday louis -gu thri -ge sell -ge ee -films notdead -epine phrine -du mba -dra ya -dhy an -death valley -coo ol -contamin ating -colla zo -climate action -capital isation -bre zh -bouff ant -bor don -back haul -av tar -aho ya -ablanc a -abidi factor -!!!! !! -ðŁIJĺ ðŁIJĺ -ðŁįº ðŁįº -åĿ Ĥ -wood crest -weak ly -ver vet -ver ner -ver mel -valdis ere -uni mog -ton ny -tom tom -tl h -ter ization -tel ome -social housing -scho eman -schi er -sat ch -rhon da -rashe eda -od di -o ita -nt chat -ni aga -mir allas -matte orenzi -magi ster -kun de -ku mu -khich di -k scope -k ado -james dro -j rr -insight moments -ing is -indi af -in firm -h bi -gri st -fe g -ef ta -destin ed -de cluttering -clergy man -cler c -classic rock -cave ats -cap on -cam pe -billi ken -be zu -ayl sham -aye ga -art man -anglo phile -âļ ĸ -z mir -uc ps -tyre ek -twer kin -tre et -thwar ting -teacher problems -tat ras -syn cope -stall holders -sports law -rise above -rema de -ra gas -pre war -port side -po sti -phe onix -pett itte -pen ia -pe eves -ol shop -od ell -nu tty -nat acha -mun cle -morin ville -mol ting -mc gwire -mas lany -malm steen -lee way -l po -kill deer -k team -ja q -j aff -itweet museums -id pol -go bier -fp so -ecar ter -dream pop -dra go -don buri -digi fest -death less -de di -dan ton -cou pler -ch ng -cal das -black belt -ball nyc -ba ghe -aviation daily -and ini -ama al -am ira -aha a -ðŁĴļ @ -ਠ² -za x -v sk -un im -tu atara -tt ag -tan ehis -tanehis ico -stell acre -spir ited -serv us -scott sville -ro ches -re arrangement -pung gol -po ivre -pig pen -per ation -outstand ingly -oh bm -nn taleb -ner dist -na hum -ms state -mor tician -mel os -me ti -mar kin -ly k -luck now -ktn v -klepto cracy -kenne bunk -ju gend -jol aburnett -j jc -inou ye -ign ition -i ima -hope less -hodg kins -ge th -fir at -f dk -ex tolling -ei fert -divul ge -deter mini -dei mos -dam aris -cr aco -cor dy -clau del -ck ton -cityof boston -cere mos -carlit os -brass band -berto ia -bent a -b have -aw rence -as ci -architects jrnal -ann yt -ann nn -ameri go -ah ana -accur sed -aar av -ðŁĺĦ ðŁĺĦðŁĺĦðŁĺĦ -ðŁĴ£ ðŁĴ£ -zis sou -you reyes -wag le -vi bhushan -tv c -turn down -tt age -tr d -te fal -t ver -t smc -super structure -spi got -speed kills -sou derton -skip the -sil sbee -scri bd -sa wa -s anni -rotham sted -robertsspace ind -rigor ously -r ori -potawat omi -play out -pas ang -p elli -ouston bill -ot tica -one man -nor then -no id -nis qually -ni ved -new grounds -n ÃŃ -mor gado -mc dade -maq bool -main tainer -mag ines -lubric ated -llande ilo -lar on -kop er -khil ji -joemcel derry -inti mates -instac ool -ino hio -im acs -i fit -hot star -hij rah -he modi -guy kawasaki -gif ty -fre em -fr ater -expe dient -ergonom ically -eph oustonbill -en amore -don ts -dissoci ative -continu ou -collabor ative -cleve rest -cam pinas -budd hist -brin ley -bla in -bbc new -bay on -bar tle -ax c -aq at -ap om -amar tya -alo kesh -ag glomer -ac tros -ye olde -y itzhak -x or -teme scal -str acci -star chy -sel lo -scar p -san doz -sa hota -raw ley -radio graphers -pet ts -pet shop -pet sch -opha gy -off ically -nandam uri -muzzle loader -mo har -marco tte -lun atic -kk w -kil ted -ke vic -k fs -john krasinski -hill cats -hen ni -handson learning -grin ners -graci ela -fri dley -fe ted -do bre -demon izing -comm itt -code share -castig lione -cap onata -bud die -buck o -bra ult -bi alik -bhu j -bal een -an avenkat -. ðŁĴĹ -. âĺº -ðŁıĨ ðŁ¥ĩ -ìĿ´ì ¦Ī -ãģ¦ãĤ ĭ -z m -we tten -tz mann -tu gh -tra ut -tion of -thought fortheday -the field -super iors -stere ok -source books -sour beer -sob ha -sil berman -si ero -shu riken -shop house -shari f -see theworld -se fa -scu gog -sc rn -ryo suke -rr sp -rot fl -ri pley -re mick -r lm -queere ye -pur port -plu mas -planet fitness -orth west -of cr -neg ombo -mot ility -modul ating -mm sm -mcgu inn -mb n -man soura -limit er -li j -ká¹Ľá¹£ á¹ĩa -kry sta -krist all -kariz ma -kam pal -k sk -j ra -immigr ate -huck le -hood winked -ho tele -hitrecord joe -ha ine -gro veland -google io -funny ordie -free styling -fer g -ebay us -e hrs -dennis elazaro -dem itas -chilla xing -chick am -cher vil -ch yn -carto ony -bri sson -bookie bashing -blan ked -be held -bad akhshan -b ve -att in -arn age -angel man -andthe city -ad ve -ðŁĽ ¶ -ðŁĽ ¡ï¸ı -ðŁijĮ ðŁĶ¥ -ðŁı Ľï¸ı -ðŁ¤¦ ðŁı¼âĢįâĻĤï¸ı -à¹Ĥ à¸Ķ -ठĩ -ÙĦ بÙĨ -ze meckis -wil burys -waste iton -war farin -v yy -v spit -under dog -transa via -topp les -ten uta -tatatru sts -tac kett -ta wang -t iler -sol ara -slive at -scho tten -schap iro -san an -roo depo -ro gier -retro actively -redribb on -pa hal -ol lective -oc co -note cards -mb on -ma pr -lal ala -lach ine -kirkin til -kan ovic -kal at -k cac -jo cke -jau n -hoo ba -gol fo -giu sti -gh anta -gg ings -food tour -food stuff -fiestab owl -festo on -f ale -esp agne -er inn -el ax -eb ates -e vie -dover court -defen der -dav ros -d lg -corpor a -conju gal -con dra -compe te -cheo hospital -cas illa -bur ston -ar sha -amhar ic -amber ley -al waleed -al tr -âĸ½` )/ -à¦ Ł -yar ratrams -wann eroo -wa cht -valle ly -ten na -story ville -steve o -ss entials -solic its -sho m -she athed -san juan -sac tive -rose mead -re stocks -per seve -pedago gies -over charging -olo pez -o reca -my house -must love -micro greens -ma zo -le eper -jim bo -itiner ant -ir radiation -intothe spiderverse -inter bank -halloween movie -gy uri -glori a -gi dley -gho tel -gett ys -fu cc -flow restling -fle ck -fl ander -fire itup -fe stering -faryaltal pur -er dahl -dumb foun -du esseldorf -down link -darwin ian -crissc ro -cor rina -cle fs -city market -broom hill -belling cat -bag at -b gg -ate y -as mus -alet tori -ak lan -aesthe tica -a out -ãħ ħ -ÙĬ Ùĩ -wor n -whole hearted -wan es -video conference -us coastguard -up church -tw addle -tuil agi -topp rog -team ster -susan sarandon -su mas -sreeni vasan -sol r -share aholic -shal er -se idler -sc avenger -sar sapar -sap uto -royal holloway -reinst ating -region alism -pulw ama -pri macy -pin sky -pat ellar -ouri st -nough ties -mous asi -mor fa -min elli -meur sault -med line -mas bate -mar voree -maine for -lo gro -lmk moviemaniac -liter ature -life uk -lief de -lhh ny -laval in -kome dia -ko tab -khar y -kau a -jes i -iro z -hilde brandt -her to -he yy -gov abbott -god wits -gl bc -gare t -galli ani -free ajstaff -foli o -fli ka -f issu -ev ir -e sus -den yer -dad dario -contemporary romance -col ler -coale sc -clafout is -cho wan -chare tte -cere bellum -by ford -boro silicate -bla bber -au ras -arou sing -alexander platz -adver bs -íĭ ° -zu hair -vol cs -ur bant -ter cera -te ye -swamp scott -sundar bans -stru tt -speech writer -sp rod -skid ded -silver a -shav uot -sci fic -schen ley -sam aria -sac republicfc -retrac ts -redro ck -re doubt -pier ro -pere a -oc sc -now bath -notb ad -nom os -moncri eff -meme history -mckend ree -mask er -lay ar -kha qan -keyne sian -ju dah -go green -gi om -fo cal -flour less -dry january -dis se -del hai -champion nat -bou tros -boere wors -blind sided -ay or -asap mob -ar monk -addle stone -aar de -âģ£ âłĢ -wax haw -wai pa -vr v -ver ville -tri ghts -trade center -thaic oup -t mac -stri via -strath co -stra des -sponge bob -so th -sen sed -sel alu -scru bbers -rwn j -roman off -robg macfarlane -ri gu -ri bbing -redskinst alk -pe dest -omic con -no ce -my girls -match worn -mass art -marc jacob -magnu sson -madef ur -machine gun -lor ton -lily aldridge -less ard -leg ate -l ä -ku cin -knu te -khlo é -ju p -infl ames -imp i -ic ep -hudson ville -ginni fer -for people -f yl -eli o -egg s -dir ge -ddp yoga -concentr ator -classic traction -charm bracelet -chamele ons -cas alettori -candacec bure -c sl -blan ch -ba bee -americana fest -alwayss unny -along with -aline a -ais ne -acqu aint -abb oud -ab ric -ðŁIJ Į -ðŁ¥ İ -zacu to -yello whead -wi ek -ween ey -turbo charger -takeme out -stock twits -stam aria -sonic boom -sky bridge -schu ette -sacri legi -ruby ph -regu s -quest live -py lori -purcell ville -ped ant -pe toftheday -pal mar -opale scent -ob ito -new age -neglec ts -national library -nash snewvideo -mt nug -marlon wayans -lu lla -leep ing -lec raft -landscape design -lanca shirehour -lac quers -kha yyam -ka beer -instig ator -infen wa -hemorrha gic -hell mann -hel g -gri se -graffiti ed -good health -good guys -get outand -gammal abs -fru ita -fr f -drive sober -direc tedby -del phi -cont es -clay gate -chill y -chal te -cen otes -cam bell -brett king -bobc ay -bar bier -auto clave -as able -ao ki -anic ole -ami ans -aj as -ag old -... ;) -Û ¶ -zen berg -wm hd -we imer -vir ging -verdi gris -vent ral -var ys -un realized -tto es -ton neau -thing ies -the aftermath -tac on -syno ptic -sul fu -st cc -she ab -sesqu icentennial -scul pts -scor ner -satch mo -rit as -restaur ateurs -psal mist -p ssa -nor o -neh ru -muell ert -mu sim -milag ros -meri vale -mend is -mas r -malli kar -le ea -lamb chop -kyo sho -k need -jel en -irishtimes sport -ino vich -ig at -horn beam -gare e -frank dangelo -fly leaf -fag in -e inem -dun donald -drows iness -dak in -cross words -conqui sta -congru ent -com al -cle ck -ch merkovskiy -bu she -bridg eland -bor gnine -armer ie -arch on -ap la -ane gan -ak ina -" ðŁİ¶ -ëį Ķë -wood bin -wit ten -wheresw ally -wh alum -u windsor -tit chfield -thex factor -thermo genic -ta dema -sw pa -super cells -sung jin -ste h -stag gs -son ning -sk ratch -si eck -segre gate -sal ak -sag at -saf ed -re kor -publici ze -po sit -pl g -me vag -man nin -man hwa -m â -loving kindness -l haynes -kp bs -klo tz -klg and -kl rahul -ke da -kawor u -ji k -hol lies -ghe ad -fertil isers -el itec -docu men -diamond league -condon ing -co td -co debase -chev in -british basketball -biopharmac eutical -bat ons -bai les -bab bo -autom atic -ati ku -amer a -ac tra -" âĢĵ -ðŁĺ´ ðŁĴ¤ -ðŁij© ðŁı¾âĢį -à¹ĥ ห -ॠ¥ -zo ar -wel d -un attached -tu co -tre mura -sub duction -slu shies -sla zenger -sad dled -rock pile -ris ke -realradi kaa -qatar gp -puri sts -plai stow -pat roller -pas anga -pa ils -one piece -ol athe -neighbour hood -nav ox -n alla -miamis burg -mar anda -makat on -magnifique france -ma guin -lake como -l bardugo -kiel burger -kaz umi -kar issa -jo ki -jag i -it cnews -independent film -ge est -force indiaf -for cen -fe br -farm worker -far low -educ ator -despat ched -che tto -brom eli -bro y -brexit vote -bond holders -ben nel -ba ink -avol leyball -antel opes -able ism -ðŁĩ¬ðŁĩ§ ðŁĩ¬ðŁĩ§ -Ù ¡ -а Ñģ -woo ed -wh Äģ -wat es -un ker -umbrell amovement -travel oregon -thi seid -the spec -swat ter -sarco idosis -ro ig -pres splay -pontel and -pharmac okine -oye z -optimi zations -omand m -of elia -n ood -my fav -mi seleccion -medium format -mal y -mal ar -main tain -lin sky -lilli put -leven thal -leeu wen -led lighting -lakedistrict pr -kundali bhagya -kep ner -kath mandu -joel madden -i pur -good all -gay marriage -fre und -espo s -dr ps -dncle ak -dal mia -da gh -d mrc -cro we -cover crops -concert tickets -cinquec ento -chri sley -camp fire -c qb -brett lee -body works -bio statistics -bell arine -battle toads -az sen -av p -astri de -alevel results -al be -ab dou -a athletics -. ðŁĴĽ -ðŁĮ» ðŁĮ» -ë¹Ħ ìĬ¤íĬ¸ -à¸ĩ าà¸Ļ -wind stream -wi u -western most -wear house -war bucks -travel photos -tom and -to liver -spet ses -solidi fying -si qui -si im -shopp es -shari ff -sar m -row boat -ri gon -rebe ka -rain storms -r rexpress -po kk -p ted -oz comiccon -oa key -nw sa -nc sl -nandit ath -myster ium -mclen don -mary landers -margaret cho -mal abon -lot so -lauren conrad -lar in -ko sky -ker ner -k vin -ju ha -ju ego -intermin able -il sa -hum dinger -ha diya -girl guiding -ghan em -gel ish -g pas -fokker dude -fat ties -drum head -di atom -detective pikachu -cor vettes -cop ali -common ers -che kov -card making -can pl -brit z -big day -betwe ens -be sta -bc w -ar kan -aj ga -ai as -ðŁĻĬ ðŁĻĬðŁĻĬ -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤ -ðŁķ ¢ -ðŁĴĢðŁĴĢ ðŁĴĢðŁĴĢ -ðŁı Ķï¸ı -wa seca -vi stic -tam pax -string y -store fronts -stellacre asy -som nia -sin america -shovel er -sc lc -sant an -rit aco -restaur an -recording acad -re ys -ram shackle -r weingarten -r ital -par lez -noy ce -nhl devils -national security -n be -mur si -mun t -mohic ans -ment um -mc taggart -lu sts -lead better -lam entation -kom unews -kis mayo -kikwe te -hexag ons -he dged -green finch -fic ht -fav ase -ever sley -et am -es muellert -east village -dor ito -cz ek -collegi ans -cn comusic -char le -aviate addict -at ac -arlington va -aldu bon -acade mie -able ton -ìĬ¤ íĬ¸ -ëĵľë¦ ¼ -ı r -yaman ashi -x rf -wichita state -vit as -u ams -ting ley -ti ft -theoffic enbc -ta rena -suther land -student loans -skir k -sidharth malhotra -scot gov -sarki sian -post marked -pnc bank -pg d -patho m -paleonto logists -pack horse -orient alism -ontario travel -o ssi -npr news -nl bm -ni eld -ne ms -my style -mercado jen -meh fil -mcc une -mc stay -le ucine -kore gaon -ko lolo -ken an -keen ey -karl stad -jimmy carr -hepat ology -hee ey -heas lip -grand stands -geta fter -gar dy -gam la -gal ante -for shaw -expatri ates -exac ta -eisen stein -dx f -di alling -detal les -cramp ons -contro ver -cn blue -carri zo -cal d -bur ri -bu thele -bu skirk -bo vary -blesse dand -black pinkin -black ink -black cap -ann alyn -ai w -african art -acom pton -ac cp -ab idi -Ļ × -íı ¬ -wide man -wallpaper mag -tro tter -travel goals -thel ad -the music -sque aked -shou p -sher on -sheep dogs -shar wanand -scur rying -sant arosa -retro computing -president scup -poly p -plu ie -per ouse -nick olas -new sday -nade em -my bcu -menom onee -mcmur ry -marau ding -lizz iec -ko echlin -kasim reed -kap ital -jun kie -jenny mccarthy -j news -hur dling -harmon ics -h cac -guardian books -goes west -gaud ÃŃ -fright fully -fin au -fade away -ethiop ian -espn nfl -e fren -du ren -dovi zioso -do gh -crohnscol itis -cro oning -cristi an -conce iving -co ghill -chibok girls -cer ne -categor ical -cancer center -bus driver -bri ens -brendan schaub -barcelon eta -ban the -ban ality -alcu dia -ache son -aam er -[ ðŁĵ· -é Ĥ -â̼ï¸ıâ̼ï¸ı â̼ï¸ıâ̼ï¸ı -¯ ï¸ı -winniethe pooh -wander ings -u fff -tro st -tri veni -tremura sdv -tac ar -store room -star ling -sit t -septa philly -school strike -sch ist -sam anta -sa fia -ru pp -ro yor -reli sted -pescat arian -pe ats -pan sion -pad mini -ny sa -np ca -nicol ás -ne as -naz e -mis r -mis deeds -mcn ary -man ana -magazine uk -ker chief -kemp town -kal ye -k sf -ise tan -ing len -im memorial -ig b -gravit ational -got w -gospel music -google plex -ga as -fresh ly -fren che -food awards -fis u -fi delio -festo oned -dy mond -du ell -dot ard -df ds -da emons -cabine tre -blur t -bloomberg news -blood bowl -be dra -ban de -arbitr ator -alle ppey -alan ine -adjudic ator -adjourn ment -ðŁĩ¦ðŁĩ « -ðŁ¤Ļ ðŁı» -íĺ ľ -ë°©íĥĦìĨĮëħĦëĭ ¨ -âĺħ âĺĨ -âķ ² -wwe usos -walkaway from -vi ele -usab aseball -un cp -ug k -u hh -tuesday thought -too soon -somer sault -si dec -sen et -sar ap -run d -roth bard -rhiz ome -pinnac le -ost end -nbc thisisus -n pu -mc brayer -lynn field -lv rj -lep online -ken stein -kar mel -investig ational -hoo g -harry winston -gg plot -genev amotorshow -gem stone -ge ge -e jaz -ds v -do ss -di atoms -davi on -dalla ire -cuer nav -ches nut -cam phalf -bag nall -ash wani -anstru ther -amon til -alex il -alex andros -al tor -agni hotri -ðŁĩ¨ðŁĩ ® -w wn -ventric le -valu es -va shem -v rai -une a -umph rey -stay hungry -stan age -soci ete -skip jack -skat elife -scal ar -sanjay gupta -remember ance -real deancain -re thin -pum mel -pr yan -pardon ing -n win -n cos -muzaf far -mur ang -moss man -michigan state -meteor shower -melale uca -ken wright -k all -ih san -he bobiwine -har diman -genes ys -ga e -flu fighter -fe vents -fac eyour -el ho -dro ppers -devan e -cor bet -cliff top -ce de -car stens -car mi -c add -c ack -bur son -bri son -boule z -born stein -appé tit -Ë Ĺ -ı r -zombi fied -z l -x danny -white genocide -vincent vangogh -vesper ia -ug at -u hu -today y -te cs -suki yaki -stuart broad -stret chered -stra ddles -stal ac -shrenu parikh -sch wa -salvage able -s wines -ro sato -restor ative -pu ti -pre pay -on vention -o gt -nuz locke -new friends -nanditath hakur -nai b -million miler -micro gravity -metast ases -mechanic sville -maris cos -ma bility -lav ington -la vat -konstant inos -kipp ax -ker man -ke ar -k ella -juan ito -jan kowski -j wc -irrit ant -her rero -gyna ecologist -gws giants -gu mm -god sown -glory togod -gl f -gar ang -flux us -flash card -ely sia -el yon -edwar dj -dee wan -copali bertadores -clean bandit -bu sted -bry ar -besto wing -ar chri -ðŁİħ ðŁİĦ -âĿĵ âĿĵ -à¹Ģภ¡ -Ùħ تع -Ð ³ -weav ed -we transfer -vi ale -theresac aputo -task bar -superi ore -sub compact -stracci atella -small holding -sig no -si gui -sex work -s iller -revin ed -rak awa -quality time -pu battlegrounds -play music -pi dge -oppos itions -nov ates -n ml -med ill -litt ler -lee seunggi -l lew -koval am -inv ul -in adequacy -idri ss -hyper realism -hu got -hooba stank -grandi flora -fronti ers -freder ique -fast furious -dur fee -dresslike awoman -do les -do ddle -diatri be -del ange -db z -d jor -ctv canadaam -ci karang -char tier -cease less -calend ar -buzzfeed news -bon sang -bo strom -bit c -bin omial -as dale -anti psychotic -angel e -anag aram -a betting -ðŁĺĮ ðŁijĮ -ðŁIJ¶ ðŁĺį -âĢ ł -ि à¤Ĥ -wood cut -whit mire -ver laine -ut tering -u gali -thr ongs -the hate -the ab -th ate -ter acing -star maker -sri ght -son or -sky west -se anc -rohit sharma -rl cs -real king -pu tman -petiti oner -pau lino -pas qual -p bl -nigh tofthe -mus er -mul lin -mom eter -med student -marj ori -mal ena -ma doc -kim meridge -ke ven -k wale -jun inho -juju be -jalop nik -jack russell -indian ocean -il lar -idi ot -hedon istic -gopro hero -glass art -fri ese -empirestate building -dil shan -digit ise -dark throne -chamber tin -butter fingers -bulldo gnation -bu ceo -bri sky -bil dt -at tains -app in -and home -abc sharktank -ðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺðŁĺĺðŁĺĺ -ìĹIJ ìĬ¤ -ãĥ³ãĤ ° -yan ez -wood mont -wh f -wewill win -un heated -twitter chat -tra um -tra fic -town ers -the devil -svo boda -skirmi shes -schumer shutdown -sarsapar illa -sa ks -s rocks -russell terrier -re ster -raf taar -pa sic -mu rai -mou rad -mor ongo -mol u -mattj willis -mar der -man ami -mac namara -lipsync battle -lasgo w -lar is -lake shore -ksh ama -kid well -k bl -ji wa -ji az -itim es -i ese -hus key -ground work -ful le -fol ky -far ook -exor ci -euco president -en sw -criminal justice -cotton bowl -consign ments -charlies angels -bridge ton -bau ghman -bary shnikov -ayles ford -au si -au an -alo sa -ai anational -ab ren -ðŁĴľ ðŁĺį -ãĢĮ # -âĹ İ -á Ħ -yon sei -yeoman ry -visit norfolk -u staad -try pod -tru dge -this oldhouse -the g -tai moor -tac cup -swar brick -stre eter -spro g -sex i -russ el -ram stein -pur ves -proxi mus -pre heat -pon i -phi lemon -pedne kar -path way -over spending -ole a -naz o -na ks -me gay -mari amen -man é -ma bs -kor te -ju rek -jay na -itv central -i sea -he mmed -hd ty -habitu ally -groun ders -grahn ort -getafter it -fram ers -eucli dean -emin ently -dmitri y -dar vill -chi ya -brown stown -bla stic -beli zean -ba elish -aw ka -as ssss -as ke -arc adis -and now -ìľ¤ íĺ¸ -ãĥ ļ -za atari -wix om -wait iti -vor ster -var mint -v dl -u mag -tu tic -tre ffen -track field -the tru -the jam -the crown -ta we -sur man -sthelen shour -south dale -sher r -people soft -pen o -parid hi -nyc go -music ale -mont morency -men ac -logan sport -lady wood -je bat -hem line -heck man -gla drags -gan ano -fo lo -find my -ever brandy -den rele -defam atory -dam odar -dag gett -count yo -con vair -chlor inated -cher ian -capit ola -cam mie -broad dus -audi ophiles -asjad nazir -ashley tisdale -ar mon -ar ino -anth uri -amor uso -aj kumar -ab ani -ðŁĻıðŁĻı ðŁĻıðŁĻıðŁĻı -âĻ¡âĻ¥ âĻ¡âĻ¥ -women on -vol nation -vi m -va beach -tw rites -thunder ball -tag bil -super bikes -star tre -spur r -sof tie -sligor overs -shack leford -sco te -sci p -sche ffler -sar ver -sab tu -ros endale -romance books -ritaco bix -re styled -re heated -re eser -que z -pre classic -pp arty -po les -pis ani -pfei fer -our land -nak ia -n pn -mur ry -mit ro -mario bros -maharash trian -l lao -koffee with -ka at -joyou sly -jak o -ig loos -hilari o -ham bur -hadou ken -gle sias -ga et -fo ggy -experien cen -execu tor -ed dington -dre ezy -dibu j -devi ance -den nish -dash croft -cul che -congre ssion -col later -chug ach -cher rie -cel gene -camp al -bundeswe hr -bu shell -bt sat -bm iller -blit zing -be ag -av it -air crash -ai u -ðŁĺį ðŁĺ± -оР½ -un li -un accountable -tim minchin -thom ase -thi eriot -thermo dynamic -th grade -tea sel -tartu fo -shul k -shaile sh -se bum -sc df -s di -redemp tion -re pp -rach ell -r sr -r sk -r ne -que zada -p ounces -os ine -onedayat atime -officiald annyt -obye zeks -ni thin -nar iman -mostre questlive -mor ales -mat tan -mal formation -make history -madra sa -ma eve -le ant -kö ping -ku dus -kow sky -kan ti -ira k -i mari -how lin -hom ophones -ho vey -ho sur -hin ter -har ber -h sm -grims by -go va -go om -gil by -gar gle -fred rickson -faryaltalpur pk -emulsive film -e jc -dumb founded -dar ah -cold harbour -co fi -chi shti -can ara -calle jon -budg am -bronx ville -best fandom -bel sky -am mu -ak ula -ac cra -^^ ; -ðŁĺ¸ ðŁĺ¸ -à¤ Ł -wing back -wee don -w anger -vla sic -ur phy -u din -u apb -tri ath -tette h -tess anne -tae hyung -su kh -su bl -songhye kyo -righ thand -qu illing -pp ar -padi ham -ov ski -ous ly -ne mac -nature photo -n ason -ms q -mi mms -mer lion -lin sey -land au -ko sar -knight dale -key port -je ke -jack pots -in sensitivity -her ky -hare field -gu mption -fu ca -fl inger -fe eny -dumbfoun dead -di ak -chri shar -cep bs -bow ley -bou m -bor hood -backto school -b ica -are gion -aj dinger -.. ðŁĺĤðŁĺĤ -âĿ¤ ðŁĶ¥ -yam ba -x hnews -whu employee -wel oven -we madeit -vag us -vad u -u doh -ty pa -tor aja -thecw supergirl -subo dh -stage coach -spro bs -song kh -sm ill -sh illa -san lu -sam b -ross lare -ro syth -remember the -power couple -pou liot -nar uh -museum monday -mi hir -memp hi -marig ny -man fredi -lagunitas beer -kale igh -kalan ick -hog shead -harde sty -gr ann -ex whuemployee -educ acion -east port -e ig -dy ers -doc ents -do ones -david dobrik -dark web -crow foot -cau dill -care of -beingh uman -ay ear -ash am -ðŁĶ¥ðŁĶ¥ðŁĶ¥ . -ðŁIJ ª -zir conium -yo yogi -x co -william h -what to -wetn wild -wer n -un stall -truek ofi -travel ban -tram pal -tione ering -time lessness -tar ak -ta plin -t fo -sydney kings -sono gram -sig urd -se ang -sar da -sapul pa -roor kee -ron deau -robot nik -robbies avage -reece shearsmith -re driver -ran sit -predic ated -plas mid -par oo -pan ti -ox alis -opho tonics -nik kis -n dy -mobile money -middle ham -lul ly -lo stock -liam hemsworth -laker snation -la ppin -ki ddin -k wini -jer man -irishtimes biz -inter disciplin -im personal -ibu shi -hon us -hon eo -hemodi alysis -hehe heh -happ ines -gil der -ge z -furi kake -fun ke -ever greens -de sir -cryp ton -confirm ations -cha ve -blun tly -biz news -be gets -be eny -atsu ko -arn aldo -andre y -amontil lado -all ic -all american -aar u -Ķ ë¦¬ -ðŁĶ» ðŁĶ» -ðŁĶ ļ -âĿ¤ ðŁijį -âĸ ij -was co -w ü -vincen tian -ve rett -vat ican -v js -uf v -ts xv -the bay -t pac -swe di -sue perkins -statueof liberty -spreadthel ard -sau cer -saddl ery -richard hammond -rev ich -repri sal -redro cks -re planted -pre view -pla ka -pit on -pemb rey -part ita -oun o -op seu -ol ano -noo ff -ni stel -na jaf -multi rotor -mor ya -mail room -ma athai -lu cap -lod don -live free -lip balm -lion up -lahari music -ko kan -kin u -ki mathi -kar amoja -indi gent -howie mandel -gon avy -gn r -ginger bread -gard endale -game works -fo da -fen er -eye wall -equ ated -ef d -dul se -ds ds -dolom ite -do one -cyberne tics -convey ance -ci bola -c fo -blue berry -blue beard -benzodi az -ben simmons -ban ti -autom echan -ator res -ash ba -al tes -ad heres -) > -ðŁ§ Ľ -⾨ ðŁĴĻ -⾨ ðŁĮŁ -z vi -yn b -ye ates -yaz z -wing friday -win son -wil mar -whor ter -wal lows -vin nie -sta renergy -seag rove -santac lara -san try -s vi -ru cci -ri sque -ow h -or v -oo kies -og lesby -o conom -mv cc -mur taz -mugh al -mouse kete -motor city -mi quel -mi fi -meri bel -me vents -mang ere -lac tating -kyw newsradio -kus anagi -ki dambi -kate middleton -jar vi -j school -ish in -il divo -ib pyp -huss aini -hu mo -horror films -high quality -happybirthday niall -han gover -great yarmouth -ghi bran -ghibran official -f sv -f db -espo ir -deliver able -cuth bertson -cow litz -cosplay girl -clean power -cav afy -cauca sians -bus by -bre port -bel zer -be eper -at eca -ar ain -al bay -aki va -ak infenwa -abh or -ðŁĺį , -ãĤ¢ãĤ¤ ãĤº -ÙĤ Ø· -ziggur at -wyl lie -va aste -up country -uke lele -tre ecre -tifo si -taw awa -switch able -sno bby -smar ttv -schol ten -sar desai -sam melan -ru en -romance readers -red season -re blog -raghu bar -plo tt -plear ning -pal try -orange men -n mu -mysti fying -my att -missing you -millen ial -mari est -maku eni -lé on -lu cked -loveis intheair -llanrw st -lar gent -l ances -kinkyboots bway -kine sthetic -ke sar -kathniel asap -kap an -june bug -ju mo -je tte -jack nicklaus -in ori -hou b -heigh tens -ha shed -gu ste -grand canyon -gonnam ake -gam bi -fer re -fa thering -em met -ein audi -e ue -e et -dol ma -den dy -de say -das i -cy prob -cross gates -consumer ist -cha it -calder one -cad man -bur bidge -bridgewater hall -boul ter -bol don -blue bonnets -ble ck -best en -bent wood -andre e -amar te -alexil alas -ai a -ĵ ľ -ðŁĺľ @ -ðŁĺĤ ðŁĺŃðŁĺŃ -å¸ Ĥ -ठı -uni dad -u dvar -tr ung -theblack keys -ten dai -ss lc -ss ense -sm ed -sir k -sim mba -shim mers -rei ster -reha bbed -razz matazz -q net -pomer ol -poly tech -petiti oners -nomean sno -new tech -napo let -my house -kö lsch -kron en -kare m -justin timberlake -jig ar -ink le -impact montreal -il on -ifw twa -gru el -giga watts -ger miston -gend armerie -gaik wad -ga thletics -flip the -fan tom -fal mer -face times -du rer -disp elled -char ming -camphalf blood -bron te -bou cheron -body shop -bak sh -at raffic -ar mors -alto ids -ag ged -aad hi -ðŁĺĤ ðŁĺĨ -ì§Ģ ìĪĺ -âϬ âϬ -à´ µ -wi ac -wall i -wak ker -w lr -twitch retwee -tuscar ora -trebu chet -the foster -the f -steam train -soci ologists -sleep apnea -sk fc -silsil abad -shev lin -sc us -salvad orian -rosan ne -roh rer -risqu é -reality check -rad ura -poie tic -po dr -pl itt -phi volcs -p side -ori o -or re -op ride -ome times -omarab dullah -nov an -notic ias -nis ar -naf sa -mis san -mirror ball -me sha -mar mion -long boarding -ken shi -kan sa -in land -hu ja -hot spurs -holo deck -hard wear -gungah lin -guj jar -fre mantle -en trusting -dehuman izing -cupca kke -cuernav aca -comra des -com odo -budd z -brew studs -big screen -beg ay -beec roft -bas kin -balt cops -b iches -b ary -ap li -amo yo -am m -ak n -agnyaath avaasi -agam em -a arey -yellow jacket -veloc ities -vaish no -unemp loy -tu tt -tru thor -tom ás -throck morton -theo tokos -te of -sy me -snu bbing -six er -sh enoy -senn heis -seas alt -sear ly -school spirit -ripp aul -ri sca -re collect -plant svszombies -pfe ffer -on thisday -o as -mcin tire -mam bazo -lon dons -lok handwala -learn spanish -kissmar c -kathryn bernardo -k lan -j mo -hust lin -ho pie -hil fe -go lead -fl anges -ficht ner -fi ac -en ham -dsl rs -deal with -david cameron -cu tion -cn nopinion -cep at -by women -bul mer -blood stock -bar ometric -atra iler -are te -ar cata -am pu -afun ny -wood winds -wheelof fortune -voter fraud -vier ge -ur uk -u mur -to al -thel ads -sou tien -snag gle -shap ely -sever son -perth now -pa zar -orgin al -net zer -my on -mu uu -mo ha -kriti kakar -konic amin -kir ana -kill init -kaha ani -jor gie -jen in -jay den -indescri bably -imperson ations -holly j -holla day -his sed -hell omag -he te -har do -germin ating -fu uuuu -fkat wigs -endodon tic -de asy -dad eland -cop co -con strain -buthele zi -bur ridge -bour ges -beli ze -bad ged -avi ator -alfon zo -ðŁijĢ # -ì¼ Ģ -z ial -yo tam -year anniversary -yaaaa ay -whis keys -v gk -trans genic -thou ston -tend ring -sun devils -su leyman -stac cato -sp lease -shaand aar -ro sell -riquel me -reg ale -redd ington -reck i -rainy days -pupp ym -pro ces -pop stars -patrick rothfuss -pas ar -p st -our vintagehour -ol ong -odem wing -nic ode -n ces -mu my -mixtape sapp -manufac turing -man citycouncil -m he -live mixtapesapp -lach man -kalin and -k cet -jo tter -itsnice that -ise au -is eng -in dot -imit ation -ill ac -hy ssop -ho ft -hi jau -handels blatt -grand al -glen nie -gin ko -flintri dge -eric colsen -ep t -endor sers -em po -demitas se -cra dles -comm ack -col abor -coal esce -clo che -chronic life -boy chuk -book silove -aver dict -ar stech -al olan -af ron -aerop uerto -ad air -ab staining -ðŁķ °ï¸ı -ãĤ¢ãĤ¤ãĤº ãĥ¯ãĥ³ -âľħ . -âĢ IJ -ysi dro -ye senia -wu erl -world championships -whit burn -wa hhh -vi van -vamp yr -uss strike -urban design -u zu -tro tta -timp ani -than di -th street -te ato -t kr -sli vesmatter -si vas -serv ici -school problems -rugby family -rin hatch -rie beeck -ri mm -pipel ine -pab io -p tu -or show -o very -nb sliveat -me si -matagor da -mas ji -mar gam -lali espos -khair pur -jer il -in consol -hu sted -happy land -ghu ll -ghol lywood -gameofthrones season -funnel ing -frat esmd -frank lloyd -flight line -fer rel -fe bu -en visage -en vie -de gc -ctr lfc -coffee and -cha a -brun ching -brand an -beth fratesmd -ben stokes -ben nies -bear paw -bal moral -bab son -as mir -aray ner -and alus -aggrav ation -ad hikari -abe che -a bey -z ong -will kommen -wa ju -vivi section -vaj ra -uf clondon -tin us -terra ssa -tas ca -tac onic -starwars battlefrontii -slá inte -semin yak -semb ilan -sask tel -saf ina -s max -ro iland -rashid khan -ram akrishnan -pat rollers -pat ras -parnas sus -park ash -northumb ria -nlbm prez -neck i -n clr -multi billion -mid vale -meag re -me har -mace wan -m gn -lap top -la donna -kill arney -ic sa -hq nigerianarmy -hide ously -her ber -hassel baink -fra k -experi encia -empren de -du opoly -die tician -damsel flies -cre asy -col unga -coast to -chum lee -capric ious -bun ds -bow don -bla que -bha vani -bal on -baham as -ary der -apple support -alexandri ava -ae th -[ âĺħ -ðŁĺħ . -ðŁĮ® ðŁĮ® -ðĿĹ® ðĿĹ -âħ ± -ÛĮ ÙĨ -zel ena -y he -withthe stars -whir ls -valken burg -uro web -uk pr -trous seau -transport govuk -tra ppings -toulou se -tool set -to the -the i -sug ababes -so der -silve stro -scott dixon -schom burg -sam pottorff -ruggi ero -promo ciones -poo p -poke ball -palmin teri -over brook -od dy -ny ala -nolen sville -nautan ki -mumbaic ityfc -milledge ville -marc bolan -lev ski -jy pe -iner gic -incongru ous -ilu stra -hu ela -hoo ghly -hel derberg -hall man -h po -glass of -ga ale -flower bed -finner ty -explo siveness -equil ateral -dusktill dawn -digi pak -co ining -chelms ford -case work -cam brai -borne an -bang abandhu -band as -att an -ast u -are em -appe asing -ë ij -Ã¥ r -y andy -x ies -u bb -thel augh -th wonder -te di -tab atha -sixth form -shi phop -santa ana -ru ination -reg gio -rd win -r po -quil ters -petro va -pant suit -oconom owoc -nay i -mh rd -metro card -mali faux -lampp osts -ko en -kixi fylife -kivanc tatlitug -king salman -kelly services -kam ik -k low -k humbu -ji h -ist van -hom g -heritages ite -here com -fil ers -din ka -commerz bank -cantab ile -brac eface -before christmas -b smith -aren yc -are nee -af h -^ )/ -: ,( -ãĤ¦ ãĤ -âľĶ âľĶ -z ira -y ha -what are -well sville -viking pride -vex ing -u criverside -tul ly -tran spen -sue de -sta z -samuel adamsbeer -sam mon -regre tful -plane te -pel angi -par due -p td -p oma -or msby -oli vas -nieu ws -metro pol -ligh ter -lesli eo -le ms -ko val -j bg -ip zig -ing well -ing reen -hrtech conf -ho ffs -hard to -haid agwaii -gon dwana -g tlds -flying lotus -fel sted -fannie gate -fab letics -f ce -do zy -data sheet -dark skin -cyber criminals -ci pr -ca es -bryanc allen -bin go -bhar athi -bab yyyyy -ali o -' ') -ðŁijĭ ðŁı¾ -ðŁİ¯ ðŁİ¯ -web sphere -tun ji -the google -su bie -stronger than -spart ans -sno gging -slan k -sing ton -sever o -sat ta -samanth abar -sam is -rollei flex -reef tank -real matt -ra zar -pit up -pho bos -over stuffed -nil giris -n ura -má r -mun dus -money lynch -mist ura -meri enda -mel fort -mccl urkin -loom ooloo -life force -le vie -jav afx -iti zed -island er -hon ig -ho twire -grac em -di pak -di ddle -con dones -clo aks -cj m -canti eri -box art -bis ous -bi spo -ber key -av ada -arrow smith -ard ingly -ali zee -aaa ahhh -.. âĻ¥ -ðŁĹ ¨ -ðŁĵ ij -íĤ¤ ìĬ¤ -ìķĦ ìĥĿìĿ¼ì¶ķíķĺíķ´ -zsl londonzoo -ym f -yin zer -y ba -way nesburg -warren ellis -w aba -vic odin -tir mid -tick lish -thewanted music -technic ality -tatter sall -strike back -steadi er -star awards -st pm -sp hi -so hl -slu mbers -rux pin -ros ic -repr ori -re capped -pur it -poly meric -our story -no pen -ni kol -nang is -nam jin -na es -museumo fcity -museumofcity ny -mrand mrss -mouth pieces -min young -me aly -marac ay -ly ss -lu tz -lo ew -karl thefog -is lets -is at -in corruptible -hin dle -hi mup -handhel ds -hair spray -gro zny -glo ssing -giam paolo -genius football -geburt stag -fron tale -f ard -eyn sham -ever itt -epi stle -enroll ments -durham cathedral -du di -dru d -di gan -dg ins -cor din -car rou -bri ve -black shear -bell man -band ori -b ami -author uproar -as cer -ar mie -ar bre -afer ro -( ´ -ðŁļ ¥ -ðŁĴ¥ðŁĴ¥ ðŁĴ¥ðŁĴ¥ -ðŁijį ðŁĺī -๠ī -vol kan -v spc -un gan -uk natarchives -thev creations -the bus -ta ec -sy dv -sp news -sp icier -sk z -sher mer -sel am -scott disick -sc app -rain bo -pube scent -prepper talk -prece dents -pm ts -ou mar -ol ona -nationalrail enq -nati vidad -me shes -mar kowitz -majer le -lyn as -li jiang -le brons -lay ton -lar yngitis -kav os -kansas city -jade veon -international nursesday -imit ators -he eeee -ha das -gre ch -freder ico -euroleague women -em phy -em den -e town -dr oning -dopen ess -de ters -dc am -ck ay -cil wx -cali frag -cal an -bram er -board walk -ble ase -beltr ami -bb king -bathroom design -bad ajo -aj ak -ðŁļ ľ -ðŁĺ» âĿ¤ï¸ı -wy g -white hawk -w ingham -vul pes -ucc shooting -tr ys -team k -tan gram -tab comau -t sung -super f -sub titling -stown fc -sig nac -servant leadership -pop cap -plat itudes -par ow -on ero -nup tial -ni hil -ner azzurri -nab u -na dias -makere reu -le sko -kri stan -kapilshar mashow -josh dallas -jackie evancho -in sincere -impati ens -hotel school -high society -hi ace -hannibal buress -ganse voort -gaming news -fri eden -fortnite br -footbal luga -flo s -find horn -fevertree mixers -er ate -epi phan -eng aa -elo tt -east van -ea die -e migrants -dri an -das kal -daguerreo type -cha ouen -brown x -betra yer -bestjo bever -bar cia -ath ene -at ter -arch bishop -ar mini -ap aul -an sonia -å¿ ĥ -âĸ ĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸ -z man -yu vas -wa aah -v max -ume Ã¥ -tru fant -tri une -thisi shar -thegood doctor -tennesse ans -stephen ie -sph x -sol are -smu cker -shal amar -sch eck -sah ni -run cie -pra yut -poly dor -petro glyph -pardue suzanne -ottaw apolice -occas sion -neurofibro matosis -n spa -n gl -mu cci -micro systems -men na -mel ton -matil de -ly ell -loo ter -lefth ander -la sker -ku ts -kri sk -kon ig -kin na -josh duhamel -jan aki -ine er -health is -gro pius -gi bt -gar nishes -g eli -fut taim -film review -feu dal -faw ning -enter com -dolgel lau -deep u -cor bett -cho wd -body image -be are -arch iti -ar gs -angel charlie -am bs -ain sle -advi sement -ðŁĵ· # -ðŁijİ ðŁı¼ -ìł ľ -Ùħتع Ùĩ -zid is -wow selfie -wee dman -wal wal -us afootball -uni kitty -un migration -toy shop -the kingof -ten on -staw ell -som l -sno bs -she kinah -robert plant -queri da -polici a -other ness -news bayarea -new sy -nau r -mosle ms -mi mis -mel son -master stroke -mac sports -leni han -kam ryn -je x -ino z -ice wine -homopho bes -hab ism -guru kul -gu oan -gren ville -gold son -gaz oo -galli gan -fig life -ffe ct -fair way -en bush -eck lace -ea sts -did it -dhar avi -def jam -cow shed -ci me -chum ley -chry st -ca q -bor do -bojack horseman -ben ice -beauti full -base point -bar rs -aw ny -attenu ation -amazing spiderman -ali ant -al ghero -abo ston -ãĤ ³ -zak im -y ali -wx yz -wo tw -winter son -wak at -vz w -up starts -ther ise -the da -teren ure -teb butt -tan vi -ta if -supramo lecular -super speedway -stati sm -spri ghtly -sony max -slur red -sil vered -sel way -seab iscuit -sav ored -sand blasting -sa ken -ro zen -rid dims -re fitted -pi ff -parent sday -p aga -ot x -or jay -not out -mol and -lyn sey -llan elli -kit imat -kak uma -k hol -jun ks -jason manford -is anti -ili stic -il aw -holodom or -hodge podge -histor ique -hack ath -ha zem -go ed -gi ffin -gi dit -gam mar -foxsport saus -fo ord -ev it -european lms -ent rain -emmy rossum -du hh -dodeca hedron -describe your -den ting -cotton mouth -climate reality -chu ma -chi mu -cer in -car amba -bra thay -bor mio -baa ack -ar nis -ap ut -ap enas -acreative dc -a stors -a ism -zoid berg -wild nout -white bait -wal tman -ve ster -ti jd -sing leness -sil char -sh anny -se du -screen cast -rad m -rach it -polit icom -po com -play stati -open world -oc chi -nzo gs -neuro degeneration -nay ar -nan uet -na esp -muir field -mis behavin -mel asma -mc nichols -mash burn -lock smiths -khajura ho -kha chat -kalin white -is ag -inhabit ant -il def -iam x -human right -her ning -hd ds -goo sen -gol borne -glen mor -git ex -g hassan -free music -f anno -el are -drun ner -day ak -cudd alore -cre agh -co libri -cloak and -can th -bur rill -brad dy -boute flika -boul le -bor den -bomber league -bo q -benton ite -bel cher -austy nzogs -af ed -abo ts -ðŁĶ IJ -ãĤ¹ ãĤ¯ -zak opane -x na -x brl -wy dd -whe atus -wam ba -us q -ub nt -type writers -trou w -thel ens -team vic -takeyour dogtoworkday -tak appa -swell endam -suriyafan sclub -sr pt -so ori -sneaker heads -sle man -shor i -shil pash -shape shifters -se ah -purpose tour -port cullis -p inf -over achievers -ori ano -on cle -nh f -ne stea -myrt les -mudi ay -mc ki -maso chi -lingen felter -kil lem -kier ong -khali q -key arena -kas par -ka bel -k rule -john d -impres ario -hor r -hijab i -glu es -glo c -gil lam -gi de -geo chemical -garden route -flo track -enjol ras -en able -dynat race -dro more -dia vel -de crypt -cochran e -co simo -chi desai -chelsea handler -bra shear -bo ke -bo burnham -bla der -bark box -ari ens -ah rc -ðŁĻıðŁı½ ðŁĻıðŁı½ðŁĻıðŁı½ -ðŁijı ðŁĺį -ðŁİ ¢ -ìĹ ĺ -ìĦ Ń -âĿ¤ï¸ı ðŁĻıðŁı» -v expert -underground wgn -tu ckers -tr n -thereal j -the poet -ter uel -ta fe -sport suk -sk ov -shu tup -science of -sc ra -rr b -pr gm -pic cy -pen rod -over nighter -o dio -niq qa -ng f -n ssa -mz katiecassidy -mt go -mo vi -melchi or -max xi -masa yoshi -marsh land -llandrin dod -ld schurch -lam ide -l cd -he ph -harmon ization -ha sek -gt bank -gren nan -glocken spiel -gemm ill -freelo ader -financi aleducation -f hir -explore wellcome -esc an -dou ce -din do -di visible -dal t -cu ne -cry tek -coy bib -champion sle -cel os -bi wa -beer us -bal das -at cq -ark ells -ai kens -ai b -accru ed -* ' -ðŁĴĶ ðŁĺ¢ -بصرÙĬ Ùĩ -yu mmo -yo gas -yar mul -wk n -wer tz -wer bung -val anci -upro xx -uk raina -tur bidity -tin n -subtle ties -stop tpp -slim mest -slau son -si swim -sh uru -rosann apan -rosannapan sino -ram une -raf bf -pog gio -pender gast -over powers -nur u -novorossi ya -middle brook -men slax -may belle -ma po -lust ful -lim pet -l lego -kat akana -kane ko -jonah marais -ho sk -go c -gal ar -fu ck -fol le -fistic uffs -femin ino -er hs -du sh -door knobs -dishap atani -cu mia -courtau ld -conclu sively -col ina -cav o -c agua -bi ondi -anan tapur -am ena -ak ito -ak ay -aj styles -âĿ¤ ðŁİī -عÙħر اÙĨ -youth sporttrust -w aded -villet n -tweedle dee -tu bi -top scorer -thei sen -the joshuatree -t mac -sustainable living -sp la -sni ff -sim son -sik ri -sav oia -robin meade -retrac ed -po kot -pleas ingly -photo credit -ph bo -pec tor -o hashi -newport county -mon eta -mcal eer -loo ve -lic he -lemon defr -lau ge -kre ps -keepit local -jon axx -jb gill -james bay -j anda -isab ell -hunder tw -ha ii -ha chiko -gran ja -go bear -geraint thomas -fil mp -far man -fa hri -ev am -don nel -do rey -dham ma -collar bones -ch p -bun co -bronze age -bi bl -bell wood -be elite -baseball cards -aven sis -autom ator -amin ah -a é -ॠĮ -x olo -wool acombe -we wont -von erich -vi eri -var ick -tho e -sou therland -some onet -skype classroom -shor n -sc p -ry dell -ros ner -roar loud -ro wh -ro mas -pueblo s -pro tom -percol ate -perce iving -open house -mers tham -matt gaetz -mand ar -makers gonnamake -lyn brook -kri el -jo tun -jamiemc murray -j kt -i pu -hav ai -harpercollin sin -gun awan -go canes -gar side -free spirit -fer ments -fe s -en bau -emul ates -elabor ately -do of -da king -da ithi -coz mo -cla ssen -caul field -bru cer -breakfast news -bor ge -blouin artinfo -bit ting -birn baum -ber ms -ban quette -bal con -back stretch -arre ola -andre ahor -am by -ad ham -!! âĿ¤ -! ðŁĺĤðŁĺĤðŁĺĤ -ðŁ¥ ¥ -å ĸ -zachary quinto -x q -wro xham -world vegan -weal den -w sp -un ripe -un gar -tom me -timeto change -the west -the vamps -that works -tart let -sur ratt -sum ire -ste vier -ste arman -stap ley -stal ag -scor chio -ry ders -premi ère -pff ft -p timal -oven timiglia -off rance -nu uk -nex tera -mu lia -missuni verse -mil oventimiglia -magnu ms -lu ta -leslieo dom -leslieodom jr -ker nersville -karan wahi -in progress -ij ssel -ic mp -huffpo stuk -hat ted -han eke -gandu je -fuku i -franz iska -fertili zing -far zana -dundee uni -dear man -de core -day for -constell ation -collo dion -c zy -bright line -body count -ber jaya -bat an -bad am -b dc -ardo yne -ap athi -ami des -amer ks -am ery -acos grove -aco at -ðŁĺļ ðŁĴķ -ðŁĹ ³ -ðŁİ ¿ -watch me -tt m -the ultimate -terri bles -sw t -super team -st ilo -so hi -sk gaming -sar no -sac cone -ri ffle -research highlight -r me -quad rat -poe tically -ple ad -pitch wars -photo blog -parti da -o zz -n ilo -min fo -micro wave -mak hani -lily dale -let as -kal ita -inter jec -in ic -ill ana -hu et -ho arse -green head -gesch ich -gaz an -fly ingh -evacu ates -enum claw -engal uru -ence ph -en ta -drawin goftheday -diso bey -dion ne -diocle tian -der yck -del ka -colon izing -colon ist -biglottery fund -be magenta -bakh sh -badajo z -ay en -avi ones -andrew j -al rdy -al esi -ab k -. ðŁĺ¢ -* ? -ÛĮ ا -и ÑĤ -win ches -vla de -use c -ugand ac -trans world -tommy chong -tele phone -swol ves -stan sbury -simp ang -shar pay -shar king -secure the -ryo kan -rosh hashanah -ro li -ram u -ra jah -pursu ant -phu ong -per ito -nulli fication -no limit -na aman -n nt -monday night -maz al -latch ford -kol lywood -klu g -jo j -jennifer morrison -iz aya -itv calendar -ihsa state -hyacin ths -hem lock -hel y -has ler -har deep -gol drush -fri d -fam er -fab ulo -ent ic -emar osa -citizen liveat -carre rac -bronze bomber -bran ko -book week -bi ggers -b ander -ay to -astoni shment -apur pose -aber gele -* ~* -ðŁĺĶ âĿ¤ï¸ı -z aira -young k -yl c -wid de -wet more -w tennis -vu i -un bounded -to ppo -there abouts -thename is -the eagle -tangany ika -susang komen -stra x -sp enders -smu lders -sefton hour -sa gh -proje to -prodi gies -prin ze -pr al -physi ques -per rett -pas and -pan k -op rano -of dreams -new z -my choice -mur ch -ma hela -lori moreno -legal ised -le sle -lagni appe -koval chuk -ko tc -keb bel -katharine mcphee -jer ash -jar ls -jail breaking -j edin -j cole -impro ver -immigr ating -hub bard -hi es -ham am -gu shed -great taste -gl ack -gender fluid -g chs -fun ches -freak ishly -fool s -folk ways -farru ko -en sen -em elie -elite book -el bowed -edge mont -du ss -cuck old -chig non -chi asson -cheek bone -cas sar -bor am -big narstie -ben in -bas com -ash dod -and dd -alli an -aga the -a thri -ÙĦبÙĨ اÙĨ -wal she -var us -vap enation -v ink -un pad -un inhabitable -th chat -swan lake -suren dra -studentath letes -sav ino -sar te -re assemble -q we -pigg ate -pel ts -nw t -na del -n re -min tage -min shew -michael is -mat anzas -masto don -lock jaw -lock a -little steven -lil t -la gu -kr m -kla gen -kierong illen -it sag -i read -hl g -ham bone -go tribe -giar dini -g achi -fran ds -fire fighter -film challenge -exer ting -eg bert -dg ate -cy co -cloud iness -clon don -claire mont -cdn screen -bu se -brue ghel -boss day -blan ket -bird sofinstagram -bam yan -back stage -ba ah -ayesha shroff -ay oung -arth as -ak hi -ad ab -abio tic -... ðŁĺİ -Ĥâĸ Ĥ -ðŁĴŀðŁĴŀ ðŁĴŀðŁĴŀ -ðŁĮ ªï¸ı -аР½ -ziggy marley -women shockey -wc b -waist coats -vasu dev -tre bko -ti ds -sunday morning -sui vez -side man -se sac -sch lichter -satt ler -sar uman -s ã -reha sh -public power -pu shover -pre wedding -po tro -pier pont -parag on -oval tine -newh ouse -new mar -ne wr -nax al -miz ner -mal lette -lough ran -long ish -kol in -jun gian -jah res -jac q -ig an -hant si -h vr -geof froy -gelatin ous -ess am -eno shima -engel brecht -el rond -ed ling -ec m -dam it -contradic ted -cocacol aco -chero keen -chaf er -buk we -broker ages -bleed purple -asi mo -anun naki -aly ce -advance dwarfare -! ðŁĺĨ -ðŁijįðŁijį ðŁijįðŁijį -ê¹Ģ íĺĦ -ç ¨ -व स -we an -upup cronulla -uof u -unite and -tol land -th wait -tg u -tatar stan -sweet bread -sou thee -son as -sehun day -se stri -sax es -sarg syan -rickast ley -re testing -re load -pu ce -prideof britain -place bo -phil ando -os ita -open houselondon -op ine -onthis datein -now ww -ne mo -na enae -n wark -mule soft -mer horn -marquette u -lo dh -leven e -khar kov -kent on -inten tionality -inc ited -il yushin -if cc -idiosyn cra -ger vin -gear vr -fit zy -fight cancer -fam agusta -even in -er usa -en ses -econ o -dem ps -creed moor -chap ala -bro r -bol anet -banar asi -aw ski -au v -atleti english -aj ni -ah oo -ad yar -ðŁĵ¹ : -y ces -v nc -ur ru -ty ce -thr an -swach hat -sve ta -stack overflow -sol an -sof lo -silver chair -sco ggins -sco ach -sal ps -run out -re sti -re paying -poe tess -pe tula -patin kin -pa sia -of b -mu ley -mast itis -mang khut -mand arin -man ch -mach ynlleth -lo bb -life coaching -lev eller -lemon ade -kur an -juan mata -jan us -j atin -inc ised -illi dan -il and -hold fast -his ses -har ith -gregar ious -ger stein -flyo vers -fire weed -fi et -fav ourably -exu ding -denis of -dan on -cu bit -con naughton -co hoes -cas sill -cafer acer -bat u -badger monday -auto week -ash wood -a ase -! ðŁıĢ -á¶ ľ -za res -yom hashoah -wear side -valanci unas -ul man -ue facom -toshi o -to pher -tinker cad -the gill -ta ino -sunny days -sub cutaneous -sell er -scant ily -sc la -rot manschool -reynol dsburg -quest nutrition -pot stocks -photogra py -over water -onelove manchester -oler ance -neuro developmental -movi miento -mel ita -mccull in -mariamen ounos -manchester arena -man zil -ly th -link öping -laurel park -la dwp -ku kri -kaz ama -kac ie -is kra -ip sy -invul ner -hyper drive -holgor sen -hol lens -hof ner -heure ux -gree kislands -girl group -fy m -for du -fon go -ff b -femini zation -faroo q -equestri agirls -e hu -drive shaft -de by -dd yer -d kb -d company -d anda -cov ado -ci enci -chop stick -cat v -ca jas -blan kly -binaryo ptions -bake along -axstv fights -an antara -ama ury -am docs -ag om -adobe xd -ðŁĴ¯ âĿ¤ï¸ı -ðŁ¤¦ âĢįâĻĢï¸ı -âľ ¡ -yn ash -y ari -william hill -wb d -walk over -ve vey -u meda -touri ster -toulou sain -tol hurst -t gp -summer readingchallenge -su kab -stra vaganza -sk aven -simul acra -show band -scra pper -sand f -san teria -ran agar -ra ghi -quick en -pen wortham -pen ick -pe tya -out crops -nebra sketball -near shore -moor hen -mo ver -mil las -may uri -mat tos -manufac tory -lic ata -kay lam -k oos -joye use -in scru -ilove heartland -hubb le -gum road -gul lies -ghostinthe shell -g ape -fon dling -fla gon -feedyoura ddiction -eve rett -dot to -der on -das uki -cover all -cor regi -coleco vision -co wra -chocol a -cf pa -car goes -blu dgeon -bla z -belu gas -alvar omaldini -ack ers -ac entral -aby ab -a hearn -vas sal -uc cio -tur ki -tu scan -trump kim -ti thes -ti fs -tech women -taxic ab -supano va -scar brough -s jam -ro mario -progressi vism -pm live -play matters -pc bc -pac ar -pa vey -p go -olan rogers -ob il -national sandwichday -missing kids -mar onite -man preet -machiav elli -li ang -le sen -kul gam -kre feld -k wood -jan zen -jack rabbits -it bp -in corri -ican ada -hypnoti sed -h js -go war -gnar led -ganano que -fore warned -fol ding -feliz viernes -fc twente -fat f -f opp -exhor tation -eff zeh -do ddle -dhar m -des boro -da ina -d de -confe x -car rell -canap é -book shop -bl anda -bbc snooker -bb pilipinas -ball inas -back spin -au strade -am lo -am am -allevi ates -alam ed -al mos -age ha -ðŁĺľ . -ì ĩ -âĻ£ ï¸ı -வ à®° -z oli -yu mmmmm -y cle -worldbook dayuk -wigan council -visu alizes -van oss -ule ma -tro icki -trans ference -traffline mum -thugg ery -tan er -t shabalala -sym bian -susang ilbert -sma de -sh ach -sc aping -save a -sal bum -royal ty -rang an -plane tofthe -patri dge -past illes -palis ade -ori ole -oom fs -nick lachey -ni go -n to -n ira -moisturi zed -miz uno -mira bel -microsoft store -mal adies -magi x -low a -logan paul -liber te -l kg -jeff probst -is ong -intrac table -has brouck -fu schia -far o -fa it -eu karyotic -erne stine -elic its -croo ke -cra c -company culture -char issa -balasu bram -at risk -aborig ines -ðŁĺĽ ðŁĺĽ -ðŁĺĢ ðŁĺĢðŁĺĢðŁĺĢ -ðŁİĢ ðŁİĢ -âļ«ï¸ı ðŁĶµ -zz i -yab ba -wr r -wit ts -virul ence -vi rar -v gs -v ache -ts wag -tromb one -tiang ong -thestroke assoc -tham rin -take on -stones our -sa ki -root sports -rand al -r tn -pr ongs -picar die -paulo aken -pash ley -par ken -ocot illo -ny f -my top -mut ate -mon oun -means business -maun dy -mastersofthe universe -lp sc -lim bic -laurajane grace -kul bhushan -kam aal -io vine -indo chine -in fielders -in dent -i ball -hok kien -head on -hallmar kies -h so -h ile -green washing -genu in -ful fils -fire red -f xx -e tre -doones bury -dg k -de car -dahl gren -cle aves -carol an -bu stan -bri ms -bra zo -blue point -bad ging -avan shi -ar vi -ani bal -andreahor wath -amon th -áµ Ĵ -wwe fastlane -wis a -willing blam -wil lock -vu ong -vox el -vee phbo -ur bain -un tam -the ma -su chen -sin ge -seth green -se co -rumb elle -robu sto -ring tail -ri yaz -re program -re ep -re assessment -pn f -over charged -ol inda -o sea -noord wijk -n gb -msc actions -mey erson -mand ap -ku ster -innov ated -hy la -heat waves -hanson music -gri es -gol u -fro mel -fer menter -fau ght -fal ooda -f arias -er for -dra sh -disc ol -desi g -co aldale -cep tional -cen tex -cas sette -car naby -bun ter -be ton -all sop -al fano -afro pop -?? @ -winstar farm -wick ford -wh h -var ic -uwe bristol -un consciousness -trans boundary -toyo da -tar ap -sty ria -spru cing -showme your -sar az -sang ita -san ja -sam achar -sali do -ru chi -rs j -rhu mba -res q -quar rels -qual y -q on -q mul -pocket knife -petro vsk -pe ur -pauloaken fold -palmet to -ni w -n flying -mor anis -lun ging -loz enge -lauter brunnen -kur ung -kerma dec -j end -inspi ral -high worth -gul let -gi ev -gh k -en ki -doppelgang ers -does burg -dil jit -dardan elles -d anta -cur belo -comd tac -bo jo -basseth ound -bac ter -as col -alapp uzha -ðŁĴķ ðŁĺĤ -ðŁij¨âĢį ðŁĴ» -with modi -wel born -vol terra -vi reo -un restored -u kem -twin n -tweetur biz -tr ounced -torre molinos -toronto pearson -tanger ines -sy dow -super chunk -stal inist -slat on -skin heads -shankar acharya -sar panch -sa be -s style -ry ar -ry ann -roo ki -r ll -q br -pure magic -pan go -p ams -over landing -or ka -opo ku -od den -migrant crisis -meg ann -me the -mck ernan -mac kem -log ism -lat rice -la hood -kings lynn -khu shi -ke mps -kac ang -k alli -ir lande -hor witz -harri smith -greek week -great place -gi psy -fu zhou -frank ish -field fare -fan shawe -en yt -don ati -di ously -cine t -chico state -car us -car nell -campan ula -breast milk -blood cancer -bhi du -beer pong -ayck bourn -arkell smusic -am boise -al fi -ae on -adu blin -accentu ated -ab ama -aaron hernandez -ðŁĴķ ðŁijĮ -ðŁij¯ ðŁĴķ -Ê Ĵ -yal c -woman ly -wit e -wel sham -vital ity -visit philly -vegas con -us an -tune z -trump now -tool ate -to bie -thru shes -the henryford -te esta -tanehisico ates -taik await -taikawait iti -steam boat -star less -spic iness -sk oll -sin siders -sem powerment -schi ppers -sam yuk -rump el -rhin eland -ren aldo -relap sed -raman singh -psycho geography -propag ated -prince ville -por osity -photom eter -pa cha -oldham hour -o eln -mumbai indians -monday funday -mikha el -micro dermabrasion -megastar chiranjeevi -mat ara -lo sey -lith onia -li em -kon oha -kim bra -kid min -kalinand myles -jer kins -jc vd -jayant sinha -ja ish -hun tel -house bound -her i -green thumb -gor an -gillian anderson -gang nam -fortu neteller -fie bre -f wi -em mas -dri vable -dress shoes -dou ches -diabo lik -cool katz -comrades race -class work -cdn film -bit bucket -be chamel -bb tv -baltimore police -ash g -arin dam -ar ul -ap sley -al sager -ais linn -acan al -? ðŁĺĬ -; # -ðŁ¤© ðŁ¤© -âĿ¤ ðŁIJ¶ -z edge -y aks -winter soldier -who you -wha thappen -vill ans -usu i -twit ta -twin kle -too m -ther midor -tex p -ste o -sj b -sher ine -sas campaigns -san er -ro mar -red minote -plat on -pet supplies -pay g -ou de -or omo -motor co -mind tree -mi ec -lon do -leon hardt -l kr -kirkintil loch -kh ouri -kbc channel -kar ima -ka ina -k dwb -justin rose -juli ani -jeff merkley -itu esday -ip ers -ie g -hyper v -hom ep -hit theroad -hi el -ham burg -gre p -flit wick -e ula -den nings -cow fish -cos ine -colton lhaynes -clen ching -ch ö -c tic -bre aze -brad leys -book smart -blood wise -ble del -bel sen -bc wildfire -aw ad -arstech nica -arashi yama -am official -am ca -a os -ðŁij¨ ðŁı¾âĢį -å°ij å¹´ -winkle man -wig go -vou ge -us kies -ul p -ton ym -tg cf -team rwb -ta iler -syru py -sun seeker -sports line -spiritu alized -ski ffle -si ds -sham im -se bald -sar ris -ru fio -romb lon -righte ously -rebel wilson -railway museum -r wang -ore x -on ti -notre dame -ne z -na shoba -moo y -mis sr -micro prompt -manhattan ville -malari aday -mac adam -luang wa -lot tery -iwant to -incapac itated -im ber -ilove mcr -iam saidharamtej -hin oday -her u -gg in -gar ver -fumi gation -foxsports west -em powered -dr ms -domin ick -den es -de safi -corin thi -conversation uk -calori fic -barley corn -ar mag -any time -allo saurus -alder grove -accoutre ments -abdul la -Ĩ ãĤ£ -ðŁĴĸðŁĴĸ ðŁĴĸðŁĴĸðŁĴĸ -ðŁĴ¯ @ -âŀ¡ï¸ı # -you dont -ye sha -y apa -wing nuts -viv int -v ted -un assail -thursday morning -the athiyashetty -sous vide -sin cil -sch ramm -sam witwer -sahi ba -sacrilegi ous -rin na -reti ef -reeper bahn -red currant -real ddp -por ate -popu lists -passi flora -oil cloth -ohio stathletics -ny ang -noor ani -nikkie tutorials -new ells -nat ak -mss oci -mi rip -metal fest -meigh an -meet inghouse -mar row -magne tized -lucy slaw -loo sens -lin tel -le sar -jon snow -jol son -jenni rivera -hand forth -game book -g bb -ex on -erock star -ent soc -elek tro -ek azarian -e ikon -dra zen -de at -dat to -d hin -cu pids -craft sy -chel a -breaking views -avon mouth -ati x -animal testing -aki shore -ad din -. } -+ ' -! ðŁijĩ -ðŁĴ ¼ -ðŁįį ðŁįį -ðŁįĥ ðŁįĥ -ðŁ¦ į -° âĢ¢ -z ele -ys p -wh ata -we sanderson -wan stead -wai the -w tr -universityof ga -un ting -u ren -ton gued -thereal buzz -tfl tph -ste ger -stanley cupfinal -sof rench -sl s -sick ert -she sha -sas an -sam plers -safe keeping -reichen bach -pal z -outh africa -oneless gun -ober yn -nation of -micror na -mat on -man ig -ma hoo -leach man -kie hl -keween aw -is db -inter locu -i spy -hor ten -hay les -gujar ate -go old -glass boro -ger not -ga tha -fi de -f wf -exal tation -erri gal -ei ko -der ain -dep ablo -d hat -cuid ado -cb ce -bur naby -bir stall -be vac -aun ch -aujour d -au sage -at tics -at kina -ar nataka -amaz ulu -al melo -al bic -wat cher -v ha -un problematic -trevor row -to kaido -sw akop -sportsc ast -so dus -slow ness -simon stown -sever a -sab io -ru hi -roun drock -ri do -rally mexico -qaw wali -ple ttenberg -pan esar -os goode -op chemtrails -nik ole -nicol aus -mu stering -monte reya -liz beth -lad son -kir una -kir ko -kenya airways -kaw ase -ka hl -k achi -jet set -j olo -izu eta -hu atulco -he yyyyy -has bro -girls nightout -ga stel -fu oris -fromthe vault -devou rer -del tat -de hydrate -day lighting -dann yo -competition time -chim ay -cantile vered -british f -boilerroom tv -bo ers -bestof british -bal sall -b mtc -az one -aw ami -avin ash -as sin -adap to -accompan iments -aa os -ðŁ¤ µ -æī ĭ -åĨĻ羣æĴ® ãģ£ -ãģ¦ ãģĦ -âŀĸ âŀĸ -Ñ į -yorkshire is -yo gab -x dddd -water slides -wad den -umb b -ther ion -syrian army -swin k -stra yer -stop yulin -slam miversary -skid row -skan ska -shopping online -shivu adda -sbli i -sanit arium -ru ess -rr g -river run -ril las -quadri plegic -pin nick -peace time -olive tti -nak ayama -m gn -li vand -kla assen -kati ele -jung lee -jumb ura -jay sean -ja en -i shin -ha ina -ha akon -gri f -fru gi -fr g -for son -for agers -esco bedo -en derby -dou bler -do bara -cry an -cor covado -cdn olympicteam -bibli a -bhar adwaj -bell tower -ay na -auti sta -, * -ðŁ¤Ļ ðŁı½ -ãĤ į -zz er -yam hill -ver sion -vande weghe -ul c -to rero -su its -street team -sho ki -severe wx -rome os -ro opa -reclai med -ph are -op ic -obam af -montereya q -megat on -mc wfc -mari adb -lu fc -labor ing -ko za -ko iv -kang nam -john paul -irfan pathan -intangi bles -imou to -i stand -home place -ho wards -halle berry -gregori us -get chu -fx cm -flo gger -fer rers -fair hurst -esk er -efra ser -diamond jubilee -de ora -cover tly -co perez -christian sburg -chri sette -ch é -carri eh -caram anga -cam illus -bur gon -bread crumb -bre izh -bbc goodfood -ask for -as wad -ap jabdulkalam -antag onistic -am jad -al mam -ak ande -adink ra -ac triz -ðŁĶµ âļ«ï¸ı -ðŁĴĻ ðŁĸ¤ -ðŁĴªðŁı¾ ðŁĴªðŁı¾ -ç ĥ -Ë Ī -é xico -ze bre -wante duk -tw oods -trivi aday -tox teth -tid dies -thu la -theofficial sbi -then i -the free -templ o -tas ers -tan f -south jersey -sou suke -sla ine -sea bees -saturday morning -ru gg -reister stown -q aim -pu jol -plant ation -pil key -physio therapists -philli pa -pashtun longmarch -par ly -ovi Äĩ -our tney -op tus -n aging -my day -multi sensory -mplo yee -mon dal -mcke chnie -lax ative -lady podsquad -kyo ku -kidney cancer -kick ing -ke iran -jeep er -je wl -jay la -iot security -influ ence -indiana fever -ij muiden -hypno therapist -hali za -graff ito -fu gu -fiji ans -exter n -ed gier -e igen -dumb ed -dick er -dae won -co housing -chab uri -bo gg -blackand gold -bal azs -ay re -av itch -au bert -angel arayner -ag nez -a ok -ç© º -ãģķ ãģı -âĨ ij -à¹Ģà¸ Ļ -zan ella -wl ky -well and -weal thier -under coat -u tin -trad able -ta pah -stra hd -sl veng -si ria -shave club -sce les -sal mo -robert glasper -rcar mitage -rak ha -ra van -pro drive -pla sma -phi sh -p eller -outside magazine -or cutt -on ard -omen i -odhi ambo -oak ham -o ai -nikola os -n music -motor coach -mccas key -macin nes -little finger -lat asha -kot ka -jo ep -jar ah -j du -iw p -ite sh -is mat -idar thritis -holli day -hal verson -ha vard -guil derland -ge ils -g vb -g sathletics -fung icides -fu mero -for pa -elling son -dor mancy -don of -dis banding -dige ster -day parade -char lam -capit alizes -cane gra -bu blé -br ingh -bi sexuals -bein ecke -bal an -bab angi -av h -august ines -ascend ancy -anishin aabe -amar ula -al able -absur dist -; ____ -ĥ ä¹ -ðŁĩ¦ðŁĩ ± -å¥ ³ -à« į -zz z -yog ya -widde combe -war i -vol ve -ul rike -tro twood -the greatescape -tha ad -tc pa -stay classy -sr il -sp hila -san abria -sab at -ry m -roberto cavalli -road shows -rep eller -railroad ing -pu ds -perme ate -penn statem -pedra za -pas sing -p nb -or nis -ny gv -nie w -mt lv -mk don -med aglia -mc beth -mc allen -lo tr -lincoln ton -lill is -laser cut -language day -ki ght -k attan -joseph son -james mcavoy -inter species -instal ments -i just -hof meyr -hite sh -het tie -he don -gorsein on -geta way -fr üh -fle dermaus -fin icky -fero pol -faber gé -f bg -excit ingly -etu des -enlar ging -el win -dun ster -de stre -de camp -dave matthew -crest line -chat win -car cross -cam bu -bree z -bo sun -b ja -aw acs -av chd -army day -ar uh -anne ke -zen do -xen arevival -wi thern -wft da -view tiful -underthe dome -tram ping -time sheets -talis ay -sycam ore -supportn wt -super villains -star gell -soul fly -so j -slow food -sig machi -sand co -salon du -sal lies -sak shi -roy ster -ri skier -re format -pau ll -pascu al -ore imo -n mm -mo ssel -mo ate -meteor garden -magne tically -mach ismo -llan gef -jer wood -jef fro -ignaz io -hyper plasia -ho ko -har n -hai den -gu ten -ge gen -gau k -forth right -foreclo sures -fin alizes -exempli fying -ep onine -elle tti -eleu thera -du ch -disaster recovery -des don -delici ou -debre cen -cool angatta -colle ton -cla sped -cit ilink -chil eno -che halis -calder cup -byd go -bus se -bonny ville -bodn ar -bifur cation -bestfandom ca -ben ko -ba qi -ay im -agamem non -.... * -... ~ -! ??? -æŃ Į -âĿ¤ï¸ı ðŁıĪ -vi ers -uz alo -uk houseoflords -tillot son -theak ston -tagbil aran -stabili zes -so de -sne deker -ski les -shan er -sen ergy -sel fy -sch ar -sal army -robusto babe -rc ade -pic ador -pear cy -pan ay -opend ays -oli vi -ntv weekendedition -ne gras -ne agle -mu cca -moneti zed -lu pino -lick in -kathy ireland -ja afar -incen sed -hail wood -great cause -goldengate bridge -gold farb -goal setting -ghost recon -ga irport -flori dal -fli ppen -fi she -far ra -en di -di staff -dah y -cri bb -cre edon -con sin -col men -co sponsored -cin donesia -brow nie -born tobe -bo gard -biffy clyro -bella vista -ba wn -aw s -alexand ru -ac opter -ac ces -aberystwy th -. ðŁĺħ -ðŁĺĤ ðŁİī -ðŁijĮ ðŁı¿ -ye eeee -yaman aka -yakin iku -weak ling -wan ji -tuss is -timeto play -sull inger -str un -sp urge -soun dary -sor te -si deb -sau ber -red day -re dy -ra che -prote c -privateer press -per lin -per ic -p shs -ode h -nbab day -mul grave -mp c -modul ated -mis steen -michi o -mevag issey -met u -mantic ore -lus combe -li vio -l bo -king smen -jj c -ichi ba -hod ler -hit less -gos set -g pk -fck oeln -fangir led -f ons -eich ler -eaz y -east vale -der ful -dau er -compos itional -cat kins -calli graphic -boy ard -bon aventura -biop ics -be such -bbcle icester -bbcal ba -av ina -alu zon -al ind -ak ry -a stringent -!! * -ðŁijĬðŁı» ðŁijĬðŁı» -ðŁİģ ðŁİĤ -ðŁİ ¡ -à² Ĺ -Ù ł -ye omans -wx ii -wo te -wi tho -wh are -vod acom -verif one -v dv -tsun amis -trav ell -trade off -tool room -stori esof -sp icc -son yes -shoed azzle -shi hab -schomburg center -sai ful -ron ni -roarloud travel -ring let -red in -rap ace -ram es -quar re -plac emat -pi gott -north jersey -ne emo -mor tons -mis direction -mick le -mi j -lead theway -le os -le mo -jitendra singh -j mp -ici ón -iam rana -i won -heel ers -heart lands -ha thi -gr ps -go griz -giuse ppe -giam battista -gener gy -ge do -g pe -eth icist -dra upadi -deleg ating -de growth -d bag -cze chs -comp toir -charle sm -bur chfield -bne i -biza sia -be ready -bds dragonflies -asli yoyo -ari ver -ar ba -appalachian trail -all hail -alge ciras -week lies -water boy -va ez -til man -thomp kins -thene therlands -su en -stalac tites -specul ates -so di -snu ffed -she reen -scotthall nwo -ri sto -ren ly -por ro -polic eug -plasen cia -odd fellows -mount joy -mo sier -manil aluzon -magen nis -ma ak -leg as -la za -katy isd -kam and -kam ali -jo key -jim ene -its no -inst illation -ideo logically -i aw -i ao -hy ams -hu berman -home wrecker -gold field -g sofa -fu or -fou z -film fareawards -fer ber -enni um -e marketer -disgu stingly -desig ned -democrati ze -cro agh -chett inad -chain ring -ce ara -candice kp -brain cancer -boom bap -bon ino -bo zak -bel more -awesome st -ad cc -aas tha -: "" -âĹ Ĩ -zepp ole -yogi babu -wide band -whoo hoo -warm ington -voc mnews -ultra sounds -twi zy -tran che -tic h -then igh -the family -t gom -sy rups -ster ns -sinu ous -shingekinok yojin -scher merhorn -ronal dre -rock s -range ela -ram il -politicom ag -pitch atpalace -ot lfp -os rs -ol dd -ok tar -ny strom -nat or -nasti ali -mis spelt -mea ford -man asi -makers mark -mahar ajas -la ddu -kir ri -ken nelly -jj author -ishqba az -inherit ors -ic fp -huntel aar -hindu rajyam -gre te -giff nock -g nu -g audio -fresno state -flori ana -fan fan -du ro -donagha dee -di bru -deb namcarey -dal at -cros scu -contu sion -commissi ons -clu cking -cimo relli -ch awal -cat sare -cas set -burun dian -burn age -brick laying -brad thor -be holden -back to -awild life -anarch ic -al ag -ab ank -a ica -ðŁĻıðŁı¾ ðŁĻıðŁı¾ðŁĻıðŁı¾ -ðŁĺ²ðŁĺ² ðŁĺ² -ðŁIJ¯ ðŁIJ¯ -ì¤ ij -âĢ ² -á rio -y stery -william devry -werder bremen -vk xip -tyran n -tren ching -tip sters -syn nara -sw right -suppre ssive -star liner -solu bility -site c -shaw nat -sardan arohit -sar kis -rene eyoung -r ÃŃo -pu jas -psycho tropic -pss sst -providen cia -pl ss -petr illo -per cen -pc cs -park town -pad ano -pachy derm -onceupon awine -natu rist -nak ama -naf s -my ki -marma duke -mait land -lu ba -letsgo peay -lefthander sday -laz lo -lave zzi -ko taro -kit z -k nt -jäger meister -joss whedon -imperson ates -haj jar -gor ving -gen au -fu to -five star -emerson college -ea org -diste mper -dau ph -cro cks -cri spy -ch ome -ce du -car vey -bo vet -bluemo on -big issue -bab oo -b hang -arche ology -ar ayana -apprais ers -ac op -ðŁĵ ® -ðŁ¤§ ðŁ¤§ -âŀ ¥ -áħ ł -wy oming -water view -war ps -vivo v -video editing -ven ceremos -us yk -urgent podr -u sia -tre stman -tb harat -sun ds -stra der -soh na -smo vie -situ ation -sim feropol -shan er -sh ying -seeyou in -se gar -se cker -roo yen -ron chi -road trippin -ren ounced -ren ji -quie ren -queensc liff -propagandi sts -pres sclub -pp opro -pitt ston -pav a -nemac olin -natu relle -mil ou -mil ani -ment alism -med star -me sni -mat tress -man ahan -lu pul -lingon berry -lewi showes -lar ga -la el -la bia -l rn -l hb -ke ce -kar is -ka ad -holac racy -hol mberg -gur t -go pe -gaz illion -gael tacht -fu tari -fo ca -flatbush zombies -fak ta -emo ji -ed by -dy dd -danadel any -cw ts -clothe spin -chop da -cbs allaccess -ca ins -c fx -bron wen -bm wx -blood letting -bilet nikoff -bike month -back tracking -artag nan -af as -yil dirim -y pf -wilke sboro -ve f -v awg -uk la -tri phop -ther itage -thar an -tem u -steno grapher -ste mple -special forces -son go -so gon -slo v -satthe table -ru ddin -rodri gue -rig sby -quint en -pro av -prize winner -pre o -pe ppe -paren thesis -onna is -one gro -on sie -omot ola -o gm -new berry -ne vil -nak ashima -n ja -mu tour -mid mowx -mic on -mic kie -mer se -menom onie -ko bus -kei sel -kaley cuoco -jointhe movement -jam fest -illi beral -hut cheson -hi ston -hazel tine -ha o -gu eu -grun wald -grig sby -gre sik -gel atine -gaale inster -every things -don ley -deten tions -davematthew sbnd -ct cs -craft speople -counting crows -connec ted -conjun ct -clinton foundation -city jet -chesapeake bay -chatter ton -car ita -can ine -bur ress -bts b -boundby blue -bbcra dmac -bas sel -bariatric surgery -ban ya -bad ou -b wp -al ara -ak ata -abduc tor -== >> -................ .... -% * -ÛĮ ÙĪ -yuv raaj -your san -world champ -wood ham -wescra ven -vin do -upri ver -tom ah -thoothu kudi -swap nil -strepto coccus -staf froom -salv ator -roof line -rel aciones -re land -pre zi -pon ton -per las -paul feig -of ac -oc elli -national bookloversday -nar alokesh -muslimb rotherhood -mull er -mu zic -monk man -manit oba -manico tti -love dit -lma ooooooo -lam ang -lac to -ker nel -k ti -intro version -i fan -gr é -gar lick -france sc -fe rens -famer tr -ec al -drown ing -d fr -cub ical -cre ak -couple t -cor b -co cho -christy clark -ce w -ce sium -c mag -buzz y -blan chette -bar que -aur at -ath ene -arri vent -arpeg gio -ang eni -ag akhan -a herne -zar beaz -wine festival -wh in -wasimak ram -waf ina -w aga -vas ai -uu h -uk ri -tra si -ton ik -th impact -syny ster -sun wolves -sri shti -smu ir -she hu -riski est -re ddin -r gd -pun it -pre ta -power pack -pol loi -pitt con -o ddle -nj morningshow -mersey side -me cc -mcelhin ney -mccar thys -market share -makeup addict -ma ula -m mos -line arity -likefor follow -kings down -ker sten -juni us -israeli pm -iah sbkb -i hub -hu sayn -hey bridge -freshoffthe boat -fra sc -faz enda -fair lie -eff i -earn shaw -eag let -duncan james -dar ton -daily quote -coo kies -ce sc -capric cio -bur s -brum pic -bie hn -battlec ry -ayrton senna -aw on -are staurant -ì ¸ -È Ļ -| âĹ -yearswith ourhomebts -xaver ian -x oom -will ington -villi ans -unassail able -un polished -u wl -track work -town usa -thelife of -the whl -the dragon -tandon raveena -t sca -sweet grass -super califrag -stabil ised -sle dder -sin ing -sin del -seis mic -seasons greetings -se futbol -sch ild -sac nas -sa ka -rohat gi -rin con -q con -pu bes -po len -per tussis -par va -orche stre -nun ney -nowh ow -ni en -nel sen -ne pom -myco bacterium -moto g -m fk -louise mensch -lan ao -kan ame -k caf -juli ssa -jose fina -j sl -ish tonka -is san -inton ation -inter group -hul bert -hou gh -hales worth -gu sti -galway hour -fre res -fag g -fa hrt -endor phin -empe zar -dad agioia -colon izers -chill ers -carrieh fletcher -car s -cali dad -brand ambassador -bear man -band anna -aw aking -austin and -assu redly -ari shaffir -analge sia -ali qui -albert dock -aizaw l -adju dged -act fl -ab sac -zit ao -zel man -ye hi -yar die -yak ov -wedd ington -wa thletics -vacu ous -v lo -use f -un labeled -un gi -ti ens -the pug -steadfast ness -star shine -son burg -soco tra -sh ays -sch mi -rencont res -rec com -property news -pret ence -post news -per roni -par que -orphan ages -nh ler -nastiali ukin -muk ta -mele hill -mee gan -md ga -mable thorpe -ll u -lator re -ky renia -ko smo -knock ers -jo bin -je melehill -hom mie -history inpics -having fun -haber sham -gon dol -gla ad -gab er -espn radio -e mon -dol lies -dhar mesh -cote divoire -coo puk -compen satory -commerci alize -berlin wall -be guiled -aper ri -alt itude -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃ -ðŁIJ ¡ -ÙĦ ÙĬ -yorkshire man -wk f -tu ku -thir um -tal yl -stri pers -sto ren -spiritu alist -selfies for -rum son -roano ke -reneeyoung wwe -recei ver -q or -pro petrovsk -phone book -p sm -over dosed -ou twood -oli vine -now next -moon star -mol dav -mma junkie -mi ming -man ito -man arola -leslie grace -kill joy -kash an -jon taffer -jack er -inst ag -improvis ers -hun te -gla ze -froma bove -floor board -ethe kwini -ecoun try -du mit -diaz jr -d orie -cro om -cooper age -coo ing -con oce -compart ment -bud leigh -boo throyd -bio feedback -bi ella -b ace -anti semite -an shu -album covers -al mo -ah hhhhhhhh -ag awam -af low -îIJ ij -âľĪ âľĪ -à¹ģà¸ Ķ -zu cca -wwi ii -vamp ira -up vote -tobac con -this couldbe -tenn ant -team priyanka -tarheel football -swakop mund -shi zuka -sar oj -rou ses -ran jeet -quick time -preci ousness -photo gra -pedest als -p foa -oo ool -on ghwa -o toy -newton ma -na sher -man gini -lith ops -lef thand -kur u -kot tai -kat sura -ju hl -jaqu eline -j ll -j anner -intra preneurship -hu ebner -hor loge -her zl -hein en -ha vers -gro ms -grace and -gr ze -gh hhh -gar ner -every onec -eli er -dr ington -dining room -deple te -de ul -cr ace -cou g -cont our -castell on -brit omart -bott arga -belle view -assal amu -and ras -all red -agar ic -abraham son -< $ -ðŁļ Ĩ -ðŁĴĭðŁĴĭ ðŁĴĭðŁĴĭ -âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -⾨ ðŁĺį -yomi uri -yo k -y barra -wall kill -tour series -thu mp -the tech -the cut -tem pel -te ct -sund berg -stat cast -star ship -slee plessness -shmu el -scor ps -sat u -roes elare -re ps -re ger -power team -politici zing -po ema -peer review -pang bourne -ok anagan -nz rl -ne ils -mun ni -muff lers -man handled -luther ans -learning isfun -kur ang -kron k -kre ider -kar ad -jet ties -iz abella -ith u -islam abad -irrit ability -holl inger -hob sons -hmv tweets -hel ge -glad win -gc ms -ful ks -fol som -fever ishly -facto ids -du tifully -draf tees -divisi veness -dis ley -del barton -de cen -contro le -ci mb -ch go -br injal -bil berry -bab ad -ar yl -am oral -am j -al tice -agne tha -ag re -; â̦ -. ðŁĻĮ -ðŁĺ© ðŁĴķ -é m -zam bo -women for -wa jid -vap iano -vac ca -un witting -ultra vox -tra f -the movement -te kapo -te gal -te ats -tar quin -sweet pea -super duper -stam m -spider webs -somi asis -so fus -sh wed -ser ah -scre a -scal per -rei ffel -princi pe -pag et -osi jek -om c -official melb -nu x -no hate -nerd land -ne opolitan -nc dc -montele one -min ks -marin ate -lumb ini -lom ba -live science -len iro -ky ys -invisible illness -impedi ments -hy pes -ho ony -hin kes -hair net -ha yer -free thinkers -fa ena -exege sis -doom metal -dic amillo -de compressing -dal er -commissions open -colour ful -clu cas -clayne crawford -ckin chen -chu cho -chin aman -chatur bate -ch itchat -ch allen -center stage -cas amigos -caroten oids -bon da -bigh ouse -ball state -bag el -bac trian -awe igh -arizon a -anc alerts -ain ting -adi es -acce sories -ðŁĴĽ @ -ðŁıĿ ï¸ı -ðŁİĤ ðŁİĪðŁİī -ìļ°ì£¼ ìĨĮëħĢ -éĿ Ĵ -âĸ Ħ -women kickass -water s -walker ton -ventil ate -trou ty -tau rasi -su mitra -stry cova -sla den -skor janec -ship builders -ro ble -rheumato idarthritis -presu ming -pre search -pot vin -po wr -ow ine -otto bre -olds mar -o amaru -miér coles -marav illa -manju shri -lori keets -logan ville -le ben -kron a -k ls -j th -icar agua -humm el -horn swoggle -harish kalyan -hamil tons -ha pus -gu ter -gregg sulkin -gel at -gal las -g cd -frustrat ingly -fol ly -feas ance -evic z -dipp goi -devop sdays -defence minindia -con sternation -con gi -christmas giftideas -chint z -brooklyn bowl -bran islav -blo ts -bir man -bice ster -be go -bayani han -atharva amurali -al vv -afree dom -ab aesq -a jam -ðŁĺįðŁĺį # -ðŁĴ º -ðŁĩºðŁĩ¸ , -âĺºï¸ı @ -y ig -whit ened -v se -un conquered -turkey day -ter je -tal as -t mo -sw apo -su li -step brother -special edition -scot to -rour kela -roodepo ort -roh mer -ro mag -remodel led -rang pur -posto u -petro lia -pet one -pa wl -ny ayo -nu jab -nec co -name plates -mukher ji -monsanto co -mh or -maxim illian -leic am -kyle petty -jaz min -ive agh -intellectu alism -il ka -hi mer -hawkeye football -har di -happy hanukkah -happ ppy -gi mignano -gator sfb -gar ton -gar ni -g xp -far nell -fad ers -enrol ments -ene o -do ak -dd yn -coqui halla -conver sely -colla ged -chri sr -ch acko -best actress -be mpton -bar tering -awk wafina -at kinson -ambas sac -ama ia -alar mist -ak ela -abbey dale -ðŁĻ į -ðŁĺ² ðŁĺ² -ì³ IJ -y kid -x tin -x eni -woo ooooo -was sen -ut ch -the josh -tar af -tab ac -ta sik -ta homa -star com -sk k -sh ema -seri alized -scandin avian -sc primary -sai do -s green -roun tree -ros ler -project car -paw son -pat co -panch al -ofex cellence -new writing -morninge dition -mom preneur -mlb fancave -mis step -mc naught -mar ckinchen -man crush -mad ine -macer ated -lec tionary -la ffer -kunal nayyar -korean food -ko sa -kang en -k na -jo ppa -iscar iot -houston tx -hard well -gorkhal and -gig nac -gai waterhouse -g ittin -fr w -er langer -episco pal -dpan abaker -dolce tto -der bi -danielle jonas -da official -char laine -ch iso -cat sin -canadian art -caf od -brack nell -blow n -bla sko -bivou ac -bb crb -ari a -arche age -ak c -ait c -z big -xy lem -wi wt -whiteri bbon -wha kat -web zine -votethe wanteduk -visit california -un gen -turi sts -tre o -tobacco day -the women -the hub -stjohn s -south down -som thing -sl one -sk m -sam et -rick mercer -rayn ham -pronounce able -prison planet -photo journalists -p nu -over played -op is -nw sc -newmusic monday -nbs finds -much hh -mess am -mel ky -mac cas -ly r -love reading -ling am -l ence -kirk bride -kal ai -k pix -iso sceles -iron ton -ha ggling -ha ash -gur meet -grand fathered -glori ae -gad gets -express ly -dust pan -dragme down -ding bat -d ila -d drfc -crim mins -con gas -con founded -co bal -ch asseur -c sula -c suite -better late -av lon -av ine -alpac ino -all music -. âĺºï¸ı -! âļ¡ï¸ı -! ") -ðŁij¨âĢį ðŁİ¨ -ðŁį § -ëłĪ ìĿ´ -yo gas -vel in -tor rance -ti ranga -thegill sfc -team fiji -t she -sou ci -sk oy -singh vi -se ga -sad tweet -rose berry -rob ing -r tu -prote ome -petro grad -oke h -obfusc ation -ns v -nor they -ne phi -nar din -monoun saturated -mono graphs -mon stax -minig ames -mini fig -mcg ough -marketing profs -mac ys -l md -ku mba -kot ton -ker ang -kel sang -kadam pa -jr l -jon ker -jedin ak -jag gers -initi ator -haul ers -harshad chopda -hann er -grims ley -gr on -gl ickman -get te -gapp ed -free gaza -fox catcher -fin neg -f ylde -excell ent -dol orosa -dic ally -demago gue -d aga -curve leicester -cud more -cristi anor -costam esa -chri sky -challeng ing -bor omir -ble akley -blais dell -b ols -anton ius -ak ra -ad ara -ac io -âĢ¢Ì Ģ -à° ļ -Ä ĩ -won da -westh ollywood -w spa -w new -w kwk -vin der -v card -ttac ars -tourism malaysia -to tino -suj ata -su chitra -strength training -strat us -sli ppage -sky city -si ver -she bang -ry all -ram sar -race to -prote as -plu ssed -ph wo -par li -ous ers -ohl hockey -o he -o cher -mo ho -mn beer -mm is -mi ei -mcal ester -life jackets -letsgor angers -l antis -ki stler -kak apo -inspir its -ibm research -ho an -hauser wirth -hand fasting -grosse to -gold blatt -gob stopper -fer di -en isa -el achat -ecla irs -dri ed -dr joe -del ran -de icing -cp cs -constitu tional -connie britton -complain ant -catt aneo -cas se -bur fict -bit zer -bigger than -bal cones -ba sheer -ar mah -anti perspirant -ang at -ameri kk -zor bing -z ale -yearen d -w jr -vl tava -vene tia -val li -un willingness -tu fa -terror ised -strati graphy -sol ders -sigue meyte -second chance -sax by -sa hoo -roger sville -regin ae -red water -real cand -pu gwash -por tioned -polymer ase -pi ha -patt u -palla dian -oil er -nak at -mos fet -mond son -mett ler -mccar ren -light body -la ppi -kav insky -ji van -is da -hab sio -ha iz -fu kun -feed me -ex changers -dred ger -dra gos -despan yol -dal loway -d sa -d iness -conun drums -concert master -christa bel -chip board -bro me -br dg -bot con -av ox -ar iness -aph y -an sar -allyounee dise -air cooled -adri analima -________ ____ -ðŁIJ µ -ðŁı» # -ðŁİ ¦ -ya esu -wp xi -water mel -vul kan -var an -uc w -tyler hilton -travi spastrana -ta vola -ston ep -secon trol -sciencer ocks -rot ella -ron ge -ro j -reli shed -reinvigor ated -re configured -quack enbush -pram banan -pot pie -ph ry -par ador -papel bon -on pointe -moom ins -mo the -merriam webster -meng gay -man gin -li min -legali ze -lar ousse -ku pp -ksu owls -k lon -jonah hill -inter religious -impo stors -ic ta -hako date -giz mos -gin ar -gen de -ful wood -fr itsch -fi dh -en max -ecach ockey -dun ns -cran ach -code cademy -co ste -chau tala -carol iner -cape talk -cap ela -cab anat -beat boxer -audi uk -atlan tica -ast c -ap cs -anay ake -alovel is -alexander mcqueen -af gan -acadi au -âĿĦï¸ı âĺĥï¸ı -ze ena -yy cre -year th -u ow -to wered -tegu cigal -ta jima -symboli sing -survi vethe -stipul ation -stati k -son ne -si fa -sad dler -qui roga -py torch -precep tor -pra sad -positi f -popein dc -pj l -paul weller -pas c -p me -online first -obitu aries -ni gro -n anci -mur murs -mu cous -morton pride -mid ge -men eses -meda ille -matt cohen -mass spec -mark masai -mariju ana -man se -lon ilove -live sat -lat o -lam po -kri sallen -kod wa -kellan lutz -jurassic coast -jai den -highway men -hailstate bb -go tv -gine ttacars -flys fo -fin dac -festival en -expi alido -europe a -duck dynasty -dil dos -dil auren -co habitation -chi yo -cha ing -be aman -baz i -bar ash -aw akes -ar ugby -antio quia -an ele -amas amy -am eral -ð٦ĭ ð٦ĭ -your schoolgames -wel ke -uncann ily -ud ha -tril ingual -transfer deadlineday -thoma stown -the soul -stu ll -si rona -sem rush -ra hu -pet l -pe ix -ol it -naï ve -mor ad -mclo vin -matthi as -masc olo -mapl eridge -leniro bredo -lati fi -l ero -ky ren -k lim -k cbs -japan travel -ir yna -inter brand -healthy recipes -hat chee -har ia -hal owc -ha stert -gu di -gam bling -free zakzaky -es ler -eli ane -ea stridge -e derson -delhai ze -davi dragan -dar agon -cir clec -cell dweller -ce sare -car om -bru mm -brand es -assi sta -as shat -al gom -aggre tsuko -ðŁĻĭ ðŁı»âĢįâĻĤï¸ı -Ùħ ÙĨ -ye an -yan anda -v cm -v awine -union pay -un damaged -trou ver -tigre sses -thalas sa -switch gear -son or -shee ba -sc ali -sau gerties -san tur -rod rick -ro miley -ri als -quart z -pro mom -plat a -pit kin -par kins -oo ker -nationalgirlfriend day -nager coil -n mr -mor ose -momen tof -mis andry -med hurst -llan tri -liann ela -li bi -kerato conus -j assi -ima p -haz le -hatt en -gy u -gri et -go sar -ge fs -g out -ffi est -f live -eb sco -dun kelman -du rie -dollar shaveclub -dg g -dear g -d elling -crum pler -cor sairs -chef chaouen -chan ov -cau l -can el -cac io -buffalob isons -bluest acks -bab olat -as ant -angies list -aj ed -acry late -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį -Ú© ÛĴ -zel din -ze gers -wo ai -we ish -voye ur -ve p -united center -trun chbull -thi o -th é -taylor kinney -tam bien -subr ata -sisq o -sequ ipment -seam an -sand which -roush fenway -revo ke -relinqui shed -regar dez -realcand aceo -ra ices -r px -r gr -qu ic -prem inger -pp ort -over shadows -out paced -on looker -ncaaw restling -na ish -micro algae -lefthand ed -heis risen -hee ft -hay ato -go eth -eaves drop -du stries -didier drogba -devi ka -delic ata -de trick -daw ley -davidg andy -crazy catlady -co vic -cine matic -ch ynna -cao im -cambus lang -bull fighter -ber occa -bar ging -b chy -az es -alk alo -aliqui ppa -alamo sa -al ready -ak ab -" _ -ðŁĸIJ ï¸ı -ðŁĴĻ ðŁĴĽðŁĴĻ -äº Į -z aga -york region -wrestlec on -wol a -wes warm -wag h -u je -trape zoid -tra doc -til ghman -tiger land -tegucigal pa -tan ge -sun an -sto a -spor tivo -snow mag -sme aton -sh isa -sab es -ri ffa -pri mas -pre vin -pitt en -paul ryan -p ym -ow ers -nouve au -nih ilist -mo ves -mis al -mi dea -metal hammer -mentalhealth awarenessmonth -mc mc -man united -li more -last dayof -lar is -kom an -j sut -ilu min -i frit -ho yos -hillar ys -hal va -group think -gas per -gaff es -gab ler -ga yo -fundament alists -fi en -fe ign -far ben -e sem -e ink -dad y -da quan -cr in -chrysanthe mums -chang er -bri ere -beard gang -b th -ato saurus -as pe -ary ana -aqu afina -anne boleyn -ane h -# £ -!! !? -ðŁĺįðŁĺį âĿ¤ -ãĥ©ãĤ¤ãĥ ĸ -ଠ¿ -zab al -worldr hinoday -wil burn -unru h -uma b -thom ann -tex tu -strugg lers -stie glitz -squ alid -som ar -sol nit -soci ed -sny ders -sky park -sky activ -silver thorne -second ment -ruk mini -plun gers -pele tier -oliviam unn -nzv sa -nottingh ill -no am -net jets -nam ak -mun tu -mmo pen -me ador -mat toon -marki evicz -mand hana -lost withiel -lax er -krizz kaliko -kor aput -ki aro -kho sa -kavi tha -kan in -ja imes -j mf -is lan -impin gement -i league -hoy ts -hoo pa -gram een -gov walker -go ethe -glen na -fu tp -epic fantasy -elizabeth ton -einste ins -econom ie -ec inema -dre ssel -don ya -depress ants -d indi -crani ofacial -cole haan -chad ron -catch the -cam arena -by ard -bush wack -britt en -ben aud -bel field -baw ang -bag no -aye let -ag ry -! ðŁijĬ -ìĽ Į -zukun ft -y rold -wood hull -wolf blood -us r -ten ley -tag um -svet lan -sparkling wine -shorth aired -sd v -scott lin -sam well -sai ful -r hay -q lder -prepa red -porsche retail -pnp cordillera -partici pat -onec lu -oak hill -nor ad -newyearsre solutions -ne als -mi shi -mi mes -mi koto -med lar -lg t -kumar is -kn ish -kal ayaan -kab ah -ign ace -he iner -hat maker -hail statefb -ha sen -great outdoors -grace point -gra ver -gor ockets -gar ds -g ss -g sh -f sk -entr al -en ric -elec tioneering -dover street -dou sing -chickam auga -cer ruti -cc f -c tos -bri bie -braid wood -birdlife oz -bindi irwin -betty buckley -bar ford -bachelor abc -av ital -asu mmer -z oni -won gs -vor derman -ve ces -tu ah -ter nity -ten dered -t add -sudan uprising -stragg ler -stock holm -sl ickers -sar sfield -sa ige -s red -reality tv -rap wave -prim erica -pir ating -pettic oats -pet finder -person ne -peri sher -pat to -part way -pan avision -ott traffic -opp n -o gy -nm state -nichi wa -nax os -n js -mobile payments -ml v -me her -md ina -llan twit -lam ido -kur ama -kal ua -ka head -jol yon -its amazing -indi awith -im plac -ill omania -i ge -hei sei -haw finch -gor dita -gol gi -god by -go comics -gal anthus -fol les -fin sbury -fcbayern us -expialido cious -en ath -dru bbing -drin ks -dead man -de met -dall ara -cypri en -ca ws -by z -bram bling -bethan ie -before the -bao zi -audio engineer -ash tami -asbury park -ari bo -ar nel -aed il -actually autistic -& . -ðŁ¤£ . -ye du -xbox live -world autismawarenessday -working man -with stands -win chell -touch point -ton gass -ti dus -telome res -sub ter -star lord -skil fully -singh bjp -shar row -shad dai -semi freddo -sc abby -saturn alia -sas s -re printing -qui jano -pi quant -pa ice -oun ited -news official -mir alem -meh ro -mdpi openaccess -mari onettes -mari olopez -mafi as -mac murray -lm ere -li h -len ahe -land arch -krann ert -kirk gate -kar mal -inf ern -horseshoe tavern -hol box -gram sci -good hue -go jo -g cn -frame store -fr c -fl andre -fin anc -film house -favor iting -face friday -f type -edinburgh paper -chat tisgarh -ch seats -cc ca -car mageddon -bri se -bo diam -blo dgett -bhar athan -be positive -bau mbach -ban jul -b mac -ay ered -ani official -analy zers -alan rickman -ag il -! ? -å ķ -人 人 -ã̰ ï¸ı -اÙĦسعÙĪØ¯ ÙĬØ© -Å¡ koda -you l -womens golf -wolf mother -wi ggin -univof standrews -u cam -ty wyn -thou sando -thang ka -tb world -sø ren -su til -spay ing -so telo -shape wear -sh ali -senator durbin -sec un -sci fri -sam mons -sal di -romanceno vels -ram ai -pulwama attack -pra sa -porte ous -pike speak -pect in -pande mics -pal lid -paco ima -one troy -oaklawn racing -ny le -na heed -mont co -milehigh basketball -medell ÃŃn -mar san -lv ad -long term -l ga -kumar sanga -kri pke -kinka id -kane ki -k lima -house man -h ns -gover ness -gas mask -fuoris alone -fiu mic -fi fer -feld mann -eur activ -er man -enor rhea -doughnut day -dista ste -did as -depress ant -dark ens -d pe -cord ura -cho te -cheap side -bu dy -boy music -bor uc -bo it -bedro omed -au stra -art week -arcan um -all ay -aljon mendoza -agen cia -ac lark -ì ¯ -ëĭ ¨ -æ ļ -âģ Ħ -will its -west chase -web dotcom -wasimakram live -victori alive -uni o -they are -thedavid cook -tele path -skul duggery -scra ig -scho tt -scan arias -san o -ren y -ram ani -rail card -perl mutter -p fr -p amp -ol é -ni shimura -missouri ans -madi un -mac ke -ma the -m side -looking for -loc key -levi than -last man -kar oline -joan rivers -jil ani -it uk -insti z -hotro ds -gob smacked -gastron om -gall ina -fair view -err body -ele mis -ead t -e bru -du tiful -dre ssed -dog pile -divin ing -dermato logists -dan ese -confe u -coc ita -che bu -can ews -ca ird -bus d -bron stein -boc con -bi pod -bedra ggled -bea hero -bar dia -aw ood -au bur -ake mi -af lex -abc new -į Ķ -ðŁĴķ ðŁĮ¸ -âĿĦâĿĦ âĿĦ -z ema -xi er -wrigley field -wire shark -v pi -un hygienic -trou ve -tox ics -together weswarm -to pa -thru sts -thi stogether -th oops -sust dev -success full -sini ster -sing topra -sido arjo -si ao -schne ier -sak thi -ru bery -ronni erad -rober ther -road man -quack ery -proté gé -pep ita -passion flower -paolo igna -pa aji -off loaded -o kai -na jam -moon beams -mi ptv -merri mack -merco sur -ma pei -lu sher -lu ol -lovethe se -loc alizing -kent ville -kay fabe -kar nad -jo ka -internationaldayof peace -immen sity -ic cr -hu ub -hu ger -hod gy -history in -hfx mooseheads -hen ny -hemp stead -hear tofthe -har aj -fi bo -f pw -everyday carry -dhan bad -dan neel -cityo fla -camel phat -bro de -bra dgate -bou ffe -bla ize -bit i -be you -bay state -ay lor -awarri or -ar cu -appreci ate -ann alee -anad olu -amrit arao -alder ton -ai rey -agood day -- _ -ðŁĴķ ðŁĴľ -ðŁijįðŁı» # -âĿ ĸ -ر ا -ب ار -webdotcom tour -wc cc -vintagec ars -vandy k -us n -une as -un ley -to wa -thofjuly weekend -ter abytes -t dam -sul fon -subsidi zing -spee dup -school teacher -safaricom ltd -ril lettes -rae es -quince añ -qui vers -por us -plus net -pase ando -occi dent -nico lec -new field -ner v -nan ba -mon os -mix ologist -man ji -mait reya -macap agal -m ris -luv ly -luth uli -lon tong -keer thi -kap it -jurisdic tional -j wu -ira j -heb burn -he z -half way -fry bread -fro man -finally mario -enner dale -doo oo -dog love -do doma -cutt inge -cre c -cou che -cloud burst -chick weed -cher ri -bon esh -barbar o -bankrupt cies -as say -arthro pods -ari b -amateur radio -alternat ely -ðŁķ· ï¸ı -âĻ¥âĻ¥âĻ¥âĻ¥ âĻ¥âĻ¥ -á k -zo eter -wren tham -wa elex -vintage shop -vien na -uri as -to chigi -the te -the halo -ta req -t ÃŃ -spelun ky -sop ore -sher ald -shee trock -seun gho -scar ter -rockymoun tain -rite ish -raj in -po ka -pay nes -pai ute -ni raj -nade shiko -miy abi -mariolopez extra -ma ghull -less ons -lar z -l wcf -kre ischer -kaz mi -kas atkina -jon tron -je ers -jal sha -jake gyllenhaal -is ar -ing lou -indone sians -inci dences -in ke -import ant -goo di -fu gard -fru mpy -fiore lli -exter ior -exporting isgreat -er tu -er ole -end aken -dra gom -demean our -dell tech -del vin -decentr alize -dau b -costi gan -copper as -conversation alist -co quito -cla x -char bonneau -chan sons -carbun cle -bydgo szcz -boro witz -ben jealous -baaaa ack -atter bury -apie terse -angio graphy -am ant -af ace -ack land -!!! .. -âļłï¸ıâļłï¸ı âļłï¸ı -é cole -wvu football -winter storm -wal wal -volu tion -van e -und ÃŃ -u ark -travel stoke -trade able -thur man -the mr -texas rangers -telom ere -tan gh -tac ops -syn cro -sput tering -sk ittle -sh eck -sab bir -red coat -rat nagiri -randomactsof kindness -ra wn -ra den -pu tu -pas aran -pan ynj -p nn -omen o -om iller -new nownext -net anya -nat es -n tx -n sd -mell ark -mas oom -loch lomond -li stos -li gi -iro ko -infor mants -ince stuous -ia eaorg -ho tin -hass les -giardini era -gam enews -g town -g dot -fictional character -fanta il -er ugby -devil driver -col ac -code pink -cobble pot -cam ano -cad ell -bu ea -bourbon nais -audit ori -au bu -apa ola -angry birds -alley ne -aid c -agrit ourism -aber rant -ë§Ī ìĿ´ -ê² Įë -è Ĥ -à¸Ħภ° -м Ñĥ -yoshi ko -xy z -wheel barrows -tol worth -the ban -sul jovic -sports day -som edays -soc cere -simm ental -shakespe ar -sentai filmworks -rw m -ru ffy -ric kets -rav aging -rab ha -promo ting -port elli -pan tani -oc cip -mr sm -montre uil -mo sely -mc millian -masco ta -logarith mic -lipp ert -leicester city -legendof korra -ld u -l hot -ko loa -ke ine -ju muah -jink x -jelly beans -jazak allah -j po -indu str -herli hy -ha kimi -guerri ero -ground s -ger alds -galvani zing -ga alive -from hell -emily thornberry -electro chemistry -el ach -dad sarmy -cru i -cru cis -coden amed -ch ava -cb z -ca ol -be strong -ban quets -astronom y -as mo -amin ophen -al po -al amein -ah manson -ah haha -acet aminophen -ðŁĴķ ðŁĺŃ -zoo plankton -zi as -ze se -world pay -wor then -won pil -ve te -tw chats -the timeisnow -te ifi -tar in -ta id -so lem -shi b -sha fi -sasusa ku -sasha apieterse -rwand a -readytor ace -ramo ji -ram but -poli mi -park house -ouri sm -not acrime -niel m -nanditas weta -mer avi -matt sorum -madeby google -macle llan -m learning -lu key -kno y -kere ta -katen ash -jolo kia -jay bilas -international beerday -inf op -ic tfc -i yo -i bee -gue sted -gud run -gri ese -gin a -g mh -fire water -ela bel -eb mt -doors down -dit i -discipl ining -der ville -decla wing -dare tobe -cymb eline -coffe ecake -climate kic -ce ja -brigham womens -bo dden -black shirts -ber icht -ar cli -anti bully -analo gs -adrian grenier -ac gme -ab abe -ðŁĩªðŁĩ ¹ -âĽĦï¸ı âĿĦï¸ı -z end -yu me -yu dk -wooo hooo -wood worth -wizard ing -whereare the -w tm -vla hos -un sportsmanlike -un satisfactory -tu gue -to paris -theshark daymond -temp i -tc v -ta onb -ta ks -set lists -scul ls -sch ing -sam warburton -salu dos -sal ta -ric ho -ri via -r alls -q ah -promp t -picku plines -pc ms -p tsd -on cbs -ok ura -ok um -nit rates -multi grain -mari insky -man metuni -ktt unstall -karan vir -intelligen ce -inst ameet -in ayat -im man -il be -hobb led -ha bu -golden heart -go jackets -glas shouses -gen teel -emphy sema -dif fie -daysof biking -dan as -co es -cleg ane -chuck norris -chiwe tel -check off -capitol hill -cap n -cad den -blood and -bindas bhidu -bhi ma -bank able -ay ur -ax eman -arshad warsi -aldine isd ->/// < -. ðŁĺĦ -ìĿ´ì ¢ħ -ãĥ³ãĥ Ľ -âĿ¤ï¸ı ðŁijį -y auch -wil mer -wa ghorn -vill eraces -uniof surrey -ul k -trage dia -sp f -sof hope -sher burn -separ ators -sci atic -sch em -s big -rol les -re organisation -priest field -pie zo -ph art -pe changa -papag ayo -out growing -of ic -niskay una -moven pick -ma hir -kra bbit -kirk herbstreit -jamie cullum -jagu ares -j beil -itv be -it in -ise d -im re -ilistic expialidocious -i inet -hurricanes andy -hands free -haha ah -gon char -go texans -glblct zn -gal leys -fl ite -fidd es -en am -el gon -diso wning -dimension data -cro oz -circas urvive -ci am -chu cke -car lor -cab er -bre hm -ben folds -bel aire -be ttes -bar ner -balu strades -ava etc -austral opi -ash lynn -as ong -are sults -arc turus -americas gp -ðŁļ´ âĢįâĻĢï¸ı -ðŁIJ ½ -z aks -yl vis -wil ho -viv ace -uniwest scotland -un manageable -un convincing -tour noi -tor p -team scorpion -tach ira -su tta -su mr -smith college -silver berg -shoot filmb -she mesh -ringo starrmusic -ri sen -red more -rac a -quintu ple -pontypri ddrfc -police woman -pero dua -pen ch -pe den -no elia -mo ch -men k -mar fan -manner isms -lo tor -light show -li ège -li ker -lc w -kram nik -ke mo -johnny swim -its morissette -intran sig -id preps -ian bohen -hunter moore -flat liners -fitz maurice -fil ho -espn nba -electro mechanical -ear drum -e pperson -deceler ation -dar b -crani osac -colli oure -cmo guj -cl gaming -christmas spirit -chris riddell -c gh -bcbg maxazria -autonom ously -ascen sion -applic ability -appar at -ali ze -ab uk -ðŁįĬðŁįĬ ðŁįĬ -ðŁĩ³ðŁĩ ¿ -zulfi kar -ye ter -yc dsb -wild cards -whis king -tom ilah -timmer man -team viewer -tai yaki -superfe st -stv l -spor tat -spo sito -son der -sch ill -rosen blum -ronnierad ke -rep ays -red action -re hana -rain out -pulse ghana -power hour -plo dding -pence in -pacham ama -oxfam gb -oom men -offer up -ni ff -luci dity -lo en -las ith -kettle bells -ju da -itsb hu -itsbhu shankumar -ish war -indy lights -hill harper -hayley atwell -hal lowell -gidit raffic -gentle men -fat ou -endocrino logist -el ica -e ie -doo fus -domen ic -dating advice -dat work -critiqu ed -coach ella -chu but -chino is -castlewell an -bu jumbura -brun ning -bren del -bo try -best show -best practice -art c -al hassan -ah so -[ ðŁĵ¸ -ðŁĺ³ ðŁĺģ -ðĿĹ Ķ -åħ¥ èį -yev geny -wynn lasvegas -wind screens -wil ayah -ven nel -unob trusive -the whitechapel -ste iz -staf fe -sheff hallam -sh anta -sas ser -sar ri -re hydrate -re ep -proto ss -pink society -pe zz -new sted -ne revolution -micro processor -michael d -met ta -meh reen -me jor -mar vi -lu croy -looooooo ol -lam ento -kristian bush -karti k -jam ai -inde e -imper dible -hol ten -hed ley -gl om -for pleasure -filipinof ood -fam osa -estim ations -e bba -dr r -cor is -clo quet -cl une -christen ings -business owners -bele ive -b fo -atmo sph -atas cocita -ash grove -arm rests -arak awa -alas sn -aintre eraces -ai o -aga wea -ðŁĺį ðŁĻĮðŁı¼ -ðŁĺĬ ! -é lie -zoes aldana -z deno -y wg -wweb attle -wwe balor -wn g -wardro be -tou ma -the silver -teenage mutant -te mbo -take it -stre sort -spec tres -span akop -soyu z -sincere ly -see konk -science direct -san tay -ridge ville -reprori ghts -re pos -rc despanyol -punche stown -play apex -pitt water -perspec tiva -or ync -nbl canada -n ky -mrjame sob -motu eka -mon gery -modi fies -make a -land ry -keo ghan -keller williams -kam bing -jackson ville -is ambard -ir bid -instagram ers -imo hq -ia q -hydro plane -herewe come -heid feld -h ny -gy imah -gn oll -fan elli -extor ting -esp news -elife style -elder ry -dsound system -ding us -de wi -collu de -clo ete -chopda harshad -chau th -but tock -brother lylove -boston ians -bj arne -bir ce -beij ing -back lighting -asi des -ðŁĵ¸ ðŁĵ¸ -ðŁĴľ âĿ¤ï¸ı -za andam -yam ahar -woo kie -whitt ling -walk up -wa wel -voteuk directioners -uz ma -utd before -ti val -thir tieth -then tic -the ginger -tack er -sy c -sulfu ric -speci esi -sp ly -sear les -sar angi -ri dic -resul tados -ren gagement -pi a -pat ois -pat gt -pap es -ol ites -oil paintings -naseeru ddin -n pe -mu tiara -moul dy -mistre at -matsu o -mar ney -maq sood -lab u -katie taylor -kak i -ipp v -ing el -i wear -himan sh -hard ware -happyn avratri -haj er -gul panag -go hard -fas b -em olli -e migrating -dull ness -divo ck -davel ackie -cor ten -ching y -chi pubschools -car rack -cabanat uan -ca illat -be quia -bar kad -autom ated -artu ro -ar ot -and thenew -ale tti -afcf ta -ab ies -ðŁļĹ ðŁļĹ -ðŁ¥ Ĵ -ðŁ¥ ĭ -�� �� -민 íĺĦ -âĸ ¿ -yan agi -wa verider -un werth -tsu kasa -tourmal et -tor books -than never -tere se -ta sered -stre ga -so cc -smrt grls -singtopra chaya -si hc -sham ba -science twitter -sch wit -sch oop -ra dia -ra bah -pur rr -pon ch -pole vault -pip kin -paw patrol -pa ku -ontheroad again -not food -nau strong -nag ato -na thletics -mo id -merthy r -mass mutual -mark waid -madhu bani -light wave -liberty u -la uro -ko sha -king size -kerat osis -kati es -kall ang -k pr -inver mere -inter na -im mingham -hu ling -han ji -guardian eco -gerst mann -ger von -gary valenciano -fe sh -favor ability -f cl -ella eyre -ec co -disp els -dir venkatprabhu -dhi ve -dab bs -clt news -civic tech -christin aperri -cer ven -cat es -bor de -ber ates -beir ne -barre t -banta yan -ar nos -an ich -am ya -ais y -?? ... -( ?), -ðŁĺĤðŁĺĤðŁĺĤ ðŁĺŃ -yel m -y bn -un quen -tz laff -truec rime -tro tted -thus ly -thin q -there all -tal in -ta vious -subver ting -subo ptimal -ssi ves -sou ths -so bukwe -shu shi -shel ping -sham mi -se pe -sav ill -ri seas -ra vines -ra gazza -provin cia -pro max -pod ca -pixar coco -pd c -pakistan day -official jld -nw ob -nin os -nay y -mun ford -mirand acosgrove -me gas -li zzi -letsgoo ilers -lar ynx -ku tta -kb fc -je ph -is ce -il ola -homes for -hat chi -haf ner -guide books -god man -fre shie -for zar -for scom -ew opinion -draft day -dj p -deut z -deleg ated -del ima -de fused -cot w -coqu imbo -capri mary -canber ratimes -back plate -aval ley -anpan man -aj ie -adity amusic -ad dl -ab ounding -( ~ -yebo sfaye -w cl -vand i -utdbefore fergie -usa wp -tu lus -thel ow -ter no -stu bhu -ste urope -skull hong -sil vano -she persisted -sever in -sche coperez -sau m -san antonio -sab by -sa ik -ru ba -root stock -resi t -real alexjones -psychop athy -pere mpu -pep co -or so -one on -north men -nihon go -nassi r -mr ddyer -mix down -mer ian -la voy -l ort -ku suma -kon eru -klar na -k fw -jinkx monsoon -ivory coast -iron dale -ira o -in bar -ilai yar -i yah -hen gist -gov andals -google earth -gesun dhe -final showdown -fabi ana -dre mel -down hills -di okno -de valued -dan ker -crin oline -co pt -ci ans -chicago tonight -ch ments -ce ux -carpool karaoke -c iss -broken ness -bou jee -bat z -austin chronicle -ask force -all nighter -agri gento -acom ic -ach opra -(âī§ âĪĩ -yan asta -welsh labour -tur man -trans ni -thehobbit movie -the sal -the oc -the men -tangi pahoa -t qm -strugg le -stati st -squ ar -si donia -seep ed -second sofsummer -sa jak -regre ssed -raj inder -ozy mandias -om ai -moon base -menta wai -martinluther king -lun go -lithu b -kir sti -juju y -jal fre -j iru -j chs -iz m -indiscri min -indie horror -im por -iheart festival -fri k -ff d -feder ici -en pt -dro oms -den feld -den den -cro on -chu mash -car me -bric ol -bra inte -black rock -banan aman -au spost -atlan tique -ase chat -arti stanbul -armie hammer -ðŁĴģ ðŁı½ -미ìĬ¤íĦ ° -é¹ ¿ -⼠µ -à¹ĥ หม -zeit kultur -wre y -withern sea -win de -vi van -va beer -v afc -tow les -tomilah ren -tar ong -tapro ot -tal madge -ta uro -swachh survekshan -su ba -style chat -sp qr -sn outs -slightly stoopid -slack lining -ser ger -romp ers -re mount -rati fies -pro tag -pintof science -pen thouses -par secs -pa al -owo sso -oster ley -need more -mug sy -morten son -meek ness -matthew perry -mart inet -mal econ -lon gan -lim mud -kno pf -ke baya -ka veh -k pm -ian to -i sit -hydro chloride -hand crafts -footballa su -fancy dress -egg ert -conceptu ally -clar is -bug z -bo ity -blue and -batt lea -aw ine -audi in -aira si -ad b -//// //// -åĥ ı -yang yang -y ade -wy rd -whit ely -war mongering -vk singh -ud hampur -ud as -tra chea -thisishar drock -te ducation -sweat in -ss ch -sna ith -slo bo -shut tering -shim mer -sent e -sad dling -rubi k -real grumpycat -rail riders -pre nz -poke shopper -pink ham -phu ket -p tu -oooooooo ooooo -oat cake -nir man -neuro psychology -mm n -missouri state -minim alists -mill pond -michael brown -merrychristma severyone -md m -mc gru -mar sabit -manolo blahnik -madal yn -mac ula -mabu za -ly fe -leg ang -lady vol -jal opy -io b -il ce -honey mooning -hi pper -ha beas -glam or -gaon kar -gal ah -event i -eso k -es lav -east chester -drum beat -doo joon -dom ore -ct tee -cross fade -chun ji -celer ator -card nation -bru ich -beverley knight -bare k -bal thus -as syrians -aphor isms -ann amaria -air disaster -ado do -ac led -íĮ ¬ -z illi -uk ay -u be -ty moshenko -tu borg -the alarm -ten pin -taxi fy -sy g -surplu ses -stad ter -som eness -sealevel rise -sche er -sch aal -rox boro -roc cat -ri gi -ravel ry -rampal arjun -ra vels -qui pped -pr sa -pj paralysis -pin sider -picad illo -phthal ate -paris airshow -ornitho logical -nbag league -nar u -nap a -mon en -mistran sl -men chaca -man jit -malign ancy -ma gie -kra kauer -kirk hope -k lang -ju die -j sb -ir chi -hom efurniture -ha sn -h Ã¥ -ghosthun ters -followthe music -flor sheim -fl amb -fi ggy -ef fu -eccle sia -das ara -cumb rae -choo choo -chatter ley -cal crutchlow -bil lows -bhat nagar -bell in -baltimore riots -bal z -bai da -arm our -ar ye -alle magne -ai z -aaron ramsey -.. â̦ -ðŁĻĮ ðŁĴ¯ -ðŁĩ¹ðŁĩ ¿ -⼠ĵ -wy re -vit reous -vier nes -upp ity -under classman -tw arri -ture k -tur c -transcrip tome -the bestof -tel enet -te menos -te abag -tam bu -sp ig -skid more -ro mer -recipro cated -raci alized -pre occupation -pot gieter -poo py -ply ometrics -pk b -pil z -pe kan -opi ates -na oya -morgan library -men de -m craven -lo athed -linden hurst -ky ne -kp fk -ko chad -kent wood -jun jin -jame ela -its notre -imper cep -hi sti -her vé -grand order -family feud -esc abeche -en go -e ht -du elist -dress ing -debbie gibson -da ha -ciner ama -christyclark bc -charge sheet -car less -bys she -bis saka -be partofthe -abol itionists -aber lin -abe be -* / -ðŁĻĭ ðŁı¼âĢįâĻĢï¸ı -ðŁĶ Ĩ -Î ¸ -we ater -tutto sport -ti more -thos fansbts -style icon -steven spielberg -startrek beyond -starmagic ballfanfave -south down -si pg -sh ado -sexu alized -sel vage -sea world -se fer -sa az -s angels -run dmc -rock ford -ro strevor -ren dy -pre position -plu gin -pher able -onder wijs -of instagram -no tobaccoday -main waring -mahal axmi -maguin danao -lazare v -lam mers -kot zen -kitch engarden -jor gen -jalen rose -j boss -insta artist -fc punecity -far ish -fal kner -f atti -expun gement -esc ut -dro yal -disobey ed -dis lodge -dipi kak -di pp -deliver ing -dan u -criss angel -cor liss -co safa -cic cone -cannot wait -cafe terias -brad ys -bp brewing -bi gup -banff centre -ba azi -audi r -are ason -anag lyph -alder hey -al ima -affl ic -a ars -% ' -ðŁĺį ðŁijĮ -ðŁĮ¸ ðŁĮº -⾨ ðŁĴ« -à¹Į ) -à¸Ī ะ -y uru -wo ther -warm bier -upp pp -un coated -u mph -u icc -tur un -tu ki -tra ch -team jamaica -sye da -stubble field -stock broker -shay es -shar ath -ser as -seal ink -sc illa -ruth ven -ro ker -pett itt -pac u -op hie -neighbour ly -mumbait raffic -mr tony -med u -may ur -mar dle -mahabali puram -mag ico -luke skywalker -lloyd soflondon -leigh francis -langu id -ku bla -kiz ela -killer cat -kh are -jo ell -jay anagar -id les -hiro to -great ness -gopher football -goo wls -gon d -gloriae stefan -fron to -fil ial -est evens -er g -e bels -du wa -domest icity -diss i -desp ises -dermalog ica -cor alie -convivi al -con vers -con currency -clubb rugge -chrissi e -car rs -cam by -bu caramanga -bh fo -bertol ucci -bacter iology -au gie -app leyard -accli mated -a hotel -?? ?!! -! )) -ðŁĺĭ ðŁijĮ -ðŁıį ï¸ı -ë ĮĢ -w ops -visit dubai -uk uran -trib bett -the exorcist -tel le -teen mom -tar tt -sweet man -su zie -strange ways -sta id -sho gi -shay ne -sall is -revol ted -ran ko -polic emv -ple bes -patrick stump -paint it -ot ello -official rmt -numer ique -mr mike -mer vin -men es -mat ins -ma sn -ma saba -m chapp -leven son -le wie -kill or -kate bush -karate kid -jo shy -ital yin -ip hi -hu hu -gold corp -go ge -flexi bly -fer rato -far leigh -fan of -equ ines -el fy -dra peau -dis illusion -di van -dhu pia -dach shun -d hari -clostri dium -carmel ites -c cie -bird watcher -bam bina -bab bac -ash ah -ano int -anir ban -air park -a xion -ðŁĻĬ ðŁĺĤ -ðŁĶ ± -ðŁıĮï¸ı âĢįâĻĢï¸ı -ðŁİĪ ðŁİģ -нÑĭÐ ¹ -woo craft -we blog -un caring -uli ses -textile art -ta ym -sya allah -super set -subli mely -su ttle -stay er -ss yndrome -speci fies -sor sogon -silver light -sebastien loeb -seac liff -schlo sser -rhe ingold -resul tant -restre po -real kiefer -quin ns -princess bride -per awat -pe po -pale is -oster man -oc t -nz s -nu b -national margaritaday -n dv -mushroom head -miner alogy -mi haj -men ken -mart solf -madi kizela -ma awards -lys mic -love theatreday -lau dable -lace up -jim mi -jar im -j ynx -it to -her tel -heat ley -hal ka -h mp -gram me -gam blin -fakenews media -ell racing -du duk -doddle oddle -cot tam -christ omlin -car sand -bul g -bridge head -bod hi -bo di -bas se -bas quet -ar ash -am az -alton sterling -ak elly -ail way -after shock -af neil -+ ? -ðŁħ° ï¸ı -ãĤ ĭãģ -âĿ¤ ðŁĴļ -âĨ Ķï¸ı -⬠Ľï¸ı -yu ppies -ya j -wwebattle ground -wit tiest -wgn tv -west london -vol umen -vegan foodshare -uni e -tu ka -toby turner -tim heidecker -tar ra -tachi bana -sy zy -sweet ening -stri ved -stri ders -stealth ily -sn hu -smar ch -shim on -she dit -sha hab -se woon -sch ile -que ur -pul borough -prett ily -pra bal -pir tek -p mj -or rick -oli m -noise tte -neck beard -n fo -mu sand -mother teresa -mo khtar -mm els -mar awa -mal functioned -lu cht -lean ings -lea vey -land send -lam bourn -kin na -just voot -ir ca -indian cuisine -im debina -ho are -hather sage -hass ocks -gh oul -gastel um -famili as -f fort -ecosystem services -der vi -ch era -bom bas -blau ch -ay sia -ap ala -album cover -ade sso -acoun try -ac scc -ab khaz -a hockey -⾨ ðŁİī -× Ļ× -zo y -women scycling -wel les -we ave -war ded -vi des -ver uca -ver bose -u hc -thankyou foryour -tattoo society -stargaz ers -stal lion -sma ster -six ways -se diti -scra fts -sack boy -s ated -po ix -or se -ny nj -new media -neu l -nbaf antasy -mus burger -mssarah paulson -martin borough -mag ni -liti gator -knight sbaseball -kings gate -kick itout -kath niels -justin verlander -jay sh -iron ies -ira qi -inn keeper -hart field -har lot -had low -h br -gov pencein -gohar dorgohome -god bles -gl v -gel v -flet chers -fire house -film freeway -entrain ment -emma stone -dirty dancing -deriv ation -dal ila -confor mists -clo cal -christ us -chi h -cb ball -begru dgingly -bank sters -ball sbridge -andre sen -ador ableness -ab unga -' '@ -! '' -zam zam -yu o -u ver -te als -stereok icks -song contest -sol ak -se res -se berg -sa kata -ross ana -ri gh -resu men -rel f -rachel zoe -ph ale -passy unk -of gem -o gn -nur der -nug get -nite sh -ni hotri -na diam -multit ouch -mor y -mc y -maz ouz -li pi -lar an -kinder transport -kil kee -ke els -kab we -jave dn -infin i -id hi -hy uga -huntington sdisease -horse hair -hi rai -hay field -ha kan -gp stpete -gor sky -gi us -ge mba -fullmetal alchemist -for o -fee der -emple o -em ple -eber sole -dorse taonb -digg ory -did there -de jo -countdownto kickoff -compens ates -coinci dently -coco tte -cob den -catt ar -catac lysmic -cam hs -brew gene -bounty hunter -bo ing -be ggan -band maid -baker loo -antipo des -ðŁİī âĿ¤ -ï¸ ¶ -à® Ĩ -à ¢ -yar on -we de -w pi -thugsof hindostan -theband ghost -tex astri -swi zzz -stanis law -spr inted -speed running -samanthabar ks -rx theatre -robbie amell -rav jiani -pru st -priv é -post it -port vale -pol in -p gl -p by -otta was -one kiss -o cken -nrl knights -night scape -mortal kombat -mk stalin -milli a -mar aga -lac ounty -kyo to -kristall nacht -ko hat -kan ell -kahu ku -juli ann -jas sy -j sc -im iss -hr ough -hoo doos -helms man -hand drawn -fex pression -fast n -far ingdon -et cetera -dun luce -don nas -de min -d bt -culd rose -connec tors -combat zone -ce si -ce ol -call center -bushra gohar -bu ssed -bre saola -beque athed -b inger -ar mam -alla in -alder aan -abid in -미ìĬ¤íĦ° 미ìĬ¤íĦ° -à¹Ģภª -ൠĨ -ÙĦ اÙĦ -ze us -yeezy boost -wo tc -w aked -us latino -ur bs -un hindered -un commonly -tol son -thra x -thermo graphy -ter adio -tal kabout -stere os -sousap hone -smi the -sleaford mods -shipla p -sha e -sav inghope -saddle bag -rish nan -repo stre -ptero saur -pre gaming -prabhu deva -norfol khour -nol la -no sa -nivin official -night market -n wot -mer ano -mel illa -mar ic -maha ffey -luck enbach -lastman standing -lam esa -l ome -kit we -kh ong -junior golf -jet packs -jam mf -j ela -instru ction -hud gov -herman mashaba -hatt i -han deer -glynd wr -germany diplo -gar bine -for co -fo etal -film production -feni x -farmer smkt -fa dil -ev anna -dis sections -dil an -col usa -cla sic -chauvin ist -bow li -at rain -ali asing -ag gro -ab is -ðŁİī ðŁĺį -ä¸ ĭ -u don -tul bagh -thorn dale -te ssier -sw abi -sur p -starr cast -sock i -so wore -snu ffy -snow bound -sm oments -shrin ky -sensiti vely -sel ous -scutt led -sak hi -sab cs -que ak -pri mm -paul j -palanti r -paf os -op sec -ods al -nylon mag -multi platform -mud guard -mil sap -mi mpi -mb ak -mai kel -ma gar -ly sa -lu by -lo ja -ky on -ky ns -kh waja -kab y -jo onie -jo anna -jam z -inst adog -ing lish -inflexi ble -im material -i ferous -hor u -hierogly phic -hen day -har jo -han out -h pf -gol azo -g ml -flower show -first tweet -er ko -ent res -earthob servation -e wen -discoura ges -de codes -dar rius -cu aron -col adas -clo ke -brun tsfield -bran igan -bor neo -bbc debate -baz inga -barry m -avar ice -attle borough -at wt -apparte ment -amater asu -all orca -al ti -acab an -,,,, ,,,, -ðŁĽ İ -ðŁĺ± # -ðŁıģ ðŁıĨ -íľ ĺ -å » -à· Ģ -zo ek -xl vii -win kie -whodat nation -war den -tri ge -toriam os -thetoronto sun -sur charges -superbowl xlix -steen kamp -spac estation -sko al -ship mate -sc top -ro tter -red c -ra sam -ra jai -port slade -pietro sd -phine asand -p ous -ot ary -on dine -ny ul -n fts -mu stique -moving day -mosth aun -miss mayim -med lin -mazi buko -mark twain -mario andretti -maribyrn ong -ma drona -ly dney -lu mad -lou che -lit chat -kenne saw -ke ena -k hom -jim énez -information security -i fill -horticul turist -home bush -ho enig -her riot -he era -ha chim -gregory porter -game time -forwar ders -fl itting -faroo qi -eni ans -eclec tic -drama fever -dr ramansingh -cop thorne -congress women -conglomer ates -citym j -ci pollini -cham illionaire -carrou sel -ca hors -bruich ladd -brin ton -box nation -bother some -blumen feld -billy bragg -berzer k -beau x -bchy dro -bal ears -ath oll -ar cen -an any -aircrash series -ag elim -!! (: -ðŁĸķ ðŁı¼ -âĹ Ħ -yer ush -white privilege -well stone -volun tary -universit ario -u eg -tt ttttt -tour decor -top shelf -tack ler -su kumaran -ssh rc -sli der -shin agawa -sensation ally -se vi -ro ser -razar umi -quix otic -que iroz -pru de -pri o -phantom friday -petr ichor -per ret -parishi oner -op hore -np slsoccer -needi est -n side -mu lu -micron utrient -me tter -mc duff -man imonday -mal ouf -la zi -knott s -kapil sharma -jammf warriors -human itarianism -haz ar -har rie -fire hawk -em presa -eli seo -dor val -din ardo -cro ot -could ve -coli seo -col onic -city brew -cat oosa -calle ja -calabar zon -bun tings -braz eau -blon dell -black feet -bl ach -bernad ino -be different -bay bay -bate y -bare bones -au p -antw i -and bake -allu sions -alfon so -ak anksha -ai kin -ach el -: ~) -. ðŁĺĥ -áµĹ ʰ -z wart -ye sofficial -wood lake -waver tree -w mi -ven ango -thel abel -the flaminglips -ter relle -team england -sver d -substitu tions -st impson -spirit airlines -son ik -sling er -shru gging -shootfilmb enice -shi ho -she il -ser vos -secre ted -saldan ha -ring a -ren vy -rema pping -re shoots -re developing -ram yun -protect mueller -pri s -pap en -ornam entation -op tica -nom akeup -nieuws blad -ne ema -majo rettes -maiden graffix -magn ates -maf rica -lo chy -leg ato -le tus -kucin ich -kav ala -karisma kapoor -ka stel -jen nys -inter urban -inspector ate -ik ram -i vica -hon an -hel min -har twig -gott man -fli pped -et fo -esc olar -entit les -enter towin -edel man -dont judge -death star -crof ters -continu ous -co asting -categori zation -ca inc -by poll -bush rangers -bts m -bor ch -bladen sburg -bill c -bharat ratna -bent z -bel les -bay bears -ba hari -amber heard -am re -acom b -ðŁĺį ðŁĺľ -ðŁIJ ¨ -ðŁĩ²ðŁĩ ¹ -zi z -xia obo -ww lp -wis nu -water field -wait what -util ises -tw illing -till sonburg -tear away -tau gh -stru g -state dept -spha gnum -skÃ¥ ne -shur mur -show tv -sha ar -sex to -sc art -sa kin -resi ster -rag tag -ra ffa -r bi -quit man -pony ville -pe ets -os me -nr sc -naias detroit -n pa -mrun al -mel ges -mbr srd -martin us -maril u -mal alaf -malalaf und -la ak -kø benhavn -kentuc kians -jeff d -harve ys -ha bil -h sus -gra o -fer gal -extre mo -ety pe -ent rails -enjoy globe -education week -ec centric -easport snhl -dj carnage -demand action -dead laced -co springs -cityof to -chip man -bs india -be att -ball players -b nb -attrac tor -as salam -ach amps -ðŁĶ´âļªï¸ı âļ«ï¸ı -ðŁĴ£ðŁĴ£ ðŁĴ£ -ðŁİ¼ ðŁİ¶ -ðŁįĶ ðŁįĶ -ðŁħ ¾ -ðŁ¥ ļ -âĻ § -л е -wri mo -wi ster -waipa hu -vp ns -vi ren -under staffed -u or -taip an -stacey abrams -spread able -sol art -schle ich -salt coats -recei v -rat p -pilla ging -philly inquirer -optim o -mis carriages -mac lennan -m red -m ends -lu ana -little simz -litt mann -li ge -lad yof -ky line -ki shaadi -inscru table -i bby -hi zo -he gar -hav ells -gabrielle aplin -furi ou -fr oud -foli os -e dos -du pa -disrup tive -derby swildlife -cu pa -corporate events -code y -ci beles -chu gh -christma sc -ch ly -bol te -bo brisky -bick nell -belgian beer -babangi da -avir tue -ant manandthe -ant gupta -ak alay -ade sh -ðŁıī ðŁıī -ðŁıĥ ðŁıĥ -ðŁı « -ðŁİĦ @ -âĿ¤ ⾨ -zy go -zo ho -willow dale -wall covering -vol ar -vo ie -vit icul -vi vanco -ve mula -universal orlando -un v -thingsto doin -the flag -team bonding -sur render -ste pping -song song -siren craftbrew -singh rajput -sharma fc -shab it -sen batsu -sap i -sand pipers -sab ang -revel ator -repostre gramapp -record store -re ks -r fb -push pa -pin cer -pent agon -new saus -mis kin -mat patgt -manchester derby -le ery -klagen furt -jacqueline m -j ff -itsamazing outthere -inter sport -hermeneu tics -hackney abbott -gri mmer -good cause -glenmor angie -gett leman -futureis bright -fe tter -eras able -ep as -ent pvtltd -el ahi -du mm -du lo -dh x -day i -cul berson -ctv vancouver -create space -coffe et -christma spresent -cast res -cardio ed -boul ware -bottle cap -bbc sheffield -ani seed -angel list -agit ating -ðŁıĪ : -ઠ¨ -zomat li -woodcut wednesday -white tail -water birds -vulcan salute -vibra phone -van guards -un bc -twitter bakealong -tomlin son -to lead -thre eday -the jen -th august -terror attack -sul i -squat ted -spor ty -snar f -sk eller -sher in -sac ca -public school -ph unk -or ado -oh anian -non structurefire -nol asco -neyo compound -mtv scream -mor on -mis canthus -migr ates -mi hon -meik le -mal va -mai gret -madame tussauds -m wt -lo ath -ki mo -kag ome -ka the -je im -ic ym -iber o -goodday sac -go ksuowls -glen orchy -ge tou -found cats -fog gia -fire hose -esc ing -ed rive -descrip tors -de foli -dave and -dan j -dabboorat nani -cran fielduni -cookie monster -clu bes -char meck -cele bi -cajon valleyusd -by passes -bloom quist -black outday -be vil -bac ci -av ril -at ari -ameri star -achievemen thunt -ðŁĮİðŁĮį ðŁĮı -ðŁ¤ľ ðŁ¤Ľ -ðŁ¤· ðŁı½âĢįâĻĢï¸ı -민 íĺģ -x and -wb ss -wa ine -w set -vi mal -uuuu uuu -un believer -umbrella revolution -twit terer -tur on -theatric ally -than atos -ta em -soon est -so tt -she ir -room withaview -rising star -ra sad -pro a -po pi -phi mu -peru vians -os borne -or monde -nrl finals -no ha -nag ant -mugg sy -mor ven -mir on -min ima -mand ell -mad ams -l ws -l ft -krum lov -kronen bourg -kristian sand -kk al -kat mai -ju anda -jn f -jim dunlo -j pii -idaho bit -iam cityfc -hoo chie -hh p -heli anthus -hein ze -heid sieck -ham i -hal deman -g iller -ff ice -fabri ano -di mo -com an -ch ell -carmel ita -ca cho -bradley cooper -bo garde -ayo dele -authentic ator -audi ble -associ ative -any outh -aggre ssors -âĺĨ âĺħ -à® ¨ -yu ms -world kidney -weis sen -wa thi -ur ba -u di -u delaware -tuj he -to les -titan s -the judge -th ave -sw um -st k -st elios -spo ony -sphy sics -shonen jump -shant anu -sagu enay -ry ann -rumpel stiltskin -re funding -ray bans -ram ón -prescri bes -peter lee -per sil -penc iling -pack football -osu coach -of l -nor onha -ncis nola -nati o -mycoop food -muscul ar -mt ss -mrandmrss otto -mis érables -milit arily -middle ditch -michael cohen -me thy -matth ysse -lo ba -li stic -ken po -kal im -ju go -jac quet -ith am -il n -i amp -ho ad -halvor son -gol l -glut tonous -gli al -gar ban -game and -gal bi -frog more -floun dering -fen i -exple tives -er ism -er df -engle hart -ek elly -dilauren tis -diffe red -cri ppen -cram ond -conceptu alized -co existing -churche shour -chorley wood -character izes -castle wood -ca il -bri sas -book sto -billy burke -beck les -bamboo s -bac an -bab ae -awa res -as cona -all together -air watch -air head -ad aline -abkiba ar -[ ] -ðŁĵį - -à¸Ļภ° -à¸Ī าà¸ģ -ಠ® -¿ ¿ -v lr -uel final -tri somy -theore ms -th mic -th may -temp a -squir ts -smart ass -shen ley -sf in -sen toomey -sd npa -rape culture -r gay -quin tin -q oute -pv h -pro cks -privati zing -po lecat -pasta day -oliver os -nac omics -mendi eta -me akin -lu ling -la vasa -jo erg -jar vis -it canwait -it am -ira da -hor sham -honeye ater -he j -gran lund -go ren -fo dor -extor tionate -est ée -eras cal -enchant ments -dist antly -disen chantment -dark ish -contor tion -commerci alized -chan nibal -cahu enga -c bl -bo ons -bestin theworld -bar nette -ati ja -afro man -adu ana -absur d -ðŁĴķ âĺºï¸ı -âķ Ķ -zar ra -y ss -y rp -wym t -water treatment -u ji -tuss ock -trail side -top most -than n -stgeorge spark -steve backshall -statecap ture -sound man -sn ano -signsof spring -si var -sf bay -seung youn -see eee -san antoni -ruth enium -rolo dex -rock radio -ro gic -rit chie -ri peness -reyno sa -residen cia -ren nen -publ ico -pri maver -pe dy -oscill ators -nic colo -mon gabay -mis nomer -mind share -meso therapy -mc burney -mat u -man zi -ma et -long bridge -life proof -li fi -lea ves -l ston -kno bbly -keynote speaker -kemb la -kam my -is os -inst ills -insec t -hot line -home making -hawk shead -harri stweed -han ne -h ally -guimar aes -global shapers -fu wa -fo ghat -fe asti -fashion nova -downsyndrome day -din apoli -delhi daredevils -dam one -d vo -cran ley -comm itee -co gge -cla res -bluec rew -bin brook -ben ge -be hrs -aw fulness -as pley -ak itchen -ag andhi -acre me -ðŁĸ¼ ï¸ı -íĮ Į -ãĤ ¼ -âĻ¥ ! -ÙĨÙĪ Ø§Ø² -wwe australia -weir ton -web casting -vor l -vacation ed -u mer -trilo gy -thisday inspace -th fleet -te pee -tar ay -tar awa -tan vir -tall madge -suit land -str u -ste eves -soundary aar -soundaryaar ajni -sn oops -shish kin -shi en -share downership -shann an -sen escence -sand ton -ronaldre agan -rise withus -rid gid -pad rino -ow ler -out score -on sunday -octogen arian -nijin sky -nav ona -my vote -muf fu -mb alu -mate os -long nose -laval lee -kn ol -kell ner -kandi vali -jumm amu -jar ir -horati o -holiday party -hill grove -happy republicday -gen is -fossil fuel -far rell -evi an -eu an -entang lements -ecur tis -dum dum -dr n -detox ing -der music -de portugal -cv cc -continu ance -com illa -co sell -chri smc -chic on -cham oy -campe stre -business awards -brush stroke -brew ers -aston merrygold -app dynamics -aler ta -ala am -ag ard -? ; -Ï ĩ -zoeter meer -xx o -x ds -world malariaday -wool loomooloo -wood chucks -wiener schnitzel -wango tango -vintag es -ve le -val lu -tu pid -trans location -tin i -thescript family -ste i -stab ile -son ically -sobie ski -slife style -silver spring -shi on -shatru ghan -samaj wadi -ron is -recu sed -raas ay -pre matur -pl om -pin atu -per anak -parv athy -pal atka -napak nowhow -my tuner -mou gins -mom blogger -men cia -mam ah -ma ini -levar burton -lem picka -jill scott -j ills -interpol ation -indu blin -im balanced -i isc -i esa -gun jan -gor sk -ge ia -flo fficial -ejer cito -ee o -dye ss -duchessof cambridge -down towns -do do -di alled -dex ys -cool kids -coc cy -co working -cityof calgary -bou rassa -boric uas -bo tta -bazaar uk -azur ite -az ula -arvind swami -arke stra -adv t -acon cagua -abo iti -x brownx -win nin -weber grills -we ka -wal tz -wa chs -urs bolt -trevel yan -tra s -tiny rebel -the modern -stay warm -spel mancollege -spanakop ita -sigur ros -seab right -se culars -sach inten -recomm ence -ra ima -r stream -pe za -ou les -obin son -nickj frost -ni wot -nb channibal -mil les -meal times -me sure -lu ken -lost inspace -lean newood -l out -kry sten -ko cher -klau dia -kevin and -k one -k far -ja ana -indv ssl -i agov -hom ology -hendri ks -h sn -gu lam -googlen ext -goal post -go yang -free comicbookday -folklor ic -erd mann -di stil -dese ret -chi dding -carol in -candle box -bush veld -bus boys -bu hle -blazed rts -bill und -bi as -barrel house -ba ster -b ended -avengers ageofultron -asi d -ap hc -after word -affe ctions -abt ballet -aaaa aaa -Ñĥ к -yoo ka -ye vo -work for -vocab ly -tyler l -tru cked -the fader -the cu -ss kin -sou they -sofrench vintage -snu ggle -si us -secon daries -scul ley -sa day -reig en -re yn -re ke -r mv -pot chef -pie tra -phoenix fc -peril ously -o calypse -ny dn -ni thi -nh strust -national ffa -muzaffar abad -messi ah -mckay lamar -maritime history -m so -level er -le vine -kon gs -kin ner -jo wls -j ino -ins worth -iam bic -happy y -ha ak -gurdas pur -gun boat -gor gie -free ship -fran che -fab ray -f rain -ecu tive -da rey -cra s -corn bury -cor dings -chu bbs -chal mette -bt ch -booker prize -bo ssie -blues music -av alli -at chaf -ar tofthe -ar ff -animat ronics -andre escu -alway z -af fords -:" ( -ðŁĩ¦ ðŁĩ¹ -âļ¡ï¸ı @ -whittle sey -wal lie -u che -troll hunters -thene ws -ta ita -ss ain -sr cm -smo sh -smo cking -sivak umar -siqui jor -sham ar -sei bel -seabor ne -sac agawea -rose bery -ro pers -rh summit -repaire r -raym undo -pro bowl -powe rexpo -pluto cracy -planes walker -pic coli -pe tawawa -pat ted -pas cha -om nam -o zomatli -neces ito -n cha -my f -mu dh -mormon ism -me ddle -mcn ally -kargil vijaydiwas -kam is -kahu lui -julie anne -jor danc -johan bbt -ig loo -ic tv -hack day -gre eeen -ge tur -flat breads -fir i -far ol -fa ja -end vaw -ence inte -eci ja -dun hill -dru mn -deser ter -de press -crink led -consoli dates -code word -coach dan -cinder ford -chrisco ons -chap els -cen i -canelo ggg -cali x -by res -bruichladd ich -bram ble -bonny rigg -bo vis -bo avista -berlin marathon -bel gard -ban ker -avi dan -aun ty -animalsin churcheshour -an diego -aldu s -academ ician -ðŁ¦ IJ -à¶ ¸ -yr ne -year inspace -womens worldcup -westhou ghton -weekendkav aar -wave forms -wai fu -w andi -vaux hall -un popular -tro mance -travel deals -tom ita -the show -the force -th ous -ta vel -ta eng -stone mason -speak man -so bot -smart glasses -small man -skincare routine -sing lec -rutab aga -rest less -pic h -out your -nx n -nas chelli -mr sd -mollu scs -mis labeled -middle boro -mi andad -merle haggard -mckaylamar oney -may son -mad tv -log jam -light and -kis story -ke steven -kar ri -kap ta -k rang -k ck -jyp nation -juice man -joh to -jobo pportunity -inter mix -icel anders -hou sman -hof burg -ho ary -her radura -guar naschelli -gra bowski -fo k -flugha fen -fin stagram -feed stock -fa pp -f ni -est ina -else worlds -ec lassic -divor ce -dess ner -dennish of -dan ette -dan adi -cork board -christma scar -chat er -chang chun -ch ics -calab ro -cad er -bul gur -bron agh -british ness -br andre -bobcay geon -athletic club -arbor iculture -ade i -ðŁĴª @ -ðĿĹ ² -اÙĦÙĬ ÙħÙĨ -yoursan jali -yong san -ym n -wood way -whi pper -vic tro -van dien -ur sula -ul and -trumpkim summit -to cross -supanova expo -summer reads -spro gress -spo onies -somer saul -show live -shi ri -seab ury -sb scycling -sat ine -saiy ans -ru pes -rotat able -real d -potchef stroom -pirat enation -penn sau -peninsu la -pa den -p é -one music -onco logists -ne scaf -montal vo -mik ha -mexican os -meat free -lor is -lear field -king o -kali ber -jan ssens -j ingo -j adap -is man -ir radiated -inconsol able -ilove her -i know -gun volt -go karna -go down -gla dos -gair loch -frees ync -fit girl -falcon heavy -f be -ere wash -end pjparalysis -dont drown -derel iction -cut man -cristi ana -col late -cli burn -ch of -cardi opul -brain picker -border wall -birce akalay -bel ga -balfour beatty -austr a -ar vid -anc ats -am ali -aler te -ade w -aaf shar -ê¹Ģ ì§Ħ -âĺ ľ -zo eller -z apho -ya ali -william j -wen do -wel com -wef tec -vo ss -unic om -ture en -treat ment -to ib -terri fically -ta kht -syste mati -stron garm -street side -sothe by -sl ps -sin field -seemar aja -sand es -rigo berto -ridem cowboys -ra dom -propell ant -play dirty -pit z -ping tour -pau d -open bsd -olympiacos bc -nived ita -neuro sci -navas ota -my morning -my fabol -myfabol ouslife -moy nahan -max planck -marri ag -marin abay -ma pes -lar dner -lan son -ja im -inhab ited -ilove snooker -identi fiers -humb les -hex es -har simr -gri es -fundra ised -fun yuns -fort ner -eun os -eat forum -dun nott -dtp traffic -don ators -de franco -ddi qui -d pac -concer ti -co rer -co i -clich és -christ man -chio dos -castle knock -car ps -bulg akov -bud ger -bro che -brand ing -book festival -be there -b haw -b ampton -at water -al bu -akon nect -aj l -aa ke -ðŁķµï¸ı âĢįâĻĤï¸ı -ðŁ¦ ĸ -é¢ ¨ -åIJ ´ -xdanny xbrownx -x olo -ww o -wil ful -whit eland -wester berg -viral video -v schi -v cs -ty phus -tumh are -sn affle -slaughter houses -sky rail -sk amp -singul arly -si bu -shan go -sc rat -sammy hagar -rob dyrdek -ridicul ing -ri i -residen cial -rescue on -re generated -qui roz -precep ts -power house -ph oney -pet amur -pap io -oru van -official sting -o cra -ned ved -ne ipa -mynew tag -mn hs -miller music -megh ann -me issner -marvel ously -mal dive -lovi poe -logi st -lad broke -knu th -kit man -ki w -kho a -kal ing -jen nam -it ler -ho comd -hin z -green living -green baum -gra fico -giar dini -getyour rescueon -franken thaler -fiumic ino -fa wk -diur nal -co vet -clam ato -christ of -carni fex -car lee -bul ges -bor in -boo g -bo rel -bio sensors -bi fold -ate aser -arsenal ladies -alf ons -afcf ylde -adap tors -ðŁĴĿðŁĴĿ ðŁĴĿ -âģ ° -าภĩ -~ âĻ¡~ -yatsen yuk -ver ne -u son -twi g -thumb tack -ten sioner -techno park -spot swood -sp icing -sat omi -s mad -ross land -ph ela -penn sbury -over subscribed -ni ek -new stoday -muang thong -lenor mand -kul iner -ke sey -kag nihotri -jen ledger -jake and -irish art -inhibit ory -in icia -hill wood -gar o -gad os -fore saw -fif teen -execu table -dj mark -cristianor onaldo -clo bbered -ch azz -cb nnews -castel let -campbell ton -buil din -bo ze -beaver tail -asta xanthin -armit stead -algo har -afri kan -adul ation -. \ -ðŁĴĻ ðŁİī -ðŁ¥ ¶ -vs stl -vou lez -val mont -va ani -unit ar -twilling ate -ts is -to kimon -thingsto do -ter ab -te ee -stock ley -sto bart -squab bling -spl atters -sla ved -si vel -shake ology -scupp ered -practice make -parsi fal -ofthe dead -nutrac euticals -nodu le -nh simprovement -national garden -musc adine -molo ko -mo jor -ment eng -ma dox -m vollmer -lu hya -live sof -lingu istically -li venews -landscap elovers -la pid -killing bay -k vs -k ral -itsan u -it starts -inci sions -id der -hust les -ho fer -higa shi -h ø -h pt -god inez -girl shoops -galá pagos -fab rik -ev genia -ear nie -e up -du bin -din am -del os -deci mation -cwu news -cry engine -cong don -child bearing -carte sian -c nu -bur st -blue ish -bir ria -babys its -aw wh -ate le -at omics -ake chi -adelaide united -. :* -ðŁĺĦ ðŁĺį -âģ¦ âģ© -your koel -wo j -vis by -val ds -un vaccinated -teen nick -sy mes -sul liv -socialmedi aday -slo opy -sexual harassment -scarlett johansson -ready set -quebe cois -procedur ally -pro do -prim roses -power man -photo kina -photo gallery -o gie -nerd core -n ams -monmouth park -mock tails -mir an -me jo -ly nd -loyol achicago -latingram mys -ku tty -kre am -kitty cat -king splace -kind ler -jait ly -itsme leighton -is amu -ir ks -imbi bing -i for -ht fc -heer den -groun der -go thia -ge un -g elling -fur red -flipp ant -fam il -dhok la -dar ab -co sis -cen e -castle hill -boo the -bla se -bi kie -balth asar -b gl -ay ling -av neil -atlan tis -apocalyp tica -anc yl -air travel -. £ -âĿ¤ï¸ı ðŁĺĺ -âĿ¤ï¸ı ðŁĺį -wheel wednesday -weiss bier -w gi -ver ging -vair amuthu -under wing -trans mog -the resia -th ell -ten ting -tech a -su pine -strive forgreatness -stock hausen -spor tuk -sound sof -sor ana -social innovation -reu ven -redi ff -re ssler -re ms -ratt ler -punctu ate -prof tim -pro am -pirelli sport -pac ked -oso gbo -oly phant -ohi of -ogle tree -oba diah -ninjat une -mu kono -mom iji -mac manus -ma od -little bits -kir lo -kipl inger -ke dle -jun pei -joen suu -jo ao -isu zu -info world -in ty -gom i -ger hart -ge ments -followthe money -fe gan -exp ended -ef light -du pdate -dr jitendrasingh -disposse ssed -deli fe -cla vin -chap ut -cesar millan -cay ley -call aloo -caix a -c sw -britt ania -bo ssi -bed nar -bay ar -base boards -autom at -as el -alo on -aldu bt -al trock -ait anya -.... , -.. :-) -you should -wxyz detroit -white ford -wh one -venkat eswara -vac tor -un seeded -un knowing -the hotel -tex ters -sunday night -strath field -stabil ising -sports fest -spor tb -spod casts -slow dive -sleep walk -simp act -shaf fie -sel ke -sau my -ren min -redd i -red wall -recal cul -qui apo -post media -pennsylvani ans -pe ary -pat toni -param our -ou u -ou twit -os ong -os mia -octo path -model life -mis samy -miha ela -mach el -ma kaya -lu thra -let in -kum amon -king arthur -kill ick -kiaro stami -kemp ston -he av -h dm -gin day -gif te -free from -fr ary -fin ola -ferry corsten -far nes -fanni bal -do something -deutsch es -de us -cute cat -com ext -co ser -cla b -cheese making -brei vik -billie jean -anni separker -ach ance -ab ajo -aac psa -âľ Ĩ -ب Ú¾ -Äģ n -xperi az -we ert -wad ala -v adi -under funding -umichb ball -umb ral -tirmid hi -thpicture inyourphone -thanks for -ter ima -t any -squ iz -spur ts -side arm -scrutin ize -river front -ring en -renew us -re tainers -pinatu bo -paul hollywood -op killingbay -nsa ids -no love -ne om -mutt ley -multil ayered -lk ld -leed snews -kno ssos -karthi keyan -jennaf ischer -jar dines -infer ring -indiscrimin ately -indi am -ik k -i ka -house holder -hollywood musicawards -history pic -hippo campal -henri quez -hat erz -ham lyn -gri ef -good in -fil mi -fern hill -fe aster -f yr -extre ma -ear ne -e ya -dog food -dianap enty -der ailing -day le -cub stalk -comic artist -colon ised -cleve metroparks -catapul ts -carbon footprint -cap m -ca am -boule var -bou n -bal dev -art gallery -arab spring -ang poet -american airlines -ail oa -af onso -ðŁĸ¼ @ -ðŁİ İ -ðŁįĢ # -âĹ ¦ -Æ ¹ -will in -und proud -tweedle dum -tu llo -tten ham -thunder bird -suis un -su joy -strans formation -star killer -splin ters -so corro -shout out -shane warne -scot winter -sacram ents -s foster -road worthy -ri sky -reli able -ra ag -pow ley -pau le -pad ula -oller ton -og ata -nascar throwbackthursday -mush in -mile split -magnu scarl -lu re -live worx -life straw -knowyour mil -ken nan -janc is -irre vocably -ho ards -hel man -he o -great esth -ed rums -de morgen -cric ut -creek fire -cr ing -course ware -cooper atively -co generation -clu sion -ck r -che rer -cb nationals -cat tail -ca rena -c und -bru ggen -bl ms -betro thed -beach party -bal ter -asu bhash -ar dsley -anu radha -akure yri -af ell -acur ator -ab sm -âĿ¤ï¸ı ðŁıĢ -zebe dee -z wei -whistler blck -voodoo doughnut -venice biennale -vatten fall -une aten -un iter -un intelligible -twent ynine -supercalifrag ilisticexpialidocious -sun tron -stock car -speciesi sm -sp ald -sis rocks -sin noh -s folk -rock house -ri dec -rescu ecat -radio one -ra ye -pul kit -phum zile -people schoiceawards -pell erin -pad dock -over capacity -omo tor -olympic day -nt live -nam bucca -naf me -na aper -mix master -mis chief -min ori -mau ka -ma ser -ma dang -lun cheons -lili ane -li gas -la irs -king fire -kic cha -karnataka elections -jalfre zi -jak arta -intensi ves -ing g -in frequently -il h -i fans -haw kin -hau gesund -han ako -gun ston -fun di -fran xx -fa xon -es mail -el za -ed out -e ig -dull ilah -duc tions -defe cte -cro at -congre sses -con agra -chemi e -chae won -ch á -cel bridge -bar zal -bal doni -av iso -arow ana -ander matt -akit aranch -activ ators -< ---- -ðŁĩªðŁĩ ¨ -âĢ¢ _ -x ly -womenshealth mag -win and -visit york -vanoss gaming -ucan ationals -tr ps -theri ault -tfo ir -tassie keith -tai sen -steve vai -spiro graph -ski ft -sak thi -sab bat -richar de -pur ton -pro tractor -pro clamations -pre witt -pn v -peat land -oo hh -official jaden -ob inna -nzv pak -mike posner -mb log -maw gan -lothian buses -lic enced -li spector -lady leshurr -k rep -ing stone -in experience -i stom -hen ric -heis ler -gu g -gor den -gali ano -field stone -far nese -emboli zation -dho ti -demon ized -declar ative -cy m -con nah -con akry -cj tfoir -cirque dusoleil -char mouth -botu linum -bis ummit -bier ce -betterlate thannever -best buddies -arri an -and al -allato ona -ak tion -ðŁĶ½ ðŁĶ½ -ðŁijĨ ðŁı» -ðŁĮ´ # -zz ani -yogap ants -wyn num -wend el -we ichert -vir u -vi raj -v le -us ica -uof nh -ul an -tito jackson -tir ta -the urban -te tten -sung kyu -straigh taway -shail a -segam at -sal miya -road race -rhy mney -re routing -ray ray -ramadan mubarak -rac v -projectcar sgame -pou le -pom pon -per na -pack wood -nor der -new type -mit ski -ma gro -look slike -li ssy -li sn -jo tted -ji ofilm -jen is -im mor -ie b -hi pped -hed don -hac er -gre asing -gop convention -go gold -gan ge -ga str -fuj ii -fil am -feeding america -en rage -e ki -de is -cu u -cir stea -ci ani -c ju -bre ich -boot loader -bitt ner -aw alk -avac ado -ant elope -âĺĢï¸ı @ -woody att -wig town -week ley -weather spoon -wann able -unconditional love -un dignified -umat illa -tour bus -syste matic -sundance tv -strong man -spec tro -spand au -skin tight -se guidores -se btsb -sau cy -sar it -roberther javec -re direction -qaland ar -priyad ar -philando castile -petr one -pe ppard -p cap -out of -ob its -news agency -neu haus -mid den -men swear -meet in -me doc -mar get -mac room -lin gered -la van -la gg -kontrol freek -ko hei -kingdom come -kai ju -jamesbay music -j lf -ins grove -in ment -i ddle -honeo ye -he anor -griff on -gra fica -gr itt -ful mar -flan king -fact maniac -eye less -ev ene -en by -did act -demo ss -deli sting -d nr -crou ched -cote depablo -chor doverstreet -brom field -bri quettes -brahmot savam -bi ek -believe survivors -be headings -bark ads -art sat -an vers -all soul -akade mi -ðŁı ¦ -âĻ Ĥ -¨¨ ¨¨ -y sen -whistlerblck cmb -wayne brady -wan s -tin ka -summer hall -subordin ates -stan ge -spor ter -spor ch -soo bin -so gni -sig no -sa rea -rogue ales -reis man -re buy -radi al -r pio -pro create -pre formed -petre ls -ori ed -on enation -nautil us -narasi m -mex it -mer kur -list enable -just ing -inju n -hyper sensitivity -hugh hewitt -hu obi -hu gg -home security -hi elo -he yes -har on -gri dley -gre ger -gine ering -face hugger -eng s -doctor ing -det lef -cyclone idai -compos ite -club legend -chil lax -cess nock -bo para -attack man -ariel helwani -absac ape -ðŁĻĮ ðŁĴķ -ðŁĵ ķ -ðŁıĨ ðŁİī -zo bel -world heartday -wo ad -wkr p -wing let -whirly ball -we bbs -vive kagnihotri -vi varium -vel vel -vat ron -v app -um unna -um ps -tu it -ti ze -the group -terry fox -stu ary -stran ja -ssi en -soni sphere -sel ma -sd ss -sau te -s gg -ryan paevey -rosen crantz -proudly sa -priv atec -phineasand ferb -phil p -petamur gatroyd -pend ennis -ofthe year -north man -ne bulous -nb nationals -nav our -natural wine -mu cc -middle port -mas lin -maj d -lotte rer -lo ks -lo den -liz ette -kla homa -kho s -ka unda -jeon buk -inatur alist -humph rys -heer len -ha gelin -gym no -green light -gra phe -gl is -flo aters -fle cked -fe cking -fair cloth -et ine -en ning -del phia -david k -d wick -co qui -city link -cb se -camp amento -cal pers -buzz i -bru un -bin dery -ber ney -bath water -at kins -ani eri -akro tiri -. ðŁĴļ -ðŁĮ³ ðŁĮ³ -za bel -z wei -viri dis -unis ys -tere sh -su id -startrek tng -sin novation -side track -sc all -re launches -re ax -proudtobe afan -pl d -phal en -pel low -pan ter -onep age -of light -nak ata -metropolit an -melb weather -me all -loh man -leni ency -lee der -ko etter -ke al -kau ka -kas sa -jr smith -jar head -irrit ations -ir responsibility -inter varsity -infin ities -idu kki -hot cakes -historio graphy -hel mi -gu bbins -gro t -gr c -gg al -gam per -ga illar -engag ed -en sley -drewestate cigar -dess er -dang a -cro ston -cater ham -carmen ere -bru ff -bra bin -bal ta -awe a -arunach alpradesh -ared cross -angpoet nyo -andre wc -alleg ori -aal u -a ow -: "@ -!! ðŁĺĤ -ðŁĻĤ ðŁĻĤ -ðŁĺĭ ðŁĺĭðŁĺĭðŁĺĭ -ãĤŃ ãĥ£ -âĦ ĵ -z wick -youngg uns -wool fe -wild london -vi kh -uc tions -tri go -too cool -thereal rvd -the view -super cute -su blux -spe sial -sp ree -shwed agon -ser da -seman asanta -se stero -s store -rou ch -railway seva -pra gy -pit o -pi red -perfec ts -panam ax -p tes -oy als -ol son -o ved -o ao -mou lder -mon bebes -mo xon -mckin lay -mck oy -mar aj -maniac ally -mag navox -ma kara -m ry -lit us -lay lee -ko komo -ker ne -kent cricket -kad ai -ka day -io ana -innu endos -ic caworld -heroesofthe storm -hasling den -go akonnect -gi gas -gh gs -fox worth -ey yyy -espark global -e es -do bro -delav an -cyber bully -cot tee -chrismur phy -cattar augus -cab ramatta -c mes -bu fc -bce agles -ancient greece -alan hinkes -ae olus -" ðŁĺĤðŁĺĤ -ðŁĺŃ ðŁĴŀ -ðŁĴª ðŁijı -âĿ£ âĿ£ -x pac -weston birt -travel writer -tou galoo -thelittle mermaid -thak sin -t dov -spri mary -spee dos -slan dered -shi ela -sharpen ers -see u -sch um -roy don -ri era -red lips -raaj je -proff itt -pig farming -pie bald -pe tani -orchestr ator -om ha -ny anza -ning xia -ne om -mind hunter -mc grew -ma sy -lux ottica -lu chad -land reth -kan o -kah ler -iron mongery -inter ment -ing machine -ine yard -im thankfulfor -her mie -gleni ster -gill on -from software -flo c -fir min -fion nuala -fin ality -feliz sabado -fabric london -f omen -evangeli zing -ev and -eric mccormack -enfor ced -end ar -el ocke -dru ga -dianer avitch -dell inger -cv shealth -cr andon -confir a -clin ica -chop p -ce ylan -cas cara -carbon iferous -cali ban -ca zen -bran chs -boo oom -bl are -bi ji -befu ddled -as car -and star -aar ad -_ ? -ðŁĴķ ðŁIJ¶ -ðŁijĬ ðŁı¿ -ãĤ¹ãĥ ŀ -ñ o -za it -z g -wx pn -wur ster -us mc -ty balt -twil d -trump ing -topic ally -tol lywood -tod ds -thar parkar -th agallery -tel lus -tan alysis -stri d -spy ros -sop hs -sn om -slo tting -shu ang -sar ker -san kt -sam harri -re interpreted -ra fe -pizzic ato -pi eds -over shot -or not -oil spill -mun den -mo ton -mi hi -mchapp yday -mc delivery -man nnn -ma sina -link building -li at -lar ter -kon ser -kaw aii -kam ina -justin suntron -journal news -jo va -jay enge -icar us -hu zur -hall berg -half time -gitt ins -gerard butler -gel derland -gay boy -film fest -fen ster -face paint -enam els -emili aromagna -edi fying -des borough -dean heller -dar b -cnn travel -cleanpower plan -ch bosky -cau cu -bill peduto -big lia -baja j -b ø -auto biographies -ash lyn -ascri be -antico agulation -anthony horowitz -anom yces -ann er -! -- -ģà¸ģภģà¸ģภ-ðŁļ Ħ -Ù ¹ -wom xn -whl hitmen -we fts -vff vishal -vet tori -ulte gra -uci wwt -track listing -tough enough -t st -stanley cupplayoffs -snail mail -shant aram -sever yday -seti awan -scaram ouche -sau ced -sa are -s freedom -ri vard -quan tock -protec tive -portman teau -phumzile unwomen -over confidence -ov ation -mon tee -mehro tra -loccit ane -live th -li ming -kra is -josh gad -jobseeker ssa -iz abel -ic inema -ham in -goo py -fei jo -ew p -est us -do good -deeper learning -dan los -cor dia -coo kier -co key -ch affin -ce as -calgary transit -bor an -bly theville -big basket -bas ili -baj payee -awal ha -auto pia -ann aya -ac ws -absacape epic -a app -__ , -ðŁĻĬ ðŁĴķ -ðŁĺĤðŁĺĤ ðŁĴĢ -ðŁĶ¥ðŁĶ¥ # -ze stan -yah u -we irs -vou vray -voi ded -untol d -ug l -twitch stream -tutic orin -trade fair -tobogg aning -toa dies -thar u -tang led -su af -strom ness -steve dave -squir ming -slo gging -sil om -sc y -rival scamp -re locations -qu onset -poly gonal -politici ze -pember ley -pavel ski -pa j -not is -nishi ki -mothere arth -mor oney -men ina -mam bas -mal k -m cu -lor ra -lessthan jake -l ko -kor dell -kal yp -josh frydenberg -heather peace -h sf -good child -ger hardt -galli fre -farrow andball -eric balfour -el kie -dr s -dj k -diplo docus -de sailly -cynthi aeri -cynthiaeri vo -corn hill -conver ge -chaz elle -caris brooke -bri ant -breaze ale -blaz ey -bend el -b pi -atta k -ambi gram -am ii -akih ito -.. âĿ¤ï¸ı -! ðŁĺįðŁĺįðŁĺį -ðŁİ§ ðŁİ§ -ðŁį» # -âĻ Ģï¸ı -ঠ¼ -zen berger -yal da -win ders -where smy -washington state -w py -w boc -verge currency -ve les -tur fed -tu beli -tra pt -thereal swizzz -the bookseller -ste ttler -si mono -selfies aturday -river city -ri ese -relati vistic -raz dan -rath farnham -radi i -pree mie -perpetu a -op teryx -omo to -om ey -nicholas ville -my pov -my haver -mor rin -mo der -mis alignment -master killercat -mar ucci -magnuscarl sen -lu gged -low veld -lou reed -liber té -let tre -lang one -l lanes -kur umi -ko jic -ki kk -janes addiction -jac burns -j sd -i uk -hus bando -hou sat -hillen brand -heuri stics -head dresses -grill z -green roof -g suite -fukun aga -f sd -episte mo -eleanor tomlinson -east ayrshire -du rag -du hok -dor inda -donthe con -dont mess -do xie -de sa -dcu o -dar zi -cric ci -chuk ku -chis wick -central america -ced rick -carab a -bra dd -beach in -ash ak -aser vice -ak ki -ðŁķº ðŁı½ -âĶ ģ -zar ah -yo len -whow ill -wether spoon -va jani -ur gess -tsogo sun -tro pea -tot tori -tokimon sta -te gu -subscription box -strath aven -ssss ssss -shepher ding -seraf in -ri ddle -rep as -rel v -refra ined -ree du -raj as -par des -offro ading -nu ss -no stri -njor oge -navi es -mun nings -ma kurdi -liver pud -kat ju -karu izawa -jamest aylor -j ca -income tax -hel sby -h ly -gu ssie -gr anti -frog fish -fro w -endeav or -effi gies -dé j -dro pp -dread fully -do go -dh w -demo l -dat aware -da cha -coven ant -compul sively -com in -cel and -brett anomyces -boys noize -awesom econ -austin aries -asha hidi -ague final -ag ris -adhe era -accordi ons -abi er -. ðŁĺ³ -ç¾½ çĶŁ -yaw key -what it -we be -wb homeent -v nd -u ht -toyotag b -th uk -tartu ffe -sub floor -sp ga -shank land -sever na -secur itization -school holidays -ripp rince -ri zza -reak tor -rachel platten -popcorn day -poly phony -pickn pay -our is -od sc -o kes -ne olith -mythri official -mu sher -mr v -mirand akerr -me tball -ma gam -m clarke -ludd ite -leim ert -leee v -kt lamor -k aus -it pro -in ol -im printing -il more -hugh ey -hot deal -grized ale -glen shee -gen est -gan esan -gab at -elfy nevans -duckdynasty ae -doing good -dc v -dau ber -cron je -cityof melbourne -chan go -cel lists -cav in -categori zing -ca ac -burn t -boast ful -auto gas -art fund -arba az -adidas us -accredit ations -ðŁĶĬ ðŁĶĬ -ìĨĮëħĢìĭľë ĮĢ -ãĥ ® -âľĮï¸ı âľĮï¸ıâľĮï¸ı -z berger -yak ima -wound care -woke up -wil dearth -wil braham -warra gul -v any -tennis channel -team di -tarpor ley -target style -tan nen -stri stan -stabil isers -software ag -shel ford -seran goon -satyan adella -ro bri -plat zman -pi at -north bridge -mun ia -mpha sis -mosque attack -mom oko -minneso tan -min eta -mickle over -mal ki -ma pre -le amichele -lb cc -land cruiser -kas ab -k ely -it ne -int endi -il ta -i ye -hyper icum -hal am -ha dj -gram ophon -gr aca -go beyond -gd xj -findac ure -fau bourg -fair light -fabric ators -estu arine -endu ro -emb ra -electr ici -el ç -doodle bug -di ye -desp airing -del dia -de hart -d tb -d com -colom be -citizens advice -chao sium -bro man -briga deiro -born thisday -boccon cini -blu enote -bike suk -berkle ecollege -baili wick -anasta sio -allin cle -air baltic -ah mar -adel phi -\( ´ -ðŁĺª ðŁĺªðŁĺª -âĤ¬ / -à© ĭ -yar ashahidi -y ria -wim berley -wak ing -wa ren -toll gate -thunder y -tb w -tag ger -t illed -sur yah -subju gation -su sd -stend hal -stel ar -stat news -srin u -seab orn -sclu bs -sch ell -samharri sorg -salt iness -rust ington -risd greatness -reque st -reflec tors -rainbow dash -ra abta -prayag raj -positi on -police state -over wintering -orient alist -orb án -opportun ism -new sham -mccarthy ism -marl borough -mand elson -mand arina -m bro -livin ghistory -linch pin -lec avalier -lazy bones -lago m -l fm -kie wit -k ops -jaz ira -hydro gels -hull kr -hu bie -har pur -h st -guard ado -gro ene -gor ies -gna sher -ger tler -gearbox software -gad wall -fri ars -ebay seller -dr ace -dhar wad -den smore -dd x -damian lewis -counter punch -cor ran -controversi ally -cho ic -chlo elu -chill on -che shi -carbon tax -bryan dechart -berk shire -beli e -be side -bar rescue -bandi pur -baghe era -badger mbb -ast irl -asdfghj kl -aro th -anciente astirl -achi bi -ace supported -a asu -ภħ -wro ble -wood hill -will unga -welcome home -usur p -un in -ty as -team cavuto -t mt -sukk ah -sque aled -so sad -seduc er -se amu -santaclar ita -ro cc -re evaluating -pre conceptions -pli ss -palladi um -ous as -on racing -on assignment -obl iteration -morethan adodo -mir ates -melind agates -mas jid -mal do -making ithappen -lc dsoundsystem -ktlamor ningnews -kry stian -kra al -kalli o -jacob hoggard -ing all -in cr -imprison ing -implic ate -i sic -henne sy -h miller -gul ated -gu dda -grin gos -good olddays -go emon -g iler -g anta -foot man -f tw -er ba -don jon -doc sis -destruc toid -dann ys -construc tivist -cler mont -car mine -canadare members -can ar -ca zeno -c be -by example -bir ney -beve ren -ben y -bate man -bat l -basketb alls -bad ar -babbac ombe -at si -an si -ame ren -alla ire -air por -ðŁĺĬ " -ðŁĹ ¨ï¸ı -âľĮï¸ı âĿ¤ï¸ı -wol len -wec twx -wa qf -uof c -u mau -tul alip -travel and -the bookof -th re -team god -tam ashii -ta phone -syco phant -sushant singhrajput -sun iv -spro tt -siss ay -shel tie -save baloch -sanji v -sa wak -roe bling -ro jak -resi stencia -r deye -pro xy -prisma drop -poli zei -pau illac -pais leypark -oaken fold -no ps -narra been -n hat -mill ilit -mill ar -mary port -maniz ales -maithri palas -lep tin -le pe -lar oc -ki bler -kex change -kati epiper -kathryn bernardo -jancis robinson -intere strates -ij tema -i vi -hunter don -hal mstad -great things -gotom eeting -gh ur -frequ ent -flori dam -et itans -ell ines -ed ington -e bulli -dwarf ism -dn vgl -diso wns -dis assembling -di vison -de um -dann apaola -d bn -cur ro -corner stones -cor vids -c ica -bye felicia -boy fie -box uk -black ery -before thestorm -bal ck -ati ma -astri d -arri aga -amar na -ag it -abdou laye -ðŁijī ðŁı½ -ìĸ ij -ãĤ ľ -´ ) -yepp oon -y gritte -tur rentine -tl f -the water -ter on -tae gi -ta ines -swat ted -stein er -snar led -shum or -senior living -seg af -sch rock -sant angelo -s dream -roman atwood -pti family -primary day -presiden cy -police media -phlebotom ist -phan tasia -p ny -om bra -olom ouc -n illy -mu lai -milit o -mel brooks -manhattan henge -mang aka -mac world -lose it -little borough -lascru ces -kill aloe -kast uri -karim nagar -je hu -isi ah -iit tala -ig da -id v -id ar -ha za -gur khas -gunnar sson -gla xos -gen oot -for ten -ey ah -eve ready -eic ma -ec v -doll ard -den park -dab bled -cre tan -co cin -circas sian -cic lavia -ci ena -christ elle -chol as -cat love -cal me -c cha -bts v -booth bay -bb bs -ax alta -ark ady -aad hi -ðŁİ ł -zoom tv -y dr -wester ni -wal drop -vil akazi -vascul itis -tw da -to taku -time machine -ti ppers -teen sy -te trick -te hama -st any -sher ilyn -rook wood -red hook -re avis -qu aver -q alam -protector ate -pro phyl -post it -petti bon -pascual inigo -p online -opent able -nu be -no tim -no onday -mytho logies -morde chai -modu l -meg af -me che -mc elderry -mar veled -man h -m ste -life jacket -lgb thi -le dyard -land form -la ko -l de -kun kel -is am -indic ts -impeach ing -im pascualinigo -icon o -i shares -hoo pin -hocken heim -gu ta -gran fondo -gou ges -gentleman jack -gam asutra -food day -fire balls -exoner ation -em n -e zi -dp wh -desider io -d jan -congreg ating -com ber -centi pedes -catoc tin -carson daly -cag ey -beli veau -ayl ward -au b -af sc -® ¤ -wy land -wash basin -vi eng -ver us -val eo -ty ronn -toko pedia -the mm -ter ram -tand berg -stell ung -staff spolice -sm iller -slen ses -sierra boggess -sarah j -russell tovey -resi zing -rap zilla -power ofthe -plu ckers -phx cc -ni zhny -ne akers -nas reen -na aaa -murder she -moko ena -mojom agazine -mit press -mechan o -mayweather mcgregor -mar clam -kimmel center -kim rhodes -kemp ner -kee ton -jun gh -invasi ves -inter dependent -ib ps -ha ie -h ref -glaxos mith -festi vely -end papers -dren ch -daily doseof -d aki -cu lotte -cross dresser -crock ford -cop ts -co zi -christen son -charmeck schools -cb ssf -castle berry -carpen tier -canad ain -can zone -c son -buss iness -bts loveyourself -bra da -ben zi -bas sembly -barin holtz -b vp -au gur -anson mount -anit aha -aag adu -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -ðŁijĮ ðŁĺı -ðŁĩ± ðŁĩ· -å® Ŀ -âľĮ âľĮ -yu asa -y ane -wthr sunrise -wood chip -wak ely -under pin -u cino -trib live -t mp -swan wick -stre ich -soo on -single use -si ol -sha itan -redribbon week -re um -raw ness -qarab ag -pro pel -pit ttweet -pau sa -patrick t -pal mistry -ode sa -nail sea -na har -moto x -moor town -mon tre -mee se -mal vinas -live smart -lique urs -lin zer -leol aporte -learn french -ld w -kol by -klon oa -juxta positions -judy garland -jcde caux -jay weatherill -jay esh -ja el -ito to -invali dated -ini st -id hun -har ro -happybirthday justinbieber -hand bill -go live -get thelook -g alea -free wheeling -fax es -eye mouth -ep ona -e or -dupon avon -dont missit -dar ran -color ism -collier schools -col chester -cn v -chrismurphy ct -c party -bre er -barrym cosmetics -bag oong -auto crat -amne siac -all night -ak off -ab ri -a show -: *** -âľĭ ðŁı» -âľħ @ -world suicidepreventionday -wl w -widne srl -wai fs -vegan life -uk is -te ahour -ta pers -t india -swithout limits -sr q -squawk cnbc -sour puss -shal ini -sec unda -sat ra -sam bas -recomm it -press meet -pin tos -pap ayas -pa yoh -ox as -oshiom hole -or cla -oak brook -novic hok -newcast ler -mv cv -mor van -mant els -man era -makar ov -m te -lu kens -lily collins -ko tt -kja er -khur sheed -ke ach -ingex cellence -immuni zed -honor thefallen -honey badger -home wardbound -hil and -gord downie -fel den -fam bam -dl mundo -coo ky -chip day -chang s -cal ea -bun ji -bra infood -bos mayor -bon line -blephar oplasty -bee man -base board -bam enda -aw memorial -avail ab -andro gen -ana is -acoun ty -? '. -ðŁĴĹ ðŁĴĻ -ðŁį ¤ -ðŁ¤£ # -ìĹ ł -âĹı âĹı -zulu eta -yoshino ya -worldkidney day -whisper ing -wb z -water colour -w one -urban ized -uppere astside -turnaround dontdrown -try pano -tiru pur -the gautamgulati -the darkness -tan am -surface pro -spino saurus -sky land -si endo -shou sem -sebastian stan -sch ini -rob kardashian -rizzle kicks -rebec car -rawling ssports -rallyfor rivers -q ia -provision ally -play doh -plasmo dium -piñ atas -philosop hy -paulsmith design -pagli acci -om gggggg -nz dusd -nil ai -nat sumi -napp ed -my ride -mud guards -mass aman -manek agandhi -lush ness -lor rain -lor an -log anc -kno blauch -kim m -kad hal -je thawks -issu ers -intimi dator -hot stuff -har ron -hai les -habitat forhumanity -h le -gill i -ge of -finneg ans -embed ded -el er -dic amba -d mcc -con dell -chine y -chan dos -chan cey -cdn media -bu ge -bre uil -big bird -argu ello -antimicrobial resistance -anti go -ad lon -ac amp -! [ -ðŁĴĽðŁĴļ ðŁĴĻ -ðŁıĥ ðŁı»âĢįâĻĢï¸ı -çīĪ æ·±å¤ľãģ®çľŁåī£ãģĬçµµæııãģį -ç ± -ঠ° -اÙĦ Ùĩ -à ° -yo gag -xl vi -wayne twp -wap da -ven ic -van guardia -vam ped -tradition alist -ti ina -sussex wildlife -sun splash -som aiya -sin den -se sar -se ha -sco bee -sar od -sal ima -sachinten dulkar -road safetyweek -redefin ing -qu abbin -pri ory -pier i -pier head -pennsau ken -pau land -par v -off shoring -nag as -n all -mut lu -mu chi -moldav ite -mid as -mey ero -mention perfection -mat amoros -magic leap -lush ltd -lu li -le vo -le aper -laker nation -kra k -kevic lifton -kel t -jurassic world -john carter -jarim atti -jarimatti wrc -ity now -insta style -im plausible -ide alized -hand son -ha shes -ge minic -gameofthrones finale -ga eta -franken weenie -fl ou -fir angi -film news -f bic -ent ices -earth week -dut chie -dino zzo -dh aliwal -dev ina -culche th -clou seau -chas ingthe -ca pos -bush walking -ben intendi -arlington natl -ar pa -ar beloa -and ym -amy leeev -ak ini -af terel -aard var -[ ' -ð٦Ħ ð٦Ħ -á ĸ -à¹Ģà¸ Ĺ -zayto ven -zain ab -yo weri -van fleet -ukem plaw -uk butterflies -trige minal -ti thi -ti pico -the juan -the beachboys -speake th -smallbusiness week -selec tor -sauber f -sare made -sam er -ress ata -recl ined -rac ist -pro yuvraaj -pre serve -p outs -op lay -olu mide -o tran -navy daily -national school -n oooooooo -mu sonda -mu dge -mar cellu -lon gi -lic on -le aching -kin deren -ke sq -k be -jun ger -jeff ry -je zza -je para -james blake -jam aa -ja ago -immedi acy -herd fb -gun slingers -gore tzka -ghost signs -gav roche -gart land -gar mo -full body -film music -fi fi -ev f -e gal -e banks -e ady -di fe -dfw traffic -dar nley -chou dhry -bridge view -brick layer -box en -blast off -ba oli -atal unya -ang ood -ain yc -abscon ding -ðŁĽ łï¸ı -ðŁ¥ ĸ -ðŁ¤ ¥ -íĭ ´ -à¹ĢภĬ -ÑĢоÑģ Ñģ -wak ati -vy pe -vene z -ve ia -uh in -ty rosine -tu as -tro tman -tore ba -tol ka -tim and -tig ny -thig pen -tel lem -tas krabbit -tarong azoo -tag uchi -swedi shousem -swedishousem fia -stop brexit -sr hs -sped als -sno res -ske ena -sch ange -sal leh -ru airi -rouss os -rodney atkins -q west -people pets -ori zon -obstetr ician -nwob hm -muzaffar pur -mrdavid haye -mob sters -mo fongo -mir cea -mer y -meang irl -math letics -mac neill -kron er -kill this -kai greene -ju dit -indi sci -horse play -help the -haz ar -gw d -grave side -gram atik -gonna hate -gas olina -fre search -fair ings -fad er -every simpson -est eli -est ela -ellic ott -disney junior -dirty bird -dheer aj -de grades -cu dahy -crimin alized -coren tin -con k -con forms -col den -cloud scape -clam or -ckin ney -ch evening -bra zing -bluenote records -bat tuta -baq ir -bang erz -bal der -austin town -as inghe -al endar -@ ... -ðŁĺĤ ðŁĺĭ -ðŁijı ðŁı¿ -wild card -we broot -vand aag -tor ode -tom ie -thevamp stristan -thel auren -tan jore -syn ching -stu mpf -son no -sas sari -sall natural -ron o -rethym no -repleni shes -raig ad -pub media -port sea -paper weights -p day -or ton -oni stas -ol our -obey giant -ni it -mucos al -mu dug -mi tho -marcal mond -lit en -lec c -khal eel -juli ane -ji bs -intric acy -i han -happy dog -h vs -greg pak -good nite -gn omeo -glam med -gen erics -food coma -fie sta -far nam -er ra -empres as -e met -drud gery -doit for -disembar king -did entity -chloro form -cebu ano -catt elan -car ini -car audio -can er -bul ilit -bol lo -bidad ari -bi os -bell er -ash dlmundo -ari da -ame ba -ab iz -ab im -å´ İ -yur il -wen ig -we gen -walk with -wal le -wait akere -ve za -ut m -trainst ation -tou raine -thre shers -the celtic -than s -ter raz -stephen mulhern -start list -solidari dad -shepherd stown -sfoster nyc -se spn -say le -sau sag -sal afi -rock thered -riks bank -regre ssing -r anna -push cart -play it -pack rat -pac west -orang erie -optimi stically -omis sing -nikon europe -natur alism -nan ton -mosth and -mccar rick -lik ening -lar sen -l anna -kwe ku -ker bal -kan chan -just ino -jor dand -is no -int n -imper ing -i fam -home track -haver town -green live -fron tex -fizz les -fir stin -do ce -demetri os -dave grohl -coven an -clerk ship -chrisvan hollen -buster keaton -bri den -ban fi -aw ful -ach rafieh -ðŁĺį ðŁĺļ -ìĹIJ ìĿ´ìĬ¤ -yl g -ye mpire -wire work -wbal tv -wan ed -wan e -vegetarian week -ur h -tre mendo -trans gendered -tide as -thro ad -tar ly -st thomas -sn bc -shi bain -shadowhunter schat -se ty -schwar tzel -sch u -sch ls -scat man -saf in -sab y -rubi ks -ro whouse -rip cord -rem itting -reformat ory -re ise -ramad ank -pren up -photomani pulation -opel ousas -mill street -merr itt -me tin -man teo -latitude fest -kel sall -jummamu barak -jer ked -jen nas -jabberwo cky -ja ins -j hc -ij e -ham by -grou pers -gon za -gl one -fre eu -fe int -f book -exchang ela -evic ting -en ery -en counter -dy ersburg -dri k -dis band -cur bed -conge stive -bro th -bier zo -atem ple -asil va -ap ig -alder men -al ye -aby ne -ðŁĴĻ ðŁĺĺ -ðŁijĩ ðŁı¿ -رÙĬ ÙĨ -yalo va -x large -wr ld -wizz air -war ley -vote conservative -visual kei -ut arlington -united sportscar -uncler ush -un couth -twee ples -thi splace -tad ao -ster oline -ss ays -slu t -scrn ch -sci oscia -ro thenburg -rid wan -qu ai -play day -pic atnoon -ph rma -pen et -or mer -nascar throwback -nar dw -mong kok -minic ab -megach urch -master minded -livefor music -lauren pope -kellyand michael -jay nes -ip aul -interven tionist -icab nf -ho ggs -hiday at -heart gold -harri ett -hand crafted -girl slikeus -ge ty -gastro pod -gall icabnf -fu quay -er red -elo dge -eg mond -def ile -day sleft -dat at -cre scents -coy m -columbi ans -cent eno -car acha -bur khal -br rrrrr -bf goodrich -beauty fromitaly -ban dol -antmanandthe wasp -ag os -ab han -ðŁĸķ ðŁı» -ðŁĵº @ -è ¯ -âĺĶï¸ı âĺĶï¸ı -z army -woking fc -wink worth -we wontstop -watt ack -vfl wolfsburg -twist cone -tusk en -trap door -tha ana -swag g -sti ffs -speed ily -speak ing -sak is -ro hm -red pill -ra um -r sac -r pf -pu f -per fs -over confident -ning ton -nin comp -netflix india -nas u -mura bi -monoli ths -mon to -mo hn -mi zen -map monday -man gement -le derman -kear sarge -kam ps -jam ir -in ni -hun di -hon tiveros -hetero sexuality -guid i -gor ga -gol fuk -godzill amovie -gavin free -gateway pundit -free zing -finola hughes -fer um -explo rey -ess sss -el ft -ec ca -don agh -del arosa -defaul ted -de fac -buil tto -bu sines -brown out -blue jacket -black house -ber nies -ar ango -aqu af -anti gens -al pin -ak agi -absol ve -aben omics -ab dalla -ðŁıĨðŁıĨðŁıĨðŁıĨ ðŁıĨðŁıĨðŁıĨðŁıĨ -ãĥ³ãĥ ī -wyn ne -whomademy clothes -westworld hbo -we ct -wakaflock absm -wa a -w cac -vie jas -u hb -ti ri -ten afly -spy ker -slu gged -san frecce -sam eness -s zu -s ition -ro my -rat chaburi -ram bin -rach et -pul led -prote ase -po temkin -photo synthetic -pal imp -nr tnews -non tario -net worth -mo dica -me withoutyou -manekagandhi bjp -li ph -ler and -l sw -kryp tonian -key tnc -jor ma -jobless ness -ir reconcil -hin shaw -fleish man -event management -es bjerg -equal ising -easter ns -du bia -discu ssant -colai ste -clec linic -choice scifit -boot leg -biltmore estate -be eco -bark ada -ar ou -al aki -akim bo -ad omin -_ (: -wren n -world tbday -woo ding -winter park -u mana -twel vyy -to phat -tdam erit -t jp -stra in -so is -sel iger -sal in -reli ent -refu ting -pur ch -pu rex -pre teens -poly chro -pet sathome -oo dle -olivi ach -nistel rooy -mul lane -mon tini -moham ud -mir u -medic alassn -mcham mer -mc cly -man mohan -linke ddata -leth ality -legal news -kwi atkowski -kir ks -kim ye -kerry jane -k Åį -jor ger -jk rowling -j muk -iri dium -intersec ts -inlan dempire -infl icts -humanright s -hr k -head masters -harris jofficial -ha sak -gre ased -grass fire -grain free -gonz ag -gian luigi -future offood -fri ende -fran ch -for mas -fem icide -fa wn -err orist -encro ached -ea z -dom an -defi ance -compos itor -clar kes -chan yeol -car line -bre ss -blablac ar -bl dg -beat en -bam bang -aquari um -amer medicalassn -alge meiner -al gé -after words -ach ile -ac ic -zero ing -zay at -whit te -wb sc -tyrone gaalive -the source -strip tease -singh e -si i -shu sterman -shay carl -sa thi -reni shaw -re tto -rack mount -q rl -pray formh -pos ites -pork pie -phoe bus -pav lovic -ozz fest -out sized -orom octo -notin this -neu berger -mun k -mississipp ian -meg acity -mat um -masculin ities -le vens -la sko -kl ick -kirk cud -kar men -k auto -jodre ll -j michael -it showbiz -independ ant -incar n -ic v -hondac enter -handsom eness -guru official -gott lieb -gold member -go west -fron trow -fle isher -far uk -fabri que -excu se -ef dn -eck man -dalla stown -d hau -cu ed -childrenof syria -ch l -ca sti -bur chett -bu cees -boge yman -bl w -ber inger -belitt ling -bar ti -ay le -av owed -asi mb -art ful -ao ta -ample forth -am eland -ðŁĻĭ âĢįâĻĤï¸ı -ðŁĮ¸ ðŁĮº -ìĬ¤ íĥĢ -åı į -zom ato -yarmul ke -wx yv -wen onah -wang anui -veng aboys -vegan recipes -vau dev -ultr alive -trot sky -than ka -sun deep -summerhall ery -split svilla -sp uri -slo v -scri bbly -sau rashtra -roger moore -rel ented -reinde ers -rand ers -promo tor -pre calculus -power wall -pi ot -phy salis -phy lum -pet ch -peel policemedia -orgre ave -or rell -op ress -ob elix -n ho -mon net -mi yan -maj er -mafi keng -lon abscbn -li mped -la e -kou libaly -knowledg able -ki pping -ki me -just y -jonathan rhysme -jo gged -inter ac -imper iled -hugh hefner -ho soi -han key -finger lakes -fav pic -fart lek -epil ator -enth iran -en ext -effici ents -edinburgh rugby -dog days -defin ing -de simone -de mario -david hogg -da ou -cr z -col mc -co quet -c sea -bol an -blue jackets -bipolar disorder -bhand ara -bbc motd -as are -ari ste -allegori thmic -ah ir -afi q -ðŁĽ ij -ðŁĺı " -ðŁİīðŁİĪ ðŁİĤ -ðŁİģ ðŁİģ -ðŁĮİ . -zi kr -web masters -up show -ton ko -title ix -tim bered -thor naby -te acup -sydney siege -stroo tman -stri py -shol ing -sho lidays -ru ang -roy g -rockab ye -re wind -ram zy -pots damer -polymer clay -poin tuk -photo bomber -philadelphi ans -palae onto -nar anjo -mysti kal -mtn za -mosco u -mo do -mis spellings -min new -mar son -magister ial -mag yar -mafal da -lew drp -lei per -lav ash -la follette -kno kke -kinna ird -ja res -in and -i roc -hos le -hepatitis day -gg r -gather ing -flat woods -ev eline -en close -elek tron -ele x -e ales -drown ings -dr c -dilu ting -dhanan jay -den ner -del ario -deer hoof -ctv news -cms gov -cer c -carin thia -bun ching -bu zan -br ong -bouy gues -bles sup -betsy devos -be here -aú paatleti -axi om -attemp loyee -ati p -assassin ating -alter nacomics -aacpsa wesome -ðŁijĮðŁı¼ # -ðŁ¥ ĵ -âļ Ķ -ª ¨ -witt mann -will erton -west land -tn rs -than ior -terri o -ta hira -swisso tel -swer ve -sw ir -subhash ree -stro ther -stain er -st res -sn cc -sli b -sk orea -sil kie -san toni -red wing -re packing -rabin dra -quar rying -ps ico -proto col -pre yed -pin kri -ny ac -nether world -ner ys -ne ca -monclo va -mau ger -mal functions -makh doom -ma him -kud la -kaz ee -journ alist -jing ling -jeal ou -jack daws -itson ly -invigil ator -insecure hbo -hugg able -hans berry -h nurburgring -gy ne -gun dogan -gour lay -gods word -gi al -gerry adam -geek ery -gay lord -fun fest -four fold -fore gone -focu sses -flor ham -fl ict -east cote -e ska -devo ir -def i -def alco -dar on -dam pers -cl ace -cham akh -bos na -boo kert -be sharam -bat roun -b eller -att il -asse tto -antin ori -animal art -anc inema -alien day -." ( -åIJ ī -âĶ ĵ -wen ner -weather by -v sr -tur nitin -the gop -tai bbi -so ddy -si mak -si busi -schi avo -samp son -ro ky -relapse records -r bn -q ais -pul py -pin ce -pil ani -phosphor ylation -perig ord -pa ano -nor quay -nkc schools -nh sc -movi star -mon ge -min ie -micro sco -mer lins -medi anews -mangi one -mand rill -ma demo -m kr -llanish en -lec tio -la sher -kre uz -kho on -jon ois -jar no -jamie bower -injec tion -ho sie -ho die -hig son -hi sto -happiness day -gold thwait -gi jinka -gen c -fire star -fin ovate -es at -encephal omyelitis -dy or -discover yed -dibru garh -de souza -de aring -dat alo -commit te -comedy bangbang -chu ppah -chan gi -cactu ses -broad us -boyce avenue -bhi ma -based learning -ay aki -as key -art scenter -apocaly pto -amer acad -ac ce -ab nett -ðŁĴŁ ðŁĴŁ -é ¡ -Ø´ ÙĨ -x rs -wa vered -vi gnes -ve ering -vault festival -vaul ters -vant age -unity assetstore -triti um -tri gla -to kara -terri bly -teamgod vek -tapp en -surreal art -ston ie -so cent -sm sc -sin spire -sidd hant -shiva ji -shan mugam -sexual violence -see us -satchat wc -sarab hai -ru men -rach na -pot n -parmen tier -on stad -nyc ballet -nico lear -mun ter -mon ate -mobile gaming -milk tea -mc memorialcup -mc dormand -mark wahlberg -li muru -ko ker -kirri billi -kh da -juli es -jig gs -jarls berg -jag ran -it support -insi eme -hy i -humanitarian day -houseoff raser -hor bury -hom ie -hilli ard -gur uk -gum shoe -gladi us -g fw -fl and -fast codesign -entertainment news -donate blood -desp ues -de wing -daz ed -da pet -cri sco -cee fax -car mo -buffo ons -bletch leypark -bell shill -be ssa -be mel -bbc glos -bag shot -aw rites -autom ates -aug ment -amate uri -a iche -ðŁĺį âĻ¥ï¸ı -ðŁĺĤðŁĺĤ âĿ¤ï¸ı -ðŁ¤· ðŁı»âĢįâĻĤï¸ı -íķ´ ìļĶ -z j -yaqu ina -wiki art -whit er -whis ks -vuvu zela -van ities -tyre ke -the dar -tam ura -suppor tall -star rcade -stan ek -skam france -shiv ay -shi ed -sa chiko -rural health -rim pac -real jeff -ranveer brar -pul u -proudtobeafan of -play book -o sullivan -numb ed -nostro mo -nor rell -nas anewh -nasanewh orizons -naco tweets -naaper usur -mo hua -mc whorter -mc cants -ma ung -ls st -lmfa ooooooo -life sci -le stari -le bon -lau de -la gav -l rv -katsu ya -inund ation -internationaldayof yoga -incorri gible -impregn ate -impe y -il icious -horo vitz -home ofthe -hol beach -hirsu te -gra dle -glaxosmith kline -giorgio armani -fuji xt -fro sch -febru ary -everysimpson sever -est ad -ea ve -e isa -du rocher -du er -dil ley -ddot dc -day at -charlam agne -bob saget -billiejean king -beau sallnatural -be uk -bbc sp -aspe aks -anneli ese -ðŁĻĮ ðŁĶ¥ -ðŁİī ðŁĻĮ -ðŁİ ĸ -yon ah -yo jna -yash want -x ula -wo sa -wing less -wi zzy -vennel akishore -usas oftball -under achievers -tro gir -the journal -ter nate -tb x -super position -straightoutt acompton -stein le -sr na -south bridge -smallyoutuber army -sm be -simon mayo -sie mian -sentiment ality -run yan -pro chain -pot ch -pine tree -pa che -oh sas -ober ts -nipp on -nh n -mil nes -mehl dau -medic in -mc shay -maje wski -liannela havas -las ry -la gom -karachi kings -jun agadh -ju kka -jas o -j of -high tech -hear ttour -grey hawk -green sleeves -go hounds -get money -gee zy -fonten ot -flag bearer -est our -e wer -dor é -disillusion ment -de clin -craco via -con lin -clai rol -cine matics -char pen -c shl -bi pedal -bha jan -bere an -ber ghe -bent ong -audi q -allstar weekend -algonquin colleg -ad our -acupunc turist -acqu its -ac ast -? '' -+ % -! ðŁĴ¯ -ðŁĴĹ ðŁĴķ -ðŁĴķ âĿ¤ -ðŁijıðŁijı ðŁijıðŁijıðŁijıðŁijı -ðŁ§ ¬ -æ Į -zab ka -ware heim -wad desdon -val aafshar -un fashionable -toll cross -tizi ano -the kla -thai airways -star talk -special k -so kc -sivak or -ru ched -ron killings -ron coni -renmin bi -relent less -regal films -ramblers gb -px g -ps yop -po tra -octo bre -nikki glaser -nightri ses -ni pa -news ers -nee pawa -nct zens -nationaldrink wineday -national service -nap ed -n bam -my body -mor oso -mo su -mine iro -mdc pss -may te -marsh y -mar ya -mani fen -malay ali -mag ruder -lauren gottlieb -ku bu -ku ang -keto genic -kerryjane ellis -kemp f -inter linked -i faw -i asp -hosp s -honor is -healthis wealth -ham asaki -gri sha -gre ste -gn itive -gais ano -furi ends -fem to -fal c -ero space -em pa -ef fusion -dj am -dis orienting -delici as -cringe worthy -cordi als -commun ities -col ucci -co ble -cloakand dagger -catal un -can ai -bur ges -brill antes -bode ans -ber nou -bally bunion -atl super -app ia -and han -al awi -air speed -ab ang -a ot -... ðŁijĢ -) ..... -ðŁijĮðŁı» ðŁijĮðŁı»ðŁijĮðŁı» -ðŁ¤Ķ ? -ðŁ¤£ ) -ëī´ìĿ´ ìĬ¤íĬ¸ -âĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸ ĤâĸĤâĸĤâĸĤâĸ -y up -wwe braywyatt -ver ite -uta pri -underpin nings -un mounted -un approved -umass amherst -u lukaku -trail cam -thun ger -thu raya -theart stack -the space -stream team -stratfor duponavon -sta stny -sp ts -soo oon -snack time -shep shed -sas son -sand bank -sab miller -sa char -romel ulukaku -ritu par -rhe l -rex ona -resent ful -receptac les -rece ssions -rav nica -radi ob -press box -portu gese -pen alize -pear sons -park jihoon -nou wen -nic las -neuro modulation -naz i -men n -magdal en -ma sur -loz enges -l pie -kut less -jungy onghwa -jim ena -jan usz -hex acopter -han zi -gat ley -fri gg -f xi -exclu sionary -engar cia -drum mond -dim mak -cool sculpting -con cent -cl wb -chat roulette -centr is -bull ough -body powerexpo -bertol t -b live -auber jonois -are yes -akl transport -ac chio -ab end -.. !!!! -za hawi -z nick -ym t -y rt -wout ers -wo ven -wind surfer -wgtn phoenixfc -we suppor -wad ley -w sop -vandy football -ust angs -ty lo -tu lan -tor ic -the ye -super loud -stu cker -sk ick -shibain u -sheff trees -sh abad -semi precious -seduc es -saf aree -rw by -roche ment -red house -red beard -re sen -rayu du -rat an -rapp rochement -pure gym -pic tu -phil pot -ott en -onthe edge -ne wel -milit aries -mhu ire -me son -mci vor -less ened -kit to -keep moving -jo ye -jerobo am -je tter -hoo sick -homoe opathy -ho pa -harsh ness -happ il -fren chs -floun ders -fen nelly -facilities management -fa ired -elo isa -ek du -dj d -diss enters -delux e -de classify -de ac -daw ber -dav itt -cru dup -confor ama -competen cia -circum stantial -cat sand -bun di -bt x -bar clays -ay ame -ar lie -am soil -ado ts -aber tillery -. ?? -ðŁİ ĸï¸ı -âļ½ï¸ıâļ½ï¸ı âļ½ï¸ıâļ½ï¸ı -wel z -weather head -w vs -vener acion -tv ds -transm its -tom keene -the observer -stand together -sojour ners -snar ky -silver sun -si ssies -sci pio -schut te -rmt union -re ik -pro camps -pride to -plan ahead -pixi elott -owen thal -ome tal -no cks -music box -min esq -mex i -mcqu illan -mar teen -man gga -land man -kpop snaps -kang as -kam merer -jind abyne -j jk -j hah -inter dimensional -inter changes -hull fcofficial -hu sson -hein richs -ha aland -h way -gerryadam ssf -georgemason u -gal ert -fu ka -flex ors -exo du -esco ffier -ed gel -econ oline -e hime -del ux -deepa wali -de shields -dac orum -cu bat -cu bam -cron us -const ants -con ard -cleveland dotcom -child care -char ron -capit oline -c car -bustar hymes -brow nuk -bre lla -bo din -biop olym -beau ford -bare ly -as cari -ar aka -american apparel -ah sn -a strian -.. - -ðŁĺĤ ðŁĺĿ -çļ Ħ -âĻ¡âĻ¡ âĻ¡âĻ¡âĻ¡ -wav y -vermon ters -time frames -thaana aser -sylvester turner -sol vency -si ano -shekhar ravjiani -ser hant -save shefftrees -sar chives -repet itions -rain ing -quinceañ era -profe sor -power on -pollu ter -pl ani -pass é -par cell -palatin ate -op rah -on on -olivi ap -o et -non believers -no jhl -new aygo -n sl -mtvlakpop got -mark ham -leon sis -lake man -ken fig -ke ong -kab ale -jodi stamaria -jen shad -jam bu -j nu -ise tta -irr fank -ic p -i wu -huis genoot -home is -gr anta -gal livan -ga iter -fu med -fried le -flu ffer -fi ps -feu ding -epic ally -eh x -di elle -cle on -ci one -cer mak -cast ate -cann avale -cambr ils -cal ley -c th -boo oo -bi focals -bha u -bent grass -barnar do -barn burner -at os -as scher -ar oh -ðŁĺİ ð٤ĺ -ðŁĵ± ðŁĴ» -ë°ķ ë³´ -æ ¡ -âŀ ³ -whis kered -vidy abalan -ver ity -traf fik -temb isa -team liquid -swe tha -sty led -stomach ache -shor tt -seren ely -seis mology -sec ted -reve aled -receiv ables -re decoration -ra heny -q trs -pp ers -pos its -pneumo coccal -pinkie pie -phoenix open -people mover -pan th -ou ar -or ana -nu evo -ne afl -mon eda -modular ity -moderni sts -mlb tonight -min ers -loo ds -lizziec undy -kov ach -kon tos -kess ler -k for -jo ffre -ishi hara -isaiah mustafa -ho chman -here fordfc -hell gate -haunted mansion -half life -guil den -fly back -e euu -dumb ell -duc al -drop dead -dan ilo -customiz ations -cottag elife -compre ssive -chan an -ch ena -cancer society -bren ton -blogo sphere -ben ford -ban aue -avo y -as inger -as coli -angh arad -alti plano -aaaaaaaa aa -yoshin ori -wid mark -wal kar -vincent kompany -vie tti -tumul t -tru ett -tonight alive -them self -the dogs -th wnd -tantal us -tag team -summer town -sum mere -stu tter -stra fe -sot we -sha f -sc roller -samu sic -ru do -ross ington -preemp tively -po chard -pe rel -pat en -om ak -nathank ress -nak as -mur rah -mul u -more x -mer ited -men the -mega world -may as -m guggenheim -lur ked -ken mare -ich ri -home port -hol burne -histor ias -hill brow -hidden gem -gre c -gallifre yan -foto friday -flu vanna -f we -ev asi -equ alize -en rages -emp tor -die ben -den ko -cu tty -co efficients -chak u -cazeno via -by products -bro kering -bi vins -bhar ucha -bar coding -baller ini -aren berg -anas azi -aj yothi -acet ylene -è¡ Į -âľ © -yaf ai -wy omissing -world club -world chocolateday -wh impering -web kit -uc cia -swal ec -sw k -stylist ics -stream liner -snap chatted -ske en -sig na -sh ya -see man -sange et -san ne -sal oni -safety month -s din -ritu alistic -ri fic -resi dente -record z -p dvsa -oddi see -now live -mis calculation -mian wali -megan hilty -mck illop -mcel henney -mayor ga -lovemy team -lang ridge -l jn -kos ice -kooten ay -komo traffic -kim cattrall -jimmy butler -jay y -italy magazine -instit ut -inau sp -hel ias -hasak ah -halla bol -gr illi -gabri els -fur ball -fran e -fo ti -fl sa -fbr party -fay e -east man -e esti -drizz ling -deci mating -congratul ation -co axing -chin ch -boho style -berry z -ben rector -bar ware -awar ness -awaken ing -am ruta -alle man -al enka -agron omic -( ** -ðĿĹĶ ðĿĹ -ब à¤ļ -zo sia -you decide -wpu gamers -winter set -wil kinson -wiki mania -vs fs -velvel holler -umn proud -tyler florence -to dai -thu izen -ten chi -stun a -shat in -sham schar -shamschar ania -se ele -sc ald -sam bailey -ru iter -rep tom -ra ud -pro veit -plo sive -pilip inas -paul rabil -parisi ans -os waldo -omgits alia -ney ville -new haven -neveren ding -mouth bass -milk maid -mesopotam ian -matth au -madefur you -lon dinium -lead with -kxip v -kokop elli -kne ecap -kis ar -jonathanrhysme yers -janis joplin -indian town -hou ri -hop ton -he mos -gu sted -green mount -grand designs -goss ard -gi all -fur nas -four ze -en gen -ec amp -dynamic duo -delauren tiis -cin ci -chel le -car idad -candle wood -broward schools -br wanda -bir rell -beep beep -beck ton -aver ill -alway son -afric ain -a ask -âģ ± -za jac -wor zel -wood vale -wash er -wall ander -w no -vor tices -vit to -un naturally -u shing -tutu tuesday -toronto life -tor ana -to gas -th ér -testu do -team up -st pats -serrat os -sch oten -santu ario -sa pping -ro eg -queen at -pu rer -prize fighter -pop fest -pocket ful -pc cc -ori hime -o shin -ninten dogs -niel sen -nardw uar -n bak -moul ting -more ish -mary beard -ma vi -lo bbed -kle pper -iron workers -intelligen cer -ice berg -ic lub -hor crux -hee ley -har uto -h tr -got ts -gine tte -fero ze -er isa -efan art -cor a -color fabb -co dered -cleck heaton -cater ing -cal casi -c mmi -bull fight -belle isle -bbc sport -ay uda -arrhyth mias -ani morphs -angel alessandra -an gre -ðŁĮ¶ ï¸ı -âĸ ¹ -will you -weiz en -vul va -vor st -visit zimbabwe -un taxed -un intelligent -tri est -ti bby -the butcher -t pusa -sun rays -step sister -sr ly -slu ggers -sheffield shield -sham ma -rif fo -ric es -relocate revolution -reig nit -rain iest -queen ston -por denone -out é -out ta -ob jets -no co -ni ii -neuro transmitters -nak ak -mu zy -midwive srcm -me shell -may ank -maru thi -luc is -loven otts -loren z -laparo scopy -l ld -keeping people -kakao talk -in ria -i ig -hyundai india -hu sa -happy ending -hand hygiene -ham ner -gro ssi -glutam ate -germani um -farm lands -er mita -ear ning -du ppy -dra ken -doom sday -die guito -df wairport -dekal b -damian mcginty -d zi -cu erockstar -crevas se -chloelu kasiak -chis ago -charlotten c -c pre -bossho g -bla kk -belo tti -bad agry -aver ting -arcol atheatre -$ : -ðŁij ļ -ãħĭãħĭãħĭãħĭ ãħĭãħĭ -âĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸĤâĸ ĤâĸĤ -yoko yama -xper ts -wend ouree -weaver ville -walk throughs -w mr -tu ke -tro yal -tid worth -tate modern -tal agang -tai ze -sze wski -sutton united -subhashree sotwe -stere olab -spe ared -simon kids -seap lanes -sav illage -sand ell -roman cer -rink u -rang eland -ran jha -ra ylan -public domain -pre ste -po sca -pesc ado -ol mec -offici ali -ny onya -national hugday -muffu letta -morphe tt -mo rel -me gad -makey makey -ko belco -kno ebels -klgand hoda -kil t -john barrowman -jc ps -international airport -himansh kohli -gro e -gou ged -georgi eva -ge te -gar ao -gan ado -fitz gerald -fis ica -essenti alism -er yan -enshr inement -ejec tor -dwan imation -cute dogs -char med -ce in -capitol records -cab u -blo emen -bi monthly -ber gan -bench ley -beau doin -bas sil -bab ay -antiqu ec -all eries -ali ko -# & -! ; -à§ Ģ -x cp -women sempowerment -wi right -wheel sup -w pn -vre tta -vic hy -utter most -tho li -th our -ter nan -sublimin ally -spi eler -ser fs -schn app -rü gen -run ge -ru bis -ru bicon -ro bards -qu oll -ox ys -op hir -on health -of india -obliter ates -neuro pathic -n achi -muk tbharat -modi fiers -long shore -lak shad -israel in -in zam -il as -iam don -homes ite -gg b -ge va -g ptw -g lon -ferr at -feel ers -fanta stics -fam u -excruci atingly -el ain -e tri -dir ham -di bba -deploy able -conveni ences -ci fera -catamar ans -camp ina -bundes bank -bu cyrus -brae burn -blue steel -bill ys -bi kram -belvo ir -be aded -band ung -arnol fini -arbu th -ar salan -adi vasi -a open -Ŀ ¼ -ðĿIJ Ģ -Ï Ī -zone quotes -zephyr hills -wam pano -vodafone uk -varun kapoor -v op -v br -thin ker -thi phop -theroo kie -su mm -stick le -sti fel -squ ally -skil let -sc wc -s weekend -rush moor -regre tfully -pl eni -pick pockets -pap ilio -op u -nicek icks -ne hisi -nath ist -nar in -music blog -mr police -mon ette -mo che -mis reading -mick ael -men schen -me res -me please -manifen cours -man olas -mal us -maj ura -ma kwana -lions den -libe rec -lali bela -josh widdicombe -insi pid -hedon ist -hammar by -ha fan -gus set -gott schalk -gianluigi buffon -fy ffe -friday feelings -forest ville -fi jir -exo somes -euro sceptic -et cc -encapsul ating -en circling -en circle -ed ita -dri shti -deduc tive -damp ness -cu ta -craigie burn -cover let -cov campus -cor usc -con found -co oma -chest nut -che ban -car bery -byl sma -broad meadow -bea vers -bal ita -as ÃŃ -april dryan -app end -anthuri um -anit a -anci e -afi f -adv an -ðŁİĪðŁİĪ ðŁİĪðŁİĪ -è Ķ -x pla -workers comp -we at -v th -ultra verse -ul tran -traff ics -ton sil -ter ton -ter sedia -te gna -supp lier -su tch -sound ings -ser g -scre wy -sau ction -sand men -sac ad -red land -ra azi -pun ted -plastic waste -pig gie -phys is -perfor ation -para ñ -oti des -on thill -ol bia -ob es -no ori -nbs morningbreeze -my city -multim illionaire -mor ry -mo yers -mis sd -marni go -man nat -maku hari -ma bon -lin ski -less ening -ler wick -lear t -le ib -lao ag -kim mo -kar lin -kar ch -jag gesh -is op -icec ap -ic ds -i wish -hur dlers -help to -hau ghty -har mattan -grand slam -go sta -gland ular -gill er -gha foor -ge es -gal lic -future tech -fuller ton -fred perry -far rel -fair price -fa rel -e ades -dray cott -don tb -do sent -del aha -de aley -d ile -cre ated -cc news -cather in -bien ville -bel tsville -arizon awildcats -are valo -anishin abe -anari vo -ah rc -abe shinzo -ðŁį¿ ðŁį¿ -ëī´ìĿ´ìĬ¤íĬ¸ w -âī « -z ent -wear iness -venu gopal -vay ner -v q -tr ine -ton yo -to life -teres ita -summ iting -stro jans -sto ther -spor a -spoil age -speci alt -solom un -sn andani -sexualas sault -sen ig -sand ile -sam ani -s doitbetter -ribble sdale -raima sen -quim per -pre te -pra shad -pi atti -pare jas -pa hs -p anni -offro ad -o low -n kurunziza -mol ony -moham madi -miniature painting -matchbox twenty -man ofthe -levit z -lawand order -la burnum -l lyn -ke ttes -justine greening -ju dt -jmuk mrpolice -incur ring -i stan -i ren -house kinok -housat onic -hase be -happy yy -hammer fall -ham ont -guitar world -good body -go sn -f summit -et f -enthr all -em j -can ned -camer at -burkhal ter -bottom line -betsey johnson -ber kel -ben gu -basset law -bare si -art aud -anitaha snandani -alph ons -Ï ĥ -z eck -wire land -visit pembs -vi dar -valtell ina -v ti -train your -the kk -te ign -sto dden -smi dge -sinn fein -scre wattack -sci eng -schur z -ru x -rou l -remy ma -remo test -re awakening -py per -promote gamers -poli an -plough s -pi eper -patty sday -orang ina -on erous -okc fox -ngo c -music month -mid t -malaysia airlines -m enger -lord mayor -kil le -jelly roll -is worthit -ira ge -indian airforce -in tune -ikh wan -iam not -group board -gal eri -g tr -force friday -fiber optic -fast forward -far hadi -eti ka -equ aling -energe tically -e ship -dra kkar -deton ator -dain ik -d ps -cli me -christop er -che mb -chad mmurray -ch ite -cau da -c kel -bu land -breck land -bouton niere -benz ino -ben er -aval or -au tuni -attribu ting -at illa -ask men -aq eel -ap ri -ðŁı ķ -yas uda -wy lam -wa sit -vitali k -vitalik buterin -undÃŃ acomohoy -un iti -uc cs -tre yanasta -tol ong -to self -the c -sussex ccc -spr at -shin kai -sheffhallam uni -ru cks -ro eder -ri kka -r ti -qui ros -profit erole -pony tails -player pic -pitch side -phantasmag oria -pab los -ol dier -nic liffe -ni giri -min im -met zler -mesab oogie -men z -me hul -m wl -loo sed -llew yn -ki at -kei bler -kav in -imagine er -hul led -graham cassidy -gra sps -fro wns -flam beau -dn q -denver comiccon -de gradable -cow lick -corner shop -cornel west -collecti vism -clar as -cau ca -carre tera -car ril -bledis loe -bc am -barneys ny -b ator -au h -antan anarivo -alta vista -ali um -aggies alltheway -ag gers -ðĿIJ Ń -éĥ İ -⾨ ðŁĴĽ -wo erner -tune in -trinity laban -tra ina -therapy dog -thel ake -suble ase -strat ot -soci ol -sel fs -seger strom -rel ine -reb or -rani er -q ayy -pla yed -or la -o dissi -na sib -n sb -n mo -mubad ala -micro climate -micro burst -mercedesbenz uk -maj ella -lu chas -live band -lite speed -lin iers -liev re -lewi stown -lee v -laurel wood -lap wings -ku kui -ku ki -kri pp -kapoor fc -jamesmartin chef -jad in -inthe styleuk -imit ations -hakk asan -h df -follow back -faiz abad -fair child -f pd -elen nox -ei dul -eag ency -devol ver -dess au -day quil -dar ks -d pn -cou lier -cor io -comicbook art -cla use -chi marathon -cfe vs -buck fast -bu bb -bonni emc -bel fa -bar g -baek hyunday -ba best -azure stack -ar amex -aqui legia -angui shed -amas sacre -allot ment -a wor -@ _@ -ðŁĩºðŁĩ ² -ãħłãħłãħłãħł ãħł -ÄŁ rul -zaf ira -z aun -vandal ising -v ls -ur tic -un sociable -tu ti -tren cher -tra w -to create -teen ag -teacher toolkit -tan tric -sur yan -super speed -stur rock -stirling shire -stat ton -st ach -so ley -say ur -sau cier -road warriors -ro ci -ring central -property brothers -por os -poland ball -play making -pal vin -paintin goftheday -op tically -only thebest -next wave -nc bs -middle field -mat cher -man love -leonard cohen -lah ren -kne aded -kak enews -k undera -jodrell bank -j jackson -hypoten sion -hor ween -ho teles -herop anti -herald sunsport -guardra ils -gu ren -ger rans -em rata -em elia -du ffey -drivel ine -disc ards -dic ho -den izen -daylightsaving time -co iffe -cav olleyball -cal ved -bring erof -at aste -art sci -ani xon -ak d -agit ators -ac clamation -ìŀ ¬ë² -~ ( -wz tv -wr c -wordof theweek -war iow -wariow are -walla pop -vit ello -usp id -un dial -u eg -ty cho -trade offs -tele marketers -sun apee -stephaniej block -siddhar th -satisf yingly -sab ine -s story -rodi mus -re villa -re valuation -re her -pru eba -play ability -plac ido -neg ates -naxos records -nat ori -my family -mountain day -ml ml -mar va -macmillan coffee -lu sion -lely stad -kor b -kirch hoff -kc g -joy ner -jar at -jam bon -hes ston -grand standing -gotit free -gal ati -gain ful -g lynn -fi end -eter nals -e avis -drinking water -dran kin -dean winchester -dam ac -d workin -clio awards -chem all -car ver -capsu le -budd le -bru st -bra ven -bli x -bigbang fair -bab a -at ol -ap am -amu lets -alexand rite -al vey -ag ran -ac com -a different -< \ -ðŁĺı âĿ¤ï¸ı -ðŁĹ º -ðŁ¥ IJ -éĺ ² -é ad -zul lo -zeno bia -young dolph -ww ba -wr ittle -wp fd -webcomic chat -w ml -vec chia -un affiliated -tu mis -timm erman -teeling whiskey -team nosleep -ta urine -t magazine -spo st -sock council -sher burne -she imer -semi pro -santur ce -san chi -rul lah -pw ds -product management -pre fixes -phil o -nur selife -nt midlands -nike fuel -nascar on -nam al -mustang pride -mis managed -memor ie -ma say -ma den -llangef ni -legal ising -le moine -ko ike -kear n -kam ari -ju stu -joshu ak -it ap -inter serve -integr ale -ic key -i ex -hou ruk -har peth -har di -green infrastructure -goo finess -gand i -gam gee -fent ress -fact book -esk il -enh ancers -el eni -dun elm -dun boyne -direc te -delhi metro -del fina -com mbank -camof lauge -ca reca -book post -back up -art contemporain -agame of -ðŁĺı ) -ðŁĴļ ðŁįĢ -ðŁĴª ðŁı¿ -ðĿĹ² ðĿĹ -ze ek -z emo -yu an -youth soccer -yeg bike -x bond -woodro ffe -water safety -watch party -wakati pu -vv vvvv -vitri fied -trache al -stre es -stay lifted -sky ped -scare lli -reyn olds -ram navami -powder horn -pin wheels -pi qué -pearldrum corp -op hilia -ol loc -neck lines -n so -mun ya -mono pod -mo ster -megar an -lu si -look good -libra irie -latin os -lang tree -lal ah -la iney -kre jci -kh ary -jointe am -jo enichols -jason wu -hou l -hir anandani -hillsborough sch -happy feet -guar antor -gro sz -g sas -fresco s -fl ann -feudal ism -er mey -eich mann -eco tricity -earl swood -dog z -di mash -defaul ting -dc as -dal ma -cr ts -cor dis -comer ford -clu mping -clu blondon -chal u -ch ira -brocken hurst -bot to -bir thr -believe inthe -ban hart -b iller -az im -ay ako -as som -ar bi -andre ali -an asu -alver nia -aby dos ->>>> >>>>>> -ðŁĶ į -âĿ¤ï¸ı ðŁĺĬ -Ì · -yt ff -yi fei -woman shour -v bm -u ld -tuber ose -tory lanez -ti ums -tear fully -tal ky -sur plice -suk anya -spi on -space opera -snow plows -skip bayless -sk night -se sa -schick en -sar on -sand on -safter dark -s enders -ru stan -royg biv -ro tem -riot into -quirk iness -per vy -pat ay -par oles -par mer -omur ice -officiale fcc -national walking -nar ra -moon man -mo dders -megam ind -mcgru der -mar len -main ichi -m sta -love trump -le wes -kur anda -ku cko -kie sel -kair o -judge dredd -john s -jessicam au -je eva -j ado -ir regularly -ico sa -hu ra -hoste tler -gunder sen -g isa -fly saa -fin et -face painting -fa intest -enal davies -ek wo -damo daran -croque mb -cri enaldavies -ching lish -cab arca -bridg man -bon trager -at tia -ash tan -ar aku -ancien thistory -am my -ðŁĺľ ðŁĺį -ðŁĩ± ðŁĩº -íĪ ¬ë -é ¤ -Ùħ ØŃÙħد -y acob -working dog -weare x -vo ig -vinny guadagnino -vi vas -uro pean -the mandymoore -the human -the goat -the dcuniverse -tandu ay -stanford fball -someonet ell -sof tg -smo ore -sit aram -shar mony -sf x -sen al -seeyour city -schu ll -ricar doro -re xx -rail er -r caniglia -q opa -pis ser -pawn stars -pasi apac -ong p -o yo -nulli fied -non proliferation -mer rin -med ora -mari as -manife stos -man vel -majer us -ksh mr -khan h -ke unsuk -kat ery -k oury -jhun jhun -jay ma -hydraul ic -hr b -hend rix -gra bar -gn omon -globalgoal sun -german o -gab bie -g lim -fu le -food science -fl ensburg -fissu res -fire bug -die back -de wy -d illian -cor son -chee ba -cap tured -c sj -bush ings -bri ster -boston police -bole da -big sur -bel ah -bag ani -aver i -ated r -afilm fest -ab dur -ab assett -!! .... -ðŁĺ« ðŁĺŃ -ì§Ģ ì§Ħ -âĸĶâĸĶ âĸĶâĸĶ -د Ø© -® ï¸ı -y lon -wy p -white mud -water fall -volvo trucksuk -vo glio -vill alba -ven o -un sanctioned -u fi -u angel -the frog -swim mer -stage play -sport shall -sp angle -sie bel -shop ify -shar nab -selfa wareness -see is -sch ind -rs spirit -roswell park -rippaul walker -ren z -recor k -raw le -pray ing -poly amide -phar ah -par ation -p xp -on dra -oji bway -nov ick -mun ck -moy se -misty onpointe -militi amen -mikk eller -megac ities -mb am -ma sco -lu bb -long day -log mein -let seat -laur ale -la wang -kom bu -kill monger -kellie pickler -kee ble -kawas aki -k urs -k orie -james x -indra jith -imperson ated -hl ntv -han jin -goo drem -go win -gla sson -eve rette -ev ast -et is -ele fant -ela ing -effe minate -e ines -e bert -duck and -drum condra -dr ar -dif ford -den ison -deflec tor -cul to -creative commons -cityof tampa -bu chen -broad wood -brew ton -bra yan -bla x -bell ville -base men -at ops -ar gi -amstel veen -am ts -ðŁij¸ ðŁı¾ -ðŁİ¶ðŁİ¶ ðŁİ¶ðŁİ¶ -ðŁĮ´ ðŁĮĬ -⾨ ðŁĴľ -young victheatre -yal emed -vet triano -v us -undere mployed -tom blin -to love -tld sblearns -the kapilsharmashow -stu ta -sti ft -ste ss -ste at -stand by -splat t -spe ace -social studies -so est -snow y -skul ly -sing ling -sin india -sin h -sig er -sien kiewicz -sau mur -saf o -roam ing -ro das -ric er -rath bun -pt fc -pra th -patrimon io -our club -ot bc -onthisdatein hiphop -nove lette -nish at -nicol ls -ne ph -morg fair -man na -lo vel -li ggins -kar abo -k gosi -jolly llb -ignor amus -ie w -icu isine -ichi moku -ib k -iam queenlatifah -heine man -happ is -green wave -gram een -gib bet -friedrich shafen -free space -flu bber -fal ah -empath ise -eas ing -e toro -document arian -dar kie -cheek ily -chate let -chan o -caro lee -bur rus -blo tted -bla kel -billy ray -bar bizon -az man -avan zo -au ld -allan hawco -alc dsb -alac tic -ajitpa ifcc -ðŁĺĿ ðŁĺĤ -ðŁĺĪ ðŁĴ¯ -ë± Ģ -าภ§ -yu lee -wag tails -vor arlberg -venkatesh films -uz air -ur um -ul b -uk wu -trom so -trau matic -tran o -thor gan -thi splace -simon on -roo z -rand alls -pul sat -prepa rer -pope vil -pasi ones -partic le -par ana -pang kor -out building -old strathcona -od ong -mean ness -mat an -marclam onthill -mal abri -lorraine pascale -loo d -ku pang -jis ub -jessicamau boy -hus by -his cox -hepatitis c -he mer -hass ler -gly cine -giovin azzi -geof ilter -fi fita -fa shawn -eri des -drag neel -dra zzari -diver timento -di stin -chromo somal -cham s -capac it -cal ero -bu ike -biomime tic -beam sville -bar goed -bal ed -attend re -as cap -angel sof -ali zia -alex us -ag or -ðŁĺĤ ! -ر Ùħ -zan gief -wy socki -world skills -whit tier -walkin shaw -w ase -ve tta -van avond -uof oklahoma -tt ro -trip ty -tren italia -tra e -tom jones -the lead -tag ov -su di -smur der -sm sf -sinha bjp -single life -shivar ajkumar -sham al -sh ley -sgr ho -sb cs -sal thouse -sa en -ryo ko -ron na -rie sen -rid ere -resolu tion -resol utely -repatri ate -pr girl -pig man -parach inar -om ero -oku da -nad av -mr inal -meth us -materi ally -mani ka -lyric ists -loth brok -li shment -li anna -lack burn -kn app -ker plunk -ke pong -judicial watch -inter diction -inte x -infuri ate -holi daze -ho lein -hey hey -he trick -have an -gov rauner -gen tiles -film fare -fabul ou -elabor ation -dong guan -dieben korn -dc examiner -cv show -culler coats -cot chin -cook house -charpen tier -ch aux -cc ac -cat nap -cas sin -calcu lable -bb clondon -back doors -aller gist -ali fazal -air corps -af fan -- ] -ðŁĩ ¬ -ëŁ ° -â Ł -á ĺ -zi will -ye zidis -twir lers -transpa rently -thelon ely -thegold bergs -thefuture isnow -terce ira -tar kov -so low -snow boarders -sla pp -short land -she ffer -sch eu -sap on -saf fy -red fearn -ra sher -qu ale -pipe ttes -per di -orbital atk -open work -nuest news -nu get -non ie -mobili zes -miss jess -marinabay sands -mar loes -liven ed -lady land -knox villeraces -kara jan -kam pot -k tul -im possibilities -if sec -ici ous -ho bday -ha sting -great music -gal er -fur ter -fir ston -em itters -el ings -dun ham -devo xx -dawson screek -dari en -crew members -ch cs -c anne -boye tte -bot anists -big apple -b pride -ashford castle -anticli mactic -ano is -andro ll -anaco sti -am dav -allyouneedise cuador -abbots bury -ðŁĺį ðŁĺ© -ðŁĺĬ âĺº -ä½ IJ -âĤ¬ , -world hepatitisday -wm ds -wak ar -vp dd -visit virginia -u akron -tu pac -tor mentor -the mercury -tele wis -ta van -su ffic -steel y -squ onk -spru ced -so kol -skill sforlife -scou ps -sch ram -sal emma -sad d -rain coats -raf fia -pop tropica -po poff -pix lr -pernam buco -perempu an -pear lie -par key -over hearing -om pton -oly tic -nov ell -munt jac -mis amis -mi zzi -may tals -mar well -ma zu -lu beron -lil in -larry madowo -kv k -kc j -jer on -ja heim -ing ood -inaugur ationday -ic kie -ic ele -harvard chan -goo sander -gol ub -galvan ic -fle shing -fau ji -farma ajo -essex cricket -end slavery -edmonton esks -dip ty -dayo fre -danny john -classi er -cho k -cavali ere -capital ising -canti ague -can ic -c aging -bur fday -bo ley -bill burr -bic kel -bengal is -be bi -bal uch -bair ro -av raham -arte aga -and ar -amb johnbolton -ali se -ainsle year -ai shat -ðŁķº ðŁı¼ -íĨ ł -п од -whÄģ nau -wah habism -va sey -transit ory -tothe a -the tommy -sze ged -sunderland uk -straw bridge -sti q -starwars battlefront -st less -ssel fie -sp rad -si sd -shi b -sen blumenthal -se ibu -s ji -rp crd -rock starenergy -re activation -rcr racing -rang itoto -prednis one -poly phe -polit i -pier luigi -par scale -orit se -ore tte -new museum -ne shwar -mumb a -mn df -mcken zie -mammam iam -mal awi -leg alaid -lamo the -l stm -ko tb -khul na -kcr g -jing u -impresion ante -immuni zations -i vp -heli oc -guitar lessons -gu le -gra fik -gang lion -free thought -fr ds -fox football -fly hawks -far man -exclusi vo -er dman -el gl -egre mont -do ña -dim prov -delivery man -deek sha -dan patrick -croquemb ouche -contor ted -cer da -canadas nac -camren bicondova -ca inta -bs j -book giveaway -bin ney -bas ch -ban ville -ban kyw -attrac tively -arter io -army allamerican -anachron istic -aljaz skorjanec -al tv -aim ondo -adduc tor -âĻ ¤ -à¸Ńภ¥ -zoo keepers -zi ons -yuk imura -yourstory co -your dream -we ve -war c -w cag -ur dang -un nies -tour london -til ia -te dium -sudo crem -stick ley -snet terton -savit ri -sav eng -sathy am -redhot chilipeppers -reci eves -quicken loans -ple ural -pic ross -pe zzo -painte dby -monste renergy -mccau ghey -mal is -majum der -maggi enyt -luxury car -love island -le xx -kun un -kh it -kf bk -kettle well -kc streetcar -jen kyns -james spader -jamba juice -j law -irr ation -ine sti -imp eller -i ops -heroes inlife -her nehill -harbor view -guar ino -golden berg -ga itan -foot joy -flori dap -fan signing -expre ssi -el let -ei x -di des -der idder -cy clec -com ely -bush official -bung led -bun nell -bring thenoise -blue devil -biodiversity day -bi bbs -be free -barbour sville -avo ter -arr ative -arch bold -annamari aisland -afri yie -adidas za -achio te -aaron tveit -ðŁıĨ ! -ãĤ³ ãĤ¹ãĥĹ -า า -zi v -yq r -wit sel -whe al -wf sbnews -we there -vre de -ut ile -u ap -the ech -take overs -success quotes -st pancra -space art -skiv vies -sk atec -sen burg -selfi est -scru ms -sch aap -saf fel -sa win -s girls -s dot -r ino -pol yo -phil starnews -panop ly -ny td -nau tical -n eli -mis spent -milan designweek -low rey -ll g -lal ita -kus u -kabir singh -hunts ville -ho bon -heat onedirection -ha aaaa -gsuite edu -gowar iker -gheor ghe -gend ry -flavour some -eno te -emancip ated -egyp te -egg plants -ear lobes -del co -deade ye -de ee -cy le -cree per -chit toor -carbon ear -bur leigh -beach thursday -back benchers -auberg ines -asci ences -art land -ainsleyear hardt -aggreg ating -ac ter -abc worldnews -ðŁļ Ĭ -âĽ¹ ï¸ı -za ev -ys b -y ii -west malle -tow le -te hu -ta quito -t wines -success stories -shay ari -samo ans -romag noli -rock ridge -quote oftheweek -pre market -pol litt -pine town -patriot pride -p ingo -or azio -o ab -new steam -naz ir -nan ta -marsupi als -man ity -mal lock -mad vertiser -lu que -lau fer -jer os -jac enorman -is over -i ir -habi ba -graf ton -glee onfox -ghe alth -ger on -gender less -gau s -fan pic -ero driguez -died rich -dew drop -demo tiv -de mint -d cl -corey taylor -chees ing -blan es -be sty -banque trecords -ay oun -audio drama -ao tea -ai leen -ahlu wali -ðŁĺĤ ðŁĻĪ -е Ñģ -x ai -wy si -wai fus -victi mised -urban e -ul ama -tro mp -thu raj -tf sa -tele kinetic -taj hotels -syno psys -sy stolic -swag gie -supplic ations -su uu -sk j -se ph -sce wc -sa dist -runner s -q ine -pur dy -pur dey -prosecu torial -prophet muhammad -perseve res -oren tina -offic ine -muham ad -morethan just -moo ted -mond prop -med ved -man akin -ly onnais -lum pia -lo gh -lo ane -lef ty -le aux -lan xess -kry sty -kap al -kam mer -jon mitchell -jet setter -ini ana -in asia -her as -helio trope -hedwi gon -hat chett -han o -gri erson -food show -ely fe -e erascal -dist inguishable -degra zia -dan ecook -cur le -cre mer -consu ela -che ika -ch awx -bu fv -briand awkins -blac chyna -bi directional -bi dar -ber rics -bedo ya -be vans -b we -atur al -asi m -app ling -an ot -ale tta -above the -ðŁļĤ ðŁļĤ -ðĿIJĢ ðĿIJ -åĨĻ羣æĴ®ãģ£ ãģ¦ãĤĭ -à¶ » -y quem -y ig -wester nrly -w anner -up wardly -ts wift -transpen nine -track mania -tom colicchio -th ale -tg l -ter day -sun silk -storm track -solar storm -snow piercer -smo sis -sm su -sadh vi -sab ay -ro del -respec tability -rem parts -relient k -re tool -rain ier -ra so -r sb -pre jean -pok ora -ov on -omega watches -oat ley -o gon -nextgen atp -newhope club -nel e -mus ar -motion graphics -mo gen -min cer -ma int -lore ttal -ko yo -kal bi -k tuu -joan hart -itye vent -itali ane -intimid ates -im pac -ili er -hu k -hot newhiphop -hon ker -grave yards -gil well -ge birds -g sp -frit olay -fin nie -fer nes -ethi o -em rys -ed trilogy -e tribune -de smar -david lammy -ci man -cat lett -c ú -brandon lewis -bill z -bil by -benny benassi -be careful -ball ard -av cavolleyball -ard aw -ar not -al ur -afol abi -aff ton -^ ^) -: Â¥ -! âļ½ï¸ı -ðŁ¥° ðŁ¥° -íά ê²Įë -íάê²Įë įĶ -à´ ¸ -ÃŃ lia -z ila -yu yu -yler oux -world heritagesite -wild beerco -way an -voice acting -van morrison -utter ance -trumpp ro -trin abraxton -tri bu -treyanasta sio -tre main -ter fel -stur ge -stag ecraft -spy rothe -spring burn -so derberg -so bek -shir u -seman al -sar tori -row sell -ringo starr -proprie tors -pingu in -ph lo -ortho sis -nwin diana -nod away -no ons -nas pers -nand ed -n bal -mc phillips -mb ly -march against -lyn k -lenahe adey -le pp -kath akali -kat an -k las -jerry nadler -jenni es -jenkin town -ianm harding -huddle stone -harb anda -hand bells -hailey bury -gal y -emp at -em tothea -elge use -digital workplace -der mot -dav or -cri der -corr als -chin ook -cer to -cas itas -bo dh -blan ko -b fy -agre e -ãĥ¬ ãĤ¤ -x ur -wool la -white board -wheel s -wel liver -wa ves -w roc -volt meter -vishwak arma -vin cit -vasi lev -ul tural -u dders -tell your -teeth whitening -sirius x -sella field -seem y -seef eld -sch ama -sc s -sar avana -sahar anpur -s ool -rusev bul -ru pani -robic haud -ra wan -r fr -pis d -pen stemon -pauley p -par lement -over ripe -on ley -ol tre -nyy roro -naive ty -n eno -monom oy -micro controllers -mes dames -mae jor -ma zz -ma speth -love myself -lasci vious -la bored -la ber -l wc -krishnamur thy -kar lee -iki gai -iiii iii -i olo -i hab -haters gonnahate -h itta -gr itting -gobi gor -gesundhe it -ge dge -event s -et was -ental health -el van -don eright -do gging -dizz eerascal -diefen baker -de bla -dais uki -d had -cold stone -char nock -cast ellers -car a -caho kia -broad sword -be decked -b williams -av ena -asi ri -arba een -ap ad -al aka -afl don -aci fic -ðŁĺ® ðŁĺ® -ðŁĶ« ðŁĶ«ðŁĶ« -ðŁıĥ ðŁı¼âĢįâĻĢï¸ı -ми ÑĢ -иР¼ -zig bee -yu g -yaal artista -witche so -wg ci -week i -wab asha -w wel -w icking -visit belfast -vis sel -val arie -tur bat -tom are -the my -su mida -stor ie -ss oftware -sra banti -squel ch -spotify uk -site core -si pe -restaurant australia -rein ke -ra zy -ra dd -plat o -phiphi ohara -phi mu -pacific ocean -ou tique -op v -objec tors -nav neet -n dola -mu ggers -metroid vania -mel cher -malla ig -ma kino -lorettal ynn -lo cher -lar ity -laj pat -l fafighting -j dj -hor ikoshi -hel al -gri mez -grat ton -goodwoo dr -git anjali -freer ange -fra id -for gold -fe uro -f ending -eventu ality -entrepre nu -elo te -ear ache -e dom -duc los -diam eters -denomin ated -decat ur -de twiler -com ed -coler ain -clarkcounty sch -cit ad -ci pd -christian son -ce h -boom town -blu esc -bhu ti -bergen field -ber r -bench top -beck ers -bbc goodfood -back flips -ayles bury -av j -aux erre -aur ore -athen ahealth -astronom ia -apo yaalartista -and health -alli s -ai shah -ab amba -ðŁĶ¹ ðŁĶ¹ -ม ม -wr b -wbr cnews -vol ant -us fl -udta punjab -tw cnews -tun ics -to ten -steph ano -st kilda -sn am -sh appy -self pub -saver io -s bi -ru sch -ru fo -re usch -r pm -public service -pric hard -ph ills -pet chey -part sun -par tee -over spend -or ba -open forbusiness -oo ohhh -ohmy gosh -no pal -ngv melbourne -ne era -napolet ana -najam sethi -my self -monk house -mne monics -mc william -maple syrup -london fashionweek -lat v -l all -kil bourne -kelsey redmore -k mox -juxta pose -just say -i speak -hol tnbc -hardeep spuri -har rell -gro ho -gor o -gold finches -gol der -gol conda -gen cies -frommy heart -faof ish -fan ks -fan day -fall league -epitom ize -en ar -easy money -du buffet -dream team -discovery id -de orro -de berry -cycli st -ctr l -cit b -choreo graphic -chak akhan -cc ds -ca ap -c ws -brou illard -bok ki -blu earmy -au lia -army wp -anti och -and music -air ambulance -ad sk -access control -?? # -/ ( -ðŁħ ¿ï¸ı -éķ · -çĦ ¡ -æ ¾ -ãĤ¤ãĥ ī -zcz uk -years strong -wwt slimbridge -watch nz -vir tanen -to ggles -tie res -thrill ing -the wild -the posh -swer ved -st lawrence -sp ellers -solar pv -sharnab urgess -sav va -sand blast -sab ado -rp murphy -robert patrickt -ri ad -ree bie -real love -re saca -r ales -progressi verock -pe sco -parry sound -panam á -ortho gonal -onec up -novi kov -mur tha -mou lana -milk ha -medic ale -mb alaji -lo xton -lo sh -l ène -kin te -ki rov -ke bede -ka stles -jud ici -jane philpott -indi en -if we -hu h -hel me -har ks -ge su -flau tist -fidge t -er rani -e bon -director mbalaji -derren brown -dam age -csi miami -cp v -coqu ille -con ish -bur b -brad meltzer -bra cht -beat riz -as sport -any ones -:::: :::: -ðŁĺĤ âľĮ -æľ ¨ -ãģ£ ãģŁ -z aps -wel chs -w fo -un chain -tr us -the wire -ter al -tantal um -speed sters -snow cat -sn el -sin ta -shaz za -serge j -ser vient -se epage -save on -salvationarmy us -s laney -ro oney -ro ha -re winding -re settle -r uru -q ajar -put nam -pre packaged -om onday -oise au -o ah -nur nberg -nichi jou -nex press -neuro anatomy -ne peta -ne ddy -moon flower -me it -mc beal -mb g -lough rea -lorealparis usa -lit z -lau rea -la key -karapar aask -kal imba -inordin ately -ide en -hade stown -goven der -fu z -fro bots -fau ve -face down -experi ential -ero u -eb v -den mark -dai sey -creep ily -cp mumbaipolice -com pa -co bh -broad sides -boun dary -bo ddington -bfc dublin -beverly uangel -asin ac -ani max -all state -afric anist -ae ons -acol ytes -( ãĢĤ -ðŁĻĨ ðŁı¼ -ðŁĴľ . -ر ÙĬ -waterstone spicc -w baboxing -vin ci -ver rett -vel an -tumn us -ts q -tribe sman -the wiz -the mis -the dubaimall -tatt i -sun corp -stra pline -stam mering -st ks -spinning top -sidd ha -shilpash inde -seung woo -scapego ating -sar n -ryan lewis -ronde bosch -riffo tronic -rad ford -puke kohe -prodig y -positi va -o wari -no taro -ni ajax -mycorrhi zal -mr duncanjames -mil on -megalom aniac -mag ana -lipp in -lady killers -la fitness -kur tzman -ka hs -inciner ated -i pps -hump y -hg vs -gene ws -franklloyd wright -euro dance -epider mis -ellef son -dylan mcdermott -di ame -clam my -chir ped -ceee gebirds -car tel -burk holder -bu de -breckin ridge -bre de -bal dridge -b tt -awe urope -at nam -an ico -ale lection -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ -ðŁĶ¥ ðŁıĢ -ðŁĴĢ ðŁĮ¹ -· · -ze ina -war and -vas ser -vapori zed -un roll -tori ko -tom ax -to ple -thejim cornette -te gen -tat ro -sul ting -sud americana -sporting cp -shaw aii -sham wow -sand ridge -rt pig -road safety -ramadank areem -rain goaway -q hd -pomer anians -pin ki -pers ad -per ki -parañ aque -out doing -o sto -nor semen -no ke -no ga -nh sor -net sky -ne sia -my nam -mon ferrato -mix te -mid shipman -metagen omics -mesm er -melis sal -ku va -kno tting -ki jhl -kay afm -k law -jonathan jackson -jes sen -ing ames -ihear tradi -idri ssa -iam lenovo -hij ri -gall stones -gall er -gaine sway -ga shap -g á -forte za -fh fa -eze kiel -espn fc -er b -eat sleep -dhing ra -del po -counter intelligence -core graphy -cooper ators -cons ented -cep r -cdn history -cal zaghe -c tbt -bon ham -bex tor -bergo glio -belly button -be heads -ay anda -atletic omadrid -ar tt -ap tors -anti report -am ics -ahmad is -a style -+ â̦ -к и -wy rm -wt va -wit cher -wi b -whit em -vote austinmahone -van ness -ux ury -un heralded -thapp ens -tham ma -teach in -sukab umi -sub let -stoner rock -spor ti -smet ana -skills gap -sister sof -simon schuster -siden ote -sar wat -sal ade -sag gy -s alling -ric in -ren er -rebel le -ram eez -rac i -r sd -powerrangers movie -play thing -plac ers -per ico -ot ford -noctilu cent -ne ya -mist born -meng al -mcg lin -man holes -madon na -lu bs -lin ce -langu ish -lakshad weep -la pel -ku ipers -kohl schreiber -knigh thawks -keele y -ka os -journe yofficial -jayas uriya -janasen aparty -j gn -hyat tre -humanit arians -hoo ton -hamidmir geo -gree do -gre gate -fur thur -fra ise -follow andretti -fire lands -fi ving -fa ka -expedi ency -elizabeth forma -earth rise -drink responsibly -d Åį -curric ulu -ctb to -crvenaz vezda -car boy -campbell ford -buster posey -bu uuut -bra chial -bally fer -azi muth -as fa -archi v -ar leigh -american topteam -aldu barkads -alan thomas -al los -aa am -a ÅŁ -ðŁĺİ âľĮ -ðŁİĹ ðŁİĹ -ðŁĩ¹ðŁĩ ¼ -ze inab -wire duk -whati want -v res -un lincoln -tw loha -toe jam -tenn ille -st moritz -spyrothe dragon -slide shows -sivakor atala -sig nora -si byl -sh omes -segaf redo -sar ra -rock cliffe -quick book -pra japati -portsmouth uni -po ti -party goers -pap d -over views -ni asse -mul house -mc ca -master y -magn ani -ma ior -lu wak -le ura -kamau bell -justin thomas -iso pod -hot picatnoon -hank ering -handmade gifts -grilled cheese -gari funa -fon dren -fle is -fl en -fal ak -fab ri -f gb -f bb -es covedo -e disi -du lux -dri skill -dill ingham -cu bitt -cro oners -cre t -con go -cloud berry -cl ore -cau g -cardiopul monary -campaign mag -bu is -bp climited -book cover -barn old -bami yan -b ital -ave x -at aide -ark on -arco baleno -ag co -!!! ðŁĺį -ек б -y plac -wapping ers -wal on -vi ena -trust god -threes game -sher k -s musical -riseas one -reco lored -realmadri d -ram yak -ra sse -r hu -poo lesville -poco yo -pendle bury -p chidambaram -nujab es -nu tella -nh u -ne kom -moun i -moo kie -mon fort -mil ind -mei osis -marti us -manas lu -ma ff -m pr -lie tti -lego batman -le id -ladi esday -khut bah -is sei -indian wedding -illustration art -i onized -housekinok uni -hors fall -honor flight -hitch hike -hey sham -hell blade -har lin -happ n -find lay -find away -ex on -ele a -el oped -ec ards -dv usd -dru e -di ffa -co ffin -cherry tree -bol er -bi thday -bad finger -az t -au las -atthe movies -atchaf alaya -alic es -ali bis -al cac -ak uti -air co -agricul ture -ad de -a project -> . -* - -" ðŁĺĤðŁĺĤðŁĺĤ -ãħľ ãħľ -zoff any -z off -youss ou -yl ounge -wra pup -wra gg -weid ner -wc bi -wav eland -war id -vin ca -ver dade -ur am -un ce -tw fanmily -tu log -transpor table -the pc -syste ma -sur inder -stock holders -si es -she z -selec tive -schem er -sam ora -ron co -ro the -pul wam -prez ono -port ables -poly gamous -ph ac -penit ent -par aty -pa ea -over clocked -of cs -not ability -neas den -moon set -monte grappa -mini disc -min ch -midd ling -med ha -meag angood -me q -mati angi -mar jawan -m wc -lma g -lieu tenants -lesli eville -kro g -kol am -king ia -jo co -jed burgh -jaros lav -j bb -hy keham -huawe imate -hat es -grand cayman -gossip stv -fun in -for i -fer rada -enter ic -desar rollo -dead or -dan harmon -d pt -cog swell -classe ment -checkat rade -case mate -bur ts -bow line -book plates -blat chford -big mac -band aids -auti stic -any one -am rev -af fi -? ðŁĺ³ -ðŁĵ· ] -ðŁĩ²ðŁĩ ¯ -ìĺģ ìŀ¬ -willing boro -whis en -we vel -versi one -veri sty -ver ismo -traff ick -thrasher mag -talke etna -super sport -sti jl -stand down -stan te -single player -si lex -schwer in -schoon over -rin sed -r sn -per rone -pan fur -pa hat -pa changa -over dubs -or ator -omar ry -oli days -nu bra -nig guh -nie haus -niajax wwe -neuro transmitter -must achio -mc gm -man ess -madeinthe am -macro biotic -le creuset -ku y -ku coin -kon nichiwa -kiril enko -kies za -kel as -j and -intern alize -in step -in ci -hol guin -hin rich -ha german -guer rillas -gar ai -fulbright prgrm -ez el -emblem three -el ink -dolce amore -dex p -depos it -dek kers -d elli -clean sers -cer ato -cardinal nation -broad ened -bo ones -bankrup ted -avi ationday -arach nids -aper ta -ang leton -ananth kumar -amuse sme -al ster -ahmed nagar -ag akhan -ðŁĻı ðŁĺį -ðŁIJº ðŁIJº -zodi ak -wra wesome -wex tweets -vo j -vitali y -uk ltd -the katvond -th aba -sports world -sh omo -save ur -sap ere -saint arnold -rotter dam -ric heisen -re plo -radic alised -ra hr -quin cean -pumpkin spice -pu y -pron ger -project cars -prem ji -post ma -pipe stone -pe jor -pastor alists -oooooooooooooooo oooooooooooooooo -mye m -murmur ation -mu zak -mo ssel -mersal teaser -lan go -lain ie -job sfor -jee bies -je th -iri c -int vw -in hospitable -ic har -home goods -hi zb -gu u -good friends -go ke -glow ing -gla vin -gh p -ga urd -fro ese -flu vial -ffic er -explain able -ever se -ente i -du alism -dr disrespect -digital currency -clinical research -castron eves -cas ella -carter r -care uk -candi dato -c cim -btsx snl -bobby jindal -blay don -bl ount -bar tha -bal ag -baby cham -auch ter -ashab hosle -architek tur -aphor ism -an quan -ale ad -aggi ore -ðŁĮĪ âľ¨ -íĿ ¬ -yuril owenthal -xen os -wal halla -wa ja -virgin islands -ving lish -un cbball -tre u -tre gan -tau bman -t enda -swachhbharat gov -super bow -stir rers -spe ake -so it -smar ine -shin er -shar leen -sambailey real -sal ati -rocky horror -roc key -re animated -proven za -pri zed -po tong -pit ney -olivier giroud -off hand -ne ath -natu rec -national doughnutday -nan ning -n xs -mercury marine -let z -laz ard -lac eration -kor ova -kok ila -know ing -katy did -kash ish -jar on -j wu -is ins -in actives -ilove hd -iam blackbear -hud speth -hero dotus -herac litus -hedwigon bway -gull foss -gen til -ge at -g men -far ag -drive tastefully -cow girl -cl c -chec kups -canni balistic -can adap -campeon as -by rom -bra infe -bon anno -bear kats -barcelona alove -bar q -author it -as ky -anu ger -ant je -adelaide hills -ad ness -ðŁ§Ł âĢįâĻĤï¸ı -ãĥª ãĥ¼ -اÙĦ ت -ze ba -zac apa -wor s -water kloof -water bed -war nes -w kamaubell -uso glu -un right -un gie -u ib -ty ro -twitch creates -tin ke -ti ppet -teenagemutant ninjaturtles -son ly -sobie c -smart card -shav a -shan awa -scro ggins -sanc timon -ralph tresvant -nick son -mobile security -min ders -me ander -mal um -mac nab -m wo -m mat -lamin ar -la grave -l wv -kier sten -juli ago -ju sko -is kander -in legis -hor sford -hiz bul -hellolove goodbye -guis borough -green biz -goddam ned -fortnite battleroyale -ferne mccann -e government -e cot -dy as -drake relays -documentary photography -diag ramming -dav ante -club sport -c gv -c bi -bull ingdon -bu ber -bram ham -boy meetsworld -blanc mange -bear skin -be well -be sth -as riel -art basel -ark ads -aran juez -anem ometer -amor im -allison holker -all out -ðŁĮ¸ðŁĮ¸ ðŁĮ¸ðŁĮ¸ -в иде -ÅĦ ski -year slater -vand ana -um theatre -ton ner -thegood fight -the hot -tempor ary -tar bell -sun screens -stu c -star ches -soa addicts -sne k -royor bison -reserve dly -regan smith -quanti fiable -pro ba -pre disposition -plane trock -pe ggle -p tur -om at -oliver heldens -ol mo -o com -no li -musco gee -monte carlo -mike sonko -middle class -mel nick -meadow sweet -mayward x -matt damon -m ols -lost girl -lec co -lang ara -lagan jae -laganjae stranja -kol asinac -ka o -iw aki -ion ut -instag ay -inglen ook -in born -hem pel -gun fighter -go devils -gil o -gan u -g morning -frei ghters -flat ness -escan aba -elli jay -dre cs -dex trose -defecte drecords -dave chappelle -cri stopher -cr m -countrymusic hof -cheese monger -cas ano -c bt -bro mo -botry tis -bau ma -bairn sdale -asadu ddin -arsen io -ano il -alco hols -ach aem -ðŁĺı . -ðŁĺĤ ... -ðŁįĤ ðŁįģ -æĢ Ŀ -༠Ħ -z fs -yo he -yankee stadium -work safe -whole food -welsham bulance -weight los -waddesdon manor -vä ster -vo isin -urban agenda -un inor -tru dell -strang ers -stoo ping -sne ering -sin ach -sihan ouk -shig ure -shek els -seab our -scott bakula -ron k -ren nais -ram pton -radion ational -pound bury -penna onb -pas alu -org sky -nw smobile -north pennaonb -non plussed -n ical -n anni -mur nau -mr rpmurphy -montene grin -love irishresearch -lino cuts -ji ro -jang keunsuk -jab ulani -indiak agame -igu al -i boschetto -hi mba -hart line -hair le -go swans -gachi bowli -fun land -fac et -epi thelium -ehr le -e wers -du va -dam bulla -da oud -cox ford -church town -cast mates -career day -bel ching -beach ampion -be amon -band ara -b to -akal pathi -aedil hai -ðŁĵ£ ðŁĵ£ðŁĵ£ -à¸Ńภģภ-ว ย -zey ne -wi fes -wac cam -var go -un ra -un organised -ti sane -threef old -spring flowers -sil vretta -sie ff -sc cs -sample sale -reg attas -rb kc -ram z -radio app -premiere night -plac ket -pet to -mur shi -mis ato -mcca ig -mbi id -mag safe -lu es -lu di -lil dicky -laye tte -kom m -knoy dart -keep init -kaf i -jose maria -johan nes -io ang -hu tong -hover flies -hol lin -hide and -heyits conrad -hey heyitsconrad -grand is -gang stas -franco eur -fol lis -fish ponds -eye shield -eye ful -e tap -e steve -dro ste -digit alized -de watering -de enday -dar in -daniel boulud -cy donia -ctv london -coreytaylor rock -cat chiest -car ano -c ten -buffoon ery -bu der -bpl boston -bootle ggers -bn sfra -bi shi -basket bol -at rack -at liens -asun glasses -ali ka -alam ocity -âĢ º -ö ller -© ï¸İ -z lo -wood ford -wol ski -wex ner -ul tim -tugue garao -trib biani -tri state -tied ye -than es -tard iness -talis mans -tagov ailoa -sym ington -supportall streamers -stay cool -star te -smer conish -ski at -sex pistols -selec table -sam aya -safe and -roc chi -ro mac -po sobiec -plac er -pi adina -pe tre -pal ash -o ort -o dium -ny ss -ny a -nic onico -new c -ne isd -naz areno -nany uki -mye ong -mu sou -mu on -mon ga -mil n -masti ffs -mal ady -mac gill -ku ih -krist perawat -ki em -khal af -k br -jan ella -j dw -inexor able -if youknow -hudders fielduni -hohen zol -hi en -harry met -guest mix -goz wift -gla b -gd ny -gbbo final -gastron omia -eric andre -enrol lee -disen franchisement -diesel punk -di thering -committothe g -cisco live -che ssie -chat to -char oen -central park -ce derberg -cad aver -bur th -brede sen -bour dieu -bern sen -barr anco -bar kat -bar bora -bag pipers -backto basics -al mos -ahmed abad -ðŁı Ń -ìŀ¬ë² Ķ -âĿ¤ ðŁĺŃ -ze olite -ye ver -y band -tech nion -tan abata -stair wells -ske w -si w -se ssional -sch wa -sc ousers -saroj ini -santa fen -sandi gan -sand rak -rug elach -rr f -roy se -ros common -rital in -recom ended -pin sp -pill man -per ahouse -pastor ius -paki stann -ou lay -ol ya -od der -north end -nit da -nas rin -mu lah -mer men -mel anom -m wai -lester holtnbc -le kin -lab be -l wwy -l bc -kyo do -kn ole -kad hal -jac kett -ja rena -isleofwight fest -irwin mitchell -indi atimes -ili ja -ia state -head scarves -he fei -grow your -gor je -gn h -gh m -frog town -fresh breakfast -float plane -far ran -ener gon -edger atedr -eating disorder -de stefano -ct il -cad en -business line -bun ko -break bot -bol l -bir thanniversary -bi japur -ber ny -bec cy -and sf -aha hha -ag is -" .# -zarbeaz b -youn gar -yoon jin -yo ji -wrestlec ade -wo ty -wha aa -we didit -war ofthe -wah habi -vic ente -ver as -uc bt -trip wire -tp mp -ti afoe -thr one -tar sus -tac t -sty mied -street league -stor g -ste eve -spi ef -son tario -sac redness -s bac -rum miku -renfro w -rc plondon -peep ed -peace able -pate kar -orcla pex -non native -nob ita -near ness -nat yam -n ells -mlb memes -mik ami -mi fa -melissa joanhart -mau die -ma kav -lynn haven -kin cade -khil afat -ke wau -kcj hoop -kav li -jire h -javel inas -jare k -itsnotre venge -itsme abir -io sh -ig ala -i vel -ho ds -hassel back -hack the -goof balls -go time -gh yll -fr nt -fen lon -faith ful -e wn -dow ding -dol lah -do stum -dis organised -di pti -deejay ing -comprehen ding -clo sers -cho ppa -ceta phil -celtic thunder -bu lut -bor relli -bnsfra ilway -bel son -bargain hunt -ari ston -ambu lance -ai ono -ack athon -, / -ðŁĺĤ ðŁĺ© -ðŁĸ¥ : -ç¾½çĶŁ çµIJ -ç¾½çĶŁçµIJ å¼ -yang gang -y csd -wasse ypur -tur u -ton le -tile hurst -the second -stu ding -stra ke -stip ends -som izi -sok cho -sick kids -sche chter -scalab rine -sam park -sach deva -s shs -rin sing -rach man -psycho analytic -prolon gs -pla iting -peven sey -param ahan -palae olithic -p ame -official ecfc -o goni -north bay -nex po -new baby -muje eb -mu go -movie fone -mer sing -mc ts -m sum -love books -le day -latel ate -ku miko -keep cal -jul lian -ice fields -hog nose -glaston bury -fs north -france se -fps bs -fau zi -ep cot -droid con -dor ota -deb u -de hydrogen -daylight savings -dan juma -cru dely -con somm -colec tivo -cc ps -calvin ist -c gp -bur jal -bricol age -bran nen -bor ra -bo ffin -basket bal -balo chi -artem chig -apro x -ap ub -ap tist -ap rc -ani ket -am bl -algonquin park -ad c -* ) -ðŁĺŃ âĿ¤ï¸ı -âĿĮâĿĮ âĿĮ -zer of -y out -wild fowl -we scott -we ide -vivac ity -unimagin ative -travel ingram -tor point -ti mat -theroyal parks -te da -swind ler -student en -starsand stripes -spu moni -spear ritt -so hot -slumber land -sidd han -shock waves -screen rant -ru da -ros eng -roof e -pren tis -porth cur -pastr nak -partner sin -paraly tic -ok tay -mountsin ainyc -mohm and -mg madvertiser -maal ouf -life forms -legiti mize -kit aro -keepingpeople safe -just announced -jugg led -jai ram -ja ket -is ky -io annina -hit makers -hard liners -h ise -galla her -frontend friday -frank linton -fra il -fay ez -fak ery -eri vera -equi v -ell ick -dwight yoakam -drum moyne -down falls -del vaux -david cassidy -cori olis -copper plate -co ggins -catch ings -bryson tiller -brig ada -bra f -blot chy -bennel ong -benedi kt -bear kat -bandain am -b sac -angela hartnett -alla re -all eni -akashi c -ab ello -åĨĻ羣æĴ®ãģ£ãģ¦ãĤĭ 人ãģ¨ç¹ĭãģĮãĤĬãģŁãģĦ -ภ¶ -اÙĦ Ø· -zim v -zan go -z opa -z ellers -young bae -yi ps -xiaomi india -water wheel -w bl -vo icec -vincen eil -v ur -us lim -ti gra -the answer -th h -tal do -tail pipe -t yee -t jc -sz il -sz ab -suz aku -stanis lav -sk zn -sk ur -sco tians -sc it -sas software -saint lucia -sa ade -rf q -repet to -realestat enews -rat zinger -rain fow -rah mani -r hq -quic kies -pro pe -pin nell -palad in -nu eve -nic ott -nau de -na stier -mö n -michael keaton -mic eli -mccor mick -mann ingham -lor di -limited run -labor de -khary payton -internet day -ho stos -hi wx -grand lodge -ginar aimondo -ga stein -g po -final say -fant ine -existenti alist -eric martsolf -elie zer -electric guitar -ei de -effic acious -double lift -dhar y -derick pauls -cream sicle -cor field -com ino -cargol ux -can ig -ca prock -ca asports -c pc -bob collymore -beaz ley -athene um -ash wag -aro ya -ace day -a oficial -$$ $. -! ðŁĴŀ -ðŁĶ ī -ðŁ¥ ª -yu ichi -writing day -wevel gem -vil joen -v ona -uq am -unis dr -tip tronic -ste v -spin all -sihanouk ville -sheffield star -sha hir -sandigan bayan -sains bury -ro amer -re manufacturing -ra des -pyro clastic -public space -pric kett -photo gr -penta ho -pamban sang -ow sley -o ton -nific ent -never yield -mel ds -mc chrystal -marath oners -ma ay -landon donovan -kor at -kipp ah -kal ish -joele mbiid -jo see -jetti son -j ri -indi ap -hurri edly -hatter sley -ham are -gully boy -gov ballnyc -gol gotha -gla ucous -ger rie -g app -fri gate -elve den -e ous -down playing -dor ados -cry ption -cor rell -cher ub -ch ome -br onews -bio g -beach head -bal dry -ashley purdy -ang ella -amy ra -alvar omor -agronom ists -acu edu -ac or -ðŁĺŃðŁĺŃ âĿ¤ï¸ı -ãĤ « -à¹Ģภ¡ -z azz -yo shim -yellow ed -work it -wh iner -weare texans -wantt omarry -w marybeard -v ong -univer sum -un do -twi ste -tic kle -tee pees -tanz anians -supportyour local -ssouth africa -sol enn -soil work -sm p -skybetleague two -roit feld -rh y -re heating -r uri -plaque mines -pil ton -pag od -outand about -ori x -nic hts -mill stream -maxplanck press -marylou mcdonald -mar aca -mac books -lul led -lo der -liv ening -li gious -letter heads -legar rette -lang tang -la by -ko co -kam in -jme bbk -jacob in -igu chi -he ffer -har aam -han si -goddam nit -gang way -friendly breaks -frankie edgar -fol ge -fire trucks -fi resi -fene stration -f ones -ei gh -du kin -don alds -discipl ine -disc or -din goes -descend ant -dere kand -den ki -ctv calgary -cre ager -con drey -chatt yman -chadwick boseman -ca storm -by akuya -bru tha -bran ded -bj arke -ash gabat -anh inga -an sp -alli en -ad at -ðŁĩ © -ì§Ģ ìĽIJ -yal sa -xx viii -world soil -wetnwild beauty -vol cker -vijay ak -vide over -urb act -un traceable -ud der -u dra -tox ico -thér èse -thanior uvan -td cs -swis best -suppor tin -superstar mahesh -stream flow -strat aconf -step child -sp iteri -simply shop -shu hada -schwarz wald -sal ur -sa heed -re penting -r under -r ry -qi bla -port ly -pooja sharma -pis ano -pel is -pel ham -pay phones -paint sville -p mac -oul ter -neo cons -n oooo -mull is -mose ley -moo rer -mik ro -me ggs -mayorof la -main er -ma hou -lul lah -loch ness -lo vis -lime scale -like us -l pp -ked zie -jo vian -jimdunlo pusa -inn smouth -i stra -i ami -high cliffe -health week -h cs -gol fer -ge tag -g enda -famili arise -faces wap -ene wsroom -discover ing -dim wit -delic ous -dan z -d hur -cuc cinelli -cor stor -chen al -che ch -chart buster -be spectacled -bar mer -balder dash -back strap -b hon -as sts -am pt -allo c -all waltrip -albumo ftheday -:(( ((( -: ), -. ðŁĴĶ -ðŁĺį ðŁĴĵ -ðŁij¶ ðŁı½ -ðŁIJ· ðŁIJ· -âĸĪâĸĪ âĸĪâĸĪ -Ùħ ا -ÌµÌ ¡ -¡ # -zzzz zzzz -virtu spro -un awares -turtle tuesday -thisise dinburgh -thenew shour -te um -stark ly -spre esy -spreesy co -sor l -shay an -seren ay -scow ling -sche herazade -saf fa -ros seau -riz k -rin us -reebok classics -red letter -re negotiation -pulkit samrat -pro geria -prevention week -pit sea -pine top -photo copying -ou dh -oppos ite -objec tified -o ire -next time -neuro marketing -nbac ares -nandish sandhu -meaning ful -man ara -labor al -l mpd -ko vu -ko sho -ko kk -kidney wk -jarryd hayne -ivan o -ip k -in stil -he ti -gucci fer -gon dry -go back -girl streamers -fl annigan -extra ño -extermin ating -eee et -dri a -chapter tweets -carl fogarty -caraba ocup -cabinetre shuffle -c ssc -c spa -buck aroos -brachi osaurus -border town -bol c -bed n -becu ase -bbc tees -bbc gw -aviva stadium -asa ints -as ara -art dielle -antibully ingweek -air wave -ag ab -afric aus -( ; -ðŁļ ĥ -ðŁĺįðŁĺį . -ðŁİ ³ -ðŁ¤ ķ -zay ed -yar gentina -y mir -whit low -var on -us sen -truss elltrust -trans dev -tran socean -tonsil lectomy -think tank -the vulcansalute -tele ports -tear sfor -tamil cinema -spur ned -span kin -southern miss -samar itan -sam mie -sa huar -ru ppert -rsp bin -rspbin theeast -ri mu -record able -re ch -q ande -pre gun -pine wood -philli ppi -patt yar -pag pag -op ry -on wu -om itting -odemwing ie -narcissi stic -n komo -mul liner -maynooth uni -m ür -leon bridges -kwe sta -jo kanovic -jessic ak -jav it -instaf reebie -in cun -housel ive -gy les -go shi -friends first -fox fire -fal vey -fal com -etz le -en cana -ela ina -echocardio graphy -dr n -do gon -demol ay -dar at -dam nn -d anya -cosmo polis -core opsis -co stin -chichar ron -chay kin -camden market -cal es -cable vision -c mi -blan chet -big query -bech ler -bar os -arti s -afl w -afam ilia -abbo ts -ðŁ¥ ŀ -åĩº æ¼ -âļ ķï¸ı -yu ria -yow za -yac ine -y ber -wunder man -wood pile -watt les -vo vin -vex illo -to simplyshop -the wilson -tetsu o -tb c -tab or -star tl -sports desk -sp icks -sol ingen -sit ton -se yes -scul tural -sam aa -sal tim -s bl -reti en -ram aswamy -pre ah -plumb ed -pin ole -pier is -ou cher -o idal -night shirt -mums net -mean sall -me uk -me op -mat tt -mart elli -mam mon -llor ona -light ship -lao tian -landsc aper -kun lun -ko jak -kca argentina -kan oo -kamp us -ju shin -jay jay -islam ization -horror nights -hol is -hill yard -ham man -ha pag -h wm -gar ima -gang stance -er ges -endur ance -east mid -dutch town -du f -diab o -depos itors -del erium -cu ssing -cor deiro -cham ac -cardiff council -cam ii -c ter -c ico -bor nin -bol ting -bol ds -ber o -ber ling -belle garde -annnn nd -anas am -adal at -ad lard -ðŁij® âĢįâĻĤï¸ı -ðŁĨ Ĺ -ë¡ľ ìļ° -zer heide -y aser -who dares -war cry -uss c -urbang arden -til brook -the talk -the danny -tar ant -t max -stere rs -spar knotes -skate board -shiv aya -shi e -sab al -rain hill -rac ism -pul lup -poul try -poly count -po lit -ping ree -parl ours -para ÃŃ -pang ppopro -ow ol -ow gr -nick ers -nfl fantasy -my elin -mr jafri -mo lesworth -ml scupp -missou rian -mary knoll -manju la -ma hala -lut fi -lam ov -ky yon -kon oe -kil donan -kers lake -ira wan -inesti mable -in accuracy -ib ti -hus sen -hk racing -gri se -gre villea -go so -glen wood -gh eroes -gar my -flower pots -en aire -ei ke -dupont pioneer -desi erto -democr ac -debr aruh -dead weight -codepend ency -center nyc -by our -british farming -bra si -bergdor fs -bel on -bail able -ay anna -auro ville -att ard -ard han -archan akalpathi -ar rc -ar dent -am oroso -ìĽ Ķ -ëŁ¬ë¸ Ķ리 -ëĵľë¦¼ ìºIJ -âľĮ # -Ï ħ -val miki -trav ag -ti pit -tetten hall -tcho tch -ta wau -t fc -switch over -sub servient -steep les -sko whe -silver dome -sign um -siesta key -shor se -shek hawat -sa cher -rob breport -re produces -pre achy -pl s -photo shops -pen shurst -pattyar quette -pakv wi -no deal -nis an -net gov -nationallibrary week -my desert -mu rid -mil v -melis sad -mcly te -mbalu la -mat ahari -mand ana -man asi -london theatre -lo san -lo ll -ler ner -laluprasad rjd -l cr -l bb -iron bound -inve sco -hye sun -horse heads -hope toun -he ise -hab bo -go browns -ghost writing -genealo gist -ge aro -fron te -fer ing -feather ing -e acc -decision day -de vice -d cr -commiser ate -chin ned -che me -cephalo pods -cal amit -bra bazon -ble k -bla ire -bin os -bc ci -balde agles -athle tically -at uk -ancient rome -adam baldwin -ache let -ac che -âĿĹ âĿĹâĿĹ -Ñ Ķ -ye ou -yah i -wy at -wor kexperience -weekend fun -vin cy -up online -under performed -try p -trombone shorty -thermo couple -targe tt -south ville -sna x -smo ving -sl acked -shehu sani -sh appen -seg agenesis -redd itor -re configuration -ra ther -practic alities -por tales -person ify -papar azzo -pal at -our nameis -ong ma -o len -o chil -mot ti -michael avenatti -mf doom -medi ag -mall rats -log ous -llantri sant -lic e -le strade -john bishop -hills boro -gy gax -gram ercy -ge tex -g nat -for yourself -fel i -faz l -epp ley -dog sin -dl h -de wal -dam isi -cu eing -chint u -chi avari -chau mont -categor ia -car ny -calcasi eu -bur gen -bell in -be aky -bas ler -azu car -aw es -at chie -assetto corsa -ask ham -an tero -amar tin -am paro -ak aroa -acom ets -ðŁĺı # -ðŁķ µ -é» Ĵ -çī © -wo ah -whit enoise -victro la -un blemished -tu de -tie polo -thehip dotcom -than gam -th ax -tele porting -su mona -stone hill -spar ro -sime to -shi ur -shi kamaru -sh emp -selec cion -scar avan -sam plings -sade ghi -s ket -ru so -ri ise -recap tcha -real skipbayless -raj path -pol ara -pap acy -pad dled -official bvb -oceano grapher -new ser -nage sh -mun ky -mise z -ming a -mi shal -mi gros -mal vasia -lionsden kxip -le be -l drs -kra vis -ker is -kab ini -jol ina -jetpack joyride -jay me -istom in -is sam -ir kut -improvis ations -i would -high line -hart ke -h ran -gu ell -google plus -godd am -go ering -gen ce -gal op -fi sto -farqu har -expon ents -electro shock -east in -du plin -dav inci -dance y -cu i -coom era -chit rib -chas eric -cat te -can tanker -burn ley -bi valve -bi key -bett ye -back draft -ay ou -af al -ach ery -ach el -acap ital -ðŁijĢ ) -ðŁįºðŁįº ðŁįº -ys ss -winter bourne -whit eville -whir ter -un reservedly -tubu les -thy depark -the terminal -the matically -ten bury -tel cel -source fed -sop o -so ji -sis land -seung min -san son -sa shi -roger splace -rockof ages -red deer -ra ult -r wr -pu cca -pre destined -polyphe mus -pastor ing -opti plex -okay player -o zzi -o ssian -non ukes -nih ilistic -newcastler aces -mont verde -min ella -mil as -micro light -mi zan -mat raffic -man ie -lux o -lucifer onfox -lu ll -lipo protein -lew ington -ler adio -ku pe -kore y -kno bby -kick off -k rank -k aci -junkyard blonde -je bb -itte faq -inside out -hun gr -hop man -hay dock -gt masters -green power -gli b -ge mein -g son -freo dockers -england hour -en vies -em x -edin travel -ecan al -ec an -e ik -des demona -de arer -daysof type -corbi jn -cor mac -conni ving -chand ini -bon su -bi bis -bab ai -auti ful -at weet -at rue -ash leym -art chat -aps virginia -am lin -almo sthe -agn ès -af rin -ð٤ŀ ð٤ŀ -çİĭåĺī å°Ķ -âĿ¤ ðŁĴĻ -âĸ½ âī¦) -woo oh -win er -vijay ad -us ffootball -up wind -tri gon -tor q -toni oli -tom fletcher -todd haberkorn -throw ing -ta vo -syste matics -sk int -si tharaman -si pp -ser toma -sc ouser -sat anists -sassi est -sari ka -sale hi -robbin sville -rajesh m -r du -po teau -pit b -pic anha -pall u -pa wl -official nihr -nr and -ni pa -neg ative -ne ase -mar n -mafi oso -ma zy -low light -looooo ove -ld s -lambof god -l ous -l ke -kasar ani -jon gordon -jc chasez -indoctrin ate -human o -hi bsofficial -hand sup -han ratty -ge toff -gayle king -fy ah -force ps -flume music -espan ola -du che -disbur sement -diph theria -determini stic -del or -dairy land -d phil -cle eves -cil lessen -cali bur -c eller -bu ñ -bt q -bro mine -bon dsman -ben ares -as sc -and aran -all arin -aic te -ac cen -abby wambach -ab ish -. ðŁĴª -( ?). -% !! -ðŁij¯ ðŁij¯ -ðŁĮ ĵ -ðŁ¤Ĺ # -ìĨĮëħĢìĭľëĮĢ ë¯¸ìĬ¤íĦ°ë¯¸ìĬ¤íĦ° -é ³ -áħ ł -y adv -wor c -wam pler -walks britain -ured ome -tu bb -to your -to fu -ti ran -thu is -the joint -the flash -te bowing -taw se -strick lin -startl ingly -south old -som bre -sk ala -shawnat spg -shapeof water -shan kara -se her -ri poll -ri ble -re took -raw don -prohib itive -pres sed -ply ometric -pic abia -peter j -ou thern -one ws -one ofthe -nw ambulance -normal ise -noise less -new balance -min ni -mh b -meur on -mel lowed -marat ona -mad hatter -ma str -lore ena -line ages -life ok -laat ste -jun jun -jhah neu -intelligen ces -inst ers -ini ketan -hu ddles -hool ahan -ha wi -gran ville -gor der -gh era -gang won -g oms -free taheri -f ctc -exoske letons -escam illa -ed al -du roc -du ller -dari of -cou cher -cliff hangers -circul ates -can tos -camp liberty -c aguas -bru ma -bri stowe -bodh gaya -ban ski -aze ali -au chan -anim alistic -alof thotels -alen ia -al ı -akh ter -' ?! -ı ï¸ı -âĹ ¼ -âĢ ¿ -ye vent -wxpn fm -visit causeway -victor yday -ver tex -ve ve -ve dic -un knowable -u scen -trot tier -the fla -the bottlemen -than u -tag e -t center -str ø -so xford -skin nies -sk inn -she kau -sarbj it -sam eh -saf ford -ru thie -reti rements -republi ka -rad stock -ra el -qui bble -porsche tennis -po ong -po esy -photo play -of thenight -not doneyet -ning aloo -ne ak -navy pier -mv l -mueller time -move in -mo hd -mnu kteam -mlscupp layoffs -mid line -mehreen pirzada -mariecla ire -lasti mosa -krat is -ki ev -keaven y -ir responsibly -ir me -inocul ation -indu bit -hu tter -hr x -herb als -hd fs -ha bib -gu as -graci ousness -fro myour -four ways -fly te -ey er -ever thing -ev agreen -ero ach -emce ed -embal ming -elis icki -dun ton -dow se -dg pup -ded wards -cornell feeders -ci elos -cal andra -ca shout -brü cken -bot z -blue screen -bet sie -be ene -b wo -asper g -ang or -*¨ *âĢ¢ -ðŁĺŃ @ -ðŁĶ ³ -ðŁĴŀ @ -ðŁĴĭ ðŁĺĺ -ðŁıĪ ðŁĴ¯ -ì§Ģ ìĦ± -xiv preprint -world views -wood fired -west virgini -ve atch -var as -u bah -tru eno -titan pride -thyl acine -team europe -teak wood -taver ners -tam worth -sy outh -stan zas -solan um -shrin er -sepp uku -senbob casey -sa the -rummiku b -rude boy -ripper street -prin ts -premi x -pp g -ph la -pen sami -pe ma -para professional -out weighed -or ce -onomato poeia -nu tini -nail head -n kp -mr br -min dof -meyero witz -menshealth mag -mccul ly -mat unga -maru chan -maharash tra -liqu igan -li ssie -kyyon voot -ko gar -kin ver -k xl -jon foreman -jay an -ir landa -insomniac events -in saf -in fraction -ic ps -hu el -hol tzman -hispani ola -haz uki -go ggin -get kahoot -g itter -furn iss -fuer tes -fro mmer -far on -er lich -el well -ed ney -dece ives -competi zione -cimorelli band -ce ats -caval ry -ca chorro -bu ya -binib ining -ber thing -beg u -ash gate -amicha els -amateuri sh -alanthomas doyle -Ĥ ĺ -æĺ ¥ -w das -vander burgh -us acycling -tu pou -trou ts -tor ben -top kapi -texase dm -t lg -sumb awa -sports zone -spill man -skun ks -shored itch -shi prock -schle mmer -sb k -ri ggle -reali ve -raven snation -raj pal -rais ingthe -pic eno -petco park -olloc lip -oh lone -o zi -o possums -news break -nc sen -national forest -mo doc -mar the -lucy beeco -lu ker -love scenario -love cats -longlive the -longh i -lildicky tweets -ligh thou -licen sees -levit ated -lesbian ism -ko ky -kla sa -kit bag -kill la -jonny bernthal -jobs act -jer ic -jam erson -ja har -ilove gay -hypochondri ac -huff po -hub ley -ho los -hamilton ian -gy re -gt ld -gou ste -go ren -gi gir -fri pside -flet ching -exp end -entom ophagy -ei agov -eh feuro -eas ington -e via -duke dumont -dat alake -d orion -cro ll -conval escent -conting encies -coloni alist -coal fields -coa homa -co tham -chol ars -cake boss -ber row -and win -ahon y -aene id -! ðŁıĪ -ðŁijĩ . -ðŁijĢ : -æľ ī -yu shu -vogue india -twin z -thought leadership -thaanaaser ndhakoottam -su bash -stri ated -str ats -skate parks -six er -sign alled -shel drick -sabin elisicki -r risd -panam aleaks -pan fish -pan cham -ossu ary -or sa -nr hs -norm core -nght mre -mt lg -mid section -metro sexual -memori alizing -mc get -marvin humes -mandi ra -mack illop -m ally -ler ato -le ik -lau raj -la violette -ko izumi -ko est -knight sof -jo ch -je sup -j pp -izquier do -is obar -im bru -i pra -hungar ians -hiro ko -hair transplant -gro bb -go global -ging ras -gi ak -gar st -gam mage -gali l -g sl -free thinking -et ches -ense mbl -eat right -e ski -dji bril -con fab -colle gen -chaseric emusic -chang ingthe -cha hta -cav azos -carri g -can bball -burt ka -bmw group -bio sensor -best team -bernie in -bar ona -as px -app art -ap ital -anhydr ous -angeli ves -alph ard -alped huez -aero india -ad jaye -. ðŁĴŀ ----- ---> -ðŁļ ī -yu liya -young stown -x bla -winter ized -wall ac -wak eling -vital voices -v sf -v endor -un foundation -ty coons -tw ende -trans disciplinary -trade speople -the jeff -the james -ten ko -tempe stuous -tau ren -swan seab -sun bae -su ez -su crose -sty al -stopp ages -space suits -shiz uku -sh unga -sex party -repar ation -reen actors -ree king -raym und -pre vue -parten kirchen -os se -nih director -naz arian -myo sitis -my vi -mountain tops -mar cial -mar cas -mar al -manz oni -lucybeeco conut -lie tuva -kur tv -kitt itas -karlo vy -ipsos mori -insu lin -in ale -how we -hav anna -hah nemann -hab si -guilden stern -gran dia -godis love -go viks -fru ity -free kashmir -fox nashville -fou gasse -flat test -field photofriday -fiaf arn -fiafarn borough -ey talking -entren amiento -dont lie -dis believers -din is -dick o -des met -daysto gofor -day star -d ilo -countryfile mag -co system -co ati -cle anc -classi fies -byo c -bun ting -bos stones -bon fox -ber it -bbc newcastle -bag ile -ay ani -avan tasia -ary land -ap ap -andalu cÃŃa -alyn n -all art -alder wood -afterel len -ðŁĺ ¾ -ðŁķº ðŁı» -åł ± -ãĢ Ĭ -wra ss -who re -we stray -watch u -villan elle -ve sak -tun er -tor an -ti ffin -thehistory guy -the boston -the ale -that sme -tg d -tele dyne -tal eg -tai fa -surf sup -steeler shockey -spart ner -small bone -slic e -san tucci -ro ces -reid sville -registr ars -reen acted -rad dest -quin one -pyroman iac -ps b -practic a -phra sed -petty fer -pete tong -peac elove -nikit ind -nc p -my horse -mira belle -mi era -mc gar -mal lik -mad woman -long way -l sn -knock knock -kick er -jet liner -jag d -jab a -instagram mers -hu tt -hi ji -h ts -game music -fang led -ex onthebeach -eller be -e ah -dv sn -dro gon -ded mon -dan scavino -da sty -cross field -cricci eth -commerci alism -col ls -ch c -cas ar -can im -can ball -cambridge utdfc -c whm -butler u -boer se -blow dry -bic hette -ay nrand -atis faction -anaesthe tist -af jrotc -actor sequity -ðŁķº ðŁķº -ðŁĴĸ ðŁĴĻ -âĹ ī -zi ii -you might -vie we -ver ie -u rad -tw afterhours -tro wer -tri aling -tr ono -tool shed -thermost atic -tessell ation -ta ky -star fall -sle tter -silver leaf -shra der -shannon airport -se dap -sber bank -sav at -sar aramirez -ror aima -reci be -ray ne -pro pre -pin i -oh canada -north land -ng cobo -modu lus -mis ka -memor ising -mbl science -ma pping -longu euil -lit eco -lee derville -leav ening -land seer -ki dero -jin do -jil in -hue hue -hon en -har har -green and -g tw -foodin dustry -fas lane -express andstar -eli eve -ek blad -ear marks -dwind led -doherty shannen -dism aland -di iv -del fi -dat aw -conserv atively -coffe red -cityof miami -circum navigate -chapp el -cecil ie -canad achat -calz ado -bra venation -bor chers -bell ino -be parto -bab s -b bler -ayo s -areyou withus -anto griezmann -amar cord -allarin aresh -abor tionist -!! ðŁĺĺ -à® © -zbig niew -zay d -yugo sla -wul ff -wotc staff -wn f -whit ish -w gb -ve ale -vas yl -udd hav -trin sic -travelwith kids -tou k -th yn -tele work -tan sey -tal ab -super wiki -stun i -sto ch -stat eli -so gn -sj t -simm ers -si bles -screenshot ted -scott grimes -schoolo frock -scar r -sc ahill -sali l -rpcrd pro -roc ke -ro gow -rel ton -refu elled -re cut -pro ops -phreno logy -persi mmons -pe que -pa shin -or za -op ier -north town -nan ticoke -n didi -mix to -mal ene -ma gh -lo vies -lo fted -lil loo -lac lede -khun e -kate moss -k msl -java one -jam elia -j lee -j allen -irkut sk -iner tial -house maid -holo fernes -good time -f pb -em mit -elon university -dun vegan -dannyjohn jules -cyber security -cuuu ute -confir ma -cn ni -cl ery -bul ked -bs thydepark -bio reactor -bbsr buzz -bar bar -b jo -az azel -az az -annou cement -activ ity -acar ter -Ħë ² -天 å®ĺ -zodi acs -yummy food -y omo -wild storm -wi j -wh ys -vu cic -vali k -u shio -u art -ty me -tsu kuba -te yan -tab ri -station ery -slo sh -ru ti -roy all -recruit ing -rav eng -ragin cajun -rachel wood -qu tb -push kar -play mat -pilgri m -pepp eridge -pat as -param edicine -om ran -ol uw -ok uk -ocean optimism -o bia -ny sc -num é -nicode mus -naz are -nap thine -mo tz -man they -ma kovsky -lox ahatchee -letsgo g -lebe dev -l rr -jan ey -inno trans -in p -i acon -hongkong ers -hol royd -hepat o -havi sham -h nn -h lr -gur lz -fish sci -fare ed -ez us -eti xx -dur yea -dulil lah -diy ala -come home -co ar -clear inghouse -chi bs -bringerof rain -brac er -bob sinclar -bo hl -big kid -bel ch -bar qui -automobi le -atta m -at au -app ley -abu da -ðŁĺĭ âĿ¤ï¸ı -ðŁıĨ : -âŀ¡ âŀ¡ -à¹Ģà¸ Ī -z ill -youtube ãĤĪãĤĬ -yoshi hiro -waynes world -visit somerset -vign elli -vamos rafa -usu sa -tat is -taj ine -sundaytimes za -sub t -sne p -si evers -shraddha srinath -short sighted -ser bian -screen savers -scou gars -sacram ental -rode mics -retrospec tives -ren tz -re focused -ran sack -ram anathan -pu pe -proven cal -poth older -plast isol -pan can -ome x -om us -ogun damisi -not for -ng oma -nel ley -ne yo -nassi b -my ke -mul lagh -modisar kaar -mmm bop -mign onette -mdcpss outh -mase ko -man ni -man gia -mal y -loun g -lign in -lar bert -la ska -k me -k acy -jyo tir -jur nal -joan smalls -hi rose -grand ma -good speed -ghe en -get syou -esc ala -ent oura -du art -di yan -devolver digital -der f -cuu ute -chen ab -cap illaries -bren d -bi mal -back wash -ato cha -ask acurator -ami sha -americani zed -aly si -alma den -abbi amo -aar hu -woolla hra -wam ish -von da -vo gler -un club -ty j -su ja -ste ar -sput nik -sol are -si rot -shal om -sch marzo -rev dr -rep joe -remor seful -rei ff -pum phrey -plain sman -ou tros -os ric -niagar a -nag ata -mo watt -meadow vale -maison objet -mad han -m lambo -m elly -lor ri -lom mel -la ding -kol k -kh ooper -kar nes -je uner -jane goodall -it oi -ireland cricket -in gho -hackett stown -ha si -falset tos -encom passed -em tee -doh kyungsoo -dig nan -dej loaf -de filing -datab ank -cu kor -chro mat -chocol atem -cannon balls -c crc -bromeli ads -bro xton -brian topping -bogdan ovich -bob st -bl ini -bin da -bet elgeuse -barqui simeto -back list -arnol ds -apple live -angu ages -american football -alo c -ago stin -af ree -af d -adar ling -ðŁĶ © -yemen cantwait -wis sen -wedd ell -war child -ver aging -vapori ze -v pk -the highway -ten ov -te ter -subsi ding -sensation alism -sa fir -rv m -rockthe vote -ray lewis -pulitzer prize -promis cu -princi pally -piñ as -photography islife -pap in -ou ps -once in -ogie alcasid -ny dn -nvi di -ni fl -neon ates -nab ba -n mh -mytop college -mv sales -min ako -mean wood -mck is -mb w -mayo red -marka very -lub bock -le itz -lav ina -kope cky -ker in -herbal medicine -helen s -hann ukah -gor ged -glu z -gin ther -ger sh -ger giev -gener alization -gean inec -forthe soul -fin ds -dream girl -distracted driving -disrup t -digital disruption -dewor ming -der m -demer ara -de vey -dad jokes -dachshun ds -commiser ations -chi kar -ce z -cay lee -carbon aro -cam bro -cal verton -brezh nev -boost torbay -boo b -black power -bespoke bids -bear naise -bbce mt -ballant ines -awa is -annul led -alber tac -ak ul -acompan ies -ðŁijł ðŁijł -ðŁ¤¦ ðŁı¾âĢįâĻĢï¸ı -åħ ´ -âļ½ : -ØŃ س -в од -ya ari -world downsyndromeday -wor mer -wol fy -westandby parth -wait ressing -videover anomtv -urru tia -united health -tele porter -sre invent -snow ball -sky fire -skowhe gan -sc upper -sa amy -rush ville -rim shot -ri fai -recording artist -reading is -re framed -rakuten ichiba -racing club -r nz -presidential debate -plant in -pe dra -p ck -ornel as -opho res -nikitind heer -nakshat ra -na fe -muss orgsky -mur taugh -multic loud -multi year -mp sf -mon amour -mat ri -maidstone united -luc u -ko x -kkun dra -kerman shah -keo wee -jan ee -inck arnataka -i day -hu se -her sham -hal bert -gru y -gre asers -glynd wr -gali on -front pages -fear gal -fac ie -engel berg -du wamish -downtown halifax -dove dale -dibuj ando -di kes -consomm é -con der -code black -clu broom -class icist -circle app -chrono logically -chef stable -cere bus -center fold -bur gi -bir do -bin z -ballo ting -aron off -apple ton -algi eri -alev els -ae gina -! ðŁĴĻ -ðŁļ ¦ -ðŁĺ®ðŁĺ® ðŁĺ® -wine fair -wed lock -want sto -vol ler -vir tu -vil ify -value of -v dr -under takes -und pasiapac -un collected -top flight -tibi dabo -the point -sym monds -sub sonic -specialk brook -softg els -shi val -seid man -sand lin -san francisco -sam per -ruk mini -ru ma -rm liga -ri as -remember anceday -rachel riley -qu bit -pan elli -osteo sarcoma -or ay -ok mulgee -my god -mine shaft -mickie james -mess ines -lleg ando -kre y -king ery -ke tty -kawak ami -juli ac -jab harrymet -interchange ably -inter continental -ic lass -hyper hidro -hr zn -hijab s -head butted -hal sman -hal it -gu uu -gor m -gon iners -gar ris -game dev -fuji yama -fish sketch -fin bar -es rb -endaken nytd -du h -du el -deflec ts -corvet teracing -clat ter -cheese day -ca edchat -burton albion -broad meadows -brigg ate -bornfree onekiss -bor rell -block screening -be xt -be ddington -be ason -bati stuta -barnold swick -av d -ashi q -andreali bman -aman at -alu mp -alek sey -alcac er -ðŁİī ðŁĴĻ -ë¦ ¬ë -ãĥ¼ãĥ ī -âľ¿ ) -âĵ ¥ -â¬ĩâ¬ĩ â¬ĩ -ಠ¶ -worcs warriors -woodbin eracing -wherei root -warne münde -vy apam -vis co -ve dan -ve asey -vacation ers -us iness -tr illing -tony todd -tant amount -sydney storm -ste bbins -ss rc -sport sca -spic ey -south shields -snow bank -siriusxm nascar -sham n -se et -scot lands -sac chi -road show -ran king -rajiv pratap -rajivpratap rudy -poe sie -picto grams -pahal gam -pac y -ou bre -on oda -o ey -nil son -mill in -mi w -meridi anc -medec ine -lu tion -life ok -lasc aux -lal ah -king let -k sed -joh anne -jamesdro driguez -ivan ova -io ane -in y -ill inim -ibi zar -high town -head corn -harman preet -ham amatsu -gol ondon -gi andu -gavr ilova -game keeper -fuel your -fil ename -fficial site -etsy store -epidemi ologist -d bu -crim minds -co loc -brooklyn bridge -british ers -bour nes -bo sv -bio availability -bet ina -bell anai -band ini -bal at -alma z -... ] -ðŁĴ«ðŁĴ« ðŁĴ« -âľ ¯ -¡ ! -yudk bh -young sville -wh h -wear thebear -tp gallery -the drummer -terrac ycle -team natural -stri k -sofe vil -soc dems -sn pout -sil as -she aly -sh hhhhh -ser ape -sandiego zoo -ribo flavin -remo delling -refin er -raft beer -proud sponsor -preci ate -politic ised -pi um -phone tically -phantom ofthe -pdx eats -paint box -oon light -ome one -nz stuff -nu o -not all -no st -new bedford -my nach -mr sk -mom os -miguel ito -middle ton -mic r -metal smith -mar gi -mac c -lovenorth devon -lo lu -lin tz -leav ell -la thes -ku gler -ke ssel -k sd -jugger nauts -jn moyo -hu ie -ho sier -haz rat -ha vil -gaz elles -fet zer -fall s -eu cerin -esp ad -ear plug -dress age -dispos session -discover hongkong -dior amas -diesel gate -di ener -di abolic -den y -crypto zoic -cor tez -coa stuk -clive barker -c ays -breathe carolina -breakthe taboo -ble ating -birthday wishes -bar don -avox el -apho tos -ak ka -ait cofficial -after birth -@ ' -ðŁĺŃ âĻ¥ï¸ı -ðŁĵ¢ ðŁĵ¢ðŁĵ¢ -ðŁĴķ ðŁijij -ëĵľë¦¼ìºIJ ì³IJ -ë§ ¨ -виде о -we it -vest ager -un managed -un coordinated -tol ga -tin at -tat er -swash buckler -super mini -stra wn -sten y -st ura -spo ked -skiat ook -si phoning -she diac -seraph in -sang oma -san h -sag rado -ro td -review journal -replac e -ra ia -questi oner -nor sk -nene h -nar k -mole fe -mod sun -mini on -michel ine -men deley -martin son -m grs -luxuri ant -lt da -lig ure -le we -latin x -kish twar -kind afunny -kas kus -k assem -jewel staite -jag meet -ib r -i ut -hoo pes -hol on -here tical -henri bendel -hel lions -he sham -hatch backs -hammer fest -ham taro -half on -h bday -go abuzz -glaci ernps -gen evi -gau m -fn ma -fi rel -eric ripert -e ec -doo kudu -dfat irl -cou pla -cork citycouncil -colombi ana -camp sie -cal co -bride well -bowery ballroom -bj arke -bhic how -bb g -bare foo -baby wearing -at unga -asimb aj -arab y -ali velshi -al pines -ago today -abou tit -ab ff -ðŁķ ī -ðŁİ¼ ðŁİ¼ -âľĭ âľĭ -âĢį âĢį -à¦ Ń -ü ber -à ½ -y shop -wwe chamber -women inthe -war lick -vik ash -vid hi -veik kau -val vano -val son -tune core -sunny dale -ster ry -sk nonline -sil sden -sh ene -sestri ere -sensiti ze -se amount -santo ku -rep ented -raj shri -ra ir -prof jnmoyo -po grom -planetofthe apes -pine au -per centers -pe dder -our city -official y -o ib -nis se -neversay die -ne tro -national museum -my data -muse tte -mon ach -miumi u -maur ic -ma ska -le mur -krakat au -kid swear -khu zestan -jam min -inde sit -iah sfb -heroes reborn -hal awa -guin nessi -grow ingu -gregor i -gost kowski -go dess -gi ac -gh orns -geme ente -gaj endra -fer no -feliz navidad -farm hand -f illion -excu sing -excer pted -eno teca -emo to -du puy -dong feng -devin book -datab ricks -dar yn -d formmva -cri so -crew member -con genial -comple xions -cine phile -cer ati -cap tu -brittany snow -bree den -book snaps -ati mein -ari hant -ange bote -anatom ia -amylo idosis -air shows -acam era -... ðŁĺģ -ðŁıĭï¸ı âĢįâĻĢï¸ı -ðŁĩ®ðŁĩ ¶ -yam auchi -wo su -witcheso feast -whor se -wan del -tree beard -tom ek -thre f -te end -sympathis er -sunday fishsketch -selfiefor nash -sei denberg -sa or -ro throck -rin do -re taken -pressclub dc -photogra p -persecu ting -pepp adew -o ves -nmb co -nick lin -ni ese -mthe thwa -migli ore -mi gi -mbalula fikile -matt miller -mal ory -kuber nete -koin onia -kil syth -kcaf av -kat ong -karun chandhok -jo stling -irreconcil able -insi den -in h -himan tab -gur gling -gh ole -gashap on -fun chess -fraser valley -fozzy rock -fer rata -f wt -elec tra -dir khooper -din akaran -denver nuggets -dal ecar -ct gla -corbyn besson -cap gemini -by any -bull pup -builtby bama -bix ler -bi xi -be ma -basketball er -ballo oned -ba bey -arm wrestling -angi oplasty -al astor -ðŁĶĬ : -ðŁĴĹ ðŁİī -ì¯ Ķ -ì ´ -æŀ Ĺ -æ ½ -âĺħâĺħ âĺħ -yi annis -video taping -va stu -us ury -uhur u -tor tuous -the conjuring -te bet -tar red -t swana -t jo -sy lar -swim min -swach hata -sto ats -statist acharts -stag gers -sher rard -sever ide -sekh met -sch ad -saved bythe -salvador dali -reve led -re convene -rah saan -pu lao -pla ga -ou lou -onenation oneteam -nick swardson -necess itate -muth oot -mo at -mis calculated -micro bus -metal blade -mel uck -megan boone -magic avoxel -m co -lo hia -lindsay arnold -li ub -klu gh -jant zen -jacob o -intar sia -herald hs -he ikki -he eling -halab ja -hahn dorf -glend ale -frederic lambert -france fr -ewn updates -essex wildlife -en m -elabor ating -eco village -duck y -de beers -da rell -cypri um -cycli ste -cha sen -capric orn -can ute -boston heraldhs -book making -bing es -bike week -best coast -benven uti -bayern munich -bath sheba -ban yo -ayanna pressley -ay b -autun no -au ria -and chill -alyand fila -ah hhhhhhhh -a history -wild turkey -whit el -whi pps -weare acmilan -wat rous -vo z -ver nors -ve res -vas arely -up un -un classified -tul lius -tide way -ti soy -summer underthestars -shil le -share holding -sd xc -scor ch -rady r -ra ki -q pcr -q ip -pla sa -peranak an -pel as -osh un -or oro -olemis sbsb -newsad l -newfound glory -ne vo -naku matt -n bar -music by -mon dragon -mo tus -mith ali -mil onga -mich ed -mer ril -marvell ously -mar da -m razek -lin stead -kn auf -kla k -khu l -kc na -july talk -jiang xi -jenny han -jennifer aniston -j aka -inter lake -imam hussain -ik f -hell en -h wy -goodwoodr rc -go thers -gen ny -gad dy -g ph -flu ttered -fle abane -fire land -fact set -exhal ing -en ders -dor ada -do gon -cow abunga -country house -car ledwards -breastcancer now -borgh i -bl att -be sler -be holding -barba dian -bab ita -b hind -avro homg -asan sol -aro sende -ar ps -anastasi ab -al aga -af ur -= _ -ðŁijij @ -íĻĶ ìĸij -âĿ¤ âľĮ -⼠´ -you loved -yol ande -work ington -woody allen -wingless bird -wi wa -west wind -utcoach jones -up tv -un completed -tomor ro -tiny tales -thomas gibson -the baby -te te -te jon -stu lts -stra ker -star pass -sole us -so wski -snake head -shi amak -sfor change -see whati -schoen feld -s jam -roman ovs -rodri go -qui zon -que vedo -pre cap -pr ze -phil tufnell -pew sey -par atus -om gtr -neid hart -ne ad -mis shim -mend ham -marav ich -lv phantoms -luxury watches -low ens -logan lerman -li pson -leg no -kir schner -kang al -hurl burt -hornb ills -har ting -har bou -hage dorn -gop tax -gondol as -george washington -ge an -ep sa -du gger -do woon -dar ning -damon albarn -cri swell -cli ppard -chi ens -char ya -cas selman -ca etano -bé ry -bo ch -big wigs -bie ding -besse tte -berser ia -bel ton -bel lar -battlefor azeroth -ats community -at rice -asroma en -artic ular -art lab -ak mu -abstr actions -. ðŁĮ¹ -(( ((( -ðŁij¹ ðŁij¹ -ê² ¸ -ãģ µ -âľĶ ï¸İ -⬠Ľï¸ı -à¹ĢภĤ -y cl -x lii -world congress -v rain -ull rich -ugg la -ton the -toi res -tay ong -sumb astur -stein way -si rene -sd nd -sand ar -sam mer -sal mons -saint laurent -roca wear -resist trump -resi stive -rca records -pend ent -official s -nz l -nit ourist -neuro pe -nat alee -my sis -my l -multi plexes -more mi -mir ó -mil ose -migr atory -men fashion -medi afreedom -mad ilyn -loft is -lan ghe -kunun urra -kum u -jour nee -janine gutierrez -j cl -iro h -ig travel -hotstar tweets -hotell v -hor t -hor no -hehe hehehe -hard bound -haras ser -hahahahahahahaha hahaha -graci as -gla sse -gar ys -gan grel -gal eng -fre sen -exploren b -euthan ize -dy m -dragon lance -discla imers -dialo gue -dees nider -de sco -con fla -cio online -chel ps -c mr -bu di -boo ke -bo so -aure lie -anni ele -ang ill -al bomp -aber ger -__ _. -' -' -ðŁĴĺ ðŁĴĺðŁĴĺðŁĴĺ -اÙĦ ص -yu taka -yever after -will erby -wccb charlotte -ver tices -utic acomets -toast ers -thiop ian -telepath ically -surplu sph -sun nin -sun dew -srabanti smile -spectro scopic -spe icher -sorcere rs -smc gee -skin ceuticals -sk out -scy cles -sch ans -ru tile -rang anathan -quadric eps -q com -pur pp -puk kel -praise worthy -pipp ins -phar ms -pd h -p lied -or ser -obscen ities -nu bar -new sch -n vs -multip lies -mu lders -mo ye -mo gh -mil nerton -mikeo hearn -michi gander -mer rit -mens grooming -media works -meand my -ma hr -luc kie -loy d -long acre -ligh tin -khali f -key to -kauka una -kam is -john m -jack ers -is se -irri gator -i backthebirds -hunter pence -hin cha -hempstead town -frontline pbs -from target -feren gi -ethereum classic -elder care -east grinstead -e com -du pre -di i -davy hulme -dan ity -d kc -chaud huri -charlie chaplin -char trand -cap ing -cad air -bran ton -bordel aise -bat ata -basti ons -bas al -az uka -az mat -az aar -as ug -ar wa -any an -anglo saxon -agh at -aber dour -اÙĦس ÙĪØ¯ -اÙĦ Ø¥ -yyc flood -yis roel -yeou ido -women writers -wing stour -wi they -wi ddle -war dak -virg ilio -v bi -turn ham -trety akov -to taro -to gashi -ti y -through glass -ther isk -theli ons -thehockey india -tay ang -tail gate -swar ovski -sus bureau -support thearts -su ol -staustell brew -star dew -spart ners -seque stered -seal team -say yaf -sam ovar -salford devils -ren tacar -re ding -rc pi -pur year -prophyl actic -prati bha -pi anom -photo electric -pan icky -pan et -pak is -pa ree -outaou ais -on up -ob noxi -o sso -national voter -morphett ville -montreal ers -minu tes -michel rou -mi thi -lu ps -lot tie -loch nagar -lf cladies -letra set -lemu ria -le ber -labrad ors -krish nad -kint sugi -king shead -king bird -julie benz -jualan ku -info sec -in trust -head shot -hagu pit -gest uring -gav en -gar de -fan boy -fail safe -eit our -dri o -dou dou -cowboy bebop -confeder ates -che sty -char ros -br inda -be etham -bagh lan -azi oni -ator onto -art fight -ai shi -ag ot -ðŁĺį ðŁİ¶ -ðŁĴħ ðŁı» -ðŁIJ Ģ -ãĢĤ ) -ç al -zoon otic -zol ler -yus of -wre ath -word cloud -west woo -vo gu -unic ycling -un shaven -u toledo -tsu mt -trac ie -top spin -tn luk -tar ghee -tabde eli -surab hi -su hel -st assi -ss ants -spoo kiest -sh c -semper sum -seig neur -schloss berg -sch alk -sal ton -sal terton -ry x -rulesof survival -rhy mer -re iders -razorback fb -ragha va -q bert -pro logis -pre ethi -pown ers -pied mont -pat mccr -pais ano -not l -nith yam -nausic aa -nar anja -naj ma -moon shadow -min di -m musi -m bio -long ings -li geti -lear ner -kett ner -kc se -kal m -kad u -intru sions -il th -hu ka -hachette aus -guy verhofstadt -gre ts -geminic at -galli more -fru ta -fri joles -free holders -fli ghty -feld stein -feather ston -farne islands -far cry -er ite -el ss -eg is -eee ep -du ping -dr anger -down tow -do xx -destru cted -den ge -del h -dd ale -cor vi -cog ito -chi des -chauvin ism -cha ste -c ssa -burgun dian -bri ga -bill ym -ben ali -beau ti -bear doil -attitude mag -at ca -an den -americ agreat -alo e -ab ele -aay yy -a und -a bean -- > -ðŁļ´ âĢįâĻĤï¸ı -ðŁijij # -íĻĶìĸij ìŰ -íĸ Ī -ãĥ¼ãĥ ī -yun que -ya as -y are -x country -world cu -waccam aw -visit europe -vad m -trau main -tot c -timess qu -tier garten -teaser tuesday -t fx -stro em -spacec amp -space jam -sot tawa -sor pren -son nier -soff its -sne tt -slu is -si bel -sheir gill -schwar zman -saltim bocca -ric ken -reg bo -re structures -r np -pukkel pop -pan ta -outdoor sy -oro chi -oni des -nutri a -nau ti -mrbr tg -monsterhunter world -mo ten -mal ahat -ma shre -luen ell -legen de -kr circuit -khilaf ah -kan aka -jo sa -ind berg -illustration hq -iam episd -hr ke -his ashi -hill yes -high fashion -hello world -he g -happybirthday ntr -ha worth -gre if -goon squad -gold tone -gold star -give me -gand onor -for tum -ea aci -e iti -dunnott ar -du mmer -drum step -depre cation -dan carter -cron os -crank set -cr èche -corregi dor -con lee -con cannon -clar kk -cla sps -char lot -casi raghi -bobby brown -bl andy -bas shunter -back round -at fc -ary a -arti stre -apple tini -agye man -a are -\(´ âĸ½`)/ -ðŁİ¶ @ -âĺħâĺħâĺħâĺħ âĺħ -à¨ Ĺ -whitley bay -wall coverings -vec chi -vang sness -vali ants -v ayu -tro pang -the asian -tham iz -texastri bune -tangi ers -sul le -ss rtg -sne inton -sho dan -shep stone -ross ouw -rob brydon -ram boll -pro co -plat ine -pis cis -pier ref -pc mc -oo z -on call -ol er -nak z -megaz ine -mayan smc -ma dusa -li mca -lang ston -la chance -kon z -kitz bü -king solver -jo ell -jab o -j ji -iren se -inas al -iam an -hat chim -hack learning -gé rard -greenbay packers -gr ms -gin ty -ge sti -fl ori -fid lar -faur é -fair man -ero ads -edd ard -dex trin -dem force -d weeb -cl ann -charlotten burg -cell block -cav usoglu -buchen wald -bru tali -bra zy -blo xham -ban ja -bak ri -baj al -auntie annes -ali us -ahar on -adop tables -actu ated -ab ct -ðŁ¥ ´ -æ ¹ -zi jn -zeis slenses -y oooo -y net -y gk -wy nette -weather watchnz -wa chee -voil Ãł -un dit -ty bg -ton ig -thisis me -thing sexpo -thegop jesus -thegentle author -ter mini -ta eng -sylve stre -stmartin spress -snow drift -shell harbour -sab ia -riet veld -retar dants -photo frommyheart -orator ical -noki amobile -new art -nescaf é -nc cs -n ades -mon gre -mini x -m chi -long sight -le marche -kre tsch -kin olor -kan za -jar rah -jag nation -jack theripper -j florez -iz on -instagram med -imo gene -hurst ville -how led -hazbin hotel -ham monds -gu ston -golf life -foursquare find -fig lio -f gv -em mag -drink up -downton pbs -demel za -crisp ness -country radio -consor tia -colin dale -coal mine -cine mat -centre town -capric orns -brook ins -bridge stone -bre k -bea vernation -bav aro -bak ary -an die -ðŁij Ľ -ðŁij · -ê Ń -å¹ ³ -zu sak -wi des -web ley -twel ves -ton it -thereal elvira -tha ws -tab uk -sun stroke -stand tall -ssi p -ss music -sp angles -so bre -sj r -simone tti -sim ha -shoe horn -shak thi -scientology theaftermath -sab lefish -sa inik -rsc anderlecht -ro ser -rick warren -re er -ra zo -preclu de -pr iti -por chestra -pen i -pap al -pal lete -ori an -or acing -ob h -na he -mol l -missi e -mis se -minic lip -meadow view -mcga hn -mazz u -market news -mar re -logger heads -lin deman -lear nin -land less -kur si -klo wn -ker see -k ichi -k hia -jul lien -jon gh -john mccain -jaw ani -infor med -ine se -hob nail -hi y -har jit -h sb -gent lest -gali lean -g ili -fli xton -fleisch mann -fivb volleyball -f ants -ey rie -eurovision songcontest -er gs -el bit -eidul fitr -edir ne -du man -du das -dis quiet -dige sti -dest itution -chim ilco -cep has -burjal arab -bur stein -bor da -blo hm -black hole -birthday gift -bell ona -bee zus -be aker -bam usic -ar nation -angler fish -ame era -all indi -ale kh -air india -acar penter -ac ffi -â¬Ĩï¸ı â¬Ĩï¸ı -wother spoon -wo kv -wit nes -vi aggi -van k -va ghani -thero ses -tam zin -t yo -supportsmall streams -steven j -speci alo -shaun watson -scap ula -s notes -rap music -precious metals -pic asa -p alla -op ara -no sta -neo gaf -ne un -nca i -nam ibi -min z -me thi -me kka -marse illa -mari ette -magni fies -m lo -le akes -latel ate -lat avi -kumar akom -kruger sdorp -kla ss -kinolor ber -kaz ant -kat usha -ity live -info arqana -in justice -i bt -hyun woo -hoom um -go alie -gly cae -gastroenter ologist -fa ite -epi graph -elast ics -e jo -do ernbecher -djer ba -dis engage -d ve -cu ria -courtneym elba -colin mochrie -co stain -cic lo -cher mside -chad lindberg -candel abras -ca dem -brooks bank -brandon j -bo sques -blood horse -bior xivpreprint -bi mmer -babe station -b side -ase ball -all dev -af fric -acon v -ðŁķ¹ ï¸ı -ðŁĩªðŁĩ © -âĪ © -unitedwe zag -uch t -trac ibraxton -tl railuk -ta oris -syn cre -sto kers -spind le -skop elos -sibusi so -shu bhan -se bad -sam po -receiver ship -re ats -puertor icop -prae torian -pe tanque -paul gallen -p sap -ox ic -out gunned -on io -odi sha -nur mi -nun avik -nicol ae -nag ini -mou ski -mis appropriation -min oc -mi mmo -mi mick -lar o -lanz ini -kirin yaga -khair ul -kat lyn -kar ne -job hunt -jack lyn -imperi alists -immobili zed -ie styn -i xl -hot mess -hey don -hat illo -hardrock hotellv -got season -gon etoo -go id -gare y -games youloved -ga stric -france schi -felden krais -express ways -el yar -disbur sed -dareal amberrose -d agan -clairec mc -centen arians -cam girl -big sky -ber u -bar rack -ap rakash -and tvofficial -amé lie -aman ah -am adi -aller ia -ah en -acffi orentina -accep tability -ac ct -ðŁİīðŁİī ðŁİī -ðŁĮĢ ðŁĮĢ -ðŁ¤ ² -ðŁ¤ ° -wor ley -wood mere -way up -wau conda -watch mojo -vo h -victori ana -v aga -uy gur -up skill -unitedwe win -underestim ates -u ppi -three houses -thinku hi -te ms -switch to -swee ty -sut tie -strathe arn -space bar -south tyrol -shi rou -save dallas -ruck man -ru zzz -ro stam -rj mitte -rex dale -ratch ford -priv ates -pol sky -plata forma -permanent makeup -pa eds -or ph -or donez -one m -nordic walking -nederland se -ncaas occer -national isation -nan ite -nam ita -movie time -mo kka -mary portas -mar len -ma icon -ma gui -lo chal -lo bs -lieu t -learn lap -kur ma -king snake -kee sha -kay an -kak ak -kab am -journe ys -jonmitchell itv -ilove travel -il g -hunting don -house dems -higa shi -he ade -h dn -golondon knights -gir ton -freddy krueger -fre md -fe dez -er land -enqui red -earth wind -ear dley -dove tails -diet coke -dews bury -delici osa -de go -cycl in -cy g -cur ri -cho sun -camoufla ging -black sheep -bch l -bay bridge -b chat -av ag -ameli a -am ami -agne epath -ðŁį» ðŁİī -ðŁ¤Ĺ . -z dar -yl enko -yak u -w canada -triumph ing -tre p -thi rai -ten aya -sty lec -stren ding -sq rt -sm day -si ran -shi zz -sher itage -sh after -sf opera -say something -sanctimon ious -qay yum -q ft -proc tor -prenup tial -pocom oke -phili stine -paren tage -pap ago -pa ke -over winter -ot suka -noah syndergaard -ne bel -mukun d -mif sud -manic ure -mac bride -liverpud lian -ken o -just inf -jeke vaaste -jan jua -j anny -ib ma -i ello -hermosa beach -hau gh -han ak -gum midge -ge table -garden party -fur rows -free way -fashion addict -farqu aad -electro acoustic -ekdu jekevaaste -ds ville -dor ling -do sages -di ye -dan gel -dag ibee -crypto exchange -congreg ants -bus u -bulldo ze -britt le -bi f -ay ner -auto sports -ase d -as ka -amazon basics -ag ir -aa ve -, ..." -ðŁĵĦ : -ðŁijį ðŁijĬ -éĻ ¢ -zoro astrian -yofthe year -writer sofinstagram -wick enburg -whittle sea -whites boro -vide oc -un ction -umass boston -tho de -thibo deaux -ther ick -team trudeau -stol ler -spec tra -rush en -rose s -ram la -race goers -pre cursors -pra ful -poke stop -po vo -park hotel -ontariop cparty -oj ha -o ca -nou is -new al -neg ated -n ase -my heritage -mour ner -mit is -met so -mb achelet -mayor an -manning tree -mand ing -m hall -lu ong -love jo -li therland -le vent -ku hoops -koop man -keepit real -kap iolani -jjig ae -in costabrava -ic ss -i vin -hun n -hu tter -ho kies -halvor sen -for victori -fas ching -f itur -f ady -er gon -desic cated -cow ls -cho lec -cho ix -cash more -cal om -bush y -burn twood -buch man -bb fc -arn ason -aph ili -ai man -a stri -ðŁijıðŁı»ðŁijıðŁı» ðŁijıðŁı»ðŁijıðŁı» -ðŁİģ ðŁİĪ -ðŁİ ĭ -оÑĢÑ Ĥ -za her -z wick -yar de -wi gley -w ys -unit eds -un satisfying -un pasteurized -tz aneen -tur bom -tre en -team mtkglobal -ta fo -swan igan -survivor man -surfl iner -storme mma -stin nett -steve kingia -shri veled -sea bee -sak halin -pizz eri -per gam -orland i -o tras -noti f -new business -mis representing -matur in -malag acf -long neck -lo thes -lo tf -live atthe -lat ed -lace wing -krysten ritter -keyshi acole -kany on -k ys -k pu -inve rell -inde terminate -in anda -ill iterates -il icon -iam a -hydr ator -hu uuu -house uk -hm recipes -gra zes -gior gos -frame set -faren thold -er roll -dukin field -du lin -dor dt -door knocking -do gie -dj d -destruc ting -dapper laughs -crow ed -collabor atory -coel ac -car lino -bun mi -back handed -as see -arty originals -afell ay -ab bys -a yoo -ðŁį Ī -vin it -ur an -tu big -tri stes -timmerman seu -terrori stic -tant allon -ta ward -sub h -steph y -skull cap -simon shield -simonshield cars -scho o -saw bridge -ra jani -patmccr orync -par cells -p band -oun ie -oc md -non nie -movethe sticks -me rel -mar galla -madd alena -lef tism -kr be -kassi an -jugg lers -jam ai -itv lorraine -itson us -inhib itions -impe des -hou lton -h te -gov con -gondo lier -galo shes -g pio -fox hall -followyour heart -florian sem -edinburgh fringe -dre ssy -do et -digital selling -d boss -crazy sexy -cou lom -cost asunglasses -competit on -co zens -chri slo -char o -ce cafa -brisk ly -bol aji -bill ymiller -be edle -bad things -bab yy -ay se -ave ley -aun or -au pdate -artofli ving -anno ck -amey er -ðŁİ¸ ðŁİ¤ -ðŁ¥ ħ -âģ ¿ -wysi wyg -w dg -veri dge -vai zey -transni stria -tom mison -toi les -team db -tang an -tam an -swim mingly -super heroine -sumr all -stein ke -stall ard -stag nate -spind les -south african -sig ils -senti do -san sone -sacri lege -ry mer -ru sses -republic anism -repe als -re mise -ra uma -portre ath -phi leas -paras ail -oney oung -occu pied -nur haliza -noisi est -ni antic -music videos -mr tt -mob psycho -mo phie -michael hyatt -med ju -materi el -mat tar -mar shab -m go -loth ario -lock sley -lau ter -koz lowski -ilustr ación -hal lion -ha ddin -ha bs -green shank -golmaal again -gav riel -g auth -ft as -foot lights -fictionalcharacter si -es guer -e zy -e spectacular -directedby women -dervi shes -del lave -davids ons -d tid -congress h -conceptu alizing -cape epic -cam es -bung ling -bre arley -bhan ush -bengal fc -bbcgoodfood show -aussie wine -as pera -arti um -arro gate -arac eli -antonio selas -anthrac nose -ameri prise -am man -ðŁĮº ðŁĮº -æ² ¢ -âļ« âļª -zephyr teachout -youth fulness -yeh hai -wit trock -wal dau -verbi age -valenci ennes -us nist -usnist gov -un ambiguous -ty red -truetothe blue -tom coronel -thimpact music -tek tronix -teab ags -tanu garn -st apes -spo cus -shor r -sand box -salesforce tour -saint louis -sa hra -pic ken -personali sed -peri gee -par ky -par cc -pand al -onna ire -national triviaday -nas co -n pd -mp ca -mis interpretation -marinas diamonds -mar am -mac callum -lyric al -loo tera -live stock -lev elland -ko zy -klin ik -kat onah -karanvir bohra -k nave -k mw -jewelry designer -j ør -it ami -ira i -inde p -ill in -id omeni -i eper -hong kon -ho chul -haw ay -happis burgh -hal per -gu ji -grobb elaar -gar gamel -gan sett -fi bber -festival season -fem min -fate grandorder -fac ademy -expos itor -ela unch -dun don -discre tely -de funding -de bono -dayof service -cringe y -com enius -chun king -chou pette -chance hmiller -ca key -bottle brush -bhu mika -bewilder ment -better world -ball park -bad tam -avo d -al cin -ai mi -abud get -/ \ -æķ ı -zuc carello -whack y -westy orkspolice -westmid sfire -wai spr -uje res -track ball -tinyrebel brewco -tej pal -sw coastpath -su ku -su god -stress free -sterili ze -stake out -sm show -sini esta -sil ove -shel duck -sensu ally -scott zolak -save therhino -sam vad -ry ant -riz ky -ri sed -recompen se -ra kers -r ml -pitney bowes -pic ally -pet smart -peri stal -penrhy n -pap anasam -ol fi -ok ello -nor den -nl h -net worker -nano wires -mön chengladbach -muck le -mu sser -motorcycle live -micro structure -me soli -mclar ty -lolly daskal -len sky -leather wood -la sing -l ancy -klu ge -khar ghar -ke zar -kar yotes -kal er -jag at -j twc -in vision -hydro chlor -hockenheim ring -health sci -gu anab -green wave -gods girl -go argos -fur ugby -execution ers -est v -errat ically -eric stonestreet -engv all -egg leton -du um -dramar ama -dor gan -dok tor -de mexit -de mas -cu mmer -cryo em -cric kla -concier ge -char dt -cafe oto -c illian -buy local -bro glio -bol z -barnes ville -au tol -athle tes -asimbaj waispr -arch ways -anglic an -ane ja -aedilhai mushkil -advoc acy -adamm grant -ðŁĶ¥ , -zak is -young bloods -yam ini -work man -war danadi -wardanadi adwala -up mc -tric are -thanksgiving day -ta ches -sydne yleroux -sw c -spin ner -sirot kin -silver sea -silver fox -siberian husky -si fy -sh ac -sali endo -roman os -roble do -ro hani -rival ing -reu ther -re uss -re make -ravin dran -quil len -perpetu ation -par apan -ordin ate -or ski -ol um -ol ave -ohl draft -ogc nice -o hy -non conference -no zze -ne wald -my nydd -mer folk -man tell -main ec -mae us -ma sel -love cork -likk le -lich tenberg -leeds beckett -lee za -leaf less -le det -kott ke -kno wer -ki wa -ker im -kel se -k flay -ju uu -ju tanugarn -is me -ink blot -hoag land -he an -grou pm -gol fs -fur n -franks redhot -fj ell -fabul ousness -ever long -dv n -dra enor -dopp ler -distur bia -dirt track -demp sey -dam ini -cracker barrel -con ation -cinnam inson -chin nor -cau d -cam pos -bro ga -bor re -bh b -as under -am ine -alab amians -ak wai -afton bladet -ad alovel -acci ona -ðŁĺĩ âĿ¤ï¸ı -ðŁķ¯ ï¸ı -ðŁįº ðŁį» -zab bix -yot suba -x xix -wego hard -vivek dahiya -uver world -tro ad -timp ano -tel is -sper oni -son uk -sm f -sig gi -shrie ked -school supplies -scho on -san é -s dr -rust lang -roden bach -rock art -ro sac -riseof rest -realdj premier -ra thyatra -qui ds -porthcur no -polk adots -per io -penguin books -pe pino -pdx now -ok ays -no em -mosk va -mis ms -mcgill is -matsu oka -man zoor -lu tter -lis ner -laser scanning -la chaise -ky tv -kim s -kendra wilkinson -jessi ej -hygro meter -husse ini -hu ub -hockey tv -h ba -gui der -gb d -gagli ardi -fio rella -fel tz -equal it -eco schools -eaton ville -dou ts -dou mbia -den holm -coer ce -cli mat -cardio id -campu slife -bot an -am oureux -ðŁĶ¥ ðŁijĮ -ðŁĩ®ðŁĩ¹ ðŁĩ®ðŁĩ¹ -æĸ°å® ¿ -yam al -y strad -y pr -writ enow -wish meluck -walter scott -wak il -uf bugs -tin ney -the box -thanks dad -th ung -tat ort -ta issa -swi vels -stormb orn -sk ai -sig int -sad diq -rwen zori -rudol f -reck itt -ravens bourne -profit ably -pro mes -po go -placido domingo -pit ons -pim p -pic cin -peter tatchell -pedre ra -pay rolls -objec tifying -nj dotcom -ne j -mol ca -mini mizer -mc nicol -mc are -mat they -mahi eu -ma isons -lyn nette -lo ssing -lat form -la khan -kr ama -kent ico -kahn awake -k lax -jit ney -jazz wise -is king -inver leith -inst ad -ib ile -i ok -hy ar -horse less -home boys -gun nell -greatest showman -gla zes -fri sson -flos stradamus -flexible working -far in -falsi fying -escape es -emili o -dete ctions -de val -de pa -dand ad -curi el -cp sa -cold spring -cine main -ci dium -chanel westcoast -buzzy buzz -blat che -bind weed -bart leby -balochi stan -aw sreinvent -aus grandprix -alpha go -all ora -aaa ahhhh -: ? -!!! âĿ¤ï¸ı -ðŁıĥ ðŁı½ -룬ë¸Ķ리 ì¦Ī -âĻ¡ . -âĭ Ĩ -âĨ Ķ -Ùħ ÙĬ -zy lof -zor don -zal de -y itz -wy ne -wild bill -we ke -vali m -utter ances -un willingly -un profitable -un anticipated -ti mba -tdw sport -tail spin -t dci -syste mo -sway ne -steven sville -steven ash -stanc enation -sony prousa -sky digg -sem pre -se q -sawbridge worth -sau con -sar af -san die -sahar a -rown trees -ro tolo -ran chos -r row -pony hour -nol ans -mu ji -mm rda -mb stadium -ma illard -lovetrump shate -lic or -laugha bly -kam uy -ji j -j any -inconveni enced -hud ds -hippo cratic -has sel -hanse atic -ha aha -h mrc -h mb -gyne cologic -glo ating -gen set -gel sen -gangre ne -fr ons -flu gel -fictionalcharactersi wanttomarry -fair uz -excit er -ev elled -eni ke -ele fante -ee zy -eddy stone -eco tec -dum mett -dm register -direc tionally -del orme -deer hound -dang dut -cur se -country girl -cleve rer -church ville -chand ani -chael incl -cellulo sic -cast aldi -by one -but lin -bu ehrle -bli s -beyon ce -best wishes -ber rigan -as vit -annul ment -ama q -alli seeis -aar gh -âļ½ï¸ı ðŁĶ¥ -âĺ ŀ -á Ķ -yw ca -wood worm -wis la -what su -west lock -w use -un crowned -u os -twy nd -tran ent -tiffany haddish -the knot -thankyouforyour service -te ssy -swit che -summ erishere -sp ir -so hc -snetterton msv -sli v -shre m -serv icec -seraph ina -sathy ajyothi -s llp -ri fling -ram eau -porth os -porsche forsale -por thour -pet plan -pel uso -patter son -p had -ox uni -otran to -o delirious -nor win -nitourist board -mizu ho -mishand led -ma sini -lum by -li os -le vein -kri palu -klo sterman -kit agawa -ipp on -infl ates -ili o -hydro x -hr sb -ho vel -ho skin -hat field -hann ya -ha el -h dt -grant making -gra hams -gol in -gh and -gel fand -gd pr -fri g -f anti -ex erts -eni sta -el ara -duncan trussell -down land -dellave dova -dac ey -d ctf -commun alism -cheftom kerridge -cerv elli -burnthe stage -brink mann -bok hari -blumen auer -bis aya -berg tv -bekind to -bau dr -australopi thecus -annon dale -ak anishi -ai ac -adu cati -ðŁIJ ĥ -ðŁı³ï¸ıâĢįðŁĮĪ ðŁı³ï¸ıâĢįðŁĮĪ -âľ « -ä s -za veri -yogi adityanath -vy dra -vote demilovato -vas s -v itt -tra ver -threep ence -thiru vizha -tail bone -sway amb -suz ann -suicide awareness -sugar bowl -st illed -soldier field -smu gly -sb v -rou se -re conditioning -q cs -prin ze -pmk vy -pi planter -panam acanal -over loads -or bi -olom bia -ob x -o gn -noble st -nam san -na fees -mu mab -mkdon sfc -min ky -mi ano -men or -meet our -may hall -man tv -ma vicpro -lulu hru -l ation -kwesi arthur -kate spade -kat rant -kalki kanmani -kal barri -jocel yne -jesuschri st -it ravel -information technology -indian diplomacy -hyp notic -ho tho -hinch liffe -hilton head -hell hound -ha wards -grau pel -gonebut notforgotten -ging erly -gin kel -fox ford -external ities -er rico -ee v -di mmu -de population -de muth -darkk nightrises -d dot -cl ane -char nley -cal af -brut alized -brun ches -bram alea -bey routh -are ata -ap hex -anti e -am logic -ale sia -al quds -air tricity -:' -) -( ??) -!!! , -ðŁĶĬ ðŁİ¶ -ðŁĵ ĭ -âĪ ŀ -° ðĿĺ -yal inetwork -womenin engineering -wilkin sburg -wail uku -visibil ityday -vi alli -tr onic -total biscuit -the evil -ter ang -suff ices -spencer port -san del -sag t -robo twars -ro guer -ransom riggs -py are -pr week -plu cks -pin cho -phili stines -organiz ed -ol z -ny v -not our -nikki reed -news media -n kun -mish ra -mb and -masochi stic -mar ang -ma kel -lo kay -lil bibby -lev antine -lc dr -la ettner -kere mbur -kaw aguchi -kath iel -ka sten -k rome -jay rock -inter provincial -incub ated -hundertw asser -henry viii -he eds -gre a -gov tnz -gill ick -gener alizations -fro bisher -fow ls -foo m -fnaf hs -fly ball -fir po -explore the -ev aaa -end child -dun combe -de mption -day dream -cor vina -conve yer -confu ci -colo m -clums iness -calci fication -bra sher -bbc cambs -assor tments -asgar dian -ard agh -anag alizia -ali u -af fix -adri ane -a heim -ðŁĺįðŁĺį @ -ðŁİĦðŁİħ ðŁİģ -ðŁįĢ ðŁĴļ -âĨ ©ï¸ı -worldsoil day -whodoyou collect -wasteiton me -vol le -vel lam -v hong -v adap -ur inated -upper class -under hand -town scape -tam bur -tach ometer -t do -strat orob -steve burton -snoo t -smo ker -small streamers -sla u -siva thewanted -shan te -seok min -season able -sahuar ita -sage francis -sa ham -road burn -ram bert -rally racc -ra wat -princess leia -pla stique -pen iche -pe therton -pang lao -panam games -orig ami -or questa -na shies -mu table -mon cur -mess o -men sur -massi modu -marcel o -m travis -lovemy dog -lloyd banks -lie ben -leix lip -ky dd -jab il -is ao -ic aria -hi ero -hawks worth -grave sham -gen ation -gard eng -gar owe -fox ct -flor id -ess on -eric whitacre -ent radas -elo ka -e owyn -e akin -du dgeon -du ce -demo scene -day glo -dant dm -dani elo -dab arkads -cuti ee -country club -cele k -car onde -cal allen -buy ers -buck hurst -bor ou -boett cher -batt enburg -bas singer -arnel pineda -ar nou -antim al -anne ka -alter a -alp bach -a ethel -ðŁĴĽðŁĴĽ ðŁĴĽðŁĴĽ -ðŁĴ ł -ðŁİĵ ðŁİĵ -ìĬ¹ ìľ¤ -èµ IJ -æĽ ľ -âĺĿ ðŁı¾ -ø r -ê me -yon du -wyn on -wo ssy -wel ts -vo e -torch bearers -tit lei -the cutch -tam ines -taf sir -stick iness -stal liance -spi erre -sophistic ate -sin less -shar af -se acade -schaff hausen -roller coasters -rock slide -rapo port -prun er -poly gamist -polari zer -pol avaram -pm dd -plant science -par to -onceupon atimein -nt southwest -neme chek -ne shoba -nay la -muth arika -mercu tio -me ares -ma homet -m buy -line tte -linda ikeji -lam oureux -la yo -kum ho -kla vier -king field -kap lan -kab aka -hypnoti sm -hin king -her mann -h wb -gre ymouth -four play -ewn traffic -esp ino -epiphan ies -ela sti -del orenzo -d bf -cull ompton -cu bbon -cs ny -cra dled -cost lier -confederate flag -con formation -ci legon -chapel town -chan u -capp ie -biomed ical -bal want -b sas -as cio -argu mentation -angliar uskin -ameracad peds -acce sses -abhin aya -ab ts -ðŁĺĤ ðŁĶ« -ðŁĸ¤ ⾨ -ðŁĴ» ðŁĵ± -ãģŃ ãģĵ -what matters -war of -wan jiru -vero beach -ul bricht -tyro lean -tromb ones -tre vis -the shark -taga q -suf cofficial -stom o -starbuck scanada -ssin z -snowmag gedon -ski pp -si mard -si at -ser j -senator menendez -se il -re write -re tested -ram nath -ra sco -pre destination -point es -pe azer -online safety -o chieng -nor mand -ngu gi -naz rul -national hatday -nation all -mr bo -moon less -min niem -matt lanter -mag ner -mac omber -kuri su -ku mail -kor k -ki y -jones borough -jo ep -jack savoretti -ish u -in lets -illeg ality -hb g -gar brandt -fra ying -fasci as -e gan -de etz -contr ition -cny central -clu bb -chero kee -blues rock -bj ørn -be eville -barn field -bar ako -astor ino -ar nau -ap lay -ant ó -ant é -am ck -world notobaccoday -wi f -way uu -vir i -vi brio -un happily -tiger lily -thekk ady -the jason -tam pere -sk omer -share pict -shanemc mahon -second city -scru ples -s fair -ryu kyu -rodan the -repost by -regin aking -ram kapoor -pin oftheday -phyl lo -pe afowl -op hen -on co -ol ka -ober weis -museo ideale -mon ad -mile stone -mi kay -mel chor -matt and -man ac -mal lup -m amp -lyle lovett -leea renberg -lea den -lamba alka -la hr -kun is -in famously -hen ner -har ve -har mar -go is -ff xv -evol ver -ess ilor -dz bb -dri ppings -drew barrymore -dog pound -dis avo -dg ca -del piero -deb ary -de militarized -de mean -cor de -confu singly -comp ston -cien fuegos -chi b -cc me -carri ere -car tm -can thelp -brox towe -boss y -bone tti -ble ier -biblio thek -bhar uch -ber kut -bbcgw live -au gi -at ag -anim atic -and oni -amil ano -amar ca -a ani -ðŁĴľ ðŁİī -ëĬ Ķ -è ® -z by -yas mina -wri ggling -visit abdn -up scaling -under takers -umay yad -ukgif tam -theplayer schamp -tat ry -taq wa -tales fromthe -super grass -sunny bank -stone field -ston ef -stey ning -ste ads -skincare tips -sho v -she hr -sg pc -ru mps -rizz uto -pin tor -pick away -phy to -petit e -pax os -over tone -op atija -o gwen -nee wer -necess itates -multivit amins -mu sil -mu ip -mor ros -mo ki -mix ta -min def -mee sha -marin us -ma die -lex perience -legisl ating -king i -kenyan traffic -ka idan -k harbanda -jun krat -jon m -jb pritzker -iron work -insuper able -infini x -i jaz -hyperhidro sis -head teachers -han de -ham ster -had win -h ace -go yer -girls bb -ft u -fitz geralds -fer ring -fc united -ev d -esc ol -enligh tens -enginak yurek -ele vens -edit ore -dolore shu -deaf heaven -dark sun -cycla dic -cubic les -cu buff -cre morne -commen taire -colum b -bore as -boom stick -bluet ooth -ballinas loe -bal gow -b inga -athe a -aste iner -arsenio hall -argentin agp -aren delle -al friston -ag aves -afol ayan -a oy -a jen -) ', -ó¾ ĵ -é § -ãĤ¹ãĥĹ ãĥ© -âĺº ðŁĺĬ -Ø§Ø ´ -zil lah -za hoor -y aaaaa -world humanitarianday -w up -vi le -vampi ric -tune ful -tshirt design -track ing -ton bridge -tish omingo -the coral -th axton -terribly tinytales -teacher appreciationday -swa inson -sound set -smar my -short land -san jaya -s mid -ryan holiday -ru ddington -rspb southwest -rivers dale -respec ter -re beli -rahul dravid -posit ron -pim pin -pas sey -oromo protests -organ elles -oc ar -no ahs -ne ophyte -my idol -mur dere -mor ri -menstru ating -ma fc -lucifer onnetflix -lili an -li sted -laure en -laten igh -labour party -la plante -ko zel -kitty hawk -kar hu -ju lee -jim myeat -jeep ster -jaye hanash -ir reversi -inst yle -idoli zing -ic pd -i bro -ho sni -hlf supported -her rig -he bs -galler ist -frasc ati -exten sible -exeter college -even ko -es b -ear tists -disarm hate -din ard -de criminalisation -dc pl -cynthi anixon -cont actus -colom bians -co an -chi haya -cc cs -bra ganza -bol ter -be avoter -bank stadium -ast ell -asperg illus -asi apac -ann ée -ann aa -am bal -alonce sto -all ana -aege anairlines -abet z -ðŁļ µ -ðŁĺİ ðŁĴ¯ -ر Ø© -ÑĤ а -ze hn -ys rc -whats new -was p -vi agogo -vegas news -vassil is -v dj -ush ima -un traditional -thursday night -talkin gheads -ta was -sw ch -sw abhi -supply chain -str ina -she amo -scott borchetta -sche ch -sc ouk -ron funches -redon do -qu aide -prolifer ate -play ingnow -pe ered -ol av -ny anga -np tech -national pieday -my view -miss world -medi o -mcle od -mc gil -mac ia -ma vs -ly t -lu anne -kon nen -ka sese -juan ma -ju alan -ing ate -ildef onso -hydroly zed -hu ong -himer ose -hill ard -hege monic -gri der -gra al -gi blin -game boy -flu g -fan zines -fall is -every woman -ejec tions -early childhood -di mera -dar ting -dar ted -dar ra -comm er -city traffic -cb bus -burde kin -bro ths -brett dalton -boiler ball -bedroom tax -atsu himerose -astro labe -alfred sson -ah y -ae ats -ac lassic -" [@ -ðŁĶª ðŁĶªðŁĶª -ðŁIJ¶ ðŁĴĻ -ç Ģ -ãĤ¿ ãĥ¼ -âĮļ ï¸ı: -z addy -y stems -wa inf -vesti do -vacation mode -v pro -ul le -thur rock -super nintendo -su sp -stjepan hauser -stal act -sou tache -simi en -search engine -sc ill -sas aeng -sacred geometry -rome omiller -rn ts -refr acted -real michael -rad cliff -pri es -pre uss -porch light -official sps -o logic -nascar hometrack -nap alm -nag pal -movi mento -mon chi -missing merlin -mathe ba -ma pper -m wh -lt d -lilloo et -ky p -kodan sha -kir cher -jd illa -iv ani -indi visi -in laws -in chic -ik r -i vie -houn sou -hay ton -haku ba -gu ti -ger gen -full stack -for sey -fabulous finn -degra ff -dat aran -dam ocles -da hal -da chi -cro is -clou se -che ers -centr ica -catal ana -bur chell -bry ne -blox wich -blood worth -black business -bir tday -bi beau -andre siniesta -anaam doon -alv ina -almosthe aven -all ach -al jaz -afl vic -ad dam -achi efs -ðŁijŁ ðŁijŁ -Ø§Ø ¬ -za haha -x aver -with kids -wh yyyyy -wen dig -wee ze -w taf -vion net -ver celli -van af -tvin colour -tor ist -the resi -ten leytown -tal bum -sweat box -sty li -stre sa -spoon bills -sorry im -son yo -smur fit -sin c -sidd all -si phoned -si fton -seismo logist -ro see -res wales -rally deportugal -rainbow six -que k -port coquitlam -philosop hie -philly firedept -phil brook -oto ya -nidh hi -nab u -moo cher -mister wives -mi os -merrell twins -mccas lin -mal feasance -mac naughton -ma saru -m wr -m tam -live journal -le chu -kib worth -k bw -jason plato -j rothen -inzam am -hover boards -honey combs -homin in -her ro -hard hat -ha hohe -gou die -football remembers -evi gan -du ba -dol ing -dir hams -dinner date -cu ala -crag side -chesapeake shores -cast o -car lucci -ca rella -businessc lass -bur kes -brew day -bol tz -bb bb -ball ater -babad ook -alex isonfire -adjun ct -aber fan -/ -. -ðŁĺī ðŁĺİ -ðŁij¸ ðŁı» -ìľ¤ 기 -à¸ģภ£ -yo ichi -y ı -whitecol lar -we dont -uof alabama -unner ved -twelf thnight -tu gend -tr ca -tom son -thegoogle images -theat tic -the sse -t ms -sven ska -sug ita -sm tr -sil urian -shol me -sel insgrove -san parks -s como -ru pi -rock sound -pro bus -po stand -plastic pollutes -paediatric ian -nbc timeless -mun dry -mi stle -menac ingly -mccu bbin -mather an -ma sum -lev ins -l hl -korean war -kai ji -ka whi -jb fa -j ck -intercess ory -il wu -i hp -hine sville -high on -hene cia -happ old -hang time -hand l -hammer films -halloween party -hall sville -grim ms -go ags -glen ny -g ner -g ads -fire pro -fal les -fal lah -f nv -expan ses -ex pel -environmental justice -en zy -electro physiology -ds meu -dread naught -dor in -dian ak -cu hk -cocom artin -cis me -ce g -carol ines -car star -boney kapoor -black white -bjarke ingels -bar ringer -bar log -bad ung -adre ssing -ac snano -ac crue -!! ðŁĴķ -ðŁĵ ĺ -youlike carsuk -yanke ec -won tons -wom bs -ving o -victori ously -vec chi -under perform -un rolled -uk ur -tv n -train ingday -tow v -th ooo -tb ell -t ounge -strat asys -stein ert -sr ing -sobr ino -sli iga -siss inghurst -si pa -senator reid -sen robportman -selve dge -sel mon -sel inger -say cheese -sa wat -rekind les -re route -rc de -ra gan -qu n -pro van -pivo t -pedic ures -pancra se -pa kk -out selling -our nation -oregon ians -niam ey -nation hood -n crc -msmar vel -morad abad -ml j -mine ko -mil fs -mesm eric -men chies -me gara -max ing -mat tek -laga res -kyoku shin -kl h -kirstie alley -killing it -kee sh -kat ed -josel yn -itv anglia -ine ed -incenti vise -in den -in cin -i dra -hyper links -hu uu -hash ana -gre nell -gravitational waves -grat ton -gg able -fun dthe -fan stand -exhilar ated -em mar -eli v -elder abuse -el tz -east wick -ear ings -dire kt -dev our -democr acyday -dee puk -cy ano -cu ssler -condition ally -coco oned -club wc -civil airpatrol -car luke -by fleet -bore holes -ber satu -barrel led -bar ths -ba hir -b pd -ashi shians -ar kh -ar iss -apor ter -ao ife -alwaysinour hearts -al ofa -air nz -adeni yi -adap t -. ' -" âĢĶ@ -ðŁıĢ âĿ¤ï¸ı -ðŁĨ Ļ -èµIJ ç¦ı -ãĤ» ãĥ¼ãĥ© -Ï ĩ -year son -y res -women also -wk shp -wi ya -versic olor -ve aux -us fca -twin ny -tour é -tor adora -ton tour -tho spital -surfer girl -steadfast ly -star sof -soil association -shru thi -she epi -schei fele -saddle bags -ronnie wood -re payments -ram ayan -rad wimps -quin tino -pink pop -per missive -p sei -open the -omni verse -oma ine -ohhill no -official nichols -o sher -newyearnew you -national pancakeday -my nt -mun chau -mirac ast -me zu -me self -mass enet -mar pole -lm h -liber atore -lei fer -l ling -kuns thalle -kon tak -kon nan -kk l -kirk franklin -key board -kc as -kab u -k por -jean michel -it group -is that -indi c -hor lo -hon go -hof man -head butting -h vo -green collar -gravel ly -gin blossoms -ger tz -gar din -flu tters -ff f -eth ridge -entre pen -enf ance -ed sall -ed di -du shy -dri es -dolla z -ded rick -d aka -cre mant -coun ton -cou libaly -clap back -city beat -ca stor -buj old -bli zz -blackandwhite challenge -beach bum -bayone ts -artill ery -ap or -andy mineo -amyra dastur -alber o -alas kans -ad cs -ab io -ðŁĺĦ âĿ¤ï¸ı -ðŁİĦðŁİħ ðŁı¼ -าภ² -worm wednesday -willi mon -whip sn -watermel onday -wat kinson -wal ki -vsc in -ue hara -tu itions -truec ar -traffic butter -to ks -thunder shower -thir lmere -think progress -t dc -stenc iling -sne ddon -sky liner -skol kovo -shu maker -shi rish -sch ic -samuel milby -sacrilege sunday -ridel ots -remington leith -red lining -re tr -rachelriley rr -quetzalco atl -quer ra -pyrr ha -pan abaker -pal utena -pa ku -o wego -nz vind -nytime sarts -no bly -nj pac -nar ada -n can -moor abbin -mon tt -mollu sc -mate ys -mal oo -lym sm -level design -ku tt -ko ori -k pandey -jap on -itsmo hit -it ron -inausp icious -ike ausa -hip flask -hallucin ate -ground cover -ge tor -gar ron -full circle -for food -fel onious -ever ard -eun bi -ensla ving -encan tan -eme k -eli gh -eeee eeeeee -edg cumbe -ed research -ear this -dow deswell -dis qus -delinqu ents -deidre hall -corpu z -cooper man -co ti -chu tiya -chri ster -channel ten -casser ly -card fight -boot legging -bollywood celebs -be ith -bang lore -b wy -aun ite -as om -argu able -ar ny -aqu arian -ao v -an kush -alas vegas -af obe -ë± Ģ -å¼ł èīº -york dukes -wrigh twood -wiel dy -wi fw -west michigan -wam pum -vic oladipo -v nv -type set -tu z -ton ys -threat ened -thou sing -tellem stevedave -t px -swar oop -stown hall -spring s -spo onie -sharps burg -shan ka -san gue -ricor di -referen tial -red bank -re tall -rad han -qu ba -push chair -pre scott -poin sett -parik rama -pang u -p tr -om gosh -night sof -nh v -mu bank -mo ise -mat to -mar tavis -mar quis -lu zia -lo ofa -lin ck -let tie -king sday -killor glin -kh p -ke ad -k int -juliago erges -iv anna -isla scanarias -inge vents -hypo thalamus -hou k -hel mut -gir ll -game iro -fir stamendment -far aj -dutty paul -dp show -char sadda -caronde let -carni vor -cak ery -brook field -bottom ley -border land -bo co -bless ington -black hall -beg bie -be ynon -baudr illard -bat suit -b dw -b con -azeali abanks -ati f -arjun reddy -amar r -all ington -alig ners -ald in -ag adi -aes ar -adam j -ab bess -!! âĻ¥ -ðŁĴķ ðŁIJ¾ -âĶ Ķ -zylof on -wreck it -whir ring -web mail -v ade -tyn tes -tor qu -the change -tel o -te chi -super friends -succes fully -subter fuge -spr inci -sp era -sof antastic -so sn -sho to -seag rave -se say -sardon ic -saeed ghani -sa kae -ro ject -regener on -rad ner -qu ism -put locker -psl grandprix -produc ciones -pemb ury -patho logies -pat te -oscardel arenta -oscar s -orangu tan -ok state -nav yy -multi scale -morbi han -mor di -metal music -mccor kle -maun akea -mar stons -mar quin -lu dus -live tweeting -li di -legi bility -leg old -le jog -l liber -kin zie -khush boo -katrant zou -ju tta -iowa stateu -harvardchan sph -happy sehunday -gra pho -geschich te -gen nar -gat chaman -forz aducati -fo ie -fer hat -ev onik -ecol lec -di sunity -derekand susan -de groot -crystalli ze -cran es -cow spiracy -connach t -cassi o -c sco -bun ts -bri bri -bre aley -borough bridge -back stories -ani emi -age ing -aa si -ðŁĺ¢ # -ðŁİ¤ ðŁİ¸ -íļ Į -x design -winter jam -wen sum -us ages -un bleached -tobin heath -ti amo -thereal elp -supt chat -sun cream -stratot anker -sti en -stee zy -sock en -sm cs -skul lisland -sk od -sh ttp -sciento logist -ruthi eel -rsv p -rosen quist -play sets -pesc adero -pat u -ouel let -oregon mbb -ne ka -nan king -mu f -moto ko -motil al -mobi leye -michael raymusic -man tz -live st -lec tric -lalo alcaraz -la von -keny amoore -kan ada -k ft -jor vik -jimmyeat world -jag ad -itae won -indisci pline -il ves -i mani -huy brechts -ho ki -guille mots -gar way -ga ems -fx bg -freed omo -football family -floriansem le -fine jewelry -es un -doby ns -derby shireccc -darry n -dance able -d con -cri spi -choicemusic group -bra venew -beauty blog -b gn -b elling -az tek -atte sa -asur f -astr antia -appalachi ans -ali k -algé rie -$$ $$$ -ðŁij¨ ðŁı» -ðŁIJ» â¬ĩï¸ı -ì¯Ķ ìľĦ -âĺ® ï¸ı -» »» -y rd -whir li -wel lo -visi thel -v pp -v annes -usag ym -turntab lism -trev ally -tran sect -tipp mann -thom yorke -thisdayin hiphop -t sson -standard kenya -slug go -sign posting -shar yn -shad bolt -sens orial -sal m -russ o -qr code -promis sory -pope mobile -philip sburg -pal ance -pad mas -off it -o yor -nu cky -no suke -new y -nb pa -mun awar -mis senden -mis ma -mi gun -men sa -mc cowan -mar khor -loft in -lets makeit -lalah hathaway -ki et -kad ena -kach ina -jim mys -ir mar -ig arashi -i dr -guit arri -gou cher -go wing -ghou lies -ga er -fun ston -for free -fol ha -flux es -fis d -fab india -enew ton -elli er -deador alive -das nakz -chis ato -chicagos mayor -cal ce -ca wood -c Åĵ -c jd -bury makeup -bbc scotland -ar athon -amazon fresh -am ager -alve church -ak os -ab cland -! ðŁĺĺ -ðŁļ¨ @ -ðŁĺĨ # -ðŁĵ ı -ðŁijĬ ðŁĺİ -ðŁİħ ðŁı½ -âĥ£ ! -whel k -we believein -wal ber -visu alizer -visit malta -vi vic -ver g -ui path -tru ism -tribe town -tr ills -thur ingia -teri polo -sumbastur tt -sto ichi -sim ran -si za -showtime boxing -shooter jennings -shan elo -senior care -san onymous -san field -roi dery -revi ent -rein as -re organised -po que -patag onian -pap iss -neph ritis -mussel white -mo tes -minic ooper -mike s -medi bank -march on -magic of -lode star -lockthe mallup -ke ates -kar aka -just sold -jrothen bergtv -jo yo -j xn -ingu ide -i lean -help me -han in -h pk -gru jic -gro h -gi vel -gali bier -galeng ering -force field -femini sta -farah khan -face idibia -eng adin -emerging technologies -elor za -edinburgh napier -echop ark -dun gar -die ing -d brooks -com esa -codel ottery -ch ini -cen tered -cab re -bull pens -buil dit -bucky brooks -bre genz -blom qvist -bk al -best deal -bes sey -ber bere -b hr -as cos -argent inians -aman pour -am phor -afi fest -ade o -abren ica -a itu -.... ðŁĺĤ -. ðŁĻĦ -*-- -* -å½ ¡ -âĿ¤ï¸ıðŁĩºðŁĩ¸ âĿ¤ï¸ıðŁĩºðŁĩ¸ -à¹ Ī -É Ļ -ü r -z ii -yay asan -y ars -wu hu -with in -wick liffe -vian ney -ven is -van ews -tun nicliffe -to one -thing ie -the print -tech e -tbird nation -tan ita -tak ada -ta relli -still here -st pattysday -st enger -squir ted -spaghett ini -sin u -si dency -seraph ine -sediti ous -re positioned -pigg ery -pie week -pear tree -palla vi -pa ppi -pa kt -outlander home -no bilis -niko lic -nca acws -nat sci -nat reswales -n brook -msd strong -mis su -mcm ldn -love greatbritain -logo tv -lc ds -laver gne -kee sian -jeon ju -inst gram -in on -in famous -hipho pdx -ge ol -gastr itis -funn ily -function alized -fresh fields -fitz hugh -fi amma -fa shanu -f pj -en no -empy rean -dor ne -doo k -dew points -def qon -de yn -de ery -de bo -dau da -dasty ari -crom ford -contamin ant -compag nia -colec o -code pen -che twynd -cend r -catch ments -car touche -br one -andre wh -alber tab -al ders -agen et -aber tay -ë´ Ħ -天å®ĺ èµIJç¦ı -⤠µ -yuri ko -wit ty -whitte more -vo dou -veikkau sliiga -vangogh museum -unquen chable -under par -tw yman -tu er -the sound -tan noy -ta ho -super fortress -sun shades -sun o -stram rahim -stal es -spoke speople -sj suryah -sil van -sho ckey -sh na -sarah colonna -s var -ry kiel -ru tting -ric hi -ran kins -ra ub -premiere pro -pr sd -poo fy -phone pe -pau pack -p nin -ophthalmo logists -om is -olym pos -odi on -o rest -men o -md gonzales -mcge ary -mc gregor -mar itz -mad he -lu mmi -live au -list less -lake port -la porta -kono suba -kaw ashima -jeanni emai -jai mie -jaf ari -iron sides -insec tweek -incis ors -in blue -ilit ary -il ong -henry ville -hen lo -heatwave uk -hamble don -ha ymon -guitar hero -g suite -fv su -fi an -fateh pur -f tball -do bi -dl su -div ac -cor lett -com eu -cold weather -chicag omarathon -cap saic -buri ed -bur sitis -bur chard -bur cham -bell ary -be here -bbc wales -aristi de -am newsers -al rosa -adop table -abcland line -ðŁĩ«ðŁĩ· ðŁĩ«ðŁĩ· -ãĥ§ ãĥ³ -âľ ĸ -âĺ ¼ -zen tai -what chamac -wb go -way haught -vri j -vo le -vin y -villa iness -vaqu ero -vag as -ur bina -up ington -tri que -tri alists -thir i -the metal -the coop -te bay -tan abe -systems thinking -summer style -sub plot -sto koe -stay blessed -so jin -side burn -shor ror -shar maa -sen ki -sen at -sat b -rouss anne -ron kon -red star -re classified -rati fying -q nb -plan o -paulo avelino -park son -over throwing -osi ris -os ric -organ i -ocon to -o stuni -ny chash -nitt any -ni obi -mal eny -littlerock steam -little caesars -lau x -land slip -l ale -ky sen -kus adasi -kler ks -kasab ian -k adapa -j dr -irving plaza -indian oil -immune system -i kin -hu ic -homo genous -hare krishna -hae matology -gyneco logical -gou veia -glen ridding -fun kof -fl anged -en unci -dragon ette -don lon -do ble -dalla glio -dahl berg -dab aby -classic porscheforsale -celi o -carter ville -caroline flack -canu so -bun del -botan ically -bon de -bio div -barry bados -bam baat -bac ary -az le -at tested -assimil ating -ar dens -ap v -andy roddick -an music -alu cha -alph en -íĪ¬ë ª¨ -zur g -zindagi kime -ye as -wis k -w lic -vers ilia -under aged -tek la -team tigershroff -ster ner -stalact ite -sql sat -sooth sayer -slot car -simpson whnt -si mal -shil in -ru ban -rie mann -ridec annondale -rep irate -rae gan -pu tu -pos thuman -par u -paper board -ou thern -organic farming -mut ating -moment smatter -me xi -master minding -lind blom -likeli est -li mani -lax mi -la sell -ku hlman -kam az -it ars -initi o -hyper thyroidism -homosapi en -her bin -har te -gu mps -gor j -gh ela -fr q -facul dade -f icio -ent weets -e idol -din sdale -demetri ou -comic boo -colom bian -cityofla svegas -cir l -chee zit -cha an -ch ans -car tas -c elive -by x -buy do -bor owski -book covers -bog ner -blood mobile -black families -bel lowing -bay ers -ati fas -apare ce -ang ell -ane ed -ali zafar -aga a -æ İ -wj la -un tung -u wanews -tl r -tinthe park -teign bridge -ted ford -swad dle -sun gha -son risa -slay ings -sky wards -singh ania -sid deley -shir lington -sheffiel dis -sh ram -sell ersville -saw chuk -samajwadi party -saf avie -sabah info -rous er -richar dy -read just -r ph -r ck -que strian -pursuit of -pro ad -porta ferry -plu ma -pin pointed -pile driver -per ales -pc x -p ta -nor land -nit itaylor -mu hyi -mtlg azette -miscre ant -min ardi -michael dell -mcg avo -maurit shuis -maser u -man zarek -m eller -lin field -lgbthi storymonth -laur ance -lar ned -la pin -l we -kun tz -kon tra -kerembur sin -ker nan -kat alog -kali hi -k west -jessic acaban -j wp -ite aser -into cable -imacele brit -iklan ok -ident ically -i av -hic ago -hib berd -hc n -harbour ing -guj ral -gold berger -glori ou -giant srl -geo stationary -freer oll -fr nsw -fl ac -face tious -ear ned -e die -door n -dick en -di ag -dan ziger -da an -cull man -cho pp -che tri -cel luc -ce es -bobs burger -bike tour -beep ing -anis achibi -anim pact -am ical -... !" -íĪ¬ëª¨ ë¡ľìļ° -à± Ĩ -ál varo -wwe payback -wo wie -wo ts -wil lets -west en -vbm plong -uth appa -un fla -u chs -tv bs -tuesday bookblog -tre mayne -tranquili zer -thehorror master -the well -the meat -tan ay -sy ko -storm chaser -stock yard -squab bles -sn az -shi powners -shere sy -seab ream -score keeper -sci ac -sat is -sar y -sal lee -ry d -ro ks -reading forpleasure -re su -punchestown race -patek philippe -open source -oc kies -o berg -neph pearls -n alban -monti el -min chin -mill vale -mid dy -mel itta -mani a -m hairi -lor ch -ll amas -lip sky -lett res -la bru -kwang soo -khabar ovsk -jual beli -je ws -jay demarcus -javit scenter -is dead -home opener -hemato poietic -hat un -ham rick -gelsen kirchen -gam bon -gal entine -fri ess -follow westwood -flu ffiest -feasti val -e itan -dur gap -dub w -du plexes -d tx -cow rie -clap ton -choose to -charli erose -ce ili -car law -bun heads -brisbane times -bo tting -beau ly -bat arang -barric ading -ballin am -ay ler -arg erich -an ri -ak ler -ae o -acu bs -abor ting -:) ... -. ðŁĻĤ -# ðŁĵ· -ãĥ ¤ -ب ر -zag mbb -y anda -wy r -writing commmunity -water land -ver ige -ven za -un acceptably -ul nar -trick les -ten er -tc palm -tat us -sy metra -spandau ballet -soun dar -soul pepper -som ely -sk ymall -shu toff -san ath -sa ap -ro zz -ra vitz -politic slive -plac ental -pe tyr -pat ry -of ili -nrl footyshow -nether landish -nak ul -my ler -mor tes -mis land -millions missing -mil som -mc mexpo -mass statepolice -m hat -lovefor dorset -lign ano -lifel ines -leg an -koh ler -kali bo -k gun -john wayne -iri de -icec reams -i key -hy den -hol le -he ino -he dra -hat ty -grove port -gley ber -gl td -galax ia -found ing -em po -elong ation -ee ts -dre wes -dis orientation -dh ss -defendthe den -cull ens -cou per -con die -commun es -co eur -clo tilde -cheni er -ch alian -cer rit -celesti al -cast ells -capital markets -bus man -bu su -bog ans -bernou lli -bbc stargazing -bad deck -ķ × -ðŁĻı ðŁĴĻ -ðŁĶ § -ìķ ¤ -è vre -® - -wn r -w lu -voting matters -vandy baseball -vand u -u ssie -tuft suniversity -try stan -trumpe ting -thorn burg -tgom agazine -teesside uni -te dat -tan ana -table scape -tab o -sweden borg -sp kr -shrimp ers -san miguel -s draft -ri mer -regr anned -red back -reb ello -reading rocks -re bo -pub con -pri sca -pel zer -pasteuri sed -p vb -over lander -ori entex -one word -ole man -ofthe cup -ny berg -neck band -nat alis -monty don -mis spell -mis construed -mic hiru -mac phee -lo vas -liam neeson -kib beh -ke mi -kay am -kari bu -jor dann -ig y -ibm wow -hyper venom -housing forall -hor tus -hope dale -hit ach -hin ault -h mx -gar amond -for tus -food wine -evan rachelwood -en ag -elie saab -du td -del ain -dau gaard -d sport -ctil burymakeup -cit v -cho ppin -carib be -carab ini -car avel -cant ley -cam eleon -bundo ora -bun ky -boo table -beat ric -ba ren -ba ini -avon books -antipo dean -am ox -agü ero -ac cp -abc brisbane -ðŁİĦðŁİħ ðŁı» -ðŁį ± -çµµæıı ãģį -ı k -ysp sculpture -y leo -ver ul -ve eran -tz ar -tro pal -th illary -sv c -surfl ine -sura karta -supp e -soft wa -snape maltings -show ery -sen su -score stream -reignit edtrilogy -red horse -rafa ela -ra gee -profession nel -pic poet -pee zy -pe thealth -pe stered -p tas -one coin -ok y -o by -neuro surgeons -ne tease -nasty gal -my e -move to -mon na -min ki -melissag orga -mazz one -laser cutting -krish nam -jo ed -j its -j ito -i ho -hun ton -hene ghan -green machine -greek food -girl son -garbi muguruza -funny videos -fivb worldleague -feijo ada -dish evelled -depor tiva -chester bennington -capitol theatre -cantanker ous -cand ra -can epa -buil din -bla w -bhanush ali -bat avi -bad land -art craft -aren s -are x -arag ongp -anu ar -ðŁĮŁðŁĮŁ ðŁĮŁðŁĮŁ -íĪ¬ëª¨ë¡ľìļ° ë°ĶìĿ´ -å± ĭ -zi j -zaz en -zan ardi -y ip -wr ung -win ns -we ready -v ng -up lo -tom ba -to ady -themichael owen -the foo -the dave -tar ini -tal uk -skim mers -sho go -shag un -sac lay -s sts -rock land -roc ers -rob z -religi osity -rec c -rb ge -qual ityof -q assam -pol mtl -po eta -patri moine -musu em -more a -mill at -mg motor -mer ola -mennon ites -mau rie -mad ar -ll susa -ko techa -kap u -ka olin -jun as -jon im -jami efraser -ja hi -iron heart -irn bru -ing li -hu gill -her st -hell sing -grosven or -groo ved -gro za -good governance -glock ner -gl b -fore shadowed -for the -fi do -ey am -ever rrrr -eri kal -embelli shing -durham birdclub -du i -du blins -drake ford -detec torists -de vises -de vic -daniel goddard -cullen bunn -constitu ting -chival rous -chal on -car vana -cand is -canad air -bot terill -blu ster -ble asdale -black shaw -bill hemmer -bige ye -beer sheba -be get -bar ts -band aging -bak uman -as sion -ar ner -anast aci -ambedkar jayanti -alaki ja -adeno carcinoma -ad ell -ab les -( = -xo chimilco -whyilove kenya -way cross -vin land -try pophobia -thrac ian -the gun -sti ers -sports writers -southland sports -slo combe -sea vey -se wall -scu damore -sc ig -sar razin -ron ay -ri yadi -ri poste -re mastering -ram das -pop matters -pon dexter -pierre gasly -perip lus -par lance -occo quan -oak en -ni ft -nebrask an -ne tra -nar vaez -n ales -multit rack -modi fieds -meal worm -mar leen -m jc -lap sang -ky uss -kil ty -kil keel -jodi picoult -is engard -intl forestday -inter action -inten sities -in soluble -ic hen -hydrogen ated -hyatt world -horlo gerie -hollywoo dun -hin man -hard iness -gul lion -go ka -gigir ules -gerald ine -ge tta -fun ic -fu gro -franklin tn -for am -fatt oush -esqu ina -elijah wood -eck hardt -drive to -de ok -day long -da er -d allon -culin a -cu f -cro sman -circular ity -chub bies -cho ko -cere bro -c wi -bi zim -bent e -be fits -bangtan boys -archang els -am live -am agi -affe ct -abbrevi ate -ðŁĶ¥ âĿ¤ -ðŁĴļ ⾨ -ðŁĮ « -âĺº ðŁĴķ -ঠ¬ -zero ed -zadi g -yyj events -yo ker -wieg and -wi en -ve snina -vascon celos -trac tion -ti a -tat ler -sun tour -sun dara -summer holiday -silve ira -sie ger -shrop shirehour -shawn johnson -saad lamjarred -ren thusi -purple heart -proje kt -pro book -out shines -ol td -obstruc tionist -norfolk broads -nj hs -nigh trace -nh primary -mun is -min in -mee eeeee -medial iteracy -ma ps -ma ill -little italy -liqu in -lec tri -le tv -lady bower -kuz co -kot ze -kor k -klerks dorp -kin naur -kim dotcom -kevor kian -karolin ska -jig en -inu ddin -inter link -in ang -im polite -i euan -huy gens -hugh son -hel my -han ahan -gri ddles -gran ey -gai ley -fu cking -fr angelico -for tran -far oes -es band -enew ton -eat aly -dontt ell -de mag -de da -de cryption -corri dos -com té -clean and -cheese maker -cele stion -capu let -bur ren -buck nor -boh ème -b dg -atre vi -as mar -archan ataide -ant iterror -anee sh -afai ers -ad busters -aar nold -.... & -Ùģ Ø± -ع Ø© -î le -x av -word fest -war p -wag t -w tofficial -vor tic -van at -val se -v allen -unright swire -un changeable -ul li -tro py -tran sperth -to yed -thin gever -the troubadour -the iss -t man -sy on -swag ga -super her -su llen -starwars thelastjedi -solomon islands -scri ven -sb augh -ruf ford -rock yr -ro er -remain ders -raise it -q aid -pray in -post codelottery -pin heiro -or bach -ol lan -ny history -nou man -neville southall -napole ons -my friend -mitt i -messi eurs -memor ised -mb ro -ma hat -lil it -lal al -ko sam -kill i -katery na -ji zz -jeremy renner -jar ome -j swr -indie gam -human atm -hl h -hey dar -hermaph rodite -hell onwheels -hau ge -half girlfriend -h silverstone -gre sty -go braves -ge ir -fern down -faw ley -face off -environment ca -em ers -ear bud -e zz -decent work -co sier -cap lin -bry and -bri sca -bra j -boun der -blu ep -blair sville -berk ner -aw sten -as kaman -ari k -apar na -ag da -ab ati -a they -ðŁĴĸ ðŁİī -ye ast -y kk -wv pol -wun na -w jac -uve itis -uproo ting -under croft -un interrup -un frozen -twee tz -tor v -tam ping -steril isation -step by -sports ground -sn azz -sky trax -ski bo -sir pareshrawal -shim s -samanth afaiers -rall yargentina -premier ships -photo copied -phalar ope -pe ss -os wego -obac ter -n inet -monstr ously -mis st -mi elke -mer row -maz havil -manate e -m ku -lo ree -lic ek -le bel -lam ing -kou yate -klu ger -kk g -kis sa -kid de -kear ney -kathiel gifford -john reese -jaun ts -jason inthehouse -jap chae -ise man -har rah -groe schel -gre ying -google classroom -gear up -frequ ents -for r -fon tane -foll lowparty -esof tware -en ema -ely gutierrez -eas thar -does stuff -di arist -di anova -daily dose -cor ri -clean energyeu -chim ed -cal eta -brig it -boyle heights -boo gers -big b -ben aroya -bean town -be good -bad uk -bac oor -b dom -anjel ah -ah le -adiscoveryof witches -a ints -ðŁĩ²ðŁĩ ¾ -ð٤ij ð٤ij -yankee town -with you -vil lew -vi my -var di -ume boshi -trans africa -ton ino -tj thyne -thomas son -thew lis -teve rett -tch rs -su es -star live -squ ito -sinthe park -se don -rush olme -red pointer -real paulwalker -razor fish -positive energy -p tab -ou z -opend at -nottm hospitals -n ze -mile so -main tainers -main bhichow -m pa -m fr -liv vy -jun kin -jas want -ina hyattworld -in ating -hr ds -hartz ell -ha unch -guillau me -guil bert -guer as -god first -gibb o -ger ade -forti eth -flor iculture -fix ate -fashion post -extravag antly -elin asvit -elinasvit olina -e soc -e east -dares bury -cour teney -corner house -conqu erable -clo ppic -cl oris -charity water -chap books -brah mos -bol duc -bobb itt -balsam o -au tis -ant ler -ang one -alison brie -al ten -al bari -aa de -a hero -a aryan -ðŁĴ¯ " -ìĦ± ê·ľ -âĦ ħ -ر ÛĮ -yennaiarind haal -x aml -westside story -war li -vul cans -villa hermosa -val sad -ur ger -u pr -tweet dcs -tropic alia -ti w -the ho -ten ancies -sx swi -stable coin -sta ats -sped ding -smith jr -sea worthy -sculp tured -schak owsky -rowland son -re ha -quick ening -pur in -outback bowl -ot ally -old football -odi yan -neu bauer -me he -lie be -lali tha -ko tak -kari ma -kal afina -jec tion -je anna -jami ek -iv f -is elin -imperi ale -im ploring -green view -geroni mo -gay lor -gar der -gar bage -free theni -flun ked -es wc -eng lands -emanu ela -eas d -desider ata -danielle fishel -d animation -cw tvd -cr k -county champ -com pras -codepend ent -cli entes -caw thon -camero ta -bling bling -bit c -belle fontaine -bec kel -bar ritt -bally na -b dn -atti yah -an vil -american ah -ali w -alge bras -agchat nz -ag wx -afer rera -adverti sment -accessto justice -? ðŁĺĤðŁĺĤðŁĺĤ -ðŁĩµðŁĩ ¦ -íĪ¬ëª¨ë¡ľìļ°ë°ĶìĿ´ íάê²ĮëįĶ -æĽ ¸ -âŀ ½ -ਠ° -z solt -yaz id -yas sine -work shopping -water wise -vlog mas -vampire weekend -v anga -upthe blues -uni fier -un favourable -travel massive -tram ways -tr ng -ti bial -ther oot -the machine -tann ers -sub groups -su en -storm front -stay high -stag ione -ss afe -spoo fed -space force -sfr tg -roman ians -ri per -red mon -red crescent -re ur -pac is -p jc -ot ley -only louisiana -oneyoung world -og ham -nr ma -nick les -ngan nou -newcomic sday -n mea -meta sta -mcglin chey -mcge hee -mc goo -maxime bernier -kol chak -kn eller -jun d -jiofilm fareawards -j sh -j ip -il do -i ey -hey den -ham burger -haash oficial -grimez sz -go far -g tu -ek stra -e of -déj Ãł -disney princess -democr acia -del tabc -deduc ed -daim on -county fair -con iglio -cau ld -castron ovo -car v -cap tive -c sec -butterfly count -bu bo -bandi pora -b wh -b wf -ay ad -aw ns -ard ina -angie martinez -al phe -acad music -aar yn -; ... -ðŁĩºðŁĩ¸ ! -Î ¼ -y ati -wood brothers -winne mucca -willie bosshog -who what -wassen aar -ward law -walt disney -v sauce -un grounded -tric order -tom ics -to co -timessqu arenyc -stipul ated -star cruises -square pusher -soul silver -sherrie hewson -sand bagging -s gas -ruf fudd -rudy sarzo -robb i -ro fficialsite -re shoot -ran ker -raj neesh -rac eland -q nl -precipit ate -over mars -nul lar -nu ra -nan ase -msd n -micro pub -man bookerprize -mac ba -ma sud -lun ardi -leon berger -l ve -kel on -jewelry design -il dan -i kot -hol sworthy -hol beck -gl ico -gen z -gan pati -friend ster -fish finder -fille ted -fil mcity -du si -du der -dram buie -dor ange -don kin -dol ans -culture trip -cros shair -cor as -com ma -cas sina -carth ag -car sales -burk head -bubble tea -br attle -bol inas -bell erose -been leigh -bar croft -bach ar -autograph ing -at chi -ar dea -ade ts -ade sua -ðŁĺģðŁĺģ ðŁĺģðŁĺģðŁĺģ -ðŁĩ§ðŁĩ ´ -ð٤ĺ ð٤ĺ -ãĥ¼ ãĥ¼ -âĸ ¡ -à´ ± -zing ers -wave splatform -wa ag -vas ari -u chicago -tran scoding -top end -the golf -tex te -terry branstad -tar o -stel ly -solo thurn -ske g -silver fish -shot put -sho g -shi kar -sch ange -sc ort -sac ro -sac aja -s del -ror ke -ro bor -re casting -psori atic -popp et -plu splus -pete carroll -paulweller hq -pau gasol -pal ghar -oran more -o jh -nutr itive -neuro genesis -nau gh -mür ren -mu ggins -mis givings -milit aire -metabol ite -mcgi vern -margol in -mar ico -l wv -kirk sey -ke mayoran -kc v -k illion -jp gaultier -jes sphillips -jen ne -iam sterdam -ho cu -hic ham -ham murabi -gb highst -g willi -fran chot -fisho s -ex trinsic -es wat -equip ment -emol uments -emo tionless -earth gang -dor ridge -dogs rule -dj awadi -distr acting -dissip ates -diri gible -deflec ting -debut antes -de mus -dan soder -d and -cwa union -crusad ersfc -commen cer -case worker -bur ling -bul wer -brum bies -ben bow -batt ler -au sting -art galleryof -ano x -american pharoah -america east -am ing -akas aka -aig is -ah lers -agor aphobia -aau p -aa sha -?! ... -" | -you bears -yor ki -ye om -y ahh -whipsn ade -vec trex -vale of -v ran -ti econ -texas football -tamron hall -tag it -t chs -surf life -su mal -stru ct -spa etzle -skylar ks -skul king -se jarah -schiz o -rp bp -ro vere -ro ques -real music -rap mag -q amish -plexig las -plagi arizing -piper perabo -orr ville -o bb -my ra -mo ela -mesoli thic -mcgr ane -may theforce -m hart -lex ical -lar ouche -ku wa -kitti wake -kim chiu -jesus lovesyou -hit ler -heritage openday -hered ity -happybirthday harrystyles -han auma -ha den -grace potter -gandhi an -gallow gate -fin barr -fa asil -f chs -elen co -do that -dha dak -del and -dd t -con ci -con al -co sham -catal angp -castle island -cant wait -bucket list -boat wright -blit ar -bisch of -big love -bee ching -barri entos -americ aferrera -am bling -aig burth -ðŁĺįðŁĺĺ ðŁĺį -ðŁĺĤðŁĺŃ ðŁĺĤðŁĺŃ -ðŁĴĹ ðŁĺĺ -ë°ķ ìļ°ì§Ħ -௠Ĥ -под вод -ye pp -y su -y fc -vande grift -u oc -tw on -tony hinchcliffe -ton elli -them here -tennesse etitans -taylor r -tanker sley -tang i -sul fates -song lines -solihull hour -sk ratch -si so -seab l -scu ffles -scarl atti -sand u -san sui -roh ith -ro erig -real don -re thought -quant it -po zi -pillow cases -patricia heaton -park hyatt -opti que -od pp -och sner -nighting ales -naz ario -nab j -my fm -mmmm mmmmm -mir inda -mil roy -mein l -mater azzi -marshab lackburn -marsha ambrosius -mar isol -ma shab -lu le -labour ing -ko dy -kil birnie -kal pa -jone sc -j ato -isch gl -irre vocable -ir c -inte res -id pd -happ year -han sford -guer rill -glu te -fu uka -friday feels -for you -feelthe force -ema k -ell ondon -e schen -din u -dep tt -cop yed -colum nar -cherokeen ation -che wer -cantin flas -bristo lian -big wet -ba shy -art photography -ai ki -.. ?! -. âĻ¥ï¸ı -ðŁĺł ðŁĺł -åĨį çĶŁ -âķ ij -zee studios -zebra wood -z aida -wal demar -w sd -ver b -un characteristic -tra vie -timp act -the orange -the dorchester -t music -swis salps -su prabhat -spar ker -shi han -seduc tress -sec or -sciento logists -scan dies -roman tique -ro q -rmb aloncesto -ril les -ri sas -ren hotels -queens borough -pretty lights -pon er -patt naik -p elion -niobi um -neon atology -nag ios -mrolym pia -moon band -mon u -mon ong -misanthro pe -minim oog -me ia -mat aro -mai k -mach us -m uring -lu mping -little monsters -leann rimes -lang at -land mass -la vy -ky gov -koky anaamdoon -kirk hammett -k bp -jl h -iq iyi -infin itive -ide sof -go cavs -fran ko -fo de -ex ome -em mert -eldor ado -east wards -du gas -dr k -di awara -de pendant -culture matters -cresc enta -com fy -christopher son -bonesh aker -bel u -banan afish -au ty -ale ssa -! "" -ðŁijĪ ðŁı½ -ðŁ¤ ļ -woo dies -vulcan ized -uofl football -un wieldy -un truths -ud t -tradition alists -the meadowlands -terror ise -tar ar -sunnin ghill -su be -stevi evan -sonuk akkar -sond heimer -small z -sen berg -se bel -schir mer -sang u -sam pal -sad ak -s gurr -rock liffe -ri ou -reverber ation -reck oner -re focusing -rand corporation -ra stas -ra gione -quer cu -push up -pru center -pr icking -plant is -pi att -pd as -pas ka -park life -moss yoak -marke ta -lo ev -ligat ures -leu cadia -lam es -l js -kur us -kos suth -kore l -kne eled -kar le -kam ini -jonathan rea -jan ke -j lt -j hms -hepworth gallery -guic ruzzz -getting old -gent a -ge tyou -friedrich shain -fast cars -dol ton -dignit ary -david luiz -da rel -cyto kines -crab meat -counter weight -containeri zed -cont ango -co senza -cn trl -chris gethard -chon dr -budd h -brun dage -brook lands -bron i -bre vis -biz expo -biomed central -bin ational -beat yesterday -bar onet -bad shahi -aza dis -aster aceae -ap aka -ann an -algon a -ðŁĴķ ðŁĴĸ -å® ī -Ë Ĭ -win now -wes thigh -vo lei -vi tha -vi kapoor -ven to -van hoo -uuuu u -usas wimming -u spolitics -u bos -tru ant -trans mutation -tom waits -theatre sports -the billy -te viot -tat asky -ta ve -sub verse -sonny rollins -sho review -shadowhun ter -sand akoz -san ad -road atlanta -ric cio -rac isme -prin c -port arlington -play things -peu geo -per man -om ark -o tomo -notice board -nin ang -negre do -musc leman -mur fit -mis behaved -mini gun -micro glia -maz dac -mand vi -man bear -leon ardi -kil martin -kam es -jand k -ja bez -ishq mein -is dn -irration ality -ioang ruffudd -insol ent -i ç -i pr -i fac -hit ches -heff ner -heff alump -han ge -go valpo -gir dwood -gal vis -ent reprises -dundee unitedfc -dom esday -dissol vethe -dis believe -di santo -desal vo -colo stomy -chocolate week -cathr ine -carto graphic -can ed -bli ps -beau dry -aus able -atlan ti -ash well -ani ven -alth off -all ender -al ini -aden osine -aber foyle -ðŁĺĤ ðŁĻĬ -ðŁĴķ ðŁĴļ -ðŁı ŀï¸ı -ðŁİĤ ðŁİģðŁİī -ìĿ Ħ -ë±Ģ ë±Ģ -ãĤ¹ãĥĹãĥ© ãĥĪãĤ¥ -à¹Ģà¸ŀ ล -youre in -you ku -wor csc -white supremacy -visit lancashire -ver steeg -un desa -uk hi -u caas -trin arock -to whee -teu fel -terrori zes -sy ms -sunba ther -stron ach -streeter ville -sl una -skill sfor -shahb az -se up -scul lers -schro ders -sch wantz -sar gento -san ae -ri ghetti -revital ised -rat nani -po pple -po logne -plin ths -occip ital -nau ta -nau mann -n jea -musta fi -movie maker -mit u -mindless robot -michel inguide -may ang -mandar ins -m fc -ly th -luch adores -lido caine -les bleus -le it -kor cula -kitzbü hel -ju ls -joh ana -imp ale -i zi -i ed -hig bee -hay war -happybirthday zayn -grati fied -gne iss -g delaurentiis -fran son -food network -flw fishing -fijir ugby -fe mm -fe ile -fas si -far zad -fa aa -f mn -epic o -ent ures -elu ding -else car -dundur n -demor alizing -dago bah -d we -cros shaven -cor of -clu mpy -care ful -car bajal -bern ays -beat ntds -aven ged -asun rise -an halt -alizafar says -ah art -ðŁĺ± . -ðŁĴªðŁı¼ ðŁĴªðŁı¼ðŁĴªðŁı¼ -ðŁİĤ ðŁİīðŁİĪ -âĻ ¢ -ภ¨ -wra ith -womb well -wil hite -weigh bridge -us b -uaap cdc -trophy tour -tran sal -th abe -tele marketer -sylvani an -strat fest -strand berg -stran sit -ss mith -spo li -soori official -so jisub -so fun -skarsg Ã¥rd -sec chi -se les -sau ls -ric hy -rem sen -rece ded -ra su -ra dd -proud foot -prin ses -pot light -pnn lab -pas os -par nelli -paol onu -paolonu tini -pa ek -oy akhil -o skal -o india -o del -nu ovi -nisar gad -nat lib -mor taza -model monday -mbe ya -mash rafe -mag adheera -low sky -low ball -life buoy -labour leadership -kun u -kham oshi -jun jud -junjud api -haz els -han wha -guinnessi reland -global forum -gibb ins -escape from -el ayne -ec at -dru mmed -dis member -di baba -dare devil -d cast -crowd strike -crow thorne -clare morris -cho va -chel seab -che ka -ce zar -cat cher -car du -canon sburg -bru yn -brace well -bil lable -bee ing -barnar d -bal ers -avi o -at tune -ashion week -ash our -arde che -anjelah johnson -aishat yler -ðŁĶ¥ : -ãĤ¹ãĥĹãĥ©ãĥĪãĤ¥ ãĥ¼ãĥ³ -á´ ħ -zi b -z iller -wry golf -whipper snapper -w als -vad er -under takings -tyger berg -treecre eper -the east -tam am -sun bed -stick ney -soli daire -sk rull -shock oe -shanelo wrygolf -sen ne -schle swig -sagan aki -sacaja wea -sab ai -rod ley -ri jk -re organising -re locates -ration ed -rat tail -r tbf -r mh -polyam orous -pitt sylvania -pe ated -paramahan sa -ni evera -ne in -morning smaria -moral ising -moon spell -miniaturi zed -metho dically -md l -may field -manife st -lie bert -lech lade -lean up -lar occa -la ggan -kazi mir -jer onimo -jam una -iri she -idhun amma -ic sd -high road -hakk asan -gc pd -gator ade -gar ro -felici ana -fe igned -enbau ms -ek kle -eber hardt -eastern most -do bre -defe cting -de fusing -cyclo tron -co enzyme -chu bb -casu arina -c mail -branden burger -bi oc -asi va -ash uto -ani ban -age ar -ab un -. ðŁĺĶ -подвод нÑĭй -ze alandia -zach ery -welcome tom -uu ren -um hb -tur chin -tor mo -tin chy -ti ousness -tel ah -teenmom og -tan gos -swag gy -sw illing -ston king -sti fler -stable mate -ss d -sle h -sky walker -sketch app -si ska -shipla ke -score hero -schiz o -saun dra -sahi vikas -sag ra -ri ppy -repre ssing -rel ic -recor e -radi ant -proud papa -preston pans -practicemake sperfect -poinset tias -pierref onds -pen tru -peep s -osa urs -oni press -o ãĦ -ni j -nhat rang -n ones -my music -mv coup -mu erta -modul ates -mikeand mike -micro bio -marcu slu -maneu vered -kent land -kas sy -jer o -jeffree star -it sas -ira e -infu ses -impeach trumpnow -im pel -i jaw -hat boro -goli sano -fe il -extric ate -emper ador -emili e -ecto plasm -ec olabel -e io -dot na -din smore -dess ins -dele veraging -daily pic -dag gubati -cut back -craniosac ral -chom p -chi ke -chau dry -cargo bike -bozz io -bonec rusher -bat is -band ari -az traffic -artic le -amo del -air link -ade x -? "... -<<<< <<<< -ðŁĶ¶ ðŁĶ· -ਠª -x om -worm holes -white shark -wau pun -wade barrett -vol z -vbmplong march -un wed -uc ce -tugend hat -tric hot -thunder showers -tempor e -teacher goals -sun trust -ste ins -stav ing -sh moo -scot amb -runder ful -rock castle -robo call -roalddahl day -ric ke -reign iting -rafa ell -ra yed -ra jo -project manager -oyakhil ome -ow ska -obse sses -oat lands -navi star -natwest business -national popcornday -nas sp -mn cs -mn as -mi qu -metal lo -mer rett -me tha -mat y -marlin spark -man gi -man ette -m kc -longh and -long now -li aqat -lam son -ko han -ket cham -kel tner -job sat -jer seys -indi um -in ay -iam harishkalyan -hate ley -hare di -green arrow -fran go -foodi sta -fili bu -fil invest -fi endish -farru gia -fan ad -fair less -en us -elo c -ecuad orean -easing wold -duncan bannatyne -de ese -cytok ine -cum by -cro xley -coopuk food -chee z -ben im -bai le -au le -apic tures -ah madre -af fil -acuer do -abandoned places -ðŁĺĶ ðŁĺŃ -Ó Ŀ -подводнÑĭй миÑĢ -water buck -w ami -unitedin blue -tson gas -tin z -the affair -teng gara -tani shq -sym bology -stevievan zandt -stere k -staff pick -sahy ounie -royal acadmusic -ro ach -riz la -refin ements -red rum -re processing -re eva -rann vijay -radio logy -r ble -pro series -per ju -over lapped -onair now -observ ances -numen era -nhsor gandonor -mt leg -missteen usa -miseleccion mx -miner alization -low enthal -lo presti -lhu illier -ld an -lay ne -ki we -kewau nee -keep it -kas ol -jonsnow c -j ast -j ale -irish wildlife -indi anoil -il san -i ai -hu c -hiday ah -herecom esthe -her sch -hal don -h sps -gn ome -gg n -g wi -g abo -fu vah -flag poles -fi ala -fab y -essential classics -em all -don da -ding bats -de vens -cor ra -che tan -celluc or -c its -button wood -brow ser -bracken ridge -bloc party -bis ola -big ja -bhu m -bey er -bell am -beg at -be sant -bb w -att proam -ar ar -al ao -ab la -/ Â¥ -ðŁĻĦ ) -ðŁĺį ðŁĺĭ -ðŁIJł ðŁIJŁ -ðŁĮ ĸ -âľĭ ðŁı¼ -ye go -y xj -windo wed -wain sco -w ady -uvamen shoops -un dip -u bd -u ach -trump crimefamily -trinarock starr -toddler life -tl ach -the arvindswami -tattoo fixers -tad ley -t mall -surfact ant -sun aina -stur te -steg ner -ssi m -so an -silen cers -shar pei -se anie -ru inous -robert semma -re mar -rachel hel -rachelhel devans -qui les -plussize fashion -pl one -pin pointing -park man -pad arn -p ty -osric chau -oskal oosa -or adea -of art -nov ation -nfldraft news -moon alice -mizzou made -millon arios -melt downs -mell on -meant tobe -ma daya -lu cks -loy ello -leic s -le ks -later ally -kyl erichards -kopp elman -kanna digas -joseph capriati -ji bes -int ouch -ihear tt -hay tor -growwith stpi -ghost of -gang bang -galactic os -full sail -eul alia -er ot -east england -e oe -delicious ly -crew kerne -com pi -ck m -caver na -bon eta -beverly hilton -bee by -be ber -bank ole -asil omar -arctic council -all wood -aldub birthday -.... ..." -ðŁĺį ðŁĴ¦ -ðŁĺģ ðŁĺİ -ðŁĵĨ : -ðŁ§¡ ðŁĸ¤ -à¸Ńà¸ Ń -Ì ´ - ¤ -wis ner -w acc -ut sw -u dr -travel port -thene igh -thel ine -stor ck -spir aled -spar ling -sp ackle -sopra se -sham il -sal ata -rosen stock -red devil -re hn -r pv -py ra -py ar -pier das -pav elka -or ac -onthe way -old times -nuern berg -nola prep -never stop -moon ey -mom ot -me ul -mar n -kuni yoshi -kun ti -koz lov -kis o -kenneth cole -kat ty -jabharrymet sejal -ist at -ik ongallery -i shaq -himantab iswa -high sch -head butts -han ley -hairy bikers -good lettsville -gol s -gi olito -ge bauer -fidge ting -fen elon -extra solar -eu logies -electro cute -eis ele -ed dine -dan s -cro cker -cre wd -cr illy -colin donnell -cin eloka -child wall -cas par -bridge way -bounce tv -black ledge -bir an -bb itt -bail outs -arty r -al tin -abkhaz ia -ðŁĺŃ ðŁĴĵ -ðŁĺī ðŁĺı -ãĤ° ãĥ© -âĿ¤ï¸ı ðŁĻıðŁı¼ -âĿ¤ ðŁĺĤ -ี à¹ĭ -ye ti -wood fin -wkr g -win ker -wi ft -wi arton -whatmake syou -west gate -war of -wahy u -w ado -view port -vic kie -vi u -vi as -versi oning -va den -tri gga -the wil -the len -the fca -th off -th iran -tes da -tart arus -t kc -sy oung -stro ked -spring fling -sil vere -si q -seed sof -sche idt -scavenger hunt -sav as -sa aksh -ru die -ru bus -py g -pure foods -pro quest -pl eno -pin as -our met -or yan -one chicago -ny gard -nbc s -n inju -my nameis -my mt -movement detroit -mil f -mary popp -mary kom -mar ym -maine alden -lu tte -lon za -lin en -li isa -leav en -k com -iron hide -il os -if j -i yd -i bey -hill topper -ham al -gro per -go big -flye thiopian -fli ms -far rukh -emolli ent -el debarge -du by -doo cy -dal gle -copp aitalia -con court -coco bolo -care ssed -brang wyn -big blu -bid vest -bi ondo -bhav ya -bernar dini -balas ore -aster ia -asse h -argent a -ar cham -appel baum -ant miner -an var -amuse ments -amer urological -amali earena -alo dia -almost there -all americ -- ? -ðŁĺĥ @ -wap iti -w snc -vigne ault -uscen susbureau -ug av -u press -trichot illomania -toc tober -that guy -terrel lowens -team hisd -synth ase -swi hart -sun de -sky blue -sel znick -se folo -sefolo sha -se ds -sal aam -saf dar -runderful runners -rubik scube -ru tan -rh statton -potro juan -pitten weem -pho tome -pa ese -not man -national vegetarianweek -mu rex -member ship -meh endi -max carver -marriott intl -mar ck -magne site -m scs -lise berg -lin ge -limit less -le long -laughing stock -klu ang -kemp o -keep fighting -jas mina -i wat -hor field -hen nigan -ha ag -gun valson -guin an -glori atrevi -girls frontline -gat as -fu chi -fri er -flavor wire -fish ball -far point -ende ared -ebay uk -dun laoghaire -dis regards -del t -del potrojuan -deb p -davi di -conceptu alize -coeli ac -cheese makers -cas eload -c thul -brit vic -be tech -bb unker -ballyfer mot -bab bler -ati veness -ary digital -angel candice -ang lian -am yl -ae wrestling -adel mar -ad li -action aid -ach am -ðŁĻıðŁı½ âĿ¤ï¸ı -ðŁĻı ⾨ -ðŁĮŁ ðŁĴ« -weet suk -ver mark -ve mma -ve iling -va sek -ud mila -tre orchy -to prank -then ba -the science -ter ps -swild things -sugar beet -spyro reignitedtrilogy -sie ber -sheryl underwood -she inspiresme -sed aka -se pan -schau m -sam ael -sab on -ryn ism -roo ves -ri zo -real adam -raz il -po per -pas sio -park chat -orochi maru -oqu endo -nycw ff -neem rana -nadias awalha -mol loy -mis interpret -mir alles -minoc qua -mesc lun -m ellis -lovel ive -liber alisation -langou stine -lan vin -kubernete sio -kro on -kor ay -kk ad -kha itan -kart al -k vad -joy riding -jon antoine -jas pal -israel ic -in man -ic sc -hyper mobility -hu main -hu ac -homelo an -hit en -halit osis -h illa -gra ves -gher itage -geo duck -garages ale -fi dm -fac a -f wd -f ali -eskil stuna -east west -dro m -do bell -cross border -crisp us -contr ite -constan za -con ca -committ ment -ci for -cher now -buil tin -br arian -bo dil -bla sian -birds all -be chara -b é -atu ta -ar land -ar ka -allianz stadium -achaem enid -a aco -ðŁĺĤ âľĮï¸ı -ãģķãĤ ĵ -ye vadu -world milkday -wil den -west town -west by -weh ner -ware ing -vi aggi -v liss -track er -toom bs -tonight show -ton yy -thick ly -the vault -texa shoo -tab o -stri de -sri rang -spice works -sm pte -ship board -s feld -ru shin -ro sol -ri var -retali ates -real chalamet -re ves -re state -rand azzo -quadr illion -particul ates -om okri -oc allis -nr r -nobu o -monong alia -mis behavior -micro cephaly -medju gorje -massimodu tti -maso chism -mangal am -mag con -maced onians -long sword -le claire -lan the -ku ril -koz ma -k wwl -k wes -jer kin -iv on -im bolc -hudders field -hor tense -hin tz -gire sun -ge ting -fun kier -fu buki -fo cke -fa hr -express yourself -explorey ukon -en ns -en contra -double speak -di xi -dev as -despo tic -dec ke -dab i -cr ys -confidenti ally -colombi ano -cj mccollum -ca ston -bul ba -bre land -brah mi -bio solids -bio logical -ber rington -bax ley -barn door -bare footed -au slan -atri z -atlan tico -arm wood -anim ates -af corse -ac tavis -.. ] -âĤ¬ ! -wy theville -wind jammers -water vliet -us bank -tu ban -tom leykis -the place -taxider mied -tan guay -tad deo -sub human -su desh -st place -spy aar -spo sed -southland strong -sou chong -sno rer -sk ene -shor tener -sh aus -seavey daniel -scra ppage -sch angelives -sar ad -remo re -ram c -ra wn -profe sses -phara onic -naro oma -myst ere -mycen ae -michal ka -micha elian -metal ocalypse -med wick -mar lyn -manu va -mah fouz -m vula -lov att -lem w -lele pons -lax ey -lam beau -kian ow -jyo thi -jy h -jorgen son -jeric o -jamesp ure -jah n -iz a -harmon icas -green vale -gin der -george monbiot -gang plank -g ice -fu ggin -fresh fish -follow meand -felic itate -e still -e bit -e ath -dero ssi -de cameron -daily pick -con gis -chath iram -bow fin -bournemouth uni -bor sch -black down -beach resort -be anie -ban ani -as mita -ar ses -aqu ad -al gos -adam sville -? ðŁĺİ -" ." -ðŁĵ· ðŁĵ· -ë°Ķ ë¹Ħ -æ¨ ª -à¤ľ र -yo gat -yellow legs -x radio -tearsfor fears -sw op -sunnyside oflife -sunday dinner -stony hurst -spartan up -sj now -sivan anda -saro yan -sar p -re buffs -quint al -plac ate -pl and -pic co -phill yd -or folk -nol anews -nationaldayof prayer -mom oka -mas vingo -mandi bular -lu kel -li ppe -li pari -kwe se -kon jac -kappa alpha -k rin -james brown -horu sheresy -hen ares -gv l -gu ba -go dric -gar ve -friday vibes -free tips -food court -energy ctr -eclip tic -ec fa -dom atic -diom edes -din ars -digital is -desper tar -dark chocolate -capy baras -brexit chaos -br st -boxingh istory -ber ga -beauty ful -bang ali -bal wyn -bal ay -back house -baby care -b worldph -azz edine -ann ville -al or -aar ushi -! ðŁİĪ -! >> -ðŁĽ ©ï¸ı -ðŁĺį ... -ðŁijħðŁijħ ðŁijħ -ð٤ĺðŁı¼ ð٤ĺðŁı¼ -æ° ´ -à¶ ļ -yo av -yearofthe pig -x fc -win chelsea -wal pur -w car -vere enig -vau k -us lacrosse -u bie -toku gawa -the cityof -terry mcauliffe -tech republic -tar ana -stou ffer -sm ps -si mus -shro shan -she at -ridd hi -reg ar -read up -pu le -pro sumer -pro log -po ise -pm kk -phyto chemicals -pay with -pan agi -on do -olivi ad -oke reke -nicholash oult -museodel prado -mur gatroyd -munchau sen -mol ite -micro chips -mar yan -lino type -kne en -karti ka -jen kirkman -jeet endra -jaguar uk -is spyaar -in ko -ilove him -illino i -hydrochlor ic -hu ws -home opath -high grove -hell yer -har tono -har ol -gur preet -guil tless -gin oclock -gari ff -furi ous -fried berg -form ichetti -food market -ever ts -esp ie -epo que -eco logy -east anglia -dom swildthings -dam nnnn -craw daddy -commen sur -chab ahar -can ecor -box all -boing boing -black canary -bear de -bake ware -b schweinsteiger -ayush man -auckland uni -ad wa -abdic ate -???????? ??? -: ^ -ðŁĩ§ ðŁĩ¦ -ë© ´ -Ê ľ -wood lot -weare lebanon -ut sw -to ona -ticketmaster ire -the boat -te vis -sverd lovsk -stra ÃŁe -so bol -si aya -shab at -seat on -schle ck -scan ty -royal marsden -ri ki -ri bas -pole mic -pig spotter -pi mi -pi ave -pf dj -ped doc -pe urope -on kar -o wino -n ali -mun dra -mc w -mali q -luci da -lanc s -kus inews -ko y -ko ech -ke okuk -kali sta -kale em -ju icec -ise tte -io dp -inchic ore -in shape -ic ade -huck aby -hones dale -hann u -ha vet -global port -gl v -gess ner -food por -fi di -fathom events -fan cast -faceto face -ev g -epic mealtime -el sey -el oping -ek strom -ego centric -e red -duter te -dil f -der ms -dback s -dam u -da si -cy ma -cul po -cu ca -cro hns -camo zzi -caer philly -bt sout -brum ley -boy yyy -boro on -book selling -big al -bel go -bar soom -az oid -aver maet -ash bery -arun del -ar mine -ar anya -anthe mic -am mann -all smiles -ak dha -ab sr -aal st -⼠¸ -á į -yo z -yan an -y reka -witchesofeast end -wedne sfield -weare somerset -vote on -vir now -vi anna -un amid -ts live -tre gi -tonik roos -titi ously -the af -ten enbaums -tas neem -tapp reciationday -t pw -super conductivity -sub tweets -su render -stor ify -spor tier -sma son -simply thebest -side real -shiny pokemon -sher bourne -saty ricon -rule making -rid doch -ri ving -pu lli -or le -non such -my din -molca jete -mirwa iz -min yan -mile sa -mar imo -ma it -li mi -levi en -lang er -lam i -la vern -kirk wood -kir aly -k lansman -jun cos -joy pad -joy land -jo akim -it slav -irish men -ic eni -hum drum -hound mouth -ho palong -heu ston -gu u -glan mire -gas ometer -gamer tag -fried land -explic ation -end stigma -emm ure -emili aclarke -el bowing -dic kel -deli st -de oxys -cyber threats -crou p -cor reo -clark stown -charli ecox -cham ploo -celand ine -car rel -bren den -blo que -bir m -bha sha -bake sale -album launch -abo ttle -ab loy -îIJ Ķ -âĺĢ âĻ¥ -yam asaki -writ es -whodares wins -whi ther -w punj -w lb -voron oi -vo th -ventur ini -vat ica -tom u -three peat -thereal deal -the spy -th ant -super sized -sun ited -su kan -squ ely -spher ion -spd way -sker ritt -sk ook -sher borne -sen tertainment -sam is -sa kov -rou leau -roh nert -rad bury -ra var -quadri foglio -portugu esa -pipi stre -petro leu -outri ders -orn stein -occul tist -msp bj -mr sc -mou awad -ly ons -love animals -leibo witz -lam otta -kam lesh -kach a -ju tro -jeopardi zing -jasmin bhasin -ira p -interro bang -hor y -home towns -haul in -h sy -h ll -guacam elee -gu adi -gi di -freedomo fexpression -fred hutch -foun din -fore stal -for justice -file sharing -fe alty -fati ma -east ville -dream ies -dio ts -di yar -di bbs -des sus -demon puppy -co bar -chry soprase -chan soo -call out -cali gari -c fas -bo pping -bio data -bin son -bil dung -big money -bell field -bd world -bce fa -aver n -ar ice -an cur -amb ition -ale wife -ag uri -adrien broner -aarhu suni -ðŁĺį ðŁĴ¯ -âĦ¢ ! -à¹ģภķ -za j -with ings -wau seon -ugandac ranes -tux edos -tr ung -to z -tin u -thegro vela -the csp -ter f -sunds vall -sty lers -shirt waist -shel ar -secon dam -sea field -scele br -sar aya -salu brious -ru fino -ru dhram -ri ott -rc ds -rajkum mar -ra don -p ity -ot su -official gtfc -o gg -ny nj -mosthand some -mor se -moon walkers -mikha ilo -methus elah -mans ard -mal one -lumi ère -lo visa -lin as -lift ing -leg omar -k sa -josh ritter -intran ets -indent ation -hv m -hin ck -ha gg -ha dir -guide dog -gu ymon -green town -fro man -friday funny -film day -falcon srugby -en q -efferve scence -di wa -deli us -defin e -de cker -crow child -cor ks -coelac anth -chi ku -chi eri -brian ab -breast feed -brand er -brainfe eder -bra il -bol am -bassen thwaite -annihil ating -angel in -ag ala -ðŁĸ¤ # -ëĭ Ŀ -à¹Ģภŀ -zz era -za rena -x ambassadors -von der -under studies -taste ofthe -tal pur -summer all -sudden link -starfish club -spro ducts -ship ti -se ite -scot papers -sc pol -s br -rw u -rajah mundry -r dio -pur ush -policy holders -pit an -photography lovers -pal lette -oz on -ou zel -organi sts -nu hu -ne pon -muk bang -milk music -megab ytes -map quest -make s -lux or -low enstein -lake street -k dfw -jessic abiel -interpret ative -in audible -huiz enga -hil dy -herz liya -helic onia -heil bronn -head e -hal se -grid ded -gin osa -giller prize -geo tv -ge vent -gath bandhan -g eli -followmeand lufc -focu srite -fo kin -flaun ted -fist fight -el ol -desh on -demo polis -cu zin -chil lum -cataly zing -boy ko -beet z -back logs -ar il -apple man -ang ou -an jani -abu jat -.... ...@ -ðŁĴĹ ðŁĴľ -ðŁĮº @ -yoak erson -yam pa -y azi -wood loch -wol stenholme -wip joy -winner winner -wild trails -wendy davi -wendydavi stexas -war ped -vo guing -ur yn -u rock -turf care -tow ler -timpano gos -ti gran -thic um -thear can -the charlatans -te var -super delegates -su er -star there -st event -sri kak -sk iss -single because -sin chon -shadow lands -sea ice -se gi -sb g -s see -rally cars -pott sgrove -pan macmillan -onther un -onec lick -omar ket -newhol land -nbc u -na dez -musc ari -mel loyello -medic om -mcen ery -lu mut -liveonk val -l win -kro p -kogar ah -kind l -killer instinct -kap ten -justin amash -john lewis -jamespure foy -indvs ban -hydr onic -hud ler -hoo fs -home boyz -hom ero -ho c -her ms -havasu pai -hanni fin -gu avas -gr itz -glam bert -gen bosch -gadgets now -foh len -five ways -fin ian -extra it -en dimp -elong ate -ebol are -eb be -du dh -dor st -dj arum -dishon our -dee boss -daysof halloween -dan c -cullo whee -cu ts -corstor phine -comp ere -committee man -comeon england -clay mont -chin moy -child health -char cade -capsaic in -boulang erie -bosco v -blo lly -black stars -bir bigs -bigja yoakerson -bapti stery -atre ya -ascle pias -are la -ar bs -ad elie -abre w -ðŁĴĥðŁı¾ ðŁĴĥðŁı¾ -ç¾½çĶŁçµIJå¼ ¦ -âĺº ðŁĺį -ಠµ -zuc cotti -witch finder -wester feld -w azi -um ni -tri pple -tr ons -tou bkal -tom ikoshi -these days -ten dy -summer inthecity -sp sp -ser ch -ser ata -sch ola -sauer land -sar rac -saal bach -rufu shound -retail tech -reign fc -ray son -pro jets -prefe cts -party likea -pan ca -over threw -or to -open office -od walla -oak ed -nord land -net wor -nat rona -michaelian black -look north -le us -le eland -lamar athon -la fond -l suf -ko c -kal ender -id s -hynd burn -hook sett -hill side -help fulness -help find -har din -go towv -giro lamo -game plays -franki eco -fon tes -fi des -familiar isation -falken berg -elm street -dream ily -downe ast -doors open -door ly -der mann -de fazio -cur now -cu lia -com pl -cheese steaks -ca bez -brian solis -blo ss -black dog -bhuv neshwar -ba quet -az v -arab i -americ or -aco de -ac ac -ðŁĮ ¡ï¸ı -ï¸ı , -ìķ¼ ìĥĿìĿ¼ì¶ķíķĺíķ´ -ze w -youngh usband -we kiva -war ty -walkawayfrom democrats -venetian vegas -var kala -v city -us mani -thom az -thi ya -th ae -tequil aday -team wear -te ju -taylor twellman -star link -ssc supports -sphoto aday -spaw ner -sole dad -scott sburg -saw tell -s restaurant -rukmini maitra -rte pt -ron icle -radio gram -rachel e -pushaward steam -popul arize -polymorph ism -pent on -park academy -nor berg -new shd -ne vr -namo again -n ms -mä r -my level -my int -mire poix -mi mas -mcgillic uddy -mb ali -lun ds -lovel and -like the -kitt u -k young -k tour -j ook -itslav anya -inter house -incul cate -ig ai -iam raj -he ward -ha eckel -goh pu -geor di -gallo ped -fm revolution -expre ssible -egg cellent -ed onne -ed cny -donof rio -der k -delgad illo -del anie -de cky -daw at -comb iner -bur nol -break time -bran didentity -boy an -bird ville -ber io -barn ton -ar isai -al ate -ðŁıĥ ðŁı¼ -ðŁ¤Ĺ ðŁĴķ -z ro -yo gare -whatchamac allit -wallen paupack -trol lied -tren chard -transi ents -tom burke -thereal t -the island -tal umni -ta pan -swis sair -swil kins -stargate command -stand on -spon sored -spe ights -small cap -shadow ofthe -shad ri -sel t -sandakoz hi -ro chon -ray ford -projec tionist -produ its -pre press -plat ina -pak tia -padra ic -p mma -p fau -or lé -open water -official brianab -o sian -o ols -o ben -note toself -night breed -nic ho -nephro tic -nar aco -mrricky whittle -mou le -mb na -makeup geek -mai ja -ktul news -ko ji -jo v -in syaallah -iam rapaport -i wl -humor ously -han scom -gut mann -gran ato -gene w -geek wire -gardat raffic -gale ano -fossil ised -fer lin -equi ano -energy drink -en chong -emo re -eg ill -education matters -diony sos -desc endent -dele momodu -d oooo -cur rin -con is -com pr -chuck led -chester man -chess men -cau dle -car apace -capit aine -cap tor -cam eco -cam bs -buck master -buck by -bo ad -bfi player -ashwag andha -army worm -ar mata -app raising -ap ical -all ingham -å¼łèīº åħ´ -zo hra -yor gos -wing ate -water wednesday -walber swick -w add -ut din -u go -trum peters -tre ver -tar lton -taco day -spat tered -social isation -smith and -sky dance -sillu strated -shop ing -shi er -shan ina -se meru -se ib -santho sh -sai baba -ru sko -rrrr rrrr -ros man -ronkon koma -richar ddin -queensu belfast -quad ran -py ros -philli pson -pe du -onep lu -o sim -north enden -nel ms -nat itude -nam rat -naji my -mu b -mor ar -mn ps -milli pedes -memor ias -megab ike -me sos -may bury -matthe wr -man nen -mai z -ma bini -look out -like apro -lec key -la veen -ku ehn -jobs report -jku at -iw g -ive y -indubit ably -i drees -hog sback -hockey family -har lee -ham e -guadag no -glene agle -ghj nancy -gastroenter itis -for more -foam us -fly boys -europa africaus -eti enne -ee red -do oly -dh cp -del ilah -dang led -cine quest -chondro itin -chas ma -cambo dians -cali x -bwp mag -blit zes -bad u -au key -as weetz -as pr -aryas milesa -ann us -ami go -ami en -ame mories -albu min -al fond -af fen -ac lass -abu ena -abscbn ballfanfave -ðŁĺ© ðŁĺĤðŁĺĤ -ðŁĴľ ðŁĴĹ -ðŁĮ¶ ðŁĮ¶ -ç º -âĻ¥ ) -á´ į -zab ar -y st -voor trekker -tull amarine -trilo gies -the union -the outdoor -tern ary -t boss -sympathis ers -supportsmaller streamers -sun leashed -stay curious -softhe sun -so kratis -so beautiful -sap hira -safavie h -rim rock -repe chage -raff lesia -prote stan -propor tionality -prior ity -parana que -pap ri -outer most -or of -one another -ole sen -nit ra -mon dial -masto dons -ma go -lord sof -long year -libr ari -li gion -kir yat -kf st -kai kai -itb berlin -iron men -in om -hohenzol lern -har bord -ha beeb -gui on -gop nik -gem elli -gar rel -full backs -fru ctis -for going -fl acqua -fin zi -family search -ei j -ed gard -eco logies -du plantis -deer stalker -chul alongkorn -chiem see -char rette -cam tasia -but ties -bo si -bitt u -abu eva -çµ IJ -âĸ Ĵ -à¹Ģล ย -zipl ining -zi all -welles bourne -vermark ter -technic alities -sylvia earle -swag gering -sv rofficialsite -suppre ssors -stru ve -storm chasing -stan way -so logy -so jo -sl ender -sim la -sicklec ell -shko dran -sens it -say uri -sang li -sa jal -round top -re constituted -ram usic -rain raingoaway -q h -presen to -poste co -positi vism -oviya asweetz -outside isfree -oscardel ahoya -oon agh -ol ata -noise maker -nj ed -neck deepuk -nbaon abscbn -mour ne -mit ton -milose vic -mi rah -medi os -markie ff -maneuver ability -lu koil -kier ans -ker shner -i sec -hymen optera -hi bou -he ye -ha dad -gold line -flo rent -elder ly -el mer -direct mail -ding man -de sha -day man -cri sil -con spires -collo id -cla pper -chi vette -bobb yl -black ball -bla a -bhan ot -bag lioni -back tuesday -b center -av ger -am axwell -air c -ad ap -;; ;;; -ðŁĺ¶ ðŁĺ¶ -è · -ö rebro -zhangji ajie -ze hr -your city -yod elling -wq ed -world traveler -wipe homophobia -wgn morningnews -wampano ag -tol puddle -thamma sat -sur ry -stri jd -sti o -stargat enow -st arer -sorren ti -sna king -sm qure -smqure shipti -sla ir -sho yu -shi mabu -secon omy -saq lain -sali sh -sa ine -s folks -rim world -retro futurism -reci proc -real oviedo -re ko -re but -ra ziel -quincean era -prohi bido -phd advice -pete holmes -persu ades -passer ine -oz turk -outla wing -ord ina -on elife -new borough -n tc -mur muring -lytt elton -louis bourg -living wage -kr l -ke fla -kar jon -it sines -iphonec ase -indiad st -hy rax -hide yoshi -gwil ym -great places -graceland tv -gd w -gas man -faz il -fawk ner -f wisd -f bun -en co -emancip ate -ec ma -dog sled -disband ment -descen der -cre flo -cor ries -coch abamba -cle ft -cheryl strayed -caw lidge -cast ella -cand our -camelli as -by field -business objects -bur tt -bump us -body line -bit mex -belle ek -bangalore mirror -back er -atic sofc -as aka -ar nell -anz hi -allu ding -ala inf -abscon ded -¦ ¬ -zam perini -wheat kings -weather aware -victorias murfit -vic uni -train z -tin er -theech ola -the kids -ta day -sw ct -sud heer -su cia -ssmusic tweet -soci ally -sens ys -sch itz -sc ct -rock ymountains -radio leary -pat inated -partri dge -par mi -over filled -offic ina -o strom -o shaw -no reen -mo anal -mini max -miam bode -mi kay -mge xp -mega fest -me glio -man gat -maison neuve -long stone -lin tas -le hua -ko ven -kla x -kan gel -justi fications -jesu si -hor rell -hard scape -h vc -feld spar -fat lanta -f andi -envi ed -ell ner -el baz -direkt vermarkter -dense st -de vel -dartmoor npa -dar ina -cu ir -colon say -clar in -cen sored -cb ssacramento -car ting -cab an -bur berry -autodesk revit -as car -amar u -amand aw -al ness -ai der -acal cio -ðŁĻĭ ðŁı» -ðŁĶ Ī -ãĤ¸ãĤ§ ãĤ¸ãĥ¥ãĥ³ -vau dan -val et -taka shi -swa ke -sw ole -suffic ed -stra iners -sprint car -spe ts -sk oog -shille lagh -shab ira -ser ran -se watch -scri me -sap ient -santi ag -saint petersburg -s against -rex all -re stom -re released -prin touts -prematur ityday -por voo -pharmac are -per kasie -pass ant -p tz -ou den -oo ch -o eming -national bank -nath and -n tra -moving on -mor os -mo hen -mmac donald -ml baz -metho de -mess enger -me geve -marion berry -l anner -ko shy -interrup ters -ic ci -hom burg -hep ner -har rass -god ble -gil bey -ge uze -gaku in -football club -end games -en sler -eb brown -dry burgh -dram men -doubler ainbow -distracting ly -devol ver -defl ationary -debbi em -dealwith barbie -david stea -cv usd -criminal ising -cleveland birds -cla vi -chugg ington -chel seam -car mike -camp ylo -boat ing -bar bey -b caas -azadis quare -atla ses -at more -asap twelvyy -angi ec -alwaysinourhearts zaynmalik -alphabe tized -ðŁıŁ : -ðŁį ¢ -ðŁĮ ¥ -à³ Ģ -ÙĬ ÙĦ -ö lln -yon der -ye x -yas un -way n -verso books -us nationalguard -us ki -ur mia -uni g -tur bin -trus cott -toc cata -thr s -the bug -team uk -te ren -songsong couple -songkh la -son ho -smith ies -sci anna -schwit ters -saram ago -sad y -s fai -ry l -ro ty -realjoey fatone -r ly -proté g -pro viso -pro start -pra k -per cheron -par took -ow ch -oto gp -osman thus -oman air -o vas -nw f -north pole -muham ed -min ota -mg tab -mens fitness -mark kanen -mar ye -main board -mag al -madra sah -lu chi -lovel ady -lap sing -kon nie -keith harkin -kear sley -ke pala -k pp -k ameen -jw marriott -j pp -impregn able -i bye -hant u -hab iting -gunner sbury -green jackets -gol and -gh es -gestu ral -gerr ards -free agent -foodies festival -fo storia -fir ste -emb leton -ellicott ville -ed aily -down payment -don nacha -deser tion -deca icdc -de wald -de jas -cri p -cook top -cole tta -claire coffee -cha yote -carri g -by er -book ham -bob bie -ber gy -bal asaheb -at wal -ant enne -ann elise -andy ar -ai x -ðŁļ ħ -ðŁijĬðŁı¼ ðŁijĬðŁı¼ -yr ds -work fare -whir led -whin chat -wg no -vivi en -virgini atech -v art -uni ge -thelast drivein -the guardian -team bcps -take off -sthel ena -re sold -rand leman -pu ga -proud mum -pper man -post es -por res -polis ario -ph oria -per icar -per der -par it -om ana -ny ro -nw sl -nra am -non conformist -nigh tow -neat ness -ne sha -nawal el -nat rev -my love -mount view -man nan -mad flavor -ma slen -lyn skey -local memphis -lili reinhart -l kn -kwa cha -knowyour rights -kil gariff -kei yn -kay ong -jarrod farmer -jaros z -jamesx reid -ine ering -in putting -honor them -groen eveld -gotta seeit -fitz museum -fad own -esp o -en hs -econ et -e sts -e star -dinis guarda -di mo -design ates -cru mpton -centr alization -celebrity awards -car aga -british rowing -bg sconf -ber ated -be art -armor y -armag nac -arch es -ar onia -al ico -akinwun miambode -aki hiko -adi az -ac ord -." âĢķ -ðŁİ¨ # -ëĭĪ ëĭ¤ -à¹Ĥ à¸Ľ -ਠ¬ -y oma -warren ville -w ft -ve ere -union pacific -unic o -u oa -thrust master -the ovon -texasedm family -tecno logÃŃa -tanam rull -tach yon -sydney mardigras -sur an -su wa -su tanamrull -steph ania -societ yof -ske ins -sil loth -sen ora -scott m -sco pa -sas sn -ru ffa -rol ston -rhay ader -rep aved -re se -r ll -queen mary -prevention month -pre amplifier -paw lowski -parole es -nit zer -night vision -nh sm -n jr -mogol lon -mo fs -midnight sun -micro meter -mel ati -max us -mar adio -mam malo -mai oc -mac isaac -maaj id -lympho blastic -loving intan -le cky -lam brewery -krzy zewski -klu wer -keep ingthe -kat anga -judd monte -jing yu -jin xing -jab ir -ist as -hyphen ated -hear ken -he slop -gu ana -gram mars -goldeng ate -go ree -gi me -ghos al -gach anja -for ged -flyer stalk -fish on -evi denti -epitom ized -e jay -den airport -dar ude -cor nic -co bby -car rum -bobsburger sfox -black shirt -bio genesis -ber litz -balli ol -ayan ami -ark ell -ar ryn -anag ara -allianz leagues -al wan -ac land -a kel -é ed -yvr shoots -ym pia -yam anote -volta ic -ven i -un saved -tug boats -travel show -too hey -toc coa -thir un -the do -ter racing -te questa -suffra gists -spoil sport -southern cameroons -sk ok -sc illy -rud nick -ru tt -respon sable -ram rod -ram ji -rajiv gandhi -quar ta -pre match -play ford -pj hl -phal le -per saud -par ool -nypd protecting -nul and -newengland patriots -new speak -nagu ib -mwal imu -mur at -mor tlach -mor ada -mistre ating -meli ke -me ment -mccon key -mc par -mar lette -man fre -man dered -maffe i -lu so -leve es -lead beater -lea g -laroc que -kve w -ke ira -kan san -jesse welle -jam u -jake bugg -irrig ating -ib w -hyper dub -hic kie -harri ette -gol la -gar ter -ga ura -fla vius -fiore llo -fas sa -ev ened -er ney -elb philharmonie -el ore -dishon orable -diac omohoy -demoneti zed -de havilland -de at -dare us -dak id -d london -d hh -cro aking -club card -citizen weekend -choo o -cell mate -car tier -br ani -body care -bo du -bam mer -b hoot -amaz o -ag bo -! )... -zip code -z aven -wed der -wat ta -wan ti -unleash the -under scored -to sti -the cove -spits bergen -sol dat -sl t -shum lin -sel ter -sav ouring -sarac eno -sab a -rit orno -ri fa -re combination -r gruppe -qos baszler -pos tharvest -pale stina -p ite -over rule -out landers -orti z -oren go -oise aux -ofcal dub -neil patel -national teaday -nac l -n bu -msdyn crm -mor ong -mon keying -mcgavo ck -lefto ver -lebo euf -jap androids -jag off -jac keted -international ism -ink pen -indi ah -ido f -iceland ic -i follow -hour cloppic -hi aasen -heu vel -hd tvs -hat cher -har ak -ham or -hahah haa -gunner gale -gra bb -gab ion -full bright -fon zo -fb x -f agar -encan tas -eisen ach -dx racer -du gard -del k -cun ningly -coming to -clock ers -citi bike -chal le -bru jas -biggboss marathi -ba el -b hit -az ira -atlant adream -at omy -assalamu alaikum -ascen der -arte mi -aqual ung -antimicrobi als -ang elle -albat ros -^ .. -ðŁ¥³ ðŁ¥³ðŁ¥³ -îIJ Ĥ -اÙĦسÙĪØ¯ اÙĨ -ı n -ye ayy -watt pad -viter bi -u et -trisk elion -trespas ser -trap star -to kin -thirdeye blind -teyan ataylor -tanush ree -tan ko -statecap ture -star vs -ss l -sq r -silic ones -sexu alabuse -sas an -sarah spain -saint sand -roth mans -retali ating -re pulsion -re mixer -re kord -rapper swil -pun intended -pri vett -peter house -or os -noti zie -nighto wl -neuro logic -nett v -nelson ville -nad in -musand am -mun jal -mug wort -mu ska -mo zzie -mc up -maxim alist -madel aine -ma thy -lone wolf -lo sail -liverpool phil -ling cod -lg n -kowal czyk -kixi fy -kis ke -killla kill -juan cho -jaw i -it ic -ip at -ing sunday -ie j -hourly wolves -hd z -hasna in -grig son -great dismal -gooner family -good afternoon -gol de -ge pp -fé lic -fuj ilove -evosti kleague -episte mic -eper nay -ende cker -eli vers -el lec -dutch mfa -dor it -dod die -dist ills -design mag -deseret news -de crying -d nl -craw shaw -cow den -corpor atism -com modification -champag nat -canon favpic -bwl ch -buli mba -buck hannon -bor le -biggest fan -bic ton -beer lovers -baseball america -ban ishment -badger up -australian story -atic ket -anesthesi ologists -always remember -ak se -ab am -' + -' $ -! ðŁĺı -ðŁĺľ ðŁijį -ðŁĺĨ ðŁĺĨðŁĺĨðŁĺĨ -ðŁĵļ : -ðŁijı âĿ¤ï¸ı -ðŁij ¥ -ðŁĮ¹ ⾨ -ÛĮ ر -Ùģ Ø± -yester day -xbox p -war monger -war der -vo teen -unni krishnan -universi dade -un recorded -u vu -trici a -tree planting -tof dixie -thi stown -theo broma -tal ing -swan ley -sunday times -subsidi se -struc tured -strom lo -ss ello -spre zz -sleepa way -sch art -s spx -rw jf -rose ellen -rik rankin -re ux -re faeli -re elin -rc pch -qine tiq -preju diced -pl inking -per dita -pashin yan -our nament -open shaw -odd parents -o sk -nano second -mou lay -mo pped -mission accomplished -min j -megabike shop -mari usz -madein tyo -london art -lan gue -la ks -kir ky -kar jat -kalamaz oo -kal ancho -jared padalecki -j ind -iv rea -ioni q -ingh ana -ing erie -im bi -ik kar -hu sein -ho x -hear metoo -hay good -gy nt -grim ly -glaad awards -ga steiz -fox gloves -fest ina -farquhar son -ever age -edi fication -dow den -desp res -dan so -clif den -clean ness -cle av -che vette -chatt in -car seat -cape may -building champions -brea stre -bo karo -ble y -blank fein -bed font -bastian steel -baske try -bas sc -ap gar -andhra pradesh -alt ay -ak aka -ag ius -? ', -.... !!!! -ðŁİ¤ ðŁİ¤ -ðŁĩ¿ðŁĩ¦ ðŁĩ¿ðŁĩ¦ -ãĢı # -âĹķ âĢ¿ -âģ¦ âģ¦ -zy y -xen opho -worcsc cc -wood sen -wl st -winter break -wi rele -wh on -wax works -vote tris -velocity conf -ut l -unidenti fiable -ucan r -trump ington -ti anna -the common -the actor -team wales -sur tout -strato fortress -star creative -splat z -soe urs -smolen sk -shri kant -sel vag -ryanj newman -rudder less -ro zi -pun ning -pun ic -power station -pop an -point lessly -perri kiely -o base -nu cci -nt ca -nish ino -nat sci -my the -move set -mo gi -mlbaz fallleague -mitch elton -metam ora -mazer unner -max ton -ma dra -kun zite -kov ai -kon erko -kol l -kk rha -kip sang -key z -joanne worldtour -je mez -isspyaar kokyanaamdoon -impregn ating -horizon league -homin id -he resi -hax by -har l -hal onen -ha dro -h antz -gui don -growingup in -go izueta -gener ativeart -gen pact -ge biet -fre scas -fi yah -fa stra -essex policeuk -ero ge -ebulli ent -dr itad -dr ita -dor ina -don broco -diacon ate -devan shi -deter gents -depri ves -delpiero ale -dai do -d kw -cre eds -cra ggs -cohesion policy -christo dou -chowki dar -chast ised -champion strophy -ch m -cc mariners -carac ara -bold mere -bo los -bludge oned -black thought -barto sz -bad deley -baaz igar -ayo ade -ay ase -ar don -antó nio -ann ul -ang ers -and rae -anaphy lactic -all black -air ships -ab aqu -ðŁĮ¸ # -z schech -win etour -wic b -weather ization -vocabul aries -verizon wireless -van stone -us ap -un govern -u turn -u pi -u ai -twittb laster -tuber ville -tar pons -sway am -sprint cars -sol dotna -sne ha -sian icri -screen junkies -sci oli -sci ed -san filippo -ruby wax -ro screa -registr ationday -re stive -re iro -razor light -q amar -proftim noakes -podi um -pere tz -per sis -park ways -pa estu -one planet -nucle ya -ni ppers -mu choo -mo one -mil loy -mil ak -metr is -mer chi -mediev alists -mat exp -mali gne -loren za -leop ol -l ents -ky thera -knickerbo ckers -ke hr -jd m -j tv -igle sianicri -hu ay -hi muro -haryan to -hang ars -fo erster -fei joa -fax ed -fau j -eter nia -est rena -ep ay -emc fly -eid al -eck ington -ear wig -dun robin -dormit ories -demon et -dell acqua -dear zindagi -david l -college board -cole ford -char ak -chap atti -cay den -car don -by lines -busi ek -bran del -bradley james -bny mellon -birmingham rep -bing ed -basel ines -barbar aniven -au m -as sery -arcli ght -arad wanska -an net -ali al -ak ram -active learning -academ icians -ðŁİ ± -ãģĹ ãģŁ -ã̰ã̰ ã̰ã̰ -âĺĢ âĺĢ -âķ ¬ -zu mi -zu mbi -world ginday -will ard -virging alactic -value investing -us in -uniter ight -unfla ppable -uk y -trending orange -timo fey -thru sday -thor sen -thel er -that chers -systemo fadown -str indberg -ste eze -spur s -spr ts -south india -solit ary -shing al -she athing -sd hawan -roseellen dix -profu mo -portugal theman -platt smouth -panther snation -o ake -nychash tags -noo tropics -nine ty -ni harika -mn u -mis directed -mik uni -mi dol -men ounos -me dre -ly sine -lucky welive -lor na -live forthe -lemu el -lawand order -lapid ary -ke ane -kat aria -k long -justfor laughs -juli elmo -jp montoya -jonny existence -jo do -israelic rimes -infra red -hol lo -ho thead -gov murphy -g uni -fir le -ff weekend -e izo -dr ferdowsi -disinfe cted -dish ware -dimit ry -de bartolo -d hh -cool stuff -confection ers -chori ster -cell biology -cable way -cab overde -bur ch -bring themhere -brand name -bra ban -big krit -bette davis -berlin station -beng t -bbcradio solent -bayare a -ayesh acurry -as pic -antagon ism -ani plex -and park -ah ram -è Ħ -âļ¾ âļ¾ -à® ³ -wholesal ing -west away -wer c -v ch -uninor thants -thread bare -theori zing -thegrand tour -tend ril -tan ews -t zi -sy lac -sy beria -str an -sq lite -so tm -smart cares -skylar astin -sj news -sigma pi -shin ned -shill ington -sen diri -santiago de -s fanart -run rig -ru hlman -rep maxinewaters -re thankfulfor -ranger over -qu ini -pla k -pho u -pap ale -paintedby carol -ob l -ny books -no graphy -no buy -nam ic -mod afin -meh dir -mask march -mar cri -manhattan beach -mahindr arise -macdon agh -lu nette -lu beck -lisa kudrow -lafar ge -lady love -la im -la greca -kin berg -kham mam -kam per -kal ine -ho chim -her k -he ins -happy canadaday -hairspray live -gobigor gohome -gi yani -ge thu -ge ren -gal let -fun kand -financial post -er ni -er cole -ele mental -ed gy -e tic -deta inment -dehuman ization -deer wood -clive standen -cl anging -ci ona -chis elled -cey lon -can tons -breath lessness -bour don -booth scountry -blue hole -berg ere -arca chon -anthon ye -an tu -amphe tamines -amo dern -al gin -agains thumanity -ad elia -.. $ -. ðŁĺľ -ðŁĺĥ ðŁĺĥðŁĺĥðŁĺĥ -ðŁijĮ ðŁĺģ -ðŁĩ°ðŁĩ ¿ -åĽ £ -ÙĤØ· ر -zodi acal -zim bra -yes yesyes -wof ford -win rate -vo guet -vin os -val ori -under scoring -tread away -travel diary -tow sky -ti rado -ti dwell -the darkknight -tess avirtue -ta ako -stenhouse muir -star date -stan kovic -sri ram -spre miere -solo ed -shin ra -samsunggalax ys -saaf ni -s fera -roman e -ring road -pur vi -prin eville -posteco glou -pashup atin -paras port -ow www -no ar -ne aly -natural remedies -msg thefilm -mobi lec -mire ya -mart is -mal at -letsmo ve -le um -lat sondheimer -la kat -kotton mouth -kerry n -kav alier -jo chard -jim morrison -it off -in hofe -ig bo -hood rich -gerry mandered -frankie boyle -fe vers -exempl ars -er ling -eddie trunk -earth ship -e got -dit ors -der spiegel -dau mier -czech gp -con des -clar abelle -chud leigh -bur gher -bro die -bot son -black cosplay -berlin er -bell more -bal bir -ann ells -alway strump -abo des -ab salom -ðŁĺĤðŁĺĤ " -⼠ª -⤠´ï¸ı -ä l -ye veryday -yan ina -wx man -world beeday -win eclub -wh sv -van etten -valenci abasket -upon us -un conquerable -tt able -tra ini -today sor -thread needle -th starmagicball -te ks -te agarden -sub space -sty ledby -simil itude -se ol -se bas -san marino -sab ana -ry les -rt fm -rev lon -red entor -recru tement -proud parents -priscilla shirer -orni th -oraclec loud -or é -ophon ia -on erichmond -ohl rangers -o clc -nam bour -nalban dian -mv hs -mudh ens -mu ze -mothersday gifts -mehdir hasan -med ce -mau rawest -man group -living in -lam port -l iciou -kon gos -ko an -kli en -ker mis -kab in -j su -islamic art -ishqmein marjawan -ire do -il lette -horse trials -he us -harpercollin suk -hahahaha a -ha fta -gv hd -gatt aca -fearthe beard -fashion bloggers -enchan ter -em pre -dritad avanzo -dor as -div omovies -dir l -dijk stra -det mer -dese crate -dar vey -cri stie -colour fully -cel in -capital onecup -bury fcofficial -bun ratty -bse ssed -bre wed -billi epiper -bil k -bi ze -bhuban eshwar -b aga -arisai g -ar gy -ai ib -ade va -ac si -ê² ½ -ಠħ -wy playhouse -wood church -wha at -w brz -vereenig ing -tin ton -thick nesses -suz annah -sturte vant -sle monade -sho ku -shil pi -sh lo -senbob corker -ribo some -rei wa -ram sden -quin ault -pigeon forge -perv ades -pav lich -paper mill -official mcafee -o sum -o sle -nis america -negre anu -need syou -moncton wildcats -mis smy -mis firing -melo di -me ko -mastodon music -lil let -light itup -lic key -li sas -land shark -land forsale -lady superstar -la ffey -kumbh mela -kin ton -khi mar -keepp ushing -kar pathos -kan ako -inglou rious -hyper ion -houston dash -hi doe -hay loft -great ocean -gou den -gor z -gla ziers -euphe misms -eug ène -etsy jewelry -ent l -drew diplomat -dot co -dor tm -dj ed -di ffer -deccan herald -daw gnation -dain ian -cry me -cr cs -coble skill -chum ps -chri sman -choose your -chao tic -chandra shekhar -chad leclos -catch fire -car spotting -camera work -born holm -black mamba -black facts -bick erton -bell hop -bar tsch -baldwin sville -aru les -appe ased -apo se -and fairness -alt bier -ah waz -adam buxton -absen tees -a aww -. >> -ðŁĺ±ðŁĺ± ðŁĺ±ðŁĺ±ðŁĺ± -ðŁĶ¹ @ -ðŁijĩðŁı¼ðŁijĩðŁı¼ ðŁijĩðŁı¼ -ðŁİ¨ ðŁİ¨ -ðŁ¥ Į -Ùħ ج -Ø§Ø Ń -you aint -yo gotti -wonder girls -winns boro -van lis -v cfd -used car -u know -timmy trumpet -the scott -the cameron -t mnt -starvs theforce -sm elly -sl vaus -sil on -shuja at -shi d -sfor za -ser res -sch ot -sage uk -saf avid -rock lahoma -pol nare -podi atrists -peter hof -ori huela -one gerton -net suke -national sister -myla pore -my boys -mu sang -moun tup -moro goro -mor bius -moh tarma -mis diagnosis -milli ebbrown -mephi stop -lu uk -lock himup -le to -lakestreet dive -ke iron -imper me -iihm hotelschool -iconocla st -i quitos -hen dee -hat box -harri eth -har pe -gt foh -griff is -gre enough -ger o -gent illy -fu gli -f cat -e qs -dino bots -dham makaya -der ricks -de vex -day anand -david gold -dal ry -dad do -cf daawards -ce sen -cam os -c ff -bran do -boot strapped -bloo duk -bb ra -bar ua -ay ane -av radio -archi plain -ar no -aquil ina -ang ling -amwriting romance -amuse ment -ale thea -al ms -.ãĢĤ .:* -. ðŁĺįðŁĺį -ðŁĴķ ðŁĴĹ -ðŁIJIJ ðŁIJIJ -à¸ģภ£ -xx xv -xtian bautista -wreckit ralph -weekend wanderlust -we build -wap is -wad er -up mann -un savory -u dang -tre vose -tear itup -tear in -su turing -stri ations -sto wing -status quo -song ket -sinter ing -sight seers -showtime pettis -sher rington -shah ri -sele kt -ritu al -ril ton -rec i -re ge -public school -pre ggo -pen iel -pasqu ale -out posts -ns j -nike women -name tag -na ama -mun ity -mor den -miller time -mel ville -ma skin -lyn ley -lei der -lang leav -kin agr -juco product -jocke ying -jo ad -jam mie -interro gations -instruction al -imbru glia -hay tham -ham mamet -hal ina -gu ma -goron talo -gam mons -g dor -fruit land -frey cinet -fox friendsfirst -fly with -fag ot -en ma -em ale -elian enko -doloreshu erta -del hin -de matteis -d zone -cullin ane -crim six -cre mon -corn cob -col ditz -c rich -blitz boks -ational day -as av -angel ino -allyson felix -ah us -ah ur -ag lobal -!!!!!!!!!!!!!!!! !!! -ðŁıģðŁıģ ðŁıģ -ãħ ¡ -âĹ » -xfactor au -wigg inton -weta workshop -western digital -wen ning -wel lesley -we comefromaway -waubon sie -var man -v ho -tou charcade -ti gn -the oxford -t ne -sun city -stan chart -square mile -spl unk -smoke purpp -small streamer -sk aff -shal houb -self storage -sei ki -se mmes -save energy -rend all -re ee -ramach andra -ram li -ram iz -public ed -psycho logy -pil ings -phillip island -par ad -pan theon -own cloud -onthe board -on cology -ome tepe -om bija -ok ta -ny mr -ne gar -mud flats -monster sandmen -mo zza -mckin stry -mccau sland -marsh man -log sdon -light fest -lam bo -l ilo -kris bryant -kkkk kkkk -ken roth -ka am -k sc -jean sfor -jaz zie -ist d -i fera -her om -gun ns -green andgold -gram pus -gig ant -getting better -fil maker -feni more -fal ters -eur gbp -en ot -droner acing -daryl matla -cy outh -compre sses -colla do -co h -christ offer -cer aweek -cas carino -cafe coffeeday -blog to -bir ley -ben ward -bab by -ay outh -as oka -art ine -anu fac -al lier -ak we -aer ate -acru ises -aa ai -ðŁİīðŁİĬ ðŁİģ -âĺºï¸ı . -zoo atl -yi v -worldvegan day -worl die -wor don -wind break -wh orl -vote remain -visual cap -virgin mary -vi stula -utd football -ut c -uro logists -u str -tre ynolds -to golese -thu li -tex til -tand ragee -ta qi -streamer network -stock sbridge -star tin -srisri speaks -spe cular -sou se -simil kameen -sil ents -shu o -sher gar -seag le -se guin -schri st -save aca -san cocho -reassur ingly -re eta -ra shad -pumm eling -petri fying -peter frampton -pel frey -pear le -pan cha -operade paris -nu fc -novo tny -nerd hq -nen ad -mrss osbourne -mou stafa -mitchell reports -mc glone -lov at -korn acki -kkrha itai -kinagr annis -kavanaugh hearings -jal di -hospital et -han ham -go geocaching -gg as -fies ole -fcbb asket -fat u -f mofficial -er witt -elo i -dro b -deline ation -davidg ilmour -dam pener -cur sory -cr acies -copy cats -colloqui ally -cognitive computing -cher moula -catal in -camp allroad -cab azon -brook ville -bro myard -brau lio -bou ley -blan co -ben brook -balear ics -as fcofficial -ar asu -ani mage -amu ffin -amou reuse -allu ded -aco x -ach med -aar tic -( ... -ðŁĹĵ : -ðŁĶ ¯ -zor k -wer de -web perf -vo coder -vi bro -vas wani -ut us -ty oung -tre mbles -tow anda -tom sk -teen aged -tab aco -t ju -supere go -su mbur -stock piled -steel man -sse au -sni pping -sicili ano -ser ina -same time -sa osin -rumin ation -roo sen -reed sburg -re cker -pound world -pine view -philosoph ically -phantomofthe opera -ph resh -pack ers -olaf ur -mill ersburg -mika ela -mere ce -matar azzo -mark g -manit obam -malevol ence -livesof ww -legal ities -km js -kirlo skar -inste in -in dri -il ai -gry m -gil gun -gau se -g bit -fun clic -funclic kearn -fu hrmann -for bernie -foot board -fohlen elf -feuer stein -fem ke -fat back -fair bank -embar kation -elk hart -earth science -dun smuir -da jj -cross gene -cro isi -co bre -cheese cloth -centr ale -cele st -cave tt -cal pine -bundel khand -buckfast leigh -brush work -bhat ure -bernar dus -bar room -b ely -auto sales -as certain -an doh -am pera -al ha -abre ak -aat state -ðŁĴ°ðŁĴ° ðŁĴ°ðŁĴ° -à¸Ľ ระ -x amar -world prematurityday -wi ens -vat ic -v to -uv xy -truth out -tra vieso -tour memories -ten ny -shu ffler -show business -sail fishos -saf tas -sad ers -s journal -ro xo -ri angle -rhy e -rhe inland -redbull grc -re q -rath coole -r nai -pyo tr -public policy -prolifer ative -ponti ac -pon chat -pokemon xy -plain moor -phenom hoops -pasalu bong -opti musprime -oph ant -oak mtg -new paltz -nan ako -na ea -myth ic -museumof nature -mob berley -million maskmarch -mil ang -mick ens -mer id -men uhin -mar quet -mal ana -macdon alds -ma ec -lou cityfc -koiv u -kn m -king don -je el -indeci siveness -immobili en -ic are -hor nish -honda indy -hipho ped -he ssel -gü zel -google playmusic -god ons -geol soc -g callen -fro mal -flu shot -ex communicated -er id -em rs -elli sville -ed ric -ec thr -eber ly -du binsky -dome stique -do tc -diamon dand -der ose -dank memes -counter clockwise -compar ti -co authors -cmo kerala -cla rem -cj hl -che gwin -camp ton -bestfriend day -ber tucci -be ier -basti de -bar camp -anti psychotics -aktu ell -afric alive -ad mi -abdel kader -ðŁĴĶ . -⾨ " -Ä Ľ -yogotti kom -y usa -we tz -wbc sd -wal vis -video taped -val ter -tw rk -tu pe -trabal ho -toronto realestate -tor vill -this world -theright thing -tha at -terric lark -terr ariums -tech re -te urope -surbit on -stigmati zed -stagn ating -sta rena -special ity -son mp -smi tha -sleep walkers -skook um -shu go -sho we -run dle -ro lie -richmon draceway -revol vers -rend collective -ration alization -qa iser -pro gr -pro dding -plo sion -official ronnies -nj politics -natwest t -nationwide arena -my ton -muhte ÅŁ -mound sville -mon zon -mon sie -milli grams -mckin ney -mason ville -mam c -ma shi -longyear byen -leonard town -la forge -la em -kor ta -kor ps -juddmonte farms -jaw ab -jas prit -jan ez -invinci bility -independ ance -hunts man -hubb alli -hawk stone -god ly -gher bitz -gc isd -from wherei -fran zese -for folloback -ex x -emp son -em sworth -elf quest -ejec ting -east bengalfc -duplic ator -dra iman -dog star -deni ece -da ith -d by -cy lons -cu ota -critch low -cott bus -compre ssible -co ono -clau demonet -cj n -chel o -cen ac -capp iel -can asta -c mcdavid -bou se -blac ki -berch tes -bein art -armam ents -alleni verson -ach ille -abujat witter -: """ -ðŁĺŃ ðŁĺ¢ -ðŁijį ðŁĺĦ -ðŁ¥ĩ @ -zi x -z wart -vi shy -ver me -vani tha -val de -tuske gee -transpor te -tra buco -tr ate -talon sup -speedway gp -slo ps -scapp oose -sa hm -rick shaw -real d -re definition -qui kr -puro lator -proud sister -profan ities -pro plan -primeminister imrankhan -plan escape -pla sm -pioneer dj -pan head -p tah -orlé ans -on ts -oe ster -nir van -ner ules -ne vs -nale o -middle earth -mcr artgallery -ma kani -live bolanet -lig aya -lifel ine -ko loff -kfc barstool -kent mere -jit sircar -iowa state -ind ade -i au -hun k -hel meted -goer ges -go kyo -gli mmer -george soros -fur a -fron tto -febr ile -equ otes -en join -dun nett -dul quer -deliber ated -cuad rilla -col bi -cih housing -chen oa -cast legate -bumblebee trust -bridge tregan -briden stine -bo real -bernar dez -bean ey -bambaat aa -ax ford -arti es -ann ach -an ang -ami da -air pics -................ ..... -ðŁijĮ ðŁĴª -ð٦ģ ðŁĴĽ -íĶĦë ł -zi ba -zambe si -z lj -yav in -whites burg -wh ately -vishnu vishal -vic ent -vi ffest -ven der -van sciver -uni st -travel thursday -til o -thalap ath -ter ni -tempe sta -tal bo -ta jani -sweet sixteen -super giants -sun n -strange musicinc -sq s -se gs -sa hana -record collection -providen ciales -po ku -pips queak -pi ola -pe ja -p music -ore wa -oden kirk -no cover -new smag -n lyonne -mu jib -more head -mont copa -mo gra -mil son -mer iam -mat ted -madra ssa -lippin cott -laure tta -la stic -kis ston -jimmy havoc -jess ops -ja at -it fest -immacul ate -hyundai wrc -htcon em -hol lett -hil burn -hack en -grif ters -grati as -gole stan -gi lead -gel led -gand u -g dad -fri sch -fc thulhu -fal abella -enic ole -eni k -ellen brook -ei shockey -edmon d -eastengland amb -dn ts -design awards -del dÃŃa -deborah meaden -david coverdale -daddario andco -d subverse -ct us -coy p -cor sham -clar inda -cep tions -carol yne -bur cu -buffal os -botu lism -bo ggles -ber ard -bajac alifornia -at sf -ang let -aber avon -aa x -'' / -ðŁijģ âĢį -ë¬ ¸ -za ke -wolfe boro -wig ton -wc p -tu ch -this guy -thermo py -the creative -t dsb -swe ed -suyy ash -suhel seth -stuart scott -spru ill -sp aper -sm alaysia -sanje eda -sal ver -sab ot -sa hrawi -roo ker -rockin rio -ro dale -re spon -raider scanberra -qui sta -polnare ff -pir ouette -per rette -per mutations -pel os -pe abo -our lady -no go -ne gre -mu tti -montero sso -mo tel -lim elight -learn chinese -l á -kul ang -kore matsu -king scourt -kar dinal -jeffd sachs -jake millermusic -it staylor -ifc films -i ach -hoo drat -hol and -hoch zeit -hemb ree -gst tnhs -glo ssy -fuzz ies -fleure ast -fer ox -farmer sville -faceli fts -etsy rt -esc orial -dt phx -disc ur -dimit ra -dex change -dance mom -cov hour -colt cabana -chi me -catastro ph -bridge ville -belvedere vodka -aw ans -ad aw -à¸Ńะ à¹Ħภ-y wam -wood cutting -whim brel -w display -vi agens -usc aa -transi ence -thi as -te dy -tat acompanies -spr ite -sk om -sc ran -sag ne -sa athi -ros ana -ri sto -rec tifying -re shammiya -ram ba -pure storage -pp w -platinum games -onec ampaign -nai ste -na hid -mo cap -mirror football -mir kwood -mer ten -mad docks -love seat -light man -lavi shed -kon achan -ko hala -kel ana -keith olbermann -kam on -joy less -ipp olito -ine ve -i orio -has bronews -gv su -gu sto -gra di -ge macht -fm sphotoaday -flori dac -fin cantieri -fi sted -fast balls -fag et -extrac tors -elu ve -dun kar -diam undial -davi dr -culture club -cul turing -ct news -cor ddry -cop an -clu brooms -cl ent -chronicle herald -ce cchini -cas cia -can ari -cal en -c pac -buck ers -bu ke -bor a -bon da -bill yel -bienven idos -bat sibat -au skas -assay as -apla stic -al win -ac tics -aa ihs -ðŁĺŃðŁĺŃ ðŁĺĤðŁĺĤ -ðŁijģ ðŁijģ -ðŁ¤¦ ðŁı»âĢįâĻĤï¸ı -éĸ ĭ -ภĺ -z ast -wesley stromberg -war road -ver net -un leavened -toy maker -town coffee -through ly -thi ef -thene edle -ten enbaum -tee total -surly brewing -superse ded -sub class -stone masons -starcreative stv -sport susa -spac elab -sof teners -snake day -smo t -sk ylon -shoo jitsircar -shal ane -sell schaft -sec ateurs -schle icher -sale em -salad ino -run keeper -rsa security -rivier anay -red and -rayn aud -puer ile -pu tian -prefer red -pig sty -park minyoung -pariv artan -ophar yngeal -one buffalo -nj ic -newye arre -new a -nc su -nadi ra -mon sta -mir ren -mac robert -low ton -louder milk -lec ity -le bow -le aman -l ú -ku hns -kraft foods -kr ls -kay ag -katrin api -kath rada -kan ai -je be -istandwith maryamrajavi -io so -ill z -il ens -holly bush -hill park -hat ful -gu to -greattaste awards -fo su -embe zzled -el ses -don ite -dj f -dis barred -de mayo -cro ons -cor ney -coal face -co ire -cnn debate -chiso x -ch h -candice accola -calab rian -buil th -bo zen -bo zell -biek sa -ball arat -ba ños -any oung -anton yl -alla ges -ali maging -af gan -z ins -w lox -ur ica -un banned -ul fa -ucla anderson -trevor ombija -synthesi ser -super blue -st ith -sse afood -spre well -shar man -sau to -sap ne -ry no -run withus -ri bot -re sna -rand on -r fh -pp ar -phul kari -parac as -ou fcofficial -opun tia -nuyor ican -no taries -nd mc -mis is -miniaturi st -millen ia -metron orth -me ike -maya ali -matthe wh -man lius -man art -main sail -mac pro -lich ten -kno twork -knightri der -ken shiro -je gede -inde ed -in aga -i ths -he aded -hali mah -fundac ion -finner an -fc go -encant ada -ego ism -edm life -dis agreeable -dia q -corusc ant -colle ens -cn wk -classi sm -cha ining -cas so -car my -bus well -brasile ira -bor ba -be healthy -aubre e -at lin -assemb lers -aldu barkad -aff ing -adjour n -! "... -ðŁĺĬ ðŁĴļ -ðŁijį âļ½ï¸ı -ðŁIJ ĸ -ðŁĮ²ðŁĮ² ðŁĮ² -ت ÙĤ -yod abuda -ye ch -wat ari -w elike -viet name -up skilling -un fair -tt india -tric ep -ten gok -technom usic -t sering -sun coast -str in -stand ley -slo vo -shalane flanagan -sen bill -sch lie -sal enow -rosal ynn -rol on -ro kh -research gate -rb z -popl ars -pl sss -pend olino -panip uri -pan handler -pack y -owen smith -os se -obe di -narc issa -nak ita -na ira -mud lark -mis sher -marke tre -man vs -loss yndrome -lock ton -little foot -lim kok -law alla -lari jani -kre isberg -kkrhaitai yaar -kend ari -ken cana -jo stle -jesse metcalfe -jel avic -jarrah dale -jakob sen -itv weather -its friday -infomer cials -ig daily -ic hou -hp discover -her ridge -hengist bury -hahahaha hah -ha gio -grom mets -greatplace towork -great value -giron afc -font bonne -fic ha -ferry bridge -fabri zi -er and -enviro ment -eliesaab world -el ham -edin bur -echo stage -east lands -d sk -cut throat -crab grass -conse crate -confection er -col lor -cogge shall -canad adev -can ongate -c jeu -bug s -brune au -bru shy -brick fields -bhutto ka -be siege -bb v -basker villes -bad girl -bab alu -av ma -archa ia -ach a -ðŁIJł ðŁIJŁ -ðŁĮ· ðŁĮ· -ล ะ -yu miko -ye sequality -yacou b -world net -woman kind -wo wt -wi zzy -westhe ad -wander lei -waf ting -vat iron -use your -uni fil -trinity learns -ton ow -to graph -tech net -stock ard -stand united -stacey solomon -specu lator -sp atriots -solu cky -sol enn -shett leston -sh ky -schi pper -scheck ter -sare awesome -san deman -sa qq -por ton -pop sters -pit tie -pe gg -panagi otis -pa ille -om ay -olympia stadion -nov ac -nol in -no excuse -neuk ölln -mu et -mer yem -mem brance -master pie -ma under -ma gos -m kg -lv m -lubric ate -lu an -lock in -li ja -land graf -lalit pur -ki bana -kash gar -jerry rice -jede diah -india at -howit zers -host ing -home decoration -herbi vorous -happy baekhyunday -ham moud -hack tivist -gool sby -future ready -fin k -fam iiy -fall ston -fair ground -er langen -er ine -dle ys -dic kiev -dah lem -da shain -cu cin -cre sco -country side -cost es -conservation org -catech esis -carli vatiron -car mon -cag giano -c sas -bridle wood -bon giorno -blood donation -bla ha -bar thel -atlantic records -ath ur -artist life -ar leen -al ady -aggrav ates -acknowledg ments -abus iness -ðŁĺİ ðŁİī -ðŁĴĥðŁı¼ ðŁĴĥðŁı¼ -ðŁijij . -ðŁijı ðŁĴª -⼠ħï¸ı -ઠµ -war ble -ur va -un b -tom oh -to pal -title holder -thin d -the state -th ills -sw police -stu hl -st rob -sp reck -so ter -so bi -sick i -si skins -sand art -sadi k -rath skeller -rat li -promiscu ity -pay nes -or by -one hunga -odi hr -ocean us -obliter ating -no ct -nate diaz -n pv -mat tea -marien platz -maajid nawaz -longh urst -l tc -kra vi -kel lum -iz ak -ili fe -i bb -hun cho -hu by -holly conrad -hi ki -heng elo -hein kel -hap iness -hain ault -ha idt -ha gin -god da -gin er -gair show -g latt -flat rock -finish the -farmers weekly -extempor aneous -echo location -dema rest -daw ud -dar ragh -cul la -cru et -crack lings -cosplay girls -consol ations -cogn ate -cle eve -churra scaria -cap il -cal cin -byu cougars -bulldo zing -book keepers -bha wani -bemo repirate -bec ke -be harie -bar thele -atifas lam -asdfghjkl ñ -armb arnation -ar line -aphex twin -ambassac ats -am v -alpha phi -ak pabio -ais c -afir st -abe ba -ðŁĺľ ðŁĺĿ -èī ¯ -§ ðĿIJ -yellow vests -uhcougar mbk -tri j -tra duc -th ena -tex mex -teng ku -tele mann -tee jay -sweet breads -strade bianche -still gotit -state fairo -statefairo ftx -stabil iser -si rr -shout a -she aven -sch rank -s gallery -rush worth -repell ents -qu itters -prospe red -prefe c -pra dip -po zzi -pim pri -phy ton -photo therapy -pen ser -oni shi -obel isks -ntu sg -ni za -new school -music and -morri sh -mex ica -mer imbula -med sci -mayo tte -maru yama -ly se -livand maddie -lin z -le vering -laur sen -lance armstrong -lam ond -l nh -kun war -kate winslet -kane brown -jo cky -jag meet -intertwin ing -inci vil -iff ley -hyper thermia -houser ules -hor adio -hiji kata -geri halliwell -ga er -foxsport saz -eye bags -elk ington -ed miston -dete stable -d sps -cycle toworkday -ctm pofficial -cru mple -coo ool -consu m -conjun ctions -cle to -citizen sunited -cian jur -cho bits -cath arina -cake bread -c fia -bri ana -bow down -bor zoi -bink ley -bec tomy -beard more -bat in -astro plus -as pens -ant t -amo wry -air ra -af ten -aer oline -ab bath -__ ) -! ðŁĺ³ -âĸ¶ï¸ı âĸ¶ï¸ı -zap iro -worldnet daily -wno tweet -west village -weare here -we stre -un glamorous -trunk show -tr nava -the ju -ta wana -stap led -soul wax -so sv -sky cable -seem ly -schi pper -sch atz -say what -ru sd -ric cardo -retro game -re vy -pyro technic -ps ils -planet coaster -pl h -pesc et -peach bowl -partylikea journalist -pal icki -p no -ow news -nith yananda -newsin vids -neuro surgical -neur orad -nel o -nature za -nat su -nac cho -na hr -mun tz -mell ons -meh rang -med ary -mcdon al -man zana -limitedrun games -lie paja -leadingthe way -law i -kri eg -itie suk -ir gend -intercess or -in ba -holiday gifts -her ma -hather ley -gold fish -girl child -ge ier -gab ou -flo etry -fi yero -feliz finde -eluve itie -ef dp -ec aatstate -e ut -dy w -door bells -do tty -dise m -de francesco -de bash -david lyons -dar ma -dal meny -cy anin -cur ti -crazysexy cool -concer tina -coffee hour -clu be -chau dhary -bower swilkins -big ham -ber ri -be cos -bbc philharmonic -bar beau -azhar uddin -au vers -ar mored -antonyl ruben -ano vich -amin os -a ahs -; / -. = -ðŁij® âĢįâĻĢï¸ı -ðŁ¥ĩ ðŁıĨ -ðŁ¥ ¦ -å¥ Ī -ãĤ ¿ -âŀ « -âĬ ķ -ÌµÌ ¨ -yellow man -womenin aviation -what getsyou -wa yo -vill ano -ul rika -u oregon -the deol -tch r -tar dif -t sao -sub su -sty l -sta den -st fagans -sp az -showme the -sensation alist -sa akash -ri ky -reece mastin -recon figure -pro cida -post traumatic -par ol -pag ham -p bj -oxi meter -official cufc -ob by -now w -nordic a -night watchman -nic omaine -new project -mâ ché -music on -mol on -mi kal -me j -made well -ma dri -lati go -la tham -l illo -knight frank -kle ber -kha war -kas dan -kan turk -it tttt -infringe ments -ide ser -hero ic -head stand -hair band -gro bler -glad stone -games radar -gal angal -frederick son -for dair -fedex field -fa awards -exacer bates -et ag -equ ick -ed ream -e gra -dut cher -dah len -com alee -cli ven -clev enger -c sub -bun do -bug bear -boy sen -black hat -ben ett -bax endale -band ila -ban tering -bai xas -any ama -annivers ay -ang irls -and then -air fares -ag la -ad hy -ach al -aan p -ðŁĮĬðŁĮĬ ðŁĮĬðŁĮĬ -wul f -wo wee -weis berg -water head -wall an -w lad -vol tex -vliss ingen -valley cats -un cia -tucum cari -tor ay -thermo set -the mar -tegr ation -steal mygirl -spider woman -sil ience -sh rum -semi annual -sch utz -sbli ii -sati ety -saafni yat -run blog -runblog run -recy cler -re authorize -puli murugan -public ise -pu ella -pro sieben -pratt institute -pp ppp -play dead -phwo ar -pe ka -paradox ically -palas zczuk -pack ing -oy ston -ouis ville -o saa -noy noy -nay oung -mccul lagh -mahan ey -lu kis -lou brutus -loe wy -lodh ran -linke dua -lego league -ld m -kumb aya -k institute -just ink -jasmin ec -jahang irk -jahangirk tareen -jack russellterrier -j afridi -iz umo -iowa statefair -her bology -fun night -fuj ioka -fla yed -figh tin -ferlin ghetti -fcunited mcr -ell ina -ea sterling -don abate -distractingly sexy -cul ls -credit able -chav arria -chant el -centri sts -cav at -care tta -c gg -bu pre -bryan brothers -brick ley -bir s -bi mba -best nigh -ber l -bedn arik -bec kia -ba hahahaha -awo olf -att ara -at your -assassinscreed origins -anandi ben -aj w -af eni -ìĻ Ħë² -̵̨ ÌĦ -w st -vla do -vis cera -ven et -va stra -twitter stake -tu ckey -trigla v -thu cy -then et -thebachelor au -the ware -the see -tb snetwork -super critical -su y -sty mie -southe aster -simpl ys -shine bright -see v -seattle symphony -sean price -sam mo -salman rushdie -safe guarded -roun dups -roof less -rheum atism -retwee et -red berry -radi ation -prev ail -pr ss -ppor tunities -pick oftheday -par terre -nigerian creatives -nfl oncbs -nam ad -mo twani -mm ers -micro aggressions -mc keen -mad son -llan id -li ep -level up -le bih -laba dee -kit ale -kis sarmy -jeep family -interview mag -ic ahn -humayun saeed -ho stiles -hh v -hemorrho id -he tta -han dog -gam me -gallo per -fer ias -fam i -f assie -ephe drine -endthe fed -dra we -d sap -cr ine -cloud native -ck ickoff -chu o -cbc to -bridal shower -brick layers -bott lerock -bon it -blessedand grateful -bjor k -beour guest -be somebody -bau n -bar ge -bal lot -b dunkelman -atx festival -atech nology -anth es -andrze j -amo or -alan de -a equ -< -< -ðŁĺį ðŁĴĻ -æŃ ¦ -ãĤ³ãĤ¹ãĥĹ ãĥ¬ -âĿ ĥ -ଠ° -ॠģ -Ù Ĵ -xxx ii -wm phoenixopen -water marks -ver vain -tá naiste -tx instruments -trues dale -te thys -tai ki -supp lan -su q -sti ka -soun darya -sece ssionist -se dna -sar lacc -roer mond -qu intel -qayy im -pr inter -pole dance -pi bil -photo show -pedre gal -pav los -nt g -nexus mods -n int -musicis legend -mule shoe -ms news -moo sic -modafin il -mo fo -med center -mcgre evy -marzi apie -marcho frobots -majo relle -mae by -mack enna -log ico -lo bbing -lin thicum -lex ia -leu chars -kumb akon -kar ai -juni at -jib con -iwm duxford -israel underfire -in ol -ieee org -i fat -hygi ene -hu dgins -healthy kids -he witt -hand spun -ha qq -grant morrison -go ber -gif tedness -getre al -ge mo -fun fetti -fuji ko -fu ffle -foxnews facts -forsk olin -fish sticks -fi roz -engra ined -ec ss -e pix -dylan thomas -dun ner -d loading -d co -cute y -crested butte -ch f -cau field -cas ca -carboxy lic -canig gia -camili zers -cab allo -bi sham -beth ke -bb ctw -ba id -au techre -au ric -ash craft -ao b -andy stanley -am bers -alison moyet -ali ki -abir d -a few --------- -- -!!! .... -ðŁĴĹ ðŁĺį -ðŁijį ðŁı¿ -ðŁıĥðŁıĥ ðŁıĥ -ÙĩÙĩ ÙĩÙĩ -your dreams -ya jam -women shoops -win rar -wein stock -walk around -wad d -w wildlife -voteen rique -vintage bikes -v wo -ti ot -the tanmay -terraz as -stre psils -stat too -stardew valley -sr ams -squ andering -spring town -sports ound -sommer ville -soci opaths -sm j -sla gle -sko da -sil ke -she ed -sad dict -riseu pred -reli ent -region of -r ham -pur nama -puertoricop ur -pu pi -prs journal -pe sch -particip ative -palmi otti -opto genetics -openstack summit -nor v -ninju tsu -mm fa -min ya -maim onides -ma grath -lim nology -libre ville -kix brooks -king andcountry -kin ole -k mi -jess amyn -jacob grimes -instaf ollow -indi aw -iaaf worlds -hy mer -hu du -heav es -havai anas -h rad -grand prix -good hart -ged dit -gary j -foreign affairs -fl ico -fil mer -fi ats -f mm -ey l -expl ora -england golf -electr oneum -el x -eh f -drunk history -drug mart -drivein mob -den een -def els -deck hand -d bel -cp sc -ck worth -chill ingly -chau vin -chasing life -cedar ssin -ca ahoops -bru gman -broad land -boat face -biopla stic -bim by -beau desert -bau x -barbar ity -bal dies -at cs -arte ducation -ardi ente -aper ry -ali ght -ac climate -a otw -ðŁĺŃ ðŁĻĮ -æĪ ¦ -zem ski -wyn newood -wil den -vel arde -uof sc -un savoury -un civil -un achievable -ty umen -transm ountain -title holders -tic os -thei hi -te tras -te sted -sunid hi -steve mcqueen -spring break -somersaul ts -shor tens -sho whome -shi awassee -scorpi os -scer vino -rowland schools -roth schil -roger sarena -rise against -rehman malik -registr ant -qad dafi -po cos -paren te -paci fism -p tn -om aki -ol un -nucleo tide -ns agov -ni mm -nhs grampian -nd h -murshi dabad -mr sam -mo dok -mentalhealth week -mat zke -mark dayton -margare th -mar kii -manag ements -mainbhichow kidar -ma ppy -long side -lips comb -lib bie -lanc ôme -la dainian -kirkcud bright -kilkenny clg -kas auli -kar ra -kalin ic -k hairy -juliab radbury -intercess ors -he che -hatsu koi -h go -god parent -go wes -football tips -fo yle -flower beds -fi ets -fal zon -eye ofthe -expres sen -ero des -erin burnett -dunkar oos -dun huang -deri sion -deare st -de keyser -cu ira -coo pers -cister ns -cho tt -chees y -che tu -cfb hall -breakthe silence -bra gh -bowl by -boat shed -black buck -bet abrand -bay ero -banyo les -atay lor -argent inos -andrewr annells -ad dres -ðŁıĢ ðŁĴ¯ -åĭķ çĶ» -ãĥ Ī -âĹ» ï¸ı -⬠ħï¸ı -zak ia -z up -yum mie -yugi oh -you and -wi gger -weing ut -w ceu -vri end -us ando -un disciplined -televangeli st -tch ad -tam bour -syl la -sum times -stur dier -stre eth -spo int -skin nier -saint seiya -rohr bach -ratli ffr -rame kin -ram pa -public ising -pre late -pr anitha -pp ance -power stroke -pi one -par aiba -pal ar -out fielders -ou can -ou ag -os aga -orang ish -oneand only -nys dec -ninja sexparty -ner is -nel la -nc gop -nationwide kids -n cu -multi ethnic -mu kuro -mon chengladbach -mil gram -may wood -maud lin -matte i -man asseh -magic mike -lud ger -ls don -lou x -ko ester -knap weed -kin dred -jas wal -inthe wild -inter no -inher its -inform atique -inf anta -ie business -ibelievein bookfairies -hok um -handicapp ers -ha id -gul ping -gra der -ging in -gautam rode -fun gu -fore achother -fle ener -eswat ini -em wangi -e step -dry lands -dream big -de bb -dd ddddd -cro kes -co vington -christop he -carl sen -caf s -bu toh -bou gh -be stia -be back -bar men -ballinam allard -ball an -baby bump -ay ake -avail s -atay de -andre wyang -anci ens -absolu teradio -abo lism -ðŁijĨ ðŁı¼ -âļ Ĵï¸ı -âĺħ # -zak ka -za po -youth work -why iteach -whis ker -wh ib -west malling -wave guide -va hid -uni veristy -un listed -turn buckle -tren diest -the joe -tend encias -te pic -t anc -sp aw -sop ran -solym pic -so ss -sl und -sky divers -sip tu -shun suke -shar ding -sep r -sen corygardner -se dang -sci on -saafniyat sahivikas -sa hn -ru dolph -rin i -reen actments -re consideration -pat era -paper making -pa wb -p gn -or molu -nac ra -n cua -montre ux -mo zo -mis sn -metat rader -meet in -me morex -me mang -man am -maksi mc -lt col -low ry -louis theroux -longhorn network -lisac im -line smen -lesley ann -lef se -kis si -kar ras -kai muki -k ago -ire ton -iam sam -i eva -i apolitics -how lite -hoo oooo -hemis fair -hay maker -hantsi wwildlife -hal den -ha sso -granti mahara -ge würz -gar r -gal us -front court -follo back -flo rey -flamboy ance -fedor ov -fau vism -e somar -dur yo -dove cot -diver ts -devi ating -dela field -dal eville -cur seof -county show -comb atives -clo yd -chula vista -chi oggia -cel er -cappiel ow -canel ones -bre sse -bc ss -aus def -au dry -ation alism -athe art -assemb lye -are r -alber obello -ahmad abad -ðŁ¤ ¶ -âĺłï¸ı âĺłï¸ı -zo x -yeah buddy -wa heed -unfor gett -to ga -tin kered -team shabira -stre atham -ssy fy -shuk ri -shar ratt -seat ac -scottish open -saras ota -sai ki -s ÃŃ -s records -ru mania -ren unciation -pru d -pen land -pc engine -partici ple -out let -new ish -marcuslu ttrell -maker oom -macin nis -m ór -lux watch -luke mitchell -lt l -lock down -len zerheide -leaveno trace -lach hab -kri shi -korean air -knock out -khalee j -kab ira -k atti -jun ked -jeril ryan -jar lath -its ramimalek -har ms -greeng rocers -greatplaces only -gra inger -go ehring -gam esof -fluor ome -elec trum -ei ps -egom aniac -dying matters -dug outs -du se -du sable -di ox -de pose -dar ao -crore pati -concor dance -compra r -com passionately -co zad -chukku vellam -cer amide -cas sio -c ds -bro cks -brani ff -bour dais -blu hm -black en -bell woods -bell mare -battlea xe -bag sof -ath enians -astro tur -ast ilbe -arec a -aqu otes -abhin av -ðŁĮŀ # -ìĻĦë² ½ -é ī -youve got -x ue -wing rove -wil des -wal ston -w ths -vide oo -u od -tsun ami -transfer ase -trans dermal -thut mose -ther oes -tee spring -sul pice -su ica -sto day -sor ge -shan kman -resi ded -r fc -prat c -pontar dawe -planet labs -pentat onic -pen tath -par ola -paper art -pan handlers -outh waite -northumb ri -no bama -ne burg -mymt brain -multi plex -mor oka -min ia -mex ia -me theridge -masse ur -man tap -mad ley -love fest -light ner -lead belly -lc s -keh na -jö rg -itunes festival -inge urope -in red -ili ya -i strian -hu ard -hack saw -green economy -goo oooooo -gom me -fun and -fsg books -franci stown -fou lds -formu lad -elast omer -dr phil -de agles -cathe dra -cat mull -carval hal -bv barmy -bur gan -brain y -boothe el -bo cuse -bmc proteam -asi ya -arti kel -annou ce -an be -ac ase -? âłĢ -ðŁĵ ģ -ãģĦ ãģĦ -âĢĭ @ -н ов -Ì ģ -à · -yu ke -yakut sk -wur z -whatgetsyou outdoors -vali dator -under performance -tusk ers -treasure rs -together werise -thor ley -then at -th l -tamil nad -tal lison -ta affe -stie fel -ste ffi -speci alized -snapp er -sic amous -shoo kt -shari bu -sh moo -safi ya -rumin ating -rosie hw -reimbur sements -r news -r le -plant agenet -pizz arelli -pipe fish -per m -pav lo -pang arap -p enty -nowor never -nin iola -niche escapes -ni mr -new sw -neo sporin -ne wry -ne co -natural ness -morein common -moni fi -miley formmva -marche shour -mar vins -madilyn bailey -laure ano -lag wagon -l pb -ko ha -kassi ede -kan ade -k cm -ju la -j hump -international tigerday -iceland foods -human factors -hugh enden -hri day -hippoly te -hin ks -hel ene -gon line -geton board -george son -gay dar -g audi -fright night -ex ter -em z -ecur ity -dro sera -do tr -digital illustration -descen sion -deep veer -crickla de -con garee -collage art -clemson univ -change slives -centen ary -catastro phes -brac keto -bi gu -bar bad -an el -ai goo -acl festival -ðŁĺĤðŁ¤£ ðŁĺĤðŁ¤£ -âĿĦ âĿĦ -âľ ĺ -zar dly -word mark -wo ori -wight link -we care -way police -wakaflock a -upnorth live -un duly -tu thill -tri stana -tes ke -temu co -suffo cates -srilan kan -spor tac -si mul -si damo -red flag -re marking -pump in -pu issance -psychop athology -pro tos -ph h -peter ock -passage ways -participat ory -pan tano -ob on -o lot -o gether -non u -no hep -ner ney -myeong dong -my haver -mountain west -min nick -mil ow -mee totaku -md lz -manicure monday -man tr -mag or -ma dad -ll ant -len inist -lan gham -kom u -killthe bill -katy perry -jet fire -jad av -ire t -iff co -hor ic -hel ston -glass jaw -gewürz traminer -gar gi -g te -fe a -favorite things -fang asm -f wr -elk grove -elic ited -ehlersdan lossyndrome -e ade -dy fed -conco cting -clay face -chronic led -chennai yin -char coal -book recommendations -bish noi -billing shurst -bene dum -bello whead -beck oned -ban ka -bal ancer -ba ju -ayyy e -av ill -aug ments -asi atique -am mar -adopta shelter -a ines -________ ____ -ðŁijĩðŁijĩðŁijĩðŁijĩ ðŁijĩðŁijĩðŁijĩðŁijĩ -ðŁİīðŁİ ĵ -ðŁİĤ ðŁį° -ت ÙĨ -wom ent -wine week -whitt led -wal ay -ve ssel -ve iw -val lur -un did -ule scu -trun cation -tortu guero -thermo forming -tat ties -take part -tac itus -sus annah -superstar dom -stor z -ste ggles -standardi zing -st com -srikak ulam -soko lov -sli abh -shin sky -scri abin -schae ffler -salud tues -s dut -s ational -roh rabacher -ro zon -ritch son -relax ant -penet angui -peat free -peach ey -par sa -palimp sest -page boy -outri der -old castle -oil fields -nw m -nh h -ne we -nal in -n swe -my ung -mot lanthe -mor ley -missi bility -mini bike -milin kovic -metabol ic -mel zer -manga art -mac queen -m schat -lu ster -live it -li ket -leh tonen -l tw -ko lej -kk kon -ked die -jo kinen -it ep -irish food -il minster -iklan bandel -i mid -hom unculus -hin kie -h pb -glen roy -gir li -game keepers -g itation -fo scar -felly chibi -duke mbb -du err -doublec lick -docu drama -do ko -death fest -de positions -de activation -dab bler -cp bl -cover taffairs -corri do -complex mag -cleanair day -cas kets -c cleaner -bushwack ers -bolo gn -boiler football -bo rea -blunder buss -blooddonor day -bi bury -bhavi or -bb onday -barn ham -barking side -ba stin -at eliers -an ata -am bis -âĺ¢ ï¸ı -à¶ Ń -س ÙĨ -Î » -wr angell -wmn news -waterlo oroad -war iner -un american -u jung -u baldo -tro ver -transc ranial -tran sunion -tor on -to history -the quint -the fire -tearitup bts -ta vy -t ldr -sta ed -sig ny -shin nie -secondam endment -se ssa -sch lad -sav iler -sav alas -sacher torte -sac onf -s fan -run rocknroll -ru dis -rit chi -rep brian -re vine -publi k -ple be -pi est -pa ide -original music -oliv arez -og ba -o ases -nun thorpe -nincomp oop -murali tharan -mu ahaha -milk wood -mic rob -mc kidd -mc clair -mad awas -ly ford -ludo vic -lec tronic -la ppe -kno l -kim mi -killy begs -keving ates -kam ran -kaha pon -ji moh -james ra -inst ants -imper io -illy ria -i vette -hook land -home biz -hei den -hans raj -han ish -guerre iro -gary player -fox e -fl ach -ferra gam -felic ita -fas i -ex other -epi dermal -duc kies -dragon fire -din iz -delaha ye -david tutera -d illy -cu pido -coupon code -cou loir -clau dy -chi a -cdn muni -caste ism -bur ano -bonifac emwangi -bb tag -bar se -b hola -av ait -autau ga -au pt -apur va -ane choic -an sip -al chemists -adul ted -< : -ðŁĺİ ðŁĺı -æ¥ ½ -à¸Ńà¸ Ķ -Î ² -zel ina -zaven tem -yar r -wil banks -why tele -wapis kat -vs ner -ven eered -vel achery -v ul -usc g -u vs -tw ich -traut man -tran sept -ti meee -ti deswell -te knik -t mobi -super ia -stone walling -stig ler -ste iff -star field -stam baugh -spar red -spac et -sp ack -sou fri -sof l -sing lish -shi mane -sheryl sandberg -shar mil -shadow land -sha hani -roo tes -resonance fm -power sports -pern ille -paramilit aries -oc tor -o ger -nullar bor -nu groho -nor val -no ton -never where -n cra -mu zzled -mous y -mal um -ly se -loubout ins -light water -kentuc kian -kapp kvew -jake canuso -jah ren -is overparty -indi anidol -imagin ation -ic cc -i hi -hat sune -hasan minhaj -ha xe -gou d -gat chalian -fox wood -fight like -excep tional -eti os -en demol -cut work -cogn itively -clo ven -cine ws -christ ofer -chic est -chan ute -cb live -can ley -by bee -bun che -blu shed -bla si -bille vans -bi erman -beyond borders -beren ger -bar ad -back firing -audi rs -asur ya -as mussen -anastaci afan -an jum -aly goni -alexis dejoria -ìĩ ¼ -âı ² -اÙĦ ÙĪ -Ë Ļ -za popan -yugosla vian -wol i -whatwomen want -wei de -we hi -var ney -use ums -ure port -universit at -tu en -tu bo -trous dale -trans genders -town sfolk -there venant -thene we -the kings -the dog -ta illon -ta ff -swee eeet -sunny d -su gg -spu bli -sport scar -sp indler -snor kels -see scandies -scu mper -sc ult -river ford -ret tig -real bobby -re eth -pri yas -pr newswire -pl sd -paul vandyk -paestu m -nois ily -ni ve -natali ec -nar ia -mondaynight football -meso america -mcfar lin -man down -ma ari -lu sby -lu key -lochal sh -lo keren -leve que -la il -kron ik -krat er -king sheath -kil beggan -khe ir -katar zyna -jag an -ini quities -iglesianicri sto -house boats -hitt ite -hin ny -hen ninger -he men -hc so -ham ley -grimac ing -giall orossi -g mac -fur qan -fre dro -fl ds -fin eness -fear th -fail over -fa ile -eth nom -er sten -entin el -eng ale -en ak -edmund ston -edmun dmc -east brook -dj k -disco ve -dev fest -deli ve -cyan ins -cro kinole -cookier un -conco ct -comman deer -co fo -cl ines -chrisl illey -chaun cy -big al -bhu pinder -bc f -bar rela -app all -anton ello -an us -ala ine -al gor -ag ena -ad du -ðŁĺī ! -ðŁı · -ðŁĩ«ðŁĩ ¯ -าภ¡ -you togive -y ine -wer ker -voteenrique fpp -ven de -vel lir -uon bi -u mut -tragic ally -tho re -thisplace matters -the dukeof -tdamerit rade -tanz ani -tan credi -syste mically -syndic ate -surrep titiously -supp l -stone m -ssi an -spitt sburgh -so al -si ame -ser am -sco vel -s made -ru pe -rt dna -rope way -ro gie -river cruise -repos ado -re blogged -raffa ello -poly clinic -pickle back -open democracy -oldro yd -ofor igin -nor berto -ni mi -neu wirth -net working -na ac -moon lite -moog musicinc -micron auts -mc gowan -may en -mat chett -margare torr -mar te -magne sia -liquid ator -likeli ke -lady bird -la fer -korn field -ki ger -ka ay -ka abi -k ount -instaf rame -indoctrin ating -ilaiyar aaja -ideolo gue -i star -hel eng -hallo f -gwen pool -gonebut neverforgotten -go bu -gly pto -fit zy -fil omena -fe vered -escul tura -duplic itous -dramatur gy -drag strip -dit zy -dev ine -den nie -demo te -defen sa -davis ville -cre use -conden ast -ck ert -city break -ciel ito -chi leans -caterin atweets -cas ady -car ai -bun du -boot legged -back thursday -axi ata -aw adh -auto immune -as af -anton ino -ah ti -adoptdont buy -ac tes -absin th -/ * -ðŁĺĦ @ -ðŁĺĤðŁĺĤðŁĺĤ " -ðŁIJ Ĩ -íĥľ ìĸij -ಠľ -à¤ľ न -ydr com -xx xiii -x wing -whit en -we ssmith -vox els -vote eff -victi misation -van ney -uper man -un truth -tu si -towel day -tom ey -to bia -timeout newyork -ti bbles -thr ought -thebig show -the point -than son -tell ico -tar onegerton -stand asone -ss ahluwali -ssahluwali amp -sports guy -si skel -shrie ks -semrush chat -semin chin -scoo ks -ro len -requ in -rapid kl -rand fish -quad ra -personalized learning -pear ce -pa ji -ott oman -ot ara -omer ase -oli ka -oko th -ob y -nisargad atta -ni est -nanta hala -nag ul -myel itis -my til -mur f -mor rilton -mis smo -mg sv -mg mt -mcel wee -mcdonald suk -may bach -matti seman -man souri -loui seminchin -london fashionwk -lef tie -le chner -kw qc -ko ho -kai lee -jor is -jo dies -jel inek -ist ure -inno cen -in nnn -impro bab -hyper visor -htown rush -how you -hoop shabit -hitman hatton -h fi -f gl -educ ación -earth watch -dr mark -cy games -coun tess -cospla yer -co if -ch ough -c tweets -buen viernes -bryan habana -bar ao -b go -ax tell -andro scoggin -am ud -a kee -ðŁĵ ¬ -Ú ij -zz ese -yaku tia -würz burg -whoo ped -v mx -un shaken -ume ed -tubeli ght -tre mper -the monkees -sweet briar -svend sen -suyyash rai -ste ilac -steilac oom -stay ton -slu mp -simple things -simon rim -showoff bydesign -sho shan -sea houses -scott brown -scari fication -sc udder -sargas so -s gameday -ru bias -reli ved -pupu sas -possi ble -pliss ken -pedo bear -pas sy -our girl -ok tober -ok cps -nit schke -neonicotin oids -mo hom -mira bilis -mat lock -mario goetze -let d -la dles -ks fa -kefla vik -just is -jon jo -jason segel -it ro -ir regulars -io va -ins angu -im pe -hu lett -host elling -hoo ter -hof stadter -gro b -globe debate -gent ly -g anger -fo sco -esche w -elm endorf -eco logical -dl na -dil ate -desp ina -de constructs -dar denne -cover crop -cor ine -comp ilers -colo s -co habiting -clam bering -cin da -christoph ers -cal away -burn sy -buech ner -bu in -broy hill -bro oo -bom ani -blacke yed -beech mont -be sse -ba ena -at mega -ash kelon -as j -an ual -a ati -ðŁĶ¸ ðŁĶ¸ -ðŁĴķ " -ðŁĩ§ðŁĩ ¾ -ð٤ŀ ðŁı¼ -yi wu -wil sey -what up -warrior games -wa al -w vt -thereal dcf -the process -su see -spe ight -spar tina -sick nesses -schar pling -sar ab -root sof -regur gitation -read aloud -pun ti -pro kop -pres byo -polar ising -po kiri -pli mpton -plas mas -pla i -phon ological -penetangui shene -pashupatin ath -organic gardening -omon sters -oh ba -nimb in -nak agawa -mish al -me dy -marcou x -man sky -mal iciously -mal dita -make theroad -mac found -lon min -lipsy nc -le toya -kun ze -ku us -ker an -jack black -ja sen -io dide -ing cancer -ind sey -hydro foil -hoyas axa -hottie oftheweek -hom inem -hollywoodun dead -hawkes bay -har ner -h gf -gr itters -ger t -fp gas -foo dy -fan cams -exeter cathedral -evangel ic -euro hockey -en ve -elou ise -dul fer -du kie -dis connect -det ente -dele k -defe ctions -come shome -col ons -chatto padhyay -beyond blue -bec q -baby center -ay as -aspir ing -ari stop -apollin aire -ðŁĴŀðŁĴŀ ðŁĴŀðŁĴŀ -ðŁİīðŁİĬ ðŁİīðŁİĬ -ðŁİĢ ðŁĴķ -âĸ¶ âĸ¶âĸ¶ -ï c -yorks biz -y aiba -where thecar -wherethecar sare -villa ggio -u iz -tin ian -thru pp -thr ou -the fan -tar kenton -street photographer -stin c -ste iger -son news -soc med -scy thian -sat in -rusty wallace -rp ms -rox eter -resul tado -quo gue -qu ne -q af -pulver ized -poloni ex -part in -pa wer -on vif -on k -not ch -nj ie -new tek -n pratc -my yyy -muham madi -men ke -mar na -manipu lators -mag at -love is -lc ss -lau ding -lanvin official -kab at -jy vä -just blaze -jo bar -je sters -jan ai -inthe us -inst ax -i ben -hil le -he cking -hapha zardly -gay ton -gam bar -far th -fad al -eric holder -duck weed -dru silla -do komi -deci r -d gh -ct fu -critic ality -ci ber -ch ando -cd q -care homes -car others -c icc -basti at -autorick shaw -at olls -and ymurray -am ang -al mera -al dea -ðŁĺī ðŁĺģ -w bi -var itek -up ham -tv sn -turn age -to iled -thorn ham -the open -the agenda -tan lines -superse des -su cr -staf fing -spe di -spac ial -south westerly -smooth jazz -sharethe lex -senior itis -sb vb -sand ero -ring send -recap turing -re xit -re ids -quie ted -pushawardsteam kisses -pu entes -process ing -por ttal -pop crush -pir u -peter ptur -per illo -pat summitt -ous music -or ani -new line -mordi alloc -mo hi -mo barak -mit ron -min k -merri mac -mercury theatre -memorab ili -mar la -mac n -lm x -llu ll -lis ap -lan olin -lac our -l fd -kuns thistor -ko kesh -kate ys -jon no -jeric ho -janegoodall inst -jal on -jae suk -ic entre -hus sein -hul lah -harsh ini -happy day -hai ro -h nl -gen co -g apping -friends notfood -er len -efe cto -do wels -dit mars -despo tism -dab rowski -clair ton -cel g -car on -car hart -cal ums -bu ang -brum field -brit birdlovers -bristol baby -bbc womanshour -barbas ol -bag man -back bencher -as uk -anti dotes -ann at -anarch y -anandiben patel -am ola -agh olor -acro wn -!! ( -! ¡ -ðŁĻĪ # -âĿĦï¸ıâĿĦï¸ı âĿĦï¸ıâĿĦï¸ı -âĺĢâĺĢ âĺĢ -zoni bali -white tails -vincen zonibali -vas sy -upadhy aya -tu ya -tre dge -trave le -to dor -time z -technology news -sustainable tourism -surfact ants -sun it -strang les -shor tridge -shelar ashish -she a -sf ile -say no -sair lines -rudhram adevi -rob schneider -ri ffin -reyk jav -resusc itated -ra heel -publici zing -pin aka -peter s -obstin ate -nt fs -mix ing -mcgon igle -mc girt -mad ball -lydi ate -loy e -low der -lex y -len o -lauren goodger -kah lon -k nd -jum illa -ju mu -jaye gi -jamie whincup -inten tional -ima x -icom edy -hondac lassic -hh b -haus man -gw and -gun gor -ger mline -gaz idis -gal ad -fr st -for fun -fit girls -fish hook -exped iting -ev t -eur jpy -eryn gium -enough said -dre ll -dispro ves -ctu local -conf rence -co pra -cath ao -car olo -cann ington -c agu -break beats -brah mas -bowdoin college -bor onia -bo boli -ber nas -baw se -bate mans -bas otho -barcel one -bailey m -an andi -alb ina -affe y -ac ares -zi zou -y stem -wood cutter -william byron -west fjords -wal b -wainsco ting -ver dure -vac as -tony dungy -toly atti -toku shima -thermopy lae -tambu wal -sushmit adev -sushmitadev mp -sto hl -stag es -sick bed -shri vastava -shakespe arian -se sion -school bus -sa ille -ru disha -remedi ate -re traces -re appearing -rally australia -pu recork -poke mont -po thos -play girl -pigeon hole -out num -oli gon -ol itz -no vis -nit z -ni f -myo b -mpl s -mech warrior -mccar ver -marypopp ins -mana hawkin -ley house -leve rett -kuch h -ker ber -k mr -jo wett -jeff vandermeer -jare tt -jack sock -iter ating -inf x -inci dent -imbu e -huach uca -ho ta -he fe -google fiber -glen burn -gets old -gabri ella -fresno bee -fra se -fire department -fahri ye -f bw -exten ded -est á -er ay -e ser -duv vad -drais lv -do dig -dev co -de ak -dam pens -dam ia -cryp tids -cra dley -cham bal -ce dis -carou sel -cab g -ben hur -be ika -attrac tant -as police -are alestate -apple store -anastaciafan ily -an shuman -an op -al cide -ðŁĴª âĿ¤ï¸ı -y thing -ww fcofficial -why so -wapp reciationday -wag gin -veronic amerrell -veg fest -us apro -under story -u ha -trenton thunder -traf ine -ti med -thir roul -theatre r -teachers matter -tar boro -sym metra -sylla bic -sylla bi -swin ner -sw afford -suk hi -sper anza -snow patrol -sheridan smith -sak aguchi -s suk -s birthday -rigu eur -regg a -reach out -re issuing -psych today -ps bhumi -play boys -pirates fb -pe vsner -pav itra -parth asar -orac les -ny m -no cent -narcole ptic -name sakes -mon ken -mol vi -meur ice -massey hall -mary ville -mani festive -ly lm -le sufi -lal wani -kassiede paiva -jyo ts -jul lie -ji raiya -j ato -insol ence -imitation game -i xi -houston ian -ho ja -hick ling -hash d -harrison ville -har gis -h sh -h frs -gil bane -friend zoned -fam ke -esguer rat -equi pedefrance -el neny -e boue -disney store -di ero -denver broncos -deca inc -dat du -cu bby -coo kislands -car ri -capp elli -bro in -brewery ommegang -br acy -bor gat -book marked -boi vin -bo tv -bo hu -band itos -back fill -am erie -ablu tion -abdic ated -aar mstrong -. // -' * -ðŁĵ ĵ -ðŁĵ ¯ -ðĿĻ ¤ -Ñģп оÑĢÑĤ -z brush -ye are -wur tz -win ry -weekend warrior -we missyou -viñ ales -vent ress -vait la -un bundling -un boun -thu an -tho w -the leftovers -the bath -th ope -th ain -texas childrens -ten sing -tb one -tages spiegel -stre k -spi rou -sp atz -soooo on -sen whitehouse -semp iter -sch amps -sales woman -rober talai -revdr barber -radio humberside -ra himi -pu pusa -pro mazda -pied montese -pay oneer -pal mb -ouag adou -or dic -obam as -nor um -nor mmacdonald -nationaltree week -narrati ve -murphys boro -mulat to -min day -librarian ship -len na -leish mani -le mus -lauri ston -lan ta -kork maz -kim yoojung -kha chanov -keesh ond -jan ki -j po -in nu -ilo gy -hun ni -ho stile -har ling -giri raj -gior ni -gener is -gel nails -fr ronconi -fore shadows -first love -fair tex -fa er -dre ds -disappro ved -culver house -cillian murphy -ch x -cf trust -carpath ia -call anan -bsn l -blu ecar -bis wa -benic assim -bath ong -bal bo -aw alla -app ea -an kers -accom pli -ac ali -a art -________ ______ -. ðŁĴĭ -. âĿ¤ï¸ı -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃðŁĺŃðŁĺŃðŁĺŃðŁĺŃ -ðŁĺĶ . -ãĤ¤ãĥ ī -âĿ¤ ! -worldre sources -wood cote -winter burn -wild hearts -wh attt -wan ka -vacation er -us marinecorps -un ac -u alr -toy drive -tom mies -thisisla fferty -teter boro -tali aferro -susanc alman -stor yo -steel city -ss di -solu te -sm ount -sig al -se ssler -se pak -rou le -recru te -re awaken -ran ald -ram nath -q ra -prie ster -phil vassar -pender yn -parame shwara -par ram -p ku -national ballet -muld row -mor bi -miniature art -mat amata -man ute -malak and -makin de -lucifer ian -ld d -kun du -kil led -jove tic -jack sboro -j é -iro ha -inven tiveness -inter school -ichi bi -ic helle -i ara -hex agon -hemlock grove -grand hyatt -get creative -fur uya -fre on -fli ppa -finsbury park -fangasm spn -evil doers -eu v -ebolare sponse -dj ay -depar tement -delas oul -dar low -cu boid -cristin avee -cen kuy -bri el -bou ma -bo sn -ban tu -bal og -an vils -allevi ated -addic tedto -absurd ities -ab ida -ðŁĺī âĿ¤ -ðŁĵ° | -ìĻĦë²½ íķľ -ê°ķ ìĬ¹ìľ¤ -zi ther -x seed -x imab -wwe uk -wit chy -win eland -wake hurst -und ine -try it -transforming lives -the visualart -t lim -stock pot -sony six -somerset levels -skysports boxing -shri vel -ser dar -sampal oc -s deep -rwc md -rudi ments -rosehill gardens -respon s -repp aul -re mp -re marriage -ram asamy -qui vira -propor tionally -pom pton -pil ote -op aline -objec tify -ny k -ni hari -nett le -nam er -nafp lio -murry sville -mul vi -mon tara -moanal ua -michelin tyres -mic hale -mi rella -metta worldpeace -mc cc -mb ury -matsu ura -mate i -maic ha -loy ola -limkok wing -len n -la quan -l senews -l bm -kro mer -kpor zee -karolin ska -jim norton -je ffe -hepha estus -gu ate -green law -gre er -g anc -fur o -foam posites -fil mes -fh su -fat in -far ge -fa shi -f km -esguerrat ommy -equ alizing -ear les -discord ant -crou cher -cook sey -con quests -commensur ate -cole engarcia -col son -charlo tt -burgun dy -broad field -bre th -bray shaw -bli ssett -bha sh -ben lovejoy -bb nai -barn sdall -atar axia -as oftball -aq w -antho cyanins -ðŁĴħ ðŁı¼ -ðŁıĪ âĿ¤ï¸ı -æ© ĭ -y uni -y il -wolf hall -whow ould -water proofed -visit ations -ver dant -universityof ky -un enthusiastic -ty b -trilli um -traverse city -travel tech -ton o -the score -tar da -sth elife -steve kubota -ste wa -sm older -simon helberg -sil sila -shor tie -seattle pd -salis bur -ri ho -rha bdom -renov ator -rene a -reggie watts -real bob -pu zo -produ c -power ups -ore k -on elxn -off ootball -o al -new track -ne te -naz em -music brainz -mun ira -mu tha -movie podsquad -moto guzzi -moon day -monte casino -mo thi -mindless bhavior -medi ates -manse hra -man sarovar -man ce -lydi ard -live well -lincoln wood -less a -les bury -lee z -led low -le evalley -laver ton -kle m -kaw ana -jan ela -jae hn -instap rnts -indianc inema -indian art -in in -ici zed -hosse in -histam ines -help dogs -hant s -hahahah hahaha -ha dee -green team -green slade -gno stic -gc titans -gaming life -ga es -far yab -f grfc -elç insangu -el off -eat my -dy ker -dou we -democrat shate -daver ayner -daverayner fund -danger ou -contra ven -clu bby -cityo fl -che tbaker -cb n -book binder -black magic -bbc newsline -bad ulla -b ici -av la -aubu sson -atl v -ashi m -ash mont -apu estas -appell ate -apalach ee -am ade -ag morethanever -abduc tors -^____ ^ -+ ... -ðŁĺ¡ðŁĺ¡ ðŁĺ¡ðŁĺ¡ -ðŁĸ į -ðŁĴĥ # -ðŁ¤Ĺ ðŁĺį -ìĸ´ ëĶĶìĹIJ -ãĤ»ãĥ¼ãĥ© ãĥ¼ãĥł -ØŃ ÙĦ -× ķ× -zhu kov -yerush alay -waz iri -ver such -tü bingen -twitter artexhibit -turtle dove -true bloodh -truebloodh bo -tri sha -thereal jrsmith -thau low -th ato -sydney airport -sp azz -societe generale -sling erland -selec tronics -se ige -san marino -run withthe -ros sett -ro dolph -ric an -respir ator -re probate -ra issa -r pk -qua hog -qu ite -pub chem -pr annoy -ponty clun -per tain -pepp as -pe ons -paw lak -ox shott -ou trunning -ol ver -ny asa -new burn -nag ur -muck ross -mor rendo -min et -mikul ski -meso american -melbourne vixens -medce zir -mar ilou -ma kk -leve tt -l gas -kyo ani -kun in -ko zik -kingston ian -ki bbe -jur upa -ii e -if not -i wo -hur acán -hor ne -home ground -hedge fund -gg d -genna io -gameof th -full set -forsy th -fo pp -fic ou -dre ddy -de conge -dance mom -dam pier -dad dio -cubam in -cr inoid -cityof hope -certi fiable -cenkuy gur -castell defels -casey veggies -cas sata -bupre nor -bru ces -bee bo -bay way -azzur ra -avi dly -amust fall -am cs -al uk -advo cat -adam antium -aby ad -ðŁĴ¥ ðŁĶ« -ðŁIJ¯ ðŁıĢ -ðŁ¥ĩ ð٥Π-ÙĪÙĬ ت -year so -we dem -w tw -vi dhan -us ick -unemploy able -un fail -ultr at -uconn nation -truth iness -tri maran -tr icon -sylac auga -swain wright -suman th -ston em -stereo typically -slam dunk -si yab -shoe making -shekhar kapur -screw vala -sau v -sar os -sal pointe -saffron walden -saar brücken -rosar ito -rho donite -q z -presiden cial -pre empt -por ritt -phen olic -over indulgence -oren da -onye ka -only one -never again -mutil ate -mox ey -moon shine -ming in -meh sud -mc coll -mari otti -mali ks -logi o -lo sf -life ison -length ened -l sx -knau ss -karak achat -k wal -k enda -joann ak -japan trip -inter laced -innocent drinks -harpur hey -han ko -gwan gh -gram mes -gener alize -gan jam -fran ka -fon da -fau gheen -f one -f cau -etu i -el rich -druck mann -dhru v -dav ao -dance team -danc elife -d poy -copper heads -chit arra -buff a -bronz ino -beat itude -baz a -ball gown -as tha -ann g -angel amer -am po -all anguage -(âī§ âĸ½âī¦) -ðŁĻĪ âĿ¤ -ðŁIJ¾ ðŁĴķ -ðŁ¤ ´ -ê¹ĢíĺĦ ì¤ij -âľ İ -мÑĥ з -zay nab -yassi r -wave form -wa hili -verbo ten -ve ery -ur anger -um ji -u stour -tur riff -trek kies -tibur ones -tal las -syri acivil -syno p -su vi -skin z -she rer -sf pride -sa wal -run dell -renault sport -randomhouse kids -quater mass -po liquin -pink print -pe ch -panch ito -os agie -ole ta -ol les -nup ur -north wick -no logies -ni dhi -nathan carter -nag ach -mortalkombat x -min nie -me vani -maki shima -lorett alynch -london bookfair -loc ked -livel iest -len a -knoll wood -kal ert -kal en -k ach -ju ss -joker to -jo sc -int ent -imacelebrit yau -home star -hip life -hier ophant -grist mill -green acre -good smile -go yette -gee khour -ge fil -fath ima -fairmon thotels -fa ar -ev onne -ero v -ener d -donnell an -dissolvethe union -desi rability -deep water -cubamin rex -crusad ers -county pd -cor red -congru ence -confis cates -comicboo khour -choco holic -children sphila -char man -changing places -cap leton -camp life -call inan -bunny ranch -bro mbor -bou chet -boom ed -bom mel -autonom ou -as ra -anton ina -alex fromtarget -. ðŁĴ¯ -ðŁĴĥðŁı» ðŁĴĥðŁı» -ðŁİĻ @ -ðŁĩ³ðŁĩ µ -ðĿĺ °ðĿĺ -ìĹĨ ìĿĦ -ห à¸į -ye tti -ye aaaa -yarra valley -wor le -vel ox -usav mex -twof old -true islam -thewine society -the strokes -stress less -slu twalk -skyl ä -ski ve -seraf ini -rice gum -refrac tometer -red light -pra geru -positive psychology -po bre -piri formis -pink day -pet worth -pac zki -nut meg -nur singh -nsw fires -neglec tful -natalie ben -n gen -med students -mc nicholas -mar ske -man gus -ku news -kou ki -kh r -kedle ston -karolinska inst -ju icio -jimene z -icy cling -hhhh hhhhhhh -hernan dez -gom ustangs -gol fing -gla k -gabbi adini -fu rence -flugel horn -fang ed -face thenation -españ ola -epi k -eca illat -dream hack -divisi e -dis loyalty -detroit lions -del mundo -de ine -daniel sahyounie -copy writers -comeu ppance -colbi ecaillat -col wyn -citi c -christ ingle -chen ault -chau rasia -chand ran -cannabis cup -caldic ott -blu elive -block aded -berry ville -ban kai -arri vat -ang k -alma da -ðŁĹ ¡ï¸ı -ð٤ŀ ðŁı» -îIJ ij -ìķĦìĿ´ ìľł -ಠł -zaz ie -yir uma -womens institute -willi mantic -weak ley -we ser -vi goda -vern or -un dee -ugly dolls -u rad -u dot -town speople -tic at -thor st -thisis robthomas -there ef -t ck -t ague -stream fakel -ski ddle -silicon valley -si os -shin se -sc aife -sas sen -san vers -san sar -salati ga -ren at -refin ed -re ffing -re considers -rain man -po quo -po ley -pierce brosnan -pe adar -pay al -partiti oned -panther sihc -o kun -ny xl -new adult -neg ar -nat araj -murad ali -monoc acy -mo sphere -mel bur -mar gie -mand ra -m jordan -li diab -la prairie -kou rou -kan go -jaf far -j bl -il ri -il itch -hot list -hollywoo dimprov -hobo ken -heaven onearth -he eney -happy dance -h fe -gra ying -glo ball -gau ahar -fram ed -fire trap -far r -fanta sticks -fant in -fanarmy faceoff -fac cio -extro verted -em ption -elast ica -east wood -do ku -david cicilline -da a -current mood -cur lews -cross bill -conver gys -color block -cl ande -chi rac -catat onic -blind folds -bishop briggs -bis now -bertel smann -bas ma -bas f -b lear -amey aw -' ..... -ìĸ´ëĶĶìĹIJ ëıĦ -ê tre -yar der -weare nigeriancreatives -watch roh -wal ser -vibr anium -ungovern able -transparen cies -tit p -there se -te ela -tam ako -ta fari -sy st -stai the -sol man -she iks -shadow bringers -sb ca -say d -sav ina -sar ch -san marcos -san day -robri ggle -ridge dale -redbul luk -real z -rc z -radiom irchi -punch drunk -pro circuit -pri ddis -pretty man -pre me -power outage -paul sboro -pan tin -olivi as -obe id -neil n -naj era -mu jh -monarch sway -mizzou football -mir choff -milli metre -men elik -mc daag -max y -ma ppin -ma aan -lu ffa -long stre -linde mans -lik as -learn with -lan dic -kom odo -kim ya -jer ram -ja q -its better -intermitt ent -interlo chen -in ox -hor nell -hoo ten -hallo weekend -gen ious -gad di -ga hd -g ft -fun com -ful ls -feder line -ense mble -elli es -dwar fing -dr at -down played -dji phantom -dis lodged -dhive hi -dary ll -d marc -cow li -co sum -christinam ilian -cho ong -catalo ged -busines splan -bru mmer -bridge point -bor us -ber mejo -bel gica -angio genesis -amre zy -amp oule -am dra -albino kid -albari ño -al fieri -ad akar -abre wer -aaaa aaah -ðŁij£ ðŁij£ -ðĿIJ Ħ -ãģ¾ ãģĻ -zap atista -wu du -wit mer -wildlife bcn -wes sun -voy aging -v arez -ur anga -turquo ise -tr bam -tom chaplin -th appa -sw apan -stra tham -star music -soul calibur -silvers mithing -side of -sg ill -schem bri -s ative -s alla -russia invade -run up -ru ang -rob sten -ro so -recl ines -re os -rat emy -pro core -phoenix comicon -pen kridge -passi vity -pa ap -over reacted -oven ow -ot aru -on das -om exico -ohio an -official tf -od cast -nu die -neutro phil -neder lands -nd wbb -nay ef -morning drive -mi festival -mer itor -mc mee -max thieriot -m fy -la der -ki dero -k btx -jewelry making -ive ta -iri an -inver gordon -indi ranagar -in calculable -in aki -im pasto -i ur -i il -harrass ment -green peac -god frey -ger ome -ge ti -fibro blasts -farahkhan ali -fal aise -f z -duc o -document a -dc cheerleaders -colling e -cha har -ch abby -cell c -celi e -candy crush -cancel o -burgen land -bi anch -bhil wara -bbc southeast -bb waa -avger opoulos -ath enee -ander ssen -ambassad orial -amb am -ack y -abur ke -ab om -a amar -# * -ðŁĩ ´ -é ł -wor land -wool pack -vital is -valenci agp -us ila -ur anium -under berg -trop fest -trol ly -titch well -thunder cloud -ther ma -th acher -te jo -tan trum -ta kat -strib pol -stress or -snu fkin -shy ama -she an -shak un -sco delario -san mateo -ru shall -round ness -ri baj -revol ttv -rain forest -r ê -r vb -q au -pu tti -pontific ate -pit tura -pilla ged -patrick mahomes -o dori -ni was -mout inho -mott macdonald -mm s -min il -middle march -mi sha -mccam mon -mc z -marath wada -lil jon -le pers -koo koo -kin zinger -kid scan -karen kilgariff -k fcb -just asking -jar rar -hu ffer -holler ado -hersh iser -he le -h icky -gru dgingly -grouse mountain -gom pers -go pirates -gamep ass -fore father -fo gler -f forde -ex el -ep ad -enamor ado -en closing -effe l -ed leadership -e bikes -du ston -dipikak akar -d acs -cly dach -cho desh -chit tor -changi airport -ce men -card captor -brun ing -br cc -black hills -bench marked -bay side -bar tek -anthony anderson -ann marie -am rinder -ag y -ab era -^^ ~ -ðŁĻĭ ðŁĻĭ -ðŁĺŀ ðŁĺŀðŁĺŀ -ðŁĮ¸ ðŁįĥ -ðĿŶ ðĿĹ -âĢ¢Ì ħ -yerushalay im -yah an -wu c -will friedle -vau dre -usa o -unice fusa -u las -tony romo -to des -ti memor -team blake -tax season -tatasteel chess -supercar sunday -ss ential -soc i -so kka -so den -sig nofthe -shum ate -shoe bury -senso dyne -science matters -san ge -saf ood -respectthe water -refra ining -real kid -queen victoria -que ijo -propri ety -prisc ila -plain clothes -per vious -penn sylvanian -par od -pag es -pac to -over stayed -off ilth -o tec -non discrimination -nex tofficial -ner issa -nat sec -myal gice -mo wa -mir tha -mi w -medi amar -marth apli -marthapli mpton -m vo -lun de -lost prophets -lo pp -little miss -lille shall -kw am -kin dy -j inga -it chio -im n -hol lowing -hello goodbye -heat seekers -g loc -fashi o -fac tional -exhal ed -eric as -ear ch -doo ds -dev secops -deth klok -de pa -de form -da hm -chu gh -christ on -chaus sures -chak ri -cel aya -can ario -br ind -black country -bilo deau -bick ell -bi frost -beau té -b nhs -az ee -ay am -aug gie -aper ol -apas coe -anti ka -anti bully -ambi en -adam driver -% ." -ðŁĴİ âľ¨ -white cube -whit erock -war u -wa sten -use lessness -uc g -u cr -tier sen -sted chat -staun chly -stargate atlantis -stal la -som ma -solympic team -solidar ityday -socialist sunday -snow watch -sker k -sin t -si mage -sfor trump -sf v -sch ack -s ro -rosanne cash -return able -ra vitch -r gu -pu cke -pro scen -poign ancy -philipp ullman -perio dization -or lan -oo bleck -naz es -monk ton -mogo eng -melissa and -march foreurope -mad dog -luc ille -lim oux -lie sel -lan dex -kt k -juli as -journ ée -joe hockey -jeff burton -jav aid -interdisciplin arity -inteli gence -hon ma -heriot wat -ha eng -gwangh wam -good lad -gin apu -gif tever -gavi ota -frequ enting -fore shortening -food ways -extran eous -ex ti -evangelic alism -ers out -ern st -emc coy -elle schi -ear muff -dougi emcfly -diag ram -de splat -dar laston -d welt -creature design -cran more -cos mas -cor ia -congress i -con all -ci am -ce ma -cbc murdoch -categor ise -c wo -bo we -bir die -bettym white -b anti -as pac -aldubang pag -al music -afric at -ðŁ¤¡ ðŁ¤¡ -âŃIJï¸ı # -âı ¬ -worth itv -worthitv ma -wil ander -way towork -wal ing -w co -undere mployment -tyranno saur -tv k -thorn wood -thorn cliffe -thisiswhywe play -subl ingual -streamfakel ovenow -ss chool -sister s -simp lot -signi fied -sent a -se let -sd beer -school sout -sb n -sal tier -sag ay -sa hid -s alli -rosen ber -roma downey -ro sti -reven ants -raven loft -r maf -pk mn -pin ako -pepper pot -p drm -ok un -ok r -odd ness -oa week -o gaden -ny an -now ness -nca afootball -nab arro -n ks -melis sac -manoj sinhabjp -m jo -lyn don -lumb ering -lot ter -las key -kstate mbb -kooten ai -ko sarin -kiri baku -keik amara -kail i -josel ito -jiha dism -inter related -im rie -ice breakers -hu gel -hit oshi -hei sel -guic hard -go knight -go en -go ba -glen arm -flye st -ever r -eric bellinger -equalit ymc -endof theworld -electionswith ht -doren bos -do vo -do besity -disin terest -diferen tes -di lett -dam ming -cun diff -club america -chi pping -che mbur -chapar ro -cel cius -car lock -can ham -calamit ous -book tube -blan ches -bhu tia -ben zie -bar gen -audra equalitymc -attenti on -arte k -ar kit -amdra deon -allred md -afgan syah -a ei -^ ) -ðŁĺĻ ðŁĺĻ -ðŁĴĽ ðŁĮ» -æ¸ ¯ -âĹ ½ï¸ı -ÑģÑĤ в -yo gaw -y tb -y it -x med -wine chat -wil do -wat too -w lg -vic om -ure thra -under nourished -u sche -typo grapher -tycho brahe -tv uk -totten ville -to ffler -thu sian -theband perry -the ee -te mo -tail gates -ste vero -spre paration -spo oners -speci aleducation -snever die -slug gish -sister love -shru b -sher pao -she ema -send in -se uk -sab ahan -sa or -ring fort -recipe oftheweek -pur ports -poly carp -pisco po -pier son -pas sim -par faits -panchay ats -over hear -ouagadou gou -onu evo -oat man -nab ucco -must ela -mild may -mihal y -micro breweries -masta ace -m wi -lon o -lo bel -light sfor -kozlov sky -kn bc -king bach -ki it -khu fu -kgal agadi -kevin woo -ke msley -kan chenjunga -joell ortiz -indi os -imperman ent -ima g -hul sey -gu yon -green lawn -goo dest -go ater -flor um -fl its -fin cham -fel issa -eh ren -eft pos -del rey -david bisbal -cowboy cerrone -coug fb -contemp tible -comfort zone -combin atorial -childish ly -child day -cherno ff -chast ise -capital ised -ca j -c pps -bio shock -ber nadine -ber gia -beau mont -bat tel -ballyna hinch -al ick -air vistara -agye mang -ad ub -( ?!) -ðŁ¤ ļ -îIJ ħ -íĥľ ìļ© -ãĥĥãĥ Ĺ -zum thor -ysle ta -y cee -wood bine -wirt schaft -w div -vive ka -var dhan -v wd -under cutting -um alo -touch ph -thri fted -te ching -suntrust park -squeeze box -sou cy -sof ast -sk ims -sc nn -sauté ing -ryn chibi -rush limbaugh -ru mor -rose town -regu la -rec ca -rd pro -randi zuckerberg -ps fk -people make -pand u -p sps -ore ille -orange crush -one town -nu blu -nor ie -new t -na sho -n atti -mar ination -mahon ia -ma inde -lv cc -lep anga -leon ia -kor ban -kn acker -key leth -k soo -jo bur -jacob sartorius -itsin youtogive -itch iness -iot swc -in cant -hé ctor -hu len -hor ie -ho ce -happ ym -ha flinger -gro ttos -gra be -fur rowed -ex ab -du lais -dout or -can ady -campylo bacter -bic c -bekin dedu -bar det -bally bo -auth o -ashley graham -ardaw igs -ap uri -anaesthe tists -alliseeis gold -all port -ðŁĻĦ . -ðŁĺŃ ðŁĴĽ -ðŁĺį ðŁĴª -ðŁĺĪ ðŁıĪ -大éĺ ª -x seed -wä rt -wo wsers -wis ata -wee ke -w ene -voy ager -vl si -visit savannah -tre ve -trail finders -then ut -the party -tene brae -tar pley -suzanne lepage -super cluster -stephen son -spri gs -spi vak -spa day -sp hs -solheim cup -shy ly -sfor women -school kids -schen ck -sab ka -ryo ji -ry en -rome sh -retrac ting -resc ate -plat ense -pint u -photogra ghy -petr ina -per mutation -penc illing -parale gals -pal at -outre aches -open doors -ong al -ok bokki -oh g -nzv sl -normal ised -ni ort -ni ed -nam b -n achi -mr selfridge -moun tie -mol lis -mob ilities -min ard -mimick ed -mile tich -mc isaac -maythe fourth -man flu -mag gies -mad dest -lu zh -lom ita -ll dubs -lincoln hall -lik ar -ko kol -kim mage -kid sand -keo hane -job done -j ma -j hang -itv sport -is ingly -id man -hp noti -home opath -happybirthday salmankhan -gov markdayton -glo vers -fu ganda -ex ican -encro ach -edmun dson -draw pile -do iron -dimit rios -delhi dynamos -cor vin -conoce artistas -commo diti -co atta -buff ay -bee g -beat navy -be tula -az ari -avenged sevenfold -apan thers -ano j -aldubbig girlz -ae schy -ade ci -aban erjee -:' > -ðŁİŁ ðŁİŁ -ì¿ ł -æ Ĥ -âľ Ĵ -âļ ĸï¸ı -z ade -yu th -withr and -vicen cio -va ar -un block -ukin india -uj iri -tri g -transgre ssive -tra gos -tor v -ticke ts -the stars -the ss -the matrix -the duke -stocking stuffers -stafford shirehour -so dak -six nation -rs ch -ricardoro ssello -reli x -recou ping -rangers family -radion ow -pe jeta -paper white -overex posure -oniz uka -ny le -nh r -new market -naf i -n drf -n aldo -mulvi hill -me ha -mcmen amin -mcgon igal -mall ery -logan berry -lemn sissay -laun e -la fon -kre ay -kim bolton -ke pt -ke ary -k hem -john swinney -jfk library -javedn laghari -itune spodcasts -i ken -hor der -hop kirk -hl mbb -gup ta -goo i -gi onta -ghana starnews -gar ryo -gar ib -fun nell -farmer sin -ex ib -es na -edi ficio -east leigh -dw yn -doit big -con gradu -compati bles -clar a -chro site -charter is -charlie kirk -chale ur -calibr ations -cal dwell -brank some -bison pride -bankrup ting -ba fe -ausi ello -al tria -ab flood -y boy -x bi -women said -wol ter -vocal oids -vibr atory -v yach -ur banc -tu fo -trim pe -trent university -tread way -ti pping -ther aven -the mist -stan bury -st ale -ss sa -sor oka -so tn -sma h -slam et -simone simons -sergi om -schneide relec -schle reth -sab bagh -s wh -rockefeller fdn -ri mba -rey ra -qune itra -q ip -ponchat oula -peven sie -perenni ally -pad el -osom atsu -organ elle -optical society -none such -nether field -neca xa -nationalgarden ingweek -nas daq -n guy -ml ine -me scal -me io -mazum dar -marvel sdcc -len y -kyo ya -knuckle ball -kni fes -kiis fm -ki shang -ketogenic diet -juan jo -impe ding -i goe -houston police -house forsale -hon ks -heg gie -hart ington -ha sp -gu at -gu am -good without -glori oso -ger b -geome trically -fox ing -fl oro -fend t -fairchild garden -f assett -ever sheds -enchan te -eli zalde -ed markey -ec ar -di martino -di atom -dhal sim -dead y -cuck mere -crypto pia -co authored -chir ic -chip stead -cas as -br ymo -boo sie -bo sarts -bo ki -bla w -bi ped -baz in -bar oud -az raq -az ara -ash h -as par -are pas -anticli max -another one -acadi an -a ite -ðŁİ¶ ðŁĴķ -ðŁĩ¨ðŁĩ ± -ðŁ¤ ľ -ì² Ń -while black -wh ern -v ws -u stain -tru stuk -top secret -today yy -tn news -thucy dides -sp fx -si solak -shak y -sh net -rufu swainwright -ru bal -re buffed -rc memories -ra aga -quincy djones -q ed -pu kul -prince ssc -presidenti elle -pre da -por fi -po can -pi atek -period poverty -pen light -ol wen -nitro circus -mu ddin -movie reviews -mono culture -mill bury -mid ori -merry n -mel lowing -medal monday -ma goffin -m ld -liti gators -krish olden -kno p -kla ssy -kf dx -kalancho e -jyvä skylä -jam ón -israel icon -ina ina -in anna -i bar -hot d -gumb oot -gri gory -greatest generation -ge da -fujin on -fuji x -fric assee -formul ary -flead h -finn mark -feren c -es gr -ent p -ele azar -egg old -ecumen ism -e gle -duvvad ajag -down draft -doet inchem -dis ambigu -dan reynolds -cy c -crox teth -coatta ils -co wappreciationday -clo ve -chil ika -c conf -bud in -bon us -biz kaia -bisson nette -beard life -awas thi -as mit -as ket -ap lanet -allen west -ac ads -ab v -^ / -? ðŁĺģ -:-) :-):-) -âĿ¤ ðŁijįðŁijį -ze ke -wild land -whytele afe -wat tie -w tt -vibr ated -ve chain -tuan ku -thereal p -the wright -tenter field -ted nugent -t mv -sof honor -simon i -shutu pand -shobha a -sex change -scul ture -run tagit -rock ineve -ro zz -richarddin atale -richard garriott -rajkumar hirani -radha krishna -pugli si -politici zation -pinch beck -over think -os loff -ok ker -oc tol -nostal gi -mortar board -mi stake -mary na -mar on -lu gu -love leam -li acou -le grand -l fd -kate flannery -k fa -it ou -iran freedom -il agan -holein one -hob son -henley regatta -hari krishna -hans brough -gustav sson -grizz ley -good things -go yen -giandu ja -ge tn -game faqs -g sd -feliz diadel -f vg -f oma -ep w -earth strong -dun nell -drjoe abah -dortm under -cour trooms -ce uta -cape k -cap les -buprenor phine -blues ville -blon o -biophy sical -bill bailey -be dene -batter son -bal r -baker mckenzie -aw yers -ave yron -au solympicteam -asteroid day -anuger ah -al shabab -al gie -ain sdale -ach elle -a hed -zi yon -vu du -volu me -visiti ow -ven den -u tha -trend hunter -tore lli -tom islav -the web -ter ada -sugi zo -sol va -sker ry -seren ity -sempiter nal -seismo graph -robe spierre -road er -ro da -reverber ate -retrospec tively -red s -pre hen -po trait -po in -plat for -pi voted -pet an -per nah -parkinson sdisease -p mn -ox a -ou ard -ol ah -norway mfa -north borough -nor ceca -neel ak -n dom -myhaver photography -mu ara -mobile dev -mid c -mer ak -melo dia -me con -max am -man gom -major leagu -long last -lo hse -lfc tv -kle iman -kit ne -ju ge -jesse tyler -iy am -italian art -ir th -ice house -hill arious -hello fresh -hamilton college -haen ni -fanc on -extermin ators -experim enter -everyday is -european elections -ess ai -e wel -dy land -dramati zation -dr ra -dh m -complex con -co ate -chá vez -cay ton -car nau -bronx zoo -bo pinion -black strap -bee ches -bang ash -balac lavas -b cash -au rie -ar ayan -apoor va -alder sgate -ae mia -adi aries -ab aca -ðŁĽ ¥ -ðŁļ² ðŁļ² -ðŁĺĬ ðŁĻĮ -ðŁĴĩ ðŁı¼ -ðŁ¥ĩ ðŁ¥ĩ -çĻºå£ ² -âĶ ĥ -za ini -x company -whatiwant most -wam bui -wal ima -w cr -vi gyan -vai dy -usc gc -usc c -upp ort -unse rer -unisouth wales -un watchable -tom arnold -tit u -timo teo -the odd -templ er -te hel -tb d -superstar rajinikanth -stick ler -ste phi -state house -staf fies -spur se -soto grande -snapp in -sm g -shug borough -se ish -scher tz -sar at -saath iya -s fin -rose bush -ri sser -reci a -re forged -rat oath -rafale deal -popu lus -pollu tion -poker news -po blen -pic col -par acycling -nbab allot -mummi fication -micro credit -mas sport -man rique -make chester -mah endran -lennox town -lake placid -kunis ada -kray zie -kezi ah -kd lang -jame shar -ix a -ity council -isol ator -ingo ts -indoor oo -indi atravel -in heaven -imp ish -icom os -hy uck -ho ppy -hi ei -health talk -harmon ised -getmoney out -gb g -gay timesmag -g da -first legoleague -far ry -eth je -epi stles -eco l -dunn ville -dre we -door frame -dino bot -co asto -cha dian -cast rol -bluel ight -big daddy -bernade tte -be true -bar la -bacter io -back scratcher -b music -ati i -ast man -andyburnham mp -aitu taki -aerop orto -adam curry -abdul lah -abbey theatre -ð٦ħ ð٦ħ -구 구 -ಠ¯ -ঠ¸ -ym fa -ya red -weiz mann -war my -walkthe moonband -van c -vac c -tom m -the mummy -tess it -tell ings -teamdi data -survivethe ark -starvstheforce sofevil -snu ffle -snow don -sin que -sch ach -ri ah -retin oblastoma -ren mark -rein aldo -re establish -pride day -philli pp -panch gani -paedo philia -ous and -ok abe -oc ic -nu mpy -no brainer -nick le -ne eth -nair amb -moun te -mc math -maui jim -mar ring -mak ana -ma sr -m div -ly ch -loveyour melon -looknorth bbc -liken oother -le breton -kri spie -koech ner -jessie ware -iklan in -ig we -hindu ja -het chy -hed ger -haw thorne -gravit ated -googl enews -gbo wee -gas son -fsm py -free event -ess l -emor ies -ebon i -du iker -dre scue -doit yourself -di emen -derek carr -demysti fied -cultiv ates -cr cc -corr alled -colqu houn -ci ro -cha shma -car se -calci fied -cack le -ca shinin -bry ony -brad berry -blossom sband -bin tur -battlec ruiser -bat umi -avak ian -au dette -ann apolis -ang t -aiya ary -abut ment -$ ? -ðĿIJ ¡ -ãĤ¦ ãĤ£ -wi fis -wha aaa -wax editorial -w bbj -vis a -ultr arun -uk pubs -turntab list -traf low -toy show -to seland -ti fft -tequ era -tan sley -talla poo -talk sport -taka hata -sy am -spring fever -spon don -spike ball -sou tine -so bered -slo vers -she saidyes -sd ks -sal onika -rol ph -roger stv -rhodo chrosite -regular show -re culver -quiz timemor -puppy bowl -psy lli -princeton u -pri eta -pol ony -pneu moni -pipistre lle -phili pe -pan ah -oooo ol -om ance -ny havn -no ff -nhl bi -mu stan -mu dding -mot tos -moro zov -mick mars -metam aterials -mer ick -me ili -mck enzies -mc millon -marsh aling -makechester proud -love goldenheart -lo red -leg work -korta jarena -kateys agal -jic ama -it sac -influx db -industry news -ide ac -ice ice -hulu si -histor yo -hem ric -gu rel -go bearcat -gen maicha -for four -fearless records -f ö -f stvl -end note -dug anda -drum chapel -draught sman -dom ingue -def a -daf ridi -d bs -cyano gen -cor bel -copp ery -con oco -chain saw -cau then -by g -bun ka -brombor ough -break ie -book awards -back of -astr alis -ar mill -ar adia -amar ante -ac eves -" !!!! -! âĿ¤ï¸ıâĿ¤ï¸ı -ðŁĴŀ # -رÙĬ Ø§Ø -Ð µ -z the -yan ag -y thon -whitting stall -we sties -ur vivor -uphol sterer -up h -un char -u fd -twee ty -trin comalee -ti ar -thexfactor usa -thecoop way -the vet -that game -testam ents -tc f -tam bun -sus ans -su maya -sser ver -smith wick -shiv dasani -senig allia -sen randpaul -seag ull -satur no -sand inista -sa jan -rub bishes -po legate -plain well -omer ta -oku bo -og l -ncan ationals -murrum bi -model ismo -michael urie -melli fluous -media awards -massi mino -mar ja -man handling -madein nigeria -ma sami -list serv -liqui date -lin nell -lesm cke -lazz ara -laura dern -l bof -kr cg -k jer -izz et -is ser -hel pe -hard aker -ha bba -gü ell -gwanghwam un -gro ttoes -gover no -go eth -give us -gi gli -ghis laine -g football -fore taste -far yal -faith hill -es days -eidal fitr -ed ong -e im -dra ko -diffic ul -del port -db ms -dari ush -dam ekelly -craft work -cor relating -col back -cine magic -chinch wad -champion sday -ch ems -cawlidge hawkey -candid ats -c engage -butter ly -bush wacker -ber gu -be ek -ausv sl -au fen -alco co -ad woa -( ???) -# < -ðŁĴ Ĵ -ðŁijİ ðŁijİ -åľ Ĵ -å£ « -âłĢâłĢâłĢâłĢ âłĢ -âĵ ľï¸ı -you view -winnerwinner chickendinner -whe ater -wh iti -wes thuizen -vsc ancer -virtu o -ver ghese -up ci -twitter smarter -tu junga -sudhan shu -stop tb -sp acy -small sat -sel ayang -seatac airport -sa im -ro hl -rigon deaux -rec tification -re mu -r tos -r ra -pur gat -pur ba -pug ilist -promotional products -pri e -poe tica -po tala -po sso -pejor ative -paragli ders -on broadway -oh dear -nn u -ner ina -mer ger -mede ski -me les -max illary -math works -mal har -lu uu -long shaw -llanid loes -liber dade -le vey -klo ster -kamal ha -kal si -junior contract -jom alon -impropri ety -il ondon -hur ontario -hen wood -har umi -gulfof mexico -guilty pleasure -girlsin tech -girl stalk -gau cho -franchis or -foxsports det -for mel -fit na -fairtrade fortnight -e ire -dreddy tennis -do oney -desh ler -del oris -cork screws -cop al -co zz -clo gher -cir ce -cindy capo -chlor ite -cal cot -brown live -bro fur -boy ssoccer -bel al -asse tto -ask with -angar cia -amal hotra -al faj -aja hn -aguas nash -ðŁĴľðŁĴľðŁĴľðŁĴľ ðŁĴľðŁĴľðŁĴľðŁĴľ -ðŁij¨ ðŁı» -yse ali -wwww www -varsity cup -under achieving -twitter friends -tri de -till ing -thep slt -the thing -the dead -t sy -str acism -stepby step -sprow ston -spor tiv -six ers -sie gal -sf ball -seraf in -q tc -proven cher -power lunch -plur alistic -play with -percol ating -oun tain -omin ion -obl ate -noo d -nizam abad -nit rite -nakat omi -n alo -me gu -marketing agency -lo ess -liph ook -len sculture -l lew -l cu -ku en -ki ppers -kalon ji -just cause -jessamyn duke -jat ya -icen ine -hydro meter -huuu ge -hard ly -gru l -google india -genealo gists -gam ache -fw ends -fresen ius -fil mi -esp inal -ep sb -enam eling -el ar -e ala -disc oloured -deri ded -derekcarr qb -deno ting -das sey -cru ce -cross over -c spc -bu hat -british monarchy -bo zar -bo bov -blu emotion -bar dock -bar ada -ban kni -aw wal -ash burnham -ans combe -am joy -agu stina -ag ould -aeschy lus -accident als -. "... -ðŁĺįðŁĺįðŁĺį # -ðŁĴĭ ðŁĴĦ -âĪł )_ -ঠķ -y talkies -wi shy -w gw -virgin active -vindic ate -vin ous -us ba -ting ting -tin aturner -the defenders -texashoo ps -tail less -sur ya -stray dogs -sto dgy -sr p -siguemeyte sigo -shu mba -sher rin -shah jahan -sarah geronimo -round wood -ro blin -reykjav ÃŃk -reinvigor ating -reic hardt -re work -re khta -pro stration -po ona -obase ki -nr can -ni os -ngu rah -nex tup -nepon set -my bestfriends -mon dad -min dedly -mikha il -mer k -med tech -me harry -luxu ria -loo by -lo phus -le ja -kyung soo -kel lar -kath thi -kab ul -jo sap -ja ars -illi um -hydro dynamics -hot n -hornet pride -hilde sheim -hi mig -gold medal -go sch -gl itz -gin us -ger ards -gare the -free wheelin -frank ton -foodpor rn -esc ap -end malaria -eag lets -dougie poynter -don ahoe -dol fin -die antwoord -denver outlaws -deniso hare -daw sonville -cph ftw -concur rence -co omes -cand ace -call an -braun ton -book stall -black forest -bil d -bike show -beaver brook -be fallen -at kin -arma gh -ai vo -ðŁĻĮ ðŁĺĤ -ðŁĴī ðŁĴīðŁĴī -ðŁĮ © -ëį° ìĿ´ -âļ ĺ -wil ight -whern side -vexillo logy -uni as -uin tah -tyr whitt -tu lipa -too sweet -ton glen -thisi si -stich ting -so horadio -sher way -shar rock -senti miento -sch rier -salem or -sal y -rich ten -ri bault -play throughs -pi pp -pet ko -p inga -or chester -now shera -nar re -mtn ng -mor iya -mis ophonia -megan follows -me ades -mcglo in -mayan sfx -make better -la plagne -kru mm -kas al -ka pok -jamesb valentine -israelicon flict -hu sain -housing day -he dera -hass all -gran holm -go air -geet anjali -fuvah mulah -flag man -fik ri -ex ley -enjo ining -endor fer -emo ir -diss ension -dismant les -deptof ed -cy bele -curl pro -chen na -ch rit -ca hoon -c ire -buffal ony -bou dica -bo ff -bla by -bill and -b isou -ast ound -art style -anti phon -air munro -ad of -abel ardo -aa di -! âĻ¥ï¸ı -ðŁĴ¿ ðŁĴ¿ -z enga -wu bb -wou l -world rowing -word books -west more -wee z -we belos -wayne coyne -vel outé -trans lu -the ki -the bible -th ale -telegraph travel -teal over -sopp ressata -snh strust -sk ola -sh ary -set lock -seg menting -rivieranay arit -rig ney -reg ner -refin es -realkevin nash -r q -quad rants -pra soon -per otti -one thing -oklahom acity -offthe beaten -nicol am -ne ara -mj m -magick al -macle od -long lines -lo licon -lew k -lali gaen -la foret -l jones -krist ofer -koe hn -kin ahan -keigh ley -kan ab -k pe -janef allon -is w -infinite warfare -individu alised -ic wa -i spor -hy patia -hy bels -ho cker -her dy -heim dall -hag ans -haare tz -gugu lethu -fri ggen -fore seen -for tino -fidd les -fel ina -endemol shine -en snared -ema snhstrust -duck pin -disability rights -dad agiri -cur wen -cosmopolit ans -ci pher -choc cy -cau li -calam ine -brim field -breaking the -bou man -boston cannons -boon sboro -black smiths -bistro s -bing u -bin ta -bel air -baru ah -b son -azira phale -axel sen -aviation history -aspen snowmass -am bat -allan mcnish -abstract artist -aboiti z -ðŁıĮï¸ı âĢįâĻĤï¸ı -ðŁıĪ ðŁĴĻ -ðŁĩµðŁĩ ¾ -å¿« ä¹IJ -ãģ ¿ -Ø « -Ê ķ -wärt sil -world musicday -who syour -v hd -utt ara -under garment -twit pod -tun de -town afc -tn cs -ti wary -ti pu -the hu -t fk -sy ariah -sweet leaf -swar m -stu tzman -stock land -stab at -sky ferreira -sinhal ese -sin opec -si eu -shu ey -shi ppy -sens go -s itti -rob stown -ren table -reli t -release day -red ol -pv hs -protect ing -pi pits -pe ton -patrick starrr -pam grier -p isode -on thel -official rufc -obli ges -o boro -no cona -niem and -mosi ah -mont vale -mo oned -me ir -mas ke -mara sigan -ma alik -lu gia -la weekly -la flamme -kin di -ken non -ke bun -kar ur -incre mentally -haz lett -hatsune miku -han dedness -ham pion -hack le -gy r -gu inee -gor rie -goldeng lobe -go sensgo -gnar ls -gh pl -g ines -fw end -forten berry -fo gelman -films bywomen -field turf -el tham -dwt sirl -drac aena -de maria -crime wave -creati vo -coun sell -com busted -cohe sity -coffe elove -chill is -ch ancy -candy crush -c ée -brighton seo -bor rel -bmw motor -bha vesh -ben splatt -be kal -atel ink -as pac -as ama -aren a -arab israeliconflict -anti fragile -andu in -an je -amand ashi -alliter acyday -ah and -adid asu -acu ña -ðŁĸĸ ðŁı¼ -ðŁĵĢ ðŁĵĢ -ðŁĴļ ðŁĴľ -ðŁIJ¼ ðŁIJ¼ -ðŁİī ðŁĴľ -æĪ ij -youth sports -yas sssss -wu i -willem se -whi tham -whakat ane -water aiduk -wash fellowship -vie v -u va -tor doff -thomas power -sxm thehighway -swap na -stren g -sk ot -siwon choi -sie gel -senator burr -sap utra -s bisd -ry ant -residente vil -renov ates -pre ssions -pre operative -po vey -pimlic orc -pedic abs -pedal ed -operation ally -nyc mayorsoffice -nd h -mu ty -mis cast -milan ello -meso sphere -mean whi -mcgu ffey -mar ois -lou vain -lo bed -learn german -lau dato -la story -koz lov -kate bosworth -ka eding -jol ted -jen ac -jare th -jaga dish -iy er -ingeni ously -in fier -hil mar -hawk stalk -h tn -gw ana -gu shi -grim ley -go terps -globu lin -ga via -frnd z -fran con -fli bs -fili ppa -fight the -fe sting -fan meeting -f sf -ezra klein -espad rilles -ell roy -dot te -don en -do yeon -dictator ships -diab olo -deli as -concre ting -coach tom -bo young -bo lex -blue tec -as st -are scue -ar rs -ar preps -aqu ÃŃ -apla za -ander as -alali brary -ajed rez -________ _______ -// < -ðŁĩ¯ ðŁĩ² -ãĤ º -yow amu -x th -wyn koop -wind surfers -whitworth art -whisky day -visit bristol -viking cruises -vic traffic -v rij -uw sp -un tangling -un ops -un ds -tv live -tu tee -tto win -thr illa -tb it -tardi grade -tar ring -t bex -spinning fields -sky deck -sitaram yechury -shoo touts -sali f -rod da -regurgit ated -ram ez -rabbin ical -picto graph -phil brick -om ake -ok hla -net tie -ne ster -nat gallery -nan terre -mum taz -monop rint -mo ggy -mn gr -mix nine -mari ek -malk mus -mal tz -lou den -lic hen -ks music -krat ts -ki ro -isthe problem -interfer on -ill enium -ig ate -hump backs -hot toys -hir si -hi rayama -hast ings -har pal -ha iz -ha islip -green chemistry -gre nou -glam cricket -ge thi -gar ita -flamen ca -film strip -f pg -f gn -ene ts -ely as -ejec ts -den de -dc policedept -dan diya -d scanning -d endi -cs music -craigh all -community college -castro tx -campbell river -cam eo -cal shot -bre slau -bor al -bla gdon -bike to -beat bama -ange bot -amjoy show -am hs -ali bre -aen gus -: £ --____ _- -ðŁĺIJðŁĺIJ ðŁĺIJ -ðŁIJ © -ÑĢоÑģÑģ иÑı -yucat án -vu h -vol tac -veg gi -tor ians -tho le -thing sabout -the paul -that sa -ter hune -tel p -ta war -sub type -stra iler -sto kley -stal y -son arika -smartcity expo -small ness -sm t -sk itter -sig am -shivam bu -she pley -set to -scouncil uk -run gs -rob illard -ric kert -repl y -re qs -raf san -r re -pur porting -pic acho -photo copies -pere go -pedi ment -pal anca -pak man -pag ination -on j -oda at -o denton -new roz -multi view -mtv u -mosh ood -manoj tiwar -maggi es -m ool -ludwig sburg -lique faction -leh man -kuy per -kar nazes -k see -juniper networks -james acaster -its bristolbaby -ise f -ine yards -in cel -huf worldwide -hss wi -hsin chu -heu ser -he tton -harmon isation -gry ffin -gr aco -goldsmith suol -gitt ens -ge ith -flood plains -fe en -exacerb ating -douche bags -do de -dill man -diamondand silk -de itch -cradle offilth -cor ti -carry themhome -bri mmer -bio bio -berry farm -bang sa -athlon sports -ap tac -ap athy -amit ra -ale quinox -agre ssive -accli mation -ðŁĴ¡ ðŁĴ¡ -ðŁİ¶ ðŁİ§ -ðŁ¥° âĿ¤ï¸ı -x ist -wood man -whe ads -well ston -wave front -vasi l -un solvable -ull mann -ug t -u gal -u arkansas -thejuan williams -swa deshi -st bl -south yorksbiz -so cc -sil v -si kk -service dogs -serafin owicz -semi ah -se mir -rou steing -puer tas -philly mayor -perio dismo -p daf -owen benjamin -okum ura -o esn -nutrac eutical -nu bians -ni pah -már quez -mur li -moon bow -moj ica -mine workers -midter melections -mene fee -melan son -mc tom -may sa -li ska -length ens -lady boss -l ro -kost ka -juke box -jones ville -in oki -howto trainyour -harmar superstar -hag akure -ha ch -guine afowl -greath ouse -glan z -gay don -game jobs -fu yu -fr ancy -fle dging -fl ours -femin azi -f xs -emma willis -ell ard -ei ht -du ed -dispro ved -dese greg -dat o -cr ater -citizen ship -burak deniz -brew ster -break away -bo wale -blake slee -bi gor -bel mullet -baloch genocide -ao ib -am enable -ali ando -ac ros -a shem -: , -( .) -ðŁĺį ðŁ¤¤ -ðŁı ¥ -â µ -zug spitze -xi xi -window sinsiders -wig town -weather watcher -wayfare rs -w re -vas ilis -vac ates -tiger up -ti mp -ther ocks -the challenge -te kk -taylor guitars -surrey life -sto ppin -ssc ricket -spo se -solution tree -semy on -re ber -ram co -pre tension -pre ike -port way -pig my -pen rhos -pe ci -par dub -packaging design -orch ha -nun c -nobuy uki -new fie -national champs -mo tability -mi global -mer ay -meet bros -medal en -me ki -makh ura -lur ve -london lgbtpride -letsgo dodgers -kle ys -key one -k vn -jig me -j rn -j mr -iphonex s -insom nisa -indooroo pilly -indeci pherable -i asc -houseof cubs -hoge styn -hei fetz -hare hills -ha fsa -greeng ate -gre ss -gir ma -gh earts -fl oria -exagger ates -ev re -ep festival -eliver ance -disco vers -dag ang -consequ ent -complex e -by ward -ban yan -ay un -attenti veness -arch viz -ar lette -apu blic -and ong -an ae -aldub maiden -ad it -actu alize -ac tis -aamir liaquat -ðŁĺį ðŁ¥° -ðŁħ° ðŁĨ -âľĶï¸ı âľĶï¸ıâľĶï¸ı -âķ ® -z de -wrong ness -wood chips -wal ke -vum chealth -ver kho -vape shop -van esa -vai ko -tra wick -tor ti -tobaccon ist -to pl -tim westwood -thousando aks -ther is -terrence j -technicol our -te gern -stru tter -strait jacket -spl center -shakey graves -sa stro -s ddc -run meb -ro setti -revel le -re shuffles -rash omon -ra baul -queen b -praise god -panor am -oin uma -oe ttinger -ny dia -nxt takeover -na sia -n roll -n nd -my best -morning show -ml td -mikey way -mass ena -lun ged -long live -litvin enko -law society -l hh -koe itec -ko dai -kick starts -ki gur -its been -ileague official -ide sai -ic ast -hel icon -hei sey -guest post -gor achelle -gorachelle ann -gine bra -gaw an -for der -flagell ation -five a -fin esse -epic cosmos -el ow -eight ball -dramati zed -donald duck -di dio -design milk -dar lene -curtin uni -cougar nation -convul sing -co sn -ceph alic -cav orting -cap el -ca isse -busc aglia -br ts -book storeday -baf a -ati ds -ar ling -appall ingly -agri busines -adu rai -á´ Ģ -world snakeday -wing y -warren sville -usav s -upp et -u sportsca -tru ll -toplo ader -thi z -the her -tas nim -su pts -soph more -sin ai -sil vas -se asia -sd oodle -sa ed -res or -pre seli -pr h -pope scu -pc sk -our schools -or du -op roud -oak ie -now www -new all -mov ingly -michael annett -mer amy -mahogany lox -lyn es -lin csc -li gety -lett ice -l vi -kha si -ken rick -kah ana -joanc rawford -jo achim -jab rill -itsad og -incarn ated -i fri -hy ong -heee ey -happine s -had denham -guer rier -geb hardt -funkand soul -franco phile -for lease -fing alcoco -esi ason -employee experience -eb ace -e miko -der as -d design -cu ms -cro whurst -co omer -cmb yn -chim bor -che min -chandi mal -car swithoutlimits -busines sperson -big ay -bat tic -au j -astor i -anne aling -anc ru -al g -ag ba -african us -a seem -:- )))) -à¹ĥ à¸Ī -Í ¡ -xi es -wit tig -wise guys -virgin iam -vir chakra -vel ux -ut ton -un guided -ubi q -u calgary -twy cross -twe at -tra van -tibetan buddhism -tem be -sthe series -ste ffy -serv pro -secul arists -sanctuary cities -roy an -ri ems -res ounds -raven scraig -rash guard -ranc ourt -raise d -qu ent -qu atu -punjab is -prize money -positi vely -pe ste -pba onespn -parmi gian -oy ale -over coats -ol abs -nca ab -musa fir -mm tc -mey rick -metal album -merry lands -mechan ization -me gh -mat eri -mad aba -macewan u -lu king -lu dden -liber ians -lem nos -langu ag -ku tti -klein man -keat ley -k de -jo j -jan se -irr ational -inf l -ie b -id in -ic et -i herb -hispanici ze -hij jah -hepat oc -head ship -hallo ck -hal lie -gur ps -gu fc -globe trotting -g sv -fur mint -fugli en -fit food -femmin ile -f cra -ers rock -dwind les -dv g -dos gaming -dimension ality -denti st -dee g -de mont -dar yle -corne as -contain ership -cent um -cas os -can ción -campe se -bul ski -brockle bank -biz nasty -beat son -bas le -bal derson -b my -as g -ann ua -aeter na -ab senti -ðŁĺĦ ðŁĺĤ -ðŁĺ© ðŁĻĮ -ðŁıIJ ðŁıIJ -ðŁĮ·ðŁĮ· ðŁĮ· -ê·¸ë ŀ -ÙĬ Ùħ -y news -xx oo -whirli gig -web star -waynetwp super -wat teau -twitter mirror -tre esof -tigo bba -tame side -sub junctive -stru dwick -ssi mon -ss aturday -sla b -sigh thound -sie gen -sey more -semin aries -seem s -samurai jack -sam ma -s sudan -s ros -rohit roy -rail cats -pose able -popp leton -pas cack -pan handles -oo se -nice guy -negre te -n ssn -n ough -ma kak -lo thians -live underpar -la kiss -la ha -kon ner -kochad aii -ko sinski -jeremy mckinnon -j bonamassa -iv ins -hue vember -houri hane -hop f -hok itika -ho xie -hide out -hee bie -he cla -hamlet fc -hal kidiki -fre de -fm kenya -flori das -fat cat -dulwich hamletfc -dri skell -drac aen -dou bs -demir tas -dem socialists -dc tid -creative scots -conserv ator -co ko -co by -clay born -castell ani -cas sa -car fag -ca elum -black monday -billy bob -ber ndt -ber mingham -bed was -bally shannon -au ba -ascen so -ar mel -amaz i -........ # -åIJ § -âĶ ĵ -âĢįâĻ Ĥ -ze th -ys lam -wool shed -wol fal -wal shy -w gt -voi vod -vie ux -vic ini -veri sign -vare jao -valu er -un cas -ty nes -town line -tiktik tik -tidd ly -the villain -tallapoo sa -t lax -sydne yo -stein berger -star base -spider sona -sp ini -snit ches -shapp y -se kt -sc ag -sasi kumar -samanth a -roe hampton -robust ly -referen dums -re invested -ra ghe -r á -quin livan -pul ford -proven zano -pras lin -portsmouth nh -plo rers -play more -plas monic -pil ar -peter sagal -pang an -pae onia -osor no -orel lana -on repeat -og maco -nz vaus -now den -notinthis lifetime -neil sen -nathan varni -mo sta -mam usic -mal wa -l jp -l chat -kun di -kare ga -kan ald -jo swinson -ji rou -jar k -ja ig -ite k -inter costal -indi stin -incogn ita -incivil ity -hydro codone -hocu spocus -ho pin -ha sen -go jordan -go figure -gm fus -gl unch -gi unta -gepp etto -gang ly -ga hara -enamel pin -en gro -egg less -ec ru -ea sements -durham nc -dun sfold -down range -double bass -da day -cy on -cra ine -cover story -conson ants -coach jim -co quet -clu bo -cliff central -citym all -chair persons -cav our -carls bad -canvas ser -can dia -cab elo -ca ille -brun elleschi -bore scope -bear ing -ba sile -b cra -ati q -arch s -aber crom -ðŁĴĹ ðŁĴļ -ðŁĴģ ðŁı¾ -ç ¶ -е д -zi yad -zah le -wr angles -woooo ow -wit old -westend live -von age -v fp -un toward -ulti max -tre lli -tie gs -the difference -tera hertz -tallas see -tah qu -sten ation -spe tt -song jihyo -si ong -sask power -sadi sts -ruffin o -rooster s -rom puy -rogow sky -read vocates -ra dom -quin ney -queenof scots -print ings -prayfor southkorea -pen coed -pei poli -pad den -open cv -o ab -noar lunga -nihal ani -nect ars -mu dras -milan esa -mient us -mev lana -mazdar aceway -mat tock -marquin hos -marine inst -ma uli -ma ja -llll llll -j rr -inte mper -indiab ulls -ind travel -in service -im melt -holy day -hardik patel -hack ley -green hithe -gan ic -formula ic -fin domme -figu eras -father andson -f ww -end ricks -ear ing -duvvadajag annad -du bbin -dru ms -din ary -dick heads -daf fs -craig kielburger -cra ik -chi hay -cas inor -can an -c gpa -bristo lold -bj u -bi ben -bear ance -bay nton -bag ge -ay la -as afa -are ena -ane ka -am zing -allen and -alam gir -af ound -a egyp -ðŁİĤ # -ðŁĮ¸ ðŁĮ· -ëĦ ¤ -à¹ģล ะ -wer ke -wehr lein -we igl -v anny -ush mm -tr illed -timeto shine -the worst -texas forever -ta vor -t ads -swoo pes -sumb ar -stor row -spol icy -so ontario -sme uk -sm l -sheskindahot musicvideo -sanjay azad -sa am -roz as -rock androll -ric kon -restric tor -respect for -quart ile -pul o -pu sey -pr on -pope franci -pon ts -paro died -o shea -nr genergy -nov um -no words -my m -musco vado -mom ir -mn or -min omonsters -mi zo -lucifer season -llan os -leishmani asis -lat u -lacri mosa -kk box -kid brooke -kan es -justicele agu -jung min -ji eun -jennifer nettles -jan ah -itur be -is foreveryone -inge cho -im t -hy am -horse back -hol dover -hocke ssin -gold leaf -girl strip -galle ons -fs midwest -fie vel -femini zed -fe herty -equ idad -el stern -eat the -durham cricket -dragon fruit -dima io -did st -destabil ise -de ok -dat al -dardan elle -coach able -cere bellar -byom kesh -bu bi -bro cket -bra instem -bin tulu -bin dass -bi asa -be vs -bas ah -ba hau -ba arba -asian et -ash na -ag rand -ðŁĽ £ -ðŁĻĮ âĿ¤ -ðŁĮ Ĺ -æĴ® å½ -âĻ¡ ) -âĺº . -woocraft scs -wino grand -what t -wed s -wd ney -watt bike -was sa -vit ational -v mr -us ko -un varnished -tu que -tsu chiya -tr ama -total war -tidal x -thanksgivingwith blackfamilies -ten ge -teacher scollege -switche shop -sul phu -stre lit -stil inski -st bri -sse airtricity -south hams -sour ness -sky i -sj e -shu ma -shail endra -shab elle -semi automatic -schlad ming -sc use -sc dp -sagu aros -sa ami -ror attack -robert marawa -ro tr -ro em -releg ate -redondo beach -purple army -pu tsch -pro pos -pro lapse -prized raw -pre disposed -pol unin -pay scale -pau w -pad locked -otta wab -opp as -never getsold -n cre -more fun -michal ak -meramy akrishnan -medi aboy -mb ira -maul s -malayalam review -love wildlife -lordof the -lidiab asti -la shawn -kumbakon am -keep americagreat -kann o -kamal hassan -ist h -indigen ously -iac occa -hoo pinsider -home field -holiday spirit -holi es -hershey pa -heim an -ha kun -gonz aga -gon tier -go cat -gay dos -gab in -fy rom -fe verything -endo carditis -en ita -e ev -dog mas -dis rael -da via -d ún -d mt -cá diz -cow gill -cl news -cheru bim -canoe ist -by fuglien -by doing -bu sed -brux ism -blazer nation -bio scope -bad girl -avi ds -assu age -ar ouses -apost olate -andre ward -an ura -alvaromor ata -ðŁļ ĸ -ÙĨ ÛģÛĮÚº -z ool -yep live -y ke -wunder lich -wow app -viol inists -ul haq -the resident -the age -tfl s -team cap -te yes -te bo -te alight -tau n -swa ine -suf croot -sufcroot shall -sto ken -spraw ls -spra ining -sof apaka -shots fired -semb awang -sel ft -scienti fique -sch wabe -sar nies -sap er -salv atore -read indie -ra at -preike stolen -popo va -pin ney -opar di -omgom gomg -old paths -ne ese -mo jokerto -mein ers -ma inst -lil as -li hue -legisl ated -le mmons -ld nairamb -laudat osi -lanca sters -lan thi -kontak te -knit ter -ki vi -khaleej times -kha war -ju árez -joe the -jason r -is sy -i fru -humber stone -ho tta -hi jas -han kin -hallam shire -guine y -gopo lov -gom oo -gom an -gamer oom -fords theatre -f gd -ex os -er melo -er f -dy ad -dol gopolov -dic er -deser ves -dep to -den huys -deduc ting -day es -dani yal -d tz -convul sions -cil acap -ci ri -check mark -ch aba -carter reynolds -bruce wayne -book mark -boo kexpo -bla ue -ballybo fey -b ma -ar shi -am yn -am vca -ag race -actualit é -# ) -!!! ??? -ðŁĺį ðŁĺĦ -ðŁijij ðŁIJĿ -ðŁıĥ ðŁı»âĢįâĻĤï¸ı -ðŁį´ âĿ¤ðŁijįðŁijį -ð٤ijð٤ij ð٤ij -à« Ģ -zy x -yah shua -wsu cougfb -wolf hounds -winniem andela -white gold -wa key -video juegos -ve sti -uni leiden -tx grizzled -ts ne -the hope -the chief -than ky -th ral -tau riel -t flofficial -super sprint -su ro -sja day -si rc -shra ger -sha hn -sh lita -san ita -sali eri -s gairshow -s bb -roll pride -richarde grant -reagan rays -raza q -ra fal -qui etude -pu long -priorit isation -popp en -pit stops -pin dar -penhali gon -pe acoat -parthi v -pa ean -our country -ouar zaz -opp ur -ni um -mul roy -monterey bay -mod bus -missamy childs -mephistop heles -me gang -me dulla -mag ent -lit aford -lidiabasti anich -les age -land guard -labra da -ku tt -kodo txgrizzled -ko tatsu -ko bby -joy ceme -jac ana -ite asy -initi ations -in this -ili ani -hé lène -hur tt -hur ns -hi bari -habi bie -ha fod -h fb -gran ata -goat man -go vardhan -glac é -gi de -gal vatron -fu ster -fl out -eric wareheim -duvvadajagannad ham -do ggg -devon seron -der bez -de anc -d wain -cut the -con sensys -communic ado -chal kidiki -ch appa -c za -bot olph -barthele my -ban jar -atta wapiskat -at tax -ar vs -and rena -aman si -allo fus -agar ajan -ad ms -ðŁĴ² ðŁĴ² -ðŁİī ! -ðŁĮ Ĥ -zim bardo -z ev -yot tawa -yahoo live -xander berkeley -wo de -visi oned -u og -twir led -turbo fan -timeto fly -thun dered -thearcan agame -the fire -the bb -te et -ta wh -swee tums -sun danese -sp lish -snake pit -sidd arth -shot by -shop lift -sheamo isture -shar mel -sam bu -saint msg -ro dge -resolu te -ren to -recal cit -que eni -qu ili -q am -putin rf -prun ty -pla stica -pla gue -park lane -oligon ucle -o ingo -ne ch -nab awi -my nba -muse umm -ms ds -mihaj lovic -maxi mu -max chilton -mari ote -march esi -mam ey -lal bagh -kov ski -kj ell -kendal calling -just icec -ju re -jamaic ap -jab oo -ist p -isi o -invest ing -hypo xic -hyou ka -hay hurst -happy newyears -ham madi -gur inder -grin ded -giam bi -gi be -er mah -en yi -en ie -du charme -dis locate -desic cant -dat l -dam ping -da inese -connor army -coachdan mullen -clause witz -cel li -boat right -ble wett -bit ar -birk beck -belitt led -backin black -ay yyyyy -avanti ka -arin ze -aparthe idweek -animal crossing -an berra -allison b -al vida -ail leurs -acec ourse -ab org -aal to -æĻ º -ãĤ¢ ãĥ« -à¸Ħภ§ -à ® -yon hap -wrong doings -william and -west cork -warwick castle -w vc -vi rendra -univ groningen -union ization -under reported -to pd -tiger air -tic o -thing sin -team effort -sydney trains -supple ment -stru an -straf ford -steal in -stalag mites -smoke stacks -sic ure -scatter gories -sc avo -say z -sanjayazad sln -sand more -sag rad -raw kus -ra hel -ra ds -pro fe -pe cor -pal meri -oo ohh -nu aimi -nar vik -n alls -n afc -miz ell -miro ir -minniem ouse -michal ski -mer credi -menstru ationmatters -mctom inay -mcfar land -marine science -mar ston -luci enne -le mm -l ss -l ome -kimso hyun -ke ur -k uper -joon as -jerus ale -j ti -ishi gaki -intere st -ina itis -he si -hau ssmann -go choctaws -gi ese -folk rock -flour noy -fau t -every thin -ever day -eup en -ent endres -el ke -ec ancer -du ker -doppelgän gers -dial up -designated survivor -dela et -darkest dungeon -cogni zance -cityof hamilton -cecili o -cabo chons -ca ed -braz illian -bol ler -boboi boy -bishop scourt -bet ta -ber nama -be beto -b xb -avis itor -aro ad -ak un -ag lecam -af oods -ade ep -ache ampong -aash ish ---- >>> -*: ãĥ»ãĤļ -ðŁĩ¨ðŁĩ¦ . -ðŁ¤£ðŁ¤£ðŁ¤£ðŁ¤£ ðŁ¤£ðŁ¤£ðŁ¤£ðŁ¤£ -è ´ -zeet amil -yu ne -wri f -wil ner -whatson antv -war te -vander pumprules -us jn -tr tworld -ting gal -thisi sthelife -sy yc -superblue bloodmoon -sundar pichai -stereophon ic -sql pass -sl so -sis fur -she erin -sharon vanetten -sha adi -sarwat valim -sal al -s walk -ruth men -quiztimemor ning -quit te -pucke red -pre menstrual -post cards -porsch enewsroom -po wel -pin oys -party with -offthe grid -o wain -o esophageal -nu minous -national tequiladay -national filmawards -na stro -my vancouver -mo sport -mas vidal -mar zi -mano el -mal oy -m chi -lock en -lil nas -lang side -key pads -kas u -kam asi -jar ia -jan owicz -ink off -ib mi -hr vy -hierogly ph -guide to -green line -graphi que -grandtheft auto -gor ney -gomoo sego -god rich -go hogs -gan ley -gab en -futuren hs -fare share -el swick -ebr pd -dy scal -dro vers -don kor -domin ions -dilla hunt -dc ps -day trader -cÅĵ ur -cowli shaw -con ed -c zu -bryan bros -brumbies rugby -bleed orange -berwick shire -ay ev -atl ant -at é -at rack -astra khan -ard al -am able -aless andria -agri ppa -ade kun -ad ak -abag nale -" ): -ðŁĶ¥ ðŁĴª -ðŁĵŀ : -è° · -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ı@ -zu zana -zo zo -z idan -wy ld -willi ger -wil ms -wheel wright -vol tas -uni das -ty d -twee die -tra ub -tol ar -tiber i -thim bles -thelauren graham -thel one -thatsmy dodge -than ga -tan ey -syl ph -sty x -stan ne -ss bm -sou to -so han -sig erson -shimabu kuro -sh kov -sco smetics -schne iders -ram bler -r vw -pul ly -protein world -pran av -polari ze -phil co -p mg -p ami -op re -op an -of peace -ny senate -nou mea -north co -nac elle -na shi -mygov india -mumb led -mother sbaugh -masa ko -ma thes -m wy -m dg -loi shua -lee jonghyun -knick stape -juli ere -jose fine -jan sch -jamesra hendry -j ng -it amar -i beacon -hot dog -hoo e -hi mal -hert zog -hel plines -hand stands -gr annis -global ised -gab ardine -g weru -fred ricks -fo t -eye hate -ev cen -en eco -en dian -eli ason -electroly tic -el puig -eidol on -ed dings -drin kal -dre ric -dar vin -dani al -dan ser -clutter buck -ci k -che eta -cele br -board masters -bo bol -bi ao -ber te -back britishfarming -baby gift -at tie -ar drey -ann aw -all indiab -aj r -. ðŁİī -ðŁĮ Ĺ -íķĺ ìĿ´ -yan bu -yadv ashem -will acy -ward ley -vine et -ve eder -v tt -usafric abf -tx educhat -traffic crash -todd whitaker -ti dur -thr oneof -thisi shome -taylor momsen -t sports -t jackson -swiss re -surviv ability -sul is -sublux ation -stagn ated -sno g -sk telecom -size well -ship builder -sharks za -sam sam -saint patricksday -sacchar ine -rye ong -runner bliss -rose bay -roger stv -ran x -quoti dian -qip co -pub crawl -produc tiv -pri vee -pre y -pram ila -pra bu -past ner -own voices -oliviach ow -official rezz -nil am -night bird -mo tter -mo tet -mith ril -me guro -mc niven -mau g -mar gy -man music -lou bet -lion sclub -lar ock -l bb -ko caeli -kitt i -kid slit -khamoshi yan -ker messe -kac zynski -jane ane -imogen heap -hol douts -hel oise -gu ria -goka iger -goal mouth -glamour maguk -flower photography -fire station -fern tree -fam es -extracur ricul -eve leigh -electro plating -dup date -dun bar -dubl inohio -do i -dia stolic -den ham -da ang -cthul hu -co don -clean tech -ca haya -c ses -bu ma -bread and -bing crosby -ber ridge -base plate -ball erin -bal fron -asseen in -ashley monroe -aq r -anil kumble -am dry -alo es -allmy children -alad in -adam richman -aap ka -ðŁĻĮðŁĻĮ ðŁĻĮðŁĻĮðŁĻĮ -è© ± -å ¢ -ãĥ¢ ãĥĩ -zo ya -you then -yor kies -y ster -woj cik -while youwere -wel cher -weight lessness -web marketing -wake fulness -vibe magazine -ventrilo quism -utt aran -ur on -transpor ter -tho pe -the ken -the junglebook -th awk -terab ithia -tb in -super storm -stru ly -stellenbosch uni -squ ote -spor um -shon telle -shad rack -servici os -schisto somiasis -sch rade -sau to -reci ation -re discovers -pul leys -plat en -pensac ola -pencil sketch -pah lawan -osucoach meyer -opp er -o eh -mullagh more -mis behaviour -mil dest -mall in -madmax furyroad -mabino gi -loko ja -lic enti -l ru -kkkon colors -ker fuffle -kar thika -joseph us -ith appen -institution alization -ingate stone -iffe rent -idol producer -he iss -happy valley -ham at -h sas -geton mylevel -g cap -ful k -free to -foie gras -fly pal -fc stpauli -end yk -ehl inger -dub v -dou that -doc week -din din -die hard -die bold -di sharmony -dhan raj -deco ders -danny pudi -da ik -collar oy -clean beauty -cin zia -children sla -car share -ca che -busines speople -bt as -br kfst -bor ris -blick ling -bill inge -bell port -be sta -bau com -az c -ar sons -ap ak -anim ism -angkor wat -ang pilipino -ang am -andi ka -albu mart -ðŁĺİ ðŁijĬ -ðŁĮ ĸ -ðŁ¤ª ðŁ¤ªðŁ¤ª -ìĹIJ íĶĦ -京 éĥ -ت Ùħ -á r -yani v -wind jammer -wil ayat -week uk -us movie -un recognised -tu cuman -toi mumbai -til ford -thom asians -the ys -the forum -tetra hedron -tat weets -sunny slope -sub stratum -su bba -stubhu bcenter -stro mal -strengthen er -star ched -sri jit -sig fox -shrew sweb -show boating -scry pt -sag af -rox anna -ri ft -re ju -puertor ican -ps lon -pro meth -pin ball -pend se -pat tim -outw ards -ol atun -of ir -obl ation -nu ku -ner fed -naughty america -n ä -mw ana -mv rp -miss this -merchandis ers -mascar ol -magen ta -m sha -lu sted -lou ps -life crisis -ley endecker -levan ter -les miz -le tha -le brock -lc bern -lcbern alo -l icia -ke ko -justin baldoni -ju sco -joe bob -jeff coat -intere ss -inter bike -im no -id hu -hh d -hetero sexuals -hesit ancy -head way -guillo che -go wa -gag genau -free app -fon z -file system -fe stin -f mw -eu st -escal ope -equal sfreedom -enjoy illinois -ef fin -du sen -dro pin -drew ry -dis order -destabili zation -de sain -daysuntil qatar -daily quotes -custome rengagement -cic cio -buder im -book con -bay h -ax im -att enders -ak su -ak chod -aim es -aero gel -! ðŁİĤ -ðŁİī ðŁĴĸ -ðŁ¤· ðŁı¾âĢįâĻĤï¸ı -ìķĦìĿ´ ëĵ¤ -구구 ëĭ¨ -á´ ľ -z are -wurz els -wsu pullman -wing sof -whyi march -wan de -vill an -un reality -tru sh -trop med -treasure hunt -the thing -the acc -tetra zzini -ter ris -team titleist -tac eae -ta here -synchron izing -swoo plife -strand bookstore -steril ised -steel yard -star set -st sci -spy master -spring forward -sp ils -soulful house -social responsibility -sme ar -siss ons -sid grauman -sibb ald -shin wari -rsv ps -rough guides -roh tang -riems dyk -resin ous -rehabil itative -regurgit ate -regal movies -rainbow laces -ra ffel -pur fleet -princess diana -power systems -post menopausal -pope ye -pere grin -pan isse -pall bearer -ober land -ob st -new biggin -music scene -mun oz -morning ton -mish ere -metho dist -mel ani -make som -mac iel -m laden -lux ton -lmm fao -lie big -leeu w -ko hen -kad hi -jovan ovic -john piper -jeppe sen -it ak -io ve -in dre -huang shan -hans zimmer -han afi -hagg ai -ha rel -gri mmy -gra us -give th -gen ove -ge saffel -gar n -functional medicine -fri ede -framer ate -fo yers -felipe melo -fault line -faul ted -encryp ting -eby zio -devel ope -deser ting -deni alism -den si -deep dream -dan the -dag ny -cyno sure -cherry ville -char line -cancer bats -bur un -bram lett -boroon dara -booth by -ber gg -ban ken -bal int -ayo shi -attune ment -ar lfc -ant witter -annas ophia -acry lamide -abc de -aas l -[ ðŁĵ·] -ðŁĵ± # -èĭ±èª ŀ -zy gote -ze ts -yed chat -ye sler -yay ay -w sk -vaudre uil -vaness amerrell -v magazine -usch o -up gradation -turt len -ton ly -thir deye -team english -te very -syco ph -stri ped -staf fan -smo cks -sketch book -shu ker -sch nur -rob bert -ro ft -reve rently -refr acting -recer tified -ra yer -py romania -pix i -pente cost -parod ying -pan ka -omidy ar -offici albull -officialbull srl -no kian -myas thenia -mur g -mu stre -miti gates -minne ola -mend onca -mem ling -mc george -mb en -marke aton -le ches -laur inaitis -la ak -kol lar -kirk ley -ki xx -kelly ville -iwan rheon -institu ting -im brettdalton -hy pom -home studio -gn awed -forum nyc -fli ghted -flec ks -fl anger -fab four -edu ar -durham college -dom mett -digni dad -digital singlemarket -cultiv ators -cu zz -crewd son -creative review -cole brook -cl é -cel la -ce to -cas ares -capacit ance -bru ton -bla sco -bla sberg -big show -berg son -bel don -bblo fficial -bacteriopha ge -aqu id -anti pasti -amp oules -ag ym -afl crow -adden brooke -> "@ -ðŁĶµ âļª -åħ¥èį · -ت س -zal man -y une -xi bal -wood brook -wo burn -web isodes -war g -v dub -unci ations -twilight sparkle -troll tunga -tele sur -sy ston -studi es -stro mer -stral sund -stpat sfc -stand o -soviet union -snow falls -sle iman -slan ting -sixword story -sh oneys -sarcast ic -ruba diri -road nats -regi o -ray u -promo tocross -prati que -po prock -pear man -pe go -paul pierce -param oun -p nh -ou as -oli mar -odel rosario -ob ay -o san -nauti yal -mo ze -mau ch -m ssa -love songs -les que -lanca strian -kun ai -key t -kar amel -k ne -jonah ray -jo t -jim al -j kd -info graphie -if only -iden hout -huub design -humb lest -high boy -gul liver -gros mont -golds berry -go tr -girl probz -fro thing -fri en -floss moor -fal tered -explo sively -exemp ts -ex itos -es en -erin dale -enr anta -elstern wick -eleven se -elec tor -dig deep -de brah -david muir -dav alos -d cn -cow ens -confe ss -con traflow -chittor garh -chiro po -chima era -cer veris -cani bus -cal gon -cabare t -brandre th -bicker staff -ball i -bac cano -ati fs -atel ateshow -at resia -assn chat -anglo gold -andalu z -an kari -amdry zen -amadeus itgroup -alv ador -accred iting -ðŁı ® -ãĤ¿ ãĤ¤ -âľ ĵ -à¹ĥ à¸Ļ -ار ÛĮ -¥ o -yo wie -yan et -world wi -wigg ler -war lingham -w iry -vande mataram -vaish navi -urva shira -uch us -tour ne -toot sies -thess aly -the kenny -tgi fridays -tail piece -symbo list -suppor tin -sub sp -sp ons -sim kins -shar mon -sf wa -sar apascoe -s march -rev ans -reid hoffman -psy c -poison ings -phospholi pid -pain lessly -pa zzi -oto ño -orl pride -om il -oc cam -nur kic -ns dc -ni mue -ne ith -nah ant -mon ito -mom ina -mmb ht -missjess wright -minchin hampton -metro park -me trix -mau ra -mar ras -mani ax -mand uka -loin cloth -liber tas -lessi smore -lacer ations -kl are -kingofthe monsters -k rock -j lr -j jab -iti zens -in scribe -house martins -hesit ates -haydock races -hay makers -gra ils -glas vegas -gha uri -g pe -fran sen -for tomorrow -fle che -f nl -es war -encamp ments -ekstra klasa -eco logic -dor rance -dom ici -devi ent -cund all -collie buddz -co sin -circul ars -christian bale -cell therapy -carnau ba -capri les -cai ley -buff ington -boo dles -bo pe -biz rt -bir on -big dataanalytics -bey az -be hera -bal ne -arnau lt -apprehen sions -ani ela -ak kians -agh y -aa i -! ðŁį» -ðŁĻĮðŁı» ðŁĻĮðŁı» -ðŁij©âĢį ðŁĶ¬ -ðŁı ĭ -о ÑģÑĤ -youn gen -x one -willo spre -willospre ay -wil da -weareall harry -wahi awa -vel á -var una -van helsing -union chapel -un bound -tr ach -thread gill -the sharksza -the fish -ten chu -tellu ride -taver ner -tand ridge -ta ren -t los -t ente -stur key -steve case -sru thi -spiritu als -so lex -silver mine -sch wager -sarfar aza -redcros scanada -ra sch -py i -pru ri -pro lo -pepp ering -penguin awarenessday -ostraci zed -of ia -occupy dc -nh on -na sta -n cic -mo ty -mid america -michelrou xjr -mh ra -mam tay -maha shivaratri -madison beer -m zuzu -lul ling -lore t -lof africa -line as -ler on -lennox lewis -kri z -kle z -kh ancats -k outa -jurassicworld fallenkingdom -j rp -iv ka -iter ary -is lah -ino ids -imp ong -id wal -hoch uli -he intz -har ford -hae jin -h medabad -geith ner -gat ers -gam bled -fox hill -five star -emerson barrett -ell ena -ek ins -dj quik -confla gration -commu tative -cinemain my -ches ney -chen once -cer vez -celo sia -cas is -butt resses -birthday present -back down -as phal -ang aa -ambro ise -amandashi res -alpha phi -adam antly -! ðŁIJ¾ -ðŁĩ©ðŁĩ °: -ا٠Ĥ -â tre -zlat ko -you ville -yach tsman -y ic -xan the -whizz ing -whisen hunt -when they -wap ato -vicuni wgtn -ure sh -tul se -theo logically -theav club -swoo pe -swee tromance -star musicph -socialmedi atips -sk ul -sic b -shan aya -sequ entially -sekar ang -secretary meity -sat ana -santi bernardez -sa hay -s vic -rt j -rout t -rot j -ro ge -por lock -pis atower -pin kel -pel ota -pau se -outdoor photomag -on time -old trafford -o ore -no isier -national watermelonday -nan ai -movie twit -motor plex -mor wen -mon ceau -mom mys -milli metres -mat ina -magic man -mag tang -ly cam -love eeeee -llan do -little mermaid -lang ga -keith haring -katy b -joaquin castrotx -jo casta -jacqueline fernandez -jackson ms -j bj -istandwith ahmed -ir reverence -in shorts -hy er -hv n -huic hol -grizz nation -gra vy -gg v -gesaffel stein -fren chi -fir ings -f de -ent wine -elimin ation -ed gley -ec dc -dra gger -do sto -dis illusion -dal in -da we -cul zean -cro ats -contra bass -con ex -cap rica -bur zum -bridg ton -bri ant -brau tigan -bou bou -beau soleil -be ate -bat th -bag ong -awh hh -as ae -andy bell -amphi bia -amaz ov -alfie boe -ðŁįĬ ðŁįĬ -à´ ķ -ø ya -wu or -wonder bra -well com -wc zyk -w elive -ver ba -uniteand conquer -uni oslo -tz comics -travel india -trad cat -tra kai -to hru -tik kun -the girls -the far -tele play -team unity -te mora -taraw era -tan field -swachhbharat mission -sw aging -st ecker -ss ave -spine farm -sne yd -sn sh -sk atal -scu zz -sch lock -sb swinner -sa ale -rural crime -river dale -rel pool -ra jut -pre selection -pantal eo -nun zio -neutr alizes -nav otas -na jah -mu de -mtn l -moun a -mon agas -mind the -michaele aston -lu cus -lol lo -lo ftheday -lee h -le ta -laun dries -l losa -ktn lifeandstyle -kro k -kp fa -ko tigobba -kkw beauty -kappa sigma -iti ate -ing us -ice prince -hu mic -haywar dgallery -ha good -gre sham -gran town -goo die -glaz ersout -general news -gen gar -gell ert -flying dog -fire bird -far ri -fa hm -ey en -er hard -epile p -emo tor -dev araj -dev akshi -de colonize -couch base -coil over -cine mam -chiz uru -cellu litis -calom baris -bu fo -bre it -bill rancic -awa g -assemb lages -archam bault -ak ola -agne se -ach ines -ðŁĺľ âĿ¤ï¸ı -ðŁĵ¸ - -Ñĩ аÑģ -zet land -yel ps -wak en -vel den -vall ée -us lims -uni kent -tizi ana -thisi sco -them icky -theat ro -the frank -tam inas -ss am -sk now -sh aki -sed atives -sal ai -s rush -robin thicke -re organise -re nova -raz avi -rambo donkeykong -r anny -que ene -quag ga -power pc -po sie -peyton manning -pal frey -ori k -ok tib -o dess -nipa win -neutr alise -my cin -mesti zo -maz andaran -man ston -mamtay patnaik -lun da -lady ship -ko hi -ko chan -kav y -ka hane -jud kins -joo won -jak bar -ja si -inn keepers -in ness -hi vos -hal k -hackath ons -gue strooms -gu mmo -gas light -gal en -g bbf -future day -frick ley -flipk art -fi ef -fcgo aofficial -es fahan -edge fest -ed policy -eccle sall -earth moving -din da -diero ten -darby shire -dam os -credit score -col u -cic le -che main -bul o -bul lett -bron zy -bio m -beta wi -ben icia -bellamy young -bb bots -ball ons -baarba arde -at na -ar bury -ant age -anit adon -am cu -allu du -abil ty -ab ach -?! ?!! -ðŁijī ðŁı¾ -âĸł âĸł -âģ£âģ£ âģ£âģ£ -á´ ´ -z inho -yasi elpuig -wolfs bane -wma onedirection -wand sworth -video drome -vas ool -union square -un compromised -un adilla -uconn mbb -to shin -thatgame company -th air -tal dÃŃ -sugar land -star tv -st cuth -spi ra -spe zial -small hd -sho reline -se dm -sa dek -ross ella -ros aparks -regen bogen -president kovind -pre ico -polit icos -par ds -pa wh -oregon state -oppre sses -old pic -of fe -nu u -nr c -nic d -nay ak -monop oli -mill and -metro land -men il -mcpar land -mckend ry -matthew j -masi si -mar ge -mal acan -macmillan coffeemorning -ma thai -lü beck -lifeok tv -lie bling -le gio -laspal mas -kle mmer -ker st -kar ki -ju bal -john b -jenny packham -j ü -j oux -iv w -inti mate -incant ations -humph ry -hu mored -hu ggers -hagg adah -gra do -goo dre -fin min -ewe cisme -el ady -du tra -down south -dog spotting -dish water -cust is -cou peville -coono or -constan cio -coccy x -cam ira -bron zing -bran dish -borg warner -bom berg -blue mont -blue friday -big ness -be mine -bbvacom pass -baf tac -ash can -and care -altr arunning -allindiab akchod -acar ter -. )" -ðŁĶ ĵ -ðŁĮ¤ ï¸ı -ìĿ ¸ë -yvon near -yehrish taky -war randy -vive andalucia -ver ulam -valent ini -vale ting -ur be -tragically hip -tr ouncing -to tara -that ss -thali domide -ter ol -te ki -tam m -sto c -sti jn -sp rees -sou maya -sm oment -sloven e -science ctr -rob itu -robitu ssin -ritu ximab -ris borough -rein ert -rames waram -qui ero -quebec ers -pe ca -p ach -or man -onward lu -online gaming -old skool -no worries -my son -mor itz -mo li -mir zap -manojtiwar imp -mah out -le von -laps ley -krist tps -kor f -kom mer -kno ch -kan aya -kab u -jin ho -ist itu -invari ant -ineffec tual -indy indians -i bex -hon aker -high lin -hes burgh -hear tedness -h winkler -h fr -go dd -foo kin -ey ards -engli shri -en sayo -disin i -deser tisland -deb it -de camped -cumb res -courteney cox -cos kie -cordi ale -consul tancies -church goers -cf z -centr alize -cap as -canthelp falling -cam mell -bi vens -bbc berkshire -bb u -barnab y -ban te -av ore -astro samantha -asf andyar -arti an -army navy -apo phis -amund son -alcor con -ain tv -african fashion -afl tiger -ab oud -a this -# ? -ðŁĺİ ðŁĻĮ -ðŁĺĤ ðŁIJ¶ -ðŁĮ Ķ -ì¹ ĺ -è ĥ -ز ÙĬ -writ ting -wakeup call -wainf leet -verizon fios -undu latus -tro ad -theme park -taylor swif -tat um -t che -sy am -swo boda -sw bts -steel ers -so se -sm le -sk icks -side as -schie hallion -sar copen -sam hsa -ri ev -repaire rs -rat zenberger -raise droyal -quent intar -qual ys -pu stu -proscen ium -pressu rec -pj bowles -pang ako -pa peete -oãĦ ¥o -op ment -olo f -ok ur -nwalest weetsuk -no xu -ncl b -montju ic -milli kan -mikkeller beer -men tof -mass eria -marsh on -mar aton -male gaon -mahan adi -lyo to -lot ti -litu ation -life form -lee hi -leak ages -ku lu -knight pride -ke dron -jun it -julian clary -jud son -instig ators -hu gu -hot wife -hope college -home work -he ge -hc ska -gur dji -gargan ey -g tbicycles -firesi de -fides z -farn ham -eu ijin -erec ts -emb olden -em enike -dou dna -don di -disfru tando -dho far -dev dutt -dd orp -dani ka -cy bill -cson ka -corn dog -concer ned -chee ta -cc fest -c jb -by am -bux us -bre anne -brad don -bossi er -blue water -barre iro -b politics -auburn tigers -arden ne -ar ven -app ened -am om -aivo arm -/ /# -ðŁĴĭðŁĴĭ ðŁĴĭðŁĴĭ -ðŁij©âĢį âĿ¤ï¸ıâĢį -ðŁ¤¦ ðŁı¼âĢįâĻĢï¸ı -çĿ Ģ -ãģ ® -w sav -vegas weather -upanish ads -uniof brighton -under handed -un j -too wong -tath agata -sympathi zes -sudan massacre -stop tober -ste yn -sol or -shi moga -shark science -sen ya -sen rehmanmalik -sch wi -saqib saleem -sad ams -s vil -romp in -risk on -repri sed -rele m -re possession -re buil -rapi des -r ri -pir ouettes -oxic lean -open ai -older people -oaken shield -now icki -note pads -north fleet -nor ville -nawalel zoghbi -n mireland -mott ola -mind scape -min ter -milit ari -men kes -lympho cytes -lsuf ball -lesar cs -kow ens -kh ir -keaton stromberg -ke tsu -ke ay -jar ano -istandwith israel -iron i -iceprince zamani -ice field -hil ma -hammer sley -gay athri -gabrielle doug -g leave -fu ssell -fro mc -free ebook -f sh -exofan art -epi thet -ei dos -discipline equalsfreedom -democratshate america -defence day -curt smith -ctc mediaboy -crew men -con on -colorado live -ci arab -chem society -car rero -bur rough -boo ke -bobro ss -bj w -benedic ta -beat nuts -be ed -bank ston -bad gering -art trail -apo stol -anky losing -angel ov -an heuser -alfaj iri -agn ello -abim bola -aa ve -? ¿? -.. ?" -ðŁĺ³ ðŁĺ± -ðŁij° ðŁı» -ðŁIJ§ ðŁIJ§ -ðŁĮ¶ @ -à¹Ĥ à¸Ń -zak ariya -yu yu -ys r -ye dder -x pt -wich man -wcc w -vr la -tr ès -tom kaulitz -theceltic manor -tam baram -sun way -sp j -skatal ites -shak o -sean an -s oooooooooo -ro sca -q un -punjabi rooh -peru vian -peri vale -pe ameal -pap on -pa quito -one towatch -nic ols -nh lers -national tacoday -nate berkus -my sjaday -modern life -mis kat -mar mol -manzan ar -mahi dol -london birds -liz mcclarnon -kochadaii yaan -king swear -kin ta -kar y -jami em -j crossover -it smi -islam ujeres -instra gram -hems well -healthye ats -hav licek -haile mariam -ha itham -h kust -gun an -gul man -grze gorz -grena dian -grav ell -gli ac -glam ori -gentri fying -g illa -forge din -for theride -fe thul -f ttp -ez ri -explo rec -epilepsy awareness -ekkle sia -drexel univ -doni phan -don nee -do onan -digis coping -de sau -daisy ridley -da j -culture days -cul ley -compreh ended -cho g -chic hay -cel les -ce devita -ca ver -bun ited -bun cee -br ice -benne teau -ben sley -bb k -bal dur -aw aka -arri ola -ap ko -ane ela -andrew schulz -allahu akbar -!! ~ -çĮ « -âĺº / -youtube spac -your quote -yn l -yag nik -xeno gears -x mm -where of -u vas -u cn -txh sfb -tw ila -trum ple -ter res -tempor ally -tani sha -sten cil -stand withrand -sque aler -sla vs -si pi -ser vic -sel ah -sebasti andan -sebastiandan zig -se tya -schu ur -ryan vaughan -russ ert -ru sk -ro derick -raven symone -rac is -r bs -provoc atively -phor aone -pet ted -part time -outh florida -ob ong -nic orette -next chapter -naraco orte -my burgh -musc ling -mur ine -movie tv -mirac leman -mi b -mcpart land -martin j -mart one -mal aka -makar ska -lu kman -louise redknapp -lor ong -livel iness -ld pe -lach lan -kud zi -khar an -jo bbing -jas par -hog town -heriotwat tuni -hazle hurst -h ca -grosse st -gn oni -el niño -ek afka -e ja -du guay -dr atch -dirt car -del val -deathwish inc -de coupled -co hl -chen yuk -cha eng -bri slington -blood sugar -bezu idenhout -ball rooms -bal ak -at cc -as kins -ap mc -alphon stourism -alham dullilah -al don -akiz aka -ak ville -agu ez -ad ae -ac inemas -a hahahahahaha -ðŁĺĬ ðŁijı -îIJ ķ -ãĤ»ãĥ¼ãĥ©ãĥ¼ãĥł ãĥ¼ãĥ³ -ãĢij ãĢIJ -âŀĸâŀĸ âŀĸ -ภ¨ -zi yech -zi bah -yogate acher -yi pee -wärtsil ä -would you -wo za -weather field -wa edu -v ith -transduc ers -the silent -tait ung -sylvan as -spic inemas -sne e -sky dive -sbswinner shour -sad ashi -robin tunney -ren yc -re vul -ramire z -quit aine -queen rania -qu har -pro era -pro creation -pop tart -plo tt -p agu -ono dera -nursing school -ne men -natalie grant -na gh -mun ising -mu lino -mit so -mind fully -mc griddles -mc feely -mart lesham -mac ou -m spaint -lun cheon -lovel orn -lin ky -lat tices -laf ite -kashmir bleeds -joesp ub -jenni woww -j era -isur ppo -ine aux -in nately -ig ley -heisman trophy -hanni gram -hamble n -grac ec -geo science -gend ron -g pc -fu d -form alized -fiendish ly -fall game -evry one -et yuk -enye ama -discol our -detroit tigers -custo des -commerci alizing -clau rak -chel i -cer am -cap ability -cam ier -bra sen -bio process -beauty queen -bb claurak -bargh outi -bal amory -av ra -ar hi -ano dyne -afri kaner -a sexuality -é ns -win elife -white friars -wan z -wall ner -w enty -victori aday -v ris -ur ania -under achiever -ultr atech -twer ton -turk cell -tro th -tne du -ti ote -taminas nuka -tab ilis -sy rin -sum pah -streetfighter v -stone arena -star cross -sma shin -ske ws -seren ata -scrutin izing -sand tats -ro cc -ric ca -ri kara -reviv alists -rannvijay singha -r bm -portu mna -por s -phin sup -pen ni -out shot -oju kwu -no hotch -no cs -niz wa -n cla -my lor -music notes -motor craft -mon chele -mit am -mission possible -metaph oric -masi yiwa -manfro muncle -mackin ac -longboard stuff -len ox -le blond -le ask -lap kus -ku fuor -ku ai -knuckle heads -kis wahili -jim mer -jessica simpson -jar ama -j day -hlat ahai -hell scape -health fdn -haus mann -hacksaw ridge -h enty -gurdji eff -gentle woman -geno typing -game trailers -gal vin -freak azoid -fi ware -fcc ps -fashion trends -f anni -esp r -elo ves -early voting -ds q -drain pipe -di fy -daniel platzman -cott man -co tuit -canal plus -butterfly fish -bot elho -blackgirl nerds -bi man -betsy devo -best meow -bbc wiltshire -avan am -aspi red -ar yeh -ap mso -aor aki -andreab ocelli -anah ita -ake hlatahai -ai weiwei -agra bah -ag ada -affili atelink -ðŁ¤ ½ -å Ĥ -ãĤŃ ãĥª -ม à¸ŀ -Ø´ Ûģ -zan ussi -ys avage -y anna -wf sullivan -weare messi -wdy tya -wat usi -visit rwanda -vanilla ice -u rious -turtle beach -tu eindhoven -trique tra -tri duum -tipsfor new -thetommy dreamer -tema gami -svi zzera -suppo sing -step well -ste gall -sound box -socon sports -sho whouse -sh urt -sel fridge -sche els -rob be -ren derman -re ff -ray field -rasp bian -pu u -pressuri sed -pran it -piggy backing -par vo -pai stenation -one es -nivin pauly -nau voo -n ti -n sh -my calvins -mkt gnation -min ns -mi af -meg apolis -madawas ka -ma irie -lit mag -le them -kier ra -key akizaka -ke ila -kayak fishing -kar gentina -jä rvi -jeff mauro -jacoby shaddix -j itter -ish ta -in case -homos assa -hitch in -hi as -hat tie -gh n -ful well -foun dress -for newindia -entoura ge -embar goed -em era -ely sian -egg sy -ed wyn -e mina -dv all -disintegr ates -din na -dg classics -del toid -ded man -davi dicke -dar am -danc zuk -cur to -cro i -critic schoiceawards -cour onne -confu cian -ci ba -chi oma -cent in -camel bak -cac o -c ni -by bike -bi ii -auburn u -aru z -arro whead -ar ace -angar dens -alle gre -aaaa ay -ðŁĺĦ ðŁİī -ð٤ĶðŁ¤Ķ ð٤ĶðŁ¤Ķ -ëĮĢ íľĺ -âļł âļł -âĻ¥ âĺĢâĻ¥ -аР¼ -zo sa -yy ates -youtu betv -young jeezy -you the -yo shimi -y iss -xseed games -wel che -vis y -vermin tide -ty outh -tro on -tou sa -toa sties -to bu -the forks -tap low -tab ular -sur ma -stanley cup -sta o -sprezz atura -spit toon -so bra -sk ane -shou rie -shoebury ness -shal lower -send help -scrutin ise -sanctuary asia -rsac onference -retic ent -red nose -re marketing -ragg amuffin -proudof you -pres age -pot ters -phe be -pescat ore -paradise papers -orient alis -oo die -non no -nin na -musi ka -mother lode -mire les -minu it -mi des -mf h -merri on -mediev alist -masterpie cepbs -marie mont -maki as -lu ssier -little girl -li des -lan than -krispy kre -kle infeld -kiyom izu -kah in -iy ad -it awamba -iso cial -in patients -ime che -ig li -hol bert -ho ty -hi jama -hi iiii -heresi es -head hunting -hand sof -hag strom -gre z -geck o -fur tive -free scale -fre ey -fei ffer -fal le -f dle -ever man -euro bike -eti ology -et canada -ep son -engle field -el ook -din gos -cul hane -cro fting -cour tier -community spirit -co fer -christ fic -chim er -canar sie -camp day -cali bers -c gw -bu mbu -boer boel -bir nam -bi enne -bern heim -beau sejour -b appi -azi kiwe -avoce ts -as mode -arch diocesan -anu bhav -ak ri -aha fo -agar ci -ad os -acar los -ac em -# [ -ðŁį» ðŁįº -âŀĸâŀĸâŀĸâŀĸâŀĸâŀĸâŀĸâŀĸ âŀĸâŀĸâŀĸâŀĸ -yoga inspiration -x z -wer sching -visual ised -visitu ganda -victori aave -ve sel -un troubled -ump teenth -u acc -trolley bus -transp ire -tradcat knight -tr indade -the moon -td bank -tai sho -stro bo -stra ka -st g -southern stars -so quel -sky scape -shi ina -shar jeel -sha ped -sent i -sam csmusic -s loo -rumin ations -rt ve -rol f -ro ding -ric ke -rhi zom -revolution ist -recogn itions -real pigfarming -rble ipzig -r tb -pyro lysis -pv z -pre pubescent -power puff -pic hler -pd w -parti t -paralle lism -pam an -ob eng -nwm waypolice -no watch -no guera -nicole byer -ncb wa -nam it -mu res -mot son -mik ro -mi dy -mersey travel -man den -lee hom -kvo awx -kun try -kul am -kingsme adow -ki ang -ker ala -jus reign -j asons -is chae -imper atives -ij at -iced coffee -huck le -homecoo ked -his ss -herald leader -glend enning -gey sir -gener ator -gar bi -gal chenyuk -ga thon -flori dian -fel ker -f tb -estre ll -er rington -end ine -elli avram -ec khar -duchessof sussex -dry cleaning -dire tta -del tab -death stranding -de gnan -dan as -dalla sschools -ctb b -constra ining -coin drop -chic ho -cfl s -catson twitter -carol decker -care quality -call sthe -c cre -bubble uk -bre c -bin ondo -bel inelli -basel itz -baal bek -ast ars -apach ekafka -ann woll -allo yed -ale sha -ack ay -abhay deol -.... :) -ðŁĴĻ ðŁIJ¾ -ðŁĴķ ) -ðŁĮ ĩ -åĴ ² -à° ° -ö calan -ziller tal -zaid hamid -z dar -yu kie -win kelman -william zabka -wei qi -van ç -val let -u tau -twitch retweets -travel awards -trans dayof -tiru pathi -tan felix -t seva -suzu miya -stormb re -stormb lood -sto h -stan thorpe -sp ang -sou lar -snow blind -sira gusa -sign boards -shir at -she said -seic aday -sd lplive -scher r -sapp eal -russ y -rol leston -rod inger -rik ke -re gin -re enter -r nh -r ari -r allo -pon oka -politic snation -ober to -obam a -noxu bee -new scenter -near sighted -nai vely -mis leads -micro blog -manbear pig -ma dia -lo kal -legion ary -lawrence town -kir sti -kalam unda -jic ha -jh us -jennab ush -inciner ate -immuno therapies -hi ff -he wwo -har twood -hage man -gre ce -goo fy -glack ens -gin ghs -geelong addy -games don -fren sham -et ce -ent rain -em elianenko -eastern ghouta -dream ing -cosm in -com ence -clough jordan -cho zen -chicken foot -certi fies -cambridge analytica -brook house -bow sher -billyray cyrus -barrac lough -au han -ard ingen -ap ron -ann am -anj ir -anim alier -amer chemsociety -al gar -ah la -aff ney -adore delano -adam ferrara -about you -a eta -! ðŁ¤© -« à¸Ļ -with holds -wis fb -visitt ampabay -vermon ter -twit z -tw ays -turn bc -ttur tles -tt t -troy ave -tro ya -tom delonge -thestar kenya -thereal daytime -than et -te mberg -son orous -sok onews -sobot ka -sla sher -sf as -service women -sent sov -roar lions -ro dos -rith vik -reef ers -re zone -re tread -re gev -ranch itti -prin cel -pr j -porcel ain -peop lenow -pent ine -pe conic -oun try -open door -o town -nusrat chirps -nsw waratahs -nom ex -music tech -mo ville -mir tz -mh ingis -mass o -maris cal -man ero -magand ang -mac mahon -ma ah -lt museum -lolo lolololol -lin dow -le pa -lappe enranta -lanc elo -ko bi -kin ne -katy turnbc -ka inan -k yser -jessic ad -jer se -ix s -immun ity -hye sung -hut chin -hu tu -hel imed -hay ati -har n -gir paten -ged don -fro ot -en antio -e strange -diver ge -dis membering -dha hran -desk og -de wdney -cre gg -cor ry -conceiv ably -commonwealth sec -coal inga -cinde rella -chi pp -champag nes -cal man -c shs -burge s -bre don -bran ly -bombay sunshine -bli xen -blanch flower -ben cy -bal da -b ated -ax um -auchin leck -ar cing -appare ls -apho bic -aor us -antic om -annies land -am wa -al labout -actor dougjones -a high -ðŁĻĭ ðŁı½ -ðŁĺĬ ðŁijį -âĻ¥ï¸ıâĻ¥ï¸ı âĻ¥ï¸ıâĻ¥ï¸ı -ઠĤ -whi ppets -western cape -wazz u -wate rer -vigil antism -ven go -vasude van -vap elyfe -v lf -usp icious -unionchapel uk -un quiet -tre forest -tothe future -the train -tain ment -su raksha -snit zel -shaku hachi -sam pan -safe t -s frs -rh in -resc ape -recor dist -quarri ed -pom pa -pol tava -photo chromic -philippine star -pan niers -p fo -op ole -only the -omor phs -om id -o valle -not ill -not arized -ni ku -ne wi -nbad league -nas ag -n ju -mor ire -mohawk college -mo reco -max ims -man awa -madal ena -mad hur -ma pple -m jj -m cap -leather goods -kry pto -kou ign -koo yong -kil cullen -ke aly -kc ca -kal impong -ju el -john no -ittake savillage -iti k -it stime -ing res -ic and -ho tei -hen rich -hato ful -guerri eri -golf chat -golden hobiday -g crf -fronten acs -flor ina -ers dorf -emanci pator -do dos -dn rr -dal hart -courtau ld -counterfe iters -cle v -cendr illon -ce ano -cade te -butler mbb -bru hhh -bla kley -bi valves -bas cule -bal lista -b wal -army team -apprehen ding -antho logy -ala jones -ai ha -" = -ðŁĺ¬ ðŁĺĤ -ðŁĩ²ðŁĩ ° -îģ ĸ -ãĥ¼ ãĤ¢ -âģ© ) -ÑĩаÑģ Ñĭ -zen as -ys man -yer ry -wy lambrewery -whib ley -wey land -wawa see -wah ls -w valderrama -vt beer -traxx as -themicky dolenz -the weekend -te mas -swing ing -style guide -stop es -spotthe shuttle -sn stuff -sm ilo -shaw in -scrutin ised -screw tape -schom berg -sch or -sav anna -sa hel -s derot -rin ce -rene auberjonois -rei mann -raj endran -r nd -pru e -pre sta -pis ci -peli gro -p ct -ou sts -oriz aba -open water -onto pp -noise makers -no kian -national ised -moon stones -mil one -middles boro -mi sic -mar ve -manis calco -man alive -machiavelli an -lo blolly -likefor likes -lambeau field -la blab -kn aus -kasabian hq -jo vana -isthis reallife -ini ki -hel ig -hae user -gre yer -ga ethje -for bearance -fly high -fit show -fin ley -f ng -ex ito -eith ne -dul ly -dul cet -dracaen awines -doo fen -do dder -digital spy -devin der -desi ree -dejavu love -def min -cy hi -cigar illo -chun soft -chitec t -chir lane -bur bank -bo ite -blue print -blaze pizza -bir doftheday -bendel acreme -ba ÅŁ -az navour -ay inde -asian food -as aad -archa ea -anton yms -ang ham -an ett -aldub dejavulove -absor bable -a dism -) ). -ç ® -Î ¸ -é tienne -z akes -ys g -you uuuuuu -yor n -ye eun -xi umin -xen osaga -william son -wheat stone -wex po -wdy wt -wall street -wa aaa -vo tel -tric orn -tof ed -the angel -swa thed -sulph ur -stormb rian -south kensington -sout doors -segui mos -science and -school safety -sb last -saty endar -satyendar jain -sar al -ruru madrid -ru lez -rev jjackson -rei der -re packaging -r music -quentintar antino -pu lak -pop con -pati dar -pam ore -pakv sa -paddle fish -om nis -ohiostate hoops -of all -oakland raiders -nu on -normal ising -nin an -ni az -new life -naac pi -muzz les -mu min -mo pani -miy ano -minim ised -me ji -mccly mont -mar illa -lu gg -lou dand -lleg ar -lets dance -lar aine -la sports -kon ami -kel kar -kan sa -kal ym -isle ta -islamic finance -intra operative -hope solo -hog ans -ho ic -hi z -henry rollins -hell bender -gur bani -gun ga -geis inger -garban zo -free bobiwine -fo ci -fen se -evo te -eucaly pt -er yn -er skin -el makias -de standaard -croy als -cow slip -commer ical -citadel le -chri sley -chihay af -castle milk -car drona -cap ron -broad stone -bri anger -behind bars -aur on -ath saust -anjan aom -anae mic -ambu shes -*____ * -ðŁĺĺ ðŁĺī -ðŁĴĭ ðŁĺį -ม า -wi ba -vyach eslav -vel ha -usl pro -tre go -the ating -team sideline -sun yani -summer ton -social business -sloven ia -shim za -roosen daal -ro gal -rivalry week -repet itively -redbul lair -re investing -re engineering -ragn bone -radio graph -radio day -racer back -pon ferrada -pic ta -philadelphia eagles -per les -pent ameter -pan tie -ou ttv -ok leg -ok at -oil seeds -noi seymusic -no ths -nieder sachsen -negli gee -nau seated -n mh -musk ox -mukun dan -mud larking -monu mentally -monte sano -mis cavi -mind bender -mi ele -mel en -mc fe -manmohan singh -make lele -m tor -lilnas x -li etz -lanthi mos -keem star -kan aa -k ander -jimmy barnes -intre sting -high point -helpin gothers -heart ly -guj rati -gu rashi -gi zzi -ga elle -frontpage stoday -fra y -fool hardy -foo ts -fly withus -fi ume -fathersday gifts -fabi ani -ek berg -dz ong -dram ani -digital diplomacy -del ite -community matters -channel seed -cbc p -bus boy -boru ssi -bo band -blogger bees -beam line -balla gh -balbo apark -aw adhi -as ntm -adv a -] â̦ -( + -æĹ ħ -áµ ĩ -á´ µ -Õ ¡ -zig go -z ta -womenin history -what ttt -web server -vla ardingen -ve eck -upper classman -uni sphere -tu zla -tu aran -trul lo -tor me -the sky -th kapoor -team bc -tam ago -stin do -ster mann -stan wick -spee dier -sol tan -sn are -siddhan thkapoor -se kai -sd news -sche ffer -scan avino -sansk riti -rud beckia -ru fa -ro barts -radiof ree -ra zing -pur wak -psychop harmac -pre recorded -pou illy -plat formers -per ino -parok ya -park stone -park jimin -param aribo -p nut -oxid ase -not today -next step -new week -na tha -mit ri -mi ha -mer lino -mehrang arh -mari ama -ma sab -m ative -laur in -lam kin -kor yo -kor sakov -kor bin -kem pe -kei go -keep texas -ka aya -jennabush hager -jangh yuk -individu alistic -il sen -il a -hor lick -hongkong protests -hill ery -happy dussehra -gur us -god hra -gli m -gle aners -geor gen -gav ilan -fre ars -for bade -flo es -fidd ly -empir ically -el iti -ea stri -disp assion -dindi gul -denni stoun -deer skin -cru ller -che sson -c gu -bora hansgrohe -bir gitta -bel ur -bel leau -be moaning -b cy -algin ate -al ae -ab elli -; ') -ðŁĴ¯ðŁĴ¯ ðŁĴ¯ðŁĴ¯ -ðŁijĢ @ -ðŁĮ ° -îģ Ĺ -âĸ ¼ -ุ à¹ī -É Ľ -wroble wski -women fashion -wimp ykid -whiteri bbonday -weizen bock -ve i -tru ee -ton ers -thepc clondon -te ed -tas is -stadi umau -spotify playlist -sper ms -sken worthy -sk omo -simple ment -sikor ski -sig nore -she tty -sch ur -sch eller -sara hin -sa stra -river cats -real cider -re ily -protestan tism -po conom -phetch aburi -per ia -pac t -or tal -o bras -new lin -ne hal -nar inder -mv choops -moc tane -mo cker -melodi festivalen -med alla -me lek -mcken zi -marcell in -lu pines -lo pped -leed scity -la ibach -kitak its -karan ja -johnjay college -jo or -ja key -international mountainday -iclass ical -hype m -hy sics -hash browns -guy brush -guay nabo -fuk rey -frit illaries -fran ki -flight path -feil ding -fav o -exotic cars -early morning -dive sting -dave east -cé dric -cul ham -cobra kai -che pauk -ce ti -cat aldo -canon bury -cake boss -by as -burtonalbion fc -brit a -bit rate -beh nke -be vins -be falls -be bel -b pm -atom os -at boshoff -ap helion -an tequera -an sin -ah il -agameof tones -afel lows -ab atic -ab aad -a weee -// â̦ -. ðŁĺĮ -ðŁ¦ ¸ -world govsummit -wo ss -with ou -wil fully -van ja -un addressed -turnit up -troglody te -touch of -tor ney -therealmike epps -thegreat outdoors -the h -te ven -tan dem -syrian children -sub system -street outlaws -strat agem -stop trump -stigmati ze -stephen marley -squaw king -sport scenter -sin namon -shar ry -sen jeffmerkley -screen prints -sch elle -sap ariba -rou ghead -roo tless -rivers of -ri sco -rhy olite -re integrate -radham ohan -quin nell -purple bricks -prod ded -power slave -phi er -paralym pians -pa ther -ou an -orke stra -nudi branchs -national chocolateday -nar la -mu ta -mo q -mili aromagna -mile sluna -meren da -manipul atives -magento imagine -lor al -lin dahl -ligh ten -life as -lhot se -lgb ti -leaf cutter -ky let -ku tu -kn u -kiel ty -kex press -jer m -jak ku -inter locked -hone sty -hi yori -hau ff -goknight sgo -go kwan -fore foot -figh ters -el lement -ei du -ed icion -e ita -degen kolb -de cried -d old -costel loe -cher n -chaud hari -chang won -chancell ery -cameron diaz -cam illu -by t -blu to -blackgirl scode -bi den -ben nis -ax ess -artemchig vin -ari q -anti semites -annen berg -amir ul -ami don -af ine -ad hd -action on -ðŁĴģ ðŁı½âĢįâĻĢï¸ı -ðĿϤ ðĿĻ -⼠ħ -âĹ Ķ -âĢ¢âĢ¢ âĢ¢âĢ¢ -x inc -well ings -we ga -vas arja -val ero -v lan -usa ha -twitch online -tu ille -transpo sed -topp dogg -tele casted -tatt le -tar ang -swind ling -sum mum -subha dra -stran millis -sof italy -so can -sil kair -si eving -shiro gane -sep timi -s vidler -ru bra -ro tonda -re men -rapid deal -py thian -public transit -prostatec tomy -pmp st -pav lyu -pathfinder rpg -p nca -or dsall -op fun -nau l -nau er -moto gp -mossel bay -men en -mariote stino -mar to -mar git -mar con -madein india -liby ans -le we -lang ella -khi zr -kawhi leonard -justice reform -john sentamu -indi ag -iban ezofficial -iam up -hot fix -hor sfield -homestead er -hm treasury -hiro aki -harpsic hor -hal y -gw enda -guide posts -gt chat -gladi ator -gi gu -fan cher -f zs -ew t -emirate sair -ed mundo -dna day -dept ford -deep ender -de ichmann -dariof ranchitti -d mas -d mag -cul ross -crohnscolitis uk -controver tible -concentration camps -collegi al -cla rett -chill n -chihayaf uru -cher s -cheat day -chach ki -cast agna -car rico -car load -c ck -business forsale -bn ld -black girl -bay ona -ana res -amin ta -al tag -ak ilah -ab ic -ðŁĺĺ ) -ðŁĺIJ ðŁĺĤ -ðŁij©âĢį ðŁį³ -ðŁı ĺ -ðĿIJ İ -ê· ¼ -Î · -yaaaa as -vel tins -vag ner -un tu -un quote -ty er -tsu yoshi -tro va -trail blazer -tit illating -thin kin -theware xo -thes ats -the ca -termin ations -sudha kar -star ley -sr pg -sj h -shre ck -shameon you -shah ed -sar kari -s jo -ru sthall -rol lon -rish na -revealed rec -re distributed -pull down -pu po -pro col -police dogs -phra gm -phil ando -pesc ador -perki omen -paraÃŃ so -oke x -oc ell -north westerly -nohotch nowatch -new tons -net z -ne uland -monster products -ml is -mir jam -mine ol -make amovie -leic spolice -leci thin -leaf green -lare rtu -lad broke -knox rocks -kell yl -ka ghan -ir ac -hye jin -hidden gems -her in -he ati -h pv -gone girl -goldent icket -gil ts -g won -fr ampton -fe ig -fal la -f va -f peck -engel hardt -du mans -digital artwork -deri ving -deep rai -de activates -crum mock -cric k -cow bird -cor nes -co cu -ch ely -bun kie -bravo wwhl -bo canegra -bies mulders -berchtes gaden -be moan -bath spa -bar tered -au tz -amar go -ahrc press -af te -advi see -aas ld -. ðŁĺĴ -ç· ļ -âĢĵâĢĵâĢĵâĢĵ âĢĵâĢĵâĢĵâĢĵ -Ø´ رÛĮ -é tat -y anny -withdra wal -was san -warrandy te -w ason -un worn -un sent -u vi -tween ies -tw oc -time stamps -thankyou jesus -television acad -tele phonic -t line -sz ymon -super size -st davids -spo s -sonali bendre -slur ring -sku dai -signsyou re -short lists -sher d -shar meen -sens itisation -sen nen -se uro -sd w -s guy -ru ster -rou x -roc zen -ro eland -rimm ellondon -ray al -psych ometrics -po hang -peng elly -p wned -ospre ay -osc i -oo hl -o borne -ni dd -narrow band -mo ded -micro surgery -mentalhealth month -mb tc -m anderson -ljung berg -kla ar -kha as -just keep -ju beir -jr v -jami elaing -jam ena -itt ner -immun g -ic sid -ho pia -hipp y -he itz -flower friday -fi gg -fair ouz -ex trude -english bulldog -ene w -ellip ses -ech al -ds gn -divyan katri -discolour ation -cumbri an -cour y -col ma -clair sville -chi v -castro ville -cam hnews -cafe bar -c fra -bro ilers -bl inged -ba yo -az off -aki moto -ai jobs -ac bc -abu elita -@ @@ -) ,... -! âŃIJï¸ı -yo il -yaros lav -x vs -wolves races -who i -way nel -un cor -un ceremoniously -tu omas -top ten -tom perez -tom ales -to pos -tk ss -thesse hydro -tex ti -tan doh -tac tful -ta kako -sy st -superse de -super naturally -sun ga -sultan pur -stre aty -str ung -spread love -sp ul -soweto derby -sin itta -sin dustry -shah nawaz -save theday -sab ri -robinson cano -recycl ers -recu sal -razz ano -ratat at -rainf alls -railroad ers -r fruit -quin ine -puer co -pokemont cg -phoenix es -pha ed -per rins -pent acles -paynes ville -pan ja -pac ademy -orre ry -opfun kill -oni musha -on no -o att -neo tropical -ne vi -ne kop -n guni -moon cakes -moby dick -mo est -mi msy -mesni l -meh wish -mazz ei -materi alist -mar im -lumber kings -lost found -lion heart -ko aa -kevinand bean -ker shim -kay kay -joe strummer -inu it -inst anti -in communicado -icenine kills -hik mah -hal sparks -ha igh -h fg -gle ek -ge ducation -gar io -gan gof -g listen -g kids -finding nemo -fighter wing -femen il -fee q -fal ter -f nn -eye s -ever leigh -end gbv -elevense shour -ei sts -dima pur -dilip kpandey -deep tech -de haven -ctv kitchener -cri bbing -cra pp -cm ts -climate finance -cham bly -cgp grey -cd nimm -cc isd -cart ago -byu hoops -buu ut -boris kodjoe -bon dar -bl s -bi hh -benaz ir -bar son -bal dri -bal ado -assinibo ia -arch enemy -afloo ds -afgh ani -ab stra -a jol -ðŁĻıðŁĻı ðŁĻı -ðŁķº ðŁĴĥ -ðŁı Ļï¸ı -ðŁı Ļ -ëĭĿ 맨 -ãĤ·ãĥ ¥ -âĶĥ âĶĥ -ya str -y aboy -words withfriends -wo lowitz -wit kowski -wick en -w by -vogue williams -vil helm -victoriaave yard -ve u -v gn -urban ites -tv sports -torn illo -toi business -ticketmaster uk -thisisla bor -this be -the vegan -the pursuit -the edit -tam pon -tal ay -sword smen -su par -sta ab -ss ong -song books -sli gh -sli ding -sik sika -si um -sho igu -see doil -scre ative -schre yer -sahi wal -s ican -s dublin -ro pp -resu l -pur pura -pu du -power list -po zzo -pect ations -pat labor -on nie -om es -norse up -no place -my coskie -mu lan -mi asma -me sk -mar ui -mangesh kar -magh era -lyce umtheatre -ly ns -lud vig -la sk -ke ever -kalyp so -jeff gerstmann -israel mfa -in seong -ifwe date -i fra -ho way -harlequin books -har gett -grape vine -god backs -globe arts -gil dea -gat esville -games nostalgia -extingui shes -en um -dro gue -dep ted -denni spra -de valuing -curriculu ms -cur ta -corbin wwe -coo ber -conf ounds -cli mac -chrise u -chis eling -chi at -c frs -buy tolet -bu ssa -book ended -bethe sda -bear ss -baron corbinwwe -bar dwell -bam bo -au ton -ati erra -ark dg -amin aticsofc -ace us -:* :* -ðŁĮ¸ ðŁĮ¼ -ðŁĮ¸ @ -ìľ Ħ -zin c -york beer -x vx -wow wee -wm ms -wednesday morning -walter boro -unfor getable -tor che -tom kinson -toks vig -te airra -t sos -sub tweeting -st wm -spad den -sol na -shar bour -set the -salt box -s like -royalo ak -ro keby -river cottage -ri mouski -rep gh -rat dog -raj veer -r lg -q assem -pv lonabscbn -pv cs -pre zzies -pr riya -pose hn -plor ation -pit so -petroleu mmin -per rot -people over -pedestrian ised -path art -p afa -ox ana -ott tanak -osw al -on twitter -nol ito -niag ra -neo soul -naw af -nano crystals -movie history -lor os -loch side -larra bee -lang sung -kol len -khali fah -jewelry lovers -internet archive -iima hmedabad -highend audio -helens vale -hate week -han sson -ha ig -ha ad -ha ack -gula bi -gu skenworthy -going global -genetic ists -gam bang -food trip -en jo -eli b -elan valley -ec cl -dun nigan -dreamgirl hema -doctrin al -diy sos -destre han -del coronado -def s -death lok -da ia -cs rs -copi ah -col wick -coccin elle -cla ws -chelse alfc -ce tus -car keys -campbell claret -buydo texpress -bu ma -brig itta -bb clocal -battle ments -availab lenow -as os -artemchigvin tse -arm bureau -aqu is -anodi sed -ami um -alas dair -aho y -ab bado -ab ating -_ ~ -$ ' -ðŁĺĨ ) -Ø§Ø µ -za hi -wo reit -who a -wall enda -usc ellular -up es -under written -un dyed -u verse -tü rk -tu pdates -trumppro test -tra vers -tip sare -tha ip -ter mer -tam en -tag along -t ppa -syriacivil def -sun ghoon -slee pless -sle ssor -segreg ating -scot ney -sat lanta -sandra oh -sal vi -sakura jima -ross ell -rosen stiel -ro go -ran au -ra pan -qui era -psi onic -prometh azine -program ming -prakash an -potus geeks -portra itist -popefranci sph -pod sincolor -pin ni -ph f -pe mi -out strip -or ail -oktib beha -naacpi mage -mur amasa -mr nick -mot mot -mon aca -momo chi -miumi u -militar isation -mes ra -maximo park -matthe wl -mapre duce -lucian aberger -lost pets -lif ted -kul tura -kran ji -kle o -kil ic -jrl web -johna thon -jayawar dene -jammu kashmir -ir f -ipa day -hu hn -hil tz -hi go -gun by -gru ver -gou nod -go trojans -gn k -glen ys -ger asi -gamesdon equick -food co -fit c -fantasi afest -fan boost -exasper ation -ent ally -eleanor j -el te -east midlands -dun drod -diver sionary -dimp act -dev is -das raghubar -cur lin -cotte rell -com illas -clo ds -city view -cindy crawford -chew ton -chel seag -cen c -buxton brewery -bull nose -brig itte -bore k -black clover -ben do -bar ot -as mine -arne son -alternati va -allisonb janney -alberta ferretti -ala inde -al agna -agu ada -ag ay -ag ari -aberavon rfc -:) )))))) -ðŁij» ðŁİĥ -ðŁıį ï¸ı -ìĹijìĨ Į -z ea -your city -world fish -wild heart -wi kis -wc choops -water house -vu elo -vill i -vill amor -valent inos -val co -v kontakte -ux ury -tra ill -to shack -th ampi -tchotch ke -tat an -tal liance -tab ora -ta sha -stun de -sto you -stay true -short crust -se gers -se dar -sa je -ru iner -ros ch -root sy -ro des -rc stweets -rai ji -pre ading -pli o -play your -phon ology -peter hollens -pai hia -or ri -oker lund -occul tation -o dy -nadi az -n map -mon ten -mk d -mental ities -mar mon -mad hat -mac each -love mk -logi k -listen up -lets roll -ki pla -kath bum -ju gar -josh henderson -jose fa -jen nac -iron ical -ipad mini -internation alliteracyday -infier no -indie game -in expressible -ilovemy cat -homogene ity -ho ww -ham mon -gö ttingen -gross mann -gran ule -good acre -fron twoman -fowler pga -exclu siva -eco le -do dgson -despi erta -dent sply -defe rent -dam acy -coo tes -coffeewith acop -cm hr -chim my -cam on -c tot -bur nes -brahman andam -black spot -be witch -back stag -auto bant -anjanaom kashyap -ambas sade -ak ley -afl hawk -af ly -ac wa -aa ad -a jaz -ðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺį -ðŁĺ© . -ðŁĴ¡ # -ðŁĩºðŁĩ ¬ -ìļ° ë¦¬ -âĿ¤ï¸ı ðŁĸ¤ -âĿ¤âĿ¤âĿ¤âĿ¤ âĿ¤âĿ¤âĿ¤ -â̦ ." -à¸ĻภĦ -zoro astri -yu ma -yeon dan -ye ayyy -x me -x bet -wra ppings -wor dings -wen digo -weight man -way yyyy -vli eland -v ites -un tainted -ul lr -ton yi -tee total -tam alajones -stro y -star lights -space ibiza -soun de -soft skills -sob server -sne x -silver hawks -shropshire star -shout cast -sch lag -saf fire -s wn -rajeev khandelwal -quick draw -queens speech -pa que -overestim ating -old time -nu al -non lge -nio br -nigh tinthe -mos shart -matthew santoro -mass ad -marou lis -mammamiam usical -mam ma -makeup forever -m lauer -lu gging -lt frb -lost cats -logan air -la sser -kristi ann -kitt in -king arturo -kil gour -ke pri -kay es -jon bonjovi -jj cc -iss ler -isa itl -ilove the -ic alli -i dents -hof en -godsown country -goat skin -glenn howerton -glaci ation -gen asis -fortune cookie -fat ou -far be -faith and -fa reg -eyewitness news -engad ine -ee ve -e ung -e jb -dra isaitl -down to -dar ity -danny mcfly -dajj al -curi al -cure ttage -coo kin -consci ences -centuri on -calli han -bot nets -booksare mybag -bol dman -bod ø -bnld italia -bit burger -beg ley -beati fic -bay stars -bac laran -ash tons -ar pit -again stracism -ag li -adulter ation -ðŁĺİðŁĺİ ðŁĺİðŁĺİ -ðŁĶ¥ ðŁĻĮ -ðŁİī ðŁıĨ -ðŁĩ®ðŁĩ³ ðŁĩ®ðŁĩ³ -íĹ Ī -ìĭ ł -zab ala -yehrishtaky akehlatahai -yastr zemski -willem stad -vul fpeck -vol vos -var lamov -union station -tt olle -travis mcelroy -tra sporti -tra qu -ta kin -ta cho -sty ling -stress awarenessday -stop childabuse -stick land -stampe ding -spets naz -sol amente -soe toro -sne st -sky ways -si rio -sec tioning -scoo bies -sch achter -saha ba -roun dy -rose music -robert shaw -reverber ating -real j -probab ly -preci ado -pou pon -param aham -ouarzaz ate -opening day -nie buhr -nh sscot -ne ds -nan ometer -n atta -my club -mi way -me chag -lysi strata -liken esses -lear d -ko zi -ken sho -kelli her -kay bee -k lr -jon quil -ja veri -indira gandhi -implac able -ima bad -hill yer -herst mon -haun tings -harima u -hal tand -haku oki -gul barga -growth hub -glo ver -gil as -gi anyar -fort son -food facts -extru sions -est eves -ero les -en gr -en gender -effec tual -e zer -dieroten bullen -dho bi -dem ith -decapit ating -danko jones -dam ania -d te -cou sine -conserv atorium -co len -co biesmulders -ci offi -chin naswamy -cheri sh -charlie brown -caru anagalizia -car leigh -capit alistic -broc ke -bi aly -belcher town -be chet -bangkok post -back road -az ek -ann ae -al vor -aa q -< == -ðŁıĬ âĢįâĻĢï¸ı -í ij -åħ ī -âľĮï¸ı ðŁĺİ -à¹ģภĽ -zab ul -yay i -wit te -whone ed -whiskey myers -vigner on -ve do -vall on -us y -the move -tech week -tafa hl -stove pipe -stone masonry -stol tz -stern ly -stephan jenkins -slam dunk -skind red -sin tered -sanmarino gp -ru thy -ru ge -rind t -ren ouncing -re tton -re introduces -re assembling -re animation -pyg mies -push kin -pso as -prince william -preston sburg -pr wx -posi donia -pol at -pick meup -pay asam -park board -on w -on nn -ny ak -noo k -nic eties -ne vel -nati xis -n reid -murph twn -mon el -medi af -me gi -mayday parade -man que -lin ne -latin a -labyrin thine -kir it -ke hl -kaina atar -joyceme yer -jo vita -jo de -jeho vah -jason aaron -jar ratt -iso propyl -hu men -hir ata -hard fest -gw tweets -gun t -gru pos -gru it -gre ssive -gra bb -gon ia -golden voice -gi stics -gb doc -garda sil -future isnow -forsa king -fo sun -farm fresh -er zur -elizabeth taylor -e learning -dyffr yn -downtown la -dd b -dawg sontop -david chang -d bl -chuck berry -cat cafe -carab obo -can sa -camp and -c giar -brit tafahl -brae head -begin ning -bc s -atlan tean -as oke -ar network -ar ale -al meda -ag ray -af shan -ad ais -ace re -accordi onist -( -) -æ° Ĺ -ãĥķãĤ©ãĥŃ ãĥ¼ -âľĬ ðŁĴ¯ -ÙĦ Ùħ -woj tek -wi recard -white stown -white girl -vish wa -urum qi -ur ora -un ceasing -today news -to ils -thomas cook -test able -sub section -stav ro -sp ta -sound view -sof ties -ske ets -sk loof -shop style -shir anui -sharmel sheikh -sh yn -sett ing -sean patrick -sax mun -satt va -saras wathi -santor a -san angelo -saf ak -sa ji -sa ari -s done -rou ler -re assembly -ram ie -ra utela -ra bih -poquo son -per gi -penguin classics -pendi entes -over statement -outside thebox -ore stes -ofcaldub koto -obnoxi ously -nic ca -ne vel -nag er -n man -n korea -n kem -moth balls -mis understands -min ang -max thewanted -ma î -lu ki -lovel ine -lol jk -loath es -liti gants -lime crime -li spe -leonardo davinci -le uk -le coq -laur at -lat vians -ku sum -kin ard -kast ner -k plc -indiana univ -incentivi zing -ic ruise -hv dc -hin chin -happy veteransday -future bass -front men -fried l -finn hour -fin ck -every child -enders game -embal med -el wyn -ec us -ec astle -e qc -dexter ous -destiny schild -deck le -death inparadise -d ric -cv x -cul two -cine plex -chak wal -cem paka -carlo sm -bul man -bro iling -bi shopp -bay ridge -bay ram -bay ah -barrow lands -barra za -b ür -auck landers -ar notts -ap inv -anastasi ades -amy lee -al fre -acri mony -abujatwitter community -! *** -âļ½ ðŁıĨ -zoo pla -zib bet -youn us -wine studio -we bassembly -w enger -vi irs -vas an -vander voort -u az -tri ang -tram pa -topol ino -time keeper -tic ide -theal thy -ted dibiase -tal lia -ta tham -steve letarte -stenc illed -ss ri -sor guk -son er -sil ky -sc olo -sal il -sabo l -s stl -round hill -ricci ardi -reag ans -psylli um -pipe band -pi ques -pen nock -pand it -pachu co -outsmar ting -out numbering -oscill ate -oo om -officialo afc -objec tor -new space -ne way -national hand -mo ch -miscavi ge -mc millin -mavis staples -mat field -mal lets -mad z -mack le -maaa an -ley afc -lee ton -leaveno doubt -le llo -ko sten -kil learn -kid wai -jaga dish -it ss -ili ff -ib sa -hun nic -howtotrainyour dragon -hoo kah -haw khurst -gr ity -gopal akrishnan -go los -garden hire -fore tell -fore sta -fitt ler -em rick -eli en -eiz amusica -echever ia -eaton town -dushy ant -dee dee -de silva -day soff -dark star -cup cakeday -cu chi -cu caracha -cric buzz -craft fair -cove guardians -corne ille -comet landing -coiffe ur -cili p -chuck anut -christian music -cha b -bre on -brandon flowers -boxing day -book promo -bh ool -be fall -bat la -bag ani -back bench -am berg -affin ities -ðŁİ¾ðŁİ¾ ðŁİ¾ -ðŁĩ¬ðŁĩ³ ðŁĩ¬ðŁĩ³ -룰 ëĭĿ맨 -âĨ ł -Ê· ʰ -zi ker -ze enew -yose op -x ul -wen die -voice over -vit aisland -ver du -ve oli -ve h -van ita -uf h -tum he -tour ner -thisis london -tac ony -ta vis -t kb -t its -subro to -spiro sis -sou tah -son taran -sh ichi -seven oak -seas pray -scep tics -sar noff -sacred heart -ru tin -ro ter -refe ction -red team -re miss -ram ones -radical islam -ra eng -r hoops -q adri -prosthodon tics -pok kiri -pi oli -peper on -pedan try -paw trol -pad res -p shr -outand about -open ssl -om mi -ol t -o eno -nu d -north cliffe -nbcdfw weather -national runningday -n dd -mu ur -mt lal -mo shi -mee thi -match week -manig ault -mand ara -man ok -ma hood -m rap -lul ls -lipp ies -li sc -lepto spirosis -leather neck -lau thor -la sek -kyam bogo -kreay shawn -kra ddick -kean university -k bh -ju gs -jo bli -jig ging -jc su -jack knifed -j cre -it anagar -island wide -in delhi -in controvertible -haltand catchfire -h än -grove town -great team -gl hf -gimna sio -gig ichibi -ger des -foam ems -flu gz -fl er -fish kin -fini ster -fer mat -fa eces -ent ury -emul sions -ell ys -cummer bund -conval escing -con form -ci encias -chri sh -che ee -change d -cat ron -carre ira -car hire -bf si -better idge -bang alow -att ys -ar ath -and then -amox icillin -amandab ynes -am eric -alternative medicine -agon cillo -ag ila -adomin icana -acor ah -abduc ts -ðŁİīðŁİģ ðŁİĤ -âĹ Ĭ -âĸ«ï¸ı âĸ«ï¸ı -young day -wei mann -w go -un workable -um kc -tv awards -the tre -the jack -tel ok -super lot -stro zzi -st als -squ atch -sports memorabilia -spar kas -sm ca -sk ata -scoff law -sar ki -ru aha -rick sen -practic able -poblen ou -plant power -piece meal -phi rek -pen pals -padma bhushan -p marca -p inger -oro go -oni er -ob ata -o gan -norman whiteside -ne atoday -nascar goeswest -napp i -mus ico -mo p -me ep -mc clay -ma drug -liv ni -len sman -le coq -lax mik -lan kershim -kim taehyung -keven ingecho -kaf ka -ka steel -ka ino -jedediah bila -jar ro -jap het -inf eld -indecent ly -in adequ -ice man -ic q -holm wood -hog fish -hatt an -hass anandani -ha go -ha gens -gun ov -gool wa -fri eze -free time -fore lock -fonte yn -financial brand -fern bank -family love -f ator -exother mic -ev or -essential mix -es ling -en hage -eg be -dm z -discoun ters -der am -dave morrissey -cri spin -cour tre -cor keveningecho -comor bid -choice hotels -ces ario -ca bel -c spi -bou vet -body by -blue coats -bhat i -beat us -be smart -bangladesh is -balo gh -b cle -as mp -ambro gio -amar ley -al dc -air transat -af rl -ab ud -âĿ¤ âĺº -áIJ ħ -Ù Ģ -Ì²Ì ħ -zom boy -zapho d -yon atan -xi omara -worldd omination -wl bt -whiteri bbon -w fc -viper room -vign ale -val o -tu bule -tu berlin -thu ll -taip ans -sur mise -stor ico -sta hl -st n -st anced -smex aminer -sip smith -si rs -shin awat -shalo tt -sche epers -sc bc -sasol sa -sam sa -roy d -rib chester -rhy dian -re assessing -pro vine -poo ch -pom on -pic ado -pi ma -pg x -periodon tist -pd ca -pann acotta -p win -om avirus -ni dal -neon trees -nal co -my viking -muj uru -mtlal ouettes -mo zes -mo ren -mcv itie -mat thes -mani x -mac donnell -ma zen -ma ass -luis ito -lord stown -light painting -levan te -legal advice -le iria -lap angan -la ze -la the -krish n -kol on -ken sal -kare y -kam ya -kad lec -jig arth -itsadog slife -is ae -iron birds -hyu koh -hm nation -he ssler -has na -gore tex -good memories -gonetoo soon -goe tta -gel dings -g mm -fr yman -foot ballis -eric a -end sleigh -ek tar -ec lub -ear p -corn market -concur red -coet zer -co ker -clap board -ciz re -cic m -care e -ca ep -bush baby -bub bler -bread basket -bre p -brazilian jiujitsu -bod ger -bi sho -beng kulu -b itti -av eline -architi zer -angel ine -all c -æĽ ² -yl u -xon r -world snooker -west cliffe -ux mal -toto wa -too early -tipp ler -ting z -thin c -tf tuesday -t itt -supporting women -sru hle -som nam -sm itty -sly ke -slur ping -si miles -semir amis -see ma -sec ca -sc g -rite sh -riseupred hawks -rho dy -res nik -qu wain -pá irc -pun kand -propag andhi -principal ities -prem chand -pr zy -potenti ometer -pol ke -plu gand -pf nicholls -park field -pall ant -ophi uchus -one happy -news reel -ner r -nat geom -na ah -n to -mu ffle -mi at -manchu ria -man ai -mac ross -ma sand -lockthe gate -lo far -le pak -kemp sville -kather yn -iucn congress -irrepar ably -hi kaye -hack able -gund agai -goodwithout god -go teamusa -ge milang -funko pops -fix it -ero i -eel am -dun raven -dro st -dra ther -dorn birn -design and -dar wyn -cut ler -co bit -chimbor azo -car oftheday -car ned -brown trout -broc kett -bre vard -bluer ising -bin n -bidvest wits -ball ena -b hari -auto drome -asphyxi ation -ar dr -appet ito -anitadon gre -am ayi -alla scala -all ontheboard -absten tion -ðŁļĢ # -ðŁĺī ðŁĴķ -çĽ ® -âĿĮ âĿĮ -áµ Ī -wyn jones -wsf cs -wrong ful -winand yourein -vill on -vel ho -urtic aria -travel writing -thework isworthit -th ye -svf social -submer ging -strelit zia -stevie j -sr va -sport speople -sport park -spiderman movie -souven ir -sott sass -shel le -senti ence -scotu spick -sco bie -samu dra -sa amy -rope walk -rickie fowlerpga -quadr ille -qu k -q nx -pr itt -planetrock radio -paul ricard -pag el -pack ag -our people -ormer od -oppos itional -opol itical -olafur arnalds -ne ared -naz gul -naveen jindal -my four -morning run -mor by -mcin ally -mari eee -mangeshkar lata -mall ord -malaw ians -makeme smile -lol lar -lindy hop -lar do -lam as -l rd -klax ons -jim jefferies -j tag -iter ature -house and -homeboyz radio -ho omin -hari prriya -hand guard -grou ted -gretsch drums -gre go -gi do -friend satthetable -football archive -f nc -en ate -em cr -e iland -dor ayaki -dioce se -daniel craig -cz k -custar d -co var -co ban -chetri sunil -cher no -canone os -c train -bub nagar -bo jana -bo dley -betra yals -beh rouz -bas sing -bar bas -bank rolled -bag no -assan te -as j -anni elennox -alab adi -ðŁĻı ðŁĩºðŁĩ¸ -ðŁĺħ ðŁĺħðŁĺħðŁĺħ -ðŁĶ® ⾨ -ðŁĴ§ ðŁĴ§ -ðŁij ± -ìĤ ° -âĺĢï¸ı . -त र -ı oÄŁlu -z up -ys l -wol v -wi da -we k -ver mette -ve trano -val on -up skirt -unt ying -u rena -ts ong -tro v -toy collector -thomas ina -the ts -the stoneroses -tf boys -ten th -telang an -ta ite -swas ft -su wa -strip elife -sport paleis -soccere x -sm pls -sin to -shop ads -sher ratt -ser ous -screen ers -scot th -sch wag -sai ko -ry croft -ro dders -rein ier -range ley -qual ino -poign antly -picador books -ph orm -pete foramerica -pescet arian -pan war -pa edo -pa chter -ornam ented -orac er -opp erman -nefer tari -nan amusic -mur ton -mu mias -mol lo -mitri one -mill field -michael muhney -mediacom poser -mass ari -lu iz -licen se -ley on -la style -kamp ar -josi elong -intra week -inner circle -iit bombay -id una -hydro dynamic -homes ites -gri mey -google cardboard -gi gged -gal sworthy -for animals -eu com -don nay -doing right -dil opho -dad aism -cu v -chi pola -callsthe heart -bristolold vic -bhattachar jee -assembly fest -anything ispossible -actor karuna -a arti -. ðŁ¤Ĺ -## ## -ðŁĺĤ âľĭ -ðĿIJ ĵ -ãģ ¨ -z nik -witch of -winter berg -wh summit -well ard -vel oute -u ter -tv dsbmath -tur p -treat day -to inton -thevoice kids -thev ra -ther ich -the intercept -the coach -tel aviv -tam sen -tal garth -super impose -str fans -sr sg -spar kes -skitch en -shel ob -se ant -sakur acon -s offer -ru dman -ru ah -ronnie o -rocksolid show -ric carton -rabbin ic -puz der -punch line -pu ft -pot latch -phil os -pacqui ao -over hear -orn ella -opend ns -national nutritionmonth -music hub -mu ybridge -moody grams -missing cat -micro plastic -me il -mari ecurie -mar williamson -mar al -man za -loch gelly -lifein pieces -li q -len ni -leader ships -lat robe -la ie -kor y -kong skullisland -jane goodall -jak cloth -intra ocular -in ves -im zaheer -hurricane season -hol lowell -hahahahah haha -gu ac -great people -gon go -fr acing -flight attendant -ferry boat -fern ley -far ang -ex im -ex hum -erec tor -ef ford -e gle -dry stone -doy enne -discred iting -dia hann -delta zeta -dam ascene -cor less -con scripted -colmc ille -col ca -chase water -carden al -canad apost -cam wowapp -cab ane -bud de -brian w -bra ding -bor st -avan ade -ask ell -ashi da -arche o -ar lo -ander sen -amazing racec -am brin -alt stadt -alam gi -aig adesign -adu que -!! ðŁĺįðŁĺį -ðŁ§¡ ðŁĴĻ -ðŁ¤Ł ðŁı½ -ìĨĮë ¯ -æĥħ åł± -âĺij ï¸ı -é dou -zahaha did -ym un -yel e -with congress -v dara -undoub ted -u din -tri pler -today sdoodle -ti ang -think and -the villa -the jay -ten se -tart u -ta kai -sycoph ancy -superlot biz -sub verted -stickle back -sky hook -sho tter -shar in -sg br -se uro -sb hs -sardon yx -sarah jane -sal er -rou e -retirement planning -ren dle -prison er -portal berni -paulricard track -param ore -para professionals -pap akura -pali ka -p tech -orion books -ne dv -n ali -mondad ori -mis fires -mil verton -mex borough -met service -man gg -mam i -m fah -lyn ds -lpr nyc -let girls -landsc apers -krish nan -ki raz -kd nuggets -kalym nos -kab badi -ka ira -k achi -ju vie -ji zzle -jab bing -infantry men -ib botson -hunter valley -gu z -grow up -gre nadi -glo scricket -glee ks -giri raj -gel in -ge ste -fre twork -fore bears -flor ance -fitz gibbons -f natic -ess m -embaras syour -electro plated -dur ness -dne pr -demon ology -daily gist -cycling weekly -cour ser -cor net -col td -closing bell -cip are -ch nl -capric or -cal houn -bur rito -bouti qa -bor ys -boo zman -bk stg -bj k -bi osis -bal en -anthony jeselnik -alem bic -accentu ating -... / -ðŁĶ¥ ⾨ -ðŁĮ ĺ -zom bo -yard girl -yar is -wisconsin ite -wid dop -west van -we sen -waste basket -uper y -united coaches -uncle blazer -un ready -un perturbed -tor tue -ton igh -tim scott -thiop hene -the tribune -the blackpanther -tend re -tat au -sumbur gh -subo tic -su eno -stre icher -st cloud -soulcalibur vi -sof light -sing en -sig man -selfiest ick -scott skomo -sad an -s fax -s den -rock field -reep ham -redd war -q ais -presiden tever -prefec tural -pol li -peri helion -panto ja -pais aje -olli elocke -ohi a -ocel ots -obe isance -nor is -ni shar -ni dho -ne fer -nancy drew -my brother -modern monday -min ories -mill ard -mc mick -matted mondson -mat kearney -masa aki -mar le -mam ared -mali c -lo chee -lay away -lau di -lam he -kungfu panda -kong sberg -kan z -kac per -jo gos -jam huri -j rod -is for -indiav spakistan -in coherently -im erick -hun nid -hu it -ht cone -hin demith -he pb -hat ake -han aa -gutt man -gopal an -gal les -fer mo -fashion jewelry -far mar -eug bil -esc c -ego istic -dy stro -din ve -der ya -dend rites -cw batb -county fa -cork ery -con descension -complic ates -co gno -co ffy -cherry belle -chelt festivals -chef ou -call acu -cal as -bou los -bobbyl lew -black ening -bishop ston -be zer -be bb -bacal hau -ba ath -b pw -at enas -assi stir -as bel -andhrapradesh cm -and c -an ap -ade al -* $ -ðŁĺĬ ðŁĺĦ -ðŁijĩðŁı¼ ðŁijĩðŁı¼ -ãĥ³ãĤ º -ãĥ ¡ -wor ton -wool er -wil bur -wick man -we it -we iner -wc sd -visit brussels -vian sk -u ah -tu gu -to kyu -thre ss -ter williger -te ef -ta va -syno logy -suomen linna -sunray sia -su lit -stewar desses -ska ite -shop ko -shin do -shi maz -she ads -shan shan -se yed -scream fest -science fair -sathi sh -sas ummit -re yer -raffa ella -purwak arta -promp tlist -pet portrait -pawl enty -paw circle -pauly shore -parat ransit -par thian -papen brook -ndr rmc -mul ligat -mc dreamy -man jeet -mahesh sharma -lap ine -lam onte -key card -ker oro -kaz ak -karl urban -kainaatar ora -jur gen -jimal khalili -james dean -j radio -inform ality -in authentic -imit ator -i haven -hin dman -healthy hair -har oun -gu ast -graveyard carz -gal lucci -gab b -fi roz -farm houses -entry ways -enjo bs -electric picnic -eddi emurphy -eagle ville -duff town -don nelley -desi sto -date able -dak otas -confi ding -co des -city rail -chi angra -charlies loth -cer t -cc funkandsoul -cas sels -carequality comm -car mello -bru e -bie gel -bachelorette abc -awe want -astr alis -app design -all td -air band -ad hs -actu alized -ðŁĹ ¡ -ðŁĸ ±ï¸ı -ðŁİĬ ðŁİĪ -ðĿĹ ¢ -áµ ĸ -ॠĥ -zoy sia -zeenew shindi -yav uz -xx l -worldof warships -wink news -westh off -web tour -we te -wal lawalla -wah peton -w ben -vol and -victory beer -vicky rubadiri -ven eration -up éry -u anl -tw iss -tur alists -tron foundation -to fun -tm ills -tin am -the legendofzelda -th ays -ter lingua -tamer amowry -taldÃŃ acomohoy -supre ma -sound ness -so su -sj l -shin sen -scot amfa -rene wal -re animate -py les -pra ja -per nice -pedr ito -pat ong -pa ura -p ello -over laying -or way -onthe green -not as -nin ful -nil i -nav o -natural hair -nan chang -must weed -museu marchive -mun sey -mill ers -mc ternan -mc spadden -mant illa -magic mike -ma dailygist -lü neburg -loren zana -ll np -le iv -kel burn -kayag nik -katie holmes -k mel -ju ric -jessica jung -jan ak -io d -i ffic -hu ai -htc tryouts -hitthe floor -hi rap -hi bi -hel low -goul den -gold ber -frie de -fire baugh -fin nis -euro pac -en livened -dul thood -dhru vasarja -de duce -david h -d si -cruis ing -crimestopper suk -chun li -cho le -chery shev -cat orce -casper vandien -bristol nhs -bre m -bo ij -bo gal -blr citytraffic -birch ington -beti bacha -bbcscotland news -att kisson -asym phony -anti histamine -anind ya -amp suk -al dez -ak pan -acer bic -- "@ -ðŁĺı @ -ë¸ Į -åł ´ -âĪ Ĵ -ย ว -اÙĦب ØŃ -wo aa -wic kett -wi on -wedding decor -voj vod -vent spils -ven ray -vel uwe -v ahan -ur key -up staging -une scap -tro yal -thi em -the ug -so car -si h -shu mai -sen ai -secre tions -se ssi -rup tures -rubi doux -restore thevra -refriger ants -qu illin -pu mba -probowl vote -privati sing -pra i -police family -po ya -po cho -oldman crew -ok ent -nomin ative -no pf -net label -nei va -n itti -mulligat awny -men asha -mar gao -manpower group -man sory -man son -magal ur -lun eng -love oz -lal ang -la on -la ire -ku duro -knot fest -kele la -kamer on -john newman -jerky xp -io ta -inter jet -ich thys -iam lenaheadey -iam cannabis -henry holt -ham ban -h mua -gur riel -gour i -g berlanti -fl n -fior ano -fight ingfor -eu taw -enz as -end ly -el c -eco watch -dyscal culia -duba ic -don mar -dil se -di ola -di kt -defl ates -de sensitized -convul sive -con la -chowd ary -ce bit -cb ct -car not -brianger vais -black hawk -ber lingo -bel is -bar jatya -ay k -aphrodi si -any who -ann d -am lw -ak s -ai jaz -ac oo -aaa ad -ðŁĩ¯ðŁĩ ´ -your heart -whati learned -wear redday -war moth -walshy fire -ver lo -varney co -van ill -us g -un balance -tre ec -toscan ini -titlei steurope -tick ell -texts anta -stay focused -stat ecraft -star garyen -so bhi -smex y -smart contract -sids riram -shi geto -shawin igan -share alittle -sells vintage -se ba -schi emer -ru su -real cj -qnl z -projec toftheday -power plants -pover a -poll star -play box -phili pham -phel tzcomics -parallelo gram -p she -over shadowing -outer hebs -olf club -oil paint -nicomaine at -naw abs -mor cheeba -mel fi -matador records -mat tr -london bronco -list ener -le ist -kim guilfoyle -ke wanee -ke ffi -karti keya -kaad hal -jo ynt -jeff botl -je gs -j re -j omin -j illa -instaf it -ib times -hull fc -hiro mu -hex agram -heff ley -hand carved -gri ego -gen aro -funic ello -from dusktilldawn -food friday -follow ing -fit and -feli u -etsy sellsvintage -eli braries -du bi -dis qualifies -ding li -design junction -deni grate -davidar quette -david b -daddys gurl -d jam -cryogen ics -con fit -commun itech -colorad oriver -ck ner -chetu mal -charliec rist -ce sky -cdn screenawards -cb ase -carto graphers -can tatas -bwa hahaha -bun yip -brigh twood -bracketo logy -blan ke -bet tel -barcel os -balla deer -bab us -ba eday -att ilio -art world -ar zu -anthropom orphism -anim ales -an ath -am ua -alye ska -ad com -(âī§âĪĩ âī¦) -âĢĶ -> -à¹ģà¸ Ł -zel aya -z ann -x pose -wra iders -wc w -um laut -transpo se -tr é -they ll -tat sun -tal isa -sz ky -sx moctane -sob chak -sig is -shu cking -shol ders -sen ju -sel borne -se bor -se acroft -scottish highlands -saad at -rpo online -rn tata -richar da -rebel hearttour -rc sd -ra ich -r alo -pun kd -poster design -phosp hates -pett way -personal care -pe gram -panther s -pad ley -pa zza -over working -op ala -ol czyk -nic ke -neu meier -natu ren -national cookieday -mor re -maruti suzuki -lob dell -liter acyday -lip kin -lic orne -la bre -la bial -la ad -krish nar -ken ting -kemp en -kc caug -ka id -ju stre -j reed -itu din -it au -insinu ate -ich rist -hu lot -hpnoti q -home school -hay don -harrieth arman -hand lin -hal ilovic -h sts -gur purab -gamers gate -g mod -g beng -franch itti -flashi kat -figue iredo -fen ske -enter o -eas dale -dh v -d sn -cru dit -corin thia -conference usa -coloni alists -co agul -chocta what -chie fex -charlesd ickens -charle swood -cen o -call ery -cal football -bul ley -brigh twell -bree am -bol ding -bi plab -betsydevo sed -bar il -bankni fty -bani shes -ban yo -ban iyas -ba reminer -asking for -as pho -app sych -ap late -and day -ade ga -aber corn -ðŁij¸ ðŁı½ -ìĭ Ŀ -âķ ¥ -ye pa -ya eger -wrest lin -world history -window sserver -way faring -ward man -vers ac -upen patel -umass lowell -u my -u local -theodor ou -the weekend -ten ergy -tce cardinals -tas min -ta ira -srijit speaketh -smo d -slv sa -sland erous -sk cv -shag gy -sen an -se ber -rich burg -re uses -ray toro -rav ager -raim ond -proser pine -pol lok -par ami -pap illary -oy uki -osme ña -or thy -op ac -old mane -oldmane bro -ob scu -non conforming -natl prep -nam as -myri ad -mud flap -mono theism -metan oia -medi en -me xt -martinlutherking jr -map making -make out -ma hay -li gnes -li ba -lesleyann brandt -le ki -laver cup -lar ner -ku zu -joe dotie -its agreat -isa ia -intermittent fasting -in china -hy dride -gub bio -gher bo -ge tover -gd live -gar re -flame throwers -exab eliebers -enchong dee -emo de -edg iness -easter brook -dow ler -dor ing -director ship -deadly sins -curling canada -cu tes -contempl ations -cl enden -car oni -bra ggs -botan ico -blog paws -blackink crew -betibacha obe -batt lers -ban bury -avi atrix -av and -anu bhav -ann ya -anheuser busch -alo dge -alamgi rizvi -age ek -ac ti -ac rack -ðŁĻıðŁı¾ âĿ¤ï¸ı -çĽ ® -ಠ¸ -à° ľ -zhong shan -ww elive -worl dexpo -woo p -wai hi -vo t -vil lo -vid éo -vas cu -vagu eness -v usd -under value -u see -tut bury -trache ostomy -to kam -tir ith -there sa -tauto logy -synchron isation -swan berg -su ad -spl urged -sp lan -sound less -smile more -sitt we -shil ajit -sh agreen -schoo le -sab ry -ryan reynolds -roth child -rbge hort -rafsan jani -ra shan -qu be -psycho analyst -proprio ception -profess r -pro me -pp d -porcup ine -po stel -pang aniban -oubli er -ol die -moo gle -mo sler -memo ire -mc di -math ed -lon drina -lla ve -live action -le ering -law ers -ku ehne -kirk dale -julio jones -jez reel -jetti son -ip ag -induc tor -ici um -ichthyo saur -hyster ic -hu pp -hr lich -houston heights -home away -he int -hat ting -ha aga -guildof finefood -gidd iness -ghost buster -gen next -fou dre -fo res -floren zi -feu illes -fer ret -fe ve -euro a -ep is -enrique gil -end les -e tim -didd ly -dic taphone -de mining -cubat ravel -co calico -clarkk ent -chor tle -cb ellracing -bul las -bren o -birth marks -be jarano -bbcradio stoke -b tho -b kt -audi ere -atp masters -as sp -ap his -ang ol -ang ere -alex s -al tran -aic p -ag gia -ðŁĺĩ ðŁĻı -ðŁ¤Ķ @ -á´ Ħ -ze spri -ye ws -y go -world run -wind lesham -we uro -vogel song -vho enen -us olympic -ur ning -u sun -twitchretwee tr -tv network -tor rez -ti be -ther see -ther itz -teresh kova -tak firi -sy ra -splot ches -spaw n -snow barry -sight lines -si mc -shilo h -se wu -schi ff -saviler ow -san wa -ro ten -rizzoli isle -re eee -rat ap -r factor -qualityof life -pur posing -pul man -pu tten -procreate app -post i -phi the -pa quet -official charts -nor west -nit ef -nick groff -nev ada -mono hydrate -mon ckton -molson coors -mod ellers -mc tell -maj ithia -low cost -louisian agov -lahore qalandars -l be -ju lly -jeux video -j man -island records -intothe wild -im ss -ili brary -ig inal -hydro logic -hou chen -hoo ter -hom am -hi madas -her ve -her ren -hel loo -heinz vhoenen -he ey -has z -h mer -gel inas -g elliott -french quarter -forthe weekend -for honor -florian opolis -fa sho -dun t -du aa -dom itian -dj max -din k -descon to -d johnsonpga -clear skin -but u -bras sey -body board -bk v -bit pay -bigro ck -bene detta -bar ony -bal art -bad uy -ba q -at ami -as umi -andrew christian -an fa -an ever -am usa -al medalen -air busa -aero space -ðŁİĦðŁİĦ ðŁİĦðŁİĦ -ë¬ ´ -å¼ ¾ -ér ôme -zuc chero -yer caud -work table -we win -wb sdcc -vill ena -viewfromthe office -usta z -upenpatel world -un ah -uit enhage -tyler cowen -thereal morrison -thame side -ter na -tar if -tani guchi -taf ter -swag man -sunday service -stre b -sky forge -simm o -shinawat ra -sety rn -sar kis -s bank -real men -re ja -prime au -plum tree -pardub ice -pal mera -or phi -off setyrn -nak heel -multi stakeholder -michel is -mc cafe -mary stown -mar bach -mad in -mac ungie -love that -lo hn -lo ffici -li thic -les niak -legi onnaire -lee z -l lah -l ity -kor ang -ko vil -kho j -ke olis -kar ls -kab o -jordan stown -jeni fer -je maine -ire x -inquirer biz -ing ly -indul gences -i abc -hor ological -har ring -halcy on -haj ji -gru s -gra vois -gis d -gi js -getur riskon -ga jar -from space -flash forward -fight news -fer ried -fast fact -fair water -eski mo -er be -eich ner -do reen -dhi vy -david afrench -darren hayes -cyclon ef -cth k -cre f -cowh er -cor wen -copp elia -cool ing -coco ons -char vel -car lie -bro sh -bri dles -breaking dawn -bre snahan -bel grade -bandof horses -bailey may -ark ley -ar kra -agreat bigcity -ag ip -adi da -ad rs -aac ps -ðŁIJ¬ ðŁIJ¬ -ï » -éĽ » -ç Ĭ -y ati -world blooddonorday -wn es -wha thapp -weare the -uw badgers -uni ak -under lies -ulti mates -tw oway -tso tsi -triangu lum -thermal take -theover tunes -thehow sofus -thec rick -tameramowry two -t shir -symph on -surfer sparadise -suncorp stadium -styles p -stick ball -sp rockets -sne tball -sna c -smart mobility -side steps -self worth -second chances -scri be -sar mad -sam ms -saakash vili -s mullen -redefin e -re tooled -rale kha -raider strong -pur view -pu gn -pranit asubhash -perme ated -par apar -nov ations -nigh tin -never surrender -nc ell -mole hill -metho w -mar tes -mar sy -manek shaw -male m -ma zo -ma had -ma ddin -m qa -m jj -m ji -lu ter -love it -lin ha -lifel ock -le twin -le gh -kathmandu post -jou e -institutional ised -im ac -illumin ators -iko kaz -home fortheholidays -hel pu -he chos -hau liers -har nish -guer neville -gre gan -gon dal -go outside -gh and -gen thaler -gabri ell -gaben fica -g list -fox sportsnews -fly tpa -flan eur -et in -esc rit -end at -dump the -dor aville -dam aris -dale steyn -dal ley -cran brook -cor oll -come up -cla de -chol mon -chess base -che es -cein ture -carre gabenfica -cann ell -c sem -box games -bou squet -biz dev -benef icent -autom obili -ass ant -ar ati -ann ell -an tri -ambassad ress -agra ham -adren aline -ðŁĺįðŁĺį âĿ¤âĿ¤ -ðŁıĢðŁıĢ ðŁıĢðŁıĢ -ðŁĨ Ķ -æµ · -ãħ Ĥ -ãĥĪ ãĥª -ãģķãģı ãĤī -๠ģ -zell ner -z ill -ysleta isd -yach trock -xylo to -wolf hard -west combe -wedding inspo -war hammer -wal de -vir sa -victim less -van go -v uganda -v hl -uk bff -ts agov -tri ble -travan core -to ton -to rey -time scales -theword alive -the team -tex ashi -talkto pd -sulphu ric -su rer -so len -sing la -schlu pp -rubb ers -ru y -ra fc -r anta -py rus -prat ts -pos iting -pof icial -poetry society -pn brock -phragm ites -penn ard -peach y -par atriathlon -ost p -oro ville -o gh -ny mf -niki for -ndu bz -moz fest -mon cks -ment ally -mc comas -maytheforce bewithyou -may flies -mat ram -maqu illage -mag is -lyn dale -lucap as -lou rens -leu ci -le xie -le shan -le ota -law enforce -latingram my -lat ou -la a -kubla i -kpm guk -kitch ener -juicy couture -join there -jedi diah -jay and -jan ky -italian style -ig as -hul kam -horni manmuseum -himm at -hil lock -hen shah -hail southern -grass ington -gore ski -geno types -fleet management -flav ell -fiction alized -fi du -fascin atingly -far allon -f ma -ett inger -er music -el lam -du leep -drive insured -dar pan -dae mun -cy bil -cur rys -contin o -con oci -co ent -chand rika -ch ulo -cen ser -caw thra -bu shi -brandy well -bou ie -block ading -bla do -bin ky -ben be -bel gis -bau ti -bau le -baro ss -bar ite -asseenin columbus -alm shouses -ag ol -achristmas story -ìľł ëħ¸ -ë³´ ìĿ´ -ê¹Ģ ìĦĿì§Ħ -ಠ¿ -ye tta -yaf fe -wordof god -wen zhou -val astro -ur f -unitedwe dream -ula res -uit p -tit ley -tiff ani -tag on -sugar and -stru mp -stri m -stri ker -stem day -sme er -sine w -sha hada -sh older -sey dou -sahar awi -rol lup -ro stro -re im -rac quets -qu ise -ppro ject -pp ina -pol let -pis an -pha res -pak sha -our town -or kest -opp ement -oh mi -ogbon na -o ord -o brist -nin ot -ne bel -nas ca -ms fc -mol ts -mohom bi -mel hores -mal en -maithri pala -ly da -lon da -liquid ating -lick ers -less or -leard blockade -le mbo -le ash -ku fi -kam illa -kad abra -ion izer -in cle -i all -hyper text -hill town -high tea -hang u -hadd am -gut tural -gu ap -gran adilla -gr ö -goff stown -gee king -g pro -fum fum -freetheni pple -floo dgate -flat man -evil hag -euro control -epitom ised -edinburgh zoo -ed ance -dro ad -diatom aceous -di ds -datascience ctrl -dar ko -comb in -co ye -cc cu -buch tel -bogo sian -big nell -ben harper -ay ar -au teuil -as ol -arc and -am att -aga g -af forestation -ae w -aal apor -ðŁĻĪ ) -ðŁĶ Ħ -áIJ Ľ -yu mmi -yj hd -wy ant -win eco -wil pf -wil lumb -whaaaaa at -wa inaina -volunteer day -trasi meno -titu t -ti so -thetalk cbs -the jump -the homeof -tender izer -tech geeks -team ucm -ta en -sw asan -suu kyi -spra gg -spo c -sien asaints -si rois -shoton oneplus -shere met -shel man -sheepi shly -serendipit ously -seaf ire -scott gshore -scen ography -scarlett moffatt -sale town -ru salka -roman ization -ridg ely -re constructions -re classification -rap mon -quebec city -pronoun ces -pre ti -pre defined -po pin -play on -petrol heads -pen er -pa hl -or dre -of music -octavi aspencer -mr tommy -moon lights -min ott -mik los -mase go -mari af -maha yek -ly kan -lin dal -leg ant -lat eran -lamba sted -kom mt -kit amura -kill cliff -kap itan -k ace -it suki -is il -insur gentes -inf lorescence -ich it -ich ay -hu an -history day -hi eu -hai kyu -grand mom -gir alda -gi en -getto know -frederik sen -forger ies -fly day -fl stateparks -fin twit -feeling blessed -fay outh -f ya -ev elin -era worth -ent deck -e dea -dwn twn -duf fus -dro om -dic he -der mody -delhin cr -de stra -dal gety -d cau -cyber sec -cour te -conten tedly -congres sperson -col tart -brown lie -bre x -bour ret -bog side -bo esch -bel phe -barber ini -ar bab -am mer -acham pion -absor bency -:' ' -ðŁĺĦ âĿ¤ -ðŁĴĶ # -æľ Ľ -ä¼ Ĭ -âľĮ ðŁı¿ -âĸ« ï¸ı@ -á zar -zehn der -yer kes -xero x -ww wf -women surgeons -wit n -we star -vinay aka -ven ator -vari ously -un translatable -u fl -u dan -ty rr -tren tuni -tott ington -the savoy -thak or -tegern see -sur ve -smithfield foods -shi u -scott baio -saur usrex -salon pas -safety tips -run offs -restaur ation -real world -r ón -quan tumb -q ml -pulmon ology -pir atas -pi ra -oven den -on ny -ollan tay -oc weekly -o hit -musth aves -mur tabak -mul ford -muhammadi yah -mu dv -mon roy -mon geau -mo liere -mis sle -middle ages -mic ke -mc p -mb fwa -m di -lumin ate -londonbronco srl -lil ting -lau rid -lare my -kow tow -kom ando -kar z -kamalha asan -k gu -journalis mis -jo shab -intre sted -iff r -ic ty -harro dsburg -hard inge -hange ul -gott acat -gl n -gam bir -fre richs -forever with -fex po -fay az -expan se -etch ells -et ool -eluci date -el rick -east devon -distribu torship -dis affected -diar rhe -deme o -deenday al -dean s -de martini -coldwar kids -children shospital -chee zy -char cot -cas andra -car reg -cap turing -brown lee -brother ali -beck ner -bas ak -b boy -auto psies -au stal -agu da -' !" -ðŁĺİ ) -âľ ¶ -é ri -zoe trope -z alab -yoshi oka -yogal ove -x cond -winter ville -wild west -wedder burn -vi varo -uryn hill -un colored -the calm -the arti -teatro allascala -te ays -tas bih -t smith -t lo -t elic -sunday selfie -sun u -summari zation -spell book -smu ckers -sli e -sksk sk -skill share -skatec anada -sicure zza -shou ka -sel by -sc te -s again -ro loff -ren ouf -rema pped -red u -reci o -re val -plu mp -ph yl -petre scue -pest ana -part age -paper man -paper magazine -on tiveros -on enew -ne ira -nare lle -mi one -manip uri -man md -male ek -mal ays -lu bang -lo ic -le ur -lar tigue -la vis -ke sel -jal y -is ob -in ski -ice do -hoof ddorp -here come -hau ts -ha or -h mph -h dr -green ing -go pala -gad son -fon i -fed con -f hc -emer aude -dunnell on -dub ya -don don -dhu l -devinder raiji -dak hla -dais aku -ch lin -cavat appi -cast away -cap rio -ca strate -bur nit -bond holder -blo tches -birch grove -bir tles -bevil acqua -bet wn -bbc merseyside -bas ak -bapti st -b cus -at ake -anok hi -annes ley -amber ly -al eck -aero star -ador kable -adel leo -ack lam -abscbn ball -"" "" -ðŁĺ£ ðŁĺ£ðŁĺ£ -ðŁij¯ âĿ¤ï¸ı -ðŁĩ®ðŁĩ © -æĽ ´ -ÙĪ Úº -Ùĩ ÙĬ -رÙħ ض -zel mer -y atim -wr on -wies er -wheel jack -weiz hou -weare weber -vene dig -ven ham -u chu -twitter party -tru elove -trade craft -to ve -thestor mishere -stri bling -spel thorne -sk anda -selfre g -schla pp -round tables -road hog -rish tey -ray more -raj in -qu ity -qian long -ps media -produc toftheday -pre port -pou ched -pis d -phi beta -pat o -pand ita -pal le -p ni -oyor ooms -ove ts -one humanity -omni directional -omidy arnetwork -northumbria uni -non members -nidho gg -mur willumb -mtb life -mtam aryland -morg ann -men folk -mel len -markr pellegrino -mariab rink -mar tock -man abu -mainten ance -lor ds -li fy -lean in -lan awwe -kw q -killthis love -kil mallock -kag erou -k wc -ix p -is que -hol men -ho is -haven lust -guaj ira -get north -ge healthcare -fox ley -fle eces -divas confessions -desperate housewives -del phic -dame wine -d jay -coun tin -city kitchener -ce smma -cay es -carlin ville -campo ree -c ge -bluestar media -bene ath -ben askren -bee bee -beat niks -b ghs -ath iya -asi acup -ash el -ase sino -alainf cae -akh ya -aj ar -admon ition -ad harshini -å°ij女 åīį -ãĥ³ãĥ Ī -your vote -xia oming -wux ia -wat lington -wal esa -w fr -ve el -va shish -un settle -un dr -ug wu -ty rel -tr nc -thu gga -thorn dike -thal loween -tan a -tam la -t ma -str ating -stock trading -ss g -sp ick -so tu -snow mobiles -sing son -shy lock -sfor the -sfor peace -ser mon -schiz oid -sar gentina -sam arth -rac coon -qui ddick -pur s -psychedelic art -pro europe -perme ating -pere grym -our finland -ori ello -o guri -o dus -ni obe -net scout -natural products -natural ised -nato summit -mt dc -ms rachel -misssaig onuk -mis represent -metac ar -medi are -maree ba -march mont -mal pass -mal ite -loveu all -london city -local auckland -lo key -lma ker -ley endas -lau g -lancelo teh -kul wicki -khat ter -kas son -je tz -iv m -itf db -iso k -impeach ment -ik lanceloteh -hu eso -house hold -hor den -hani fa -gras strack -gam ine -free ski -fibro id -fi ds -ffe y -f fo -eur on -ernest moniz -enforced disappearances -endimp unity -dro medary -don nelly -dod son -de ba -dal edc -dak o -cur tice -cran ky -confi ance -con tender -citi sports -circu mv -cash for -carra way -cal pis -bro mas -bre al -bour ses -bo za -black jack -ben ni -being boycie -bale stier -baker mayfield -arctic circle -ar sht -angu l -anal i -allo p -al nico -al murray -ag ol -a africa -! ðŁĺĪ -ðŁij Ĵ -yo soy -whizz er -vijayak anth -tyn wald -tre volution -tre han -trac tive -tit li -thir dly -thin lizzy -th form -telang ana -sympathi zing -sub d -stu be -stgeorge s -sterili zing -soul train -ske p -shiva ay -shinsen gumi -self made -scal gary -sb j -sal ice -ri vie -reverber ates -rang elands -ral ston -rad tke -q oq -proven çal -pro khor -pi miento -perfec ter -paw ley -pack pride -oak bank -o hr -o are -no problem -news net -news bud -new sit -nav deep -nap ier -n da -my du -me ineke -master system -major league -mac nee -ma quo -ma cha -len zi -kn ack -kid lington -kat arin -kalye serye -kad al -kab ba -jud ds -ip on -ing net -in he -ikokaz ike -i pod -hy on -hu cker -heinz field -heck lers -harmon town -gul berg -go bel -gar mon -free trade -floridag ators -fan sided -escapethe fate -e bell -dox ology -deb es -day club -d ally -contex tually -conom ic -com and -clai borne -cit rul -chu ll -christma sy -cavall ini -cavall aro -cas sville -cap n -brown hill -bou ldin -blau w -birch field -bio dome -behren dt -bc v -barri ere -bar cs -bal last -b wn -austinand ally -au mont -amil car -adri any -aa sif -& && -ðŁĽ ¢ -à© Ī -Ñ Ħ -yvonnear naud -work sfor -wishi was -willy wonka -vi vos -vann in -tylerj blackburn -tow son -toler ation -to ffice -tlax cala -tfl ers -star maa -stan ko -stall er -ss diski -square d -snug bucket -si skind -shaw nee -scotamb service -sardaar gabbarsingh -san tonio -s med -roy bal -ro goff -rizzoliisle stnt -ring le -reptil ia -record keeping -pren up -poster paper -photo sby -pad dler -pa ho -outra m -out ag -our d -osso buco -omni vorous -od zilla -new blogpost -n kc -music ologist -multi sports -mor iches -mitchell vii -mil ken -mem u -me kas -mc chesney -mat tam -lun ny -locke din -lake city -kristen ledlow -ki thar -jubil ate -joy as -jal aluddin -jal ade -inuk titut -intensi fier -inocul ated -house fly -hi biya -hash em -har away -ha peville -gen ii -gaw xcond -gand ara -g way -fried mann -free wifi -fivb women -fine gan -far amir -estab rook -epau lettes -ent se -en nie -dur ations -dru mma -dil ys -dg wick -dar nall -ct k -cow ans -contact center -col y -co wed -clam pett -chuk w -chronic ler -chil led -chem ed -chappa quiddick -ch th -cen mag -campan elli -caldic ot -butter fish -bur gen -bol sena -bike ways -bi yori -az m -auchter arder -ate me -aren ds -alani z -ai ge -adi sa -ad ream -actu aliz -ab sent -... " -. ** -ðŁĩ¬ âļ½ -ðŁĩ¬âļ½ ðŁĩ± -ä¸ Ģ -âĨ Ļï¸ı -âģł âģł# -ਠµ -ÙĦ ÛĮ -Ì ³ -win tney -wi hm -wan ee -walmart strikers -us ss -tv drama -tro vatore -tor pey -tops field -tito ortiz -tic khill -thoo ver -thiscouldbe us -thelu cky -theband musical -tech tips -team razer -tc v -take offs -t sev -sub national -street ly -stay hydrated -spo to -spee do -sier ung -shu shu -shel li -serious fun -sens ori -sd h -say ani -save gaza -rock ery -rcl ens -pä rt -poy thress -poy dras -popp lewell -pet renko -oxen free -old n -official baileym -no tam -nkotb sb -murwillumb ah -mitso takis -mill wright -maz on -lt gov -lo quillo -le icht -lar us -kul dip -kanti pur -japan times -jamie kennedy -j wh -iam jojo -house sitting -hou traffic -hotair balloon -ho ian -h jr -gocat sgo -go wo -gis day -funeral care -fri m -fire lli -fer rule -feminis mis -every night -em sp -em ount -elec table -dor rit -domestic ate -dik sha -desmar ais -de ason -d juma -cz ars -crest fallen -chew tonglen -can oa -cad dis -bro zovic -bov ington -boo kex -bod kin -bo whead -bluet sunami -bel fiore -ban tul -av z -ast olfo -appellate twitter -aon tro -anti histamines -anant kumar -alton brownlive -alic ja -ale ye -al kas -air frames -ç Ń -âĺ ľ -Ùħ د -ye syou -wü rt -wy ff -wed more -versail les -ve b -u ddingston -tor ise -toni thecat -todayim wearing -tiger style -ti pps -the osophy -the most -tabri zi -sy ma -swa ins -sw ca -stac kexchange -st ex -space channel -sno ddy -sne h -septe t -scutt ling -sal zman -s min -ros al -real romadowney -ran ade -radi ative -ra bie -proto culture -presidenti rl -po ddar -phari see -pec ado -om ad -ocre gister -niobr ara -new telegraph -my i -muhaj ir -mudv ayne -mradam scott -montp ellier -missuni verso -mile ena -mezu zah -md p -mar mo -mad is -lu pit -love by -load star -lo che -lev ana -kyle kinane -ku fa -kraken rum -kne ale -kenne ally -kam as -itch er -it smar -ironwork thursday -internacion al -inag arten -imper ishable -ig ma -hon ka -home time -home economics -high nesses -har gre -h aces -gol fon -gi app -fro ebel -flo rek -flavour ings -five fold -fir str -eight fold -eckhar ttolle -dr f -dor it -don ta -di se -den ou -demo is -del im -datt atreya -darb hanga -cu k -csu mb -cran leigh -cran bury -cot in -choctawhat chee -chamele one -capp adonna -c plusplus -bur gum -buch wald -brie fest -breastfeed ingweek -au sd -ari alv -ali venews -aj na -! ðŁĮŀ -ðŁĶ Ń -ðŁij¨âĢį âļķï¸ı -åį Ĺ -ठĿ -zoom zoom -yn ich -wor sfold -wol itzer -watch word -warr iner -wad low -vÃŃ deo -ver dy -upper most -uni for -un ami -twee dle -tro pon -tril log -trans kei -time warp -th amar -stud illo -strick ler -street scapes -stim ming -spren ger -sm tickets -slo sangeles -sherry ontopp -sen ter -schem ers -sch acht -saw fly -san j -sal tram -safe cofield -rumin ant -rosen wald -ron ja -ron g -rev athi -red olu -reb sbsb -re flog -rafi k -quen elle -porphy ry -pisco tty -per vs -pale strina -omis sions -nord stro -nagach aitanya -mp naveenjindal -mosqu era -morin aga -min ski -mi ras -medi an -med scape -many ara -li bret -lewis ville -lev ated -league intheworld -laryn geal -kar ski -kap tur -john muir -jhump a -iso bel -ind say -hurricanes rugby -hu ila -hol ga -hit music -hearing aids -hahahaha hahahahah -gri quas -gold stream -goe demorgen -go ads -glam sham -geoc ities -gent ing -ge sellschaft -gaillar dia -fum fumfum -fedex forum -eo valdi -energi zes -drag sters -derby shi -dena fil -demonstr ative -dav ro -cu mnor -cis l -ci aldini -christ off -chin di -charle son -chander i -car adoc -canop ic -cal usa -by culla -bure aus -brit tri -br ini -bower bird -bor chardt -black sad -black people -bic oastal -bc bs -bad die -bab o -ba shar -av r -av aaz -ar roman -angel ini -alz forum -ake redolu -ak ame -ag ma -adjour ns -adam west -ðŁĴĻ ðŁĴĹ -Å ij -you zhny -yama shiro -xer is -x ania -wing nut -wing dings -wee eeee -wad ge -wach tel -vil lu -vic pol -ver ducci -v wt -v aka -twop ad -tu ney -town son -tinke rer -thereal kiss -the jake -thar mon -terriclark music -suf is -su roor -stu dia -stron geurope -storm bringer -sti k -stateof decay -sseairtricity lg -ss quare -spor tre -special collections -spe idel -sol di -slugger nation -seam os -saf tey -s ying -ra yel -ra jon -prun ella -pis sy -pas u -p be -ox hey -on usa -obam acare -o cl -nonlge progs -nis sim -news dc -nba history -mur naghan -mi pim -men ses -man utd -m che -lit man -leg on -lan sley -la si -jon bellion -jang ly -j wala -istandwith pp -inter news -hawaii fb -hard knocks -har sin -h jh -gö tze -gul da -go bbo -ger ona -garag erock -fu mar -fr acti -fly frontier -fightfor iowa -fal lof -esp en -eritre ans -emil yos -emc donald -em mitt -ear vin -douce ur -don nan -don ation -do en -dj akarta -design lab -del tad -del lo -damas us -d under -conse jo -clock maker -cl ancey -cic lo -chis en -capp elletti -boot legs -be iner -bar bat -bagh el -bac kedby -bab alik -baarbaarde kho -avic enna -av ner -arach ne -angel ababy -ad ss -ad ry -... ðŁĺĴ -ðŁĩ¨ðŁĩ © -ö k -zo ethe -you will -ye at -y alu -wn v -win ched -water beach -wan k -vibrant gujarat -ven ner -v mm -ut am -university sa -un buried -tourisma us -tor valds -tor reon -tit led -timber man -then ats -th aven -th april -syd filmfest -su arez -sthe best -stepp es -ste ier -sr kfc -spin master -sol aria -sleepy hollow -sj f -side effects -sh att -school book -san ko -samo thrace -sab ir -sa wah -romantic ize -ramesh waram -pur vi -preten ses -pow ter -perri go -per plex -pe si -pe akers -paul brandt -pastu re -pang eran -pablo picasso -pa xon -out burger -oun ders -ou di -occul tism -noth appy -nh tsagov -n nc -myfox ny -mye yes -mun guia -mori bund -morgan field -mis k -med calf -mar ans -mal en -lover ly -laure us -kinder hook -katherine kellyl -kar amazov -k shat -ju ist -jeth malani -jad oo -j ist -j emma -itch in -interior designers -in capacity -hoop z -hemen way -harri ss -hari pur -happil yeverafter -hanson sauctions -ha fer -gon ç -go tyourback -go bots -gin ning -fury fc -est oo -energy star -don keys -di ast -desi rables -dave doyle -d hoop -chil oe -cedarssin ai -car so -callaway golfeu -bwa haha -bri zen -blue origin -blu sher -binghamton u -betty who -bernab e -benjam ins -ben sen -beg on -av us -as om -arqu ite -arielle kebbel -anatom ist -ag ga -ad re -acro ce -ab dali -! ðŁijĢ -ðŁļ´ ðŁı» -ðŁĵ IJ -ëij IJ -ê ½ -ãĤ± ãĥ¢ -âĨIJ # -à¸Ļภķ -ÅŁ a -zdrav kost -yan ka -x tend -womenin horror -winter halter -vikram bhatt -vascul arization -un us -u media -trump s -transliter ation -tos sup -thi eme -thames water -tel lement -tal ita -susan cain -sugar creek -su ar -stylist ically -statue ttes -star ker -sn ice -sil ay -semiah moo -seam stresses -ri ma -rei ver -rat m -prosthe ses -pre date -pil chuck -photo sportnz -peter mansbridge -peder nales -pe led -ou ris -ole sya -northeast ward -night call -neur oradi -mun ns -mor ad -miss india -mesh ach -mcgee han -mass aso -mark zuckerberg -mare lli -mam baday -mah mou -m sic -m da -lo wey -lo ks -limerick clg -lily whites -le pr -lake george -kit siang -kay seri -kap aun -kam pa -k je -juli ed -in sensible -impac thub -haaretz com -h nb -green keeper -grac ey -gin tonic -gi dea -gemeente museum -gam bill -fr cs -flores ville -flit croft -fire bomb -fahriye evcen -f ch -exal ting -eu foria -el st -el ord -eir com -dowag iac -dog sitting -discur sive -depreci ating -daily motivation -cur tly -cuck field -coroll ary -colle tage -co balt -cho isi -chil las -chiangra i -ches ed -cav en -ca yoglu -bisp ham -b unions -arch dale -arag ones -anu mber -and only -amor tization -ambu shing -am ania -agu erra -adidasu prising -acces shollywood -abdi rahman -ab ow -ãģĨ ãģ -âĨ ¬ -zi u -zach ry -z ole -wk bn -wicken heiser -whe ed -weed ore -wa aaah -visitu tah -viny ladd -vic mignogna -vand ellas -va vel -usd chf -tu lu -trust towbars -tow trusttowbars -tobe your -thetribune chd -thereal joebob -thei acp -the pit -tanu ja -star bomb -sr h -snow dog -simco ecounty -shun ted -shaw tv -sh off -sarcopen ia -ru sts -roger io -rodolph e -ro skill -re dedicated -pron ovi -press news -poo h -phy tic -petro c -paper clips -pa wned -p tb -p sch -ouss ama -occit ane -new construction -neel ofa -nd cs -nai docweek -na den -musician life -mu hr -mount lake -metal detecting -mc nay -marque e -lymp stone -lisam arie -lewi sp -lang sford -kwest adakar -kramer girl -kati ep -jes see -jae jin -is may -im pri -ido lish -ho que -hail storms -goo k -goo domen -glimp sed -gio conda -gi path -gev rey -furry tails -fox baltimore -for sett -foll ome -far chitecture -f th -f dc -ey ring -es af -endor p -drumn bass -dri vers -dre p -do dy -dispar age -dilopho saurus -dbel twrites -d for -co scarelli -chi quis -cha oyang -celebr ants -black diamond -astro physical -assun ta -arkra zor -aristop hanes -archon sec -aqu is -apple pie -ance l -amazing grace -all ou -al sea -ak ert -adjunct professr -abo lishes -a pod -a anchal -.. ;) -âģ© : -y anno -ximen aduque -wro e -went zel -weap onize -water shed -w tvr -vel oce -u idaho -tweet ad -trigon ometric -tou ght -thyroid cancer -they callme -thermo polis -ther ington -space apps -snow dogs -smither man -shami sen -ser kan -sch outen -ry ce -roger stone -ro sko -rep ousse -real gilbert -re offending -racha ele -ra hab -r pharms -qui o -pu pae -presbyo pia -petr cech -offer ta -o fro -notim pressed -nor is -nil and -ne pt -natalie portman -myfav murder -msla urynhill -mil spouse -mende sarmy -mbio journal -mati ang -man k -luke pasqualino -lope zo -lo ge -le kh -lam bat -lago di -la jong -ko stov -kee sept -kay sville -isol ationism -innov atively -immuni ze -im hoff -idi omatic -i ves -husk orkut -hu ds -ho bart -har tofdixie -h dcp -gram ado -gir dles -gau hati -g slv -french ay -four che -for sa -fin don -film score -fici ent -evil twin -evan halen -eisen man -dx c -doris day -donat elli -dmy tro -deepender shooda -davi dax -cur fews -cryp ton -crank worx -corning ware -common est -commi sioner -coent rao -choose kind -choice summer -char gé -centra irl -career goals -calder ón -c tec -by re -bur styn -better future -bern inger -bel ka -beaver dam -b how -aptac sm -aphili ppe -amp ly -ame ans -am alive -all meansall -ali ers -ail and -a indonesia -________ _____ -ðŁĺ¹ðŁĺ¹ ðŁĺ¹ðŁĺ¹ -ðŁĴķ ðŁİ¶ -âĸª âĸª -Ùħ س -za atar -walk men -w ör -vis u -vin ni -video in -val ry -us outhflorida -un corrected -uma ir -u oe -tribute to -transfer talk -therun way -thebig issue -ter zo -ter ious -silver lining -si ss -seattle u -sarato gas -rit eaid -rent ola -rasal khaimah -rap allo -ple sio -pit v -pet stagram -pap adi -over by -or bo -oo st -onda atje -of change -nun chaku -nottinghill carnival -nc gov -natali ya -n ourse -my nottingham -musici d -multic ast -mobile first -mm j -mitho on -mirzap ur -mck er -mam ou -m key -luca still -lo siento -lin ate -letter men -lec tura -le maitre -kra kowski -kol usola -kim bell -kill bill -ke aggy -karl towns -ka hr -k pf -ji ffy -jam sil -iwe ala -isti klal -ingex tinction -iac eae -hurst bourne -high jump -hi miko -he ilig -goj evich -gly fada -gen n -fluor ine -fair head -epi stol -eon ni -easter ners -disin vestment -din of -dhivy adharshini -cre asing -cod ling -chri si -chees man -cer vera -cd tv -cardi gan -bread winners -bonni es -bon nett -bne storm -blu cher -black alicious -bla gojevich -ber thel -ballin robe -assn at -ashok selvan -anu ja -ambul ation -akal amusic -aho i -academ yof -; )! -! "# -ðŁĻĭ ðŁı¼ -ðŁĺĤ ðŁĺį -ð ĵ -é Ĺ -å®ĩ å® -âŀ¡ï¸ı â¬ħï¸ı -âľĶï¸ı # -âĻ § -âĹ¼ ï¸ı -اÙĦ ÙĬÙĪÙħ -youn an -yom kippur -wv lt -wies ner -white plains -when callstheheart -wee der -u loom -traver so -to wolfpack -teuk ury -ten jin -tele x -summar ily -stat work -speci ous -space ksc -sof joy -sis back -shen k -shark skin -sha ikh -sh oll -scho oners -sal mahayek -sac rum -s beach -rose anna -ride along -ricky skaggs -ri blets -remb ert -realkid poker -r bb -pub blic -pro le -pri ley -pp is -po ha -os setia -om ms -o ker -ni ketan -ni ghted -ng media -nam iss -my friend -mu ere -model ers -mo ssa -militar ised -metv startrek -mel amed -mc fee -mary queenofscots -madein uk -lucapas qualino -lit le -lim kitsiang -letthem stay -lark field -korn heiser -kn wn -ju bin -jigarth anda -james the -j ne -j gd -io st -inter missions -ingu inal -incarcer ate -in offensive -ideolo gues -id k -icahn mountsinai -hyper sport -ho dag -handof hope -hand anovic -han eef -ham dard -h cfc -guar ani -gu mmy -gratu ities -grand ly -graci ano -googl enew -gi ons -funny man -french toast -explore spaceksc -deniz li -de wx -davedoyle mma -cr pg -cle ang -chang zhou -cathe terization -catch pole -cake shop -ca rel -bur ys -bug fixes -bray ford -brand shatch -bo che -bi dens -bard sey -baeday alden -ba asha -b mb -ay et -athel stan -as cat -art smia -aro ssa -arkrazor backs -arc angelo -ar lon -af ball -> = -ðŁıĨ ðŁijı -íĹ Į -âĺºï¸ı ðŁĴĻ -ม าร -ил ан -zerot olerance -youtube channel -ye wande -yarra wonga -war sash -vote katniss -v neck -v mf -under passes -ulster gaa -tremb led -ton is -ther ave -theq arena -thau vin -sym metries -superf icially -strike apose -st azione -speci alist -sp su -skam italia -sheremet yevo -sgt pepper -se journal -salt ford -rupa huq -roc as -reuter spictures -report ing -ren k -redu cere -red panda -phithe takappa -p inet -nowon air -neu illy -nephro logist -mo tw -mike will -mide ast -meadow dale -mar kin -man teno -mal len -mac ario -ma sika -lovel ife -long well -local beer -leed smot -lay field -kom arov -ko ech -kitak yushu -kenny rogers -ju ho -j ent -i var -hira eth -hemer ocallis -har r -happybirthday srk -hann s -ha ass -green juice -good ness -galve ston -g ll -fru g -fou quet -fo aled -fi ma -faf ner -en gie -en feld -emascul ated -easthar lem -dn ssec -di stancia -di siac -degener acy -dau be -daphne oz -cloud land -chy stryder -chad mendes -cal trans -bre vi -book bub -bobb les -bis nis -big mouth -be za -autu m -ask dr -aldubarkad spreparation -alau ddin -ðŁĴŀ ðŁĺį -ðŁijĢ ðŁĴ¦ -⾨ ðŁĮĻ -yuru yuri -yo ong -yo gaf -worldof wonder -work work -whiskey town -wall work -vol stead -verdic chio -vat anen -un match -typi fies -tte okbokki -trou ville -tribe of -tre va -tra g -tom parker -the style -th ilo -te aand -su jit -su ic -su bu -sow den -small batch -simple pleasures -show masters -short stops -ser gent -secul arist -scor members -sap sec -sand ag -salli saw -ryan serhant -rubin report -ro te -ro la -richmond kickers -reza aslan -revol ved -reha shing -reedtimmer accu -razor smack -ram lee -radhar ani -rad hi -quali es -principal sinaction -pri ed -pre condition -pen so -out sell -ny ck -no zawa -nicky morgan -ni ka -neuro physiology -neeti mohan -ne dc -natural light -my lifeis -mu c -mr tom -mom in -mo je -mi ette -mdcps north -mckel din -may le -marr iner -manoeuv ring -man sel -makesom enoise -m itali -lo quat -liquid mayhem -lill ington -la veau -kulbhushan jadhav -ku lim -khel o -kala handi -julie chen -jud icially -jol anda -jay akumar -it sti -indi v -in saan -in fi -ick enham -hms qnlz -he res -hal abi -gr ackles -go di -gn an -global tv -gha jini -gang ed -gan ti -folk festival -fo aling -flo gging -fis c -fight forthe -felicit ations -fa ille -eri reland -emmy kinney -eiri k -ebony mag -dor fer -dg love -de man -dat en -dar ingly -dap to -collect sideshow -classical guitar -chichester ft -celebr ates -car lease -bund chen -br yer -boxer dog -blog con -bi modal -ba ati -arra yed -app s -ah it -ðŁı · -ðŁİ¶ ðŁİ¤ -ðŁĩºðŁĩ¸ : -ðŁ§ ¦ -íĶĦë¡ľëĵĢ ìĬ¤ -åŁ İ -ãģ£ ãģ¦ -र ह -Ê ³ -} : -yoshi moto -wn du -white party -weare mkto -urbant vuganda -transform ers -to death -the following -teddy b -taylor wimpey -tax slayer -tas lim -tableau public -stock photography -star i -ssur gery -soli dus -simon etta -sathletic shoes -sarah millican -rv h -russell p -ro hi -reign cane -realmatt lucas -rd bms -raku go -ra fat -promo si -pepp apig -patron a -pam per -or un -nor ia -nct fanart -nc sl -mc swain -mc gui -mandre ll -mal ave -mag ics -lud mila -logi stica -lipstick day -league mag -latin as -las well -lan ni -kor ch -knaus gaard -kid son -kal t -j fw -it tuesday -is mart -ing gi -ind itex -imagin atively -ic s -hoo ge -hf pa -halo ween -groove shark -gol dy -go jhl -givingtuesday ca -g weedore -forever leedsmot -featured concerts -fan u -f ci -ex clu -ever after -equ atorial -eg more -dup online -dong saeng -dirk gently -di ddy -den ter -d printers -d hole -cush nie -cruci al -cre tech -cre sa -cliffcentral com -chapter house -channing posters -career teched -cardcaptor sakura -car ney -ca jal -c wre -breath lessly -breakfast club -brachy therapy -bol in -bo sw -bay city -asi ad -arkan san -arie ge -andre wn -aldubhappy baedayalden -al ward -ahu bble -affl alo -ad yen -ach aille -^^ " -? ...... -ðŁĶ¥ðŁĶ¥ðŁĶ¥ @ -ðŁIJ¶ # -ðŁĩ¸ ðŁĩ¦ -ëĦ ¤ -ãĥ¬ ãĤ¹ -z te -z quad -z atar -ye ileen -wide field -wearethe arsenal -w ru -vo tem -ub hai -tu tta -trump lies -tro ve -travel card -tor cida -toge thers -tmb g -time zones -thro cks -thre epenny -thisi sac -tbin chat -studi ously -stagi aire -spro m -son et -sit z -sh j -sel ondon -scitech museum -sai shopkins -ricko wen -raw ski -rail freight -rachael ray -qu ade -purpose tour -pu h -prehen sile -pharmacokine tics -persian gulf -per cale -patient sfirst -pan cas -pab lito -orland ounited -o chi -nv g -next week -ne gie -ne ff -ne bext -morgan freeman -mix e -minnew aska -me p -mat aji -mashi rafael -ma atv -ler os -lapi dus -kh iri -kaz mir -jann atul -ja que -j vp -ishqba aaz -irrit ants -ir m -insi debates -imperme able -im mobility -higu chi -hallow en -gul food -grease monkey -grandcanyon nps -goto southafrica -glass work -gan apathy -g ses -fu dgy -fo gging -flee ce -fi ord -falcon i -fab ra -entom ological -em ami -ek iti -dx cc -deno sau -cyber stalking -crohns disease -cro es -cn mi -clapper board -chris thile -ch isol -cf ca -carib beans -ca zares -bo vell -bed well -bb w -barrow afc -ali sta -adhe rents -ad han -ãģ ¥ -âļ¾ï¸ı ðŁĴĻ -zelda thon -ze ze -wro th -women rights -wel ches -wald wick -ul rik -u iw -the predator -tax march -t song -süd tirol -supply chains -supere xclusive -sub frame -stoichi ometry -spe akin -som ato -so yo -sl fp -sky rockets -sh azz -sam po -sa che -rochdale hornets -rid wan -realmike wilbon -r ce -pu sam -princi p -port patrick -pl x -pe ve -patriot league -pa ston -pa sen -pa har -outw ard -oop sie -ol ero -o sak -nom es -no bi -nel les -na ipaul -multi versity -momo iro -mo sco -mit ter -mic u -megat jp -may aguez -mar ucci -man gusta -m world -luth ria -lock step -linn he -length wise -le sher -la presse -la kers -la barbera -kom ar -kla i -kasab lanka -ir um -ir lemb -intern day -inadequ acies -ima genes -ich kov -icalli han -i fixit -hulk buster -honi ara -homony ms -home staging -holly woodland -hill day -guy ane -gun ton -green sborough -gordon hayward -good girl -goo bers -go guins -glen mont -giz mo -gi velife -ga aclub -for ni -fish wick -fer l -fel tman -ethan vansciver -erne sts -er agon -emilyos ment -ella henderson -ee zer -ed wyn -down turns -dont crack -dd ino -day stil -dav o -cra ins -consumer reports -conspiracy theory -conqui stad -colmen ares -coach d -citi ess -charge dup -chal ices -cease lessly -ce tt -cav ers -cake and -br angelina -bo kan -bil ty -big star -baz il -az l -az ha -avail able -atx weather -arca ea -anthon yo -ang ga -aler mo -aid i -age uk -ag ganis -adekun legold -accou stic -,,,, ,,, -ðŁĺĬ âĺºï¸ı -ðŁijįðŁijį ðŁijįðŁijįðŁijį -íĥľ íĺĦ -å¯ º -าภª -ü re -youn ghollywood -y ia -with me -wi eden -why wellington -well played -we cker -vier tel -vi var -vas antha -vall one -vad hana -u kip -ts ss -trouble shooter -tre ece -travag anza -tomas berdych -thon dan -thal amic -thack ray -te du -stade toulousain -ssc s -sor bus -social protection -sme m -sho tover -seen u -rho dy -read yyy -pur éed -post codes -perce val -pawh uska -patti smith -over dressed -oui met -oooooooo oooooo -ollantay tambo -od da -occur ing -no aas -mun ic -modern fam -mob in -mk p -missing no -mik ko -mi sen -mayweather v -mate er -madhuri ma -ma sin -lough nane -logan square -lo or -les seps -lab oured -la font -kra h -kad jar -k tx -jos é -jon gh -john lock -jeff dunham -ist i -in yc -iheartt ally -ho ima -hedley online -hau denosau -gro yne -gor inchem -goo ssens -food city -fau zia -exp consulting -expconsulting es -elem mathchat -egi dio -edwyn collins -eat well -dym church -dof the -detro i -den z -defer ral -daphne caruanagalizia -concent rix -comorbid ities -cat elynn -bt ls -brid well -bra wijaya -boy ar -beli z -barro wraiders -bal dini -bai jiu -awa ited -aw tg -aw aki -auster litz -atra de -archae opteryx -adjudic ators -ach oli -a hy -ľ ëĵľ -z wave -your home -wo ahh -winning wednesday -westvirgini au -wan ge -wa sif -vi elle -vec tored -tx politics -tomor i -tin chystryder -thenight manager -theatre uk -stur minster -southwark cathed -schmal z -sarban es -sant illan -sam l -ring mer -ri et -rath gar -rant oul -radhamohan bjp -pun ked -planet comicon -phan tic -paul polman -os am -oet ker -o es -nott age -ne ven -multi use -mon agh -mira beau -mille miglia -micro biological -meetthe artist -medi agu -loe wen -l sr -l sh -ke aney -ka ÅŁk -jag jit -i dig -hex um -haz ama -gou ter -gentle mens -g sfc -fra sca -fr ö -flower stagram -esc ro -ell inger -ed corlando -dro oping -dor mice -ding er -dies fc -de balt -debalt seve -daw yck -darao briain -d age -co hosted -cla u -ci alis -chocol aty -chin may -cac ia -bret bielema -brahman yam -bott en -blanc as -black on -bla d -bey ers -beir ness -bab bs -anne cy -angi er -ana huac -ale gg -agger scricket -ag lew -aer u -âĮļ ï¸ı -zap ruder -z burg -xx xiv -vir gina -v ong -that boy -tele casts -tc margate -tar di -sun ye -su er -stani er -squar tet -sickkids news -si mad -shoe bill -sepul cher -sarahm gellar -sach ems -sa ura -rich woods -ress ources -real sway -reagan omics -re tellings -re marque -ra ijin -quer cetin -pyro graphy -punkand stuff -principal es -plat oons -pl ari -pin der -oz ge -over populated -ny gaard -neu romancer -nativeamerican heritagemonth -nap aracing -nach t -muriel bowser -motor mouth -mon tt -mo is -mercer sburg -maz ama -manj ari -mal c -m js -lu vr -lin oleic -kwang min -kir n -ju u -japanese art -j li -itso kay -itsmohit sehgal -ipp f -inag ur -im planting -ic tp -hil den -havean iceday -har by -han cox -gro fers -grand niece -glo p -glasgow uni -gladi atorial -fm drive -fi on -feeling festive -fair wood -f legg -er col -em rich -e bc -dr ongo -defe o -de wolf -de ux -day ang -cycle tour -cur ate -cor avin -co dsall -circuit ous -che ena -cate rer -cart lidge -can y -brook green -boo gaard -bol ick -blue bear -bin ding -bi ms -bale wa -ayurve dic -auto express -app ena -ang ai -alo gic -aj in -agu er -addic t -ad tech -aco e -ðŁĴª ðŁijĮ -ðŁijĬ ðŁijį -ç ¸ -ã ı -âĺħâĺħâĺħâĺħ : -âĺĢï¸ı âĿ¤ï¸ı -zar korel -xi en -wil kes -wfm z -wap akon -wak elin -video tron -vass allo -v wap -us military -un graded -uk ho -tusc umbia -tsumt sum -toro company -tool kits -tomar ket -thondan kani -thisis lany -ter fs -tang lin -sura u -stock wood -spor tireland -spar sh -som alian -sidd ons -shel a -sham ers -sg vn -sf symphony -selvar aj -seb agai -sant illi -rumin ants -rt ls -rr v -richardy ap -rex ford -qi ong -precipit ous -pat ta -paget paget -over abundance -olimpi ja -nu dged -nu dge -non pareil -noi settes -n ni -musi q -mur rells -mu ds -mon tac -mir s -mingh ella -maric hal -makebetter happen -ma eyoung -ludd ites -luc ban -lou reiro -lo tos -ku mano -kre ta -kha dka -jess on -je sh -jane te -in news -her javec -helioc entric -head rick -hackney wick -h lundqvist -guil lot -grun dig -grin drod -grimac es -g sma -forest fire -fin chel -explor ation -ex upéry -eraser heads -dvent ures -dun g -dor rington -dj tira -deser ters -der rek -cur du -ct buh -cra iova -colle dge -children shealth -caren cro -cal lup -c twx -brock university -br antly -big fan -beyourown boss -ben na -beautiful game -bb curdu -bat kid -barbi ere -backin time -ay sen -as cher -as aram -albatros scam -aire uropa -ag ac -adom ah -ac rm -ðŁĺĺ âĿ¤ -ðŁİ ½ -ÙĦ اÙħ -yassi zzle -wine growers -wilhelm sen -who dini -wer oll -water fowl -wai alua -w shs -vine sauce -vi lest -urban ecology -u ssi -twit ness -tro gon -touch down -techno logic -tar chives -ta eler -sudar san -stump towncoffee -stre amy -spar go -sou ra -sni k -sk ow -schmid t -sam ah -sab atino -running uk -ro gge -public education -pu ber -pri zep -pied ad -p ting -nebra ska -naz imabad -naj ran -mun di -mo ed -mitchel stown -mimi kyu -mil ke -mi yam -mann ering -manjun ath -mac iver -m ten -lyn g -la gat -klein burg -kay ako -jor dache -johnnewman music -john waters -jasmin walia -indiat vnews -iey asu -hu moured -ho fers -ham brick -gurdas maan -great comet -gamer gram -ford trucks -fi lem -fal ck -f ys -f ct -er tel -eleanorj calder -duche sses -drought lander -digital leader -di parole -dend rum -demor alized -demar com -cray ford -cp x -cosum nes -cir colo -calli ance -cal zada -braun stone -bott lings -boo ya -black men -bhu pathi -bestin the -bailey lakings -au fman -aspir a -as lef -ariad na -ar tec -apple pencil -angelcake pics -ad dd -ab mb -ðŁĺĤðŁĺĤðŁĺĤ ðŁĺŃðŁĺŃðŁĺŃ -ë ¡ľ -ç³ » -âŀ ¤ -à· ĥ -ت ÙĬ -zing erman -x eter -wright stown -woo sung -whit elock -war bling -wa chau -ve ctis -us en -ty burn -top dog -tb v -t sel -swim swam -sud afed -spectro photometer -spare parts -space exploration -south ard -smart cities -shi raz -shar an -se inen -scu tt -scout ing -sac i -rubi x -ro milly -rev engers -re marry -raghun ath -ra ver -pv da -ps itt -prescri bers -poc so -po ppo -pl zzzz -pj py -ph ua -par asy -pac em -p nj -p crm -over charge -opening soon -of ilm -o ton -ni archos -ne gin -national bossday -mzansi magic -multi state -midge ure -mb asketball -mathi as -married atfirstsight -mar low -malcol mb -ly ak -kre utz -kiri akou -kinka jou -kei thing -kean sburg -karmal oop -kalam kari -k netz -k alem -james blunt -intra squad -iller time -holo graphy -hi roh -hal tom -gri maud -glovers ville -franki ekazarian -flock hart -facial recognition -everyonec an -ere k -ep at -ec lac -earth sea -dug gie -dub fire -drew lachey -dont forget -do vid -direc ts -descendant softhesun -degu station -daniel marven -dales man -da rena -d nab -cr ary -compac ting -cle wiston -ci ones -ci ety -cat andu -carabini eri -business model -bp mn -blan ck -be ok -b hog -aye shat -apar ra -am th -alkal inity -a peoples -ÃŃ m -yu uka -yeas ayer -xmen movies -west garth -wapakon eta -vi shesh -uss ocom -tu tup -tu mon -tri poto -tor oro -tor is -therise of -thereal russellp -the progressives -terre stris -teo chew -tar ahu -tae jin -stan fill -stag gies -spn famiiy -spectacular nwt -sketch bet -sin love -sho dge -shin ies -seku low -se gui -say egh -sar dana -samanth as -rescu eme -renn sport -refugee schief -re double -rat pack -randy moss -prith vival -pric ed -power lessness -pierre pont -phosp hat -perpetr ation -pave se -parab éns -pa ole -p wb -on duty -official psl -no zaki -no wing -ne wart -na via -mu tism -modu lators -mi hir -marypoppins returns -map maker -madi ha -ma ben -longer term -logarith ms -le amy -lake hurst -ladi ators -ku shida -kate mansi -ju ster -jan ele -j heri -j hen -iso ch -ir leach -inde mni -ichi kawa -iam mr -hopl ite -hank green -gretchen carlson -gine st -ginapu stor -ford ing -fashion finds -fa den -ess ent -en ationalpark -dun given -dontcrack underpressure -dom brov -dil fer -der mis -de very -cynthi abailey -cu lum -con signing -cocor ahs -chortle town -cho ise -cheap ness -ce fas -cc bvb -cal pur -cabinet maker -cab bag -c ba -belphe gor -bag gers -av c -av am -art ford -are ola -anton iom -antal yaspor -and rada -afilm fareawards -ab ingdon -ðŁijı ðŁıĨ -âķ± âķ± -ÑĤа илан -ÑĤаилан д -ã es -yl td -wo er -whit marsh -waldor fa -voltac atalunya -vander hoof -ut me -un mastered -truman sburg -the merry -the hype -tele fon -super volcano -spad aro -sin kers -ser ral -se pak -schön brunn -scen es -sam bit -sal ter -roundrock isd -river way -reali gned -re qd -push forward -pu sch -powder ham -pie man -pi era -pen alosa -oreilly media -on dcp -of shame -o gee -no dui -new beverly -natlib scot -national policeweek -namad gi -n tom -mu du -mor ti -mon ton -min jung -mel bour -medi acity -mcgra il -mc kiernan -mazz oni -martin imonday -mar tech -ma ven -m fo -lliber tat -letter forms -le the -lar aza -king g -kids activities -k liz -judd monte -john king -jere bko -jak un -jab arda -improvis es -i versity -i hn -home theater -hoki enation -hick en -har king -gu igno -gb pjpy -g pw -francis can -fo tor -feels goodman -dragon fly -dr p -dl ls -dhe yar -depreci ate -demon ization -del ap -de ads -dd ca -d hee -cur tailing -culture l -collecti ble -co sma -clay ne -chrono graphs -che re -chas sagne -ch one -cab ras -bren da -bluecol lar -bbc so -basti da -bam bi -ballet day -balder as -bal zer -avi dheyar -archer field -anti mony -anna akana -amo on -ally girl -alco y -albu men -albu maday -ac rum -ðŁIJ¸ ðŁIJ¸ -ðŁ¥ Ħ -ë§ Ī -ç Ĩ -Ø® اÙĨ -мÑĥз Ñĭ -zo ie -your allypally -xian lim -westwoo done -wein man -war fighters -vul pix -un compressed -un acknowledged -tshep o -troglody tes -toli sso -tho tep -thisisp vris -thed appy -the esh -thats what -thanksgiving week -tal er -take backthe -takam atsu -sx ii -suki waterhouse -smol ders -slopp ily -skin health -she arers -shawnmendes the -shar jah -shak shuka -scrap the -scho eller -saveour seas -salary man -run asone -roy c -ri fat -revoke article -red sonja -re bb -rand b -ra strick -ra son -quar shie -pre so -pre k -pot coin -pol ansky -pleasee eee -peter scanavino -periodon titis -pe dley -pat aky -parvo virus -p bhushan -ow y -omi ami -official ghsa -north central -nie bla -nhlon nbcsports -new era -neko case -n tia -muswell brook -mom oh -mik kelson -microne edling -michael wsmith -mer in -mckin zie -mc wane -mark dice -mari pos -mar os -mag adi -ler ouge -le pus -lam berti -kno pp -ki kki -ki hu -ke dai -katheryn winnick -k ko -jon montag -jamiele ecurtis -ir well -infu sion -imp ru -im purity -im par -hy tner -hu ta -hs bc -hoag y -his sy -himm el -hey erdahl -hersh man -heir loom -healthy diet -he v -harts dale -har uno -gro tte -gom on -goel bjp -ge mili -fuzz ing -french wine -free state -fore vs -food park -fon o -fay oum -f gg -dessert day -david harewood -data analysis -d music -cyn wyd -cycl orama -cras sula -cor dele -chag ford -cecil erichards -catelynn lowell -cas u -cas sock -brevi ary -brave souls -boss u -bi ram -bha jans -balmoral show -bal boni -b under -aver e -artscouncil ni -ar ji -an san -an ali -ail eron -agu er -ag ical -aaaaaa and -a versa -ðŁIJ´ ðŁIJ´ -ðŁ§ ¹ -ðŁ¥ºðŁ¥º ðŁ¥º -ðĿĹ ĺ -xxx vi -ww mtnews -wood thorpe -whar ves -wel over -wag ener -vsco de -very proud -un justifiable -un burnt -ue matsu -u ef -tulip siddiq -ts ys -tri shul -trampal ji -tol tec -teacher prize -tai shi -syn crude -sunshine coasto -su sty -south offrance -sha aan -seper ated -savat age -sau veur -sam mies -sal az -s dag -ri bet -re twit -re ines -queen bee -pun to -pp ke -persu ader -pay n -pantom imes -oun try -or ko -open mic -only you -ny stag -nairo bian -my jasper -mor ny -mor ioka -michaele mann -mean smore -man ha -loy ally -loc atie -lam pre -la thi -l luis -king scote -ke mer -kaz imi -k naw -jakeand amir -it uri -in competency -hispanici magines -hen rye -he dd -he aping -hair port -ha sui -h sct -gur um -glo e -gh ard -gggg ggg -gate am -forest school -fle te -fla shover -eschen bach -erd rich -ej ad -eden derry -dy y -du su -du bc -dialec tics -del acor -defi lement -de sus -de ob -dan ede -dal arna -daddy shome -cross keys -cro mer -concili atory -col po -chri spine -cham pe -c ation -but true -brock ington -brecon beacon -brad ner -blur ted -blum spew -blom berg -bha gal -ber an -bel grad -baf tag -at allah -artic lev -arru da -army rotc -an tt -am mo -alit rophy -alam enti -aed an -ad w -ðŁĺij ðŁĺĤ -ê¹Ģì§Ħ ìļ° -м оР-Î · -z na -yun o -yu da -ym outh -working mom -wild water -whit lock -wedding fair -w woof -w sn -vo dianova -un seemly -twitter storm -tf h -textile design -t dx -straight ness -soci opolitical -shek hin -sh ung -seabour n -se aways -rock away -re zende -raj shah -quant cast -psychopharmac ology -pietr angelo -phil odendron -phe x -pengu inte -pend ence -peer j -paho kee -pa pe -od awara -net books -ner gal -neh gov -mtvbase africa -mill street -micro scale -meh wish -max ence -mash rou -mand ingo -lu ers -lokay ukta -labor atorio -kalon gan -kac z -jim inday -jan a -jagmeet singh -jack knife -inside ferrari -in hand -i vies -hi mb -hatchim als -har ang -gau mont -gar bled -fiz dale -fig tree -fidd lin -fanci ulli -fal tan -emily y -e bbs -div yak -dis da -davidax elrod -d lm -cle ws -chri qui -chatur anga -cedar cove -catch oftheday -bush whacker -building bridges -british birds -brak pan -bo snow -black swan -bi sha -bel bin -bal lester -bab bb -ase ema -am z -am diabete -am bia -ag ito -acaci as -% â̦ -ðŁĺĬ ðŁĴŀ -ðŁĺĨ . -ìĺ¤ ìķĦìĿ´ -æĿ ¥ -æ ¶ -âĢįâĻ Ģ -° ! -xxxx xxxxx -xim enez -wyn berg -wom bat -wi ed -wan king -viadu ckworth -up lifts -ulla dulla -u ea -twent yman -traut mann -trade centre -towno fficial -top cat -to losa -theori zed -thenewe uropean -the torocompany -ted to -tac it -t mux -student debt -spn chi -serv ais -sen zo -saw ada -sale sians -sal twell -sa q -ro do -ri spoli -reel sofficial -re join -re home -ram lila -rak ish -purple day -pre fabs -plym stock -plot lib -pi azon -petrol head -pav on -palm tree -pal med -pa sek -p wu -ori go -one planet -nikk il -nc ad -nas ahubble -n the -mobb deep -mo bike -mira sorvino -mha iri -mechan ised -mb mbam -matta rella -mat z -manz anares -mall ari -mag dy -lo veridge -limb ed -le panto -l pm -ko suke -kelly sue -jun in -jay apura -it sco -io les -im monen -ici mod -heu res -heteronor mative -helpto buy -har tog -gu yot -gly col -ghu rair -gh in -ger tner -genoci de -gain ax -fri erson -fitness journey -fer mor -feature ttes -emc gee -el chapo -e kin -dor rell -don air -dog gie -der mer -den eb -de schi -dali da -criso stomo -council members -cornelis sen -coo lie -colli gan -codi fied -clan destin -chuk ar -cho wa -chen in -chat ard -char vet -char ged -c mma -bute town -buech el -budget travel -bel gaum -bb cred -bar ce -bah ri -bab alola -az ion -awal sh -aus stellung -as rock -alvar o -aless andr -akademi ks -ai wa -ahmadre za -aditi rathore -ðŁĻĮ @ -ðŁİīðŁİĪ ðŁİĬ -ð٤ĺðŁı» # -íĶĦë¡ľëĵĢìĬ¤ x -yar ov -xpla p -wvprep fb -wicker park -wa chowski -vinay avidheyar -var os -va ide -us ace -urvashira utela -upheav als -un learned -tre i -tre as -toread or -thedavid crosby -the cloud -temple man -team on -tb ayne -tad lock -swiss made -stu mbo -stu arth -squ ill -spaci ousness -sol arec -slopp iness -sle ben -she x -se be -roy lilley -re kka -re ev -raz van -ran maru -rabbit mq -qalam oun -pre bble -pi at -perfor ate -pat ara -par ga -pam lico -pam ilya -over steer -onelast time -o tun -ni mrat -nfl kickoff -nest lings -my name -mother languageday -mini o -meyer hoff -men dips -mar iss -mal formations -m prnews -lyth goe -lopezo brador -le lia -le kha -last nite -la duke -kyr sten -kv ass -kur gan -ku kul -ks giving -klu b -keny aredcross -jou et -jewl ery -janasen ani -it sat -it oh -is ara -interce ding -inge ducation -ic ron -i priyank -hebb al -hand sup -h he -gyeon ggi -gor rell -global new -gig wise -garni delia -fun belt -fon taines -fold out -feel better -eu dat -eri elive -english town -elph ick -ed guy -eaz ye -eagle sham -e one -demonstra bly -de ya -dab bles -ctv wpg -cl on -chu ter -charlied aniels -cf kargentina -buñ uel -body language -bleak ness -beso in -bent aleb -beat it -be ab -back off -b nai -b co -b chockey -avec chia -auk land -astronom ically -as wang -ar ric -apilot seye -api zza -amar ina -alph ac -ad lv -achi mota -=_ = -ì² ľ -åŃIJ éŁ -z ary -yy cevents -yehu di -wol man -wild wednesday -wasi kowska -visit goldcoast -vi sting -unity tips -techno logie -sul phide -stre at -sovere igns -shar n -sh ats -seven logics -seton hall -screen printed -san cha -sa kuma -ra ymer -pu review -pre amps -pr cc -poké mongo -perfor ations -pe wee -pare jo -over man -ot z -oh the -oh saasports -mohit sehgal -meh med -mcfad yen -mark lanegan -marc garneau -man j -madri gals -luxembour gish -lp wan -lookat my -life ontheroad -kin dra -khar ge -kei ichi -kai grun -kaigrun witz -isu net -insinu ates -ii ed -ih me -hewit son -hc sd -gro tta -go wri -gau ck -gandol fo -gab c -g ach -fro mn -forest whitaker -fe k -family medicine -energys aving -ec sc -ear wolf -dont nod -dj mix -dis ki -dir lingusamy -dand eli -dainik bhaskar -cork city -con cisely -college basketball -clear ly -cla yo -chu giak -cho sin -chi kin -care for -brunel uni -bio systems -betibachaobe ti -bach rach -az ami -at socialmedi -ash elf -as cott -as cal -an tae -am rav -alpham ale -alli want -alle go -ak sel -$ \ -ðŁĺĽ ðŁĺį -ðŁijģâĢį ðŁĹ¨ -ðŁ¤ Ĵ -âĶĪâĶĪ âĶĪâĶĪ -zon ne -white tip -what about -weing art -un ceded -turner prize -times live -time scale -ther os -tg k -ter centenary -talyl lyn -syl viaduckworth -swing arm -substance designer -su td -su mber -stor rington -space govuk -sp et -sl bc -skate shop -sharepict chibi -sent ries -seewhati didthere -san ssou -sammy wilk -sam bha -red row -re power -ramnath kovind -profun dity -poly phia -pero gies -per vad -pan kow -o estrogen -nor tel -no break -niagar aparks -nh mla -nc se -murrumbi dgee -mo val -mnc tv -mis matches -mi ket -mex chat -mat plotlib -marco g -man nu -malacan ang -ma stung -log ers -lj mu -lis sette -lign um -lan cement -la gran -kristy na -kristiann airn -kam ila -k du -jyo tish -jud gen -jin xx -itu n -itu ation -ipp atel -intrigu ingly -inte bnlditalia -im ple -ice music -hun ziker -hi bees -hend ren -hd k -haver straw -h ico -gr r -geh ring -gar dot -foun taine -flo ret -fertil ised -fer net -felicit ates -fat rophy -etsy sale -epo ca -eh v -earl sfield -dwee zil -dunhill links -doll houses -dis respects -digital sales -dietiti ans -de spots -de shaunwatson -dak u -cr tv -count mein -const anta -co rella -clin k -chuck wendig -bri sco -blac keyed -bhak ta -benbe cula -ben nion -bar go -ba sto -astralis gg -andrea petkovic -ame z -al awine -afoo tball -a issa -:' ') -.. ??? -!!! < -ðŁijįðŁı» @ -ðĿIJİ ðĿIJ -é Ĭ -ãħłãħłãħłãħł ãħłãħł -âĻ¥ ~ -âĺºï¸ıâĺºï¸ı âĺºï¸ıâĺºï¸ı -öl nir -ê t -~ âĻª -yu bikey -yellow fever -y ato -wrigley ville -wr fc -williamand mary -wh arncliffe -war mest -wang chuk -wall dorf -wa ju -urban ity -up ending -trach tenberg -to sachat -ti ar -tho orn -the tls -te fillin -su in -stiff en -ss wiss -spru e -sol la -snow cap -snoo ks -skyblue fc -silk screened -shi rob -se bright -school sport -sarang ani -sa po -revel a -re quote -ra ppe -r ó -pyrene an -pend ine -paul k -par go -panam acity -painting silove -ot an -order now -olivi ers -nws seattle -neuro toxin -n scorp -movietv techgeeks -morning coffee -mor tales -mi ral -me demb -margare tha -march itec -mar cano -manz ini -lion sclubs -limp bizkit -ker pen -kel mscott -jjab rams -j atta -itv wales -ici m -i septaphilly -hu eco -holm strom -ho sein -ho ola -hit c -hi ley -hat ice -happyear thday -gurmeet choudhary -grown ish -gro aned -go canada -ger sen -gau cher -gar bag -gango tri -fu jitsu -foo bar -fire hawks -fer dy -fat berg -far rand -face plates -equin or -epp endorf -edchat nz -dur m -disch em -demol ition -dee z -copper belt -com pres -colored pencil -cog burn -clinton fdn -chisol m -cedarcove tv -cat zingano -can son -cam ba -brant daugherty -az aad -austin isd -at ours -astro boy -asak ura -ap ier -annual report -and dean -amal aysia -alphabe tic -albi rex -ahed tamimi -aden tro -ad har -abo tt -ðŁij©âĢį ðŁı« -à¶ ½ -à ½ -york sambulance -yo cum -yin z -wye valley -winch more -westpac stadium -weather caster -water marking -v precords -upthe dubs -uky p -tw ts -trit ic -tourde yorkshire -thesm sd -theori ze -the weirdworld -sunshinecoasto z -stur gill -steak n -spiegel online -sper kin -siri kit -she han -se aming -sc rabb -save hannibal -rosal ine -right scon -ren du -red card -rang sit -rak shak -rac ingextinction -prin toctober -pre ppin -pre cis -ppe al -pow assan -poo ds -polychro mos -pir bright -piezo electric -perfect as -patt an -pat os -p elling -on li -oh sen -nn h -ngw sd -nd ale -nar dini -n infa -n ating -muhl ach -motivational quote -monster high -miam ipd -mer aj -meanwhi lein -lucas cruikshank -ligh tof -leapfro gging -kremlin russia -kan angill -ka or -ine au -hunnic utt -hundred ths -he ger -hay seed -gra byour -fleis chman -fen berg -fa herty -econet zimbabwe -dt by -differenti als -del ma -death valley -cp ca -clear cut -che kk -cer ium -cann ata -boycott nfl -bookweek scot -bby awards -bay ing -baske tof -ball ance -ay on -ar sh -and you -anastasi ya -amé ric -all ying -ali ke -ala ura -al mont -ad zuki -ach mad -a als -:" "> -æĪ IJ -⾨⾨ ⾨⾨⾨ -à¶ ¯ -ઠ¤ -zi zi -zac chae -yom bo -y q -wq am -whit emountains -voteblue to -vol turi -us bankstadium -unil incoln -und mhockey -umbrella academy -uc v -tri mb -tourism week -time les -tile fish -the amy -tart ine -tang ina -tan ith -states manship -snet tisham -smu ggles -smir nov -sky copter -septimi us -schu maker -sch all -ruth lessness -ru ffins -red cap -red bus -randall stown -rad ziwill -powere dge -pol ari -periodic table -pager ank -owl boy -over print -ong ate -no bler -naz eer -national doctorsday -mor well -moe ed -min dyour -ment as -mclaren vale -max joseph -mat tz -mary mary -mapper ley -manu shic -mandi bles -mahal akshmi -ma ek -lith os -lat terly -lam onica -kö nen -konzer thaus -kir rie -kingdom of -king aroy -kess ock -kam aal -kai ja -jonesc apo -jim jonescapo -jackier obinson -ja siri -j bf -ism raceway -is sf -ing space -hou renergy -hindr ances -hay dee -hann is -h fuji -gen erico -gar ak -filli p -fe ssenden -fan boying -enor me -em placement -ec tin -dow l -dont miss -dms guild -divis adero -di sher -demarcom urray -debau ched -cs ds -cont actor -com ingof -cher iton -ce mpire -bo ilies -bo dd -blade andsoul -black all -bbclocal ite -av ito -au riga -asa hi -arizon adot -anton ine -andre s -amar ket -( âĢ¢ -ðŁĴĶðŁĴĶ ðŁĴĶðŁĴĶ -æľĢ æĸ° -ãĢį âĪł)_ -⼠º -à¸Ńะà¹Ħภ£ -£ ¨ -zef firelli -yyj arts -yu mmmm -yar darm -ya semin -x ri -world tv -wild lings -wi dgeon -whel ks -we stra -vir ile -up selling -tru enorth -time forchange -thor ning -the montydon -thai day -th june -tele mundo -surrep titious -substanti ate -su dip -steph breakfast -steier mark -steel heart -st dm -spar ta -shu ja -sha ista -sequ in -se tubal -salisbury cath -rubb ings -rollsroyce cars -re formulated -re ath -quanti fies -pur ity -pro pan -po stre -par abol -op ent -on ye -neil son -neal mccoy -my protein -mx f -mue stra -mr george -mou at -morpho genesis -modic um -mo dic -misidenti fied -michael jordan -mia universe -mer n -melbur nians -mel ded -man tooth -man kin -mac master -lou cks -litt leneck -la sk -kri sto -kpr clocal -kipla gat -ki gali -juan fran -jared kushner -jab ong -idoli zes -idesof march -i the -hun ny -howtogetaway abc -hospital isation -hn tb -hiz bullah -har pal -han sel -gy da -gun dar -gordon stoun -go bows -gerry mander -gang aa -friday focus -fly half -el h -eco school -ea sia -domain name -doing business -desh one -der ic -deni ability -debt free -day u -d itta -cush endall -cun nington -cud joe -cu ssons -cor rode -con gos -christma seve -cat rin -cast ag -carfag no -car ballo -caci que -c saba -buil ders -box of -bom beck -boe ken -beparto fit -bel lotti -barber life -b zh -b fa -autumn statement -ark hu -ard ha -arch a -ar h -analog photography -alban i -ak bari -aeron aut -ad cruz -aa viation -a abb -? ): -ðŁĺİ ðŁĺĺ -ðŁĺį ðŁĺŃðŁĺį -ê± ¸ -ล า -Ñ Ķ -zon go -zakhar chenko -y pn -won do -women sbball -wb tourlondon -wann see -vo well -vig eland -un sympathetic -un ilife -un coupling -um bel -tivo li -thibau t -the arts -techno crats -te ti -tal ente -sugar rush -sto i -st immung -spring has -spirit of -speed art -southern mis -snoo zin -sil ene -shul kin -shu pe -shoul dering -sh su -sen dero -se ery -scare dy -roy moore -ro vi -rann fl -qi yah -poly chae -phi pp -partic k -origin ators -oleksi ak -ne shat -n irs -mur ri -mr porter -morgan ville -mon dy -mike schiemer -mi fi -met zen -me ers -mari do -mar nock -man olis -m ny -luncheon ette -lud lum -lincol ns -le akers -ku bler -ko viÄĩ -kit tredge -killing sworth -ki hara -ju mble -ju cy -jay lin -jackand jack -j hr -ital yday -ish afoundation -ir regardless -ir ani -iono sphere -inter states -iman gel -ifi were -human ness -hri sto -ho ess -hick ox -gv m -goback modi -gill ings -gil key -ged ney -full time -fluoro carbon -fail ure -ex arch -eric hard -ent rapped -elliot ts -el zhi -eh ner -duci dni -du par -digg ler -diff rent -democrati sation -dc s -david love -datdu debp -culp ability -coffee bean -co yl -co ston -clean seas -chak de -capri sun -cad dis -bu ari -bry her -brock ley -bro ich -bonniemc kee -bo ey -blin kers -bel and -bari atrics -bar ad -bagu ley -at large -arri vo -and wine -all ter -ak tien -ag ario -abi erta -ab ike -aad c -ðŁĩ ° -á¶ ł -à¦ Ĺ -édou ard -ze ist -yout u -yor chard -y azz -wo bbled -with syria -weather authority -we heart -wan chai -vo ynich -usk asing -un selfishly -un encumbered -ul ly -ts arist -tofthe month -te cla -te americ -sp hil -sneaker pedia -sku b -si kit -short lived -sch rodinger -sas kag -river kings -reson ators -re ordering -rashmi kamand -random ize -push button -pri ons -pre party -portrait challenge -phil lauri -pha go -people with -pee ked -pat man -oste ology -onthe spot -ontari ondp -onair romeo -omni pollo -nuclearbla steu -nu un -nsc c -mor lock -model trains -mccl urg -maxi mization -man ser -man jit -man booker -lud wi -lit as -lisal oeb -lin enews -leop ar -lennon nme -lb su -lag man -la skar -ko lod -kingdom comed -ke uk -kap uskasing -kan eda -kal kaska -k jl -john sburg -idoli sed -ide v -i muk -hind head -hem nes -ha ins -gazette er -future s -fox x -fox man -fore going -fjord norway -first snow -ff ington -expun ged -esp in -esh re -end humantrafficking -en tailed -embarrass your -ele an -dro x -drmike murdock -dow ska -di radio -def jam -deben ham -danede haan -cor darrelle -community garden -col clough -cochin ita -clear out -church man -chil lest -ch aley -cas sel -c siriano -brook sby -bron y -bo cking -blind cat -bi aus -benig ni -bat ton -baskin robbins -bang ko -bag gie -axi oms -aund h -as ba -artu ria -ango stura -and real -amwriting scifi -adobe premiere -absr dnews -abse con -: âłĢ -ðŁĵ½ ï¸ı: -æ ¤ -z auber -workout motivation -wood stown -will hill -we ste -ve don -var ta -under wear -under insured -un gal -u mofficial -tri ot -tou rers -ton go -tiv at -tish man -tic s -ti gnor -the time -the ic -tej eda -te emo -tatu aje -t acy -sö der -sur anne -space museum -sou lection -soci ali -sm ys -sky watcher -sense of -secret garden -sde france -s studio -rho dolite -rene au -recru iter -ran vir -ra oul -protom artyr -proof of -produc tive -priz ren -pretty woman -pe can -park chester -par in -opp ong -music studio -mun z -mis laid -minu ets -michael angelo -mic o -mathis fun -mar wick -mal fi -maeyoung classic -lee anne -l cem -kn h -ki ren -ki am -job vacancy -iwant one -ip cpr -inge xpo -ilu sion -il ament -ifl science -hutch ens -he parin -haryan vi -ha sani -gleneagle shotel -gir lup -ginny goodwin -fu z -frit ts -fin ito -felicity huffman -fan sn -fair hill -encroach ments -el of -e town -dö ner -dow dell -der ksen -de pasquale -czecho slovakian -cox ed -coming up -cholmon deley -centime tre -caz adores -cambi um -bur dwan -bun z -bug ü -bu gli -br amb -bo ell -blu rofficial -black fire -belle vu -beauti fu -b mbf -b cause -augu stan -atal ant -al shaq -airdrie onians -a experience --- ( -ðŁļ¶ âĢįâĻĤï¸ı -ðŁĺŃ ðŁĺĺ -ðŁĮ¿ðŁĮ¿ ðŁĮ¿ -ìķĦìĿ´ ìĺ¤ìķĦìĿ´ -ê³ ł -âĹ ĺ -ঠ¹ -е л -ál bum -y vel -ww jd -wrath ful -wil i -wal is -vampire the -v ys -un molested -ul ars -tri aled -train to -tok ki -to tty -tn leg -tech land -team red -tar jei -summer bee -steam newrelease -ss ow -soor ma -somers worth -simulation friday -sie grist -sho velling -shag ging -servic ed -sax a -rom ford -roch dal -riv alling -ret te -regre sa -real martin -ras gulla -pru frock -picto graphs -pi ad -phal anges -parachu tist -paddy mcguinness -pa iz -out eni -oo zed -ny arla -nic anor -natu ur -muse i -mu ddling -mu ad -mr teller -mo sis -mitro vica -mispron ounced -mele ch -mechag odzilla -me es -mar soc -mali m -lon avla -lin sanity -le usm -lam elo -lake garda -kir at -kal ka -jo bi -indianoil cl -in brotherhood -hippo griff -hee jin -ham worthy -green spring -gor oth -gil ham -ge bran -gast rectomy -fe stu -es miles -easy recipes -du mble -dj shadow -dennispra ger -d ils -crimin ologist -cork coco -cop i -compa ñ -come stible -chou teau -chi uni -chagu anas -cas ali -bur sle -bruce willis -book mail -black lab -bint aro -benefit uk -ben dera -av or -at us -angu sti -akhi lesh -adam ski -activ ites -ðŁĴĹðŁĴĹ ðŁĴĹðŁĴĹðŁĴĹ -ðŁĮ± # -ê± ¸ -ç§ ĭ -æ´ ¾ -âļ½ï¸ı ðŁijį -yo shis -ww d -wis d -wage red -vishnu vardhan -vis cardi -ve k -universit ät -underthe sea -tin plate -thewhisky agogo -thec ct -the writ -terry pratchett -tech ne -team no -team fortress -tch ouk -st birthday -squ am -slim ited -sli din -skillet music -shopp ers -self defence -saxmun dham -sa ipa -s van -ru sky -rosel awn -rene sas -reen actor -re classify -radnor shire -pupp i -po dunk -plu med -plat ja -pic tus -perpe rennial -par sec -pan chi -p ined -ou saf -ori el -om al -oldd ominion -now available -no st -nga io -neu chatel -nepen thes -nca af -national french -mo dc -mid nighter -micha elek -michaelek lund -mc nee -macron utrients -ly kes -looooooo ool -lim my -li bin -land shut -lab ine -la ar -kron wall -katat onia -kad ha -jonath and -j annis -it stony -inner visions -immort elle -imer ini -ig ur -homedecor ideas -him ley -hert shour -hawk sley -hard point -har perperennial -han auer -gyp sophila -gradu ationday -gow land -girl gang -fy f -franç oise -foli ate -flogging molly -fil adel -enjoy ably -empor io -echel on -e zi -dun cle -dr michael -dp ms -daysof blackcosplay -dau gav -darren shan -d se -cri sing -cri bbins -contamin ates -cn traveller -clipper nation -cinde rel -ch ye -castell ana -carly aquilino -c vs -breath itt -brass eri -boston comiccon -bor delon -blon din -better makeroom -benedic to -bathy metry -bal tz -bac carin -au gen -aster y -asic samerica -as thana -alekh ine -acci esfc -( [ -ðŁļ ® -ðŁijį ðŁijĮ -ðŁ¥ £ -çĶ ° -âĢ¢ ~ -z s -z ette -young boy -yan ko -women supportingwomen -wat l -w bir -virgini awoolf -veer u -ultr amodern -tu ur -trun cate -tru ef -tri pe -tof te -te cn -tape worms -tac tix -ta pley -sut til -strong side -stratfor don -srisri u -spec kle -sp art -sim cox -shannon bream -shal it -sc lay -sam r -ryan leslie -royal visit -rond out -rol lovers -roc codi -reis z -re dragon -rath down -r thk -qu ello -pre science -pen ha -pen do -patt ani -ou thouses -on nnn -oftheyear hma -ob t -nigel barker -new church -nau s -nan tuc -nadiaz anelli -n spra -n mn -mustang nation -multi drug -monster monday -mon ch -mo yam -migrant sday -micro blogging -mel robbins -medi vac -mecklen burgh -me dak -max pain -lun i -lubav itch -lock ridge -liver disease -leed suni -l arios -kil twalk -ken naugh -ke mlu -katsu shika -kat anning -juxta posing -je ay -jaz baa -jal gaon -jac co -ilike samizayn -ide c -hic hi -happ s -h km -h ci -gyna ecological -gow ans -gottacat chemall -good work -gene wilder -g tourney -fu qing -fresh prince -farn don -famili arization -fairground snola -e chev -dul verton -deer hurst -dam ie -cro z -cou par -correspon dences -compe tion -coc ci -chu uya -chin skiy -chenonce au -cbr ne -car na -c cat -bu suttil -box fish -bon jovi -bin u -berk off -be ere -be com -bbc surrey -bai ze -b johnson -astro physicists -aden auer -acqui esce -acqu it -acomic con -ðŁļ ķ -ðĿĹ ľ -ä¿ ¡ -è te -yaari yan -va ghela -use fully -up asana -trudeau mustgo -transport ation -tor ock -ton kinese -ti os -thusi ast -theatre ldn -teab agging -taym or -take a -super powered -sun birds -stru b -stefano gabbana -stand on -sp liff -sp ersons -sp ds -sl int -sidd al -sher pas -roa sted -rid ler -ri gid -rheu matologist -quis ition -proro deo -prophe sies -pro static -prithvival labh -preste igne -perfect gift -peniel shin -paw ling -pan get -osle isure -osiris rex -neon ate -national trust -mrs browns -mgsv tpp -merci an -may nor -mar cher -maquo keta -man by -mall inson -lo kk -lis gar -la sley -la ho -kwq cnews -kir ya -ke vo -k lee -ju se -jebe diah -jagu are -ja ib -ing man -igh tham -iam dr -i osis -hu day -ha yy -gwand shows -gun safety -gov mattbevin -gondo liers -gilded balloon -gen u -gar di -g fd -for hillary -flo ssy -flo bots -feel ies -elvis duran -elrey theatre -edi ger -dri ss -dram as -deton ates -de broy -dad os -d sey -coy gig -chro mis -charge back -chapelhill shooting -canadian opera -cal vet -ca hier -buro happold -bu ton -bru ery -brawl stars -bra ine -border patrol -birmingham pride -beth nal -bait fish -asqu ared -ar ue -aon ach -aldubin italyday -al dia -aksh ar -ablu tions -ðŁĵĮ # -ðŁıĢ ðŁĴĻ -ᣠĴ -zacchae us -worldbook night -wil fried -west king -wat ere -wasi lewski -vent ers -trac on -tony pandy -thene ed -sy re -swe ene -sw offord -super majority -super mac -sun it -suje eth -style by -stu voice -state oforigin -ske wing -sj sj -shey enne -sen ge -school master -sch itt -saf mradio -ro secity -ric kowens -rei vers -r saf -puru lia -prep star -pon tos -photo album -pharo ahe -on at -omni potence -office dog -o townofficial -o cul -native breeds -nam askar -nach richten -my fwc -mor phia -margare ta -ma aaaa -lon gy -lin ka -lang worthy -kra hn -kale v -instac ar -inser m -hyper ventilation -hopen ot -hale wood -hah ne -gre aser -grand tour -grac eville -gon zo -go via -go bel -fun atwork -free mind -forbe stech -fold sofhonor -fiji airways -end ry -emo sh -elly se -elizabeth warren -ec is -dush ku -drinkal sace -down with -dit or -dialo gic -dg and -devop ssummit -democratic debate -dele tions -del sol -death rock -dat acom -dal zell -cute off -compu ter -ci vita -chum phon -chemain us -californi adre -bro ten -bou ch -bosch global -bor r -bon ta -bhatt arai -bhar vard -becau sey -be scot -bal ks -bal ama -bad chicks -ay ato -at rade -as kim -arro yo -agil bert -adam cole -acou sa -ac ist -a eda -ðŁĺ° ðŁĺ°ðŁĺ° -ðŁijĮðŁijĮ ðŁijĮðŁijĮ -ðŁ¤¦ ðŁı½âĢįâĻĢï¸ı -íĶĦëł Įë -ا Ûģ -zeyne pab -zan ski -zack y -worlds best -wool ard -women schampion -wom bourne -williamj hague -will l -wad ham -vari ances -va q -v angel -ukcoach calipari -uconn football -u oy -tten nis -tre sco -to pre -thisi sn -ther ob -terran ce -tam ie -swa im -sun foil -still withher -st aser -spoke smen -spencer ville -south wards -sheldon ian -seac at -saltwater fish -room ed -roman owski -rob art -receip t -re shuffling -rd grade -razor blade -ran j -pyrr hic -play dough -pide mia -par tey -par menter -p batour -ou in -oooo ps -on ald -om ish -music in -mur ci -mo gami -mispr inted -misanthro py -mine ers -me iling -mark land -m smith -liv cathedral -lex an -le ane -la fia -ko daly -kit chee -kir sch -kids first -jan cic -ite mized -ini go -img academy -icosa hedron -human itas -ho soda -hi was -he wes -greatcomet bway -german yin -genuin eness -gentle mans -gaz al -gau zy -fun tastic -fm j -filmin dustry -fbun ational -fa enza -est at -enjo ined -eh den -earth sci -e ffa -drew gulak -dow ni -do ti -div y -der oy -demon ic -cy cad -crowned heads -con text -con nally -clu te -christi any -cf g -catandu anes -canecor so -bt me -brussels attacks -briti an -book art -block house -bett in -balu sters -bacchan alia -bab ich -b awards -ash eville -ap ix -ago da -a eu -- âłĢ -ðŁĻĤ ðŁĻĤðŁĻĤ -âĿĦï¸ı # -âĻ¡ " -âķ² âķ² -ઠķ -ÅĤ o -yemen crisis -whe ath -water conservation -wa iner -vir das -vic ent -viad uc -vermel ho -vent agli -vas ko -vamp y -union station -twin ed -turn again -tunder ground -tu lio -tu azon -tomy future -the brand -the better -th ark -taun us -tal aq -tak acs -t sle -syracuse chiefs -swith amazon -stu gotz -stom orrow -sri mad -sm kc -simpl yaj -shan em -se os -se alions -sanc lemente -s meal -roby ns -rib oud -repri sals -recalcit rant -re states -quar ies -q eh -promo cion -plo it -play listed -pine grove -pin edale -party in -paraly zes -open call -op tionally -offici ates -num erically -now lin -nov itiate -new designers -neer u -ne mec -myco plasma -mister giuntoli -mil stead -marcel kittel -mag ician -m fat -look man -lat ah -lang i -la ville -la ury -ktv tamil -kra vet -kor ona -kis d -ki ai -jim breuer -jax on -indi g -hight stown -hei der -hard wa -ham ida -ha jj -ha insworth -greatday tobe -ge bre -gabbie show -friend sforlife -flori bunda -ferment ers -euro sport -es el -epic urus -engel mann -elo cution -dor tch -dj jazzy -da gher -d á -d illian -cuti eee -cup w -crp findia -consul ta -com res -collective evol -ci dg -chur ns -chumb awamba -char lier -chap eron -cf adden -ce arch -bru mmell -box ed -book talk -bla upun -be ja -bar acoa -back sliding -aver ts -audit or -at gm -apri ze -an day -amelior ate -alo se -addis combe -ab bate -: _ -% ( -ðŁļ¶ ðŁļ¶ -ðŁĺ³ ðŁĻĪ -ðŁĵļ ðŁĵĸ -ðŁĴĻ âļ¾ï¸ı -íķ © -ãĥ©ãĥĸ ãĥ©ãĤ¤ãĥĸ -Å¡ a -wroc ÅĤaw -workplace safety -wex gaa -wakat obi -unc charlotte -u ws -twic ulate -truthor dare -til lett -ti ma -thisi swa -ther y -thanks forthe -tal ley -syco phantic -subsidi sing -stopthe bans -standard bank -sri xon -spring awakening -spin out -sp outed -son ship -si ma -shra van -shel p -seok ang -sak ha -s enda -ro ki -relinqui shing -recre o -re vers -re interprets -ram se -ra so -preservation ists -pp ms -pac bio -p nj -oh pa -ob it -ny rb -nottoo young -nonleagu epaper -nichol ls -new wave -nancy sinatra -n phs -n lo -mum life -mou vement -motor park -mo dak -mo ama -ming kki -mik kel -mick o -mi mar -mi drash -meli ora -mcmick en -match boxes -mase field -mac donald -ly all -leot ards -lasvegas shooting -la hav -kon st -keeptexas red -juli usc -jointeam alpha -jar mo -j ila -inner city -in ala -ig uns -hy les -heartsof oak -hear ses -haram ain -hamilton island -guatem alans -gil boa -gh d -gb hockey -fri berg -flori daf -fe tid -extrapol ation -estac ado -erne sto -eddi evanhalen -dragonball fighterz -dragon stone -div aio -diame trically -df bharvard -decrimin alizing -dais ley -d ites -ch ko -cebu ana -cas elli -carri acou -cardo za -ca pet -bur qas -bru it -bridle way -br yl -bir tley -be toys -bais den -ax xx -astru c -as ophia -as lo -artist center -ani moto -af shin -adam stown -abra sions -ðŁĻı ðŁĺĩ -ðŁĺ¢ðŁĺ¢ ðŁĺ¢ðŁĺ¢ -ðŁıĬ ðŁı¼ -ðŁİģ ðŁİīðŁİĪ -íĶĦëłĮë ĵľ -ë°° ì§Ħìĺģ -ê³ł ë§Ī -à¹Ģ à¸Ńภ-young buck -vol com -ver itas -vam shi -ty mon -twi xt -twe ener -toxopla sma -tom riley -toby keith -tho sp -the de -te tt -tales of -suicide squad -spend in -slo at -sling sby -sky one -sjo gren -school innigeria -rv f -ru ffs -rtx rt -rfd tv -reden bacher -re past -rat as -rai b -quer cia -pu ku -principe ssa -presiden to -po tage -po stive -over acting -or uk -of lu -ode brecht -naruh ina -myprotein uk -mckis sick -matriarch al -mar ito -mand vi -madrug ada -ling ling -kin ko -kai bab -kaf a -k wave -jon favs -je g -janh vi -inau t -im pulse -ilove u -ih in -hoo oo -hoo ge -honey z -heck mond -he ita -hallucin atory -gu zzo -green horn -girard perregaux -gee zers -gadge try -fri son -foot way -erotic romance -ent onces -en trance -en shrine -el mina -ec centr -du mer -domestic workers -dok lam -dj danny -dis quieting -dis continuation -din is -digitalleader sa -diap ering -deleg iti -dav adi -d me -cow dray -copp ens -con tru -clair vaux -cf ps -cav endish -cate chi -car ina -car agh -buster love -boy shoops -bhu pend -aw restaurants -auto body -atlan te -articul ates -arri etty -an tero -amur thy -alde burgh -aic ha -adel hills -academ ical -ab negation -(^ ^) -ĸ ðĿĻ -âĨ Ĺ -Ë Ĩ -yoak land -yl ancs -yakov lev -x terra -wheeling nailers -wendy davis -vintage traffic -vari ate -transdayof visibility -to pley -the gabbieshow -tan in -swimswam news -sven son -substanti ation -stat man -st birthday -sportsday hs -so frock -sixnation srugby -sin motion -sd sc -saraha ines -ro vs -ring land -recircul ating -ray com -rav ings -rail hawks -q ri -program mer -ox chambo -ot ss -on thisdayinhistory -o dum -mo graph -mind set -mic om -mar thar -manne quin -man ak -mac gillivray -lg p -lam est -knu dson -klai peda -kenny florian -ka ap -just because -jose altuve -ivan chuk -irish film -ico splay -i lea -hu ffing -horton ville -he izer -haudenosau nee -hanover ian -h atim -guer rera -gotham ist -goe tia -glyndwr uni -glaci ated -gl hs -git ana -gec dsb -gal mudug -fizz er -fin c -febu ary -fatt ened -explore your -es ns -ep ting -dot pict -dom usic -dis locations -dd newslive -danis ordo -dai fuku -daener y -curb appeal -clear lake -cbc toronto -cat ley -case break -carned dau -carla hall -bye e -build series -book sof -bollywood flashback -bloor dale -az umi -aw newyork -at ag -as oli -as ok -artist oftheyearhma -ard ening -anton ym -anthropom orphi -anne of -anatom y -anast asi -an new -alice keeler -alber talli -alai ka -al anc -accru al -ðŁijģ ï¸ı -ðŁİģðŁİģ ðŁİģ -ë IJ -é»Ħ åŃIJéŁ -اÙĦ Ùģ -yuvraj singh -yi ff -x mend -wood workers -wing ert -wanti rna -wal ch -vol pi -vit abio -virtuo sic -vir na -vici ous -val ise -un availability -tx sen -tx f -tir zah -ting u -time code -ti ant -the bige -tardi grades -tafo ya -super conductor -su ta -stra db -stradb ally -stand byme -song do -sm tg -skylar grey -sa pperton -ry er -rush koff -rural women -recon figuring -re life -raun ds -rajon rondo -port ents -pon tard -pok é -poetr yeileen -pic one -photo weather -patron ise -patric kk -pastor a -pandor a -pand avas -ot sego -omni vores -ok san -ofthe future -numb ingly -nor by -ni mh -new snl -neph jc -my poetryeileen -mus ice -min as -micro waved -micro chip -mev simi -mccar roll -mc nerney -mash ed -mark w -liv v -l annon -ks ss -kno win -kigur umi -kho jaly -k fans -jun gler -ji han -ja quet -ja ay -isti gh -ip sf -inau ghton -hmrc govuk -heme path -have eru -harrystyle slive -hang outfest -ha ddy -gru newald -gou de -gli ese -glam rock -gla dy -gif tw -gar ms -forti ssimo -for girls -fon zi -follow spree -family matters -extram ile -er adi -entro pic -emo cione -ef its -ee es -durgap ur -dom ar -dillian whyte -di bles -derri ere -de young -conquistad ors -con cour -chip sets -chim o -chi vo -chester races -chang jo -can ticle -bur gle -braban tia -bc tv -battic aloa -bas ks -bar ve -bal raj -asympto tic -asbury park -amar illa -ald ar -agr itech -abet ted -> , -ðŁĴĢ # -ðŁĩŃ ðŁĩ· -ëĤ ´ -ãĤ¯ ãĥª -ÛĮ Ùħ -y wc -x ms -wire line -wee h -ventagli diparole -ve ining -v show -tv patrol -tt ol -tri pof -ting les -tho tel -te sch -splat tering -song pop -son dre -som one -slowh and -si man -school room -sch ek -sarah h -sain ty -sad day -rubi u -rosal inda -rig our -rat tigan -radio graphic -public enemy -post le -posse ssor -poi esis -pn k -photo synth -parap sychology -par due -pad mé -op ie -ond kar -o swin -noo h -nj tv -newcastle upon -nag ore -n gala -mu sco -mode ste -mid oriya -mi uccia -media art -matri archy -mary kay -malak off -makeit rain -light up -li ath -lehigh ton -ku lik -kozlovsky d -kiz ito -king swinford -kenner ly -kees maat -kar g -k roo -k love -just transition -jo zy -j fe -innovator s -ing arden -inf ur -hor vitz -holo type -hof meister -gregg sofficial -gre if -go zags -gl antz -gg es -gb ta -g wer -g mit -forrest griffin -farra go -eviscer ated -europe ana -dura bles -du bber -drug gie -dig nam -dan ville -d hir -coa sted -co ill -ckin non -caul drons -cambu ur -ca zz -bou dhan -bio gen -benid or -believe that -ba ai -aw ash -ask twitter -ar mers -anonym ous -ana erob -al the -al pro -al adee -afranc is -action jackson -! '. -ħ ¸ -ðŁIJį ðŁIJį -îĦ ħ -ìĦ¸ ìłķ -çĻ ¾ -à¹ĥ à¸Ĭ -à¸ķ à¸Ńà¸Ļ -à¸Ĥ à¸Ńà¸ĩ -رÙħض اÙĨ -y is -würt temberg -wokeup likethis -wind horst -wim wear -wc n -wc m -wan ag -vow les -viva an -visit korea -vi ed -vel oz -vain queur -uv ella -under sheriff -tuesday shoesday -tuber ous -traf studios -too fan -those who -the ar -teh rani -te pes -summer love -states b -sta ste -spal ted -sno bbish -shar kie -shannon poe -sh ick -se pik -sc m -say id -san sad -sa hu -s dorff -royal airforce -roth ley -remb lant -re share -plu shy -play on -pg itte -pent z -pe aker -paid leave -p bo -over hangs -oo dy -olemiss rebels -ock ham -observ ator -nel da -necess itated -n nuh -morning walk -mol as -min de -mill ner -manufactur inguk -manta she -malcol mn -maj ili -ma ute -look n -le ora -label le -kü bler -ku ha -kis sthe -ki ara -joannak rupa -j scott -ital a -irish cancer -inter library -indy statefair -in berlin -ichin ose -hyper dimension -hs j -houston flood -harrell sllc -ha kim -gup te -grenadi ers -greatesth its -game pro -fu rio -fly spicejet -fire work -fini stere -ffd pgitte -fed soc -fe bs -fanc ourt -enki du -dream wave -don wood -devdutt myth -defer ring -de jah -dand elion -d hinchcliffe -con gra -clemson tigers -ch retien -ch itten -ch assi -ceru tti -ce b -canvas back -call eri -cad wellpark -cab infe -bro aches -bon nin -bk d -bin chy -az ules -ays garth -ay ee -athen s -as mbs -aru ban -ari ffin -ar uk -am rap -all inclusive -all hiphop -al die -air tran -afro basket -abor ts -ab ounded -@ - -ðŁĺĤ ðŁĺĴ -ðŁĴĽ âĿ¤ -ðŁij ² -ðŁ¦ Ĵ -ðŁ¤ ¾ -ðĿĻ ĸðĿĻ -ë´ Ħ -é»ĦåŃIJéŁ ¬ -âĿ¤ï¸ı ðŁĴĭ -â̳ , -ÛĮ ر -Í Ł -zi arat -yoshi o -xia oping -x wa -wether ill -welcome tomy -w wn -voc ational -ve endam -v league -usp sa -un questioned -un counted -ucla health -ty le -tor rilla -thé âtre -tas o -taran is -tampabay rowdies -tal u -stro mat -start les -st ca -spend thrift -snu gs -sm m -slobo dan -ser fdom -se fo -scifi fri -science spo -sanger institute -roccodi spirito -rc p -random ization -plac ita -pioneer woman -pau wels -pate ley -palo alton -onetown oneteam -ohi om -obi m -o gni -nw sc -night in -new sm -naz ri -mrdan walker -mothersday gift -monstr ance -mi stery -mashre q -ma or -lene han -kur land -ku bik -ki kim -k gl -joey ryan -jason mohammad -jamaic a -interior style -indiegam elover -im modest -ik aw -i hat -hyper cube -hump ty -holme sdale -hod kinson -hk jc -hemi spheric -guigno l -granad areports -gran te -glon ass -g djb -fra port -forte an -foresth ill -fli pping -flam b -feed thefuture -experiment ally -estim ators -er manno -eo sio -e bury -divine mercy -distinc tiveness -diaspor ic -delhic apitals -dc wx -cv h -csu sm -cray ton -coon an -colom bo -chris ber -chak an -chai fetz -c fw -buy ck -bri j -bre mbo -bou zouki -be sty -barry wyman -as me -art glass -arrog antly -apologi a -any as -antony cotton -amon te -amar is -am ining -al aphilippe -after hour -ad resse -accor ding -ðŁĴĥðŁı»ðŁĴĥðŁı» ðŁĴĥðŁı» -ðŁIJIJðŁIJIJ ðŁIJIJ -⾨ ðŁijij -Ã¥ le -zu manity -you make -yearswith out -ye lection -yas ar -wine pairing -wi ffle -weekly chris -wee ee -vo tol -var vara -ud ta -touri smb -thi steam -that matters -temer loh -sw mrs -strac zynski -so ory -so hrab -sky lit -sho red -san tis -rip saw -retro s -rem nick -re breather -re attach -re appointed -q tip -po cruises -pen at -patho logic -par ichay -pang ong -neiln mukesh -nawab shah -mye verything -mor na -mo hun -men inga -mc gibbon -mar ins -mann ington -mall o -ly rik -lor dan -litter ally -lamar que -ko haku -kew science -ket ches -k pol -juli ef -jap onic -it ches -ir ano -inver keithing -inclusion ary -imti azali -il ite -high flyer -happy times -hant scricket -hani ya -han kinson -h ma -go lovin -get n -füh rer -fou che -fl on -exoner ate -entic ement -engv snz -englishri viera -emp tive -e fre -dz mm -do don -di pan -der mo -de hn -dale e -dak o -cun o -ctvnews vi -con vocations -ck x -chriso cearch -charn wood -cathao irleach -capit ulate -cac p -cab over -c elife -bun ya -brue gger -book ers -bon nier -bang olufsen -autisma warenessmonth -arc gis -and relton -an fer -amo han -amdiabete sassn -af oo -ab m -a stig -a jai -ðŁĺ¢ âĿ¤ -ë³´ìĿ´ íĶĦëłĮëĵľ -âĿ¤ï¸ı ðŁĴĻâĿ¤ï¸ı -ह म -zoom ies -zo is -zeynepab dullah -your welcome -you them -year with -yard sale -whathapp ened -wedd ingo -wc ps -w shed -ving t -vic ary -utu san -us arm -ugar te -tom ate -to ten -tin da -ti angu -thomas mtv -thelu mineers -su ya -steven rinella -speci fiers -ske ete -sk ru -sign posted -se bts -sch ut -sar son -santi am -sam ahan -safe hands -ry ou -rock xx -ro get -revul sion -resi d -re tooling -re ple -radi ophonic -r fafighting -pol lies -pf aff -patriot sfight -party bus -pal afox -pack age -ott ley -o zan -nor k -nice comms -nh se -nevere ver -multi point -mu kesh -movie posters -molen beek -mil ward -mid nap -mick jenkins -men tosa -medemb lik -mber gen -mb ag -mas ar -manu fc -mane ki -makh ni -maced on -love gwendoline -li sowski -lafour cade -l cb -kol lection -key biscayne -kar son -k dr -jo bo -j ope -insu fficiently -inol vid -ing on -ing lives -inde mann -hy pn -huuuu ge -high tide -hel mick -hari ini -har alson -ha wes -gy ar -gaslamp quarter -fer ulic -farah zeynepabdullah -fa aa -ex pul -es al -equatorial guinea -eo tters -empire ofthe -elie be -e wo -don ts -deme sne -de paola -cu o -convers as -convers ant -claiborne farm -chlorop last -chi odo -chand an -can ape -bur net -brutal ities -bio chem -bin ford -biennalear te -bibi ana -bernas coni -azz ura -au ber -ar pan -anuradha pura -anton ini -an kur -alcal de -al gha -aflo or -'' '' -ðŁĺı ðŁĺıðŁĺıðŁĺı -Ù¾ ت -zy g -yy ceats -wol v -wi di -whale bone -weare mg -water week -villa vicencio -ver in -va jazz -tre the -thisweek in -thefutureis female -the chef -ter rel -te waar -t pr -sujeeth sign -su lay -spon d -south wales -so ami -sh ko -se idl -sc rowder -sag s -sad u -s science -row les -rockingham uk -returno f -qu avers -pro mesa -police women -po kok -pet terson -pa as -or jan -only badchicks -off broadway -nwc fl -nsw labor -noble woman -no control -nic asio -my sskin -music to -mo hin -mil ord -michal is -mckit trick -mari ann -manit ob -m sau -love yall -letgirls learn -lakel ouise -kuro o -kni ghting -kel laway -kashi wa -judi dench -jon benet -jessiej decker -janet lynne -in dro -ilo vela -il ar -icon forhire -i blis -ho eness -go ans -fun palaces -fre port -finn skata -fil ion -fare ast -ev y -elasti girl -ei fs -digital uk -di gue -di bb -dar gan -czar ina -cy rene -cre ggan -cr da -cor ra -con nelly -chan y -ce elo -caper ca -boysand poets -border lines -bol lettieri -blue plaque -bar isan -b wc -b life -avi ano -av ang -auden shaw -amoe bamusic -american eagle -acro phobia -ðŁĺĤ ðŁijĮðŁı» -ðŁĺ± ðŁĺŃ -ðŁĺ« ðŁĺĤ -ðŁĵ Ķ -ðŁ§ľ âĢįâĻĢï¸ı -å¿ Ĺ -âľĪï¸ı # -áĬ ł -н а -with confidence -wh ooooo -vu ren -vik ki -vie ille -uru guay -univers als -uk garage -uigh urs -trans mute -tr ys -ti dd -theme parks -thaic ave -tent acled -t suru -style inspo -stani forth -si yah -shar ris -shah zada -sell ick -selfcare sunday -schwe iger -scar olyn -sas co -sak ta -sa jal -rosar ia -ric kett -r ale -q asem -power apps -pir ri -peter crouch -peculi arities -pap ineau -over stay -out strips -orange man -opto electronics -ny er -now isthe -no win -neu star -mur rays -mon serrat -moisturi zes -mg u -mcgi v -mat ai -mam un -main ieri -lu ft -lolo jones -land marked -lam anna -juli antina -jallian wala -isee you -in ki -in icio -id om -hurst pierpoint -heat ing -had lee -grey water -greatest leagueintheworld -gorgon io -good beer -go girl -globalnew sto -ga si -fording bridge -fla vel -f ally -estro gens -ell ingham -elder of -ef ya -ed lund -dod dridge -di ger -de mentors -dah lan -cuad ros -cu x -cro fter -chikar apro -charl bury -cape coral -canadian army -border s -blow ing -big gies -beng tsson -bel in -bank rate -av ary -ast ros -aspin wall -ash by -as wan -arrow root -animation dev -amazing places -allegi ances -air box -aff ton -acu shnet -aaa al -a jaz -ðŁĴĸ . -ðĿĺ ¢ -ðĿĺ¢ ðĿĺ -ìĥĿ ìĿ¼ -âľĮ @ -âĺºï¸ı ðŁĴĸ -à¸Ħภ£ -Ê Ķ -ô n -y nares -wmn hist -weid mann -we sh -wb g -voi ding -vis ca -vast o -val ette -uni que -unex citing -ty ana -tv fest -tutankham en -tt chelps -trip to -to see -tell eria -team nl -team gaspari -taly bont -swo ons -sugar cubes -sub bu -sto ya -slo fficial -sla ver -shire brook -sham okin -schu ett -san oma -sail cloth -royalairforce uk -ro ids -r gu -proto typical -pro bly -pork belly -pon orogo -plesio saur -plau sibility -pin chas -perro tta -peori achiefs -pen ic -pe kar -pathan amth -pas ch -parks rec -pa quita -newcastleupon tyne -neal brennan -n ze -minic omic -metro stars -me ghana -me chas -marketing land -marit imo -mari ad -magic fm -ma hel -loon athe -lo ei -life inthe -lemon de -le mmer -kro ft -juliet landau -jinder mahal -inti mated -infe sting -ind ilens -in compatibility -ii ight -i irc -hydrogen ation -hooke don -ho wol -hen in -har ip -great schools -grapp led -go bind -geb bia -garri gan -gareth cliff -fou n -fashion model -fab ula -exal ts -ex upery -em oments -dur rell -dou bloons -dl rcc -dis figu -de tt -cur dled -cre swick -conceptu alization -colour ings -claus sen -citys c -cis ne -ciné ma -cb cradio -c ón -c sio -bus boysandpoets -bru hits -bluelive smtr -bloem endaal -bi dd -bh lib -bed sit -be twood -be tong -bbcred button -as man -ar twiculate -ap ca -anth on -am ran -am orosa -am molite -alo to -alfa jor -al tro -ahu t -agu adilla -ade pitan -aag pbl -ðŁĻĮðŁı¾ ðŁĻĮðŁı¾ -ðŁĺĬ ðŁĺİ -ðŁĺĤ ðŁĻĦ -ðŁIJ¶ ðŁIJ¾ -ðŁįĵðŁįĵ ðŁįĵ -ï ĥ -ç ½ -â ¸ -zar doz -yougo girl -ymc as -wr acked -women tech -win ther -win big -wifis funeral -wel low -we we -visit noosa -un tiring -un shackled -un romantic -un pronounceable -tur keye -tric losan -tothe people -to wy -to di -thriller writers -the muppet -the money -ten ser -tan an -tack ling -stron gest -stri e -ss bn -snow bell -shu jaa -sho tel -sett in -save daredevil -sarawak ian -sac rosan -sacrosan ct -rspb minsmere -rotor craft -revol ve -re ordered -pu st -propert yoftheweek -por twine -ponder ous -plateau ed -pel z -pan mure -or ville -or dov -or am -oo sten -of ans -nor gay -niek ro -ni blett -nati v -msu ext -monsie ur -mj ölnir -miss gem -miner vois -mer pol -men ier -may enne -mati vity -mascot te -mar uf -mar ani -mad h -mad decent -m night -living ston -law lz -laut aro -kill menow -kad en -jfk airport -jc mo -jagann adh -j gp -itstony bennett -ine qu -ig aming -hyper cholester -hofstra u -gosn ells -gold hawk -gior giom -gil crease -flo m -fla pped -fau chon -es m -epo c -endeav our -emmy lou -echi um -dontb omb -do ering -den ly -demi gods -daw i -darab ont -cycle ways -colori sts -colonial pride -cold cut -co ilovers -cli ving -chow chilla -cho pped -chin ar -chicagom usical -chat elain -car mouche -buffe ted -black letter -bir dr -bi utiful -bev ington -belly ache -bel lu -beh ring -bal lew -b bog -azz opardi -asymp tote -arnold schwarzenegger -apr incipal -am ole -a ans -ðŁĻı ðŁij¼ -ðŁĴŁðŁĴŁ ðŁĴŁ -ðŁĴĻ ðŁ§¡ -íĥĢ ìĺ¤ -ãĥ¼ãĥ Ń -zo oniverse -yeee ah -winter games -white horn -wand wmusic -wal sch -vote thomasmtv -vill amaria -usd learns -ubiquit in -triglycer ide -ton n -tit in -threl fall -the mars -ta ft -str ously -ste cher -sor oti -snarky puppy -sha han -schre ier -sc ai -say i -saw amura -ru der -ref ill -redbullair race -re matches -pro sec -pray ingfor -pp ur -pointe dly -pay kel -pau sch -pat ni -parti zan -parrot let -paren thetical -pac elli -out fall -odu sports -obstruc ts -mun du -milleni um -mel gar -mar dyke -mame town -mam aw -ly cans -love sick -loose strife -lin tels -le uc -lawson official -lau toka -l ura -kour nikova -kindafunny vids -k ns -ju dic -john williams -inter solar -in kosi -ic orp -hb ddar -har ton -ha fe -green burgh -gom ti -gi gha -gar gan -ga shed -ga aru -g mn -fu trell -foxnew ssunday -floridian creat -fire news -far rant -fal ci -expression less -esof tball -endodon tist -ele gies -elderof ziyon -eg ba -denis coderre -decad al -dar ting -cro pre -cro pp -ci vit -ci az -cho wn -charlize africa -cdn tv -candycrush saga -blood stains -big machine -bert kreischer -below deck -bellin zona -bbc somerset -baltimore uprising -ay lestone -at official -alle m -ale ena -ai z -ah sa -abyss inia -ab hisar ->> @ -ðŁķ¶ ï¸ı -åĿ Ĥ -ൠĩ -zy gous -x rays -wal don -voc ation -valen cian -uwh uskies -uni sport -un hurried -umb c -tu dou -triplic ate -tr é -tony kanal -tmobi learena -the tony -tel com -stra dio -stom y -song writer -shoo ky -sheil agun -sheilagun nreid -seraf ino -scho enen -sam bhar -rspb birders -rival smike -red act -reck ell -ready for -re distributing -re dedicate -quotes forlife -pit ying -pf sense -paul weller -pa zo -p mu -ou vindo -oren burg -nws bayarea -nonchal ance -nolla ig -nihon bashi -nicol ay -newfound landers -neph rite -mushroom ing -miko yan -metho dis -mer cnews -mende leev -mcl ars -mccri mmon -mc sherry -mag loire -ly ster -low boy -lo pam -lam pley -kul p -know it -kier on -kar ly -kab lam -jol liffe -jay baer -iri st -iri ga -instinc tual -inclin ations -in line -high note -herni as -he yarnold -hartz ler -happen shere -fun day -exp ounds -et nowlive -ers baseball -en et -emili ana -em ps -el ice -e hi -dun smore -dra enei -dor mont -distribu ted -der v -cta flash -craig smith -constitu tionalism -con soled -choose cruz -cer ta -cel led -carrie ann -but ner -bro mel -ble ddyn -bienven u -bbc music -bar kov -back kk -ba injal -ay ak -av endre -auto logous -at ago -arru pe -anze kopitar -any am -anantkumar h -akshar dham -afternoon tea -afric om -advance auto -ad era -achrist mascarol -ac fc -aar thi -aa official -+ +, -ðŁĺĺ ðŁĴķ -ðŁĺ» ðŁĴķ -ðŁİīðŁİĤ ðŁİĪ -æĻ ¯ -å¤ ı -à¸ĩ à¸Ĺ -world rugby -west brom -wag gy -umph rey -u chicagop -tweetapicture that -trade shows -tr ze -tepp ei -tcr no -takar azuka -tac c -tab e -t set -super res -style tip -stocking stuffer -stanley park -sn v -silk worms -shish ir -shim omura -seattle children -sarrac enia -sandal wood -sal low -sa pped -rol linson -rick wood -rest ling -recipe blog -r tty -quarter deck -pres sphoto -pil at -pe asantry -pav in -parasit ism -or ison -o zer -ny cd -nmm greenwich -nhsm illion -newlook fashion -nan or -nam anana -myco toxins -mira sol -mika il -mccoll ough -maj ka -ma shiro -lrb ht -low ville -low ns -lou lou -lo pen -lim be -lack adais -la sto -la pride -kram ers -koss off -kingdomcomed eliverance -kindergar ten -ke ef -kaye adams -ka ve -juli amichaels -joyce didonato -jon batiste -jo ginder -jo ear -ira bad -ily ich -ich wein -iback thenats -han lin -h sing -gran ulation -gra velle -gou dy -gor ging -get fit -frank warren -footb ath -fl outing -fisher folk -fall winter -extracurricul ars -eugen emir -eugenemir man -em mit -ek c -eic hel -dis associate -dhol era -dark soul -craig millar -conte h -col locations -cod champs -christmas special -cheer sport -cc tv -call anish -ca ppo -bob seger -bin do -bin ch -bill simmons -bhak ti -belo v -be mani -bar uchel -avail ble -at se -at anas -asjad nazir -ase f -aren adublin -akro polis -abo ah -*:ãĥ»ãĤļ âľ§ -ðŁĻĬ ðŁĺį -ðŁĻĤ # -ðŁij¼ ðŁĻı -ðŁıİ ðŁĴ¨ -ðŁĩ± : -æĹ¥ ãģ® -âĢĶ â̦ -à¸Ī ร -öz ge -ï a -zamor ano -zai us -za habi -yy xx -yay ayay -x ol -wool ridge -who cares -way ner -wat ters -val lum -u hmmm -traffic chief -trafficchief ng -thru xton -tholi prema -thene c -the walking -the tournament -te on -tales ofthe -take astand -takan ori -stateofthe union -sor table -sonal chauhan -ship wrights -see a -sar ria -sampo erna -sahar are -sah len -rock i -resi duals -re hire -rashmikamand anna -ra del -queri ed -putin atwar -propag ator -pre heating -pow ner -postand courier -po cs -plan cha -plain tive -pedro za -pay am -op as -on our -ol g -oh boy -official wexgaa -ny j -noto kay -night clubbing -nd p -nathan s -my at -mumb ail -monarchi st -megay acht -medical research -man cs -mali ha -mal et -lou donville -lost teddy -legion fx -lanz amiento -kpop ers -kmf dm -kindergar tener -kidero evans -khan e -kc wx -juliet telewis -jazz times -iwon a -inter actively -infiltr ators -image awards -ice age -hor ch -hc ps -gri mas -ge birge -gang star -friday mood -forevery thing -for amini -foot plate -ferru ccio -extor ted -espor te -esk ay -er rata -ejec ta -east bank -dry skin -doom patrol -dombrov skis -det ling -desi rous -dell tech -cy presses -cros scountry -cre stron -compar te -cli q -ci amis -chri mbo -chibi usa -camerat rap -cairn sgbr -c plp -brown rigg -brad t -bou w -bluem tn -bloss er -blau er -bit w -be itar -bc stx -base bal -bar ani -baini marama -bai ji -ar ow -anac apa -agribusines stalk -afric aine -................ ...... -ðŁĺį ðŁ¤© -ðŁĶµ ðŁĺĪ -ðŁİī ðŁĴĹ -ðŁ¤ µ -åѦ éĻ¢ -⼠© -à¹Ģภĭ -zz one -zapp one -z gan -yeah hhhhh -whole sale -w us -v sts -usaid transforms -ure thral -upanish ad -unite c -u dit -tim bo -templ ating -swachhat ahi -sw osu -suwa idi -suppos ition -st ma -speed boats -sol ti -sk ö -scottish canals -sab z -ro sin -riv ka -rask ass -rafc gy -ra sto -qu ing -pw res -pro di -press ler -poplar ville -pol lens -ph re -pal y -pakar my -oz ona -over seas -orda z -or ite -onero vers -ny we -no ye -nis ka -new world -mr j -mo rella -mo berg -michelinguide uk -mi ria -mez cal -marilyn ne -macer ata -lth trust -loo kahead -loc q -line berger -leek wang -leed ong -lan des -la opera -kri er -kel ani -ke di -kac chako -jen naw -jay park -jas wim -j soc -indian summer -ima gic -huber tus -hou tte -hot press -gom pa -ghat ge -frick collection -for sman -fol o -fisher cats -fifa e -etsy teamunity -eric an -eras mo -elm hurst -dollar general -dic om -dele vi -dehuman ize -degan wy -dau g -d cb -cu dd -cru cero -cord mn -cor vette -convers aciones -conceptu alart -ci gale -ci bia -christmas dinner -chill o -cedric alexander -carra ig -c ung -bush meat -bon ello -bo eser -bli k -biomole cular -bio graphic -bha agam -best buy -ber thon -beck a -be om -bbc norfolk -bar th -audi bly -att ar -assi stindo -ash ell -aro che -ar kad -aper to -ami e -am ese -al sip -adhe rent -ab ondthatcantbebroken -ðŁijį ðŁĺĺ -èij ī -è ĵ -à« ĭ -ı z -ym el -world triathlon -wind blade -volu si -vle uten -vintagetraffic usa -vaness o -vac tress -ur la -un il -terrori zer -tad worth -t sw -syl vanesso -subju gated -stel zer -st q -ssss sssss -sf alls -seren aryder -see ff -seas ickness -sav arese -sar keesian -sane wwe -ru i -ros é -rob m -ric hert -rc u -raj ar -rail ton -pun akha -pri sco -precipit ated -positi vel -pos ity -plat ting -pitt sbvb -pin ho -pi ph -people matter -ore e -ordov ician -or sett -on twitch -ol pc -nu cor -nightinthe woods -never leave -natu rism -nas w -nano bots -more ra -mis za -mign ons -met ar -mello tron -mc pd -marcjacob sintl -lostin translation -lon line -lo isa -learning disability -lak l -lak is -kw anten -ku bra -kim zolciak -khu shal -kairi sanewwe -ka dir -joeyryan online -jeet bo -je k -jake pittsbvb -ja imel -itsme marcog -iron bowl -ir da -ine miliaromagna -hug your -hosp icec -ho ttt -ho ar -hiro kazu -help ful -hawaiian air -han ae -haider alabadi -ha eun -gen cia -game zone -fre de -first place -fast way -expo sed -evely ne -end el -emerson drive -el met -ecu baseball -dou ll -clin micro -cl w -chuck liddell -ceil ing -ca zy -bur rowes -bry k -brizen orton -brac ket -blunt ness -bishop stown -betti epage -ben nell -bel ters -bap ak -az leg -aw onder -avi ka -ascend ance -artist sofinstagram -annel ies -angel ayee -andru w -all sup -air fryer -ahmed patel -afford ances -> ) -ðŁij¼ ðŁı» -ðŁIJ ¿ -ðŁįī ðŁįī -ï¹ ¡ -ઠ¸ -شرÛĮ Ùģ -zindagikime hak -yz ma -what culture -well travelled -we missyou -villa verde -ut x -ultr amar -u efi -tv illa -truste eship -threl keld -theamerican sfx -techno terrorist -te guh -tart ar -tamsen fadal -stother t -stor mon -shat tered -scrip ture -scar ff -s sci -s bla -ro ton -rithvik dhanjani -ren es -refra ins -refr act -raj skub -pvr cinemas -pur ges -prote omic -plim soll -pix ley -pc bb -pace makers -p suv -p bafinals -nin kovich -nicolas cage -nic eness -new quay -narrow boats -nadez hda -n ter -mutil ating -mon aya -mobile punch -mizu hara -michael shanks -mic ks -mc que -mati z -mas nor -mar ar -maggiel awson -luxury watch -lug nut -ling le -liacou ras -le mahieu -law firms -lam oriello -ku cera -klar man -kill ough -kemp en -kas erne -kar aj -k crew -jul liard -johnny g -joh nette -jeffrey combs -jake shears -j walsh -inve ste -insane cham -insanecham pwres -ifly mia -ic ture -hp celebration -hol lick -hodder books -hi ren -her ping -hard body -ha go -gour ami -frag mentary -fr s -fe deli -err day -eng ates -el sworth -el ster -ec lips -e mig -dream less -designer sguild -del pozo -daf na -cress kill -cosmo sdb -comman deering -coal port -check point -ch acousa -caw dor -buck den -bour bons -bb mp -bad enoch -asjadnazir sexylist -amphi polis -a acs -???????? ???? -ðŁĴļ ðŁĸ¤ -ðŁİĦ ðŁİī -à¯į _ -z ol -youthen voy -yan kees -wo tan -wish bones -wind starcruises -who woreit -wah ed -unic anberra -udd hav -tx stars -tri ppi -treva than -ti ful -thread ripper -tho p -ta irport -su hani -spring fiel -spl ant -spaceship two -son paper -so apo -sm koneru -shak en -sh ood -sh dop -sasi kumar -sar lat -sar gam -refer rer -re tractor -re appointment -pnca rena -pin z -pau die -pa wesome -our in -oc v -o lowo -nar va -nam ics -my hero -monopoli ze -mom afilm -modi fiable -mid mo -mi el -mercado libre -lon nie -lia ising -li ker -les ch -le tyour -lam brecht -lagav ulin -lac ofd -kne ast -kh eng -ke j -ke aley -jun to -jay sus -jadav pur -j wilson -j jones -j hum -ir pur -im j -ikar ia -hu ahin -hon ora -hispan ia -hex is -hersh berger -her schel -hel zberg -han ok -hal berd -ha ggin -h jal -green island -gr ttweets -gautam rode -fnd tn -fluore sc -ferro vial -fc splayoffs -expand ers -ethical hour -emocione scan -el sie -eid as -e ying -e ah -dumfries and -duck ula -diop side -dh alls -den yse -deme trio -dead space -de twe -de ignan -cynic ally -cram ton -chil ds -chead le -charter schools -cath ays -ca icedo -bé ar -bur chill -bot in -bor odin -big data -bel isle -be joy -back kkk -bab bit -ba jar -aw la -atlanta fx -at tridge -as ali -arya stark -art us -arroman ches -an ies -al sadd -ais for -ai dy -actu ation -ab ula -ðŁĺį âĺº -ðŁĺĤ ðŁĴĺ -ðŁİĻ : -çij ľ -ãħİ ãħİãħİ -zo han -zah raa -z wan -yn elson -yank sonyes -winter warmer -wheeler dealers -warand peace -war same -viv ab -tri phala -trend z -traci iguns -toyo tas -time keepers -the odd -su liman -su hr -su are -stepan akert -steal z -son owal -so yer -sko glund -sie ges -shutt ler -sep timus -se eta -scar ra -scab iosa -saxi frage -sand ers -s magic -rit ory -resent ments -re location -puff balls -pu yo -peregr ine -pd ash -on cidium -official pvfc -official pes -n spc -my tton -monop lane -mono coque -marmo zets -manu bennett -mang la -lymp ne -lund university -lr ath -ll ly -leyon hjelm -leon hart -leg alism -lees ung -le pton -lac onic -kw es -kapp as -jj rockxx -implic ates -ii faut -ia sen -hot yoga -happybirthday liam -ham lisch -h na -gyn lais -griffin shockey -gravit ating -grace jones -g thr -fel ici -fac ce -escape ment -en ballet -elic iting -el mb -e tomi -du rell -destined tobeyour -dam our -dal u -dab ke -da stan -cre sson -cn sa -chap manu -cen bank -cand ling -calum best -brent butt -bo ger -bie hl -better off -b kl -auxili aries -arbitr ators -ap cu -andri od -alu ae -. ðŁĴ¥ -à° ħ -Ø§Ø ® -zan in -yo sh -with y -witchof gric -war dy -wain scott -vir ility -vice president -v mu -une z -un delivered -to vo -tin dal -then ra -tele vise -tal ex -ta wad -sturgill simpson -stu arts -stal king -speed line -spani en -sol in -snow blower -sel k -se alife -saf ta -sa karya -ry land -root sport -robre iner -ric t -refresh ers -queen sugar -q wop -pre conception -per dida -pe plo -pe ay -par amotor -one us -om ron -of arms -nicole tti -new stuff -nat oma -my u -my co -mu iz -more life -moom oo -mol alla -mi leg -mercy ful -mckin ley -matthar vey -mark logic -mamared carpet -mal on -lor as -lom adia -leg ler -lec tro -lar go -lar don -kwe se -ku le -kom bo -k oper -journo request -jad is -isak ov -iri dology -ing ness -individu alist -i she -hor sell -hol ub -hij ra -her ford -hac i -gay romance -fre tted -fe zz -farmto school -ext enders -eric j -ecou tez -eck mann -ear lof -de values -daw na -dal ys -cro oz -coul ro -costab ile -comb ichrist -chin ni -cher one -che fe -charli eco -carav ana -cano eists -can ak -c trip -bye ee -bun b -bridge of -boom boom -bok rugby -bit ties -big things -betibachaobeti padhao -bas ri -bapti stry -bag lan -at ley -astra galus -arcen eaux -ali ona -aa ÅŁk -, '' -ðŁĺģ ðŁĺľ -ðŁĮ¹ ðŁĴĢðŁĮ¹ -ðŁĮ ¯ -ìľ ¼ -âĿ¤ï¸ı ðŁ¤Ĺ -âĿ ģ -yeon jun -without limits -wire cutter -wing s -wear pink -wal brook -wa sters -val v -un supportive -un drinkable -trevor jackson -tough er -to paz -theyoung turks -ther am -the police -the grove -the fieldhouse -the bush -tewaar aton -te ter -tanger ine -su jan -sp lines -sla voj -sigma hq -shu ld -shu ben -shen mue -shan am -schmel zer -sc x -san ai -salam on -sak on -rott we -rh us -ree zy -red line -red cliff -randal stown -rag am -progressive metal -pon da -pnin ator -ple uro -playoff final -pitch man -photo catalytic -people whom -patre se -pat erson -p flp -on elmstreet -omari hardwick -ny ard -north wales -new shindi -neuro psychiatric -nece sit -native americans -nat ter -mor as -missi ves -mis su -mirac leon -mic odelrosario -mi pi -mcil wain -mar oto -mar imar -lly welyn -leit rim -kn wa -kir ara -kevin m -kat as -kaf u -juliere ichwein -jour dain -jingo ism -jean grey -iy ar -hol loween -heil man -har in -gri bbin -gra j -getat me -gerald orivera -geo x -fu sca -fant agio -es now -em yr -egyp tologist -ed na -ec cw -dige stive -di zi -det ama -dark lines -dan cere -cos se -cor fe -comicbook men -coly tic -claudia jordan -cityof perth -cine a -cham paran -cep k -catalan referendum -cad enas -burk hard -bur ga -brook lynn -bron ski -bri anne -brett kissel -bon omo -beg ich -ayo ze -avo gad -au sout -aren aof -aontro im -anec i -amand ase -alle le -al vi -ai v -a ves -!! ⾨ -ðŁĺľ ðŁİī -ðŁĺį ðŁĺĩ -ðŁĴ¯ ðŁıĪ -ä¹ ĭ -z ation -voye uri -vj se -ver da -union saustralia -ty hafan -tul lio -things done -thi er -te men -te at -tab ler -ta veta -sy en -swi wx -suss kind -steve wal -specu lum -soft works -so thern -shu bha -shant ung -serkan cayoglu -sel lar -sclo thes -sc so -sc ira -savedbythe bell -santo shi -s garden -ro ev -ro ba -retweeet please -ren ton -prim rosehill -president duterte -polit ec -patri mony -p ctto -over holt -over drawn -ov adia -onthe water -nli reland -nfldraft scout -new smy -nail sworth -my kha -msam ber -mostbeautiful faces -monof ilament -mo lex -mississipp iriver -meister singer -maur its -mat ua -mari anor -mal vin -mal to -live authentic -laurel hurst -lan kesh -ki bby -ken ly -ke bab -janel parrish -is qua -install ation -igno u -i ipa -hol zman -heron dale -gun ships -gran do -gill ylancs -fur ler -for humboldt -flo rette -fire y -figure drawing -far g -ex horts -ent ano -eccle shall -driver les -drive on -dove cote -denzel washington -d ä -comm vault -coll ingham -cer atop -camoufla ges -bristol news -bristol city -bocc accio -blythe wood -bk twtr -bay lon -bass musician -basil an -ban za -baham ians -as sche -as l -aren ts -arbit ral -am iss -ach ra -ac press -ðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺįðŁĺį ðŁĺįðŁĺį -ðŁĩ« ðŁĩ® -ë°ķ ìĭł -âĿ¤ ðŁĴľ -y utu -wr p -wny wxguy -wiley updates -west wing -we urope -vojvod ina -vit tori -vir gie -vie tto -umphrey smcgee -um bus -tx milesplit -trespas sed -titan sof -time sunion -thest style -thener d -tam popo -ta ppers -sv ball -super user -sun dari -su sand -strath spey -stan chion -sta e -sl trib -silver side -sig gy -shop fronts -sar it -samsun gs -sakhar ov -sa ie -reg n -rec ent -re re -r head -pron ghorns -pin cers -p te -onlinec asino -nzv ban -ny liberty -motivational speaker -mol der -mil air -maw dd -marin aro -mar yo -manto vani -manj hi -mandra gora -man dos -mal loch -lynd sey -loffici el -lin tott -li gation -kick as -ki bet -katiemc grath -karti ka -joo hyuk -jinxx bvb -iz aguirre -irregular ity -inter breed -intel pro -int ents -imuk biz -hu uuuu -guil lemb -gradu ands -glan bia -gat ot -football friday -fle cha -find me -fel ly -fe ste -fe aver -euro furence -egg cup -effu sive -eagle hawk -dye sebel -diagon alley -deer field -de iv -dan ka -craig ella -country duty -cou lon -corning museum -comedynight swith -collec tives -cn sphoto -clari dges -ci bona -cher if -che se -character ise -cav ender -bra chio -br acks -booksto read -boij mans -ble m -bi zer -battle on -bat lle -baker va -bai doa -bad blood -back boris -atap ult -asi mone -al uska -ðŁĺįðŁĺįðŁĺį . -ðŁijij âĿ¤ -° ï¸ı -younus algohar -wom anist -wer neth -vs bos -vil ification -vi all -v roman -un sullied -un making -tr inians -tol booth -tele casting -taylormade tour -tau k -szyman ski -sz ka -steph ani -sse arena -sou tho -silent disco -sho taro -shah ram -se ath -scout master -sar dina -sam ani -rick world -ric cardi -ri gaud -renee graziano -rant zen -ps le -pro saic -poly unsaturated -pa jaro -p scs -online poker -ohiop yle -of cl -ober ge -o ei -nev schulman -ne dra -memor ably -mb am -lo gr -lnp fail -leu ch -leaveyour mark -le di -kin hai -ken burns -kemp es -keeping you -k roy -john leguizamo -james mar -itsall goo -ik hil -hyper dunk -husky nation -hu lud -hr in -hol landia -hick forco -heures dumans -hallucino gens -gu detama -gian marco -fren chal -fox searchlight -fivb men -farm pics -expun ge -este ban -end family -easter house -diaspor as -depress o -demar re -dave mcclure -dar l -daf tar -cro che -cour tly -cor ie -col ine -co tai -co flood -cn alive -chen yi -chasu ble -cast in -cafe cito -burger week -bri gs -bra ds -bot as -bor gman -bhil ai -bestnigh tever -beauty tip -bal ada -ato jr -anno ying -am la -al cides -ais in -ag lass -@ .@ -* ] -' ". -ëŀ © -å¤ ľ -ãĢĭ ãĢĭ -د ÙĪ -zen nor -x pe -wych avon -wom ad -wol fies -what car -well spent -w daz -vag aries -transpo sition -track man -to lima -the orie -tand f -sun sout -sun gei -stradi vari -spic ers -sn ur -smithson iann -sarah jaswim -sal ine -ryan hunter -rid ger -rico che -riche mont -re spire -puri foy -pe kalongan -pe et -paro di -pan try -p th -oc pd -obam aday -o wa -nu ked -noman sland -nekop ara -neg ating -mu lago -morecambe bay -montt remblant -mm film -mello dy -mehwish hayat -mega shot -may sles -mat tera -manag ing -ma dala -litho graphic -li gia -kon kon -kitti wakes -ki yomi -khel oindia -ker ins -kate beirness -kap ag -kam asutra -jay len -int ell -hour glass -hex ham -haz im -haupt bahnhof -hal ston -hal d -grand ches -grandches stour -ger akan -gam brel -fracti ous -form alize -forgi one -fl andres -fa kku -ex claiming -enig ma -emili eder -emilieder avin -dy ar -du ri -dough ty -dob son -desecr ating -dar ri -d hir -crou te -cr nas -coyo acan -comeon you -col ón -cling mans -che sser -charity shop -cer via -campe sinos -bu ckey -bri j -bo yet -bertrand piccard -bas sie -back breaking -bab ineaux -azu lejos -as cp -andy grammer -amba reesh -amat suri -alu va -a jose -ðŁĺģ ðŁĺī -ðŁĺ¯ ðŁĺ¯ -ðŁĴĵ ðŁĴĵðŁĴĵðŁĴĵ -ðŁİĬ ðŁİīðŁİĪ -ðŁį ² -ìĿ´ ëĮĢíľĺ -ãĢ ħ -ت Ùģ -Ã¥ r -z waan -z our -youn gre -x fce -womenin ag -whatdoyou mean -wat sapp -walker booksuk -w cdma -v annan -usa ir -un subtle -trout beck -trend micro -tor turers -tol li -thereal gokwan -the mary -the jon -thaw kins -ten so -taleg gio -ta hoe -supportlocal music -strato cumulus -sthe world -stephen mangan -speci alizations -spe el -spani er -sonny digital -snow berry -smar tt -sloane stephens -serv ative -sch is -sanantoni ofc -rum ley -rot tie -rna seq -rin at -riff raff -regal es -reen acts -re dress -rajat tokas -r alli -quiztimemorning swithamazon -quis ling -pro social -pres sey -pra p -poom sae -physi atry -pat more -p skov -or rr -ontheroad with -oneteam one -omy ces -o hhhhhhh -no bill -ni sei -n mp -my night -mp cs -mon essen -mo one -mnight shyamalan -minister io -mile le -mifi dii -meander ings -mccar ley -mb oldo -man atsu -m pire -lenny gaspari -kiran shaw -kir ko -john berman -j la -incentivi zed -in viol -in attentive -in accurately -iii ight -iam ond -hockey hub -ha ast -gray wolf -google drive -gar dein -fire andrescue -far hi -estrange ment -enew sletter -ell acruz -e fr -dul han -don giovanni -do ÄŁ -djim on -dd hi -creative mornings -corred or -congre ve -com hairle -clau diab -clar os -cinemainmy genes -cholec yst -chite ttura -chil mark -chi ya -cassa day -can lon -cal mar -bri se -bra ked -bob white -black country -atl ay -athar va -architec tsuk -anth o -anime con -alph anu -alp eng -allu de -alac rity -agri goi -afloo d -ade bate -ad tran -ðŁıĦ âĢįâĻĢï¸ı -ðŁĮ Ĵ -ว ม -ø y -yogur ts -wedding present -weare stv -wau ters -walkthe talk -ve ith -under powered -un spent -um braco -ty rian -tur aco -tsu taya -troy bakerva -tricia helfer -tre esur -toi world -thur s -team nuh -tau be -tasmani ans -tamago yaki -take that -t dg -swa ppable -stur gis -stewar tuk -stare down -ss badal -spr ats -sla shers -shee ted -shanty town -sha ji -set swana -saf ai -rep l -reg ge -rebu ts -re tz -radio deejay -r sl -property forsale -promom yshop -profit eroles -pon cho -plu shes -play for -pat mcgrath -pas su -orchestr ates -nyarla thotep -nut field -nunatsi avut -north up -norfolk va -nat asa -n maa -myviking story -must ache -munster gaa -mess inger -megan n -med ill -marsh lands -marau der -mar yan -mam ed -mag ura -ly die -lu ddington -lo iseau -li fo -lec lub -lang try -l mics -l mb -kyri akos -key club -kay i -karmen uvella -karao ke -kali uchis -kal ima -juvenile justice -josap hat -jan am -j mattmiller -j ali -ian us -hiroh ito -high est -hel s -he hir -hb hai -ham me -ha thletics -gu ts -gog com -glen campbell -ger ak -gany an -g ela -g day -frand sen -flat white -ez pass -esp ina -eri der -en claves -em mm -dran ath -dig ang -di leo -defe rence -dead lands -de marcu -culi acan -cru gby -cro sland -cor bitt -coco on -cardi stry -car ona -bunb trillog -bu ttle -borne misza -bor ley -bogal usa -ben savage -bay ly -baby steps -b inet -az ir -ational guard -ati dora -and are -alic eroberts -af sp -a strup -ðŁĽ ¸ -ðŁĴģ ðŁĴģðŁĴģ -ðŁĩµðŁĩ ¯ -ze ee -you meatsix -x ers -x amas -x adee -wing sscotland -vol lrath -us wa -ur ts -uneas iness -under lie -tucson newsnow -trues dell -troo dos -ti ro -thisis roc -the original -the incredibles -te do -taylor swift -staur ant -st illing -so j -skee ball -sher ie -shak shouka -sen io -scher rer -scand alized -rou garou -ring way -rever ies -re mer -pp ap -philom ath -pc sreeram -ou asport -ortho pe -oral b -only way -odd job -nz post -nic le -natural news -nat ation -muh sin -mis behaves -mcfe tridge -magu ey -lo ga -let r -kh qa -ker on -kel tie -kash kari -jud ger -jazz ercise -janh vikapoor -jak art -it ment -is chool -ilike it -homestead ers -hol mer -hi zon -head man -ha zes -girl gamer -ge gen -garth tander -forma zione -finn forchange -fing ers -fifae worldcup -fal o -fa sta -fa e -ey n -extern als -eve leth -er satz -e ip -du gs -dow land -dis dain -di kan -del phos -def uniak -deck ers -dal go -cumber batch -cp su -coro coro -con ade -citad els -ci otti -chitten ango -chil o -check mates -chai kin -castle ton -caram ac -car week -cann ing -c ly -bur rowed -bro sseau -bor re -ble akest -bianch ini -bi yombo -bi sta -be mba -bar gnani -au chen -as ays -arci mboldo -ar agua -alky l -affl ict -ðŁĴŀ ðŁĺĺ -ðŁİ¤ ðŁİ¼ -ðŁĩ ¼ -ðŁ§ ģ -ëŀ ľëĵľ -zim zalab -xibal ba -wt bs -wi fey -wheel man -wat in -visite den -vam ily -usic festival -usc lay -u um -u ille -twit terers -twarri or -tur pentine -tu sker -tron aut -tric entennial -trade marking -to iv -tam ira -tabas sum -symphonic metal -suz lon -staf fies -spor tives -spa ins -silver io -shu hei -shi ii -sha hin -sen ough -self magazine -sandwich ing -sal ma -rory stewartuk -richmond park -ri skin -ri ber -regurgit ating -red tour -recali br -ran del -pur va -prophet sof -play towin -perturb ation -ped lar -pas chall -p rus -oxygen os -obre gon -nu v -ni avar -nav a -nad die -na hal -mtu kudzi -meng ele -me dyo -mat tocks -martham ac -malavi ka -lu la -lot ton -loks atta -lev it -leon ov -le master -lan cey -l vo -kristian sen -kris shdop -knowyour status -khar if -ket el -keegan mkey -karapar aaÅŁk -juilli ard -jellic oe -incen dio -ik lant -ig liano -if sa -idol bday -hu bo -hen nen -harsh man -happy vday -had dix -gum pert -gu ff -good news -gill ray -general ised -g sis -g dt -fu lof -freck leton -esp y -ef alls -dy r -donald sonville -dino sau -di bi -descar gar -deltag amma -deconge stant -de commission -dau r -daily show -da ig -d guy -color adan -code breakers -chu gg -che u -champag nel -bu tyou -brdg stonearena -bo iiii -blue wave -bi shara -be kka -bal tus -bach ir -ba rend -athle ti -ar cho -ar bore -apeoples journey -ann cleeves -amor is -alone together -afflic tions -adam sss -a hal -] ? -) < -ðŁį ĸ -ðĿIJ Ī -z ando -yam un -xab ial -wy verns -winter lude -wil pon -wastel ands -war di -vote dem -voor de -vi ke -var don -use recycle -twi bi -tsun a -trum puk -tre kon -to an -the adventure -tf ny -stech nology -stay humble -smilo don -smart sheet -small things -silver stonec -shahi dafridi -se ik -saqq ara -sam mut -sal umi -sal ita -ru ok -ro tan -ro mm -ro jer -re fitting -ravi zacharias -rain bird -ra oka -quest for -puc cio -prairi eville -pra chidesai -por bandar -pitt ance -pir in -paramaham sa -pacha uri -os burn -on al -ob vio -ny ab -nsc w -north wards -multit ool -mtv star -mrsbrowns boys -mollu sc -moeed nj -mixed martialarts -men slacrosse -mari ash -mahar astra -lu gogo -london jazz -lindsay jones -laim beer -la vand -kou delka -kant é -julie tta -iw sc -itunes movies -it like -ho by -har ar -h wood -gra j -go yt -gi aa -fu seli -frederick md -fol f -father john -farewell tour -fai the -ex por -emo ting -eliza veta -effec tive -e studios -du hon -dont end -dog leg -direction less -davi da -dav ar -dang it -cuttinge dge -contac to -confl ate -citizen four -chester hour -car lier -can asto -bör se -bul taco -blu ffer -bio processing -bas adi -azu read -apor tugal -apo ker -ann av -ankylo sing -amur ray -amand af -alan walker -acl tv -ðŁĺį âĿ¤ï¸ıðŁĺĺ -ðŁIJįðŁIJį ðŁIJį -âĺ ĩ -z ameer -youtube music -x cellence -wel ham -weare indigenous -vapori zing -usarm yeurope -un mixed -tyrr hen -tyr ant -tiv ities -the vfl -tamer hosny -takay uki -sympo siums -sym metrically -subor bital -stun twoman -spag nola -sofe urope -shal u -sh mirtz -se ales -schil dren -sag enda -ron dell -repre nd -redu cible -re deployment -r dan -prize winning -plau sibly -pit tock -phil taylor -pan ji -ome gap -ni renberg -ng d -never see -nebl aruz -ne ele -navar ino -nag pur -mis sin -mini atur -min um -mikewill madeit -mic as -mccre adie -mc whirter -mc bath -ma ju -m newsradio -long don -lit vin -let sen -leaving cert -lauren koslow -kyun ki -kw un -klu ane -kimber lee -kess inger -jun aluska -ju baland -ju ab -joh ancru -jeron teng -jac e -i aap -hedgehog society -happy family -go thard -ger wyn -fur pals -fu ori -freak nik -fe ssler -f me -exemp ting -en fer -eigen mann -e golf -dont shoot -disson ant -dec agon -dataf low -dai shi -cru it -cross y -cr pc -civic si -che to -che apo -cess ary -cbc thenational -calaf ate -c sg -béar naise -breaking barriers -braun er -boost vibes -biennalear chitettura -beer wah -bassmusician mag -bar io -aza adi -authent ics -ar mc -aparna dixit -ant acid -an dex -aman ullah -am erson -all that -( / -ðŁĻĦ # -ðŁĮ¿ # -ðŁĮ§ ï¸ı -î Ķ -âĿ¤ï¸ı ðŁĵļ -âĿ¤ ðŁİ¶ -Ì « -zz oli -yp silon -worldwide web -weare warriors -ward ha -w fl -viol on -vie len -vad uz -un unu -tx plants -ti bbits -thunder wolves -temple more -tem bro -sw sh -surviv able -super conductors -star times -st robes -square enix -spark led -sole a -skunk works -sibling love -shrove tuesday -shol m -shikar pur -sam trans -sa astr -ryo hei -rose and -rit annia -remark able -recuer da -re examine -ps bl -prophe sying -pro pul -prasar bharati -ph vegas -pet abytes -pandor ica -on os -ol ak -nyct subway -nigel farage -ni verville -nag ler -mouni roy -momot aro -mn ch -ml stadium -misper ceptions -mer u -mer mhart -masch era -martin heinrich -marque se -lo ys -lauri ers -lab ella -la ven -krist offer -kle mm -kingshead thtr -kar go -kam akhya -jon pardi -jo bbers -jj redick -jar os -jane austen -ireland amtv -im my -icol lection -holm fir -haz ari -had dow -hackney council -h tu -go q -gary numan -fill an -ff rench -fen ris -fast jet -ero adtrip -elast in -eddi ep -ed cs -dustin poirier -dun gan -domin go -dis bands -den of -country lifemag -con tem -cl b -church radio -chrisky le -chri sar -chai wala -car boot -bron k -bra gi -bol lin -bob vand -bds fail -back yar -aur icula -askingfor afriend -appro vingly -anaesthe tics -amrav ati -amic ably -alief isd -academy brix -ab ai -) ãĢį -ì ¢ -á´ ĺ -Ø· بÙĬ -ž i -y alo -wil co -werthe imer -w ace -vm vc -visit lisboa -un selfishness -un rolling -un followers -umu ahia -uj world -u daya -tz is -twitter art -touris mus -ther ium -theother artfair -the taste -the mira -the call -tak am -ta deo -stre ch -stopp able -stop suicide -sto janovic -steve krohn -sle ip -sit g -shirob ako -selfie expert -scol ombia -sce aux -say yes -sarah mclachlan -rey ne -relap ses -rel in -redemp torist -re hearing -qu ev -puk aki -pharmaco genomics -perse baya -pathanamth itta -pal ko -opp i -one oh -olivi eri -office depot -odell brewing -non agon -nh out -national internday -nagas wara -muk wege -missgem collins -michel lea -mi as -mcdou gald -mar king -man isa -lost lightfest -lightitup blue -le ut -kingh enry -king kong -kil coyne -kat elynn -kali das -ka el -k ku -jen carfagno -jan nik -j izo -itsu ku -i ant -hou elle -hideand seek -helenclar knz -hah haa -great work -glau cus -ghul am -gaf as -free base -flavor flav -finger printed -expen sive -etsy trending -epau lette -eat right -dun man -doo dad -disin fo -devol ves -dele terious -danny glover -dalgle ish -crow le -cross mag -co zzi -co intelpro -clums ily -city tshwane -cinema scope -ci vari -castle man -cas al -build that -brasen ose -bblo gger -ba the -b pn -aw on -av int -ast us -ari ley -aran manai -ar sd -aontroim gaa -ammon ites -ag usan -adi po -> __ -.. ðŁĻı -à¥ĭ à¤Ĥ -z rx -yor am -wwe thebigshow -wi ds -well sboro -war museum -waldorfa storia -w enge -vi borg -ut sa -u lisse -tz ou -ty ers -ton tine -telegram dotcom -taren as -tam ala -sw oon -super glue -strike out -son ika -sme a -sho guns -sel kirk -se fi -scen ted -sauti sol -s beauty -ro sleh -rim sky -right most -ri emer -r jl -qu bits -pre sta -poem trail -ple b -peter boro -pep to -pas ca -paren teau -over reaching -outh unger -officeof ssbadal -ne wa -n pf -music business -moy ra -mi yyah -melchi zedek -mcne illy -mayor alty -masnor ioles -magn animity -lo dy -liz gillies -library journal -lecoq sportif -kt nuk -ksr nv -king lear -jes c -j degrom -isth mian -inter zone -ine music -indo siar -ik könen -i annucci -hur rr -hondaci vic -har riton -gri mbergen -global artisth -geo ca -gen iu -gar ston -funk houser -ever wood -er vine -disinfect ants -discover your -de famed -de cai -dancing withthestars -cur tiz -cruis eline -crow son -coo ver -clu bc -claws out -cent a -cas sim -caperca illie -bun an -br v -boyn ton -bou twell -bo ke -bi ent -be creative -barit ones -ash lar -as ahd -arnol fini -ard ently -architek ten -ar rangers -aman resorts -al tri -air worthy -air conditioned -against cancer -ag bu -ðŁĺį âĺĢï¸ı -ðŁĶ´âļª ðŁĶµ -ðŁĴª âĿ¤ -ðŁĮ´ ðŁĮŀ -ãĥĭãĤ ³ -âľĬ âľĬ -Ì ¯ -ér rez -ye tto -y hoo -y abe -war isan -vive ko -verul amium -vanguard news -us ra -ur ing -ur bis -un answerable -turbo diesel -ton ie -tol ani -thisis america -thirty one -the handmaidstale -test accio -te mis -super cat -squid billies -spr in -spe an -sla pper -si vo -si stani -shu le -sheab utter -shaw mut -sev res -senyor atidora -se tau -ro so -ride shimano -reic helt -re interpret -rbg canada -quin tos -q y -pw ba -poise tt -pi beta -per rie -optome tric -om onia -officially dale -ny gma -nobill nobreak -niavar dalos -nen es -nce atalk -n ado -megh wal -mc murphy -mati ja -mar ving -mal liance -ma des -looking glass -leather y -laser hairremoval -l rl -koffeewith karan -ko fori -kofori dua -kliz an -kil ims -khur d -ka hu -jr w -johnc mcginley -john h -jing yi -info com -idiosyncra sies -i thin -i olan -houelle becq -hay dar -haik us -ger aci -gar rin -fu dan -far fan -evolu cion -dumfriesand galloway -dj j -diar maid -demois elles -de yo -coo lock -chi zik -chann ell -cates by -carson kressley -c ink -bur dening -bra cho -bn pa -bludge oning -beauty salon -bb celeb -bar cal -ayre some -as dru -aro ss -ap ley -any o -al styne -al amb -agi ft -af bf -ac x -ðŁİīðŁİī ðŁİīðŁİīðŁİīðŁİī -áĥ ¦ -اÙĦÙĩ ÙĦاÙĦ -zo tti -ystrad gynlais -wi gle -ver mes -valle dupar -umb rage -trans fe -thur l -tg is -tex ture -ten ere -telli gence -tech f -takeme home -ta fc -sto gie -sn aring -silver classic -ser hat -seapor t -satyamev jayate -sat inwood -sat ins -ry un -ru beng -romantic izing -ro lin -procu re -prah lad -plari del -pen ley -pe koe -param speak -ozz ie -omnam ah -omen ico -ol az -o ip -nm fcofficial -ner ul -naj ia -multi modality -mul larkey -mul her -margin alisation -march al -manti ses -m life -leban king -le ola -la fuente -kor le -ki est -ken ickie -k mbappe -jik lian -jait dp -j churchradio -inge agle -in dor -ik pe -hop ital -hal ak -hac ket -go hawaii -gen ève -gar row -gar finkel -gam ely -filadel fia -fight ins -evil legas -er st -ec inemas -dncle aks -disembar ked -demp o -danneel harris -cv f -cre matory -cinder block -catal ina -car lyon -brown y -body power -bo quer -bli fe -barber o -av ram -ausv wi -at mo -apo loo -andy serkis -ali ano -ak dong -ag twitter -affe e -ðŁĴĸ ðŁĴŀ -ðŁıĢ . -ðŁħ± ï¸ı -ðŁ¤ º -ë°ķë³´ ê² -ãģ® åĽ½ -zhen ya -zach arie -xo yo -wra bel -wait wait -viro qua -vijay an -vi veros -vet tai -ve ut -vance joy -upro arious -un tag -ud ell -u thman -ts ars -toys betoys -ti meeee -the york -tay port -sub divisions -spor tw -spart annation -southern miss -sla ys -sh ange -se ke -scriptw riters -sch nu -sar l -sac ross -sac anime -sa stre -sa inted -s sps -rol an -re attached -ralu ca -rai ffe -public sch -premon itions -point and -phantom opera -pa ha -out world -out d -official c -offic efurniture -o tu -nong shim -new game -nerd camp -na iman -mull ica -mlb fc -mis in -maurici om -matta poisett -master man -maris ela -let toysbetoys -lei dy -lanc elin -lam ott -lac asse -kri zz -kir on -jozy altidore -jig nesh -j allow -int al -in chief -iffic ult -hotho thot -har ma -gry bau -globalartisth ma -glassof bubbly -f ong -eyel ash -exol selcaday -endow ments -en raging -ed mv -e ab -desig no -der yn -der rius -daniel la -dam ara -cou pe -constric ted -confin ing -conce tta -coma stia -com ac -coach bill -co ale -clau diag -cityo fo -chandra pur -ch anti -cedar town -cards againsthumanity -cap uch -can ol -bts world -bru eg -brand t -bitcoin talk -bcu hb -bat week -ay aw -astu rian -ast and -ar nim -appe al -ano des -am ang -alex change -akh mat -ak sar -ag utter -ac cone -) '. -ðŁĺĤ ðŁijĮðŁı¼ -ðŁĩ§ðŁĩ ¸ -îIJĴîIJĴ îIJĴîIJĴ -èª ŀ -âĬ Ļ -zz le -zen aida -yo hannes -xadee journalist -volei bol -vit rio -vitrio lic -veronic aroth -up fest -unmatch able -trumpuk visit -triple talaq -tim ryan -temp at -te sfaye -t weak -sw aby -suz ana -supply co -str acker -ste marie -stab by -sta verton -sq ld -sou la -snow board -shinj iro -shim kus -ser an -sb ks -sant amari -ryanhunter reay -run tastic -run skg -rip nelsonmandela -regi us -raoka vitha -rajag opal -radio surgery -quili brium -quaide azam -pride parade -pon nu -pollok shields -plat y -pa ju -p and -over bridge -or ona -ophy l -online auction -nus ingapore -nc pc -murphys law -mur uga -mu shishi -mu hur -mtv uk -moving quickly -mo ora -mis d -mcget tigan -mam ar -ly st -lu carelli -lex ile -lass wade -lamar ca -la vaux -kir alı -kings things -kim berlin -kar ura -ka aa -jin x -ji my -jadap smith -it gets -irre deemable -inno gy -illa warra -hydroxy cut -ho cr -hef ce -hand al -haeun dae -grass field -gha ffar -fu leight -flat ly -fi as -eu il -es adler -employee benefits -elin coln -editor schoice -drawe veryday -dor ji -donat elife -dl f -depaul u -de tik -dand unn -cur rie -cor sini -con tort -compet ently -cod man -cla hrc -cic carelli -chaper oned -bur nin -buc to -blan kety -blacklist irgc -betterthan yours -benedic tus -ball an -ate man -alexander skarsgard -acceler ant -a ach -. ðŁĺĨ -**** **** -ìĦ± ìļ´ -ëł ¤ -âij ¢ -ÌĦ âĸ½ -you too -yo sp -y it -xen akis -woo sh -wonder women -wicked wednesday -wi max -way days -watch oftheday -w ends -v me -u af -tw illiams -tu llis -tru by -thu l -tech comm -tai you -si su -scip y -scho ch -sch es -sc lera -sc ali -salam u -sa dist -robert smith -ro miti -rich ton -reminis cen -redol ent -re arranges -ransom ed -pinch punch -pilgri mages -peter king -pan americana -pakistann ature -p gb -over top -ornitho logists -ol aya -off wht -nasa earth -mé rida -my man -murdershe wrote -mu do -mor ikawa -moo i -money bag -model e -mix show -mit ra -mind fullness -min iso -meravi glia -mer an -me ols -mazz eo -martin o -mari en -mar acle -luck less -lotu ses -logic pro -ligh trail -lifeat sea -lets doit -lee kuan -lebo res -lar s -lamborgh ini -kunsthistor isches -kmc kidd -jo ely -ir retriev -in play -home renovation -hom eles -here eee -hem lines -grave tt -gr ane -gov garyjohnson -ge tsu -french polynesia -free world -four cade -fa es -f ap -everyday iloveyou -entrepre nuer -em iller -earth month -ea seof -drogh eda -dpan ikkar -dolby atmos -dirty water -devon franklin -death wing -dad s -d oud -curi eux -cowboy fb -colour ation -classic film -chri sn -ching on -chin sky -cher aw -ch acal -cav snation -camp bestival -call ard -blue dot -bere jiklian -baris al -awa ji -att inam -arizon afball -arbaaz skhan -ap nic -ame th -al ts -al fam -ade goke -:: . -ðŁıĪ @ -ðŁıĩ ðŁı¼ -âĿ¤ï¸ıâĿ¤ï¸ı # -à¸²à¸ Ĺ -zing ara -you have -wo ahhh -wind less -vietname se -vampirethe masquerade -v hope -ur ss -un noticeable -uk photoshow -tur gut -transcrip tomics -tr bin -tor ano -themac belfast -the pack -the bachelorette -ter ium -td kr -swif ty -suppos itory -sportscenter ph -sports blitz -sofar sounds -shu ck -sasikumar dir -san th -san joy -ri ess -reasonswhy welove -re tells -re programmed -ram p -plot line -play more -pharmaceu tics -pay pigs -over strand -ot ville -omni presence -ola fu -okon jo -ocon taldo -occident alis -obedi ently -ob elli -museum next -muscle car -montan ez -mis ner -mi hara -mess ick -medi atour -me ret -m for -le tti -kinok uniya -ke ion -ka hanam -kahanam oku -jim erson -jame stown -jam et -jaguar usa -it sgo -inst ay -impre ss -human i -holliday sburg -health policy -he mma -hardwell onair -haiku jam -haha hh -gucc icruise -gom en -gold mining -glen ferrie -gennar ocontaldo -g star -fox rock -fly fishing -flo o -fin alization -falsi fication -fa hadh -esta dio -equit ably -enumer ation -emil yy -em elt -ear m -dom ineering -devop sday -deborah annwoll -dam ba -da beast -chu bs -chik magalur -carsand coffee -bx tch -bri quette -bi bio -banff np -bad hairday -attenu ator -arnold palmer -apple day -andre au -americor ps -alph ington -aham ed -ag amma -adobe illustrator -adi e -ðŁĺı ðŁĴķ -ðŁĺįðŁĺį âĿ¤ï¸ıâĿ¤ï¸ı -åĦ ª -« ม -zdar sky -zah ira -yo ku -yeare ver -yar mol -yach ting -wy bor -work arounds -win free -whowhat wear -wey den -wer nick -waw g -vallu var -vallab hbhai -v crs -tran scriptions -tic hin -ti ron -the hills -th im -teh ri -team messi -sty rke -stro h -spirome try -spald ing -sothebys realty -sling in -shrews berry -shipy ard -sher ali -sha stri -se less -schem mel -sch movies -sc magazine -safe schools -riz wan -resna is -rec rimin -read more -re ws -quan ah -prince sse -pokh ran -pel u -pel otas -paw ning -pat eros -over spill -over burdened -oun is -on fleek -olatun ji -official camogie -ni ji -ng lifestyle -newton more -neu e -my d -multi mode -mis cues -mis carried -michael chiklis -micha ux -matt taven -luci fans -lucas oil -lostgirl series -li sat -leekuan yew -lakeland terrier -ki pru -kate garraway -kapp ak -jonny wilkinson -jo edon -jn co -jas in -irishcancer soc -im seth -ig ing -hurricane prep -hinchin brook -ha vo -gyne comastia -gigu ere -ghan oush -fy ing -footbal lau -fine man -fig c -fatherjohn misty -digital agency -d now -d line -curmu dge -csu sb -con comit -clay man -chi omega -cher ni -charle mont -cer van -can ino -camil amendes -brown barrie -bomb proof -bk club -bintur ong -best es -bend or -bam bini -back home -av ity -at omar -art ane -armi jo -angelique kidjo -al avi -ad hoo -a university -^ âĸ½ -ðŁĺį ðŁĻĮðŁı» -ðŁijįðŁı¼ ðŁijįðŁı¼ -âĢº âĢº -àª Ĺ -zimzalab im -zi um -yy ours -ye stur -wi vedi -we sa -vs jax -v official -un free -u hhhhhh -turf way -tuney ards -tun ny -tread le -transp acific -titus oneil -titusoneil wwe -thereal kmckidd -theposh official -thegreat gatsby -the basement -taj mahal -suf fixes -spiritual awakening -spike island -soccer dotcom -so hu -sky bus -sk ater -shar ara -se tag -rz esz -rte gaa -road tripping -ripp ed -rick springfield -rich ter -ra uk -q do -pom be -play harder -penc illed -p man -own town -odd s -ns ls -nko sa -ng am -n wed -mu ssa -mr darcy -micro car -mar wari -malm stro -mac jc -ma ung -m wo -lin in -lake view -l summit -ku ja -kirrie muir -keepfighting michael -k maw -jhal akon -ja ja -islam istheproblem -ic title -i ven -hudson weather -hov land -hol steins -hipp ea -har dens -gwy dir -gw ladys -guy zz -god manchester -go ti -g ors -fu jin -flash tweet -first grade -fac daniels -f kd -en sing -e wing -du shi -det sky -del mont -day stom -dan h -d sena -d land -cy fair -cu mali -craft bizparty -cour son -coffee script -cho han -chi ons -cep tive -car doftheday -campe ona -buli mic -bri mbank -boudhan ath -boom slang -boom bayah -bo ty -bo the -bis wa -bin us -baby led -b hh -as par -arkh angel -amnesty usa -alve olar -alle stree -ali a -afro house -adrian edmondson -actu ate -actress life -(( (: -íĻ© 민íĺĦ -èĭ± ä¼ļ -ج Ùħ -z andi -yose ary -yaf antasy -whipp any -wbb mnewsradio -wall bridge -w you -vy rn -var chives -un ak -tritic ale -tre sem -too hot -the journey -ten anted -tall ship -ta pio -t morello -syn ched -step family -stay la -staser aintv -springhas sprung -sla ppin -sl mc -sko ch -shad ings -sh kin -sergio garcia -sav vas -s gi -ru pali -ron del -ri va -requis ition -rendle sham -recon quista -raven scourt -rah mah -ragh eb -ra ir -qur an -puro resu -por gs -pneu ma -periodon tics -pen alise -one ering -od ourless -o cker -nu bbin -naf is -my hill -min v -mil azzo -me gau -manu rewa -mad h -mac es -lil ja -libby schaaf -large sse -laid ley -l trs -kur saal -kome diab -kfm za -j antz -hand cart -ha ining -gu yoseary -goldenstate warriors -gil les -ger ads -games master -flu o -flavor ings -er onen -energy access -en ro -ek im -eco logie -eart fair -e stel -disney channel -dgand yofficial -den isa -del vecchio -dead rising -cu bi -cro eso -credit cards -cor oz -cli ocup -chew able -chamber land -cad dell -book out -bla bla -bis p -bill yon -bhar ti -bec ton -ba ret -atro x -ani us -all rise -adve ction -? ðŁ¤Ķ -<<<< << -( ^- -åħ ī -ൠĭ -world fest -with heart -wat kiss -vinyladd ict -vino gra -ve dt -vander pool -uss ain -ur mi -un sophisticated -un desirables -un approachable -ty rie -tu lp -trust me -traumain formed -thedead daisies -the jagmeetsingh -thar bour -sy ro -sy chi -stop avn -steel town -st francis -shu ichi -shav ing -second home -scar f -sas ural -sandwell council -sab lan -rohan bopanna -resc ities -recor riendo -ration alist -pie stewa -peep z -pap ato -pal af -pag odas -oh s -neel ima -mother ingsunday -monet ary -massaso it -lö f -lu lay -loch ner -lo vering -leedu chat -kyungsoo day -kj show -kil ala -kh ate -kay ani -ka ist -jhalak reloaded -ing post -in opportune -in concert -image sof -ike men -halloween time -go tem -glend inning -gender bend -g afford -etihad stadiumau -el by -easter monday -don nap -diamon t -deano gorman -da sia -ctvmorning live -cron kit -cir lik -chri scar -chin ta -chi ado -cam bon -c dre -brandonj routh -bon doc -bo olin -bid ston -bi kela -begum nadiya -bab an -aun gier -artiston instagram -aqu arist -annihil ates -anim enyc -ald abra -aj m -air dro -ad ome -abor tive -ðŁĺ¬ # -ðŁĴĻ ðŁıĢ -ðŁij¼ ðŁı½ -ðŁij¨âĢį ðŁı« -ðŁİ Ĵ -à® ´ -र द -zeecine awards -wildflower ctr -water management -wai kiki -von taze -voice top -unlv mbb -un born -ul er -tweeta photo -trans acting -the jeep -thai pusam -tech sters -tasty trade -sw ich -stom ata -sta th -st mt -sol l -sla thered -side y -segu ros -sc ps -sc chat -sar ag -rn k -rend ts -reel foot -ray ana -raisingthe bar -ra pin -pu tri -prophe tic -press burger -por ty -pla xico -per r -per ps -pal matum -over age -outeni qua -oro driguez -ordin aire -open farm -nj dv -nike uk -nau ck -nar thex -nacion ales -mor ti -mone ill -moneill sf -med spa -mcclo y -mc grain -mat rons -maryam nawaz -mar gate -m ds -lease holders -laura osnes -lamin itis -l den -ko stya -kis mat -kii ara -ju bb -james r -il ham -ico in -hy me -hou rigan -heart landon -heart fulness -harper adam -google pixel -gon u -girly things -gin i -gillian jacobs -genoci des -fon dled -fi ster -fashion gram -f tr -explo der -exib ition -ex ilis -esh our -english language -edd zeko -don ot -do led -disal low -david giuntoli -dalla ss -council day -con boy -chan thaburi -cerebro vascular -cast ros -calgary police -c ÃŃ -bromel ain -bridal market -billy crystal -bij li -batman vs -ba ise -ammy virk -adil hussain -aap ki -.... ..! -ðŁĴ¦ ðŁĴ¦ðŁĴ¦ðŁĴ¦ -ä¹ ĥ -âĿ¤ï¸ı ðŁĴį -འ² -à± ª -z suz -z sc -z ali -wor g -willie geist -war shaw -want s -vi vat -ve co -vanat chathiram -van brugh -usic live -ureport ke -unchar ted -un too -uil texas -toulouse fc -tom oka -ti jani -the town -ted leo -techno polis -te itel -t zi -swith un -studio city -slovenia info -sl q -sky bar -si raj -shain anc -schipper ke -rolling loud -ro dro -rio ter -re populate -rain or -ragaz ze -rac tice -point les -plot kin -player stribune -pic ador -peewee herman -pay roll -pac os -our stars -ou sia -other kin -or rrr -ob trusive -north well -no ongar -nin jas -nic hd -newpor tri -ner dgasm -ne res -national dessertday -mu vy -mayweather pacquiao -maximili ano -masti mania -mar sy -man ap -mal ate -makelife aride -ly y -ly ria -leas owe -lea quitaine -lay un -last chance -lan ow -la quan -l porchestra -ks v -kor ach -kil dee -k nation -ju iz -johnnyg weir -jes sel -j arri -ital ks -inun date -inter weave -ing rati -ib is -i aido -ho ste -har ket -happ p -han amaru -ha ug -great memories -go tyj -go ines -gilber to -geek dom -galax ya -et ana -este fania -ellip ticals -e stro -e ecs -dur gin -dontbomb syria -do dsworth -dead beats -curric u -ct politics -configur ator -colly er -collegi ality -colec cion -co su -co dex -clau ss -ck ler -cityand colour -chi mie -cardiff bay -capital stb -callo fcthulhu -bruhits zach -bru yere -bray brook -braintu mor -bolly mastimania -bo gar -beth lem -ben ro -ben ck -bang ura -bal adi -ati as -ar curi -ankylosing spondylitis -anc elife -an eda -ambi ental -alpin ist -alexandro v -abo lishment -ab dash -a hin -.... ..? -! ðŁĶ¥ -ðŁĺĤðŁĺĤ ðŁĺį -ðŁĶ ī -ðŁĴľ ðŁĴĸ -ê·¸ëŀ ¨ -ãĥĸ ãĥ© -ãĥ³ãĥ Ĩ -à¸Ķ à¸ĸ -za ghari -ym b -yc nature -xabial onso -weather watchers -ve gal -us womensopen -unob tainable -un volunteers -u selections -u donis -twer ks -tr na -tish james -timber frame -thistle down -the stage -the palm -the champ -th ely -tee zy -tax cut -sé rie -ston efly -ssun stein -ss om -shum way -se bas -sale sian -sak shim -ry se -ry pt -rotor adar -red hook -re creations -ran jan -pu dd -pom poms -pl tw -pemb scoast -pe als -parliam en -palindro mes -p sim -over rides -onep ur -nik laus -nen ownews -mueller investigation -micro bead -mehra uli -mb alula -materi alizes -lyre bird -liv ant -lightning deal -ku roi -kp j -ko va -kims convenience -kh of -katzen berg -k under -jour dandunn -jnj news -jim ura -jeep thing -jamesp oulter -jamesmar ster -jag ga -ich ry -ia fe -i sport -huntingdon shire -horseand hound -hope fulness -honor ing -hazel dean -happy tweet -h fo -guti érrez -gu ery -grace church -go explore -ghes quiere -funky town -fly catchers -euro centric -et witter -eli sts -ed sheer -drink bodyarmor -dispro ving -definit ely -decath lete -debt trap -dan sen -d memories -cw f -csn chicago -costu m -com pre -climateaction now -chlor o -chall en -cec ina -cas ssunstein -canon usapro -cad wal -bro force -assas in -art crew -alve ar -al toon -agon isingly -aga st -. )! -- + -ðŁĺĤ ðŁĺĪ -ðĿĻ ļ -ë ķ -ç ¤ -à¹ģภ¡ -zom bs -zof ia -yan key -wokv news -wiz bi -wi pro -we buk -warwick adavis -viz wizbi -villa franca -vie tor -venice filmfestival -vehe ment -uefa championsleague -tsne deker -tri eu -toro idal -ther ight -theli st -the arto -thank youn -temer ity -swachh india -sth d -sta a -ss wim -spin abi -son oda -sock sout -so dding -simul acrum -simpl on -sign posts -side walls -shak yam -setau ket -sat ine -sand storms -sa adia -s vet -s grace -run o -r ham -pro long -pre tori -po veda -phir se -pe gues -patro clus -pal omo -over lake -out magazine -our heroes -oun ce -ori ordan -on gus -ol le -of sted -ny heter -no conversion -night spot -n ols -my twitter -mood iness -mo pa -mo dems -medit ators -me spo -max ted -max pro -mal olo -mail let -mag nier -loo ka -lo sar -lear month -landmark game -l wk -infer no -in gos -hy nd -ht ml -he wa -har ap -hal ore -gra yer -gold thorpe -gal gos -fusil ier -frei berg -forward together -fm wales -fat ai -ez idi -exp consulting -etv scandal -elevate gg -doofen shmirtz -do we -di restra -defin iti -de ely -dan ke -d smith -creepy puppet -cot man -confl ating -chinese theatres -chan tier -celebr atin -cashme recat -caravan serai -car photography -camp ello -c pos -bryce papenbrook -brand tsnedeker -boo te -bobvand illen -blon der -bizim hikaye -bil ko -bha id -bensen ville -bear sted -bath i -balla chu -aw oman -aven e -arts district -art u -apcu kingdom -anti static -andro b -alphanu meric -almer ÃŃa -agit prop -ad reno -ðŁĺĬ ðŁĺĭ -ðŁ¥ Ľ -ðĿĹ¢ ðĿĹ -ë¹ Ľ -âĹ ĩ -ze bu -yor lando -yoff ish -x anthi -work up -wetherby hour -waveform gaming -v ory -us nsa -us ami -un ning -tri on -travel noire -th burne -tb ptv -tan zi -sy b -sun trap -summers lam -sr ch -spl ant -shot left -shan tou -sapp arel -sanssou ci -sal ang -rod kar -rho desi -rh cp -re fashioned -qui am -pumpkin seed -puma southafrica -pre ux -prati ma -pog dogs -platt ner -pint size -phen mj -pau lan -pau dybala -ost ler -on style -on salenow -ol oroso -ni ddry -new burg -nast ase -mu six -moi sten -mixer streamer -mar mal -makav eli -ma fa -lou n -long ter -lon done -lime wire -la en -kor ba -kom olika -kk crvenazvezda -kav ana -jur gensen -jamesmarster sof -it sma -ip sen -ino saur -ing love -ic ml -ic amp -i wt -hi dup -gre bel -gra dings -gr antly -gl ück -gilli gan -gar aki -for freedom -ev als -esh t -du ga -do gin -dc sd -ct z -cow man -cor ke -convey ancer -contribu tory -chiric ahua -catal in -carstar phenmj -car yl -c pi -bu bur -brun dle -brown sboro -boston fire -body painting -bethnal green -ber line -bedd gelert -be zz -bakers field -avi acion -australi as -agu ita -age ant -aeroline as -$$ , -! ðŁįĢ -Ĥ ĺ -ðŁĻĮðŁı» âĿ¤ï¸ı -ðŁIJŁðŁIJŁ ðŁIJŁ -ðŁĩ±ðŁĩ ¾ -ìĺ¨ ìľł -ä» ĭ -人 rt -âĥ£ âŀĸ -ya day -x slasvegas -watch face -w ge -voyeuri stic -vo va -visual merchandising -ver wood -vas ile -up y -twopad docks -tweet link -ther ace -te be -ta ar -t go -sun danc -sting less -sosn icaragua -singleuse plastic -share file -se acombe -scre ek -sargas sum -sarai va -s enga -roosevel ts -right sarehumanrights -rejected jokes -reg icide -re ais -ra sika -ra kh -q urban -pul ps -pom pe -plat ano -pic tori -peter roskam -pase kand -pasekand paul -pan oz -no it -new mom -nd ma -napp anee -mur mu -motor hour -morph ism -men ted -matra ding -math art -mark duplass -mariob autista -man official -man gel -mal low -mal formed -madein scotland -m seto -lo bato -live jazz -lin ac -li salam -la ge -ko ken -key strokes -juan man -john elway -jagu a -indeb tedness -in ri -in conveniently -huar aches -host as -hook worms -hil ip -heartsofoak gh -haw kinson -greg jennings -gom m -god flesh -glos sum -ghar ana -freed land -flori dat -fl atlay -fin ola -fin ear -feder ation -fan euil -ent en -en quanto -efan club -edmundmc millen -distant worlds -derek theler -dc te -da esh -cu dnt -creati ven -cra ver -coton easter -confor mance -clar kie -ciar án -chrisber ghd -chi w -chekk achi -ch ach -cav anagh -cas pers -brew is -beck ys -be hm -baz za -asap nat -ar rrr -ani sta -aneurin barnard -ameans business -alex slemonade -ale cology -ad sit -a hil -ðŁij ŀ -ðŁİ¤ ðŁİ¶ -âĺ ¢ -zi el -yu ku -yam ec -xi ah -worldskill suk -wn ation -wh omes -vw beetle -vo sloo -vale ska -ul va -ucht dorf -u cros -ucros spop -tough man -thought bubbleuk -terp stra -tay m -syzy gy -swe mfa -sun ni -sun king -summ ering -stone island -steph curry -ss ch -sp insters -shim o -seen ur -sap cp -san jo -sac valley -ra bal -program ma -presidenti alelection -pic on -piano forte -pegas o -orchi daceae -open space -op rint -ocean arium -n fm -more years -mor umbi -mezz o -meu len -me up -mal dive -ma kau -lovemy family -louren co -lo hen -liket kit -kick son -kel u -kare lian -ju nee -john travolta -jersey boy -it yo -ing ian -imper o -hud hud -height ening -happ ily -gri fo -green tech -ge dsb -gaz asi -g gh -french town -fest ool -ex is -esc apology -empire strikesback -el ga -el fen -eck ner -dra che -donne come -donnecome cipare -dj booth -di jual -decor ah -daf f -cul o -cro ghan -covar rubias -cold case -cas cio -car canet -cap alaba -bur meister -bo lete -blu ess -blo k -bioshock infinite -bg motogp -bbc nottingham -baybay in -az oulay -ay eeeee -appetite for -anti ga -anil ine -angk lung -ak ap -aids walk -ah p -ag rf -!! - -ðŁĺ¨ ðŁĺ¨ -ðŁĴª ðŁĴ¯ -ðŁijij ðŁĴĸ -ðŁIJ¦ ðŁIJ¦ -ðŁıĥ ðŁı½âĢįâĻĢï¸ı -ðŁĮ¬ ï¸ı -ðŁ¤© ðŁĺį -ìĿ´ì Ķ -âŀ ¢ -ÙĤ ÙĪ -ün den -yt ff -yoko gawa -years agotoday -yacht club -winner sh -white people -weyer haeuser -wab o -vzw buzz -vine sh -umm i -u vula -u cia -traditional home -the sen -thanks givin -templ in -tal ca -tai led -syl wia -swift key -stru m -sk yn -shadow cat -sees outh -seb divo -se mu -scy cle -sar daar -san guin -rani khet -r hames -quar tey -pre emption -poldark tv -plebe ian -per ations -pen ang -pawn brokers -ox blood -onto logies -od ni -nuf fiel -north pennines -nico tortorella -mur gh -mir amax -mil bury -micro biomes -mega projects -mcgla shan -maurice benard -marr show -man cino -lo as -live inthe -legobatman movie -leaves den -le thaw -lake town -kru is -kin ison -ka fue -jen kins -jaide ep -im prisons -ichi ello -hil aria -hi mani -grizzly bear -greg grunberg -gor gas -gn z -glan ford -gam elab -gage town -fc academy -fanta st -expen ding -evan sdale -emp angeni -emily slist -em presses -ell park -eli hu -dul lahan -dr jason -day atthe -dan ariely -dam sels -csi ro -comm ing -clare mont -civari ze -ciut at -city farm -cis gender -che did -chantic leers -cal care -bur tons -bon ton -bom et -bl ough -ben haenow -ben ben -begu sarai -bee de -bak an -bag ua -as cc -ar cy -anni ster -anglic ans -alle les -al ute -agu delo -afl north -adri aan -ade osun -ab bv -ðŁĻĪ ðŁĻĪðŁĻĪðŁĻĪ -ðŁĵ· ðŁİ¥ -ì°½ 민 -å¾ IJ -z ino -youth summit -your call -wn cwx -with nature -wi eck -way station -watchme work -voor hies -views for -veri thanam -v fest -us new -ura sawa -tv j -troop a -tri fluorome -trans duction -tom or -tin dle -the press -te oh -tan zer -super ted -stor i -sth our -steam punk -sl oman -shil pi -shamp oo -sh ash -sex periment -san sevi -rugg eri -ron ix -rob shaw -ri vette -rc slt -raghe balama -rachel doesstuff -que ster -propeller head -pra z -potenti ality -po groms -ple e -pinup girl -petz old -pattim urin -pat ang -or ley -oce ancity -nur gle -nun dah -nowisthe time -nor wood -nomuslimb anever -ni vas -nef yn -mous avi -middle village -mey hem -medal of -maxim ises -mart elly -marianor ajoy -malmstro meu -ma hur -ma fu -lu bber -lovel ords -long ship -le pel -lat l -la chowski -l alab -karab akh -k oral -jewellery quarter -jay mewes -j dc -iri zarry -ini sterio -infection prevention -in eland -icy cle -iclassical com -ic re -hou f -hoo fed -hol dren -hek mat -grote sk -great apes -go thel -gi at -gadel maleh -frenchal ps -fore telling -film tv -every ones -england v -e ppo -do ar -dc is -cool um -competen ces -colon ise -co bi -city year -ci anci -child protection -candle mas -bullet proof -boat y -blv ck -being coop -band q -bally mal -bagsof help -au llo -anirudd ha -angeli e -am gu -am ab -al annam -abo i -aban kers -aaaaaaaa aaa -. âłĢâłĢ -ðŁį´ # -ìĦ ł -é¤ ¨ -à¸łà¸²à¸ ŀ -zan es -z illa -yor dano -wahe eda -w stc -volcan ology -vic eroy -trum pian -tric ycle -tre ys -tomo hiro -the profit -take s -swi pe -sumptu ously -stock holder -stead iness -star log -ss ilver -sre i -sp igen -sor presa -son ye -soccer six -small talk -sky cricket -sie wert -shimaz aki -shiki gami -sco ble -santay ana -rup turing -rose well -rosco ff -root stech -roman zi -redwhite andblue -raic hur -rai han -pv p -pp u -pharmaceutical medicine -pey to -pa zuzu -pa vic -of en -obam ba -ob om -nor lin -no confidence -nn sa -nk ana -ni pe -n cep -multic enter -mouth guard -mi az -meop ham -md v -may nes -mau de -mari jke -lun aire -lifeof desiigner -le comte -laine y -ksh b -kom in -kir win -kane wwe -jic ek -isal oni -isa ach -iran election -in attention -iit madras -hype app -hero in -hepatoc ellular -har key -gwilli mbury -gu altieri -go camel -glycer ol -gk union -gangnam style -fre ke -fre el -fel brigg -faz ura -faul ds -fau rot -ev aa -erskin eville -epic reads -echel ons -easter seal -dr ane -doc teur -disney hyperion -diplom at -diade troit -de wees -dd lc -dar ci -dant as -danne mora -cout u -chor lton -chic ou -car fest -cap sizing -c micon -british spiders -brac keted -bom ar -bo ber -blog paw -bay les -ba chill -ba cher -ath ousand -ar leta -amuk erji -ale ague -ad ames -acc tourney -ab rit -??? ?" -ðŁĺįðŁĺįðŁĺį ðŁĺĺðŁĺĺðŁĺĺ -ðŁĵļ ðŁĵļ -ðŁĴ© ðŁĴ© -ðŁİĵðŁİĵ ðŁİĵ -zapo tec -ye pes -xx yyxx -wit kin -whipp oor -vu lus -vivi ano -visit japan -var den -vanqui sher -van u -v dsl -tu xie -trivi athursday -travel africa -to kaji -teve rest -tekno logi -tech nis -ta vit -syncop ated -sw ool -super couple -sundar ban -sub mitter -stru ff -star force -sportsc asters -sp ä -smriti vidyarthi -sig sauer -shi bu -sequo ias -sc b -saul williams -sare k -rosen kavalier -ron in -ren toul -pra de -pink history -pic hardo -phyto ph -pen za -pal et -ourland our -or li -one year -nr lakl -new urbanagenda -ne iges -ne els -n stom -mom ota -made at -lyn donville -loonathe world -lo anees -liquid lipstick -lay men -lar avel -kim bo -kar thick -k sf -k ren -jun yeol -jav elin -inequ itable -imag ing -ida home -iam dbanj -hagg en -gul mohar -glar ingly -gd antes -g elo -fu xin -fren kel -frank ness -fr ys -followthe cow -electro magnetism -dublin marathon -dubai marina -desig ne -deb nam -dare ss -dar rion -continuous delivery -clarem bee -clar dy -clan william -citi bikenyc -cebu anos -c figueres -bu mming -bra p -bra ben -bier ut -beauty bloggers -beauty and -beaker head -balon mano -bal derton -back slash -back nt -ba ilo -b flo -award winner -au te -at sb -assou line -as oc -armand de -and dddd -ali jo -agu ardiente -advis or -ad alli -a events -ðŁĻĮðŁı¼ ðŁĻĮðŁı¼ -Ù ¢ -ع ر -zai batsu -z if -yog scast -www blogs -wake andbake -wag gon -vol aris -valeri o -val ores -v yan -ulster museum -transhuman ist -thri ving -thr ur -there for -the island -tc ja -taw dry -tam riel -sugar hut -stay well -stan bic -sp idad -spidad mitchell -solenn heussaff -simil ar -seo joon -sas ne -sand ino -ru zzle -restar ta -reli asson -re ten -raz ones -r khan -pri js -pp ls -pou lain -po ire -pin points -petre lla -peer age -pec kem -peace forchange -pas kal -part is -parasit oid -or adell -onz ales -ober st -nps official -nph w -nicole and -nichi ren -national loveyourpetday -mu za -mol ysis -miri anag -mirianag rassi -michelle phan -materi alizing -masa o -margare tta -make m -mag as -le ire -le ab -labor sec -ketu pat -kam ble -k croyals -jor hat -jo su -jeffreestar cosmetics -jak er -j lab -ishq subhanallah -induc er -im and -ilo cano -ick worth -ibm security -hi po -hand knit -ha em -go peng -gim sswiss -ga etan -flipk ens -fil led -eye onthe -es la -encoura ger -ely ons -dy i -dr sarah -dough boys -discover able -del imitation -dear born -cr sh -contemp tuous -coat rack -co xe -cl inger -ce fc -capp rentice -cam pero -californi awild -bur wash -bu stour -bu sker -breakfastclub am -bo dak -bit trex -barri ga -back packer -b wt -b sg -at onal -asu xx -art matters -arro char -ap sphysics -antic lock -ant sula -alo isi -ak ins -aer yn -" << -ðŁĴĭ ⾨ -ðŁİĦ âĿĦï¸ı -ðŁĮ ¨ï¸ı -ãĤ° ãĥ©ãĥĸ -â̼ï¸ıâ̼ï¸ı â̼ï¸ıâ̼ï¸ı -د بÙĬ -ä ki -zah ran -xe han -x force -wi za -who tel -weekend read -web toons -weare jcps -wc ps -w str -vermic om -veg ard -unzi ata -ulti mas -ul trafine -ucl ambb -twin ks -time outs -the gallery -th ence -swift ness -suc at -strato varius -stats zone -sn cla -sexy sunday -severy body -sep toria -seenur amasamy -scorpion fish -sco s -run neth -ric ki -rhi an -retic ulum -res foundation -red lion -po sco -pba ontv -parro toftheday -pap hi -pan ela -o zeri -northeast news -no wa -museu mc -motor land -mccl ary -mate ship -madhu du -maceach ern -lin ec -lie man -lette rer -le aches -lamb ily -la sairport -kon st -kle berg -kle a -kaushal army -kait lynn -kafka esque -ju raj -john carpenter -jay mcguiness -jacque storres -j sp -irish design -ire zumi -ingui de -impe tuous -id ade -ich ella -icec ap -holi bobs -hir schi -hil ts -he dren -harrypotter film -gyeong bok -gor nal -go recki -go further -gla as -garri gle -gan ap -ga illi -fren k -forte an -fish lock -fin det -fer ron -fanni emae -exfoli ator -ex claims -es mee -enti es -emmitt smith -emb ree -ell it -drummond ville -dr d -dogs nyc -diversity intech -dil um -de pon -comment ated -clu ff -chi dori -che fan -categori zes -car dell -canasto ta -bride shead -bri v -bri jesh -bre search -bold ly -bli ppar -black stone -biz women -before i -be dou -be ag -at ong -ar ges -analo gues -amare lo -abhan sali -- [( -è Ļ -æµ ľ -âŀ ° -âĶĬ âĶĬ -à² Ń -zax by -xin yi -wr ps -whiskey wednesday -wak iso -vici ou -vegan recipe -tt g -trivi umofficial -the cbso -thati sall -th iri -tee zer -tav leen -t sak -subtrac ted -sto le -steam town -ss rn -sop io -sm fm -she ppy -ser pa -se ato -scand rick -sc ir -saw telle -sac and -ro mig -rent schler -red lobster -realclear politics -re growing -rat v -projec ts -prin sen -pri show -pe lec -paw fect -pal merton -ota ki -ot di -or tunity -onthis date -ol alla -ogden sburg -of rac -ni ggling -my slf -muhyi ddin -mini figs -mikaela shiffrin -mend inger -men ot -mat es -magi sta -made inspain -ma kalu -lympho cytic -li kowski -lauren holly -lau be -kur ti -krish namo -kh uri -kh ill -j ör -j haveri -isol ationist -intothe unknown -innocent i -iheart country -horn dean -heartlandon cbc -habil itation -ha ole -ha ffner -green landic -gly de -ge ot -gario ch -fundament al -fro ots -for one -flat fish -fayouth cup -faul k -fathom s -espre sso -el na -eke inde -diversity matters -di ther -dan ja -dam ita -custom s -coa sta -chou ler -chen ery -chembur studio -cc np -cassio bury -carla harvey -cam pin -by les -buc cos -bu yon -bou lay -book tours -bene gal -bap tise -balti erra -ball ymurphy -at rac -as itis -ar vest -antagon izing -an tre -an amne -all youcan -alam in -adventu res -adel boden -ade b -ad jani -acer ola -ðŁĺħ ðŁĺį -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤðŁĺĤðŁĺĤðŁĺĤ -ðŁĴ¸ ðŁĴ¸ -ðŁIJ¯ ðŁıĪ -ðŁ¥ Ĺ -ì² ł -ãģķãģıãĤī åѦéĻ¢ -áħł áħł -ystr dy -workington town -walk outday -wakar usa -virtu emoir -video tapes -ves sey -v line -usatf outdoors -tu e -tk allday -thiem domi -theevil within -swa ard -su ster -str atten -stam ey -st live -sr ks -slo ck -sle ee -ship ston -shi rakawa -shaf ting -sbu f -sau sa -sar ja -saint motel -rockwood nyc -ro ys -rif kind -recircul ation -re shuffled -ratt us -ration alism -rand fontein -rais i -pul sation -pra x -piazz ale -p tm -p my -p few -over diagnosis -no tobacco -no fur -nav an -nas uwt -moer aki -mobile phone -men zi -men tira -men go -mel illo -mc café -maggiel indemann -made it -macdon ell -lo rene -liven ow -landing page -kyrsten sinema -kuro ki -kier nan -kid dush -kai ley -jo sten -jad er -ir za -in situ -ice breaking -ic tures -hy nix -hu huhuhu -hopenot out -hippea strum -hg hair -heis en -he ddle -hat chards -ham mock -granth am -gary oldman -gansett beer -gall antly -gal lion -fur thered -franco phones -fin ne -el iner -dol and -do ire -dne ews -demo gorgon -dementi auk -dayof pink -cv spharmacy -cor adio -co be -clyde side -clarine ts -chung king -chocolatec ake -chi antic -che c -cer ney -car pel -c sdp -bren au -bol on -black swan -bill ye -ber magui -bel loc -beart ooth -bal aram -ate gui -ast it -ash s -ascor bic -as pers -are mos -ar vid -ar rakis -an sf -amar anthus -al biz -agu st -adul terer -ðŁĺįðŁĺĺ ðŁĴķ -ðŁĺĤ ðŁĺ´ -Æ Ģ -zet tai -z c -yo a -wwii museum -walking tour -w kt -visit ms -vide ophone -ver k -uach tar -try m -to bler -ther ace -teslamo del -tech navio -taver ne -tail coat -ta quitos -stil ted -shal f -sec conf -scra wl -schri stian -saifu ddin -rosat om -ron delle -rhu dd -rebeccas ugar -re iman -quin tiles -quer é -pur don -pun tag -pro by -pre conditions -plu mer -photo gravure -phac elia -pep tic -patty jenks -pal let -open vpn -obo ist -o vale -nz x -nor ges -newsp olitics -nasa insight -narr ators -n je -musi que -msh saa -mr music -mmk maymay -mine fields -mdc p -mb laq -maxim ised -mati bo -mar cle -ma pi -ly ri -lowe red -love thy -lord minion -le froy -kri stal -jubi le -jack olan -jack nicholson -island peeps -inter county -ik ke -i win -horten sia -hor sman -hil len -he bel -he aux -hawes water -harmon ising -hard drive -hamban tota -hai k -grey town -grenou ille -gar ance -fur con -fresco baldi -film forumnyc -father like -ey in -et x -equ itter -el ens -ejac ulation -drake hogestyn -deyoung museum -dere r -deal withit -cy be -cri xus -countdown to -co chem -cl ancy -ced illo -catapul ting -bu gat -brigg s -bra ai -bow eni -beyon der -best buds -beauty by -bar a -back dated -b too -awe st -at its -ase k -arm streaty -ar amide -any a -an fal -all winner -alici avi -ðŁĺķ ðŁĺķðŁĺķ -ðŁĺ¬ ) -ï¸ıâĥ£ / -âĻ¥ï¸ı . -z atch -your life -wrecking ball -who youare -we streamers -we gs -w fyi -vite bsk -vis njic -veld hoven -vaun wilmott -us bp -un pleasantness -u stennis -tonyi ommi -toe hold -to bio -thisis what -the barn -team yoshiki -sven sk -subur gatory -sto chowa -stereo scope -st maarten -spit ality -spa stic -sor ters -sno we -sl fl -sight line -sh antz -ser gal -seng ineland -sa ung -rober ge -ring lets -ri ed -red wolves -raj ab -r km -q nd -preten tiousness -pine do -peter hook -pastry chef -par ce -on kiss -nzo ia -no vio -nie g -nfl redzone -nag ara -nab er -mookie betts -ma sten -lu ganda -love field -li j -letsgo warriors -leone an -le tham -krist novoselic -kin da -kas uri -kali ka -jupit us -jonah nro -j ide -im ing -il te -holy cow -hemorrha ging -harris ville -har less -hand cuffing -hamp us -hal ala -hagan ai -gulli bility -gran ado -glass blower -gareth malone -fu u -friday nigh -free e -fr ate -foxsport ssw -fore warning -fm hs -flu te -fer rar -dri mn -down shift -doire gaa -depreci ated -daenery stargaryen -crush monday -cmicon tent -clenden in -church down -chi kka -chalo bah -ch war -car cosa -car ap -bur ness -brick leberry -blun den -bi pa -bemid ji -believe movie -bc sn -ba ot -b prd -aur al -atomar aullo -astro cytes -asi andream -art brut -armandde brignac -al ge -aap kad -aa ap -.. ðŁĺįðŁĺį -!!!!!!!!!!!!!!!! !!!! -æķ £ -å®Ŀ çŁ³ -ÑĦ ле -ʸ áµĴáµ -z hai -ya official -woj nar -with h -winter weather -water bird -wait omo -w dam -vol kova -vi hara -v kook -us ms -up field -travel ers -trail magazine -trac tions -token ism -tobo lowsky -thequeen bean -tel stra -t atten -stutter heim -sto ichkov -sporting news -sp atch -sna k -sky liners -six tus -simp kin -shortland street -shag ari -sep tal -sen markey -salta ire -sair at -sad dar -sa sebo -ro an -rene es -real ricky -ps ons -ppc chat -po red -plent yoffish -people analytics -pensacola beach -party list -pad er -p ère -outandabout scotland -ornam entals -orn dorff -oracle database -or nately -oldschool rs -occlu ded -novo a -nine wells -nic astro -new spring -multic ore -more land -mo azzam -mescal ine -mell anox -maw lana -mart lets -malcolmn ance -mag as -lp tnhs -loh mann -lo were -ligh the -lat ins -lar usso -lam ont -laf rica -ko g -kf z -jay cutler -j klf -its complicated -inv ader -ingh ands -ing ate -in sets -in day -iam writing -hungar ian -homelo ans -hel lebores -had nt -great deals -gouver neur -glade water -ge su -galar za -fc family -extrapol ate -enic ole -el ver -d family -crypto twitter -content creator -cole moore -clear brook -chol lo -chatt ooga -ch ry -celebr ities -ce sme -catastroph ically -car ducci -cann an -cadi eux -c cia -c bos -bur atai -builda bear -bo fam -bn ha -bird wat -bio available -betten hausen -barbar ous -avogad ro -ashi elds -ap tx -ap lace -amphi bi -alli reland -ain scough -_ ... -?? .. -ðŁĵ° âŀ¡ï¸ı -ðŁİĨ ðŁİĨ -ðŁĮ² ðŁĮ² -رÙĬØ§Ø ¶ -аР´ -zad ok -z ado -young band -y ilan -wunder land -white boy -wheel an -wend ling -wade yar -wa yofthe -vo ise -vidy ar -ven era -usaid gh -u shanka -tropon in -the stra -the english -the boris -tatt va -ste agall -star sailor -sou tient -smur ray -signofthe times -shi ka -schaff ner -scani agroup -sand boxes -rough shod -romantic ized -romanceno vel -rochester rhinos -ro mul -rit ter -rebeccam inkoff -ran fur -pop choiceawards -po boy -pipe fitter -per aza -pe mp -ount down -ok aku -o ecs -o budu -nun aw -nunaw ading -nosy crow -mu mmer -monarch ies -min oring -michael jai -michaeljai white -mccar ney -march break -lu oyang -loc alist -les se -ki din -kal aw -jan ek -iwas aki -ile ostomy -i ally -honor club -high performance -hd w -hat v -hahahaha hahha -gy or -green idge -green backs -grant kirkhope -gra p -glass ell -gla ize -gied royc -get outthere -gema yel -gat z -fun niest -free access -freddie highmore -fisch ler -epas cott -epascott pruitt -ep yc -en tearth -easy recipe -dur kee -drogheda united -doc x -dis u -de mars -david zwirner -david spade -dat os -dalhou sieu -cv v -craigella chie -cosmo logist -congreg ated -ci gano -chal mer -bu ste -brew crew -bli xt -blat z -bal aban -b itta -auto somal -au ghters -ataste of -asi es -art yom -ark itek -antoni ob -adv ant -ab antu -aa aw -, ? -ðŁıĩ ðŁıĩ -ðŁįĢðŁįĢ ðŁįĢðŁįĢ -ðŁĩºðŁĩ¸ ðŁĩ¨ðŁĩ¦ -íĭ´ íĥij -ç© º -âĺºï¸ı ðŁijĮ -à¸Ļะ à¸Ħะ -мÑĥзÑĭ ка -zag ora -ye esh -y ce -wrink leintime -woman iser -western union -wee tin -weare ready -vou ches -volu mab -vikram vedha -velá zquez -u ark -tr v -toshi ko -tole dano -to wey -to de -tie de -thin ners -sylve on -studio canal -statecapture inquiry -sso good -soufri ere -snoo per -sj v -site map -shilpaf am -sharealittle sun -se hs -scic luna -sche ide -salem wgna -rugged ness -rub ins -ri ppers -re flation -rav ina -rat ana -raf finity -radi als -que tte -pro om -pregn ant -pra sh -pep so -pen pal -par da -pam m -paide ia -or it -one goro -olvi do -numan cia -ni volumab -neversay never -n dez -muvy z -music bank -mu gu -mr scot -mor and -mon than -mollusc monday -mic e -merchi ston -mati sts -marvel legends -mar oun -mahil acongress -mache tes -mac omb -ma den -ma dai -lieu tenant -lauri emit -kerber os -kan ungo -jawa an -it ng -in sar -ima izumi -ide es -iam john -hpp lay -han ous -hal us -gu ler -grounds keepers -gour cuff -gay men -gam ali -gall and -g ba -fujis awa -fireemblem threehouses -f sw -european art -esp aces -el eri -egg ar -edmonton expo -e ka -dy ersville -dor rie -dong wan -dewal ttough -dev ac -deter rents -del one -de so -dale m -d group -czecho slovak -cw the -customer journey -crystal bridges -convivi ality -classicrock mag -change iscoming -can ice -cal is -bu res -bru cie -bro din -bren an -bota iku -be fearless -ban j -baking championship -avon more -asi mmons -as mith -appenz ell -apo plectic -ao y -anticoagul ant -anti thetical -anne frank -am ined -alu cas -\ " -! ðŁijij -ðŁĻ İ -ðŁİ¸ ðŁİ¸ -ðŁįİ ðŁįİ -ðŁĮ ¦ -âĸ ³ -young love -winn dixie -wf es -wend ler -vinayavidheyar ama -ug p -tru glio -ti elemans -thorough fares -the os -the magnificent -tal ar -syna esthesia -sv cc -sul zer -su enos -stop ed -sof ya -shim amura -sebastian bach -sab riel -sa chem -s itta -rs gb -rosleh tinen -ris don -rew ery -re activating -quint us -poppy pride -plumb ing -pend leton -park slope -or tner -op ress -of nature -nm true -nirav modi -nil da -nhv natural -new mr -naz z -month sof -mis interpreting -mil sim -mer cola -medve sc -mat tern -man mademo -manmademo on -mac l -m sw -m kh -ly l -long muir -lion babe -label mates -la urus -l nh -l ne -kin gham -ke saath -kan ojo -kal ay -john john -joanne wheatley -jay inslee -iv ry -invali dation -ingel heim -inge vent -imperial nhs -ij ff -ig worldclub -ia ia -huac achina -histop athology -heckmond wike -harness racing -hack worth -ha skin -government za -goli ath -gilmore girls -gh ome -gee ta -gav ino -gang an -fredd ys -fad hil -est ren -eno chian -education ally -eb ke -e ather -dex ters -dev as -de wolfe -comp ter -cdn paralympics -callo whill -cal thorpe -boo ps -blaupun kt -be sola -bathspa uni -bair ro -ay yub -auto detailing -aureli en -atre us -at eng -ar dini -angel ita -an zo -aham m -acry l -a aba -ðŁļ ª -ðŁĩ¬ âļ½âļ½âļ½âļ½ -ðŁĩ¬âļ½âļ½âļ½âļ½ ðŁĩ±: -رÙĬ ا -zu i -zor ah -you ri -yazidi genocide -wis c -win ed -wc pss -vla da -visit southdevon -veli yi -ve irs -uu ya -tir tha -tir rell -tim horton -than asis -tar mac -sub versi -stopthe hate -so po -sl h -sch aper -satur ating -sand worm -rotten broadway -riden our -retren chment -ren ick -reed hastings -ra chana -poor am -phonec ases -phic hit -or deals -om git -oath breaker -new caledonia -ne mes -nbaallstar to -multi story -mi rab -manfred weber -mal ama -lon gy -llan fair -liver nois -lettu ce -leon is -leaf ly -lanc spolice -kor on -kon di -kn acks -kin man -keepit wild -kas er -kali sto -iz har -horse fly -helsinki airport -hand tools -hal an -gru be -gor oyals -gobi ge -game changer -fr yers -ford son -fle voland -exp ound -european parliament -essi e -el anor -do jima -diamon dd -dave berry -dab olu -cw janethevirgin -cv hs -csu football -cour tice -com hghair -ciut adella -christian keyes -c puc -bra gger -br ame -bel tz -bad ai -autom ob -auto club -auror ahu -ate st -as kl -as aro -ar sle -aphrodisi acs -anti pathy -an field -amy dumas -am atu -alou ette -aller dale -al inda -accen ting -ac tc -a wit -! ?! -ðŁįŃ ðŁį¬ -ãĥŀ ãĤ¯ãĥŃ -âĿ¤ ðŁĺįðŁĺĺ -zen der -young stars -yat ton -yar on -x tian -world balletday -wildcat nation -weir ded -w kar -vu v -ving e -un fixed -um el -tugger ah -tuck well -tu mk -traffic jam -tho ta -the ph -testic ular -tel t -teach meet -super family -summer party -staf fa -sp ouse -smashing pumpkins -sil bert -shad rach -semi otic -sa whorse -sa pps -rust ler -rudi mental -rosen berger -roots music -retr or -regi sta -re seeding -re buff -r dium -quir is -pron ti -politi ken -pol hill -phil bert -pa sion -orson welles -organ elle -om un -old photo -ojib wa -oberst dorf -nws norman -nikon nofilter -nike soccer -new hair -neonicotin oid -natu ur -nates ilver -mul downey -mousekete er -mock asin -mmm gorgeous -mid wales -mid sole -liver poole -lion sxii -len ham -lady hawke -la vers -l hw -kuchi pudi -ko les -kir stend -kho dor -kam asi -kaappa an -k rell -ju ca -jhalakon colors -itali aricci -international museumday -inte zaar -inexor ably -industri alised -igo ta -ich art -icef all -ic ol -hyper real -humidi fication -ho jicha -hin aholics -hel ia -he pi -hat ari -gun stock -grin spoon -gov za -gl ancy -for far -floren tin -fish uk -fish bourne -exorc ised -er ris -epping forest -eco c -dyne ema -double fine -dine tte -dine out -die gol -di blasio -design build -dermat ological -del age -dece dent -de el -data quality -coy f -combu sti -co sas -cl ts -cl sa -ci fuentes -chillax in -ceelo green -car ve -car milla -capital and -bun te -brook man -brompton bicycle -boul ting -bir twistle -bid co -bech stein -bal doyle -bachill erato -bab c -bab ago -an sbach -allo dds -ahut chinson -ac ey -abh brows -ðŁ¤¦ ðŁı½âĢįâĻĤï¸ı -âŃIJï¸ı ⾨ -âĿ¤ï¸ı ðŁĺįðŁĺĺ -zom er -yoak um -wsw v -worl dday -wil ier -whig ham -wag len -waglen ikhil -vn dev -visit dorset -uofl baseball -tull amore -track master -tome asure -toge t -tip sand -tin u -timp anist -thisi su -the halls -the bar -sun glas -study english -sti x -standar ds -sta il -ssel f -sper rys -space week -sp nn -sig ne -si mca -si ani -sha dia -se ann -sare en -sap ir -sale straining -sal in -saha ja -row den -ron ning -rock aways -riky rickworld -regin apolice -refu se -rau fareg -raufareg besola -r st -qui enes -q ura -preemp ted -pil chard -paren ti -pad o -p tak -ot int -ol phin -ohl sson -oce t -noy noy -nipi gon -newton abbot -mu kt -ment one -manzoor pashteen -madel a -m sco -lo ing -limb less -lethaw aii -lethawaii happen -lab as -knur led -kn agar -kel ing -kal u -k iti -k illian -just sayno -jel gava -jeansfor genes -itsm illertime -itsd anny -im v -hi a -grin dle -gir r -g winn -flo p -fil iz -family holiday -fam elab -eye works -eri ley -en livening -ed ress -echo arena -e ens -drag queens -dock less -di meo -del grosso -deci mus -dau lat -dam ron -cudd ler -crê pe -crowne plaza -club houses -cer ci -carolin apanthers -ca vies -bsc sd -bru jer -bru ins -boss ert -bet ches -bel reddevils -be est -bar chetta -ban ov -at nagar -arthi story -arre stees -ar fon -app leeduchat -ag etv -af m -ach rome -ab de -a quest -ðŁĺĦ ðŁĺĬ -ðŁĵ ¿ -ãĤŃ ãĥ¥ -áµ Ī -འ¦ -zz st -zi ppor -xfinity racing -vishak ha -video gam -vid ant -ul kom -u coms -tu am -trans figured -total dhamaal -tom ies -to stan -thrill jockey -thistle tweet -thin kaboutit -tham ilton -tank less -sz w -syr crunch -swed bank -stem pel -skoll wf -sis lands -sigh thill -side saddle -sidd hi -sick ens -si y -shec an -sh pong -seventeen mag -sen te -san iga -sabar imal -rosam ond -rescueme ohio -red star -re cher -ration alizing -radio carbon -portland me -pha e -ot directo -ore o -oo bi -on des -olo ber -olafu reliasson -no wata -no confidence -ner va -nau ert -natali a -mysti k -myo dd -mun desley -moz art -mor p -misanthro pic -mining indaba -micro economics -meat wad -me ggan -mari et -man singh -main tainable -maersk line -luc chesi -lou vered -lo ken -lightsfor liberty -korch noi -ko tal -keepit up -ke ating -justin colemoore -jere mi -j pd -j mpd -ing é -info blox -indiscre tions -ig ent -hol croft -hob house -ho tor -histor ica -ham macher -halla han -h inging -gun as -guj ju -guillemb al -guillembal ague -gi aro -gg day -foxwood sct -ew ski -ew adi -enter al -energy fc -en yo -emprende dores -eil idh -early momentsmatter -dun murry -din di -di mos -derby dell -deplo res -deon dre -crossmag len -comic fest -color run -co cas -ci dent -chun ni -christiany elich -categor isation -carrick macross -bur dine -blu stein -blaster jaxx -big ley -bernar deschi -ben enden -beau bourg -be ssel -bar camp -bar ay -ban ded -ba shir -asse tte -asam blea -ary ab -arenaof valor -architec t -ar matrading -alphabet success -ah ma -aeru ginosa -... -) ": -ó¾ Į -ðŁĺĬðŁĺĬ ðŁĺĬ -ðŁĺĤ âĺºï¸ı -ðŁĸ¤ ðŁĴĽ -ðŁij¨ðŁı»âĢį ðŁį³ -ðŁĮ¸ ðŁĮ¼ -ó k -whereare they -wed eliver -war ily -w ame -visit italy -village voice -vasilev skiy -vanguard ngr -van aqua -ur on -univers ite -uni westminster -twee tt -tt ly -trung pa -tr ino -to power -ti ae -te ana -taver ham -tam ora -tal ese -ta ps -sweet waterbrew -stjohn ssmith -steph ane -stay wild -stac ys -sou kup -snap artcrew -skerry vore -shud dering -shap ira -ser vir -secre twars -se shadri -scott j -rsh yr -row blanchard -pro sport -pho tometry -per center -pas sos -pancas ila -pag ibig -pad mal -ore illes -odon to -nottooyoung torun -nom in -nikol aj -ni eri -nau shad -mun ghana -mu tsu -mq vist -moto cycle -min kus -min do -marri ot -made ine -lon gla -lip sey -light sc -li skova -letsgo tothe -leck hampton -lane way -lacer ated -ky ros -kn oop -ke lem -k hem -k ando -juri sts -jo i -jagu war -ix elles -it sky -it mo -islam isation -ir ud -ing ale -ine very -in black -imman ent -hu se -hero e -hender shot -he tti -hart shorn -ham dy -hadd adi -ha glund -gustav son -gray wolf -global foundries -gil merton -gener alists -flat water -field stud -felic itas -fasti dious -far ney -f music -exit poll -ew ert -espou sed -elf yn -eki den -ed henry -ec ri -eas me -dynam obim -dwar ven -don nal -do therightthing -died onthisday -dfa records -del boy -dare you -da aay -cyber risk -cow drey -cost as -comm eng -cocac ola -co git -classi fier -cla dy -christopher lee -cheri moya -cap en -c py -but first -br bird -bodh ran -bin yamin -bestteam ever -benck iser -be thri -bang ar -bad ler -ayeshat akia -as com -ap ag -ama waterways -ali via -al za -ag grey -abo dy -abdomin oplasty -# âĿ¤ -! âľĮï¸ı -ðŁĽ © -ðŁĺĤ ðŁĴŀ -ðŁijĢ âľ¨ -âĿ ĭ -à© Ń -z ns -wer king -wedding anniversary -wealth tech -water way -ve wy -tv f -tru cke -tropo sphere -trees for -train in -todd barry -tit os -tic ky -thisi sirish -thi o -the hype -ten niel -team alex -table mountain -swi mathon -sun studio -sun dials -sound wave -sj v -sir in -sgo p -sco v -saras wati -salman khan -saar aa -ryand un -run g -ri xton -ren ren -rat es -ran ken -r se -q wq -q sr -presta shop -pre ety -pow les -podi atric -pic her -phosphor ous -phon es -pet unias -pear ling -patoran kingfire -pac c -octa ves -oath keepers -novem bro -north wind -norah jones -ne zha -ne elix -nat ron -muse umb -miamid ade -mediamar kt -mat tum -mar acan -mait ri -mah end -love itor -lisalam panelli -les band -lass ico -ku ehl -kk t -khand a -kent wildlife -ji brin -jeopar dized -is ay -instap assport -independent artist -im bb -il ma -ian jamespoulter -i wk -hy rum -ho quiam -he ff -gor am -gon orth -gb p -game ready -gal erie -future world -fortune mpw -flu ent -fire brigade -fac king -euro athletics -easter holidays -disfigu rement -dhe ena -der ci -ded chat -dad asaheb -d kp -coulro phobia -cot tes -coach p -coach k -cl ouser -cine mas -cher ui -charity week -cha hine -bi gear -beverly wilshire -bethany hamilton -bent en -bath on -ballachu lish -bal tica -asp net -as kem -aperfect circle -amreading romance -ah is -adap tions -a beautiful -% !!! -ðŁĺĬ ðŁijįðŁı» -ðŁĮł ðŁĮł -ë°ķìĭł íĺľ -å ¡ -à¶ º -zu cco -zan jeer -x ango -wowo wow -wh ill -wal de -villa gelife -ustad h -un screwed -try hard -tro ms -torrance coombs -thi ra -the whole -t sy -sur facep -supere xcited -studio tour -stop it -sil vic -si bi -shakespeare lives -self development -sare not -ryan bingham -rossi ya -road sides -right s -reboun ders -re posts -queen spark -pur se -pro gess -pres rajapaksa -postpon ements -pinchpunch post -per ie -pel in -pe ther -parti als -parach ute -oro adshow -organic beauty -op hora -ontari on -nuclear power -nj d -ni aaa -next bigthing -net news -nb football -nan se -na ach -my car -mo ppet -mo gador -mira belli -mil ah -michel barnier -men teri -men otti -marun ouchi -margar ito -m ram -luke combs -luci en -lu tton -lock ley -live export -li sandro -li bert -lgb trights -le toy -laver stoke -last call -lake ofthe -lac alle -kuno ichi -klin gh -king lake -kh s -kar pinski -jo sy -jamest cobbler -irish tv -ieb ckenya -i ast -husey in -hop god -hom ophone -ha ake -gy ra -gy aan -grit tier -great deal -got tes -gor st -glad ney -fv k -fu do -fit ty -fish market -expo sure -eval ue -esken azi -em eline -el berg -e mia -dri essen -don official -don kis -disin cen -di gha -di gest -dac re -cup sleeve -costar ic -church planting -chriss ununu -chelse al -cann ings -can opus -caloo sa -bü nd -brian j -br oun -best sho -bare tta -bar tos -ba ee -b sr -ap rn -am prog -al atina -ak shi -aber dyfi -ðŁij©âĢį âļķï¸ı -âύ ï¸ı -âĺºï¸ı ðŁĴĹ -ا٠ģ -ÑĪ Ð¼Ð¾Ð -ÑĪмоР± -ÑĦле ÑĪмоб -ç ay -yor dan -y aqui -with love -westfield london -welove music -water bottle -wanted wednesday -vi zier -vi b -v rr -uttarak hand -un realistically -tur p -town sley -tor ne -top oulos -tolu ene -that searth -tam pin -table topr -sv end -stoparming israel -ste pin -stars bbl -so cap -sin city -sean pertwee -se young -sat cher -ry nn -rudy mancuso -ru pe -ray man -queen radio -publicis groupe -pop concerts -poo tie -pix ography -penny royal -pen knife -peer support -par sh -or ts -om eric -nw schicago -nic ulescu -mycen aean -mor do -ment z -meet meat -marshall ampsuk -margin alize -mana fest -man nes -loc avore -liver si -liver sedge -lan zhou -la bette -kor f -ko smo -ko hi -kiraz mevsimi -ki eu -khaled azia -key and -kevino lear -kal orama -jume irah -jon jon -jennal dewan -iba secretariat -hois ington -hermi esadler -h bos -h bc -gun ite -ground less -greta vanfleet -ger th -ge mas -galla gh -futureof mining -fur u -funke akindele -fra ss -farmer sday -f ptp -ezekiel mutua -ex ped -en ner -em tech -dy le -dy c -du gongs -dru gre -dream land -doub table -con sett -co ches -cn at -chri smar -chir la -char co -c sis -buk hara -bhaagam ath -ber nice -bed stead -bana gher -baj rang -bah rami -aust mus -atri be -astre a -ard in -ann unci -an v -ami z -alter nation -alis sa -alex y -af dn -abo yne -- :) -ðŁĺ»ðŁĺ» ðŁĺ»ðŁĺ» -ðŁĺ³ðŁĺ³ ðŁĺ³ðŁĺ³ -ðŁij¼ ðŁij¼ -ðŁĮºðŁĮº ðŁĮº -ðŁĩ ½ -âĿ¤ï¸ı ðŁij¯ -zam alek -wren ched -wra ys -war precords -valken swaard -up stream -um ri -tuk ur -to fficiel -thu rai -thor selfies -th march -terry gilliam -taylor gang -survivor au -stree twalker -stacy london -spur n -sprad lin -slv ban -sky raider -skipthe dishes -sig sauer -shaw kan -sec schoolinnigeria -sar am -sap nextgen -sad er -s folly -rune quest -rumple stiltskin -rick hoffman -redd ine -reclin ers -re gaz -re collecting -raw vegan -ra ww -ra se -poster art -po partist -pluto tv -pitti uomo -pi eve -ph ou -peng u -pand ajay -pal ert -oz ma -om ino -ok olona -official b -nicolo di -nh lan -neu ss -nba xmas -nationalpark week -msc cruise -montre aler -model town -mens conference -luci ani -lizar do -le ston -l vp -ku stom -kha w -kele mentary -ke du -kanhai yakumar -kan ellis -jiu jitsu -jimmy sheirgill -jay mi -itsme deaner -isthmian league -inge borg -ing rat -ine en -ima gens -ily as -hiwas see -hi mi -haus of -guit are -gues thouses -goodnigh tt -good loe -go gos -glycae mia -gi shu -gardner md -gan ji -fur rer -freec ell -fre twell -fe spa -f lection -exoluxion in -exasper ating -ew ington -eni um -dy al -diver ticul -distric theating -desen ho -demon te -daily life -cron aca -cousine au -con nan -cl nolan -car ral -c jk -brew pubs -braintumour org -bra cha -bom bast -ber ling -bella houston -atb financial -art price -are well -ag ib -ae gis -a you -ðŁĺĬ âľĮ -ðŁıĥ ðŁı½ -á´ ¼ -à® ī -Ø· ÙĦ -zzzz zzzz -xen omorphs -wu zhen -women ofthe -walk üre -vitamin b -v no -under nutrition -un popularity -tri fling -tre bbi -the film -tch as -tab er -suther lin -su co -stock still -sp ams -south pole -sor ti -slau ghters -ske ma -side chain -se shat -scam orza -sam pat -sab har -rival s -religi onof -rebeli on -reaper mini -reading agency -r cd -projekt red -pher i -perip ate -peculi arly -over stating -nyle dimarco -naval history -mur shid -monochrome photography -mik maq -mew seum -meetthe maker -may nil -mar indu -m clay -kuy kendall -ku ber -ku bam -kro gh -klu te -kit trell -kin tail -kan at -jungfrau joch -jd ff -jacquelinem jos -i ster -i pi -hun g -holly r -holiday giftguide -ho stin -hisp ana -hi awassee -harak iri -gue sser -gett n -gam brell -gal va -fol an -faze ley -faneuil hall -family reunion -ex pe -endear ingly -ec su -dy skine -dramatur g -dine ren -dent ition -del py -del ing -defac ement -dd k -dan sk -d hall -d alli -customer care -crudit és -cre x -cod ger -cas sells -bush kill -bre ady -bon jour -blogpaw schat -ble eder -bistro t -bel staff -beg ins -baltus rol -back k -authori zations -andre rieu -alici af -ain ley -admon ished -absolut ly -: ^ -ðŁıĨðŁıĨðŁıĨðŁıĨ ðŁıĨðŁıĨ -ðŁİµ ðŁİµðŁİµ -îĢ ij -æķ ij -ä» £ -your love -yorkshire terrier -yon as -x g -wre athed -womensmar chon -wart burg -volks fest -uofl wbb -un ama -tin ari -tessell ate -tanisha amukerji -ta zo -sugarray leonard -stur geon -sto u -stigmati zing -stay safe -squ amish -sle a -signal man -shi bani -shav asana -serv ando -sakshim alik -rp motorsports -roman die -robert mondavi -robby gordon -rhyth mand -rest day -repro health -realmichael kay -re ineke -rads one -ra ymon -r br -quiz night -qu illiam -pun ks -pul lovers -publicenemy ftp -prophetsof rage -project lit -ple yel -pil ates -pi kin -philip glass -perkin elmer -per rott -paphi ope -pa ay -ov na -orlando shooting -orlando bloom -oral care -oo j -on n -ol fe -ol dis -occup yoakland -obje tivo -nag l -my g -mul lett -mu hl -movie stars -montan er -mir pur -mi bf -meteo gib -mayored lee -masc aren -maim ing -madr yn -longu eville -llan wern -liv miami -lein en -lanes borough -k vp -judy blume -juanman santos -jo wa -j tweets -j ce -isi zulu -innov azione -indi afirst -im lay -ich on -hor an -here andnow -guar aldi -gu len -green flash -gra gg -goldie hawn -god scountry -go jay -gal ley -fromthe groundup -forestry commeng -flor ine -fan wars -exmoor np -ek ar -ecw press -dro ite -dit mas -diss enter -disney nature -conceptu alised -con volution -coachella valley -co ber -civil service -ci j -chefou cauld -center fielder -catoc tin -ca official -brendan cole -bren ta -boat swain -blan ching -biz talk -ber ic -beauty world -bbc facup -auden cia -as ahutchinson -arav alli -amor pho -alcohol ic -ak int -academic swith -< =- -éĺ² å¼¾ -éĺ²å¼¾ å°ijå¹´ -âĦĥ , -à° ¬ -zab aglione -wind row -welcome week -wb kb -voc i -vision aire -uni da -ua em -typhoon display -trow dy -traveler schamp -thesavoy london -thenation aluae -sy scoin -su v -su tah -stanlee comikaze -sky science -sjo erd -silk men -sco c -sam su -sam eth -ru dan -roo sts -rela ying -red volution -re paints -quad cities -pu pillage -pro challenge -power books -pear n -palm desert -oro ck -oran allo -olic ity -o gra -no chill -nicolodi daria -nico ya -multi show -mu ter -mo ws -mi jares -matthewk heafy -massac ring -mac art -lunch boxes -lu ber -little brown -la berge -l alande -ker jak -kaz ak -kas u -kad ai -k van -k brown -jö nk -jm gardnermd -jerry lentz -jas df -jad zia -insi dere -ing gris -infinity thegame -in bath -i yan -hu kum -hoe hn -hirez studios -hi jazi -hi ers -hermo sas -hel u -greek mythology -gravity rush -gor in -go wd -global runningday -ghan af -genie francis -gam brin -ful co -fu tch -fu king -frog let -fm qs -fest nyc -factsabout me -et xwx -en h -earth work -dy sm -dra a -displac ements -dish man -dest america -cush wake -clay aiken -ci ii -cen as -cast d -bomba dil -bog ast -blin dd -blau velt -birch mount -bing su -best coversong -beren saat -beat airpollution -az nar -au trey -attenti onal -arti equitter -anton du -amlw ch -allsaint sday -al ake -agri ppina -ðŁĺĮ ðŁĺĮ -ðŁķº ðŁı¾ -âĻ¡ # -âĪ Ĥ -Ð ¼ -wy vern -wol ken -wal esc -v ult -uper girl -union budget -un dar -ultimate warrior -tumk ur -tu ska -tro c -top story -to home -ti gno -the interview -temple stowe -tehel ka -tech ne -team kitty -tan za -syfy tv -summa recon -succul ent -stra ying -stjohnssmith sq -stasi areport -sr ms -sportsp ersons -spor te -sor an -son ate -sli mes -seu mas -ser ow -scal zo -saskat oon -sarah drew -sanjay leel -ring rose -rest ing -rehome hour -quarre ling -qc times -pontard dulais -pla sse -pharmaco therapy -pen ya -peep al -pat ou -ostro wski -opier adio -o thering -o gers -o cam -nigh tie -nicom ir -nasa history -minim alist -med len -me men -marseilla ise -magnu mpi -maf fia -lu tt -love her -ll vm -liter atur -lakshmi manchu -lady bay -kling berg -keral ites -kauff mann -ka he -jane mari -jag jaguwar -it amil -inter nist -id alp -iam d -hustle hard -hone gger -ho ws -healthcare forall -har leen -hahaha ah -gye ong -ground hogs -green keeping -gor uck -fu sible -frank caliendo -final ride -fertil isation -fer mata -fen burg -fau zi -fang amer -falli ble -ent group -ei u -dogs rock -disappro vingly -deton ating -cub ator -cor mega -college hockey -coal ash -cleveland browns -char g -cham ak -can las -caer au -cad ca -buck enham -bra ska -ber beris -bel ville -bbcwales news -bac one -ba im -b vov -b dj -aç ores -ato logical -ar qi -ambassad orship -ale storm -^ ^^ -ŀ ĺ -ðŁĺħ # -ðŁĵ» @ -ìł ģ -ë°ķë³´ê² Ģ -yetto come -year sin -xehan ort -wy f -who les -welling united -web chat -wal let -ves alius -ven oms -ve dre -vas ili -vall ance -usman ov -ur gence -u mble -ty co -transfor mable -toron tonow -tmobile careers -ti jn -thrombo cyto -thin h -thewomen stour -ther mae -the tank -techno phobe -teameric sson -summer break -subju gate -stone fc -spo ker -shard london -see torontonow -se tembro -se gh -scrap books -scoo ts -sci kit -sch or -sad ler -rhe ingau -rgv wx -rem hq -redletter media -red together -reci ous -real john -raz ine -rahe en -qpr v -pu reed -psla fc -pon tes -peri shes -pel aez -pal erts -oiland gas -ofthe seas -office max -modern baseball -meth ylene -matriarch s -masse ffect -mal com -makin wa -lough gall -lon gg -lister iosis -libr arie -lean ing -lazi o -lam u -lal oo -l by -ko zo -king ussie -kil rush -ken ward -ken ard -kazimi erz -joey lawrence -jasmin evillegas -jac key -it ree -iron age -incis or -inar team -hr ys -hopen othate -hog sett -he ili -hal let -gid do -ger vasi -ge sf -gall man -gall inu -for abetter -fi ven -f bre -exp ounding -es an -er vice -en sa -en ingly -emmy awards -elms ford -elg ouna -el ya -e dul -dk v -die ren -dee waan -ct in -con ecu -comor bidity -college signingday -cli j -cd projektred -carr fire -ca jam -business coach -bu be -bruck heimer -bob sledding -bhag wati -bakhti ari -bailli eu -bag gott -bab il -ato ken -ann ers -amit sadh -agar uda -ad w -ðŁĩ °: -çľ Į -ç« Ļ -ãĥĩ ãĤ¶ -âĺĥï¸ı âĿĦï¸ı -à« ģ -zz aro -yu rika -ye asts -women sashes -wo to -wmp dogs -wc tv -wall on -ur dan -upcoming releases -under lings -tyntes field -toronto symphony -to pen -the challengecup -sya oran -svan doorne -struc turalism -stam ens -sta ip -st b -spit ball -sl ama -sim simi -sim plic -sid he -sex trafficking -sa hai -rupauls dragcon -run ralphi -runralphi erun -rip ens -repar tee -rep co -red for -re percussion -rack ley -pu ren -prin tvilla -pever il -pen edes -pas k -pal au -orlando sentinel -one ocean -off cl -nom i -nin omiya -nh p -nant asket -na pel -mun ga -mubar akan -mu is -moving imagen -movingimagen yc -mor goth -mopar chat -mindbody spirit -mes illa -maur oranallo -marvel led -managed services -man sor -male ev -lu le -lok manya -lin ny -laver ock -ki sta -kan ta -jw marriott -jo ab -ji had -it ok -isi s -ish ti -iam lp -hot lines -holling shead -holden graber -high gate -hel wig -heil ong -gu al -go tr -gel denhuys -ge hrke -g gu -fun gi -fu raffinity -fron ing -f ended -europeana eu -esken azi -ep cs -en ciso -emul lin -e zo -dor oro -di visi -decon gest -daph nia -cu yam -cu sk -cook out -con dom -cambo dge -bri ard -board shorts -az riel -au teurs -attach ment -ar vel -am pradio -am fam -al cor -aal smeer -ðŁķ¸ ï¸ı -ðŁĴħ ðŁĴħ -ð٤ŀ ðŁı½ -ãĢĤ ãĢĤ -à¸Ļ à¸Ļ -Ë Ļ -é d -zag li -y ns -y appy -wr g -wf council -war ming -ver den -veganrecipe hour -trevi thick -tough ening -tou rettes -toni storm -to ome -the boat -tay som -swag at -sur inder -sub divided -still water -steve tignor -st vincent -snow flake -smart water -show mance -sho lo -scratch ings -sal divar -riev aulx -rei des -ray uki -rache le -propo fol -proc tologist -pown all -pha ilin -pew ds -pens wordbooks -pe cora -pan telleria -orange wood -ora for -onlin enews -odon ata -o ires -now open -novi grad -nose worthy -nois y -nicomir allegro -netapp insight -nat c -ms ar -mro dofficial -mo cambo -megal opolis -mc mansion -marci a -mang ling -man marzi -making of -made tomeasure -leop ardi -knott ingley -kishore kumar -kinky bootsuk -king sley -kin tore -khu ra -kevin max -kaz eem -k haw -ja aye -infectious diseases -in with -ilovelu cy -horror family -ho stal -hh mi -h bbtv -gor acing -golden boy -garret son -gamer life -gal asso -fushi gi -fu tah -fre dol -form als -food safety -fi rish -fair phone -es am -em trains -el ver -ed app -di anat -dhe ere -de sul -da pest -corrobor ate -corri gan -color me -civ milair -cine timee -ch ich -ces spit -c andre -bro dies -bre g -bha in -barry hearn -babyled weaning -ba el -aw ai -athan s -arnau d -ar amos -aq il -appor tion -anc illa -allu sion -agu do -after burners -abc newsbrisbane -aar c -ðŁķ ĸ -å¼ µ -yne kev -yadav tejashwi -y abby -whim sically -wh ou -we sel -wayne sermon -war speaks -wander n -uru an -under dark -u uponline -u od -tze dek -ts z -trin itarian -tri fon -too ke -todays special -timp f -ti so -thing swe -theo cratic -the unit -sun news -stra thy -sto x -spi er -sho liday -ser very -sc dc -sayye sto -save ur -sa ko -rr v -rouge mont -regul arization -reas sert -re dron -ram nagar -py mat -pru den -pil fering -pan zero -pad mash -opent ennis -nys fair -niy kee -nightmare beforechristmas -nicoleand bri -n ber -mrscot teddy -mosthaun ted -mm al -michi okaku -men ti -mama hal -maha sabha -lyt chett -lov ley -lo ade -lie zel -kin zer -jah nke -jaboo wins -j emmy -ital ymfa -it shappening -is aw -instru mented -ilean adcruz -hur stresort -highlin enyc -hang nail -gor din -gon oodle -go dragons -georgi ev -garden birdwatch -gar diners -game board -g elli -forre stal -five point -fit es -ff be -fat ta -fa zak -endemolshine ind -embarrass ments -eli ud -ea se -dw ade -dump site -dou ga -donal dd -dj uri -debru ynekev -cure ton -cuff ley -crack heads -cra is -cov ell -cor c -copp ock -can de -c agon -burn outs -brü hl -brun twood -blon d -beer lover -bber ing -bb coxford -bassi sts -barone zaza -bar chester -bag al -bab b -azte cempire -ausout backnt -auction at -ate f -as rar -arkhu hro -arab ella -aldub you -:- \ -/ .\ -ðŁĺĦ ðŁĺĺ -ðŁĩºðŁĩ¸ ðŁĻı -éĺ²å¼¾å°ijå¹´ åĽ£ -à¸ķ ร - ¥ -zoo cbs -z all -yuvas ena -waz ed -ve idt -val ery -vad undee -us asa -tz ed -tt ourism -timel ine -tiger n -th inf -tetra drachm -syno vial -summer camp -stro heim -squir rela -sin ked -shar ada -samu ele -saan ich -rio ted -ri pro -queens berry -psycho somatic -pre treatment -pr il -pla isance -pickup shadowhunters -over stretched -ov ni -ostr ac -ok orafor -oc z -nikit in -neutro phils -nau seam -monic as -mis on -mini stre -mercat us -md x -mal usi -mad hura -ma shan -lu iss -live sound -li iiii -lau v -kil ledit -kap ler -ilove wpb -ibu solih -i wb -hull city -hayward sheath -ha bano -guthri e -ground nuts -green all -god father -gobier no -giar dia -gand hara -gag liano -fr ings -fox field -ff u -feel in -fe compendium -fau teuil -every little -ethno botany -et zion -esp alier -end sars -dum dum -drif twood -disin her -disch ord -digital globe -digi bytecoin -dethr oning -de mur -day job -das sler -dark wood -dan forth -commercial ise -com us -colon nades -chiff re -chem ung -cbc falc -cap ut -cap ucine -can tus -caix inha -bikini body -bha bie -batt y -av aya -ar bat -apoloo hno -anesthe tist -am bati -alo ves -aker shus -ait ken -afan art -abay omi -... ðŁĴķ -! ðŁĮ¹ -ðŁĩ¦ ðŁĩª -éĸ ¢ -ا٠ĥ -z radio -yz ors -wra yzors -wr hs -wp sproud -what more -wer x -we p -vish wan -uw madison -un suspected -tri fari -todd dammit -tegr ity -tee shirt -sx s -swear ingen -sugar foot -str ouse -sof steel -shy glizzy -scu stom -sb se -sant acon -saint field -sahy adri -saaraa alto -row se -rod taylor -ren tin -re formatted -publ ick -pro enzas -proenzas chouler -pon gal -polaro id -pic tou -pex els -peop l -pay per -parthasar athy -outre mont -or cl -optic h -ol hos -oc ket -nes j -n cats -my favourite -musk aan -montal to -mon forte -mon ami -mom bas -mi shi -me on -married life -man madhudu -lunch box -lovefor sam -long port -licht steiner -lawandorder svu -later als -kunst museum -ku czynski -korn gold -k run -k ramp -jeopardi se -j ati -ip es -iop sych -io annou -integral yoga -ini ka -igen berg -ifc center -i ppy -i hrc -hynd land -har bert -great nature -gre engage -giug no -girls that -ghost sign -getex cited -ge henna -gast ineau -garden city -frankieco cozza -fr itch -fat was -far me -ey res -etri gan -eti da -ent on -en ak -eg w -e spirito -e rebor -e migr -dis orientated -derby museums -davide igenberg -countryfile live -corin thos -constric ting -co stest -classi st -cla rey -cherui yot -ch he -castate parks -cassandra sleee -c gt -bun gend -bott ineau -bor gne -blood good -bleed in -berg gren -baku go -av ely -at ang -ari fin -aquan aut -amph it -aldub for -alco ves -agha doe -agent ur -abric ation -abri stol -ableton live -ab yan -èģ´ãģĦ ãģ¦ãģĦ -â̦ ... -Ùĩ ا -³´ ìĿ´ì¦Ī -zin chenko -you willbe -wv ua -white wood -vu yo -vitabio tics -v ont -v aren -u mina -tro eg -travel quote -tr yn -ti zzy -thrombo tic -thol yoke -the fight -tar vin -taj iri -syke sville -straight outta -stock brokers -stobart group -ster ility -sta h -sky sportnz -singlec ell -sidel ining -shou sing -shi jiaz -seon gnam -seanpatrick flanery -se sam -scream ers -sch moe -scar nival -saharare porters -rr u -ro sab -right stuf -rake shroshan -rake em -r yoga -pul let -publi us -pro finet -por at -pol vo -pic cini -phi delt -per icos -pau low -owen sound -north end -niykee heaton -newsar ama -new release -neutr alised -n co -n clc -move theneedle -mort lock -model railway -mo cho -mis sour -migra ine -mewseum monday -mati gnon -mat ula -mat tawa -man eesh -lu vu -kyo jin -kurtv ile -kne ec -kir kenes -ker rie -k pcb -jones music -jo ema -jer oen -jen lisa -j vs -j anni -ix ia -intelli j -inte xt -int acct -ing my -indic ud -ignit er -hor dern -hol ms -hin ching -harvey weinstein -h ff -groo k -green burg -great times -grad life -gopher hockey -gi galert -ge sucht -gael scoil -gab p -g me -g afc -fy inglife -fortn it -forfe iting -fol i -fo day -film life -fiel den -ff ert -empath y -ek or -ecre ek -e mond -dra vet -dje mba -dis qualifying -diam anti -cush wake -commo dore -com unity -chrissi efit -che ff -centrifu ges -cal vert -brief er -bridge fc -bran de -ber minat -benef ic -be ziers -bam berger -ba jan -azi one -ax elle -as cl -are gbe -arch stl -arapa ima -ar round -anyou neversee -ann ago -ank ole -am bula -allin with -ali on -aap ko -! ðŁİīðŁİī -ðŁĴķ ðŁij¯ -ðŁıĨ ðŁıĢ -âģ Ħ -Î ¾ -zoom car -ysle ta -yaz awa -yar wood -woo do -wkr c -white horse -whatilearned today -whati slife -wh dh -wat ain -vol quez -viol encia -un moving -un luckily -tra versed -tommy wiseau -tom asso -todddammit kerns -ti mate -the zoo -the vic -the amas -ten ews -tc w -tal bot -stan es -spast icity -sm soc -sla unch -si ang -shi pper -sheik hu -shar pless -sf m -schoon maker -sales manship -ry thm -rotar act -romu aldez -retail design -rescin ding -rcmp mb -ran sacking -q ic -psin sp -program matically -phone mic -pequ annock -pe a -pc game -paras auro -ous ley -one iric -of x -objec tivism -nz inga -nwa chukwu -neck pain -n aper -myodd balls -much hhh -mr h -moom oos -mob ilit -miro slava -millin ocket -middle grade -mel co -mcdon ogh -maroon dah -marit ima -long ine -liver adio -les bi -le me -le frak -lady boy -kat zman -jo da -jen is -j ss -itsuku shima -is ap -ili z -igh ty -identity theft -hiphopp antsula -hel ichry -healthcare it -han au -ham park -gu jar -gp cr -go gulls -gang war -gal low -fu rie -fbal lus -father son -ec assidy -e zzard -dur row -du vets -doub leg -dor na -ding a -dev aki -del homme -daga ati -corn ella -cinephile photo -chamber of -cam mack -bungend ore -bun o -bott band -blood money -bit d -bend ita -bar ah -av ad -aust ins -arvin dg -ar od -anti doping -ant ar -ali ster -al vie -ai ps -aerop onics -adidas fballus -\ ( -. âľĮ -ðŁİ¼ ðŁİ¤ -é Ĵ -yo gad -yel verton -wol pert -wld life -wi ggers -wat amu -waffle crew -vere em -thunder nation -ten sioning -te cla -te cha -tang ential -tan ke -tall ships -step wise -sor ong -sn d -smy lie -silicon hbo -sil vey -shu mmels -shan ter -seton hall -se ble -scar abs -scal ps -saumy atandon -sang ay -roysoc med -revolu tapp -relax er -relax ationday -rege x -readju sting -ra kel -r jc -qui res -publi shable -pleni potenti -piti fully -par takes -oy ler -over hyped -ou ise -osa ki -olober syko -ni bel -newed ition -mv ci -mu cker -mt ps -monte agle -mobi lebanking -mello phone -megab yte -manga studio -lover ugby -london npc -lit fest -lind blad -leff erts -le dgers -lc cc -lauren lapkus -lamo ille -lam bourne -kry ten -khodor kovsky -kal enjin -jo suke -jefferson town -jc zyk -ip man -interior decorating -instam oment -idhunamma aalu -i dontw -hun do -hether sett -hau ghnessy -ha ith -h iso -gwyn ne -gu ck -gra un -gra ub -gob bling -glenfidd ich -gi jón -gi bill -fri is -fl sen -fire tv -fe delin -fc ps -eu refre -eo incol -entomo logists -enni g -du th -du melo -drop zone -dining nc -depu y -de stry -de eded -danc o -couple ts -concu ssion -col chic -cl onic -chil ena -chat tel -char mian -can be -cafe press -bt spor -bren ner -brae side -bonnie and -bear mccreary -bang on -ba stow -ba die -av ta -anti fouling -amrap ali -ak ota -accessori zed -ac rid -ab big -= ' -ðŁļ Ľ -ðŁij° ðŁı¼ -ðŁij©âĢį ðŁİĵ -ðŁİī ðŁĴĥ -ðŁĮ ĵ -âĿ¤ï¸ıðŁĺĬ ðŁİĤ -Ê ĺ -ye won -yak ko -wr m -worl wide -wor x -wi elder -water proofs -vivac c -vi rens -unequ aled -tl picks -tiger sfamily -the mc -tex eira -tellem jaye -te are -tanner foust -ta are -t enta -story map -stockhol ms -standardi se -st rock -speci a -ski pper -siem ens -se ai -sdg action -rone ttes -richard j -ri ata -pel meni -peking duk -pe ffer -pas sin -pab on -ot n -oo on -one gative -ny autoshow -nj enga -niki fyinglife -new i -new car -nb alive -nanow ire -mt fc -morbid elli -marqu ina -marindu que -man gwana -lyric belfast -luzh niki -lu sive -lid combe -lib man -li ban -leve ret -latch for -lan go -l spraggan -kel si -joshab bottband -jim sterling -janemari elynch -international kissingday -id wp -i yaz -hungry house -ho ppa -heb buli -hd ms -happy pride -grand teton -gr rm -gold box -gang i -game strong -gam i -g fg -fu ente -fen oli -fal sa -eye brow -erri ble -er hardt -encant ado -em slie -edu coach -ed itio -echof ox -drew seeley -dol lis -di ene -der ay -daw it -dan an -cryogen ically -cre o -cra bbers -corrobor ated -cooki ed -citrus bowl -che b -chander paul -cham plain -car forsale -canyon fire -caloosa hatchee -bumb ashi -bl undering -billie faiers -be intheknow -bbc cov -ba bes -b ason -ay er -autom arketing -auto crats -atal ji -arri vab -antoni osab -amo c -amerikk ka -am ax -albat rosses -al ha -ail i -ah wah -aga h -affil ate -abri el -ab ase -ab ak -ðŁļĻ ðŁĴ¨ -ðŁĶ¥ ðŁİ¶ -ðŁİµ ðŁİ¶ -ðŁįª ðŁįª -ðŁ¤Ļ ðŁ¤Ļ -ì² ľ -èĪ ŀ -ਠ¸ -yl va -wo chen -western ghats -wal kleys -viveko beroi -urban iak -ultra europe -tun nell -trail way -the mbi -the evening -texas monthly -super fici -su di -squ ill -south ayrshire -soft wares -sny man -smer ch -smallstreamers connect -sk rein -silver hill -sh andi -sen sen -sea power -sat anas -sare gama -sa ren -row ville -rosen zweig -rich gang -reserv as -red bulle -re mon -q ds -prag matics -pr ound -piece hall -persuasi ons -performance art -os mania -on paper -o ae -nor il -nfl sunday -na jar -mr joe -mn timberwolves -mm cr -mel by -meghan mccain -mc moran -max g -maup assant -marriage bootcamp -margare triver -mac eda -m sal -lieben berg -leys in -le dg -la ster -kis san -kar and -johny hendricks -ji ocare -jean loup -je ant -jacob s -isa beau -intersec ted -hrishi kesh -hockey town -ho ca -hin richs -her nameis -hel enab -heart and -har ra -han z -hal di -ha sk -gun sout -godzilla kingofthemonsters -git eau -game digital -fof ana -exo genous -esc at -erzur um -digic el -deri paska -de soto -crew mates -cor ail -copper smith -consig liere -con cho -ch ingly -cau very -carra geen -candle mass -cal k -c chooks -bru mis -british summertime -bram cote -bb ar -b pr -avent ine -auctionat alive -ashley judd -ankit lal -ale cia -aimee mann -aham eed -agon zalez -abdash soul -ab ert -ð٧ļ âĢįâĻĢï¸ı -è½ ī -å®ĿçŁ³ ãģ®åĽ½ -âľį ðŁı¾ -âľ ª -è que -your majesty -wrps rockland -with dean -willi emullin -whole wheat -whenin rome -weather alert -wab ara -wa then -vijay deverakonda -up tuks -u or -ti sing -thoughtful thursday -the shardlondon -the digital -sur realists -sun ol -stormbre aker -stim me -ster ic -stein hauer -staip ans -sru d -sportsc asting -sports massage -sin ne -si guen -shi ppen -seet trading -save themall -sat er -sa igh -sa hr -s ft -ru as -ro mil -respon se -pu ca -propri o -pro vable -pri der -plan as -pham ous -perpetr ating -pel ita -pe ddled -parasy te -pan tha -out witted -out ils -ous seau -ot k -ol ake -ny ad -nor mann -no edit -nag araj -mire la -mi eux -mega house -me rend -mary rose -marc ille -manushic hh -mad man -m jin -lo set -lim pets -len hart -leg ance -lacey chabert -koin ange -kle ve -kesh asuxx -kc traffic -kab uk -k nac -jur mala -jaun diced -invali dates -ini photo -ilm wx -ido los -ic at -hum vees -happy yyy -grub street -go zips -go bbled -ger minal -gen re -gand his -followyour dreams -flore sta -fellow ship -eyewitness nyc -evangel os -eskenazi health -es ad -elle decor -do bel -del his -cri sfield -conge aled -comp diningnc -chicken wings -chae bae -cer atops -car michael -cairn staipans -cade tsuk -brax tons -bour seettrading -book direct -bon if -blin ka -bil our -bick more -bei sel -beau bien -beach walk -backto you -at midnight -ak hand -ad ari -aardvar ks -] @ -ðŁij® ðŁı» -âĿ¤ï¸ı ðŁĴľ -âĢ¢ *¨*âĢ¢ -Ø® ت -ÅĦ sk -yo shis -yat ai -yale britishart -woody inho -whel chel -wake ham -volvo trucks -vol land -vl tn -verti ginous -val met -v wf -united by -timb its -thy mus -thur day -the village -the face -tas kin -suc cour -sub mission -su mar -social ised -snu ffer -slav yansk -sj fc -show choir -sha ren -sas ki -s biz -real monarchs -re gol -ram mandir -ra bab -r vaidya -puer tom -poldark pbs -pninator nai -philosop hic -pay zer -parasauro lophus -paphiope dilum -otra sheffield -organiz ational -or tona -ole mia -od deven -obfusc ate -ny fwm -north london -no deal -nm fc -na ak -myfour cats -mul ga -monte go -model sown -mod cloth -mic an -met alist -mega structure -mcgoo han -marth ac -m acked -lu bumbashi -la ich -kup chak -ko bolds -ki pps -ki and -kev ich -kap uso -k wat -jet se -je j -j nd -j ml -itsal way -it um -ing rate -in expensively -hyn chus -holmen kollen -ho berman -ha inaut -grader ocks -gen ies -ge mat -francis cus -foxsports go -follow er -flat pack -fabi ano -ex clamations -epistol ary -eoincol fer -ema m -ek deewaan -ecu piratesfb -do stana -diverticul itis -discover la -disciplin arian -di benedetto -de weese -day togo -davey havok -comedy show -colo ssi -co win -clande boye -chang elings -castan o -canadapost corp -bu jang -bre slow -borge ousmusic -bin x -ber hampur -benson henderson -bas ka -artsc entre -armor ial -antigu abar -antic y -ant olin -anony me -almost famous -allo h -all thebest -aj ola -afternoontea week -^^ * -ðŁıĬ ðŁı» -ðŁı ĺï¸ı -ðŁĮļ ðŁĮļ -éº » -âľį ï¸ı: -âĢ¢ âłĢ -young ji -you se -y wood -wo begon -white marsh -whi ppy -where with -wf nz -wester lies -ween ies -we ard -wash outs -waron yemen -vi bert -var u -valley fire -v rt -uc its -tu me -travel quotes -travel agents -trade talk -themira gelv -super novae -stol t -ster ols -shereen bhan -scri pta -sanjay manjrekar -s ved -reve re -pretty boy -predic ate -port colborne -pin zon -pin el -pic tet -pas richa -pan talla -outag amie -on fc -nissan uk -newsp ic -new shoes -neve u -ner fs -nen go -nac i -mose by -mon hegan -mom ento -mo hr -misse dit -mete pec -meen u -mcin tyre -mat shummels -maje ski -mah y -mah lon -lycam obile -lumin al -lis ation -le vison -laurid sen -lar khill -lam ina -l brut -kou m -king ricochet -kin ged -kildare gaa -kell man -kc pe -kay ley -kal pat -jar vie -inst l -hob good -ho gle -he sh -hall inan -gyeongbok gung -gou k -gaz ipur -g ny -fulton coschools -front als -football league -films official -faul ting -fau s -extor tionist -erin cruz -engine ersweek -eless ness -dox ey -dis comforts -dio u -dazz lingly -cut throats -comedynightswith kapil -cle liam -chine sel -ce duna -cat olica -car ya -brexit deal -bo swell -blun kett -bill u -ber ges -ben sen -batchel der -barbic an -bar the -b bu -av athi -autum ne -au vsi -ator sk -ass ja -ar lan -amu sique -all one -ahon a -af shar -! ðŁĺĿ -ðŁĴŀ ðŁĴĸ -ðŁijĢ ðŁĺį -á´ ¥ -yol andi -yogare treat -ym ous -ym cofficial -xoxox ox -williemullin snh -wido wers -wex ham -westhigh land -war is -wa ay -uranium one -un gli -ud ham -u calgar -tweet likeagirl -tur lough -thunder cracker -thor is -ten sity -tang ere -tan pa -tal mu -suni el -sm sd -show addy -shop girl -shankar raja -sha fie -sextu plets -scroo ged -sc alling -sans tha -sag ara -rovere to -rossi o -rec all -prairie chasers -pepe aguilar -papill omavirus -pan ico -oo ey -odal isque -notan other -nol lywood -nikon owner -nightshift beer -nesj loch -mú sic -my rie -my great -my fan -mun caster -mon ier -mipim world -mat suz -man je -lo pilato -lew dness -kul m -kom iks -klingh offer -kepp ler -justin hartley -just love -jer zy -it oo -ilo pez -hermi da -harjit sajjan -h alling -gun ne -guer illa -go dan -girls not -gearo id -ge us -gar u -gale abrewer -fri endo -fish fry -et cs -esoter ica -elek tro -duck bill -dot me -distill ery -disfru ta -diamon dring -deu sto -defence men -de anda -dd firish -day tripper -d windle -d gaming -crui secontrol -cruelty free -cropre dy -cran nog -conval escence -col beck -cb buk -cat tery -budd hi -bot tes -bolt action -black dress -black beauty -beque ath -be son -bar bag -bante ay -bang ko -at tests -artific er -arn ley -aregbe sola -ap sc -an ot -alphon se -alab amade -acci ones -abat to -aat r -a ill -ðŁļĹ : -ðŁļ© ðŁļ© -ðŁĴª ðŁĻĮ -ðŁį©ðŁį© ðŁį© -éĢ ± -ãĤ¤ãĥ© ãĤ¹ãĥĪ -âľĶï¸ı . -â¬ĩ â¬ĩ -ঠ¾ -whit etv -wat ing -vin ilo -vagab onds -un welcoming -un wary -un masks -tux edo -tru g -tp wd -touri sme -touch my -too ker -toast day -to lo -the clown -teng ger -ten ino -tatt nall -t ö -sum mith -sug ata -stwee tings -stu pas -stewar ton -spray tan -sop ron -sion i -shi moda -shash lik -seh ri -sc ure -sab iha -rush cutters -rudimental uk -roy ds -rober tg -ridley scott -re ap -ranz kyle -r breich -popular ised -pol onium -po kor -perplex ity -part time -paris marathon -padman ab -osco da -oregon football -oo of -om kara -ny pa -north wood -new school -ner music -neh len -nationalvoter registrationday -nation alized -mur mer -mu u -mand ela -m sti -lw lies -le ggins -la haye -kon adu -kokol ondon -kir tley -kh oops -ke sho -jon ation -ja ane -j du -is mrm -irreversi bly -insubordin ation -insafi ans -ignati eff -hor ns -holt mann -henni ker -heilong jiang -head and -harperadam suni -h elling -gu ap -great service -good kind -gol spie -getting ready -ger be -ge deon -fuzz ed -free picks -four tet -fon ics -flann agan -fire r -fethul lah -feline friday -fan wood -f mea -em rah -dil shad -den sification -de bar -crit ch -che il -cene rentola -caram bola -cal lip -cabinfe ver -business strategy -bri stling -bre ann -biz markie -bio ethanol -big ler -bab ers -b movie -az gov -asphy xia -aqu aman -apple edu -ani ze -an az -am h -alamo bowl -ah iri -adar sh -? âĢĶ -... ðŁĺħ --- ' -! ', -ðŁĺŃ ðŁĴĢ -ðŁĴĥ ðŁİī -ðŁij½ðŁij½ ðŁij½ -ìĹ ł -æ § -å² ¡ -ÙĥÙĦ ÙĨا -zu an -x ara -wolfal icemusic -wm tw -willo wh -wik icom -wi ggling -w inge -vill al -verdad era -veg f -ush l -tv s -the leader -the hive -tequil as -tag al -tack lers -sur feit -style blog -steins gate -star finder -ss ure -so ireland -sla pdash -sko dauk -sequ atchie -sebastian rulli -schem bechler -sal mag -revan che -repl ou -re evaluated -raf brizenorton -r fo -po lem -pat waris -p cn -only on -nulli fies -muscle tech -mul lein -mou li -mont illa -mo tho -mil ap -miguel cabrera -medi adays -mc cambridge -long life -li mbers -let aba -le yo -labu an -kemb awalker -ke len -kcr anews -kcc afc -kar lie -je evi -jason dufner -jagadish bliss -jag ged -it sv -ir one -ipriyank sharmaa -inter ac -i vig -hil sa -he ttinger -harpers bazaar -gun show -gu lli -growingup black -groupp lc -group set -gro ad -gri saille -greet ers -gor go -goodto great -go colts -gener o -gc morningdrive -gav yn -fitz water -fel ty -es ol -es ada -erry body -eeee ek -dingh ies -dhru vanatchathiram -dem party -cy syll -con rado -change severything -chal oner -chal am -cer titude -cdn sci -car quest -car lina -cabez as -bus stop -bob saniga -bo sko -bmo harris -betty white -b sor -az tlan -aruban etworks -arti stique -ar mando -apoor v -all gä -alice a -air cargo -ag ur -adalovel aceday -abot anist -abac us -a otd -a ayi -a ara -ðŁĴ©ðŁĴ© ðŁĴ© -ê¹Ģ íĥľíĺķ -â̦ ( -zor ya -zoo z -x liv -wyan dot -ve tt -unic y -u waterloo -u ja -tren a -toy spotting -tower hamlet -tl ry -thorn berrys -thom ast -telekom wall -te shima -t pk -sur mount -strange music -stead ying -standwith israel -stam ets -spell caster -spedi zioni -sn ac -sin bad -silver oak -seb aceous -sau dagar -salam is -ride to -remo teness -ready togo -re asure -radioc itizen -qu ie -q magazine -pymat uning -pul sars -pu spa -profit eer -pro du -presu mes -pitt ard -peak auto -parathy roid -over consumption -ou tre -oli vers -ofthe sea -o thon -nov ae -not me -norder ney -ni me -ni hilo -network security -need ville -ne yed -narasim han -musix match -motor able -mo ger -mini mization -min ting -men ia -mcil rath -marinel itter -madi keri -lu stre -live world -lever hulme -le lang -le com -knight stown -ki evan -khim ki -kee pers -ka ag -judith light -jeremy piven -jas mith -j ji -ioc media -inver loch -im plan -il vo -ij ssel -ibrahi ma -her ff -helli well -ham mes -ha chem -greet z -greek wine -great york -friday feature -fo gg -flax man -fal chuk -fail ing -escu do -ery x -ehr hardt -dur man -dubu c -dis connected -dev arak -der yk -dar g -d green -cu ello -counter acting -cor win -construc tionist -ci brian -canadian open -breath nach -boling broke -blacke verything -black well -black catsrule -bergh olt -ber lay -begin shere -beaut ys -be eee -asi at -as selin -artgalleryof nsw -ani kan -angel haze -an gol -amal ick -adhi kravi -abar ca -a inc -ðŁĴ¯ âľĶï¸ı -ðŁIJİðŁIJİ ðŁIJİ -çĽ ¸ -æĭ ¡ -ÃŃ rez -´ âĪĢ -zam asu -ye aaaaah -wrestle mani -win driver -waffle day -vin italy -video gamer -ver wo -val ya -univer selle -tv w -tumble down -ts it -tra urig -tr ond -token ized -the doctor -tg sports -sy ch -sport pe -social ites -sham en -shakyam uni -septe m -seib old -salesforce devs -saha j -s vin -restaurant news -red hawk -rebutt als -re titled -rajiv message -prolifer ating -plumb ago -pe tu -pe leg -pd st -pale face -over running -onon dag -nn pa -netro ots -n illa -my bb -mon duk -moisturi zers -mohan lal -mo pen -mil kovich -man aka -maid ment -mah ina -lance storm -l me -kleptom aniac -kingsc ross -king stree -kindle book -jay buma -jaybuma om -jas inski -ivin ghoe -im r -ifbb pro -ic ent -huf nagel -hit sville -h th -gy am -good witch -go titans -go ffman -gear shift -fy b -fre ds -forex trader -fol s -fad l -eun an -ess chau -esp ouse -en sky -eagle man -e store -dre wett -draw tober -dj h -dizz bee -dece ase -death stalker -cra il -cour noyer -coun seled -color ant -cl wyd -chon ors -ceram ica -celi k -career tech -bryan clauson -boooo om -bol li -blooming daledc -bl ico -be tway -be muse -basili que -avi shai -astro photo -apal ace -anti ageing -anodi zing -anne hathaway -anjan avj -alvv ays -almu dena -ac ai -aak nopf -? ðŁĺŃ -; $ -ðŁĴ· ðŁĴ· -âŃ ķ -âĿ¤ï¸ı ðŁĺİ -âĿ § -ร าย -Û Ķ -Ë Ĭ -ya o -wo y -winter in -winston salem -wi king -warhorse studios -usur ping -ur ca -uni fy -un ita -un alienable -u ht -u asin -traitor trump -trac s -tr illian -tourde suisse -tomas elli -tinari wen -tiddly winks -three js -the pig -thank ss -th rap -techno cracy -te ake -super mare -summer bash -su dip -stri al -sto key -sk up -simad wasim -sha fik -see ster -se mer -s ical -ruhr gebiet -ron sexsmith -rochelle humes -ro tondo -red z -red pill -real news -re processed -raj hi -pomer antz -pho cu -pete y -per al -paulma sonnews -patho logy -palam pur -over rules -o had -nv h -northant shour -no cera -natali ep -mun ari -mu hd -mtu td -migu ero -me cum -mccour y -manushichh illar -mancity women -main landers -madelaine petsch -love hate -llll llll -lic ey -li mm -li dell -let tera -legoland florida -lag ell -la gaan -kvad rat -ku ff -ko san -kevinolear ytv -johnnie walker -jer g -jenna jameson -iran talks -im bert -illiam son -il ynx -ichthyo logy -horse sofinstagram -hor ti -holo han -gw mag -gujar att -grrm speaking -gre ave -gla xo -gh pl -gaz ania -gain fully -g ics -freedom caucus -foto sred -exu ded -es war -entre met -electric ity -el itch -ei le -ei k -ear le -e bs -dry bar -di metro -deta ching -dath lete -cze wski -common s -coach k -ce mil -can as -c summit -bur treynolds -bur row -bu ana -bharathan en -beer tography -bat tist -bas ca -auto chrome -audi os -arvi at -ap lit -an ley -alim entation -aliciavi kander -alegg ero -ak ids -... ðŁĻı -)))) )))) -$$ ! -ðŁĺĬ ðŁĴĽ -ðŁĺ±ðŁĺ± ðŁĺ± -ðŁĩ¿ðŁĩ ² -ðŁ¤¸ âĢįâĻĢï¸ı -âĿ¤ï¸ı ðŁĴĹ -à¸Ļภģ -ಠ£ -à¥Ī à¤Ĥ -ze itz -wyn ford -wr its -walla hi -votedem sout -vic parkacademy -v md -up voted -u tong -u ani -tr yn -todayin prog -there bel -tamiz h -take walks -t fm -swann anoa -stre cords -st ns -spec new -space marines -socialmedi am -sd x -scroll work -sai fi -s gbv -rin dge -railroad er -pu ddicombe -pop mech -plan thealth -piti ed -pav lik -out lasting -nff network -new ell -ne trunner -nd pldr -mu sson -mor ass -mon sef -miracle treatday -mcki bbin -maz ara -kron berg -km ss -kis on -khan de -keepit public -kam sa -k san -just ici -j co -is ymf -inter fax -ick en -hast ens -ha ka -h tweets -gre sford -ge trowdy -g lines -fu zion -fu gs -ft nqt -fre a -fo sho -flo rea -ever body -et attoo -er stalk -ent rap -empor da -ellen son -el aval -ekdeewaan atha -ee er -ea stover -e ion -drumb agus -dr al -dor rian -domest ica -dine fwr -digital learning -de baser -david ferrer -dareto achieve -da oust -croco dil -crit ica -cos ch -corks redfm -cooper ator -che me -ce deno -canary island -ca ele -brit ton -bil angpilipino -bhan ja -ben souda -bed stuy -bed der -bac sin -aval ok -arti stin -art sctr -arri age -appro che -ankush loveuall -and alex -aldub ftnqt -advance qld -ac ckickoff -ðŁ¦ Ķ -ìĹ IJ -zul ki -yel a -yayo tte -world whiskyday -wo whead -wira djuri -wim bush -wee ty -wav ell -vijay tv -vibr ators -vel indre -va ine -ucu strike -tze hn -ti german -thin ness -sunset strip -sun records -sul than -speak ership -sne ach -sl r -sky harbor -si pri -shut en -sho bu -she ilah -search andrescue -sch euer -saving system -sav ar -s shop -rut kowski -run streak -ronde santis -r pas -r ala -quadri ga -prof dev -pork ys -or dem -offer te -o hene -nw sw -noaa fisheries -ner am -ne so -n sel -mitchel musso -mega project -mccre ady -mc peak -mas ke -mary lander -mar ris -ma es -lu gh -lovel ove -lohen grin -lev ick -leigh anne -leeds museums -lazz aro -kv bohra -kra fty -kom mer -kim jun -kha e -kempe gowda -kad ı -juli ahb -jeopardi zes -jdff fn -jaw ara -jason reynolds -jar boe -indie films -il mu -hinching brooke -har ahan -hai me -h enton -grac in -goon di -girl school -gar bett -fore tells -eye em -et g -elimination chamber -eff endi -e hhhh -dy bbuk -dor ries -dom pet -dir ilis -dioce ses -defaul ter -cron an -cring y -copp icing -cle atus -clam ouring -ci elo -ced chat -career center -care ening -capit ole -can nock -cal state -busy ness -brown thomas -brown ing -bou ille -bj ör -bio y -bergen county -be abin -back pages -bab lu -aw sum -aval ance -av anna -arti k -antoniosab atojr -anan avarro -alu ckett -all ene -ak or -ach tzehn -ac anth -abou bakar -ðŁĺĤ ðŁĴĶ -ðŁĴķ ðŁİĢ -ê´ ij -ê° IJ -za hid -yel les -wra c -wer q -weis ser -vit ek -visu ally -vill ach -vandana shiva -ur win -uniof glos -tweet suk -too short -til les -thenext one -the grind -ter ai -ten sai -tele vising -tann is -strath allan -solihull moors -so lie -sj hs -sier re -shop at -sex posed -resu me -ram lal -ra zzo -ra uh -ra ggi -quatu or -pulled pork -pon za -ovo xo -nokian etworks -nbs frontline -nation alization -n qf -my lanta -monoli th -mish kin -marshall u -mal enko -ma ire -luxur yy -lu chino -lps leads -log ne -lah bati -kno tto -ke me -ke ito -kalani thi -jönk öping -jab ot -j cg -inthe woods -inter lace -in reallife -in kers -illusion ary -iam super -horri fies -hi ebert -hex ane -here comes -hep cat -henning sen -he dden -hb wx -halt whistle -ha ine -h kl -h bu -greatocean road -gi gan -gi ardina -geek out -gas prices -fra sers -for thood -first champ -extre mo -espou sing -er ci -eng irl -ds band -dram atical -disa strously -dil ruba -de freitas -daugav pils -daress alaam -dam ine -clean technica -classic motor -christopher sean -chif ley -chan teur -chag os -cesen atico -car chives -cancer prevention -camillu ddington -bwn sft -bro dgar -bo it -bil ad -ban ki -bam bara -bachelor nation -babie jaan -ba rer -b sh -aurorahu skies -ashi k -as de -ar uknews -anu ma -anamne sis -all ant -alex the -ab ug -ðŁĴķðŁĴķ ðŁĴķðŁĴķðŁĴķðŁĴķ -ðŁijĮ ⾨ -ðŁı ľ -ðŁĮ ģ -ë§ IJ -âļ Ľï¸ı -à® ± -Ùĥ Ùħ -z iro -wonderwoman film -wash spirit -ward han -w va -volve remos -user research -unstopp ables -un youthenvoy -tnt vote -tie breakers -tic hy -theblue coat -the pro -th alab -te tes -tan dil -sw u -stunt men -stat erooms -sri aurobindo -spear heads -sos fanart -sma drid -sig mak -shung ite -shelove sme -see hofer -samu raic -reg la -redro ses -rad agast -queen stennis -pink villa -pin jarra -pad an -p tofed -p list -oy j -oswald twistle -oh u -nu va -notor acism -not that -nor wic -ne ste -miz utani -mis sma -mick legate -med lab -ma sto -m ve -m pre -lit o -ley music -lev ator -le pine -la ket -kwant len -kor dei -kk onen -ki ppa -kell yayotte -jim james -j assie -it ories -io h -indian river -hom ilies -hom enor -he mmo -he do -harland williams -hang i -hak ama -hac ke -ha cha -gray bar -glob alizing -glen mark -girl ll -gi essen -gar hi -g wang -fri jns -freedom pop -f op -f bisd -ecuad orians -ea stre -e toe -dro me -dri vin -dk b -dispro ven -dir co -db sk -days gone -dan aroh -danaroh rabacher -da ira -cuse football -ct fletcher -coch lea -clan sman -chit on -chandra a -cente redness -cci w -cat kin -carpet cleaning -c mcs -bur ritt -bur rit -bur ps -bristol council -breconbeacon snp -br ous -bmoharris bank -bittrex exchange -bhagal pur -berg ü -bath chron -bad boye -ay ami -auto shrine -atlantic ocean -ash ur -any where -and ora -an r -alabamade ptofed -al smtl -al goa -ag ener -ad missible -aci do -ac sc -(** *) -ðŁĺį .. -xoxox oxo -wood cliff -wa hhhh -wa ala -vi official -val da -un revealed -un ct -uc ina -tucker ton -top or -tony t -the cottag -that momentwhen -sã opaulo -ss and -sp ates -soar ing -slu mming -shy la -shir king -shak ha -ser ino -sequ al -sea quest -scum villain -san chita -samsunggalax y -sakura ba -sag ot -rosen field -reclaim temples -re vent -re housing -radi ot -ra wer -ra kia -q music -publi ka -primary school -pic say -pha i -ph ans -pg tips -pelo tonia -panzero tti -pad auk -pa pps -p fl -oster ville -nu oc -nrl storm -nor c -nid drie -nationalcheese burgerday -nation alize -nan og -nag ma -my rin -monifi eth -mat twal -mar kups -mag ery -ma zie -m dotnews -ll cs -linsey godfrey -la don -klu mp -kings road -kher son -jon te -je had -jagi ell -inter ludes -instagram aviation -inspir a -ingeni eur -in z -ike me -hotel ympia -gu agua -glo ved -glo ats -gh ook -gam pel -fuel band -free guys -fre un -filip iniana -fil ipa -field view -felic ite -eye sof -en strom -eat local -easter by -e je -e est -dys morphic -dur ston -doge ver -dinner party -dic kie -delhi governance -dave matthews -dar waza -cor zine -coc chi -cirro cumulus -ci err -cfl draft -cash cow -call al -bunting ford -border security -bobby flay -blood wood -blo on -bible verses -bham bri -belo it -bay da -as microbe -ar lyn -ar ada -an derer -amandase ales -aerom edical -a angan --------- - -(*´ âĪĢ -' - -ðŁĻĮðŁı¼ âĿ¤ï¸ı -ðŁ§¡ðŁ§¡ ðŁ§¡ -æ¸ £ -âĻ ¿ï¸ı -ñ an -yu kino -yim by -worlds best -wood chester -wonder la -wire tapped -was ley -wal shy -visit wiltshire -u av -tun aji -tororo sso -ti sd -thalai vi -tay lore -tan ev -tag esschau -ta vener -swift water -swayam sevak -stat ecollege -sm oooo -slu dgy -shirat aki -shic ooks -shell no -senbill nelson -scro ps -roar for -rider nation -reza ian -reu el -ren nan -reis inger -reflec tance -recali bration -re eeee -railway men -queré taro -pri am -pre stel -pran dial -post grads -po too -plas matics -peace full -organic chemistry -onther ange -o zeki -nvi dia -nuit blanche -nau fal -n mw -musik verein -murmu red -millen colin -meth ley -me ggy -matti oli -maha veer -mah mut -magno liam -lo cum -live work -li pi -li le -let son -lavany ab -larkin poe -la isse -kro ko -kor is -kal ev -k snt -k mox -jojo lion -jersey boys -jamai raja -iz nik -hypn ago -huawei mobile -hr weather -hol son -highway sengland -heteronor mativity -her berger -gy ps -gp b -go vikings -gat wick -gal al -g vs -fra zer -fotogra fo -foot ages -fogel berg -fashion diaries -europe union -eti seo -eni elsen -en no -emr gency -ell and -du bie -drac onic -di rec -di du -delta pi -deci de -dav its -dar shana -cu ta -ctfletcher isymf -cra zing -clam per -chup ke -champion sof -cap city -cand ys -cafe bustelo -c phi -but chie -bro ca -box hq -black deser -bin dle -bi si -beautifu lon -ball python -bali united -av elli -aster son -arkhangel sk -ar ail -antan en -amc clain -ak au -agen i -ag ril -afric ageo -adult work -adri atic -ðŁĺĤ ðŁijĬ -ðŁijĮðŁı½ ðŁijĮðŁı½ -âķ Ĺ -à¹ģภģ -wyff news -wwe backlash -we fly -wal deck -wa ira -video art -vaill ancourt -uri ah -upto date -up en -un ay -u shahidi -tree of -then g -thelonely island -the pig -the houseof -the first -the bronx -the bobby -tere x -temper aments -tar bes -tab u -street party -st catharines -sport said -sou bise -side hustle -si donie -septic art -seal ers -sanjayleel abhansali -sam jarvis -sam bassador -saiful lah -ross more -rish on -rise borough -ri jo -referen da -rdr hw -rdrhw ke -ra glak -que eze -qld maroons -pun tarenas -pulwam ater -porta ventura -orang i -or fc -od ham -o sma -nikon canada -new blood -mul led -missan dei -man cer -mamed yarov -maha kumbh -ly co -low fat -lov ington -lou ds -lost planet -lor rain -local syr -loc ascio -lo ker -lat vi -la thletics -kope ch -kk f -khan al -kaw amura -kang ta -ka arora -k out -k bye -k block -ju che -ip eline -inter regional -inhal ers -il ynn -howard winn -holocau stuk -ha gue -gu mbs -gu ddu -go fer -gear talk -gani zation -function alization -fri dman -forthe culture -fight likeagirl -fiba europe -fel trin -far ner -du sun -divers ities -dig na -di grassi -dela uro -del is -datt ilo -ct as -cre b -cost i -cook stove -child labor -ch haya -cer as -castell an -cam ming -callfor papers -c music -bul keley -buffer chat -bre tz -bla i -bird studie -big bend -bet to -best deals -belfast trust -behindthe scene -beard day -b koepka -astro family -ap ki -ap ath -and in -an sty -americanc rime -ak dn -/ â̦/ -!! ). -ðŁĵļ âĿ¤ï¸ı -ðŁĩ¦ ðŁĩºðŁĩ -å® ¶ -Äį iÄĩ -z ater -yaq oob -yach ts -xcel energyctr -woll man -wit zel -where it -wh w -w uss -vichy sso -un assembled -u an -tttt tttt -tin ed -the same -th und -test is -tar quin -sudan ese -su jin -str acing -stati k -star zz -sleep well -silicon beach -sig nes -secur itisation -sad lier -rs one -rondesantis fl -red band -ray han -ray bucknell -qu ain -pris matic -po dia -plo de -pitch er -phirek baar -par doe -pap onmusic -ou tran -om men -nvi vo -night ma -newham london -nar done -na has -n carb -mustlove dogsnyc -moyam ee -more h -morales nbc -moral monday -mo hana -miner alo -micro dot -lough or -london underground -lin ked -ley endo -le ke -lam otte -l rc -krysty na -kore sh -kor do -kim on -ke bang -k boo -jat in -jan maat -j cf -island peeps -is gusting -ione sco -horticul turalist -her mia -hau f -gre ate -gre aney -geot agging -gan ador -g kg -felicit ating -faf nir -eye dea -eu greenweek -e gon -dun stan -duba itour -dol lmaker -deod ori -dahl strom -cy ne -coz ying -coor paroo -bun nic -brumis brill -bli sh -bla ker -bi bek -bertol ini -bear up -barri o -bad religion -atheist pics -argu in -arah ma -ar bil -anupam apar -an laby -am ans -ðŁĺĤ ðŁijĢ -ðŁİĤ ðŁİī -ðŁ¥³ ðŁİī -æ ¡ľ -å· ¥ -ãħ ħ -you love -ye osu -wool lard -with rome -whit ted -waz owski -vam usic -v icia -ut karsh -unis an -un hq -un disguised -ud fa -trebbi ano -treason summit -tot tering -tiny desk -thef dci -t mu -t ellier -sun dazed -sullivan stapleton -sublime withrome -sto on -star tyour -springe tt -spec tat -sow mya -soun ion -sm ommy -shu ghes -shin agar -sar oundtheworld -samp aguita -sal tney -sacri sty -repri mands -refu sals -ra yos -pu glaas -po den -phone bank -pet lovers -pat kar -party wear -palom ares -pab a -os nat -operation alize -ob son -nat museum -nap er -mustafi zur -mrat andhan -misogyni sts -medical school -mb b -mat tryan -manus amoa -make you -ma seno -ma iri -m shs -lollo brigida -lo ssy -legend re -le tra -la sha -kon ig -kin loss -khu zdar -ke ba -kay ah -jointhe hunt -jo equ -jennifer lopez -jazz guitar -jack reacher -ja ho -insta stories -hyper converged -hor miguero -hi ep -her zig -henry mcmaster -hard life -gü rel -gra uer -gott al -glo bo -gar nham -fv glive -fro moz -fo tom -fever few -er berg -ent zel -du ology -dri scol -dit c -di mages -di ante -deli ke -del li -dejec tion -deci siveness -de presse -dazz le -cu cur -cre ll -corpor at -constitution alist -complete streets -co ziest -chop tank -chast ises -care sse -bun naha -bull s -breath ers -bol ong -block stream -bi zi -better life -ban deira -au det -at tern -arric hannel -apportion ment -ap ti -angelas canlon -amin ata -am roth -all me -ag rant -a akin -ä¼ Ŀ -zz acnn -z scaler -ye dition -yak ub -wg x -wene ed -w kw -vacation rentals -tran z -toy town -to gar -thick ener -the sopranos -tent en -tar getting -talent acquisition -ta wil -swar ts -sw and -susan ville -suno cor -stan chions -sputnik int -spay and -so bu -sig ala -shu ter -shigh school -sg len -seri ksen -sensiti zing -sd summit -salv adore -sai bot -saber metrics -s my -ra avan -pod fix -pier zynski -perri man -pensami ento -oro der -oranje stad -ober lin -nul led -nol enation -new fane -n jac -n alu -mush ers -mou lins -mo il -mo he -militari stic -mah boob -lima hl -lift bridge -labr ys -la dolcevita -kur tz -kram atorsk -know sley -king makers -kas am -juli aroberts -je der -in ae -har jit -hack berry -ground works -greg sestero -gre ninja -golden era -go duhawks -giu giaro -girar dot -get ter -ger ken -gem sona -gang adhar -gam ingh -g wich -fish cakes -far fetched -fal sify -evidenti ary -dy spe -dun gloe -dpt student -dmv hoops -demar ini -del wp -dar lin -czar necki -customer service -clt food -cilli zzacnn -centin ela -cc bl -cag op -bu achaille -brü cke -bru gby -brit ts -bret michaels -brave st -booboo stewart -blow out -black tie -bi h -bert strips -ber ano -beforeyou go -be rel -b ance -ato cracy -ati oneu -at alan -ast age -ar li -ap lang -and ung -ambiti ously -aint no -aid il -aged don -ad avies -aba journal -ðŁĻĮ ðŁĴª -ðŁĺľ ðŁĺľðŁĺľðŁĺľ -ðŁĶ¸ @ -ðŁĩ¨ðŁĩ ¿ -ð٧ĺ âĢįâĻĢï¸ı -ðŁ¥ĩ # -íĶ ¼ -ë° Ķë -ä¸ ĥ -âĿ¤ï¸ı ðŁĮĪ -young leaders -yamaham otor -women inste -wir h -ve dette -user interface -unboun ders -ulster grandprix -ty ran -tri pathy -til tro -the hi -the cle -terry fox -templ enew -susan n -sp aeth -sop hy -soko lowski -skan sen -sit z -sik hi -shar am -sham balla -shadow banned -sent om -sel d -sd ick -sch emed -sal eyards -riff age -re submit -re mora -re hired -radi ans -ra unch -princeton upress -powder magazine -post traumatic -pi eno -pflu eger -parade of -pakv sind -pa q -on etwork -ome de -o esophagus -nys dot -not forsale -nom is -nol on -n gara -mu cosa -mou lya -mer q -me giddo -maxg schneider -mat tc -mal herbe -maison avendre -ma sumi -lucas dirt -laquan mcdonald -lan gholm -kam os -ka ash -k do -ju bei -ittake stwo -induc tors -ib sf -horror core -homo erotic -henness y -hase ul -hang out -hal m -gui ao -giriraj singhbjp -fuse box -free zy -faro ese -faci ally -ex ocet -enlar ges -emrgency kittens -el ul -dysp nea -dream girls -district speed -digital twin -deple tes -danny sullivan -dal ab -county durham -col v -col lum -coffeet able -chicago symphony -cherno byl -caz ador -capric e -cam utd -cal mes -bur mester -bur kha -boli de -bo wne -ber c -ben aras -bal ewadi -ase er -as obi -ang g -amp adu -all ones -aha asan -!! â̦ -èĩª æķij -âĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ı# -Å¡ i -y xe -whoa jordie -werewolf wednesday -v achi -un cut -tom boyish -the legal -ten de -swanse acity -stig ma -st lukes -spiri don -spectro graph -soch aux -sn omg -shaz ad -sha henshah -sd awson -salford cityfc -s north -s back -riaz or -rallye montecarlo -rad wan -pu ting -pter anodon -port ant -popul ationday -po ple -pic fair -phyl lida -path mark -pastor alist -pap ar -p inging -or tom -oooo oooh -onor ris -nor aho -nom nom -netball worldcup -natash aleggero -mysteri esof -my happyplace -move it -moto corp -miss them -mile high -mh p -mezz otint -meme monday -mediat ama -margare ts -madhu sudan -m duk -lucre cia -lu bis -local ise -line mates -ligu rian -land onorris -lac er -l varchives -ku ne -kour i -ko kane -ko ban -kis lyak -kin daichi -kennedy nation -ke ister -kashmir floods -joh no -it vs -istitu to -ise kai -ioanni dis -inter val -ing var -in britain -immun ological -igu anodon -he mme -hart pur -gru bbing -gre gari -gor ki -g lead -free beacon -flu es -fl l -fin try -fa xe -explore victoria -eugeni des -ee ks -e frem -div yadutta -di pa -di orio -dee v -crypto spor -creative market -cor undum -coo pride -conspir atorial -congr ates -commerci alised -citizen suk -christian slater -chamber layne -cath kin -cake pops -boxerdog union -boss logic -boar drooms -bo fill -bellec i -bbca q -bali ka -bale ful -b gt -audi southafrica -atom ica -arab net -ar vis -anam era -ai guil -agu stin -adel le -ade vine -aber cynon -^ *) -. ðŁıĨ --_ -" -! = -ðŁĴĽðŁĴļ ðŁĴĽ -ðŁIJ ģ -ì¸ Ħ -ঠ¡ -न म -x media -worm ley -wedding dresses -we own -w ps -von tae -uto pias -un salted -un ation -un adorned -ty m -ty che -tou la -tou l -thuli madonsela -ten aga -te jay -t bird -sy nec -suk ses -stron aut -stock mann -st w -spark fun -sleek makeup -sk w -si dr -shanth nu -seed bed -se mba -sau thentic -sat oko -sam gye -sa heli -rye o -roar withpride -riverfront times -reclaimed wood -reali gning -qu ants -pul le -price waterhouse -preserv ationist -pp op -padmal akshmi -ox fords -otta viani -nuis ances -nu tan -nsc ad -no filters -neuroradi ology -nan aman -mutu ality -model mgmt -mod pizza -memor able -me tten -mary rose -marthamac callum -mar wat -mai ze -lyne ham -lin sley -li fan -kro onstad -kre ms -ki dding -keffi yeh -kar ley -jman rara -jeff brazier -jeal ously -ip ython -inebri ation -incumb ency -ik ko -hun ches -ht cafe -helichry sum -he sj -gren dizer -gc v -gat ineau -fly together -find sorguk -fag us -ex ss -elaw ler -eg n -eck elibrary -di eck -deaf ened -dddd dddd -dal ston -customers atisfaction -curi ae -colorad ans -coach mike -co sc -clar kin -chuck palahniuk -chron am -chav annes -cau ser -ca rele -bur u -bren gle -bren de -bly leven -bhagav an -bh hs -bein eckelibrary -b ta -ati an -ast en -app raise -anticoagul ants -an ings -age a -adri anj -ac ros -ðŁĻĥðŁĻĥ ðŁĻĥðŁĻĥ -ðŁĶ¥ðŁĶ¥ @ -ðŁİīðŁİīðŁİīðŁİī ðŁİīðŁİīðŁİīðŁİī -ðŁĩ¹ ðŁĩ¹ -å¨ ģ -ม าà¸ģ -ठħ -you cef -yo hei -ulkom inisterio -turn blad -tren chant -thel as -the velve -the futureof -te he -tal manac -sv ill -su gru -stony brook -star sfc -ss ay -sports nutrition -solo lastyle -six point -sime on -silver agetv -sho well -seeyou again -se ena -samira wiley -saf l -ro ent -read women -ram ÃŃrez -product development -pre installed -pietra santa -peristal tic -past it -parami yer -pal ette -pai gey -oberge fell -nu ñez -nkosa zana -nas ser -nam aqu -muscul ature -mor tu -million ai -mii foto -mick conlan -mav ro -lackadais ical -l án -kro gan -karl skrona -journalismis notacrime -jimin hofe -islandpeeps birthdays -incre dulity -honest ly -her si -health systems -haj du -gu pton -great clips -gott es -go lia -ghost land -fitz carral -faru qi -fabric live -f he -everythin ge -eu dy -ere tz -eli yahu -eigh ty -ec pr -dz hok -du kat -diaz epam -de regulated -de hydrator -danny kanell -d total -cycl ine -can filmday -broadway com -brigan te -box cars -bombar dier -boin net -bo witz -bi agi -ber toni -bay le -bab li -av illage -audio technica -arm end -apo thecar -andre greipel -ambul anc -adil ray -ad nate -ðŁĻĤ . -ðŁĺį ðŁijĮðŁı» -ðŁĶĿ ðŁĶĿ -渣 åıį -渣åıį æ´¾ -渣åıįæ´¾ èĩªæķij -人 渣åıįæ´¾èĩªæķij -ziau ddin -well wishers -vyrn wy -volcan ism -volcan ic -video love -van meter -ul brich -uh manoa -twenty something -tri delta -to vic -the sportshub -th onet -tex hibit -stau dt -starry night -south pacific -sof ie -smart phone -sl h -sky ride -sir specialists -shing led -sh sm -secon ding -se any -sau jani -san miguel -road rage -ro dent -rhyth mically -radiocitizen fm -ra ymi -q j -presi dium -perfec tion -pa illard -outfit grid -out t -ok ayy -nú mero -ny ghoops -ny akun -nile postnews -ner ine -ne ate -nanse mond -nag ap -my mc -must reads -muni er -moo rel -mo sconi -mit tag -min tel -mh chat -me pratap -mass aged -marri yum -mark ku -marchitec ts -maha vishnu -mag ph -mad dox -lot z -lea ke -ld week -la force -kor bol -korbol orbo -ja jafri -itsallgoo dep -imin love -huss am -hollyj green -hirsch horn -hi do -hen party -heartw alk -gu revich -green ie -gre lle -gom ers -gan bare -g wx -g burg -fr m -fos sum -fil mcenter -feel z -fe dri -fash nerd -facility management -ero yal -ermah gerd -er so -elev ated -el ay -ec ken -dur rett -dream stime -dh any -defend ing -def our -dec ay -dani elli -cyclonef ani -co wan -caw ston -catte drale -carbon ell -breastre construction -bois vert -bhu van -ban ews -as le -ar ren -ar jan -app ar -aom ine -antag onize -andrew scott -am exico -aircanad acentre -ain z -agi letd -aften posten -af thunderbirds -abhil ash -; )))) -ðŁİ¾ ðŁİ¾ -ðŁį ® -ìŀ ī -éģ ¸ -æĶ ¾ -åĬ ł -âĻ¥ï¸ı # -ঠ¨ -zo tac -za ine -ym pathetic -yab ooks -wx pn -woo fs -wild thing -war gamer -vir ani -v its -us of -under body -u kie -tsu shima -tri pl -trabaj ando -tejas wini -te os -tb alls -tash amed -tar kington -tamar aw -taitt inger -t pay -t cl -suss an -supersport fc -st francis -springh ouse -spas modic -sonic mania -shear waters -sharp stown -ser hiy -sem plice -se vo -salam at -rubber duck -roo sa -rocke ts -ribo somes -ri bon -rac ci -projec tx -prescri ber -pendi dikan -payday loans -paol achi -pan te -off sides -north walest -norfolk show -nevers leeps -my favorit -must ad -moel fre -mirac les -me der -mayor kun -mass ac -margo twall -loy le -loyle carner -love flowers -lindsay mendez -light sticks -kur ram -kirstend unst -kar aw -kami akin -k him -jessic aes -isi ana -io anna -in vocations -in ma -ike barinholtz -iamraj choco -iam lindsayjones -hyper trophic -hummel stown -hiro o -hill enburg -he bb -ha utes -h anian -gur ram -giving soul -gh raib -gabou rey -g sburg -g ite -fy ne -freak in -for him -follo train -fire boat -fi stu -ffi on -ferr ite -fe stac -fe bbra -fall acious -f ê -f twd -esto u -escri va -er sa -ent j -efin itely -dol son -diplom atically -dhanush fans -dewsbury rams -degre ed -dan il -cn sc -charless oule -cham bery -carrageen an -bun kered -bre lade -bran dished -berser kers -bb ad -banger ter -baj aur -b sy -auburn football -akh laq -adv i -abh ors -. ðŁĺįðŁĺįðŁĺį -ðŁĶ Ģ -ðŁĴĸ ðŁĴľ -å¸Į æľĽ -yin yang -y way -willowh erb -whereis adtr -wait itu -w lv -vin ces -vi zzini -vers ity -ver icks -ur v -twi p -trustthe plan -tj es -ten newsmelb -tax us -tang mere -sun music -stor min -stor ation -sti pa -spro ductions -sol ms -singh ji -sid malhotra -si eves -shijiaz huang -sh vili -sh eller -set as -sel ine -se tra -sd am -scifi actor -san tha -sab ourin -sab bah -rte soccer -rough est -ro stec -ro mil -repeat ability -rejoin der -reducere userecycle -re interpreting -py charm -photor tg -philly chic -phill amarr -patri zio -numan official -northan ger -nor anda -ni pes -next cloud -ner s -nandit adas -nanai mo -na hhhh -mutt day -mend ous -mediab ias -mary katrantzou -marsh wood -markh enry -mar ami -man ou -lo ong -letsgo heat -lee schools -lax atives -latchfor devans -lang age -la ing -la chs -l latchfordevans -kom al -kho khar -kel vedon -ka io -juxta poses -jo josi -jagran news -ir ambulance -instagram down -hon k -hill croft -helle buyck -he mis -harmon izes -gun it -gu é -gru bbin -grac ies -go ire -go flashes -go crows -gel ora -gamer retweeters -fer ial -f sk -ec ymru -eaton ton -dubai worldcup -domin ate -din as -dic ec -declin ation -dbt india -day tour -dat elin -counter measure -cle ghorn -cent i -cancer moonshot -c mrf -buy british -bon zi -black ferns -birdstudie scan -bhatt a -ben to -belk bowl -bar ison -autom at -atal aya -ar cona -anten natv -alex bowman -akwe sasne -adore e -ablu e -ab lock -a ÃŃ -ðŁĺĺ ðŁijį -ðŁ¤Ķ ) -âĶ Ķ -win dians -wellcom elibrary -wee ter -wan chope -wad is -w week -up your -toshi ya -tomat ometer -to dom -tal u -ta haw -swwap nil -sweater weather -sul cata -stru ble -ss cho -sonequ a -so bo -shari fa -sham ilton -sex tra -scan di -san andreas -sagitt al -s graffito -rhudd lan -red hour -radi ata -pwe ase -phil ology -p ells -p cin -ortho graphic -or bea -octo pizzo -nade ch -my friends -mur re -mohun bagan -mo dit -missi le -mir u -med star -me hs -mass dcr -mac er -lukas ulic -lu isi -locker room -leeann womack -le edy -l sjnews -kol om -kar ao -jae hyo -itsabout time -ij er -iafe ssia -hu ot -hu bert -hom icide -herni ation -her f -har uko -gun dry -gu ri -grit stone -gries bach -greenman fest -gou w -golden yearsof -go pers -giorgiom oroder -gilead sciences -gh l -get stealz -fun i -fru its -front stretch -fri skies -foxy gen -fion n -fex ile -ferguson october -fair lady -f pu -exac ts -eugen iafessia -epal ace -ei ras -eco leman -do bler -deutsche telekom -desay uno -dead fall -d hand -cun anan -crimin alised -colonial williamsburg -chi haru -cherrybelle indo -challenge yourself -chad bourne -ch eva -ch azy -cdw festival -carolin ed -box nationtv -bottle shop -book facefriday -book buzz -bonda renko -bon voyage -boardof directors -bo sk -bit of -bigg ame -bi jl -between the -batter ie -az tex -athe istic -as nr -ar ki -annap aquin -ange rer -amp p -alcin dor -al tab -above thelaw -_ -_ -ðŁijįðŁı» ðŁijįðŁı» -ðŁ¤· ðŁı½âĢįâĻĤï¸ı -ðŁ¤¦ ðŁı¾âĢįâĻĤï¸ı -ìĿ´ìĶ ½ -⾨ ðŁĮ¸ -âĺ¹ï¸ı âĺ¹ï¸ı -âĹĸ | -ØŃ ر -z b -wildbill photo -wild wood -wi ecki -whippoor will -west law -weihnach ten -weall bleedblue -vu u -video clips -utt amav -unge rer -un desired -tw alls -the lead -tere ssa -te ich -tchouk ball -tabletopr pg -sur fcity -sudarsan sand -stan away -sque ez -soli psi -sm yl -shot crete -sen alexander -semit railer -scill onian -sat anic -s endra -queensugar own -progno stication -phil trum -pervad ing -per vasi -paris jackson -par ous -paloalton tw -palindro mic -ote y -onceuponatimein hollywood -off beat -off as -ob as -noraho donnell -non ito -mul tan -mortg ag -mer nda -melo dica -mari za -mar ki -mand ino -maddie and -live on -liti gious -kul len -ku mag -kni p -king sisland -kin neil -kather ina -kani mozhi -jan ick -is eries -iam bohemia -hon ored -hin ze -hell s -hatcher ies -har da -hammer smith -gun s -gre ases -gel ada -gefil te -front door -fri m -fother ingham -foo de -fleuri eu -fieldre cording -fer ric -ext asy -exas cale -est ados -er can -en voi -ell sberg -el vina -el sen -ec pa -early year -dub awi -do yon -direstra its -dg f -detwe iler -destruc tor -de castro -craw leytown -corpor atocracy -cor biere -contor tions -conecu h -comm ending -colle gues -char ging -chakravar ty -btsout castd -bi gos -beagle facts -be ani -bath nes -axi al -astru d -aru th -aragon ite -apr ili -ap aw -antiguabar buda -android app -amor ya -akhmat ova -ad ine -ac ot -aam c -ðŁĻĭðŁĻĭ ðŁĻĭ -ðŁĹĿ ï¸ı -ðŁĴ¯ ðŁĻĮ -ðŁijŃ âĿ¤ï¸ı -ðŁ§ ¸ -âĺĿ ðŁı¼ -à¸Ńม ส -ঠ® -Ú© پت -کپت اÙĨ -ай д -zen ia -y ami -woo dring -wee ked -wa aw -w bap -ver din -van diver -us br -un ruffled -ttly teala -traqu air -thrill ingly -the cool -ten ax -tai v -supp lant -state street -st tropez -squir ting -sports media -sn cb -sik lan -should be -shi pra -sgo t -sedi mentation -saw ley -satur nia -rock wiz -ro chefoucauld -river hawk -rene ged -record label -re aney -ran ney -pur dah -pre ordering -pla bs -paolachi occhi -oxidi zing -over spent -oko lie -official tulisa -ob serve -nystag mus -non duality -newstalk zb -net mediatama -ne ung -nazar é -my kitchen -mu toh -mon ads -mis ur -mi metic -mei sha -me thi -mc as -mau boy -marien assar -mac kidsbooks -ly dd -luka ther -lov ell -ler che -leekwang soo -lam phun -kirst jen -kansa shistory -k wwl -k ello -juli ec -john cross -jn rs -jac anews -iu chi -ion izing -invest is -introduc er -ing omar -iconocla stic -hm givingsoul -heph zibah -hen ze -hell ll -hakkasan lv -gus beef -guiller mo -geode tic -geek s -gd ha -game gear -ga day -fre ema -fox hunting -firstalert ct -fe kete -entren ch -enni als -ela dies -education fest -e wer -drau ghts -dog u -disp late -denou ement -dag i -d ack -cynthi ana -cyber tron -cur ated -ctvmorning wpg -cottes more -contextu alized -con acher -comman do -ck k -chin nery -cent aurea -bünd chen -bv n -bry ana -bole lli -bit shares -bish ley -bisd pride -bevac qua -best wood -barbar alee -bar rowland -arnotts dublin -arac elyar -antondu beke -alyci adeb -akl council -ah vaz -activ ated -aa sia -ãĥ ĺ -ãĤ°ãĥ©ãĥĸ ãĥ« -you do -y cat -wom mack -wgx anews -way laid -w bell -vu ght -vel via -v fm -ut saf -uss ari -us by -tur ku -tunaji bu -tran shuman -topo data -to ka -thedaily meal -the very -the out -te anu -tc prepzone -tas si -tacho graph -swis consin -swi veling -super coppa -ster k -steakn shake -ss aint -sports fan -splatter house -sk filmsofficial -si akam -scary farm -sar iska -s good -run ton -ross o -reverber ations -resh mi -r ba -proto zoa -pil son -ouri f -orientex press -one way -on ow -ok han -ofrac osmetics -oble zada -o group -nuclear weapons -noki amo -ne sters -narcissistic abuse -nab ard -n ta -mosh pit -mispron ouncing -miam il -mi va -megal omania -masi ello -mariano divaio -mar ve -ma uk -li sel -le azes -lamp man -l alife -konz ert -kin donesia -kh ater -keyand peele -job st -jeremy mjordan -jal ouse -itsc old -it done -ill ys -house trained -hf ma -hel ove -hay u -hann ay -guer tin -guay abera -gu sher -gaurav kapur -gary gulman -fu thark -fire pro -fil mand -fil lup -fansn stars -f pack -examiner com -evo shield -et ang -ess ington -en eu -eli zab -ear mark -dru ce -dissoci ate -diag ne -den isle -deb icki -de sfile -dau k -dam es -csic yber -cros stour -crafty chaching -cr rc -conversation us -cole tti -chy trid -chriswe id -cheri e -cbit weets -career sin -car land -campus rec -buch ner -brain tumor -blue tones -birth of -bio geochemistry -bh or -believ eland -be j -be greater -bao babs -baftac ymru -av ene -attan asio -ater ra -arrow fieldstud -ard ell -archenemy metal -ar or -apoorv amehta -anticlock wise -ans gar -and en -alto adige -alo st -al lots -af low -ac w -a story -) !!!! -ðŁĻĬ âĿ¤ï¸ı -ÑĢоР¼ -zu baida -z ima -z ager -yong bosch -yade j -wood side -whati sschool -wf my -wewill waitfor -war ford -usu f -tu chman -the fall -th fan -templenew sam -temple ogue -tat raffic -t dr -sy ne -sucr alose -stan dees -st ites -spon ging -spi ffing -sky music -skew ering -sit rep -sister ship -sis sel -sin éad -shog goth -sho b -seed sman -rspca qld -roy blunt -robber y -river plate -rin th -ride the -ric asoli -renthusi asm -re spo -re man -r anco -q ala -pr iciest -pr fm -pomer ania -plu n -pic hincha -peperon cino -pent ennis -pay in -ott weather -nom inet -national nurses -na ves -n xi -n gah -muslim pro -mud died -mu ffed -mon ark -mol lison -minim ises -mic t -me lectro -maxim alism -marn grook -macau lay -ma or -ma gri -m wu -lu zzi -long boards -like toknow -lia ise -lev ada -lauren cimorelli -lan us -lan dish -la valier -karyak arta -k len -johnny yongbosch -johncross mirror -jessicaes anchez -jeong min -jeet music -itor loseit -indign ities -ill s -il div -i bang -hox ha -hol lo -hoce ima -ho bia -high ton -hat man -h ici -h anc -gosp artans -good hew -go sox -git ano -gg m -gamesof thrones -four teen -for throad -folger library -figh ton -fi bra -ever son -ev att -elton john -eli eve -ele mento -eel grass -dream theater -dog ge -de gla -cy mo -crush ingly -cott ons -cot ler -cor m -co stal -can ari -caf o -ca cha -bushy park -bryan ferry -brun sw -break room -bow fishing -bishops stortford -be safe -bav o -bau ch -band olero -badrin ath -bab un -art mag -archer fx -am far -allman brothers -alan ritchson -ail ity -ager wal -ae ther -adul yadej -ace comiccon -ac rrm -!! âĿ¤ï¸ıâĿ¤ï¸ı -ðŁķ £ -ðŁ§¡ ðŁ§¡ -æĸ° èģ -ಠ¦ -Ø§Ø ³ -zu a -zar qa -zapat illas -yakima valley -xia olin -we bane -wa hey -w ttc -veto ing -tribecaf ilmfest -trex ate -to kor -theoxford mail -than ol -tend ance -tatt y -t lu -surviv alists -sty lis -stjohn su -st fb -st ard -spre ston -spinal cordin -sp ry -sop ris -somni um -smil k -smart data -slam online -skel os -signore lli -shi rey -senator timscott -scrutin ising -scarlet blue -sandra bullock -ru bai -ros setto -rock tober -ro dt -rip curlpro -rebu king -rapi ds -pil chards -phenom eno -pent lands -pe ee -pau los -param par -ot ps -ot actic -one dog -on gole -nh t -newton grange -naj at -n itec -n dio -moff it -mo bbs -mitch albom -min oso -mid south -mcgau ghey -mc garrigle -mc callister -mb el -mal tepe -love golf -loqu acious -libraryof bham -lea hey -jac are -j np -inthe game -imangel abassett -id leg -i heid -holly gshore -hel ado -he gg -gu ld -gro ysman -gri schuk -gri dman -gori zia -gif ford -gd p -fy vie -fu kn -foo dd -focu srs -fender gbi -f ä -f te -evan oblezada -ev amarie -esch eric -ech t -don tour -do illon -corn forth -complement arity -co drington -citywinery nyc -ch id -cbs boston -caball ito -brown fields -briano driscoll -bor dir -blakk rasta -bj t -bio steel -ber tsch -ball point -avalon hollywood -arma geddon -ap atosaurus -andy milonakis -an jar -alham bra -al ising -ade deji -ac cultur -abal os -ðŁĺĤ ðŁĺĦ -ðŁį IJ -å Ķ -न ह -Ù İ -Ñĥ Ñģ -zel dab -zap atos -zad ran -za idan -wubb zy -wrays bury -wolfies mom -wie demann -weare hiring -water course -w tem -vitamin water -vaxx ers -vander griff -unfail ingly -tun dras -tri vera -token pay -thisi sanfield -terrible towel -symbi ont -sunset sunday -stro mbo -stra bis -some time -sohail khan -smu sh -ski dder -si we -shoes andcare -sclero therapy -scint illa -s book -ruben diazjr -rome e -roisin murphy -ri singer -results with -restom od -r si -priest man -pre ll -po es -plate aus -plan te -pi va -perman ency -pastit sio -paran al -oar fish -northumb rian -no en -neil ston -ne mor -national walkoutday -national agday -n power -myfox houston -melting pot -mcal pin -marque elv -m ggs -lu co -live feed -linds borg -like fatherlike -lid strom -letsmakeit awkward -leigh onsea -koreand rama -koll witz -kitchen decor -ker naghan -kappap hi -kail as -jomalon elondon -jemi ma -inst are -ik ha -ice bridge -hrithi k -homen agem -holy grail -hockey day -henry danger -hel lier -har av -group ama -grote squely -groes beck -gri ddled -green smith -gilli ard -gi ggly -ghet tos -ghe gola -fro gotd -fraterni zing -for nature -fil oli -fb family -falcon ers -entang led -encu entr -el p -ed fest -dri g -doro thee -dg trends -des lauriers -demp sie -deid rick -davematthews band -con tiki -comingof age -coming out -chrisweid manufc -cfc w -car vell -can tone -camden fringe -c gk -bull whip -bu isson -bro der -bran scombe -bel ang -beg int -be de -ar vato -ann one -ane williams -andy priaulx -aly pse -agerwal nidhhi -af arm -ack worth -abq topes -.. ðŁĺİ -ðĿIJĦ ðĿIJ -ë ģ -ঠ¼ -ya ws -x dr -work and -wm of -wern her -vo to -vel opark -vaness am -us ky -tto vino -tre ally -time and -thr onged -the palace -the eric -tex cellence -sustran sscot -superstar life -sphin xes -speight stown -smur f -sma sters -sin uk -sang i -san ni -ru sted -ru brik -roger k -rewar i -rest lers -repar ative -rajar am -punc turing -pun go -psy chol -plagiar ised -phytoph thora -phoo ey -peace ably -pan ax -paleo diet -oni ght -on oa -offici alle -o intments -ns ford -no ell -niku man -ni alla -nag ambie -nadin en -music as -multi spectral -michael berry -metal smithing -melissa fumero -mca chicago -max xie -max ene -maris sam -mari oc -mambo ibiza -mam mu -mac fellow -ma ww -lou vre -lat onia -lar gest -kor ah -kin an -keri keri -keepit simple -ke tut -jun gen -joom eara -j pj -it snick -ifam edia -hoo gland -ho per -high speed -healthe deng -h Äģ -guy sssss -guy fawkes -gru ss -gop chairwoman -gl ers -gil strap -general issimo -futu ro -fun sies -forthe boys -fo sse -fivb grandprix -fe dup -fav ell -ey re -exhor ting -excel ent -elix irs -el wha -ein mal -eh ret -dulwich college -dro zd -der ide -de mic -dcy oung -danielj gillies -cu la -corte ge -com unica -ch mp -canvas lms -cant lie -button willow -bu low -birdwat chie -at oning -asi am -as ki -apay ao -anand an -an amosa -am ily -alyciadeb namcarey -ale es -ah m -action shot -a ung -ðŁĻĢðŁĻĢ ðŁĻĢ -ðŁĺ©ðŁĺ© ðŁĺ©ðŁĺ©ðŁĺ© -ðŁĶ´ @ -ðŁĴ ¶ -ìĥĿìĿ¼ ì¶ķíķĺ -å ŀ -ൠĤ -z aa -yyj traffic -y aaaaaaaa -x sos -world boxing -will ink -west leigh -vy se -vs galang -vichysso ise -vic times -vesti gial -un raced -ul na -trifon ov -torture report -tir so -ti j -thul in -the deal -th ach -taylor r -tam aqua -ta rell -ta etiseo -sun co -sullen berger -sug andha -stu ka -steve woz -sp aul -sophi a -sl b -skidmore college -short coming -shan ked -setag aya -sere vi -sand bars -re purchased -re publish -ram el -que ally -psycho drama -premier boxing -portsmouth news -pin kies -phyton utrients -pen ile -ot chouston -oj ala -ny mets -non white -ni a -neuro ma -musik messe -mu stan -msamber priley -miw band -me ade -maravillo so -mar um -ma kit -m no -love twitter -lm h -lik ability -les den -kn apping -kingsisland pr -ki ess -ki dron -ju ans -jam ala -jalo ta -jad yn -jab iru -irish town -infiltr ates -immigr an -ih or -highland games -her p -hard scrabble -habit ability -ha gd -gro ynes -great news -gra phology -glit ching -fraun hofer -foot long -folkl orist -fo ire -fernan dez -fener o -fe strail -el mas -eileen fisher -dolant win -diam antina -dev days -cur cuma -cor tazar -chri seriksen -chand ana -cha il -cather iner -bu tti -bro g -bro berg -bosco bel -bo dog -blaz ey -bestplace to -barist alife -bar ata -ball ito -bairro alto -bai x -asdfgh jk -art fx -anubhav sinha -ant lered -amo slee -aly th -administr ative -ad uri -above water -(... )" -ðŁĸ¤ ðŁĴĻ -ðŁĶ¥ ðŁijĢ -ë² Ī -æ ħ -⾨ : -à¸Ħว าม -zul te -yogaw ith -ye atman -y ro -x bt -womens rugby -wet plate -wes farmers -wal gett -vu ka -vivam exico -varad arajan -valla dares -up stair -under write -un palatable -uc merced -u wi -twil d -ture brevi -tri estina -the shoe -te bbit -ta ac -ste ddy -sr iti -sony liv -son iam -soli do -smar ti -smacc dub -si ron -she eler -self harm -se alth -scrit turebrevi -sar va -sapp hic -sa hur -ron din -ro anne -ris ner -rie hl -rec ant -rct council -pur rp -proxim ate -post workout -phylo genetics -photonic swest -opol ice -op ined -nucle arenergy -nh w -nan jiani -n itta -mom an -maî tre -mar ren -man asa -lumix uk -lu pica -lt ps -liti gate -lenny henry -lam arche -kol ha -kin taro -kilo watts -keen en -k holi -juju bee -jojosi wa -jan ma -jackson rathbone -itv racing -intu os -impe x -iifaut savam -ig bt -hou tbay -he yl -hass le -gy rating -gur don -gro ome -gre ns -goldcoast suns -ghou li -fu gao -fri gga -fo go -family life -factor ization -ex hume -espe jo -equi distant -eccentric ities -eb k -e ha -dunman way -do rel -dharma puri -develope ment -devel o -de jean -dating me -crop sey -corr ingham -cord ner -coquet tish -coon skin -conoc er -concert goers -colle tte -col ling -cj fl -civit avecchia -chri shol -cherry belle -catechi sts -carol peletier -car ifta -brett kavanaugh -bre cht -bor inqu -bol lington -boden kirk -bo sie -blu st -black bird -battist elli -baser unning -bad astronomer -at aris -andrewr sorkin -allthings mayo -air max -ad sby -ac tres -] ]] -! âĿ¤ -ðŁĶ¹ # -ðŁĩ³ðŁĩ ¦ -ìĭľ ìļ° -ì½ Ķ -人渣åıįæ´¾èĩªæķij ç³» -âĢ¢âĢ¢âĢ¢âĢ¢ âĢ¢ -zim cricke -yuvan shankarraja -ye tt -y entl -world market -will sasso -wil shaw -whoare you -waters meet -vit ry -vac s -v lb -u hq -tun khan -tu sh -tren tharmon -tre ta -tre law -tranqu illo -toki doki -tn r -tichin aarnold -ther anch -the di -ter tulia -tak aki -stipul ations -st mike -spla yer -sphoto grapher -speci osa -sp offord -sor b -son tv -so ichiro -so dmg -sn sd -smal en -sic her -she believes -shari ef -sh anthi -salom ons -salam one -rhein metall -ren sen -regulat ory -rc pch -ran dol -ran cocas -power women -papato etoe -oce and -nothing to -nomin ate -nebu las -mom an -mish con -michael kiwanuka -melani stic -me ddled -mckin nie -man sha -malte se -m hy -ly ly -ly cia -loveoz ya -lma oooooooo -le za -lau ch -la boe -kyle hebert -ku cing -kpop fanart -kee so -ke ema -kal uuya -jo d -jim ma -jb laudio -jau zofficial -ja ic -inver kip -integr ative -indi rty -hypercholester olemia -hoo m -hertz berg -herstmon ceux -helle borus -hau ght -h wee -grou lx -gre gy -grazi ella -graphic art -go bruno -glit tered -gay ness -game tography -ga hhh -foot patrol -food processing -flag stones -femme fatale -fc bb -eun uchs -et cher -er mac -dynasty warriors -double days -diaphrag matic -dear rings -co ing -chou chou -cho ksi -chini ot -castle blayney -bu cherer -brig man -bridesma id -br aless -bo tsford -bo ffo -beth houf -beth behrs -bbc thevoiceuk -baw l -base uk -ba sir -avoy ages -assi me -animal league -amit ri -affl icts -ad ded -ac yl -.... .( -ðŁĺ» ðŁĺ½ -ðŁĸ į -ðŁĴ« # -ðĿĻ ŀ -âĿ£ï¸ı âĿ£ï¸ıâĿ£ï¸ı -âĻ¥ ' -âĻ Ĥ -س ÙĬ -z enda -z ard -win ema -win drush -whites ands -west port -wash stand -wa haha -vander cook -umen yi -uc can -transport news -todayin moviehistory -tod dr -to kel -terry androb -swind led -sw oll -super jail -sty mon -stou dt -star power -spir iting -sol ares -smo kies -skip ton -signi fier -si or -sho lom -shaw bury -rtn ba -ren as -re awakened -rdeye girl -ranvir shorey -rais ina -ra on -quality assurance -qu agli -q pf -py rac -pu sser -prince charles -pra yuth -power trains -plagi arist -par wan -pap uan -out stripping -ot itis -or ugby -open cl -ol sen -officiale gl -o sus -o brador -nstom ar -nor bert -non compliance -nic hole -nat pe -nam usic -my dream -mv v -musketeer seurope -mor u -ml rs -miy awaki -melissamc bride -md ant -mc com -margotwall strom -mace wen -london artfair -li bb -lec ito -le then -lb ma -ksn news -kr b -kir choff -joh ri -jay araman -jam ul -iz abela -inter connected -ingrat itude -inew snow -ik onic -hy lan -house breaking -hard worker -han go -ha ston -go wild -glo ves -gie thoorn -fried richs -freshman advice -football news -fetch am -fau recia -farm boy -fan chant -ey f -eric acampbell -em me -eh sa -egoti sm -dot tir -design indaba -deep kaur -cro ssett -cps reds -cou sens -cosmic consciousness -con ine -cleliam ussari -chin ensis -chee ch -ch iri -ch aco -cast ler -care bears -cap ella -busine ssi -brack ins -bor ic -belle mare -beati fied -bal ke -bak re -bad y -atta way -astor ga -aspe cies -arsen ess -ari ff -angel ito -amiz han -after image -ðŁĩ¬ðŁĩ§ ðŁĩºðŁĩ¸ -ðĿĹ µ -à¸Ńภ¥ -à¤Ń à¤Ĺ -zy ı -zaf ra -you thre -x ux -x team -whereyou live -wex med -well l -walk highlands -vla ams -vienne tta -uro logic -une qually -udemy coupon -u gur -twitter takeover -trethe wey -tre me -tororo sso -ti sl -think like -the cab -th feb -tain ting -spo hn -spho enix -sp cs -soup kitchen -snod land -smith h -slo dge -sin thenfl -si dor -shoes ource -seg mental -sea weeds -ryth me -rothschil ds -rejuven ates -redress al -read yourworld -re solve -re med -randolph harris -proprio direct -poles itter -play style -pe ming -pdx music -pal aro -oz ora -oyin bo -oni official -omnis cience -newcastle herald -ner diest -national parkcity -n acre -min era -melani escro -mam etz -magi stral -live better -line age -li even -lau l -lab one -kentish town -kas o -jal pa -iran air -inter dental -ing time -ind welling -imple menter -heal ty -ham idou -hachim an -graf ana -grab ner -ghm conline -ga un -fre se -fre enas -fr yar -faw cett -faroo qui -ex hort -espn seattle -ep aul -ent is -ennis more -enf j -enantio selective -disen franchise -dik ko -devo to -dev camp -des jar -daniel agger -cran borne -con tends -cob ley -clun kers -cincy childrens -chrissy costanza -ce aser -cau dwell -bulgar iofficial -bu har -bu ettner -bow ler -boots riley -bi aly -bhi da -bha sk -be zier -basse terre -bac co -as kia -aro adshow -annex ing -and ys -amar jeet -am cor -al stott -aj green -against trump -afri end -ðŁĽ Ģ -íģ¬ ë¦¬ -âľĬðŁı¾ âľĬðŁı¾ -âĸªï¸ı âĸªï¸ı -áµ į -zen ko -writing prompts -wowo win -wood carver -won line -wh ith -weare james -vs nyj -vortic ity -vhong x -ur sul -uo chester -treasury mog -tra kker -toad flax -tivi dale -tiki barber -tick ner -the bull -teil hard -team got -tash ir -take control -swee zy -survivor cbs -sur lerouge -stra us -stay ner -so ad -silver point -shor thai -sho eracing -scott mgi -scottmgi mple -school pr -sc sd -saw dust -safdar jung -rugged maniac -rudi ger -ri aan -real lisamarie -re doubtable -que rel -pul sen -pul po -process o -pre mratandhan -prag matist -powder ham -peplo e -pe ine -p kane -oul son -op é -ones i -one fc -no dy -nishi oka -naves ink -nationalschool walkout -nar umi -nan oro -musee orsay -mont se -misez surlerouge -mc tiernan -mc elli -mark azi -man tou -mal vina -maketheroad ny -mah in -luc re -lon grich -legionof boom -le zz -lar wood -kum in -ku so -ko diaq -key west -kaz emi -katelyn tarver -k ourt -juli eg -john hurt -jason witten -jam my -jaars veld -infl ame -ii hm -ian ism -hum buckers -hon ble -ho ps -he dy -hair and -gy r -gurum urthy -goal u -gla ube -gin acar -geo coding -gator s -g anim -fre yr -fotogra fi -fotogra f -fil des -fam ines -fac u -extru ding -evil queen -eve myles -eu mundi -emis saries -echofox gg -driving test -despon dency -dec ile -de dal -dan ticat -cran field -cosmopolitan uk -cc ts -care mark -call ington -bur ley -bu uuuu -breakfast show -big gardenbirdwatch -bi ju -berg sabc -bb qing -bacsin szky -b ner -b inning -ashley y -app same -annex es -anat ol -am bre -al anal -akint ola -ahe gao -aflat oxin -af tv -acade me -abu dapest -abi asi -ðŁij½ ðŁij½ -ìľłëħ¸ ìľ¤íĺ¸ -âĿ¤ï¸ı ðŁĻıðŁı½ -âĵ ľ -zimcricke tv -ye ssssssss -ye sh -winston churchill -virtu ality -vap il -ur wa -unra velled -umenyi ora -ul aris -turn back -try somethingnew -tou hy -timb ale -the adelaideoval -than q -taf fair -ta imur -su id -sty gian -storm frank -stoken ewington -squad up -socio cultural -scott moir -saw ston -sarkis sian -sa kal -rival sons -ri velin -ras berry -randomactsof kindnessday -r mg -quality control -qu yen -pro foto -pri sa -porsch esauce -podu machi -pete dun -per vez -pe ir -pave ment -pat cham -pasquale totaro -parklife fest -paras ke -ous sef -ni un -never be -nam as -na ston -n intex -mu kho -mosi mann -modern home -mis singh -mis sel -menin black -meg son -mc cs -maz el -manv sale -mal achi -magnet ite -mac cag -lisar inna -leh tinen -l slofficial -kill ingly -ken suke -kat el -kab al -jol yon -jen net -jack posobiec -ja yo -j rees -iz ar -isha an -iran elections -house ch -hou sings -hol ls -health workers -gta vonline -green eyes -gover ner -gok delivers -gn cc -gi meno -gg ler -gesh wari -gene editing -gay oom -gar ment -g anti -fris bie -fo ad -fil mon -febbra io -fam i -fad den -essence mag -du sek -dread noughts -dor ton -dir rell -desp ising -daw on -damas o -dam bro -cumu lus -crop top -cri ssy -cre mate -contextu alize -coach b -ci ana -chir ality -chester fiel -char lotta -ch atime -cag nes -cab ourg -bu tan -british swimming -book bag -bir bs -big bro -bibliothe ca -bc rich -bate aux -baden horst -ba official -b awi -aur icular -arbuth not -ap assion -ann unziata -an ker -alista iro -ali bhai -ale so -aj et -ahar u -ac ts -. , -- ______ -+ £ -ðŁĺĭ ðŁį´ -ðŁĴĻ ðŁĴķ -ðŁıİ ï¸ı -ðŁį ¡ -ðŁ¤® ðŁ¤® -æĸ°èģ ŀ -âı º -ಠļ -youth power -wick steed -west fiel -wer un -vincent price -vani er -uu uh -ug bu -ucc ello -ther ing -thal afan -th jan -tele m -tast ico -su kha -star day -stand ridge -st ello -st austell -soun dre -sou my -sli berty -sin isa -shill ingford -she sh -shak ila -selet ar -secur itas -schmel ing -sau lo -roger craigsmith -ri obamba -revi vals -regal os -reas ures -rapha els -q erim -publi sh -pi got -phi bes -pe muda -pavlo vian -pau lam -over ran -ontari an -of o -occi dent -ny tt -nintendo ds -newpor trfc -neko atsume -nd as -multi role -mr cp -mo preps -metaboli ze -meccan ica -mccre esh -material design -maqu illa -mad bum -ma bou -m sleg -lolli pop -letoy aluckett -leaf ing -lady vols -l dap -key dets -kevin saunderson -kesh et -kentuc kiana -kartika aryan -karak orum -k sis -k itting -john mellencamp -jo leon -jess ore -jay shree -itstaylor yall -is at -invulner able -inoc ente -ingen io -i ys -human os -hot ti -hive mind -high am -hi fk -hall er -go local -gauth am -future learn -fun dingh -fr n -forthroad bridge -finn art -er vices -er obinson -enthr onement -ent wick -end om -earth skyscience -dug gee -drar aut -don thug -dj mo -dis aggregated -dhy ana -dhau la -demar ai -decep tions -dayof giving -dance wear -cryp sis -common ground -co digo -city pgh -chin cha -chican ery -cat ala -carolin amud -carolinamud cats -cal ex -cac ao -c vw -bulgar ians -brooke henderson -broad mead -bois set -blob fish -bing aman -bbc sportsound -bau douin -bal un -ba ws -av aris -auditi onees -at vi -at ena -aravindha sameth -arac ely -apol icy -anthro pome -andy mientus -and all -am blin -agricul tura -ado or -ac nes -above ground -# % -! âļ¾ï¸ı -ðŁļ¨ðŁļ¨ ðŁļ¨ðŁļ¨ðŁļ¨ -ðŁĺĺ " -å µ -âĪ ļ -Å ¾ -á e -wustl med -wil ken -wel burn -wal lowa -vra iment -var num -ur j -um be -turtlen ecks -trump budget -tri pa -trape zius -tingu ely -time splitters -thisisd urham -the hip -te sori -tb sofficial -tachi kawa -syn tactic -syn ge -sweet land -su mon -sten ting -sober ly -si val -shop if -shields fc -shield maiden -seren issima -seish un -secre tos -sci acca -scand y -sa uro -s diner -ron johnson -rep kevin -rear guard -real politik -peter greste -pet ard -pamban sa -p mik -osh park -oneoh trix -one ofus -nx umalo -nw l -northant sccc -no war -no rell -no ire -ni mble -neg ley -ne sian -my nah -mwa haha -musicis mylife -modern day -mo zar -mo har -mlb pa -mind q -mic mac -mf is -metho trexate -mari ane -m frost -len zie -lari ver -ky lar -kut ter -knock aert -ki shin -kak ai -ji ah -jel utong -it carlow -iron monger -il ga -iconocla sm -hen ery -hell spawn -haworth ia -har bi -ham bly -hail u -gyeong ju -gra ef -goooooo ood -fom ent -fo glia -fel ino -fam oso -ey vind -exorc ising -epi thets -elli son -electrocu ting -elas mo -e hehe -dou rif -do xford -di bang -de mentor -cotedazur now -con rail -compar ator -colson whitehead -cat alu -care en -camer ino -bur se -bry z -breit ner -bledis lo -bla ise -biome thane -ba iser -b amp -aver il -ambassador power -all mets -al acrosse -ak utagawa -abigail spencer -ab dn -// : -ðŁĺłðŁĺł ðŁĺł -ðŁijijðŁijij ðŁijijðŁijij -ëĭ ĺ -æ£ ® -âĿ ¦ -è dre -yan u -xma sparty -x lu -wy prk -wg st -western sydney -wak ana -w tam -vizi anagaram -vers ini -vander waal -tunkhan nock -toyn bee -tie out -te phra -sy nucle -sy mmes -sun care -sub in -sub contracting -stre ssed -stopthe debttrap -ss w -sper m -spee die -soci ability -small youtubers -sm x -skan sk -sinu so -shri mper -sheff council -seh ban -samaritan spurse -salish sea -sal ted -s jones -rid out -red bourn -ram shaw -predic aments -pn pi -plo ys -pitch forks -pet tai -pen ampang -pajar ito -otter burn -ot ice -oro ss -one ills -nieu wen -mr b -mo esha -mmmm mmmm -mat us -ma homie -louden swain -lipo somal -lal af -lag ana -la vette -ko bler -king and -khay al -kh ri -kat wijk -kai sen -jun ia -jelly man -jeff bullas -jash n -iri sd -ingh a -hire me -hey sel -helm sdale -hake em -haber mas -h ounding -gregg rosenthal -gary leff -garden centre -foto g -forza italia -fibro blast -fell running -fee ley -fe k -eve of -evangel inel -ero deo -er tiga -elo gic -elly awards -elef ther -eg shore -edward tufte -ecol lector -ebon ics -east nor -dungeon master -dragon ite -dig in -dhol akia -dev day -dental hygiene -defro ster -dataware house -dam avand -dal ers -cu ppy -cu entas -crew mate -colon ising -code foramerica -clip stone -citiess ky -ci at -cheese cake -cdn crown -candel ario -bunnic ula -bron wyn -bra edon -boi leau -ban co -bal alaika -attic arace -atticarace wyprk -ary newsofficial -angelsof fur -and h -an ick -amera action -alli ums -ali assime -ac rif -ðŁĺĭ ðŁĺĤ -ðŁĺĤðŁĺĤ ðŁĺ© -ðŁĴľ âĿ¤ -ðŁĴĻ ðŁĴĸ -ð٤ĵ # -ëĿ¼ìĿ´ íĬ¸ -âĿ¤ï¸ı ðŁĺĩ -âĨ ĺ -Ú ¡ -wom e -wc pd -wall onne -w le -ver ti -vel ia -v ung -urdan eta -un likeable -u mia -tur l -trail head -toyo tan -the oph -tarot cards -tanan lam -su hoday -steely dan -st century -sport sturf -spin offs -sphero id -sper ry -spartans will -smo yer -sk j -sion yc -sch latter -sat am -san jac -roman ian -reminiscen ces -re animator -raw ling -ra tho -priyadar shan -prabha karan -po rec -pi tha -peoplewhom ademy -par minder -p liz -p ities -onem illion -off y -noril sk -nor rington -ne tti -ne ma -nav ys -national aviationday -mcne aly -mauriciom acri -ma ssing -little dragon -liss at -lin go -lead byexample -le ix -lar ia -l bo -ko tha -kho ya -khan om -kaz en -k radio -jyr ki -juma anewilliams -joe mantegna -ji v -its ellacruz -it trivedi -ipp olita -ic tsi -hoch stein -hipho pawards -grow ur -grac iosa -gloom haven -gag an -fore seeing -fi lets -feature less -fa ial -eviltwin brewing -er au -ei rene -edge mere -ed surge -e are -dracon is -downtown ptbo -dj clue -dine o -dem at -del tron -decrimin alized -dante basco -crou ches -cra shed -cr inan -counter acts -contest able -cnblue gt -citrul line -christo logy -chris bosh -chas ms -caring bah -car ll -bur rage -bru ticus -boxer vijender -bo water -bo letus -black enterprise -bi asi -bear sden -band ha -baby go -b br -arvindg aur -arrivat w -ar asan -apic ulture -ant y -ali zafar -ali stas -alex constancio -al imi -ajin omoto -air fields -acci on -abar are -aar ohi -a preci -... âłĢ -ðŁĺģ âľĮ -ðŁĺ½ ðŁĺ½ -ðŁ¤£ðŁ¤£ðŁ¤£ðŁ¤£ ðŁ¤£ðŁ¤£ -æŃ £ -ãĤ¤ãĥ « -ãģ¨ ãģĨ -yyyy yyyyyy -woo duk -wi bowo -wh on -warcraft movie -voter suppression -tud denham -truck n -trav ails -tom ska -timm is -the wiggles -the beauty -terr r -tal kis -ta ja -stu l -star flyer -stam u -stalag mite -st aley -ssi de -ss ongs -sp ahr -slow downs -shil don -shi rayuki -sexu alised -scul ly -sch l -sar re -ru pal -rn zaf -redhour ben -race ways -ra ichu -queen sof -que te -promo cional -premi xed -practic als -plan ica -ph rom -paradi so -p mt -over stepped -or loff -nz ta -na an -mplo yers -mosthandsome faces -mo edas -mis dproud -mey cauayan -mc vicker -matt kemp -mak ura -magic ofthecup -maci ek -love actually -lipo ic -li mber -levi mitchell -lake house -la dan -l bci -kul in -kor net -knu x -kentu ck -kab inett -ka strup -jun hong -jone ss -ji yala -jak el -jaimie alexander -j ats -ipp r -in may -in ji -il ja -ic tafrica -hy bpa -hour fitness -hoh mann -hare woodhouse -h lt -gro win -gramophon emag -graceand frankie -glo ttis -gigan det -gic lée -ger ri -gcse results -games aus -ga shes -funny pictures -fron tieres -friday morning -fo ard -fit i -fish mas -fi stral -fc zenit -event sin -esp anya -emporio armani -el ene -e comm -dre mil -don no -dof theweek -do ye -do che -dh anya -dela hunty -decarbon ization -dd avis -dcyoung fly -corruption case -commerce gov -co darmy -co creation -chi d -cf m -cest lavie -britanni c -body suits -boc cioni -be evers -be eni -bbc shropshire -bal aam -bad stuber -aspr illa -arth us -annam arie -animal liberation -alistairo vereem -ab attle -ðŁĶ¸ ðŁĶ¹ -ðŁĨĺ # -ç¾ İ -wgn america -west van -wad don -wad den -vrou wen -victor ial -valeri y -valen za -v rush -v inter -un ti -u hs -tx ts -ttm success -tre garon -tre blinka -train able -thisisco ventry -th acker -t pv -t pas -sustainable finance -string band -spen son -sm day -sk ole -sham bhu -sf ontein -seong woo -se sam -scol ts -sanc ta -sa ire -ross marquand -renew timeless -red hood -ramyak rishnan -quadru ped -publ ically -pra ya -petro ssian -perfu mer -p ccw -ourlandour news -nwa as -nor aen -n anne -myk ki -mykki blanco -musc led -morgan spurlock -monclo a -mm une -miti e -michael h -michael b -metv batman -meer schaum -marcu scooks -marak wet -m wbb -long niddry -live updates -leader less -lan phier -l xc -kup fer -kre utz -kev adamsss -karnataka world -k pae -ju ku -ji ddu -jday golf -jan ka -j ies -hye res -hu sni -hollow knight -ho yne -head house -har laxton -gym wear -gul ates -groom bridge -global britain -gh ita -gere ja -geophy sicist -geno ise -exop lane -eco sphere -early learning -dre we -direc tness -digit als -denti stry -dell matchplay -dark skies -cv payne -counter tenor -coun tri -costume design -const ancy -cn try -cityo fatlanta -chukw uma -cheshire police -cele stino -car freeday -cad dick -c dos -bul losa -bravo andy -bramb illa -boz os -bosw ellia -borough fc -boad icea -bo soms -biz boost -bau hin -ba ars -b sl -avi dson -au glaize -attend ance -asdru bal -ar ar -apar napkin -ap enn -all ornothing -air plan -afl ori -adi m -ab last -aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa -:) âĻ¥ -ðŁĺį ðŁijĮðŁı¼ -ðŁijĮ " -ðŁIJ° ðŁIJ°ðŁIJ° -ав ÑĤ -î t -z ior -yon ex -yo ver -yestur day -wun sch -won o -wl bz -web casts -warner music -war re -wale ed -wag i -vesp asian -veliyi dai -var roa -tro ilus -traffic scotland -tmc lebanon -tla que -this ssss -tenov usc -tar nishing -stu dly -star tet -sleigh s -silk wood -sil ves -shiv puri -scr unch -s va -realbobby roode -real sarathkumar -rd mas -race for -r ci -pride fest -podumachi goalu -po theads -pnpi fugao -play backs -plane tor -patr onal -party yy -pale tta -p ssi -os sett -oce ph -neopla sms -na ic -n dy -mut tered -morri ston -min cha -mi igwe -mh day -men ai -mang ler -mah mu -madri distas -ma ham -little port -kha pa -kaz aam -jis r -jimmy bullard -jen ners -jan ia -jagann atha -in cs -il ir -iklan barison -ike auk -i ak -hypere mesis -hu maim -hotel belair -hot chner -hiphop history -hijab day -hepat ica -harvey fierstein -hampton court -hammer down -habit ants -h nn -grand hotel -gra eae -gr ing -ger rish -gab onese -fur freefriday -fss ai -folk song -fo amped -fil mc -fdm group -faw zi -es wari -ed leaders -dutch bros -dis contents -descu bre -der abad -depresse dd -dat ass -da et -cysyll te -craig lockhart -cot ter -com ba -coast walk -chis um -chees elo -chaf in -cha sti -bus er -broad institute -bre snan -bon nici -bol año -bo vines -bledislo ecup -bl ang -bharat natyam -ben it -beabin ene -bar bato -asi onal -areth usa -ar tos -allgä u -ag p -acu ba -* ---- -ðŁĺį ðŁĻĬ -ðŁIJ¶ : -ðŁį ¶ -ìłľ ëĭĪ -âĢĶâĢĶâĢĶâĢĶ âĢĶ -á Ĵ -ਠķ -zay ousaf -youth month -youn kers -y po -y enko -x liii -wigw ams -wal nu -wa aaa -viaduc ts -verkho vna -un principled -typo logies -tor telli -tin d -there stless -thecottag eneedle -the aus -tem pu -taye diggs -tam ana -take five -stry pes -stra ddled -ste geman -st chat -springer nature -sper mato -speed weeks -sk otti -shu gart -sfor good -sehban azim -scoti abank -sch an -scal pels -sc id -sas c -saf c -s music -ru pauls -restor an -razor bill -r mef -purch asable -pu cker -poly hedral -pimi enta -pen arth -paul smith -parachu ted -paci fics -pa wel -ov hd -outd channel -op tout -o ep -novel isation -north fork -noraen pure -nicholas sparks -nevel son -nay sayer -money talks -mi mir -megal o -maz da -marke tability -looking ood -london grammar -lland y -like that -lef son -la gta -l les -korbolorbo jeetbo -kho isan -kam andi -jettison ed -jefferson ian -ittake s -itso knotto -isth mian -im cc -idec tomy -id sa -hoo vering -hitch hiked -her rings -health ug -hand cut -han ap -hammer ton -h ph -h kr -gujaratt ourism -gre u -gla uber -gho sh -gar madon -future past -flo ve -fleet week -fire bombing -ene mas -en ow -ele men -eg eland -ed wi -east ney -east dulwich -drag ana -dj mustard -deep am -d ın -cre ag -cor owa -chuck comeau -chop shop -chloe fashion -catal pa -cas a -cal ac -bun tin -bree zed -boho jewelry -boer sma -bl ine -big gies -bi joy -belen enses -bat themusical -bar ito -balla gha -bal ala -asu ppor -arbor io -ano les -annalyn ne -ame dia -ambl yo -amazon primeday -allegh eny -all mendinger -all black -aaf london -:' ))) -Ī : -ðŁĺĪ ðŁĺĪðŁĺĪðŁĺĪ -ðŁĮ ©ï¸ı -ë³ µ -åº ĥ -âĻ« âĻ© -york cityfc -yemi aladee -x au -wiv pak -win ward -willi ford -whiti anga -wee ping -warriors ground -ver sus -v ly -up votes -tra verses -town head -tour ne -top up -ti money -tho ver -thewe bbyawards -theatre works -thau sen -tb ath -taxi ed -state ivlp -spring fashion -speed ed -social mobility -slur pees -si regar -shiv angi -shawne merriman -sepan x -sch aut -sat ar -sand strom -san bernadino -rose bruford -ri bisi -rhetor ics -retail therapy -requ ena -relax in -raji b -preten sions -pre ponder -pois oner -pis mo -pen tire -par olin -p crg -ony m -offer tory -ode tta -ob ando -not chback -normali zes -norfolk county -nkn kk -neph rectomy -mymorning jacket -mirpur khas -mani than -mal indo -liber ato -leeu win -later alus -lar ries -kirk up -kinder garden -khawar ij -ker kyra -k rac -juli ana -jone z -jax jones -jaket austin -itsti meto -is thebest -ingh all -ine ssa -in oo -illi gan -ii ia -i fr -hood wink -hide outs -hel enium -heck uva -health summit -hand saw -gene v -gan tries -ga ily -ful kerson -fro llo -for goes -for ages -flic omovies -first love -feder man -fc groningen -farmers guardian -eru dition -els mann -el wick -eichel berger -e online -drawing aday -dot day -dock weiler -dit v -dak en -dah le -cy farth -comhghair deas -com hal -cataly se -caer laverock -bottom sup -bobble head -bo hot -bir gitte -bien al -awe bb -avon dale -arte san -arra ial -ar bel -andrew mcmahon -an tron -an el -al let -ai zu -ad mir -ad av -ab ao -ðŁĺĶ ðŁĺ¢ -ðŁĺĪ ðŁĺĤ -ðŁİ¬ ðŁİ¬ -ëįĶ ìĩ¼ -åĩºæ¼ Ķ -ãĢ Ī -zim toti -y cp -wood burning -who weare -waller racing -vijay goelbjp -valle es -usab mnt -universit elaval -ultra wide -ttan dem -translu cency -tori bio -to phobia -tist mgmt -then ana -thecalm zone -the guy -the chri -ter ming -ten napel -team sesh -tai b -sve ti -sur u -sugar daddy -steel making -sta ver -shirt friday -ship week -shaw ns -sel v -salondu bourget -sa kari -running man -ro fe -revolu t -regg ina -recon dite -rc vd -rav allo -pr ar -poly morph -polar plunge -pla intext -pi shin -peter ose -pen ola -p lit -oro sso -one music -off white -ny penn -no tion -ne jad -nc soft -music mondays -moet blindcat -mid sized -mi rian -mer cure -mcgiv ney -mb lue -man ka -make music -mait lis -m ó -ly cée -luci dum -lu minor -lo pes -line less -larry blustein -lab neh -la galaxy -l tf -kur une -krat on -kra it -kos gei -kno we -king angi -kil lester -kaw agoe -jungfrau region -jon culshaw -joe walsh -jin soul -jennie garth -j érôme -irk some -ic in -human ization -hu mph -hoge school -herom anoj -he mam -han sal -ha wala -ha voline -gz chef -great fashionfinds -glo scathedral -getting married -ge tenough -fundra ising -free h -event inglive -escal era -eri eotters -dul cinea -dor bz -dong daemun -demago gues -demago guery -dallas lovefield -da ai -crunch ies -conservator ship -co ple -cla es -cees ay -bur kle -bur kitt -big pond -bi mb -bell one -beer bods -be ghe -baltimore county -backward ness -at le -ascle pius -as ger -angel olsen -anc re -allo ween -ai h -ace attorney -! ) -ðŁĴķ ðŁijŃ -çŁ ¥ -ر د -á ras -zoo svictoria -zo ster -ye she -west la -west elm -welove shilpashinde -vol vulus -vick erman -ur ge -un modified -twit ts -tweetad run -tu bac -trac coon -to kill -thegold bergsabc -tar oko -tan x -tal ton -summerof love -spo oling -so ss -silver stream -shari fah -rosen dahl -roman jancic -re ste -raphaels barge -q k -pur merend -public protector -privacy matters -po ggi -phant asma -pe eth -padilla bela -ot acon -olympic park -olu femi -ol ap -ojh lofficial -ness on -nam eh -n cart -mutual fund -mo sso -mitsu ko -missing people -memo irist -man ick -magne tometer -mag ination -live ira -lets do -leather craft -l enti -kumb hal -kon yaspor -king span -kay lyn -jon lovett -joer ger -janee spenson -iso ara -is k -iq ra -ing re -in coherence -hoshi arpur -horror fans -homoe opathic -hen rys -ha val -gul ley -gre ferendum -grace less -grace e -gra spop -girlsnot brides -ger main -fro mt -fr wy -foodand cosplay -fiel dy -fa hn -end ro -elvis duran -draw dinovember -double think -do sen -dl hughley -deline ate -def ene -de sam -davi dre -d top -cus rise -county sheriff -cor ts -cor sican -congradu lations -con ch -collo ids -col lon -co soc -cleveland artmuseum -circum polar -chy pre -chris martin -cherly chibi -chan in -cartm ell -car hop -canvas print -bra es -bobm ckenzie -bob marley -be ville -baby animals -bab ic -aw ade -au byn -arm let -ar dyn -al tc -?! ?!" -ðŁĶ¥ ðŁĺĪ -ðŁĴķ ðŁĴĻ -ðŁijĮðŁı¼ ðŁijĮðŁı¼ðŁijĮðŁı¼ -ðŁıįï¸ı ðŁıİï¸ı -é¾ į -âĢ ķ -á´ ı -xy mox -x lk -wood smen -wi fu -vis ity -vel vets -vallab h -valent a -v pm -twit pics -tut ti -the sheep -the edge -tand ing -stur div -stan stead -ss wans -southern california -south point -sil ento -shinse gae -shen yue -sa che -s but -ryu jin -rivu let -ripon cathedral -rep lika -rel ph -red mill -rc cs -qu ast -q wp -pro ffer -preston steve -pr yer -power grid -postu late -porto fla -po styour -po ble -pend rive -pal oo -over staying -osteo spermum -non smoker -no son -nithyam enen -nick diaz -new chapter -nav aho -moz con -mortal instruments -mongo loid -mini mathur -mene my -memori alizes -mc cu -max lucado -ma sai -low carbon -long more -l vac -konta veit -kenny g -kawar than -janet varney -inter gender -instagram mable -inge agles -ine ducation -hebrew u -heat culture -harde eville -har tal -hack tivism -haber dasher -green book -gran at -gom avs -glend ening -free from -foto speed -fh g -ffbe ww -fe iner -en dia -ela sto -ef eld -edexcel maths -ea ina -duba it -du gin -diferen cia -dic ted -dec icco -dance hall -cé cile -cuyam aca -cu bi -cru achan -corri eri -com ent -co enen -chen kova -cay de -by all -bur ro -bron son -blue october -bis leri -birdof prey -bio steel -bil kent -bad er -au sk -ast ellas -asian art -asi r -as aa -app ended -andyburnham gm -an diamo -all ard -ale urope -albic ans -afternoon express -ab ms -ab arab -ðŁĺµ ðŁĺµðŁĺµ -ðŁijıðŁijıðŁijıðŁijı ðŁijıðŁijıðŁijıðŁijı -íĦ ° -ë² Ħë -ÙħÛĮ Úº -Ø µ -|âĹ Ĺ -zumi ez -zu elo -zin aida -yuki hiro -yu qi -yajam ana -wood in -winthe dark -wave music -von leh -var de -v ram -uw sp -un thinking -un defeat -tram el -track less -tlaque paque -tion ately -threeday sgrace -thedukeof york -theater shooting -tex ter -tahqu itz -sylve stris -sustainab lec -spir alled -sock game -so di -sk imp -si ii -shot ley -shor ta -sh games -seal skin -sco d -sap hire -sant inof -sam us -sad vocacy -ry sz -ry hope -rela yed -red point -ray hudson -rainbow fish -ra gg -q x -pu zha -pr ange -po ile -ple ssy -play it -penn sville -pen nin -par ijat -p ts -osu wexmed -om ed -ole v -ol faction -odd balls -obli vi -oak engates -noo tka -nnnn nnn -newh ope -nar da -mort decai -mor sy -mor rice -money inthe -mer ca -melaniescro fano -me rec -mawdd ach -mat ley -masji ds -mary ann -manik andan -m pho -lou l -litt let -legally blonde -langu r -lam acq -kri pa -kount ze -kk as -kem merer -kel sen -kc mo -ka ichi -judge ship -jo sse -jame shet -ir ally -iphonex smax -io hk -inconspic uously -hum zayousaf -help us -he tch -hadley wickham -gold mark -go iter -global music -gh um -gau din -fro de -for me -fioren tini -fastn loud -fa im -ee ight -dine sen -di emon -defibrill ation -de vis -dare rising -d pu -cwre ign -curb you -croco dile -counter insurgency -cocoro cha -chuk chi -chil cotin -cf cs -ce berano -carb ines -car dew -captain hook -buck tail -bro se -bre gat -bra sch -blue day -berlin ers -bene field -bar mby -ascri bed -arnold sports -ar rings -angou leme -andy c -amo sun -aman zimtoti -al britton -aj la -adair sville -acre ative -a beach -_ < -. * -ðŁĴģ ðŁĴķ -åĵ ¡ -à¸Ħ à¸Ļภ-zamalek sc -yearend sale -x vid -world populationday -whi story -wen z -we got -watkin sville -wak awaka -votol atino -venew shoes -ve iga -v amovie -uk baseball -ud murt -tw ane -tre sor -then ff -the writer -the andy -ten ille -techno gym -tag oe -sun ne -stu bai -sto ically -squig gly -spreck els -speech writing -spayand neuter -shon ours -sharman joshi -semic ircle -seed and -scre es -scott stapp -school sweek -row ley -ring side -reli e -relent les -rb cs -rand olf -quercu sbooks -public history -pu tte -proudly southafrican -pol lin -pod genie -pli moth -phy no -oligo poly -oil price -of qual -nick swisher -ne vik -nay ana -mis si -michaelberry sho -mccul ley -map ada -man ische -man er -mai er -magin ot -mag das -lun ney -li zation -li ong -lewis and -len sed -le hrman -le fort -kurune gala -kof u -ker lin -ken ingau -kar ap -justi fied -jhope day -jay co -ir ama -infra sound -impact live -illi p -i spo -humaim amalick -hei ji -hahaha aa -hage mann -h unie -guys borough -greenvill enews -godre j -gen tiana -gautamrode team -g burg -friday flashback -franken heimer -fo ibles -femto second -esche ws -epoch times -ek hu -ei en -dos box -disney d -diar yo -di methyl -deep ellum -debla sionyc -debat er -dar kangel -dar cis -dan dekar -dan abrams -da hir -cull in -cri velli -cour cy -cor tel -chrisley knowsbest -ce dro -catter all -brad burn -bol dinsider -bigbrother ca -bic ameral -ben tiu -beforeyou exit -b fly -b alian -army tage -arjun official -anyan wu -ameli o -alo vely -ak arjunofficial -aj pur -ah w -acon cert -aadhi official -ðŁļ¶ âĢįâĻĢï¸ı -ðŁĴĻðŁĴļ ðŁĴĽ -åĥ ı -âĹķ ) -à®İ ன -yu ill -yha official -wimbledon final -wc ba -water logging -vo lim -vampire academy -uru zgan -un drip -thum or -suppos itories -stopthe violence -starwar sep -spe ttac -spati o -space shuttle -sono ita -somo sporto -so hyun -sneaker snstuff -slee man -sko vic -sin spired -sil vassa -si vers -showaddy waddy -sh ingen -sen ri -sco tathletics -ru cian -research impac -realjoey b -re ema -re ath -ralph macchio -rail head -pre ller -pre ggers -pottawat omie -pick oftheweek -peter sson -pas es -paris motorshow -over time -ogo pogo -nw lc -ni da -nau i -msf tedu -mr g -morethan agame -mic i -mccor mack -math letes -marriage equ -lur kin -love bts -look good -lo ben -liversi dge -line arly -le eu -lamar re -kre we -kop ing -ko gi -kn abe -khu tba -ken nys -kas sab -k vapil -k rates -joel creasey -ji ocinema -inv ar -intu itive -inad missible -impregn ates -ilo gical -iced tea -iam abotanist -holiday home -ho de -hard tail -gun barrel -green music -gre vy -goooo o -gas cony -flix bus -fatin sl -far uq -evi leye -esz ter -ent eng -enni stymon -el itch -dre ier -dranath tagore -do ddington -disdain ful -digitali sierung -di af -dest iney -del sin -de itsch -de code -data storage -d pb -cor dle -congression al -con script -community shield -commis so -clo t -bud worth -bor ovets -book sin -blue throat -blackwomen didthat -bir atnagar -bernar dsville -ber chem -beau chemin -be ppu -batmanvs superman -baseball canada -backthe pack -back tracked -ba ard -annamari abiasi -angel alan -an iche -ame v -ambigu ities -alek sei -akar ni -ahs freakshow -ah ack -acar thy -_ ^ -[ +] -ðŁĵļðŁĵļ ðŁĵļ -ðŁijĢðŁijĢ ðŁijĢðŁijĢ -ðŁ¤£ðŁ¤£ ðŁ¤£ -ë¡ľ ìłľ -âĺĨâĺĨ âĺĨâĺĨâĺĨ -â̦ â̦.. -âĢ¢Ì ģ) -youare loved -ye ds -x pl -wr oughton -waiting for -w luk -vic h -val halla -v tv -usopen cup -un sorted -uk volkswagen -turbo chargers -trout dale -ton na -to cco -timo thee -the bone -team ceec -suj atha -sto renvy -stje pan -sti pes -steen burgen -stay gold -ssa ints -sou tar -sno whour -sm sp -sli ghted -skotti eyoung -she sa -sha ab -seo inguk -seab ikes -se yi -screen sho -sant elli -sagrad afamilia -sabhar wal -ros set -regre ssions -proto star -pricewaterhouse coopers -pho bla -pele liu -pegas i -parathy ro -oo hhh -ong ata -oneon one -oli fants -nkem diche -need leman -my writings -my my -ms b -mr inal -mou f -molly mauk -mmun ol -mirren fc -min ichiello -milit are -mic cosu -metro tech -meridi ana -mee ce -medi ations -mead er -manu ka -maith ili -maccab iah -luch alibre -laurel schuett -lam lash -l ri -kripp arrian -kore aboo -kl n -ke phart -kang an -jazz dotorg -jay r -jam mer -hoch schule -heure use -headline pg -har mos -gre edy -gott aget -go bowling -geode sy -gam mas -ga ited -frontiers man -fish back -fair brother -eval yn -euro bond -esch aton -emal ick -el via -ehr mann -ed fu -ec le -ear gasm -dimetro don -crimesof grindelwald -coyo tes -co zi -chuck y -char ing -cat ul -by rum -buzz kill -bran te -bowhun ter -bor ton -black owned -be urope -ba sim -ba ic -atic i -ate en -associ ati -archit rave -aracelyar ambula -appar at -ankylo saurus -amar sh -am rish -all ari -al tin -al thorp -air train -ðŁĺįðŁĺįðŁĺį @ -ðŁİĤ ðŁİīðŁİģ -ð٤ŀ ðŁı¾ -âĺº # -à° ® -Äį a -zen imax -yl en -with thebest -wh ood -west de -wego tem -web apps -wal czak -w mw -ut martin -under desk -un does -ug al -u bp -tweetapictureof your -tun ning -tsn bobmckenzie -to ji -the blue -tender loins -ten ures -teitel baum -sug awara -streat ley -strabis mus -str yn -squee zy -spec tre -sp afford -south afric -slay age -sil kin -sie ben -si sse -sars gaard -rule set -ro eper -rich wood -read yyyy -re ges -raw materials -ram bis -ral f -rac q -pra dy -pp cli -pon yo -philosophi zing -phil by -ph ron -peter hickman -petedun ney -petedunney xb -pend ers -p ée -o herty -nott ur -nic ee -nh week -ner vou -n br -mou l -melo che -mcgu ckin -mat tre -marie fre -mar sone -mal practices -lucas digrassi -lightning network -leg ged -leg are -la reunion -l bh -kol ton -knotts berryfarm -keepingit real -kai sha -join me -jo of -jam tour -ja ia -j collins -iwak uni -ish peming -is af -invision app -infe stations -huy ghe -home inspection -heil tsuk -hat te -greatyork show -gre sini -gram marian -gor os -good karma -golden child -goeth als -german e -garrin cha -fu jit -for tb -fla vian -fine ssed -fair funding -f ng -ey non -er hu -economic growth -e he -dive sted -dinner tonight -dia thecat -dd ya -das u -cultiv ate -com ox -college colors -cnc pts -clean in -claw diathecat -chekkachi van -celest ite -can tal -c engage -bull fights -buck lin -bronco sports -bot ello -bird softwitter -be hr -basile us -b nu -azu buike -ay al -aw con -aviation geek -athletics weekly -ashken azy -arro wheads -ar bon -ar boleda -ar bogast -am artinez -am ap -alu so -alten ango -allo graft -al bie -aege an -admoni shes -( ãĥ» -ðŁĺĦ ðŁĴķ -ðŁĺĤ ðŁĺħ -ðŁĺĢ ) -ðŁĶĶ ðŁĶĶ -म न -ÏĦ he -world liness -winnie harlow -wence sla -war ga -wall aroo -vote anc -vogue uk -very play -un ar -toile tek -thenu mbers -tell er -tan on -super ba -struc tur -strength and -spar khill -soular tistmgmt -situ ate -si ón -sheep ish -sexu alization -sen thomtillis -secondary schoolmemories -seam ers -se dimen -schoo ley -san key -s faf -s atti -re zo -re ig -re affirmation -rain sy -rail fans -qual itye -pu rie -prinze ssin -pre peration -plow shares -pla ited -ping ame -peñ arol -peripate tic -penalty rates -part yof -pa olog -orthope dist -orang eroom -od nb -o va -ntv newsnl -nin aag -ninaag dal -ni eva -ncaaw bb -na or -my phone -multi hull -mudge er -mosqu ito -miguel ferrer -mack trucks -macart ney -ma belle -liss itzky -ligab bva -life changing -lazare tto -law fare -land side -la ppy -ko chs -knight swood -kisar agi -ketu rah -ka tho -ju by -josh devin -joshdevin edrums -jack hammers -ja ise -invest ec -infection control -indie pub -i kut -hydroly sis -hu tz -hot and -hen ni -gu mmed -goo b -go flyers -gior gione -geo scientists -fu sz -flat ted -fiest y -fer us -far th -fai roz -excep tion -ent rop -embal se -elfon ashelf -ef w -ec cs -digger land -diffu ses -des sel -deal sof -de dic -cá ceres -cyber ark -cultu red -cryp topsy -consu elos -comi furo -cobal amin -clari dge -carden ales -callip ers -callacu tieout -ca ireland -c xl -c tid -bru cker -broken lizard -bofam l -bb ck -bb capprentice -band la -ban erji -ay han -avalan che -ase va -as ato -artificial inteligence -armedforce s -arant xa -arad hana -ar j -anton opoulos -anor th -allu re -adidas soccer -ðŁĺ« ðŁĺį -ðŁĴµðŁĴµ ðŁĴµðŁĴµ -íķĺ ìĦ±ìļ´ -âĿĦï¸ı âĽĦï¸ı -⬠ľï¸ı -оР± -yu rio -ys by -y ili -y ates -xbox uk -wil ts -we tan -way lon -wat to -voel ker -utt ley -uncas ville -tum se -tu dy -to hono -the pioneerwoman -the misfits -th ag -taw fik -t town -t for -suit elife -st leonards -ss mh -sports radio -sonequ amg -sol ons -sen ility -sen ado -se dinburgh -salv aje -saint es -s belike -rol fing -right towork -reo speedwagon -ra bs -r hh -quik pro -qantas airways -po sed -plom acy -pinto fotografÃŃa -pin ault -pav lovsk -patag oni -pan starrs -os garage -oc d -nue stra -nj sp -naci miento -n ack -mu thi -mu ling -moyamee haa -motor car -moth balled -mortgage broker -mohand as -ming tsai -midnap ore -ment zer -megan amram -maneuver able -man none -mal ing -lu ddy -lex xx -lat ers -laff an -la famili -kwes é -killing me -keep corbyn -kat anas -kam bi -jay wick -itsagreat day -is bt -is awa -ili festyle -iconocla sts -ic osmetics -ho ak -he med -gri ppy -gil kes -fried chicken -fol x -fle urie -five guys -faun af -f pc -f out -er bb -er anow -emo cracy -ed an -e ji -du cote -do oling -discover overberg -digit alliteracy -di eta -delta state -dean morgan -dari ya -cr ys -cou lsdon -consu mp -con signer -co vin -cart land -cakeboss buddy -bu hari -btsloveyourself tour -bru hl -blood stain -bill browder -bell x -awar ner -as pher -as ghar -art daily -argan oil -ar kush -apu lian -apol it -anz alone -andre ak -an sk -an lonsdale -alzheimers disease -alex honnold -al can -af phq -af fine -aci ar -accu satory -____ ___ -! ðŁĻĪ -! ðŁĺħ -ðŁĻĮðŁı½ ðŁĻĮðŁı½ -ðŁĺĵ ðŁĺĵðŁĺĵ -ìļ ´ -ìĹ ´ -âļªï¸ı âļªï¸ı -à®ķ à®® -É Ľ -zer land -z elig -yaa asss -y rn -wester field -wen ye -we play -war ders -visit sweden -vam ani -un icity -tto loso -tro ss -thro mb -teof ilo -teenag efanclub -tc mi -tavit ulle -symboli sed -stron k -staple hurst -stack ers -spas sky -sore head -so suke -skag it -sigmar gabriel -she ild -schur ch -sama atv -road sof -r fu -quit ted -pu san -project mangement -pla x -piercethe vic -pe ery -pan u -ohi sto -officials blessing -of death -o bie -nun nally -nt ate -naomis cott -n dia -mo xie -medit ator -mc crum -maynil ad -mariefre ttoloso -lule Ã¥ -liz otte -lawy ers -kid ap -ke ta -kart ell -k ery -justgo shoot -juic ery -ju ggy -jor jasmith -jmichael tatum -jed york -ix ora -in ata -id one -iam jer -huday dah -hu sam -hooge veen -hitch en -hich ki -guide dog -growur startup -gali za -fault lines -fau det -ever glow -escu char -esc s -elvis es -else vier -e then -dreamtheater net -doc tson -din ara -dil ara -defe atist -czer ny -cw tch -cul leton -cour tin -chur cher -chri stu -chitrang ada -card assian -can am -c wallerracing -by choice -brom ham -brite eye -boon ton -biop sycho -bezan is -basketof deplorables -b flo -auto harp -ap adilla -anthony cumia -an jem -amc talkingdead -al bia -air foil -> ; -= )) -ðŁĹ ¿ -ðŁij ľ -ย ย -à¥ĩ à¤Ĥ_ -Ê ĥ -youngand therestless -york town -yearen d -waw ild -vitam ine -v hi -ut pal -uni sex -tur ma -tu pi -trafalgar square -title town -thrap ston -thisi sr -th man -tech update -team sasha -teake ttle -tay miyyah -tan ish -sye da -super nanny -st ent -splay house -sou der -son ger -solo preneur -so bral -sla gging -sivi glia -si min -shri ft -shr tampa -shen long -shamit abh -seri alisation -sen na -se where -scy thes -sat uan -rudy giuliani -ru ly -rosen do -road y -ro sequ -ri ghting -ri eti -ri dis -rhu le -retro horror -rel ents -r mbr -pun kie -pul ped -powderham castle -pou f -pot es -ph ritis -out moded -om et -nomin ally -no sler -no sleep -ne za -nau t -nap es -na hai -mystic seaport -mou stach -mj keenan -mistransl ation -miamidade county -megan tic -lun aleso -lev asseur -kin ny -ka atru -jk tourism -james franco -inten se -ingh ot -ilu stration -ili v -ij t -hub bucket -hry v -home tips -heli um -heb ner -gu tu -gle w -g jr -ford india -fire arm -ff c -fcau gsburg -er ste -ele e -e consultancy -du bay -dramati ze -dec red -de metris -dance co -dae kim -ctv winnipeg -cru ijff -cor mick -complain ants -com ico -cj spiller -ci oran -chain rings -broward county -belgis che -bel va -barat aria -bam av -bal lasts -bad luck -b mus -ashley mcbryde -ash down -ash bridge -arkan sa -ar oon -anna beth -ad dai -a bear -======== ==== -ðŁļ İ -ðŁĺį ðŁĴį -ðŁĴļ . -ðĿĺ Ģ -ãĥĹãĥŃ ãĥ¬ãĤ¹ -¬ ´ -zi ad -yu v -world t -weare mumbai -wast aken -wand bc -voxel art -vis ayan -vi bha -vau ban -upper deck -tur nhout -tur gid -tre xp -tot land -to grapher -till i -ti mu -thereal xpac -te ste -tau fik -tat amag -tainte d -t pot -sug aya -stre ater -stat i -srisri in -sport sau -south indian -sk ers -sinthe city -sim ko -silver link -shoe fie -shar dul -ser ravallo -selfie time -sear ls -scott rogowsky -rune stone -ru elle -rober th -ri perton -pv f -promoting women -progen itors -pro pe -pro fuse -priv ated -pre raphaelite -prand elli -porfi rio -porcup ines -plu ck -planet x -persi ja -palla volo -notbe infringed -norse mythology -nim rud -ngay ong -nevad ans -nego cios -nb hd -n italo -multi band -monument our -mn gt -misssaig on -miss america -mersey police -megali ths -mc f -max keiser -mali gning -maha vir -len awai -lap is -kra sny -kir ui -kil bourn -ki maka -just girlythings -juniat acollege -jo sua -jimo heir -inish more -indiscre et -implo red -impercep tible -illegal aliens -high clere -heav ed -h mos -groo vies -gre search -gr v -goo fed -going strong -gems bok -ge za -gar ant -frye burg -friez eartfair -evangelinel illy -esk ar -epi da -english ness -el ser -el ani -dres den -donthug cacti -d town -cornell mba -conden sers -co sponsors -cityof toronto -cine family -christ of -chim eric -chennai rain -cheeselo versday -cfa institute -castig lioni -caitlyn jenner -cad enet -bru gger -bra sse -bgg con -bbc questiontime -barg ello -balear ic -b hy -aur aria -atro pical -ar mco -aqu inn -aje sh -ai ro -ah met -aga o -ðŁĺĭ @ -ðŁį ļ -èĭ±ä¼ļ 話 -ç« ĭ -âľĸï¸ı âľĸï¸ı -© : -yofthe seas -yas uk -yas sa -xxx holic -writer wednesday -wh p -vil ain -uvm vermont -upgrade yourworld -un spectacular -uk oug -ug dsb -tw angy -turtle back -tt om -thestra infx -ten aglia -tb u -tam amo -t ú -suble tte -straigh teners -stor ag -spor ades -spar ql -sn ark -shi ve -sharon lawrence -ser ry -scand ale -save theworld -s sex -ri béry -res ented -remun er -reign ites -raveng lass -ra anj -quir inale -py re -pu jol -prate ek -poo jab -per ic -pay bill -paradigm shift -ouro ceans -ota valo -nyc gov -noris ring -nintend ouk -nat ya -nas ugbu -n ka -myel ination -mr chris -monkey island -mo stest -miles morales -mike pence -medi asummit -mal er -maiden hair -maddieand tae -lu ÃŃs -los ada -long case -le phants -ld ny -king sx -kd v -jet port -j alo -ira ivi -ing show -ing america -indi ameansbusiness -ig ad -ideser venewshoes -hoax er -historic preservation -heavy weight -happy memorialday -handel sman -hak am -gj allar -gastro post -gam betta -future star -football season -field school -fay yaz -famili arizing -exercise works -enam elling -en stone -ember js -electro therapy -edwardj olmos -ec ma -eb don -e badi -dex com -democrati zed -daco its -da xe -d ft -cux haven -cupp les -corpor atist -cor nick -coal brookdale -cn ooc -ci enti -children underattack -chic co -cardio vascular -californiawild fires -buss mann -bu cadi -broad heath -bri zzi -brady haran -bor des -bo en -blue hour -bibliothe ek -bi thell -bi gamy -ba sted -avery brewingco -aspir ator -armb ruster -ap aper -ang y -an vi -an sascity -ale ko -ah rq -íķĺìĿ´ ëĿ¼ìĿ´íĬ¸ -èĦ ĩ -æĿİ æķı -æ± Ł -åİŁ å® -ãĥ Ł -áķ Ĺ -à³ Ĥ -Æ ° -® ) -x posed -wre sting -west bury -von k -vic trix -vamp y -usc upstate -us enet -ur w -tu chova -trumple aks -tong ans -thestor yo -thaicave rescue -ten nison -tele graphs -tejas vi -te sta -takeover day -tab ur -t pt -sumed ang -stoltz fus -star ro -star fm -st mag -spir ates -snaggle puss -sm iting -si mel -shar min -schuyl erville -roberts dale -ricci rivero -research day -rachel dolezal -put ney -proud fan -pr jct -poli shed -pk gs -param edical -pa ko -ordin ations -or poreal -onno ghen -on asap -official steps -of ire -nie res -ni mona -next stop -nat la -ms gt -mir ta -mhat re -men angle -mcro bbie -mc kees -mc frs -mb abane -maha patra -lur ching -li gao -lent i -lenawai the -la fave -konec ranes -kirk cousins -kiralı kaÅŁk -kawak ubo -kat unews -karn ali -joh ne -jim bob -jessi es -jan fam -jac i -j md -is las -inter reg -heyit scarolyn -hen low -hari kota -hand bag -gulf coast -goo derham -gla uca -for mars -filo sofia -esche wing -eman ation -eliud kipchoge -dÃŃ adel -dou chey -dor king -din or -desp ain -den k -defen sie -dan bilzerian -cre ami -cle fts -circum venting -ci ega -card ston -car lifestyle -candid ate -buff lehead -bronx nation -brian schatz -boul den -bou ska -born and -bogdan ov -black label -birch bark -bio tope -biblio graphies -bb bb -bay ad -bas rah -bar ahona -ban kia -avi gdor -aro on -arab idol -and redrum -anan arama -an ur -afro disiac -af oa -ac cardi -abu ll -aborig ine -abo d -ab d -ðŁĺŃðŁĺŃðŁĺŃðŁĺŃ ðŁĺŃ -ðŁĺĺðŁĺĺ ðŁĺįðŁĺį -ðŁĴį ðŁĴį -ðŁį¬ ðŁįŃ -ðŁĩ ¸ -îĮ ¨ -س Ù쨱 -تص ÙĪÙĬ -ار ات -zbrush central -zaf er -yun is -yun amusic -yo kel -year nings -ye vich -ye as -winter fashion -win ford -wid dowson -whack ers -wendi emalick -wbr c -val ances -tot ley -thisisd avina -thenana aba -thec wu -the wedding -the register -tenovusc ancer -tau p -tan redron -tanredron cal -super capacitors -sti mac -soft pedia -sic ecream -sheikhu pura -sd or -sco wl -san den -sal vin -ro vira -ro versi -rize spor -righ twing -re pa -rc cc -ram cinemas -r gn -quarter finalist -qld labor -qamish li -premratandhan payo -poul tice -pas son -pan neer -pac eu -p ite -out matched -ol medo -of osu -new usc -ncaa icehockey -molly quinn -mo ta -michel led -me som -mcgre al -mazz ini -matchday image -masar yk -manish mischief -ma fu -little st -lind seys -ley hall -le schi -lc as -latime sopinion -lam pa -ky lee -kra jicek -koz elek -kon z -keen est -kale mia -k jel -juliusc aesar -ja ha -isma ily -inter dict -ingra ssia -in sha -in mac -ib are -hush puppies -hoy te -hom ma -hol tren -han en -hack neyed -ha doo -go kin -girl talk -gab oury -fund aci -fueledby ramen -fi zzy -ferru cci -ferra gosto -felsted school -farm market -famili esc -expul sions -evolu zione -endocr ine -east burn -e braeden -dysm enorrhea -dre ver -dont look -dj ou -dis organization -develop mental -defin able -cruci fixes -cot f -condem nable -clu mped -chy ron -chro ma -cent ar -ce gep -carav aning -broad foot -brix worth -braw ner -br d -bellige rence -bear r -barry island -bar us -bal erno -bal co -b tweets -at it -arach tober -amazon giveaway -ais ling -aiac obelli -afun eral -afgh anist -aduri z -adel itas -( !). -ðŁĴĩ ðŁı» -ðŁĮ´ âĺĢï¸ı -ðŁ§ Ķ -ð٤ĵ ð٤ĵð٤ĵ -ðŁ¤¢ ðŁ¤¢ -ìĬ¤íĥĢ ê·¸ëŀ¨ -ì¹ ´ -ã̰ï¸ı ã̰ï¸ı -âľĪï¸ı âľĪï¸ı -اÙĦبØŃ رÙĬÙĨ -zi yar -ze me -yer im -wo hoooo -vo bis -villu puram -vijay alakshmi -vi res -v rat -tun ggal -tropic als -tri bology -trans fered -tobykeith music -to v -to chi -thur ston -tex asto -tere k -sze to -super cheap -stat u -sou rav -so what -shpong le -shink awa -shawn na -sf d -selfie olympics -scru ff -sc sk -sc lassics -raw ong -rangi ora -r Ä« -pp od -popo cate -polit icon -personal shopper -pel ayo -pau city -over shooting -ortho graphy -ny land -number less -nitalo wey -nip muc -nahai wrimo -nac all -mun dy -mor osi -mis uses -matthewl illard -mar les -mag alies -m phs -lime bike -legend aries -labru sca -la se -l bi -ks ack -kre wel -ker li -johancru yff -joakim noah -jameshet field -iz anagi -iy aa -iam laceychabert -hy pon -hor ak -hoo pla -hawai inewsnow -han shika -gur k -group news -grl powr -greed ily -grad ations -google photos -goo oooooooooooooooo -golden retrievers -gig guide -gg olf -gener alizing -fun kiest -frail ties -flower girl -f stone -er roll -en ninful -el repgh -ec ross -dubo ce -doo bie -din ma -dil dhadak -der reen -dallast nt -daily calm -d chen -cu yler -cro teau -cre on -cr nc -con scripts -compen sator -col azione -coastal living -co ley -chekkachivan thav -ce volleyball -cap acious -cad burys -ca stries -bunnaha bhain -bike towork -bhand up -ber tinelli -baske twomen -banc or -ban anab -baira va -bab ul -asho ka -as gr -apar o -all ly -all bright -alessandr ini -aku mara -ai ste -afg anistan -ad ame -ab salon -; } -!! ðŁĺĤðŁĺĤ -ðŁĮº ðŁĮ¸ -ìĽIJ íĺ¸ -ãģ Ľ -zi zz -zi k -yor ke -wx mafc -wwe bige -wo wk -win today -win co -whati f -wer kin -vide tte -vajazz le -ud h -u mineko -ty ng -tu pelo -trans vaal -total cafcl -thrur pg -the revolution -th parallel -ter cel -tal man -ta be -swam ping -super micro -su nexpress -stigmati zation -steiger wald -spur ling -sports writing -sport sclub -spoiler tv -si ru -si dle -shel bs -sharon jones -shari alaw -sen deros -sec nation -sap r -ro dden -researchimpac teu -redding power -rashi ki -r mit -que brada -puffin ess -prince albert -pp aca -pop health -point lessness -pleas ence -phoenix lp -pau lar -pat rouille -pantal one -p cl -ny che -nu dgee -neer atan -nas ar -nach es -nab bing -n he -n ck -mu umu -morning listening -moon watch -ml jet -miskat onic -mis u -milk fish -mi u -mg tow -meh di -mar athe -lucasoil stadium -london breed -lizard men -live say -lifes better -liam fox -led widge -lavanyab hardwa -kre wella -kne eler -kings north -keepcal mand -joy al -josep he -jon ni -jo edi -jeff tweedy -instagram stories -ingen ue -ine learn -how lers -hipho partist -he mera -he mant -he kate -hann ahs -gold bergs -glu cagon -gad u -gabri ele -gabby giffords -from where -friez elondon -fre she -fo shay -fernet branca -fer r -farm show -er se -end coal -echi dnas -eastlanc srly -earthwind fire -duct tape -du bas -dru cken -drive thrurpg -dick ov -di gos -devarak onda -david johnston -dab omb -conis brough -comple xo -colle geny -clu mber -chester tweetsuk -che bet -ceano thus -ce ding -cas lon -career development -caoim he -bru te -borde leau -birdwatch extra -bengal cat -bel aying -beau s -bbcsouth weather -batt in -base ballis -bapp amorya -az d -att r -an anias -akshar ahaasan -abhi jit -ðŁĺĦ ) -ðŁĺĤ "@ -âłĢâłĢâłĢâłĢ âłĢâłĢâłĢâłĢ -young music -yo ke -win chesters -whok illed -weare cue -vo gl -vi ji -ver asani -uss k -un manly -ul ite -ugand a -tri vikram -tran scom -tor ye -time snews -theaf ccl -thank god -tham esp -tele toon -tat to -ta fa -su athletics -stop commoncore -st s -spire a -speed hunters -slu sser -sir na -si put -shaaan xo -selen is -scra zy -scam mell -sar tor -sam ik -safer internetday -russ els -rogu ish -rl tw -rixton official -rivie res -richard marx -re inet -re constitution -re configurable -ra pson -priyad arsh -pot c -pen american -pat tullo -par acha -p head -ori shas -one wtc -ocu lus -norman lamb -nick vujicic -ni ed -new products -nar sis -nab l -moy cullen -moo o -million cup -micha eli -mi dian -mb aye -malay o -m trainier -m ser -loveyou all -liti gating -lind ab -lehigh u -launch party -latch key -lanca shirec -lan dover -kra thong -ko tz -kint bury -ke iz -jubin nautiyal -ip mi -inten sion -hou la -hou ght -her ber -helge son -helge sen -he ireann -harry appreciationday -gimb als -gill ingham -giftof life -gel ber -ge iser -gal z -fanta sized -ey ard -ext ella -enter ta -endless summer -eat fresh -dyne vor -drunk ards -dream ers -do ps -dig able -designby humans -dart ford -confer ment -cold front -co health -claire fontaine -citiessky lines -chin amcclain -chan dio -chae bol -cec ily -caric atured -cardiff met -car ven -cameron mathison -cab ourn -buen camino -brundle f -brazo sport -brand ao -bio art -bil stein -beacon house -ba her -añ ejo -auto group -author amish -as avi -aram kon -antiquec lique -ann eli -anand tech -amne si -ambro se -aji bade -af raz -aber lady -aaron son -a etc -ðŁĺį âĿ¤âĿ¤ -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ -ðŁĩ·ðŁĩ ¼ -ðŁĥ ı -íķľ ë¹Ī -ìĶ ¨ -Ê ° -zen book -zato ichi -yo or -y alty -x html -womens facup -wild horse -weather wax -we some -war like -wal tons -voteblueto saveamerica -val emount -v ml -ut kal -tric home -tresp asses -tool ong -thor aco -thesquare ball -thehard way -theatre awards -the drew -thar anga -sy reeta -sur ridge -sto inis -splend ens -sp lanet -soultrain awards -sophiel ady -som ec -smart buildings -smar a -sing post -shoshan abean -shak ya -sh agu -scott pelley -sat an -sal yer -saint snation -s vein -s comedy -rober ta -ro der -rebel o -rebecca jarvis -raiffe isen -pul te -ps v -prompt advant -pro visioned -pre iss -portrait november -port ela -plan itia -pic xania -philipham monduk -path on -par ata -pan hard -ns live -novo gratz -nh b -neeratan den -nam ida -nam es -mv agusta -mun in -money gram -micro climates -mement omori -medieval art -media ev -marqu es -mark smen -mar nie -mad magazine -machine intelligence -ma pun -ly c -lum sky -lu me -lewisham council -len inism -kordo fan -ki as -kel oid -kathleen madigan -jud iciously -jose fin -jessic as -je ti -jay z -jan as -jac en -j ver -ir craft -in th -illi ans -if adnews -hopgod friday -half price -guitarri sta -grlpowr chat -great indian -golf show -god win -gobble gobble -go za -gl te -gigab ytes -g lat -g brow -frank reich -fp jr -essi g -en theo -ed p -ed iti -ec ruz -eb st -eastern cape -duke gang -dover athletic -di emer -demo dex -decryp ted -d bh -crusaders rugby -clam our -choic ed -chicago cubs -carai bes -bren chley -bree zer -born thisway -ben av -ay umu -avs nigeria -antoniob anderas -am art -all eno -al sh -adi vision -aber porth -abad don -ab hy -a bee -' ..." -ðŁĶµ âļ½ï¸ı -ðŁĵ ī -ê¹Ģ ëıĻ -ี à¹ī -ÙģÙĦسط ÙĬÙĨ -ا Úº -zwart ble -young spubs -wc pw -volk off -vijayan pinarayi -val parai -un produced -un likable -ulcer ative -u can -tä nak -toxopla smosis -tor ren -tine a -thegirls musical -texas strong -tari que -tami roman -take away -ta st -t js -sx melectro -sweat pink -suresh chandraa -sound mag -si ya -sex tape -sebad oh -scott porter -satter white -sar anya -ros ada -ro senior -recomend ado -por tholes -pon tin -plio cene -pe quod -patho fexile -pak hi -p du -off world -news busters -nat vanlis -na un -my fdot -moun troyal -micro fiche -miami bookfair -mi q -mh sc -me sabi -me ddle -mau ch -math lab -materi alised -marqu ita -mar tucci -macou pin -lleg an -limit ers -leonard cheshire -lavo z -koin news -king si -kick offs -ki am -kad aramkon -jo sho -jenni em -je wer -jac ey -j pi -isaac mizrahi -ir thday -in comparably -ima ke -hou de -ho cked -hit btc -high seas -heer babu -he dd -har kavy -ham irpur -gy c -gretchen whitmer -great guy -graff erty -golf travel -giftfor him -gh un -ger as -gau vin -gar agi -gand alf -g di -g ades -früh ling -fri derz -frederick town -fing al -fibaeurope cup -fanta sist -esti mable -ellic ottcity -ek d -ed xonline -e apc -du eled -don gs -dog treats -dish nation -die h -dev ault -des apare -dent es -davidg ill -dar cel -dad bod -da di -d km -craig lowndes -cor ris -capetown cityfc -cam poo -cal d -cairn terrier -cad ence -c mg -bwal ya -bw g -bragg art -br ica -bor nes -bon um -bon der -bm ttandem -blackdeser tonline -be vents -bb ell -bat dad -ather ton -at witter -ask am -arnolfini arts -andri ana -andre an -amo reno -amit abha -alan tudyk -al van -al ace -ad be -ab ayan -? âĿ¤ï¸ı -ðŁĺĤ ðŁĴª -ðŁĵ² | -ðŁijĮ ðŁĺĭ -ðŁIJİ ðŁIJİ -ì¤Ģ íĺķ -zom usic -z ouch -yyc music -yu saku -wwen eville -wo ggle -wick reme -westfal en -weigh troom -vr ps -vote jkt -v th -ty ard -tu ks -truckn driver -travel ist -touch wiz -thero bot -ther ag -thelaugh factory -ter ma -tel for -tel erad -teach ag -tatamag ouche -summer glau -sub humans -southern star -shaf ak -seawol ve -scu do -scorch trials -sat na -sant en -sanc on -san ghar -ruok day -rumb led -rogal and -revolver mag -railroad ed -queens land -pumpkin carving -pre sonus -pr request -pop dust -po gona -parl ons -on scott -om ir -ok mesonet -nu wara -no vica -nigh tt -nh dems -newton ville -new beer -navar one -nahu el -n md -must i -morning star -model cars -mo peds -miyaz awa -michaele merson -mi yoshi -me tron -mat angi -maker studios -madon naf -lub be -losin j -livel ounge -lead up -ladies g -kre ut -kin sey -ke et -kar wan -k bb -joven es -is bnpa -industrial music -inde acon -in dominus -henson company -hay market -hat ori -ha skel -gy al -gravit on -grant ley -good looking -glu teal -ge ffen -freak indeacon -flin der -flick inger -fi ved -femin amiss -far sighted -erlen meyer -do gen -dal beattie -daily herald -cu ong -cru mley -court sey -could nt -cotton seed -co traffic -chin ky -cefas govuk -cam mi -cam bourne -c sed -c festival -bur gee -bro cante -breakfast with -brac keting -bli brary -biggest loser -bethesda studios -barry sanders -bal in -azamar avoyages -auctione ering -att park -ar ni -app rised -ani festo -al nassr -al loc -ai mar -adu bai -adam woodyatt -ach on ->> # -ðŁĺ¥ ðŁĺ¥ -çģ « -ãģ © -а ÑĢÑ -zoethe ball -zam ana -zab ludo -xia oyu -ww cc -wre tch -wi leman -white read -wal kab -viktori ya -vikk star -un trusted -tsa on -tran stv -the knick -thar aka -t drs -sw brail -swbrail riders -sw all -susu mu -star sonice -stap ha -spring well -spinabi fida -soci os -sn ard -smar ini -sk use -sit us -ship wright -sep i -sene cio -se vin -scho or -schill inger -sc sn -satis factor -sachsen hausen -s girl -ry uki -rugge dized -rosic rucian -roman britain -rl j -reas sign -rac ia -proud father -po je -plu mping -plenipotenti ary -pick les -phosp hati -phi b -ph enter -pepso dent -partick thistle -pan ge -otter dam -or re -olym pe -nut free -not ta -norther nontario -nor fleet -noir summer -multi focal -mudgeer aba -mrporter live -movi eland -morning live -mo ssi -mir us -minu tiae -min usma -metam orph -medic os -mc glade -match es -mal amu -mahar lika -ma ppings -lik on -ler k -koro vin -kaz insky -jobo aler -jac kiel -in memory -i io -howto basic -horn beck -hm hs -hel muth -hay dens -hashem ite -happy makarsankranti -ham strung -hacket tofficial -gon calo -golden temple -ge ist -gator zon -fredo santana -fl acs -first gen -fil omeno -f heis -ev intage -en ali -ed iciones -dragon gate -dr j -do ina -disper ses -di wal -dev hynes -deni grating -del rey -de duplication -davido tunga -dab lam -d str -crow medicine -cot grave -com ate -col drain -coffe es -city westminster -chieftain cy -cherry blossom -c sto -burgh leyhouse -bu er -brom well -bir bal -berry tmr -bered seered -ben the -bc x -bar atta -bam se -bal lade -aw is -av adi -as mat -as cu -armi da -app ric -anasu ya -all llllll -ale theia -aldub xe -aldu be -ail lu -against allodds -adamcole pro -accoun tab -a ane -" ...# -ðŁ¤ ² -ãĥĸ ãĥ¬ -à³ ģ -z day -youth for -yoga pose -wain ui -wad ada -w clc -var ona -urin alysis -underdesk loser -under glaze -umich medicine -ull mark -ukrain ian -tzed akah -tw ash -trump sters -think landscape -theoutdoor city -the town -the sar -thath omas -tez pur -ter no -tas lima -tar ta -tafa wa -ta arab -super mariobros -subhash ghai -sub contract -spublic ations -social rights -slo ppy -ski jumping -sher born -sehs thebest -scuder i -sar ova -sal ah -s room -roman ova -rock on -regaz zoni -r kt -produ k -predi lection -plaster work -pi ura -pen alizing -pan ta -pan enka -pal mares -old english -oax acan -notredam ec -not fair -no vik -nic kie -nast assja -n said -myfox tampabay -mom usic -moistu rise -medi amo -mc quay -mas dar -mani yah -makeit real -ma kay -m jakbar -lpool council -lowest price -lass ic -lar mer -la win -ko conews -kn apper -key stroke -k rook -joburg theatre -jack the -hk ir -hil der -herre ra -hei jden -he ley -haz ra -hann ad -gregari ous -german shorthai -games manship -gam p -gal u -g sy -g ico -fo b -fe to -fate ha -exagger ations -esur ance -eigh th -ec wa -e thology -drug war -dru gab -donkeys anctuary -diap hanous -di maria -de cri -dai quiris -cor day -con leth -come at -co bix -cobix reyes -cc sf -cap radi -c bo -bsn sports -bot ching -bin n -bike chi -ap ke -annas ui -anc as -an aka -almir ante -al bies -ait ana -ad alberto -abar bera -. ,. -ðŁijī ðŁijī -ðĿIJĪ ðĿIJ -éĢ ļ -ãĥ³ãĥ ģ -ye siam -were the -wehave wewill -we ki -wa ht -vul gare -ura uganda -up gradable -uof regina -un righteous -u stra -twitch affilate -twee ds -tv guide -top coder -tom ber -the virdas -thankyou u -ter man -tele visual -team ajaydevgn -tali ban -tale of -tac tic -swains boro -supri sing -su raiya -stu lsa -stir rings -steph anos -stand pipe -space coast -solart vnews -snoqual mi -sn live -sl un -sh ole -se wak -science advances -sche ff -sch roth -scal ene -sal atin -saf ran -sab r -road runner -ri smo -resemb lances -replic able -replac ement -re trained -re draiders -r fef -pra chu -pol an -pesh wa -ongh ere -on ova -ome a -o dgers -new shead -ne eli -national lipstickday -n ram -n han -my heart -mur nane -multic olour -mtr cb -monte mayor -miguel tanfelix -mck ell -mark d -mar m -mango tsfield -ma bie -m brundlef -lulu lemon -louisi ana -log books -lev itt -leff ingwell -la villa -ku nedo -kra de -ken ma -karate ka -k gp -jame er -jagad guru -it ouch -ish h -indul ges -ilig ence -i prit -hymn als -ho ppo -histor ico -harmon izer -grant sville -google exper -gm fc -gemat ria -gal breath -fun c -fraction ated -fox newspolitics -fi h -fan light -engag ing -en esis -ec oli -diferen te -dhen kanal -de moralising -dayo ade -day tuesday -cy m -cra zzy -conver gences -colou red -cine spia -chis os -cer ullo -carno taurus -caric hampion -capp ellini -c pyne -bu land -bri atore -bradleys fight -bracci ano -br ck -be atie -bam asb -bag na -bad day -ay ran -au do -at ole -astro logers -around hampshire -archi vo -aqu azzura -ant ourism -almir on -airbus ds -adeci mal -acid house -abell ana -a dis -.. ~ -! ðŁİĥ -ðŁĴŀ ⾨ -ðŁĴĸ ðŁĴĭ -ðŁıı ðŁıı -ðĿĺ ¦ -⾨ ðŁĺĦ -âĺºï¸ı ðŁĴľ -ب ÙĬØ© -zee man -x cfl -will mott -wikicom mons -vibr ance -vi ste -une motional -un truthful -tom segura -to pac -the bill -ter update -team sa -te icher -tam plin -tailgat ers -ta haj -super normal -stat evb -sn mp -si men -shap er -se vil -sc as -sat akarni -sanit ised -sam bro -saf wan -rider strong -re color -rath fr -quade cooper -public diplomacy -pronoun cement -positive coach -plebe ians -plane te -ph le -pent yr -pen ko -pe red -patron ised -orgre ave -ok l -o je -nor ra -non et -nas rullah -museu mart -mou tier -mosas aur -monopoli zing -mm schocolate -mizz en -mis l -mal ott -m con -lud wick -looo ok -long den -liver ight -litt a -lit te -lion nation -lever ton -lefthand brewing -le petit -kul iner -kro pp -kid sday -khali fe -kh ound -ke shi -kat la -kasar agod -kas lo -jer am -jef ford -info sy -ho adley -himach al -heritage fun -heller town -hass ine -hard anger -hallo ates -hall yu -ha sit -h sw -gy p -gron din -graub ünden -gra af -gon dar -go girls -glas lyn -ge thealthy -gan k -ga hh -form o -form ative -forgi vable -flu season -finding carter -ferrar ir -euthan ised -err orists -emb aj -eliz acarthy -ed unn -eat clean -e max -drive safely -don ghan -dom ec -do ts -divers i -deven o -dea thanniversary -dave ed -dance onfox -dair ying -d town -cyto skeleton -ct surgery -consumm ation -consoli dations -comrade ship -col ch -chun ga -c pu -busy body -bu den -bro chette -biz school -bi bb -begley jr -beautiful places -bbcradi of -bar thez -bah ram -bachel der -ar que -al iso -agi bbons -agglomer ation -ag unn -ag news -achen bach -ach or -abo gados -ab ster -ab azar -aar au -a shot -ìł Ŀ -ãĥķ ãĥ¬ -âĩ © -ÙĪ Ø§ -zo va -wou k -wn p -windy city -wego again -wedd in -wat esgroup -vinod khanna -ve kic -v lam -unex amined -unbeliev ing -un labelled -tur nal -transc athe -tram mel -topra k -told story -todd ington -thu ms -the union -tau fiq -tab an -super intelligence -story behind -stcuth bert -sta w -spell checker -sl rs -sk news -si pple -sh kapoor -sear a -saturdaynight live -satine phoenix -s yo -s meets -row lf -ro say -richard coles -ren c -red dot -rajag op -pust aka -pneumoni ae -pi ase -petron as -parl ors -paolog ent -paologent iloni -overex tended -over wrought -ou attara -oned bestfans -o teri -ni ère -ni gr -ne a -nal gonda -n wtf -mor tification -mo tala -miz rachi -milen io -mil bourne -mh world -meridianc u -me yn -me tri -mat ariki -mail and -mad villain -love food -lo des -letsgotothe ex -lec ricket -la sen -la fe -kt va -kon ink -kir t -khal fan -it ter -ira ja -indo logy -in bal -i ae -huffpost live -hot beds -hom eland -heaven officialsblessing -health ed -groen links -gro be -grace fulness -gau ff -fundam ent -fr anny -feed lots -farmto fork -fa bel -eve yone -etru ria -esk om -ere whon -enov aaw -dr ough -down s -dis kette -dhi raj -design miami -deck i -date time -dash lane -dasch le -dam ay -cra zz -coy q -confi dants -chain maille -chad dadon -bun ited -braehead clan -blue sea -billys later -berlin a -ber it -behere now -bbcin tune -bareminer als -bal luk -bab ii -au ll -ation alist -at tu -at reides -asah ina -as rs -arts offl -app state -americ o -aller y -al az -. ðŁĮŁ -" ....... -ðŁĻĨ ðŁĻĨðŁĻĨ -ðŁĺı ðŁĶ¥ -ðŁĺ¬ . -ðŁĮ¿ ðŁĮ¿ -èģ´ãģĦãģ¦ãģĦ ãĤĭ -âŃIJï¸ı : -âĻ¥ï¸ı @ -âĨ ª -zipp speed -yel ahan -winter sale -watch me -vir di -vic ari -val demar -tu tton -trum pusa -triti ya -tornado warning -tomp kin -to fin -then fb -theli ber -thel ab -the est -th rum -teu fel -taxcut sand -swind ells -ston i -sto povers -steve perry -ster r -star flower -ss q -sound track -sigh isoara -shutt led -shen stone -shaf aq -sense making -seis mometer -seapor ts -seaman ship -sal cido -sab u -s thouse -s arti -rub chinskiy -ri poff -rho dia -retro fits -rep jerrynadler -rec entre -purrr fect -puff puff -ple eeee -pit roda -phra o -per se -partsun known -paraly se -pal mira -paddington bear -paci ous -of london -north pole -naga oka -most awaited -mor ini -mor arji -monast ir -mo wins -mike crapo -mar janovic -m chat -lindac ohn -li zza -lever ly -legg ere -latch mere -kuus amo -ku uga -kle ist -kha yr -kevin mitnick -kazant zakis -kam araj -ka shu -jos buttler -j sk -iolan the -intere sante -inter fans -incu bus -im richardyap -im broglio -hydro logist -house boy -hol ling -hk sar -hills comedy -here ee -har thill -hal yard -gov of -gimna sia -gie sen -gg lobal -gag tweets -g mtv -g board -fu sed -fru tos -fight net -fan sday -exc elle -eph rem -ele me -e tron -down slope -dg w -desro ches -desk top -derby uni -deli jah -dar gis -crime drama -crevas ses -colo simo -cla vell -chiantic lassico -can nel -camise tas -business continuity -bur lesque -bun ched -budger igar -bu ist -brun skill -brin ker -bert man -berber ian -bar onial -balu ster -bab ymama -au mf -as del -and cream -alannam asterson -: ðŁijĩ -Ķë ¸ -ðŁĩ¬ðŁĩ ³ -ðŁ¥ § -é¦ Ļ -zwartble sie -zo omi -woo ot -whoop whoop -whitec astle -wa as -virtual tour -var dan -v uuren -unter gang -tu twiler -trevor jd -tree brewing -togetherfor yes -ti ye -the ke -ter vuren -tar pon -tail ment -tab ligh -sund quist -summer fashion -spreadlove positivity -spec news -si dec -shri venham -septu agenarian -sales management -ri u -resp ighi -recep tivity -real fpjr -rational isation -quin s -quar tering -quad rennial -pope inus -pol onius -pl sql -piet sch -pan fur -over simplified -out smarts -ourcountry red -oris kany -new cifera -ne ons -national muttday -n ji -myx musicawards -my erson -mu women -mr t -mohen jo -ml bonfox -mississipp ians -micro chipping -mic keys -mi yoko -mc gowen -mc atee -mar uko -mailand guardian -magneto sphere -mac ritchie -liz ia -life below -letting go -lets roar -lea o -lab life -la et -l anni -kok stad -ker ast -k met -jas raj -jame shut -jab u -j brown -iz ola -iam intel -houseof lies -histo grams -hal ite -good rum -gbrow ingteam -fu ÃŁ -flugz eugbil -flugzeugbil dde -flamin goes -fifty three -feile belfast -fe ir -fa sig -espn greeny -dothe work -dont get -dominick cruz -disal vo -dis ables -digi dhan -di deas -deliciously ella -deaf lympics -dai ji -cur cio -con sole -cis cou -chekkachivanthav aanam -cheer sto -casca bel -cal dron -bro dick -bird dog -ber meo -bel onghere -ar p -al mod -al ahly -aga c -abe ille -ðŁĴİ # -ðŁĩ¨ðŁĩ µ -çIJ ĥ -ç¬ ij -æĽ ² -özge gürel -zin ni -yaku pov -y for -x si -wright state -worldar chery -win chen -well head -vis erys -vin da -un glazed -to cant -tocant ins -tin ky -thi ther -themeat ly -temp ter -teg mark -take charge -tac tless -suppor tive -subsi st -su ha -stil acosmetics -ssal on -spar da -smarty rs -sky sox -shutt lesworth -seismic ity -scol lective -schnit t -sch ib -sc d -sar anda -santan acarlos -sang ma -sak ala -ris ation -rein ders -ram fam -prayfor peace -pra sadam -pleas uredome -pf leger -pe f -patmcgrath real -our pain -oss ining -on ear -omer uo -oil man -official alw -ob sse -norde ste -neutr alizer -nav s -national pet -n andy -ms mith -morris art -morphe me -mic limerick -mari b -man cos -lagar to -kish en -kin lochleven -ke ffer -kamasi w -kak eru -just ment -john nys -jamshed pur -jagga jasoos -jager meister -j nan -j ff -irantalks vienna -iphi genia -inas much -in appropriateness -il ve -iamami whoami -how z -horror hound -holly holm -hitmusic only -hell yeah -hel los -haye z -harsh deepkaur -harrogate town -ham er -g tz -foo tre -finds friday -fin edon -feminamiss india -ev aristo -eu th -eth icon -epi gram -end ays -ed begleyjr -e wha -dimm itt -denni ston -daysof oscar -dal ot -ct la -christmas decorations -chee sey -ceram ist -cbc sby -cattle man -camping world -bru hn -brad stock -birthday month -birmingham weare -bird flu -bir sa -bill kristol -bh ana -bel ice -bb log -bar kin -az b -aturi smo -ath lone -aspe tt -arnou x -anamari ecox -an una -am munitions -all blackeverything -agricul tural -af ce -' ?? -ðŁĻĪ . -ðŁĺī ðŁĺľ -ðŁĸ ± -çĢ ¬ -~~ ~ -zuk erman -zippor ah -witcher game -whor un -wee tie -wal thall -vel as -v hong -us nft -us asunrise -un sheltered -un ani -type casting -trans metropolitan -the guy -super tanker -suggesti vely -ss m -spol icing -sm itten -slo cal -slash dot -skybet league -skam ania -sing am -sig gers -si mes -shar ansky -sh loka -se dro -schi frin -sat yrs -reve sby -retail news -ran chom -rackete er -polon sky -ple dgers -pit u -phenomen al -pe tah -pari stech -or lin -ocean acidification -obu asi -now toronto -newberry library -neder lander -n acks -my father -mss ociety -mount field -mor tier -mo in -mischiev ously -micro service -micro green -mc gown -matth agan -lur kers -lowes water -love wilko -lmfa oooooooo -kwan ghee -ko tv -kau fusi -kati em -kat ori -kat ar -kare en -jorger amos -j ems -ital design -isp wp -india historypic -ignomin y -if v -hostel ry -hope world -honor our -hon d -he schel -h alie -gri sman -goondi windi -get motivated -geek girl -ge tar -fire bombed -feder ico -family guy -excel sis -eve tt -estac ada -era edta -du kraine -dr l -dou ai -denisle ary -dar la -cryo lipolysis -cruel ties -cre ady -collecti vist -codeof vets -cobra golf -co gen -club med -cloi stered -cla gue -chit osan -chau dh -championsle aguefinal -cham pur -ce mal -carpenter sville -bry na -brumb augh -broad green -brat en -bram ante -bob sledder -black lick -bi alo -bhar gav -bhan j -bbc northampton -bay at -barrela ged -bal som -baby ariel -b gh -az nude -associ ate -as ound -ar coding -alainde botton -af es -aapkad haram -** . -!! ðŁĺģ -ðŁijı ðŁĺĬ -ðŁ¤Ł ðŁı¾ -íĸ ī -é Ī -æĸ ĩ -~~~~ ~~ -zu zanna -wo wwwww -wickreme singhe -wau chope -voteuk mahomies -vis arjan -vir l -vintag ep -ve rest -ur sel -unve il -uncle bob -ud n -tu ite -tr nd -total access -the phantom -the gin -the fashion -the at -ten ter -tasty poem -sutton coldfield -stream side -stre mme -stop fundingh -sports file -speed man -sp hen -so arer -sla dy -sin ter -shi st -schne pp -sch umi -sat pura -salt spring -saj jan -s arie -rogo zin -pre volution -ponto ise -po hlman -petter sen -pd schargers -pas quier -pac ers -pac eman -p bg -our de -oste op -oscar trial -o gura -nsu kka -northant spolice -natgeom ag -mo shiri -mis quoting -mercury prize -memorial hermann -mdant sane -mad dies -mac gruber -lud milla -lu sail -lin ie -lighthouse day -lich man -li ze -lazz ari -lay zie -lar ussa -kon ings -knob creek -ki si -kevin vonerich -kayseri spor -jin ni -iso de -is may -iprit amofficial -ine ws -implement ers -ig slovenia -hy dr -hof stetter -he ma -h shanghai -green planet -glu can -ghi bran -form alism -flower oftheday -falak numa -fac il -eric topol -elo ise -ei go -ec statically -east siders -eagle son -du er -drama beans -don skoy -don ata -desafi o -de za -de ste -dani her -d Ãł -cre atu -craig melvin -cr sp -con j -comhal tas -clar us -city radio -ci fer -cho let -chlor ination -chin ad -ch itti -catal di -car al -capacity building -cagli ostro -bullet storm -bu ssiere -brisban ecity -bride and -brendand assey -brac ts -bo vard -blue bull -black heath -best man -bern stein -bamboom usiclive -ath nico -at rain -ar non -appreh ends -amanda holden -am ason -alleg ories -aha dra -active yes --------- ---- -ðŁĺģ ðŁĺĦ -ðŁijı âĿ¤ -ëĭ¤ ìĿ´ -ঠļ -اÙĦ ر -п ÑĢ -ç ons -youvegot mail -yemen ite -year sofe -yamahar acing -x op -x fighters -wood lice -wim an -wan kel -vin cat -uplift ing -un rehearsed -ub co -tom fitton -the ek -the drake -thab iso -tes las -tag er -super sonic -stro ve -stonec old -sine ws -sieg ler -shi rov -shi ren -sc liffe -salon en -sac cessories -republic adominicana -rep your -reload able -real isations -read missions -re genesis -re confirmed -rasto gi -ram jet -raja beta -rajabeta sharad -qu itec -pra kritikakar -polic ar -pol en -po wri -pipe smoking -pint ado -photo aday -pet abyte -pend ry -pen lee -paw z -p fen -p bw -overex cited -open cast -oh god -nishi kawa -nish ad -nikonowner mag -nikol aev -nas d -mun che -mu ahahaha -miss americ -mil icevic -microne sian -me mes -mc craw -matthew berrytmr -mak am -macul ata -m commerce -litt ell -lit em -lies beth -ki hn -ken ning -ke van -kamalhaasan fans -josel u -jo ssel -jim stweetings -jeet kunedo -j sch -iy engar -iv ars -incur s -impul sivity -impal ing -ili sts -if msa -ic bms -hor i -hin da -head abovewater -he ye -haz y -gul zar -guil la -gu stas -gor get -google docs -good thing -gameofth ones -gamali el -fu ssed -floridal ottery -fe ma -far away -fac er -fab bro -expec tedly -en circles -ele wis -egg en -ef ren -easter seals -ear ful -dun ya -dou rado -dilo renzo -diade ma -deco ction -dead heading -de tre -custo dio -cuer vos -crisscro ssing -cor ral -combo ver -columbu sohio -collecti v -co yo -co vel -cn nee -cho cor -char ityevent -ch avan -brass ware -boy land -bo twin -bla gg -big play -badboye m -bad illa -ba jas -b gd -ardu c -aposto los -apo state -antiterror ism -amar ah -alex iso -al men -al bright -adam jones -ad do -ad die -ðŁĺĺ ðŁ¤Ĺ -ðŁĮµ ðŁĮµ -ðĿĻ ļ -å°ij 女 -é mile -ç i -zion nps -z ian -yan tai -wr inging -won young -wis ler -will ferrell -west lothian -wah ro -w ky -w autu -vin us -victori ous -vee jay -up fitness -ulcerative colitis -uk ku -u ÃŃ -trac ism -tiru chi -the curren -temple of -tak bir -ta wn -t ver -super crawl -stop ford -soledad obrien -sing ita -simul casting -she her -se il -sc apho -save gotham -saturdaymorning cartoons -sars fields -ridge top -ri stic -rener gracie -ram apo -rach ita -r vo -productiv ity -pp sh -popocate petl -pi edmon -period stories -pav é -paul blackthorne -pachel bels -or tolan -op tane -olom ide -nw ts -newon folksy -neuro logists -nein quarterly -nass nigeria -na qi -n rol -n ooooooooo -mysteriesof laura -mun dos -motor mistress -montac ute -mo chi -milan luthria -mens shoes -mam asap -madison square -mac taggart -ma wr -lo boc -li wanag -lev ites -legg ero -lac y -kus al -kitt anning -key largo -kemp is -kam bli -ju iciest -john lithgow -jo bert -jameson whiskey -ic auk -hu llo -hom mel -hl inger -ha su -h reat -gu sman -green lights -go pen -ga thi -freakindeacon friday -fonda theatre -flamen co -fic ation -feel better -eyehate god -esk rima -eric ks -er ag -england netball -dis continuity -daniel daekim -d so -cryptom ining -crate red -coon abarab -coonabarab ran -confit ure -com pris -collegi ate -co ssa -cleanup day -cere brum -ce qa -car donald -canc ún -c newslive -btoo om -bso azad -bra zed -blue wings -biom aterial -beer geek -aun er -ash is -ash ely -as ob -art class -arkan oid -arig atou -angr yorchard -anc c -am irah -ah all -ago sta -a ep -= @ -* .. -ðŁİ¶ âĿ¤ -ðŁĮ² ðŁĮ³ -ê´ ľ -ãĥ´ ãĤ¡ -âĶģâĶģâĶģâĶģ âĶģâĶģâĶģâĶģ -ॠ¤ -عÙĬ د -zam ba -za pote -yuku stun -yelahan ka -yan jun -wizzy jr -wilson tennis -ve rey -v qg -un cy -un conventionally -ultra hd -ud k -tul lian -th att -ter c -tax ation -syl ver -swat ara -sune dison -sunday read -stri pes -stopfundingh ate -stein itz -startup grind -ssin ce -spi elt -smar athi -sle epi -slack line -shrou ding -shi o -shi geo -s ry -ross lyn -roman kemp -rll racing -rick on -rep barbaralee -ratt y -pugn acious -pit ot -pig face -photo by -pad more -or lovsky -ol ten -ol itis -nz t -nin is -mo she -mel nik -mel bs -mecan oo -me flo -mcmee kin -mb sings -mahal ingam -m sch -luther ville -london town -lilli an -lewisp ugh -lend ing -lees ang -lay asmine -laur is -last year -land skrona -l gu -key f -keon jhar -kel ner -katrinapi erson -kadı köy -jum bos -jose i -i fra -hy land -huss a -hun grier -huck ster -hondac rv -hamble tonian -haji won -gyneco logists -gou let -gol go -general aviation -gc s -gbag bo -fragi lex -fl anno -fc business -fasten ings -fag un -exi stance -eura si -est ecker -equal su -epr df -dou ses -diet l -defend our -de plore -dav pope -dark sky -dar ger -dam pa -collector ate -co sp -climax es -cho com -char n -cassand re -carbox amide -car ref -car naval -ca zij -by k -bruce prichard -bowie forever -boulevar dier -blues brothers -bluec ross -bil bao -bev hills -be venting -babest ationtv -bab ay -atz maut -arc illa -araf ah -ar ag -ann ane -am etal -ale em -ald win -ah hhhhhhhhh -af branco -acce ssp -;- ). -ðŁĺĭ ðŁĺĺ -ðŁı µ -ìĦ¸ ìļĶ -기 ìłģ -âĿ¤ ' -âľĮðŁı» âľĮðŁı» -âĺº ðŁijį -ö kull -yas mani -x lb -wo da -vote searly -voltag e -uka itis -tw ald -ton earm -thof en -the antondubeke -tessell ations -swit z -sturdiv ant -spi v -spec ts -soul sby -slo we -sj giants -side mount -si et -si delights -shrub sole -sc ities -sav aged -sare thebest -sarah grafferty -saint mirrenfc -ross all -rocin ha -robin ince -river monsters -qu ente -pur lo -pneumo thorax -pilipinas debates -pere c -pc mr -par um -paper back -pan til -nu ma -nb apra -nano composites -na shik -mt gart -mr schu -michellea z -megau pload -med line -matt le -maram ures -mar torano -mandel baum -ma ipo -m ty -m thood -lu cc -lifein apicture -lepi dolite -le ser -lan ville -l fn -kil rea -kil duff -kay in -kar war -k mp -jonas blue -jin woon -japan expo -ins berg -inge ye -infinite simal -ind ar -inam illion -husk isson -hou ss -her ter -hen nes -h fp -guitar uk -gom el -god ating -foo trace -finn jones -field ps -fe ad -fate stay -emirate spalace -elvisduran show -ele igh -dysp horic -dau bed -dal le -collo quia -co hle -clari fications -cla v -choir master -chandrase karan -cer d -cdn tech -carry cot -can ina -cajam arca -ca ino -business school -brown hills -box borough -bor ak -big west -bet d -ben well -barber motorpark -bal by -ba aba -az epam -av isa -atur ns -arav ali -am amos -a ção -! ðŁĴ« -ðŁĮĬ ðŁĮ´ -ìĿ´ìĬ¹ íĽĪ -æķ ° -âľ Ń -á´ ¬ -wi sen -wherearethey now -weston supermare -war do -w xc -vertical farming -v tu -ussk iteam -ur rea -under construction -tus shkapoor -trans versal -ton n -todd terry -the kate -tas os -subli mity -subed ar -stop smoking -stipp led -spo ol -son gever -so haib -smu n -skirk ja -shen zhou -shaun w -shaun avon -set suko -san ct -sair force -s than -quir rell -prog metal -pro mat -pr ati -port age -poli dori -phi us -per ls -paper towns -pa un -p wy -p mh -p boro -oz s -owler report -orak po -or dine -oli gom -oc ton -ny gren -now play -not done -no ory -no kes -nikifor ov -net ballers -ness man -nam aqua -nae em -movie actress -middle wood -mha feez -met life -melani ep -megan bata -meaghan rath -mari ac -mar steller -lw anga -lou kas -line t -like an -li ag -laure tte -land holders -la stampa -l bg -kk d -kim jonghyun -ken za -kat yal -kali sto -k mb -justice forall -ju mana -jan ek -is oc -ike chukwu -icon ference -ic ome -i mortal -hydro philic -hou da -hotro d -hind march -heritag er -hat pin -greenpeace uk -gre x -goo ge -giga watt -gerry dick -gay weho -gas conade -for ding -folklor ama -fitness girl -eurefre sults -err le -eric decker -emu eagles -ele giac -e use -e king -dore mus -dom biv -cu tis -crank bait -cranes bill -clou ds -clothing brand -cling man -california adventure -but chart -bur gu -bu scan -boul mer -boston logan -bdn wheatkings -bar um -b zz -ay ziggy -ath o -ash kan -ash ankar -art museums -ar lovski -ap gov -and aya -ajen ews -afro z -adam hillscomedy -ac grayling -abish mathew -ðŁķ µï¸ı -îĢ Ī: -åľ ¨ -اÙĦع اÙĦÙħ -za q -z anni -yum mies -you uuuuuuuu -writer sclub -whole someness -wg ms -wear red -wales comiccon -w cd -vit ar -vater drumsticks -van am -un winnable -uht red -ub co -tx u -thy pe -tawad ros -ta jh -swi de -sveng ali -stroke play -stre ator -stir k -sol die -slo f -sf sketchfest -sebastian kurz -s bootcamp -ro cred -rel le -rain i -qua shing -qu or -py xis -produc ers -prakash raj -pir and -patt il -pasqu ini -pari eur -p mik -outnum bered -one show -om h -oik ou -o tram -nam pak -my cu -mut ineers -mosqu eda -montre zl -mi thra -mi roh -meji as -med aka -manchester fire -main frames -mahoo sive -macn cheese -ma quettes -luc ke -lowes racing -london eye -lo lllll -laff ite -ki seop -k wid -jody watley -jo a -ja akko -ipl final -iphone sia -in memoriam -ihave adream -huiz ar -horse woman -hom eric -ho ef -hm ms -hel las -hart mut -har mandir -gu pt -gra flex -gon char -gh u -gadget show -flamin ia -faz lur -fa rell -ether ic -esh un -er rs -ecma script -dream chasers -dawg sup -dan el -cyto pathology -cx nats -cul verts -corner gas -columbi arecords -co ens -clé ment -chill ingham -cha is -bur la -budd leia -bree de -bou lud -borden town -bo ving -bit ored -billy gardell -bbcradiof oyle -bbcradi okent -bas ell -bal me -ax id -aren dal -ap ine -an tak -an ky -ak osu -air langga -ad au -' & -ðŁĺĤðŁĺĤðŁĺĤðŁĺĤ ðŁĺĤðŁĺĤ -ðŁĮŀ ðŁĮĬ -ìļ ± -é£ Ľ -è¢ « -âĢ ¡ -yaf fa -wyn ton -woo delijah -winchen don -whereyou at -whatson in -walk together -voten ow -vi seu -val las -un di -ulster bank -u dub -ty bee -truecol ors -track man -tosc ani -ti kes -ten penny -ten no -tem pests -sword sup -stra ph -st cw -sportb ild -spec ters -sophielady deparis -slipper y -shing ler -ser ved -sei gel -sal amand -sai etam -sa are -ruang bin -ru gani -ros elli -rock os -rishi kapoor -reic her -rd top -rachi eskar -rachieskar sten -power trip -pope bars -per rier -pas chim -ourtown ourteam -om igu -note card -ner vi -national chocolate -narrati vely -na ie -n kab -montan ari -me ha -man gel -ma hu -ma am -m ras -lord shiva -li ah -leg ado -learning together -lan cel -lagun as -la pe -la bra -krewel layasmine -kra ak -kh ruangbin -ker stin -ken ney -kellogg sus -kan ani -kai mana -k line -johno ates -jacc journals -j js -inn outburger -ie fun -hum are -honori fic -hog wood -history today -happy spring -hair pins -green fingers -geis mar -ge wand -fun ner -fresh radio -free education -freddi eroach -extro verts -euro pride -enation ale -elm wood -el ac -edy the -dumb arton -drop shipping -dragon pride -dorm ition -di el -desi gual -davis son -dash ti -dar yn -dal am -d wr -cu scus -ct fcofficial -cry wolf -corri endo -com yn -colla bro -co ge -co bram -co bos -clin ker -chees i -ch ci -cag ed -bulldog ge -bo ken -bluedot festival -bb alli -bar nt -baek sang -av anagh -annon ces -ancestry hour -alp ade -ak aw -air fest -aga ints -acce sori -acade mi -' ~ -ðŁĻı ðŁĴĸ -ðŁĺįðŁĺį ðŁijĮ -ðŁĴ° ðŁĴ¸ -ðŁĴªðŁı¼ # -ðŁĴªðŁı» # -ðŁijį ðŁĩºðŁĩ¸ -âĢĶâĢĶ - -ziggo dome -your struly -yoon kook -whom st -wheath ampstead -walnut creek -visit neworleans -vin ik -victor io -vas co -vallec as -ut aro -un das -ugly ducklings -u sparalympics -try sail -thereal redman -the cc -the catch -team elite -ta kato -swaraj ya -supportw restlers -suni dos -steve earle -sp ms -so gn -sksk sk -securethe border -s giving -ross moor -rosel ine -rock line -ri yan -recal gary -rec itations -read by -razorback bsb -rath drum -rak hee -qu im -pri ors -pri dgen -pre calc -prat ama -play field -perpetu al -perpetr ate -pembro lizumab -pari etal -parac el -oxford street -op ere -o sin -nyul angone -nut job -ntw ales -new gate -near sightedness -ne wapp -nal le -nahu atl -mor nig -mo gov -miy ata -mini ato -mc caleb -mass incarceration -man tu -mak ka -ma shie -lincoln motorco -left most -la hs -l fe -kru mping -kolly wud -kira kira -keys borough -ker zner -ke ad -kathy najimy -kappak app -jo st -islington bc -ingh i -ilove monet -ier ce -ic hal -i aquinta -hom os -hoho kam -hin kson -hawk shead -hahahahahahahaha hahahaha -gre mory -grazi ani -gi rod -ghanaf aofficial -galvan ising -fur se -foramini fera -food hall -fe ku -fe igns -excre tion -ex py -euro barometer -esc anada -epida urus -epic research -end ora -eh burun -e weather -du bu -disambigu ation -desen zano -de couple -d stl -craw for -courte ously -cor teo -cor bally -cooper ations -clare ss -cing ular -chir inos -childhoo dobesity -cann ady -by ler -bucadi beppo -bru tus -brand design -bl itt -big baby -bethe force -beh naz -beauty products -bbcsport scot -base balli -ban ki -b drms -ay bar -av lent -aus media -ar ghhh -ar dg -ap tnnews -anne applebaum -ak if -ait zaz -agul ati -admon ish -abelli o -ab ic -:) !! -ðŁĺĹ ðŁĺĹ -ãĤ¤ãĥ Ĭ -z illi -weg mann -wat seka -view bug -vien tos -victor wanyama -var daman -va sek -uy uki -uy ajola -urin ates -tun ned -tu lane -tranquili zers -to victory -tj dillashaw -timand sid -tho lidays -the piecehall -ted wheeler -tb s -tam o -tal anoa -supportthe swiss -sun web -su ff -statik selekt -staffies aturday -sri harikota -square up -snar ks -sm ate -sh eart -sax lokk -sat su -sas ana -santinof ontana -sa st -ru the -rr rawlings -ros sen -ron go -roel of -real denise -raz ole -provinci al -primer os -pot ties -pin ions -patron ized -pas ukan -p smith -ou ji -open signal -onepur suit -ol am -oh sc -ocean port -o pro -nouri el -nano pore -n bi -mr cc -mr ancelotti -moulin rouge -mon opol -mj biz -mic dro -mi mmi -mer anti -meg myers -matsu take -mak ge -learning disabilities -lanes boro -lamb ada -lam ers -lac to -la thers -la hn -ku lak -ke fka -jeanne ret -jazz nation -it cell -indic ting -i wai -ho dy -hec ke -ha uk -gwen n -grow ler -global trade -glaze brook -gend arme -gen nes -gen ee -ge xpo -fu er -from nov -for bach -fly guy -fivea anews -film director -feen stra -famil ys -etsu tough -eru th -eris kay -episo devi -ense i -emb run -dÅį terra -dor able -dj john -dha de -deu el -dal awang -da aaay -cul bert -cosmic gate -com ity -chi ana -chau bey -charl ene -cd cs -catt in -cat ts -canadas wonderland -busines spro -bur ts -brecken ridge -br aryn -borgh ini -bol lock -big room -bi king -bee flamb -beartooth band -be cht -baw dsey -barri ster -bar dic -babylon ians -ato dos -ati ger -artistre sidency -aristi des -arch ons -aquin nah -alesha official -ade kar -abar nes -ðŁĻ į -ðŁĹ Ĵ -ðŁij¶ ðŁij¶ -ðŁIJ¥ ðŁIJ¥ -ðĿĺ Ĥ -âĸ ĵ -ภľ -ภ© -yu ja -yl t -yan es -ya ha -wwee volution -widen er -white gate -wautu th -was sen -vy jay -voci ferous -vivienne westwood -villar rica -vili fying -ven nes -vast a -up allnight -univers iteit -un encrypted -tip the -thermo fisher -the ecnl -take meto -t bon -suc cor -stor mi -stan wix -spl ans -spar r -sna sh -sm caen -skipp ack -shireen mazari -shan ola -shanola hampton -sh pe -se gol -science innov -schu errle -sato shil -saietam hankar -sag arma -roy ndtv -rogerk ver -richar dayoade -refin ers -rec ency -rational ise -qay amat -q ps -prit char -prannoy royndtv -perri ello -paulow nia -patern alism -paro dy -ox man -no shoes -ni aid -national relaxationday -nail design -my work -mw amba -mou sc -morwen na -mit smr -mcga w -mas set -mar ai -maple leaf -man ea -m ity -liber ata -let there -le fe -land ini -la paglia -ku hlmann -king glass -king air -ke c -kal las -k schi -jol lie -jeho vahs -is so -is forever -is aca -iowa hawkeyes -info blaze -i zza -i bru -hot man -home fires -hau ter -happy jiminday -gric huk -gri eve -gold ar -go ian -ginacar ano -gad h -g police -francis ville -fer gie -evalu ative -ent ure -enamel pins -eleph ante -duc tal -du rov -dou bl -din om -diet ary -de vol -de is -construc t -comence m -ci hi -chit ter -chickas aw -chef slife -cel ty -cel anese -cau sative -camel toe -califor niag -buff o -brighton museums -black hearts -bian co -bac chae -baby shower -azu cena -at asco -as ai -arap aho -anni bale -anne music -ancho ress -an boy -alo x -al bam -ad alia -ab akery -. âĢ¢ -ðŁĺı ðŁĺĪ -ðŁĴª ðŁıĨ -ðŁİĵ # -ìħ ĺ -æĽ´ æĸ° -ãĤ £ -âłĢâłĢâłĢâłĢ âłĢâłĢâłĢ -âĿĮ âŃķï¸ı -áµ ķ -à° ¿ -اÙĦ ار -айд ан -za ke -yan ick -wu ld -woo oooooo -wis casset -westen ra -well house -warner music -visit singapore -vinyl mation -vic hai -vau tour -twitch ell -triath lons -topdrawer soccer -throm bus -the stormers -telerad yo -sta ston -sports marketing -spor tn -sli mmy -sk un -sk aro -siff ert -shi ong -she aths -schind ler -salvationarmy uk -sacred heart -sa ev -s fts -roll humps -rodri quez -research lab -regi er -rebellion racing -real jeffrey -ptc punjabi -prep xtra -portu gues -pic us -pha ya -perkins will -peng en -pe il -pavi thra -panto graph -overs atur -ontari os -ob olus -oasi s -o keefe -o date -nuc football -ni block -newzealand shooting -new pic -ne maha -nbapra yers -nb forum -natsci wk -nati vist -mut ter -multi strada -mor awi -mollu sks -micro organism -met zinger -meit ner -med anta -mayo l -mattb ourne -mar saxlokk -ma juli -m lo -m hq -lym phoe -lu fisto -ky lene -kom pakt -kirch berg -kim jiwon -kim jaejoong -kati el -kali m -kali kimaka -k sco -iyan la -ikar uga -hu u -hog ben -hay ami -gujar ati -graywolf press -gra ds -gor is -fron tal -for s -flow in -fir stuk -fiel dy -exper twitness -exhum ation -estro bel -ep silon -ee w -dotte rel -dock land -diss a -digi ov -del bonis -de math -de aky -dd able -dave hill -cosi danews -cos sette -cooking channel -coo pe -coconut grove -coale scence -claress ashields -civit an -ch asse -ch alco -candid at -bush heritage -bu kitt -btsport football -bor tz -blm national -best giftever -berlay mont -ber bera -ba ofeng -athanasi ou -art se -are iner -apenn ines -am undi -alysi areiner -alo tta -al preps -akh dar -akak atie -ahadra zamir -acram pton -ac custom -? ..." -... ðŁĺįðŁĺįðŁĺį -ðŁļ Ń -ðŁĩ¹ðŁĩ ´ -à´ ļ -Ä § -yut ani -wont forget -var ty -upri ghts -tu pa -trape zo -ton ites -tile work -thor sten -tere sina -tech live -sud ley -style dotcom -strate gi -stephen kamos -spar ke -snel grove -sharpe ville -semis onic -sbse urovision -sal sac -sa ho -s wnt -revenge ofthe -rat ory -rancher ia -q tr -piran esi -picture show -pi as -penetr ator -pattan aik -paloaltontw ks -oul try -os mani -ophy tes -ome gas -ole ds -ol inium -of texas -nfl honors -nc wts -nbak icks -n newi -mug la -monop rice -mon áe -mol fetta -mohawk austin -mo lest -mo apa -mir jana -middle school -micro graph -mecon opsis -mc menemy -mau romanzi -man gam -mal lah -mac graw -ly kos -low brow -lock n -li mas -leighton buzzard -lang lais -lale h -lac ity -kuch era -kid sto -kent in -kell yosbourne -kander steg -journe yof -johnny sauter -jenny slate -je wison -je ane -jaun pur -jame se -israeli apartheidweek -innovators mindset -infe ctive -infan cia -indigen es -in scri -iklan laku -i bike -hypo thermic -hyper loop -hy mers -har ge -guar ini -great lakes -good friday -gf wc -g pu -florid alife -fer nan -feel my -fat emi -export ation -expediti ously -evidence based -ess y -eg ge -ed oll -ec ml -dundalk stadium -down hole -do fc -deno ted -del tic -db q -d ki -couples therapy -cm da -cine bl -chth onic -chelt litfest -charity jobs -casio pea -by ington -buck nell -bu kavu -brink worth -bor do -bog of -bifur cated -bhagy ashree -bha sa -beech nut -bb clondon -battle creek -aux in -att itudinal -apu esta -angel adu -and counting -ðŁĺĪ # -ðŁĵ½ : -ðŁij¯ ðŁij¯ðŁij¯ -ìķĦ ëĿ¼ -ëįĶë ³´ìĿ´ì¦Ī -ç ¯ -âľħ , -âĺĢ ðŁĮ´ -à¤ı à¤ķ -za anse -z wer -yon tour -yo bs -yearofthe bird -year old -xx xo -women against -weapon ization -water berg -was me -vail mtn -un circumcised -ub ong -u equalsu -the movie -teh seen -taxcutsand jobsact -tar u -ta wheed -super kick -sub tler -star ves -staff picks -squ inty -spla ys -sof fic -sof america -sher mano -sher loc -sheffield sharks -shap ley -shahi da -sha hr -sh ve -ser ps -scifis unday -science isfun -sat ra -saint louis -ro kko -reyn or -re tai -pro jared -preven tive -prest wood -pre cooked -port us -pont cysyllte -pod fest -pet sitting -perturb ator -pepper mint -part agas -pal ay -ori e -oneof my -no pressure -naray anas -my soul -my hre -murdere ss -mund sson -moun ts -montour sville -messer smith -men with -medical tourism -med chem -me azza -marsh alled -man oran -man ase -les ss -le auge -lati han -lat ini -lass ical -kelving rove -kat barrell -kam ak -jor da -jesper sen -jason momoa -jal ep -ira c -ic able -i earn -han az -hacker rank -grow ingthe -grand aughter -giant stalk -gat ch -g aca -furio so -for al -flight plan -first dogon -fir dau -final score -er dal -emer ic -east carolina -duc at -du enas -dra gunov -dilett ante -di aa -dete sted -de ferment -david baldacci -cu kes -cu entos -coy gib -cos way -cof state -co let -chin apa -chimp sin -cat enary -cardu elis -buck walter -blue gills -blair stown -ben nevis -bday in -auggie pride -atwater village -as kra -army football -alis al -alebri jes -ala fia -ade adepitan -a itis -... ", -ðŁĺį ðŁĴĥ -ðŁIJ¢ ðŁIJ¢ -åº Ĺ -ãĥŁ ãĤ¢ -ãģĻ ãĤĭ -âĨ ĺ -ย à¸ĩ -ب ÙĦ -z andra -ye su -ye ho -winnipeg sd -win cities -wil m -wil dy -waz za -wal ters -victory venkatesh -vi el -vel ika -vej le -us the -tyrrhen ian -trze wik -tri xx -travis fimmel -transvest ites -tr ant -timefor wiltshire -thebachelorette finale -the vijaymallya -team rubicon -tax cuts -tab ou -stopthe pressure -spu tum -son ni -sj m -semi h -sat chell -sapphi relv -sa kon -s sum -ryan sheckler -rugby romania -rn cm -rebel des -pipp in -paul kingston -park let -paint in -on zalez -omni vore -official foxes -nive thathomas -next conf -newyork jets -mongol rally -monday nigh -mol teni -modi for -mill sand -member news -mechat ronic -mayak oba -marriageequ aility -man servant -ma rey -m str -ly udmila -lego starwars -land race -l kl -kirky ard -kir ani -kil ic -keiyn anlonsdale -kan awa -kalisto wwe -jonjo oneill -jon ne -johnny gill -jin hyuk -jd bc -james ville -jag d -ja ip -j clark -j any -iz elos -it rust -in british -ig ins -ib v -i pec -homolog ation -holi er -head ford -happybirthday suriya -h ki -gli wice -fro dd -fon dre -flag football -ey nsford -en casing -edy ta -earnest ness -dun ja -dro pou -dnrr ts -dit official -district champs -dinesh karthik -din ajpur -dere kk -dend rite -dehuman ized -craft scounciluk -counsel or -cou zens -conven to -con uk -commu tation -colon izer -co xy -ch ré -car star -can h -cam ac -black musicmonth -bhadra k -bein sportsusa -bean er -ballan trae -balag tas -bad alamenti -back ings -ay ork -as gar -all sorts -aldu bun -akin ola -ai ir -ach ap -abz love -absol ved -abol ition -a heart -(- _ -!! ??? -ðŁĺĥ ðŁĺĦ -ðŁĺº ðŁĺº -ðŁĩ¨ ðŁĩº -ðŁĨĺðŁĨĺ ðŁĨĺðŁĨĺ -âĹ¾ ï¸ı -à¸į า -à¤Ń à¤ķ -z sas -y igal -y ho -x sweat -won th -westlife music -we ahps -vikh roli -un certified -trish stratus -trishstratus com -tran slivesmatter -tor q -top cow -tho resby -sydney derby -sun bel -stol le -sti verne -stere otactic -stage hands -st ful -son ge -sl qld -show stopping -show room -shakun tala -sergi us -senator leahy -sed ski -seble febvre -se gues -sb meunier -satisfactor ily -salut ary -salmon arm -sacro iliac -rugby club -rif fi -rfr driven -red squirrel -rabin dranathtagore -pror sum -presiden cies -premi o -pe trick -pay master -oo hs -onehappy island -on radionow -on dra -old city -ni ma -nd ong -my le -multiple xing -morning ireland -monday madness -mo zi -me urs -martin scorsese -ly nieg -lou ella -little more -legac yof -le estrobel -lancashirec are -la skin -la sch -khe da -kang er -kal icious -ka be -j clayfield -ire alestate -ing season -ing ay -infinity ward -inciner ators -hv ff -hun wx -hol royd -ha gh -guine an -grand hotel -gr itty -gol fe -forhonor game -fomen ting -fla grantly -finn aly -fat so -far ley -ey d -ent ra -ec fr -earth changes -e gli -dvs bjp -dutch sassenach -dun ne -dod gy -dip day -dichotom ous -day ao -da ja -cul ter -crooz ef -crewe alex -content creation -con very -com sat -climatec entral -cin dere -choir boy -chen es -c grand -bri stly -brew erton -bragg ing -boosie official -bol on -bisp hen -barbour ville -au tent -at exas -armin ia -ari bbons -$ " -ðŁĺĬ ðŁijįðŁı» -ðŁĶµ ðŁĶµ -ðŁİ¥ ðŁİ¥ -âĿ¤ï¸ı ðŁĻĪ -ઠ¿ -Ùħ ØŃ -zip lock -zind ag -zen y -z hin -yo hanna -yan chep -xen u -ww h -wild horn -wil tz -whist ling -watch nerd -vj fan -ve eee -v alia -u vp -trans rightsarehumanrights -trac kies -tr ong -toyo tat -top bloke -tin dale -tic kers -theodo sius -thel word -t Äģ -t xi -t life -super furry -sum ner -stra thal -stan sberry -stag ey -soci alistic -simple minds -sim guru -shi pley -sch mo -sc ath -sal kinstitute -riyad h -ripp led -region alli -re gran -rab wah -quan trill -pu ya -pu tre -pp en -por tait -po yer -plang lobal -ox eye -out ly -nu mark -now ar -nord kapp -ni kh -never forget -ne spress -na ilogical -mu kul -mr sm -mo hale -mmor pgs -melli fera -mediaev alis -med hi -md phd -mascaren has -mallikar jun -ma sha -lor dand -listen ings -lets work -les doggg -lac of -kum is -klu gman -ke ch -kathleen lights -kar d -jyo tika -justy na -jimmy tatro -jere m -je eta -jamal khashoggi -jac y -ivani sevic -indistin ct -inci pient -ic kes -hush puppy -ht city -ho en -he kla -guer os -food history -flash tvwriters -fa uns -exten sibility -every can -euro tour -er da -ent ini -elitch gardens -ef endi -dublin ladiesg -dj c -dismoun ted -depu tized -d ze -curbyou renthusiasm -cook stoves -comeback home -co di -co chine -cierr aramirez -christma sat -chri sv -chap ul -castell icycling -bruce buffer -brownlee tri -bra der -boeh mer -bezer ra -believein science -bek end -band es -ban kin -ay ey -as crs -argu elles -ar ild -aniso tropic -ame i -altere go -afate hi -adri aan -ador as -. __. -+ +. -ðŁĺİ ! -ðŁıĭï¸ı âĢįâĻĤï¸ı -ðŁ§ ¨ -ப த -yo hn -yaf oods -woo de -with asmile -wild dog -wex for -wacky wednesday -vinogra dov -vici ousness -van pool -van il -vali dations -vachi er -urban ag -ur ate -up ward -unsun gheroes -tom oki -tit mouse -the full -th ah -taarab t -stopp ing -steve kornacki -sports bet -smar ta -six flag -shrey ast -shashi kapoor -sd pi -rose mond -rha egar -rei ver -ran ter -rac gp -r nt -quanti fied -py bus -pre dating -pras tha -pi rogue -pay porte -p stn -outra dio -out size -on ita -o ez -nt k -norr köping -ncp speaks -nasty y -napp ingday -nad z -nab f -mul enga -msc athy -mon tie -mo gensen -mn gov -mira bal -mg book -menshealth week -men gi -melane sian -lc willi -l ound -kap liskova -kak u -john force -joann ac -jam elle -isal oniofficial -illustration oftheday -il las -ik oma -id gi -hyun suk -hoo ker -home built -hein le -h ml -h itec -gun geon -grü ner -greater manchester -gojay sgo -girlscout cookies -gi elen -gda ÅĦsk -gateway msp -gand ini -for migration -flat worm -finalfantasy vii -fet tuc -ey yc -esp ence -erry day -ero yal -el t -dubu isson -dro ma -dre x -dont frack -dom on -do ree -diony sius -dic icco -daysof giveaways -cour ter -comuni dad -co ag -clow ne -clemen za -clack mannan -civil s -cate chist -cash less -carlos vives -call toaction -c jv -bu suk -bu soga -breaking dawn -brain awarenessweek -boeing lovers -birch mere -bic hir -benef ice -bed does -bc swx -awwwww www -au pe -ati shi -as prin -army cadetsuk -ar um -american us -ame me -amber rudd -air print -a hahahahahah -!!!!!!!!!!!!!!!! !!!!! -ðŁĺį ðŁĺĮ -ï¸ıâĥ£ âŀĸ -ãĢ ī -âı ¯ -ë ns -zha o -z hir -womensmarchon washington -we yl -wc x -walk outs -w ampus -vote selena -vainglory game -un blinking -u clou -twat ter -trelli ses -track way -tom ino -thewire magazine -theli brary -th ly -term ly -te vans -tam pers -summer of -stereo scopy -star in -spatio temporal -son u -so called -sl on -sigma beauty -shopp rs -shopprs drugmart -sevasto va -se eu -sally kohn -ror onoa -ri zz -ri xon -redband society -red cedar -re imagin -rathfr iland -raman ath -r vel -quo ter -qu ico -pur itan -pu ss -protec te -pro lac -prin cy -pr icked -pioneer sports -pi hl -pc m -paint balling -ow boy -oper cula -oli mpo -newfound land -net w -multi polar -ms me -mo hinder -metten berger -lympho id -logi stically -lock land -lek ker -ker io -jas curtissmith -jap heth -jam rud -issa char -in schools -ic ba -hil mi -hereto fore -happybirthday tomhiddleston -happy camper -hamilton police -grrr graphics -gp news -gore tober -getin the -gar anti -for sch -first nation -firel ord -fe o -exi le -everything is -escheric hia -emmit sburg -elec teds -egal itarianism -ed scifest -eag u -ds india -down burst -dj sam -dit ties -demo tt -d zn -countyo fla -cor rente -colom b -cla ssc -civic engagement -circuit spa -cer ita -cb spittsburgh -case ys -cad walla -buildthat wall -bu rian -bsnl corporate -bru dder -brian dozier -brahma stra -bor y -bo gos -blu eridge -bio log -benzo yl -be lek -bach pan -ask fc -ar haus -aq pk -animal s -andrew garfield -alex marquez -afl cat -ðŁķµï¸ı âĢįâĻĢï¸ı -ðŁijĩðŁijĩðŁijĩðŁijĩ ðŁijĩðŁijĩ -ðŁıĭ ï¸ı -ãĤ¿ ãĤª -ãģ· ãĤĮ -yu ha -yo in -y ooooooo -wish master -wis bb -win noch -wiffle ball -wh ch -was now -war sop -wak ening -w gy -ver gel -vasek pospisil -us gs -ty rer -ty lers -twilight zone -thre estoo -the dani -terri irwin -te ez -sr anieri -spla sher -sopra steria -skysports golf -si bil -shreyast alpade -shipp eo -shel lie -sg haze -serv ile -sens orium -sd ons -sark cess -sant al -sag rad -sa wang -rey mond -regent street -re clu -rayal aseema -r kd -quantumb reak -py pchat -pu lev -pryn ne -pran am -placebo world -pj vfl -pis ky -phoebe j -paul malignaggi -pau lap -par cheesi -oli an -oc ci -obse qui -o hel -nxi vm -noo b -ner ja -neil gaiman -naf to -my on -mutu alism -mur d -mil dert -micro brew -merz bow -mel don -mehe kf -mary lee -lun dell -lucer omexico -lo oooooooooooooooo -le val -le mann -kru dd -ke dua -kal itta -justinbieber updates -jo stens -jae won -jack ingram -iz anami -iv t -it our -iri sranieri -ing tons -incon el -illi m -ili kazi -icon gress -iam humayunsaeed -i ley -howit smade -hiphop culture -highfive day -he tzel -he mic -hat oum -ha aaaa -gun du -goog lead -g gie -furiou spete -food matters -fire break -ev ang -esk ridge -en rico -electoral college -ef nd -demon io -das ari -dan akil -daily bread -crosscu tters -cot ours -commen taires -cineplex movies -chu ke -chop house -chae un -cathy newman -can to -c illiers -byrne offic -but su -bush ranger -build april -blockchain news -blephar itis -belle ville -band aran -bal ram -autumne quinox -at ate -arrivab ene -anfer nee -and ance -an aw -amnesty online -aldi shodge -ald n -alberta party -aha w -ac na -abhi jeet -aashi q -. ðŁĴ« -ðŁĹ ij -ðŁķ IJ -ðĿĺ ª -ï¸ıâĥ£ % -ç ¢ -åħ « -âĿ¤ï¸ı âľĮï¸ı -É ´ -ysby ty -wolf of -wire taps -win nen -weigh ton -vis wanath -vare se -var sh -v mo -u paz -ton t -toga dia -titmouse inc -tir pitz -the goo -the en -ter psic -tax returns -tal mage -tal espin -syl vio -sword and -sty mest -street games -stateli braryn -statelibraryn sw -star lit -stan collymore -spaz zing -sk ender -schlu ss -ricky martin -ri bon -rep ta -relat edness -ream ers -re pointing -re grouped -rd brwanda -privi le -primiti ves -politic shour -plato oning -philharmon iker -pe cz -outra ging -outnumbered fnc -ound stone -ome coming -nh ss -ne ills -natu real -mustang monday -mus kets -mul ally -min ty -meth il -me pauloavelino -margol yes -mar sal -mar lean -manage ability -man joo -mal volio -louise hay -lo cky -ln dont -like sfor -lein art -laurent fabius -lau rak -lang staff -lake head -l fb -kö ni -kut u -kimjong kook -kim chee -kaz oku -jyrki katainen -just wann -indiebook sblast -hyper glycemia -hun ath -hub ner -hu en -hel wan -h pl -gru dging -goth ams -gir orosa -gf dl -geoc ello -fuen labrada -fluor inated -fal chion -fad ell -ev am -el or -ed urne -ecm records -dos barth -die sem -demon ess -de michelis -dale jarrett -cu sa -cre atec -coach t -cher an -centri petal -centre for -cc cu -cañ ada -carpetb agger -cap elin -camel ford -californi achrome -buz by -bru cel -brit onedirection -blow y -bett pride -beth hart -basso onist -bahau ddin -baaaaa ack -atleti smo -assemblye lections -asha ikh -as usual -ari ola -arac al -and harry -and alou -amo dels -affl icting -ad ric -ad ow -................ ....... -.. ðŁĺ³ -" âĿ¤ï¸ı -ðĿŁ ı -îIJ į -ìĭľìļ° ë¯¼ -âĻ¥ï¸ıâĻ¥ï¸ı âĻ¥ï¸ıâĻ¥ï¸ı -âķ Ŀ -๠Ħ -ÛĮ Ûģ -zom b -yas elf -wonder ous -we oy -viva x -victori afalls -v do -under world -ultra suede -trafford centre -thecameron boyce -the killing -the captain -tech awards -tabby cat -sw gn -stron omy -stre s -sto be -steer age -statedept spox -spo em -speci aled -son oma -social saturday -sli fer -show t -scar th -saf adi -roxeter aribbons -roman us -rock paper -rock mart -redbulle sports -red fox -ram ar -rade macher -pyri dine -pslon espn -ps ja -pra der -porttal bot -play like -pern illa -pat miletich -passe ig -park haejin -pag ode -pack mensbball -pac ini -osc e -oh sehun -od ka -octo bers -oc sd -no vos -new amsterdam -na she -n he -mz ilikazi -my future -mun ny -mu as -mrmark millar -miccosu kee -matur ities -malay alee -make ssense -mai sie -mah nke -magdal eno -madon nina -mac ul -local love -list ing -life lesson -li ot -letter boxing -lat ri -lamar z -kha rel -kapp adel -ka ard -k camp -johnny orlando -jo geshwari -it secure -is yettocome -ir vana -igh ted -ic r -hoo kahs -hell zarmy -happybirthday ssmb -go bison -gille smarini -gill mor -gau dette -future proof -fondaz ion -e tech -dtop beautyworld -diam anté -di zen -dar cie -crown royal -con ro -col er -coffee houses -cho dy -chi ao -cer y -cash master -boys lax -black rod -black holes -black dog -big ass -big as -beau pre -aw p -aw oo -au cd -asi ant -as cj -as app -artbasel miami -amo ss -aly ona -ach ro -aa shi -!! ðŁĶ¥ -ðŁĺį âĿ¤ï¸ıâĿ¤ï¸ı -ðŁĺ± âĿ¤ï¸ı -ðŁĶĿðŁĶĿ ðŁĶĿ -ðŁ§ ª -ê´ ij -ãĥ¼ãĥ ŀ -ãģ¡ ãĤĥ -स म -é on -zu ehl -zent angle -yu sh -yoko ham -yn books -yamaham otogp -x sd -wu yi -white oak -vs v -vend redi -vashish tha -ty oung -twit r -ti ssa -thelast airbender -the sz -the post -the fanatic -the batman -the barn -that ches -ter ah -tech tip -tam ente -take two -synucle in -sy strom -summer learning -sug u -still births -state visit -spir ing -sou ley -sol at -sir ken -sham arie -sd urham -sale ha -sab ena -rosenber gradio -roll chos -rock ymtn -rev richardcoles -re formatting -ra abe -pyaar ke -pu dhu -property investment -pron k -prem peh -poly morphic -plains boro -pi fy -paridhi official -owen sville -our blues -ortho tic -orange county -one hit -oncein alifetime -official fpl -och il -noordinary park -need more -na jm -n wi -my voice -mul loy -monopoli stic -minne dosa -mesqu ita -men za -me sures -marketing derby -mark bam -mari aton -magni ficient -madagas can -ma bille -ly tic -liquid metal -line game -l xi -koo b -kap an -k wo -k kinen -juice bar -jim town -jason taylor -jaku bowski -interro gator -insomni acs -in orbit -in cube -ilu lissat -il ala -hu p -hotel chocolat -high castle -hi ggle -harhar mahadev -har tt -hal cones -hain pyaarke -h eneral -guineap ig -greg cipes -gra hi -gordon sville -ghost light -george s -gari bay -gander bal -flex time -fish scale -fight newsasia -ferru ginous -et trick -ei ge -eber hart -e ile -dzhok har -du mars -direction ers -dinner with -delor aine -delac our -de merits -dari usz -dan anda -cor iginal -com port -cityof stjohns -chu eca -ch ya -bul ling -buddy holly -bru gman -bri enz -bri ans -break sthe -brazil vs -bon field -bod mer -black ham -beer news -bath lifemag -barber shop -ban y -as chaf -ane gada -and yl -always keepfighting -afghanist anyouneversee -acqu i -aco ach -ac red -abb ington -^ ; -ðŁĻĪ ðŁĺĺ -ðŁĺī " -ðŁĺĪ âĿ¤ï¸ı -ðŁĮĪ âĿ¤ï¸ı -ì͍ ìĬ¤íĥĢ -åħ ĥ -âĿķ âĿķ -z ica -wiz ened -win co -white boy -whi les -video today -ves z -var um -unite foreurope -unic um -typhoon team -twcnews roc -tren holm -toiletek prem -tart aglia -ta ints -sun daze -stor ian -steff london -ste ez -so hr -sher gold -shepp ard -sean j -sealteam cbs -sd mc -scott derrickson -schwar ze -sant olan -saad hariri -s aper -rep ú -rein car -recou ped -re mon -raf typhoonteam -prokhor ov -probation ers -predic tion -pla sterers -pic public -pel sall -pe dium -park hyungsik -pac ke -p ten -or theast -op sal -op art -old fashioned -oh snap -of oundation -nu k -nsc n -noc news -nl w -nikki benz -nik phillips -ni gri -ne ek -nar singh -n ulty -mö bius -mur komen -muj taba -mt bs -mobili er -mo tti -min aur -mil grom -mei jer -meet me -me len -matt kindt -marchin march -madhu kishwar -lo fa -liv tyler -lilli putian -ligh thi -li bo -lfc tour -leone tti -lend ingclub -l te -ky k -kristy n -kar asu -k love -itsecure gamer -inv itee -inter face -in churches -im hyunsik -hyo sung -hillsong united -hiberni anfc -hann um -h wd -grime ys -green leaf -gom anga -gof theweek -ger v -ger ring -geof fre -fun hau -fra ss -fox holes -food academy -flu dd -ferr one -fau stian -fal zone -fairfiel dhalls -es net -enqu iring -ear flap -dud don -du pain -dou h -don quixote -de dan -dam in -dak shina -cro co -craw lies -cli m -che pe -ch ona -ce bo -cary atids -cartoon saloon -capta insp -cape zio -c tica -buil ten -blavat nik -bigsky mbb -bb najia -aw st -ato vic -arch icad -aniche be -alz ado -ali mi -ale agu -aco aches -, £ -ðŁĵ § -ðŁĴ° # -ðŁį» @ -ðŁĮį ðŁĮİ -ðŁĩ¿ðŁĩ ¼ -ðŁĩºðŁĩ¸ ðŁĩ¬ðŁĩ§ -ãĤ¦ãĤ © -âĺķ âĺķâĺķ -âĸ¬ âĸ¬ -window pub -will an -wester lund -wemb ury -wei z -un wired -u ih -trump world -tradition alism -tomor ro -ter apia -tan nic -swa the -stri ppy -st kitchen -st ator -spi aggia -so ay -sing appen -shermano aks -sha ima -selek tah -schir ra -sali ence -ro castle -rick steves -rhy n -regenerative medicine -rahu lr -ra zy -positivecoach us -pos is -pir aten -pi enza -phoebej tonkin -pey roux -penny mordaunt -penguin book -over comer -ott mar -orange shirtday -or dos -open to -open society -ofsted news -nomin ator -nialla ppreciationday -new ent -nab or -n ão -my banff -musk er -music box -mun dt -mtn training -mol in -miz pah -mind control -mer sch -mean green -marlon brando -market day -man ica -löf ven -lusit ano -loyal sock -l bhf -ku f -kri hanoff -kindergar tens -kgal ema -ker f -keg worth -kal ba -jonm chu -je ggings -itu mbi -i isd -hur ries -ho del -hashi motos -happy mondays -greenflash beer -gjallar horn -fun t -fu ssing -freu denberg -evening chron -evan escent -en stadion -en li -en eng -emer y -eddi ggs -eber ron -dys regulation -dumfries shire -drive srt -down pipes -dom ode -do vi -dick ory -deal in -dave eddiggs -cyfarth fa -cryp ts -cro ix -cro cody -conju gates -cma openaccess -clo va -ciarab ravo -choic est -cho es -chel on -celesti als -car acci -cape hart -buy itnow -bur nishing -bugs bunny -broad band -bra ue -bon usu -blasphe mer -bestin travel -baz oo -azu mah -at bristol -asitis official -asi asoci -apost ates -annual meeting -and ito -amar an -alys sum -alltogether now -allinwith chris -akh gar -aj opinion -ais yah -ade ma -abi bi -ab dy -[... ]" -.. ðŁĺĺ -ðŁļ£ âĢįâĻĢï¸ı -ðŁĻĪ ðŁĻĬ -ðŁĶ¥ ðŁĺĤ -ìķ ł -à± ģ -° - -zea xanthin -your quote -yak umo -wy rick -weare bangalore -we mo -war lal -wak rah -vien nois -veri fications -uw gb -tusc on -tt ank -troy trojan -tos link -til is -the struts -the square -tax ila -tahaj jud -syring a -syd al -stra sberg -stor ino -sreed har -sport news -south la -software developer -sk off -si ona -shangha inese -shack ney -scou gar -rv sed -rockstar spud -rm sothebys -ri pl -proprie torship -pro ss -photograph ically -phenter mine -phase out -pe gging -paul deveno -part ys -p wa -out put -out ines -or que -ok one -nyakun dih -nu suk -nove m -new profi -net weaver -ne ot -nb sat -napalm records -musical uk -moven pick -moss op -mo so -mi eri -mets rewind -meta search -merry man -meh tab -mar clay -maiden head -litur gies -letsgo flyers -lechu ga -lari more -lanter ne -land trust -laber into -klein hans -kidap awan -kat chi -kam boj -kal isz -k é -ju bba -jorgeramos news -j sw -iron bark -ine wa -in oran -ideac ellular -hey ne -hex adecimal -hemo dynamic -he ssen -haydn jones -hand bills -gru ene -grow the -gretsch usa -gooo al -good toknow -go sho -go sei -go il -freeall arrested -for bury -fin cen -file maker -fear rts -evolu tionists -es ben -engle bert -eli ak -dur can -dit er -dante wada -dan rather -daler mehndi -d jane -cy world -comp ell -clo ves -cic lista -chol angio -charlotter usse -car bor -cap oue -buzz r -bur goo -bra sse -bol dini -boh dan -billion aire -bha sker -bemel mans -beach vb -barbar acrampton -bar ik -aval kyrie -au brac -as cal -appare l -ak ick -aa o -\ âĺº/ -) ðŁĺĤ -ìĻ ķ -âĮ ¨ï¸ı -Õ¡ Õ -zen n -yo te -y allop -wo tt -weird beard -w pc -vogel sang -vand or -ultra sa -trump colluded -triple m -timid ity -tian men -three word -thebold type -th ops -th oooo -tess gerritsen -tejas wi -taylor kitsch -tar k -swi ffer -su hsd -started fromthe -sr f -sou dha -soon ish -son theroad -soder strom -sig ar -sennheis erusa -sch ley -sant ner -sa way -s johnson -ru lon -resi sti -raj kapoor -rad key -plow right -pic keted -pha d -per cept -per alejo -pema quid -patrio tic -paras ympathetic -pak tika -org is -orange amps -ol au -o jt -nice day -nat cap -nandamuri balakrishna -n indies -mor ghulis -monk seaton -mazel tov -mat ura -mariaton tini -man si -man kins -mali shka -male fic -mal tag -mak ran -mae gan -ma resca -love theatre -lord swood -loch gil -lily hammer -licht man -li kers -li bia -li bi -ley bridge -la vag -l ams -kon itz -kn aggs -kar lis -kam at -kal uga -kair at -ka on -jo brani -jim irsay -ja the -i sim -hywel dda -horn buckle -hi za -hekmat yar -gu energy -gratuit ously -go rebels -give way -ghay al -fishing trip -fis chetti -far da -fabi en -eus kal -es com -eco sia -du ar -denomin ators -del bene -de hesa -coup de -cor gi -constra ins -co kie -chiri qui -chesney hawkes -change your -central bank -cb university -case mates -carra untoo -ca podi -boy stown -bloo dier -ble an -bio remediation -ber til -bar tali -bar ryo -bal ko -b marshall -aw inner -aus geo -ath es -ash ami -as ako -aquaf aba -alle mands -ak havan -agno sticism -afl q -afl power -ab sar -ab ong -ðŁĺĥ ðŁĺį -ê¹Ģ ì¢ħ -Ú© ÙĪ -اÛĮ راÙĨ -ä ger -z wari -z q -young king -yo joe -y fg -wpl g -wmtw tv -weare south -vm wa -viscer ally -val ore -uni part -the storyof -the crystal -ta fen -t jr -sure tte -suffolk wildlife -su thers -su mut -squ anders -springh ead -so rey -sin fully -simm s -seme a -se phor -sarang ha -sal sha -saga ins -red turn -ram us -radi onica -pre me -polon aise -po els -playstati oneu -pi hu -phan art -palu stris -pal misano -pab udget -outdoor play -out music -ont liberal -old friends -ok amura -ode tte -nu star -news readers -neural network -n lighten -n bbj -my artwork -mscathy gonzaga -movie s -moen ch -mit tee -mi halik -menis cal -mag ine -mach loop -lon garm -live veryplay -lit era -lingu ica -lavat ories -lau ber -lat ona -lang ata -lake huron -knu d -kla ssic -kin nikuman -kad dish -jo dee -jap antour -jan ssen -is cc -interior inspo -inst al -indian ambb -in mortales -i vens -humor less -head cover -harvar dg -happy birth -hani f -haha i -gur gaon -gun smithing -great white -gra ben -good read -gim let -gg ae -germanshorthai redpointer -geor geous -g jer -g adam -flun ky -fi p -fat en -execu tors -ethno logy -est alk -el abour -ef arms -e je -dood lin -dof fro -do ted -deutsch en -determin ate -de itz -cre pe -corn u -coo tam -continu ities -columbia journ -classic films -claire holt -cl ario -châ tel -chief srugby -chal ker -ch the -center parc -caroliner hea -capric ho -can cun -can aday -cam pp -ber land -ber dan -ban chan -bab uji -ba aa -austin healey -armani exchange -ar jen -anemon efish -andre ana -andreana vedo -alu x -absten tions -aac tas -\\ \ -! ðŁĺ¡ -ðŁĺİ ðŁĮ´ -ðŁĺģ ! -ðŁĹ ¯ -ðŁĴª ðŁıĢ -âĿĹï¸ı @ -âľĮðŁı¼ # -yn hs -y gl -wise shopper -whatmakesme happy -way bill -vo key -vo isins -vampi rism -uw f -unce asingly -un mentioned -un impeded -ugly sweater -uc chi -u winnipeg -tran sur -tom ok -the odds -tex tes -tac tfully -syd fest -stopbrexit save -stin co -steven mnuchin -sor tium -solom ita -so tn -silvers miths -silke borg -schotten stein -san zo -sam winchester -rust led -ru xton -ru tt -roy ston -rival schallenge -rish fa -rise again -rig ours -ri or -repre zent -refe reed -r antanen -pwn age -pure michigan -pro mark -prithvi theatre -pride aux -pre spa -pre edy -polyphen ol -pieceof me -personi fying -palit choke -pa kor -over flying -oo ow -nifty warehouse -ne aq -nay py -nak usp -n ør -muumu u -mukun da -mor ng -month long -michael smith -metho dists -mem ri -mcallen isd -markj weather -mahindr aracing -ma wer -ma bus -lc clondon -ku leuven -klo of -kir ill -kant ner -kalin owski -k ichi -juven al -joe manchin -jesus freak -jenn colella -jem al -iwant clips -inflam mable -in ic -if nt -ida ireland -hudson sbay -hert smere -heati son -hayden byerly -han nover -h di -gre tton -giff ard -ghis lain -ge sser -gan ton -funhau steam -fun t -fuch sias -four five -fonten elle -fiber art -fc basel -family values -et pt -eri ff -earl xsweat -e map -dy er -do jos -die ffen -de files -david c -da ji -cou shatta -chi sholm -che sh -channel uk -cc dc -cash time -car fest -calder on -cald beck -c india -bway con -bre ssler -bi bis -berg quist -beal ach -bay shore -bartol om -badtam eez -az abu -ati sh -appeti sing -anti balas -andre ja -anand amayi -almaz an -alit abattle -ali sher -alexand ro -akame gak -ai ves -acon roy -ach ef -absur dism -abhishek bachchan -... ðŁijį -! ...... -ðŁĴĺ ðŁĺį -ðŁĴĥðŁı½ ðŁĴĥðŁı½ -ðŁij ¢ -ðŁıĢ ðŁĴª -îĦĨ îĦĨ -ë¶ Ī -ê° ľ -Í Ī -wind ber -what abou -wen jun -we o -ver bas -valle lunga -ush kowitz -urin ary -uni directional -twin brook -twic elight -tom udall -to doro -threestoo ges -ther im -the je -the cam -the broad -the bol -th nk -th band -teng en -tam bora -tai yo -t ft -summer festival -su santo -stark weather -sor bara -skin ks -sil denafil -shuben acadie -se mm -se j -san ilac -sam ant -salesforce ohana -sain tramrahim -said hanshika -sadhguru quotes -s mic -s key -roev wade -rif fe -re constructs -pura skar -profun do -pres nell -pra vasi -pol kas -po gs -pink hair -pepit one -pa de -p ú -orca dian -oni rose -oman is -o hed -nu age -not vivoree -no ty -nico tin -newsc lt -nct zen -nascar salutes -mrs gif -mrsgif letcher -movie actor -mour vedre -mo gha -micron ized -mi asto -me myself -max illa -matsu shima -mato sin -mandy rose -mak ens -mag ala -madele ines -ma vens -ma snow -loch end -living my -lease back -land sman -kyr sten -krish nagiri -kei ko -kap ur -kangaroo island -kade tt -ka stur -k dei -just my -jonas son -jimmer fredette -jerry can -intro biz -inf n -i era -i dium -hy del -hul stone -history matters -han dovers -hampton roads -greif swald -gold ner -gim bel -gau ci -ga res -form labs -forde ast -fil ma -fedor as -fau stine -fanta sizes -fa oi -f dn -f bn -etou ffee -entre at -en ature -elis sa -el ddis -ecol ts -demonstra ble -de regulate -de my -de and -daz dillinger -dallas comiccon -dach stein -d nam -custom shop -cuis ine -cox sac -corof in -containeri zation -com modus -ci gi -celebs godating -carrieann inaba -cap stan -campo bello -cal ama -caf fenero -bus sum -brown ells -brooklands museu -bha sma -benji bananas -bedro ck -be jewelled -be awesome -avi spa -av go -atla irport -armen trout -anikan onirose -andr é -and ur -and ale -amc kee -ab radley -a jac -ðŁĺŃ ðŁĺĤðŁĺŃðŁĺĤ -ðŁIJŁ ðŁIJŁ -ðŁĮ¸ ðŁįĥ -âĿ¤ ðŁĮ¹ -⾨ ðŁĴĹ -âļ¾ï¸ı : -иРµ -z ue -you ro -wolf song -win ecountry -wi eden -whispering bob -wal las -vinyl meplease -umi zoomi -twit te -tv at -tul fo -tribun a -tom sula -to travel -ti zzle -thisisirish food -thi amine -syd nee -supp leness -su has -sonic maxpro -somnam bu -snow line -sme x -small caps -sky high -silk road -shiv aj -shibu tani -sem la -seaw alls -seatt let -sea otter -schi ffman -s ftp -rosal ba -revent on -rec sys -re facing -r ni -plo eg -pe skov -ou trank -ott en -ong niel -one man -o sten -new mutants -ne onics -monk land -men sclothing -melane sia -medi mmune -mcga han -mary kill -mark uk -mar win -major can -magal haes -madam ex -machine tools -ma bius -lle gamos -land art -lady beard -kur up -kun gla -kend zior -k khh -je ev -it startshere -in music -in ish -igers france -hyp mic -house hotel -home chef -here fords -he hee -hay am -has bara -happ i -gu ffey -gitex techweek -git ane -ger gely -geo storm -gate keeping -gat ting -gal oob -fu ly -from heaven -for deco -feni ans -fantas ylg -fair pay -euro satory -emmas later -down able -dow en -di za -df j -der aa -de mu -dan er -daaa amn -cross on -con gs -civic a -circum navigating -champur rado -cham ling -cham ar -celebr itye -carrerac up -bun nie -bli ssed -bant z -bally mena -baby cakes -are e -antro bus -anal o -amph lett -al bro -ai ki -ah sd -. ðŁ¤£ -( ^^ -! | -ðŁĸĸ ðŁı» -ï· » -ì² ¸ -âĺºï¸ı ðŁĺĬ -à´ £ -Í Ī - ¶ -zind abaad -yur man -ys ay -wool folk -wine shop -wigan warriors -we u -wau ke -vi ole -vam o -un no -tylero akley -tu mi -tree less -tor ra -timo f -ti zi -themy scira -theben forster -the south -the hollow -tel ma -te vita -tar quini -ta kaya -t sou -sub genre -stell aracal -ss occer -sno win -simon says -show you -sep tima -sch moke -save bsoazad -sau de -saddle up -s dogs -run ciman -row en -row botham -rm hs -ri stor -reco do -re portable -re groups -re eagency -ra shaad -quick quotes -pyroman cer -puj ari -pu go -prosely tizing -pirand ello -pick pocketing -pha sic -ph ryne -peugeot sport -petro u -peter thiel -perform in -pe trac -pani agua -pac ke -pa hari -p ge -ou risme -od l -noval iches -newcastle hosps -new country -neil d -navy blues -natural medicine -mor atti -moon bin -mihon ishida -mic hon -mesh el -mck endrick -mar stellaracal -man ak -mach aca -lin thorpe -lei dos -laur diy -lamon gan -l wt -ku sa -kol hs -kis ch -ki ano -keith richards -kan sans -k upa -k club -jon kortajarena -jo ico -j bt -insta quote -ineffec tiveness -ignomin ious -ici ousness -hy yh -hoo yah -hippoly ta -health month -hal las -hagi asophia -h wi -gob blers -gn clive -gnclive well -girl sss -gan z -gad olinium -g ör -fy ffest -friday freebie -free kesha -first look -fin acle -far maid -fall river -fala hee -em mets -e kin -don julio -cran berry -coal mining -cliff avril -clas ica -church land -chugh tai -christ offerson -chinese art -chi veon -car acol -cap tian -campe sina -ca kra -bre z -black lives -bit wise -beh nam -bed ale -barry allen -bar ral -balne ario -bal krishna -badrinath ki -back road -auto dro -attle foracause -as sail -arte mi -apartment sfor -ap ba -anand skfc -aldubb attleforacause -agu ard -ad ino -ach eron -abram ov -ab ente -ðŁĺĤðŁĺĤðŁĺĤ ðŁijĮ -ðŁĵ· © -ðŁĮŀ . -ðŁĮ¼ðŁĮ¼ ðŁĮ¼ -ìĿ´ì¢ħ ìĦĿ -ã̽ï¸ı ðŁıĢ -zy gon -zelmer low -zak arian -zabludo wicz -y th -woo snam -won derer -w trf -w sa -vocali ze -v sop -usc s -uni kl -un tried -uclou vain -tu gger -tre gs -transcathe ter -tom rw -tom men -time slots -thursday treat -tho dari -then aked -the record -the hive -teentit an -te brau -tailor made -sur ti -sun art -step children -standupp addle -stan bridge -sr lfc -sportat orium -sense mble -sec ta -seabourn cruise -salomon running -safe space -s foods -ru ine -redwood city -re settling -re fa -ran ong -ralli art -q outes -pocon o -piero gies -pi ppy -perfect fit -pand as -p forz -ox igen -or co -ofic ina -north africa -no dame -nikk ic -nicol led -monch hichi -mon daw -mo vers -minim inter -min aya -milos z -medic aid -matosin hos -mark jin -mariash river -main aand -lyon dell -luc ci -lemb ah -lace work -la king -kschi thra -konop ka -ko tta -ko ek -ki bra -kay le -kann adiga -int nl -infr inges -in on -im ready -heavy duty -head lee -hcp sarea -gur s -gor dano -go squirrels -go getit -gilligan sisland -gil breath -fri ant -fr ath -fa thead -es rd -el j -ed elson -ec lass -dv antage -down towno -domic iliary -do ber -di enes -devo y -debbie allen -dang ly -curious er -crystal ball -cre de -coor ong -cokestudio africa -click ers -church warden -char twell -chamele on -car ica -cad aques -brown bag -brock worth -bo ere -blackpanther party -bla ker -bin der -big ride -big give -bha vi -becau ser -ballagha derreen -bah ra -bag y -ay aku -atter see -athar vaa -angel sinamerica -anc afe -an sara -amsterdam se -am elle -almod ó -ali ot -ad amp -ac tioned -ac ron -ac el -a ana -+ ). -ðŁ§ ŀ -íĶĮë Ŀ¼ -⼠± -ÅĤ a -yung blud -yo gend -wick y -weir racing -wedem boyz -wah ba -w ame -vishak ha -veen endaal -vee bha -ur schel -theros ary -ther ink -theo walcott -terrac ina -ten yc -tempor ality -tele path -teacup club -te ems -tc bc -tafel musik -sydneyo perahouse -strathal byn -stee les -splen di -span ic -sp olympic -sou treach -so tr -skylar king -shar ica -shand ur -sfu sd -se cho -saving places -sarah shahi -sansevi eria -sab aq -s deb -rosen bloom -ro jas -respe k -redbull za -re tra -re housed -ra ham -r do -pepe jeans -out growth -on fd -on aga -nurder hsv -ni ç -nhs digital -my ron -my ne -my lfc -mw ca -mu rawski -mthe mbu -mon stress -mil ledge -mcca in -maxi priest -matan uska -masay uki -mal hi -ma kabayan -ly rica -lol wut -local art -lef in -lead on -le cu -la it -kyiv post -kup i -ki anna -kcr gwx -joke day -jo ser -jeong in -jam bs -jalpa iguri -j hay -is ud -ingof the -igre ja -ic ure -i ones -hunni ford -hi mura -gui yang -guar do -guan aco -grat on -grameen phone -gossi py -googleexper tuk -gla zers -ge ers -fun s -friende ver -fri so -frees ample -free pick -fleadh cheoil -fit nes -familiesc lose -evi dential -eu h -es ung -episcop alians -em mott -ef conline -ear wigs -dougla ston -directs elling -dem swork -del onte -deadly class -de jeuner -de caro -dc shoes -darke sthour -da aaa -cra u -continuou simprovement -confuci anism -comb ate -co fi -cleo bury -cilli zza -chiz uki -chicken hour -cay abyab -cancer treatment -c src -c ml -by ung -buzz cut -bro war -bro l -bre cher -black by -billy tolley -bee zer -bam l -bam a -bake club -backedby aib -az hs -aro b -ap ass -anthonye tuggle -another magazine -an art -allegre tto -aftershock comix -ach hedin -aber tay -! ðŁĴĺ -ðŁĻĤ ðŁĻĥ -ðŁIJ± ðŁIJ±ðŁIJ± -ðŁİŁï¸ı ðŁİŁï¸ı -âĿ¤ ðŁĩºðŁĩ¸ -е м -z anda -youthem powerment -yl unch -yam assey -women with -winkel mann -wh ay -weis ner -water polo -war master -vis cabarca -vir ta -ven ia -utter back -un fussy -uk orchids -tour neur -time shift -ter kel -tay son -tamar ins -ta ipa -superbowl lii -steph i -spol sky -sor okin -soldie red -sk og -shi ken -se hs -schulich school -say ing -sagarma tha -ry leigh -rocred wings -rock n -remor seless -reed bed -re deployed -pro tips -playstation vr -pel key -parapar au -palit oy -pa heli -oz amiz -ox alate -official willow -official triumph -oc tors -non commercial -ne do -nai z -mrtommy land -model kit -men z -me costa -may ash -mato logists -maroo chy -ma hera -lucky manzano -ltgov delhi -lou rie -lin derman -leuci stic -leez agibbons -leeh sien -le ino -law making -law are -l zr -kri ge -kollywud cinema -kirkle esc -khar is -karai kudi -kapp el -jud moo -jb mauney -jay walker -j ini -itsar ush -inter vista -ine f -i six -how ler -guardian witness -guaj ardo -glow up -gis bergen -gigli otti -gertru dis -gaming pc -fran ti -fluctu ates -fishn tips -ff wd -fab aceae -fa illa -emmaslater dance -el ac -du dleys -du bbs -dremil yamassey -dog boe -de use -de oband -de kton -daniel padilla -dak shin -da hisar -d fc -corbin bleu -city bus -choisi won -ch fi -cel entano -bse india -brockle hurst -bro dus -brit actor -britactor sfan -born free -blogger life -black burne -bird land -bell labs -be fell -bb cr -bal laugh -au nee -astar oth -arag ami -app ens -an american -alzheimer sday -almodó var -al port -air ings -adeni z -acol lusion -ach ary -________ __ -ðŁĺ© ðŁĴĶ -ðŁĶµâļªï¸ı ðŁĶµâļªï¸ı -ðŁĶ¥ " -ðĿij Ĵ -ìµľ ìĬ¹ -è¡ ĵ -å®® èĦĩ -âľĮðŁı» # -اÙĨ ÙĬ -yogur tland -yarmol enko -yankeec andle -y sabel -wri ddhi -wire image -wessel mann -war daz -vis vim -uttamav illain -uchicagop ress -ubc tbirds -ty ms -tu larosa -tre bor -toyo tasa -tou reiffel -tor mey -toff oli -timber lands -tiger football -thisi sse -thero se -thelaw society -the ba -ter zi -tananlam az -sub o -stage it -spokane indians -socal gas -sj games -si vi -si dd -seta pak -savi ation -sav arin -roar ke -ro saleen -rel an -re gnier -raiz awilson -r dh -py ré -plate a -pavan wadeyar -pas sa -par ki -papad akis -panneer selvam -pand anus -orange ade -o stara -o hau -nostal gically -nicolled wallace -nde geocello -nam po -my president -mont ages -mis sa -mel bre -medline plus -mcken nitt -mat en -mariek ondo -mar oni -mar ma -ma kan -livepd fantasylg -ladies fc -l yoko -ku kush -kor angi -kom ple -ko g -kkun drra -kensington wm -ken oother -kapil mishra -k anner -jabarda sth -ic td -horn book -ha pand -grigor yan -git u -gg f -georgin io -freep sports -fred matiangi -fly fish -floren cio -fla thead -fl ers -first group -face spics -ew snow -eri ght -er got -ene sco -elek trik -e ick -dt cc -drum life -dol t -deod har -de tracts -cricket nation -coming back -cochine al -cnd world -ch our -cdw corp -can ora -call o -bu duc -brisbanecity qld -brett dennen -bi eta -bed wyn -bed narek -bar bu -backing green -b icon -ashley banjo -ar tel -an tron -an bieding -albor z -aj mal -ahl berg -abil is -abatto irs -ðŁİ© ðŁİ© -ê´ Ģ -ó ria -z art -york city -yard goats -wl ns -win nowing -win de -wilden stein -wild water -weare marshall -we thu -watch fam -washington ville -wage theft -wac ke -vocali zations -under manned -un zip -trag icomedy -tow boat -to kimeki -thor ton -thelead cnn -tar om -tann eries -sur co -sreed haran -sp inde -sony xperia -social science -smo te -sma shedit -sivas spor -shop era -shaunw keaveny -shar bino -shadow box -se malam -schro er -saturn awards -sam at -sal ameh -sac ré -roast y -ro kin -respe to -re dis -radio graphs -q ni -prescrip tion -peter parker -ox ox -oun slow -oakham ales -nor mies -nitto tire -nigh a -nd grade -nati vism -my cause -mur derby -mon arda -miss jillscott -mindful monday -middle weights -mickey hart -melody jkt -me tsu -mcfar lane -masa ku -marchfor truth -maj e -mainaand kingangi -lwk md -lec l -lans downe -lafarge holcim -ladu ree -la ina -la ffin -kwame alexander -kum manam -kro kus -kem boi -ke vitch -ke iser -kathy raven -karun akaran -jeky lland -je ga -jar lena -irri gators -in quests -in ni -ic ot -homeaway fromhome -ho way -hilari on -heu mann -he ur -harnessracing fz -happybirthday prabhas -ham bo -grybau skaite -gran ter -grammy museum -goe ttingen -girl ss -gigan tea -geor dies -fv cking -fromm ay -fran kies -fou cher -fit ba -evic ts -evangeli ze -er ol -enter ovirus -eleph anti -e eva -driverles scars -dream work -doit right -dis arms -de funded -de criminalise -ddfirish open -dat en -dar ach -daniel sen -dani alve -dance plus -d brand -cy d -cory barlog -conglomer ation -colle c -coach works -clarine t -chitra koot -chir ur -chandram ouli -c vi -burton wood -brek ke -blu et -bid ness -barry manilow -avery music -audi gier -attack uk -ar rabbi -ar ao -ar amid -anc tified -an society -amaz one -am ooo -allenand unwin -air bn -aggie pride -acc football -ac ini -abkibaar modisarkaar -^ = -ðŁĺį ðŁĴĸ -ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ðŁĶ¥ -ðŁĴª ðŁĺį -ðŁij¸ ðŁij¸ -ì° ® -ë ®¤ -ãĤ³ ãĥ¼ãĥ -âĺ ¯ï¸ı -zi ak -z wicker -working families -win dex -westernsydney u -var in -u ep -turkey hunting -tre covery -tour mnl -the mill -temer aire -sur jit -sub mit -stan konia -spinalcordin jury -south en -sor dell -son david -simon books -si ron -si bert -scot x -scoo kies -scare fest -santafen m -sanc ti -s sea -russiainvade dukraine -rs no -rose will -richard hawley -ram my -prosecu tes -procli vity -presidency za -por ur -pod saveamerica -pag cor -pa yot -ott arts -og na -o sports -nieuwe marlean -newsal bany -ne villeg -ne mea -muradali shah -mr cs -mother house -mont and -mill sap -men indee -mal asak -mako ssa -make animpact -lute fisk -lot w -li sk -li i -legionof superheroes -late comer -lat tice -lake mba -l bg -kri sa -kid life -khid mat -kelli wardaz -kari byron -kappaalpha order -k layton -jubi lees -josh malina -it ama -invest ni -internet billofrights -infec tiously -illi quid -ic mr -hy son -hot an -hen rico -heming ford -hellolove goodbye -hear taches -head erfor -gulf shores -greg j -gre eley -gor goroth -goe tt -gh in -gc sb -gaunt lett -fu xk -for ag -figure heads -feet sfriday -fantasy league -f ki -ext ols -elimin ators -eli ber -ele af -echev arria -ead weard -e anna -dz rh -dun levy -duken ation -dream fall -dor ham -dk weirracing -dj sli -dan quah -d crising -cyto plasm -cri stela -crank case -count downs -corticoster oids -con con -co readvocates -cla va -chry stia -chiw enga -charle smil -ch hath -cefal u -capp ucino -cantab rian -c wr -c atters -by uw -br or -boye tt -bir git -biopsycho social -best picture -bell icose -bbc newsbeat -bath ampton -bat alha -bang arang -bandit ry -au tour -assemb lea -artificial grass -archri val -ap fel -andreja pejic -an sal -amu jer -amph icar -american hero -am sel -am angala -adapto gen -. ðŁĺĩ -ðŁİī ðŁİ¶ -ðĿĹ ¦ -ðĿij ĸ -íģ¬ ëĤĺ -íģ¬ëĤĺ íģ -ëĵ ¤ -« « -yy ys -ya hy -x roads -whyi write -waite mata -vidyar thee -varieg ata -val gus -vaj rayana -utilit arianism -usic ology -undp nepal -ul rich -uba id -tur genev -tracy morgan -tr pg -the weather -the french -territ ory -terr atech -temp t -tele suren -telesuren glish -te odo -sv hs -style inspiration -student sfirst -stu ttered -stoo ped -ss art -spi o -sigsauer inc -sharon stone -ser ban -se akay -science center -saras wat -sandi fer -sam billings -sal mi -sak sham -rub én -room nyc -ric keys -ri gas -rei ley -radi ore -py are -punk newwave -promul gated -prob ity -prat ley -pin en -ph anie -pan in -official somo -oel wein -nws boston -no thern -netflix andchill -nbam emes -nay er -mylfc matchdayimage -my daily -my bad -multic ellular -moul ton -mer redin -men hir -meach em -mcclu sky -mal ong -luv v -looking up -logarith m -life sinked -li scard -leehsien loong -lauter bach -la pua -ko cian -kil ob -ki pedia -kar aca -k hub -jo zo -jami ed -j bf -iti me -immun ohisto -hollow ay -helic arrier -han kyu -gas ca -gallery nucleus -fore finger -fo dera -fast ener -f ttc -exer tions -ev ren -elast omers -eis ler -egh radio -ed mc -eclec ticism -dramatic tvactress -dogge rel -dile k -dic tum -dem townhall -de eming -dani o -daily artapp -d pu -cre ese -coton de -coo len -come tothe -columb arium -color ants -cio glu -chev rons -cher ini -campa ña -call ousness -bur kart -bran dishes -brain port -bps official -book design -bess borough -bed knobs -bea del -be toftheday -bas sm -b ics -aw ow -at tr -at tala -asi us -as gupta -around theworld -ando ther -amal thea -alter cations -ale u -al j -ail or -ag rill -acon lin -achi eng -abc perth -ab k -..... !! -... ðŁĻĦ -ðŁĻĮ ⾨ -ðŁĺĤðŁĺĤ ðŁĺĺ -ðĿĹ § -è¡ Į -âłĢâłĢâłĢâłĢâłĢâłĢâłĢâłĢ âłĢâłĢâłĢâłĢ -Ãł n -zi val -yuz uki -yo sa -x tz -warmest dayoftheyear -wall man -wab co -vesper tine -ver hagen -vaidy anathan -uts engage -uni one -uk ko -ud yo -ubis of -u ble -tow and -too tie -too kes -ton us -theother palace -theor yo -tham marat -team parieur -team marco -tart us -tarant ella -tar sem -supportsmaller streams -subtrac tive -string ers -stay ers -st patrick -spil sby -spati o -sor ay -slat kin -si pos -share alike -sel zer -schill aci -schan zer -ru lz -rott nest -ren ter -re start -rashe ed -quasi moto -pol ack -plac id -party poker -partic u -par ri -pall ant -paga dian -pa zz -open mind -onu cle -om ix -odu ba -oc transpo -nu zz -nevilleg aunt -nelli gan -nathan caliendo -mur ga -mor iz -monta ña -moj govuk -mc gorry -masseffect andromeda -man tia -maj ima -lu tea -lode stone -lef kowitz -laur amer -la stra -la quon -ku rashiki -kingston uni -key logger -kar upp -kali dou -just married -ju yal -john daly -ine ver -inconveni ences -holtren frew -ho efer -hasan uddin -gr rrrrr -gen eric -gab ap -fredrik stad -fra ile -fl anagan -first book -f mcc -eri ko -ell ende -ee sha -du mo -down cast -do bry -divyankatri pathi -dip onegoro -desi perkins -david le -cryp tic -cort land -cootam undra -colli o -cla vel -cin tra -ci rio -ce ann -cau dal -cary grant -can struction -by hilton -budd leja -bo gho -bl art -bis mil -birdr inging -bilingu als -biggies malls -be kar -be careful -bc boston -bar sky -bag naia -av eli -art books -around thenfl -ant farm -amand am -al over -agra deci -ach he -ab ella -a beauty -a ade -... âĻ¡ -! ðŁ¤£ -ðŁĶĽ ðŁĶĿ -ðŁİ¥ # -ìĻ Ģ -âĿ¤ , -âĺķï¸ı ðŁIJ¸ -Ùİ Ùij -zar os -wj hg -wind turbine -wide format -whit nall -whist led -wans beck -uniof greenwich -under my -u afootball -twitter arty -tun ick -tric ycles -tri ss -to fur -thankyou lord -terra zza -ter mas -tellu rium -tal abani -ta uri -ta official -supportw yo -squ anto -sp edchat -sor na -shin da -shi row -sh ym -scraw ler -scam bridge -salmag undi -ru derman -rit as -ricar dol -redbull ring -real racing -par x -pack able -onthe table -officiali rishfa -ny ana -nump ty -n ellie -mrschu reads -mi ak -makge olli -mahel ajay -mac ondo -lumi ere -live itup -legiti mizing -lamor na -lam ington -ksh mrmusic -kit kat -kin i -kim itsme -kelsey grammer -kav adhu -ji ren -ji rayu -ji ley -jer rold -isra r -inter line -insur rec -inocul ate -ino v -inf urt -in ther -in skip -ill ings -hul hu -hs live -hossein panahi -ho sford -hfx gov -here ward -hello kitty -han afu -hal flings -had do -gy ratory -goog learts -god ber -gen nie -gail kimitsme -futureis clean -footre sts -flip class -firstdogon moon -fiji water -fant v -et one -esof twitter -en ze -el ittle -ed ris -econom e -ec rs -dr pol -dog man -dirty south -dikt at -dichotom ies -deb harkness -danse use -daga anbieding -d wor -cut down -cumbri auni -crossy road -cros sen -cot to -compare the -com ley -col a -ci le -cc mfc -casc adel -cas ap -cab ella -bu chs -brugman sia -braz ell -bir dies -biblio therapy -behnaz akhgar -b spencer -az al -autum ns -arqi va -ar z -ar ques -andri ukaitis -an ini -an al -am rap -ain da -ahwah nee -adi alogue -abo xer -ab dal -... ðŁĺŃ -) . -ðŁĺĺ âĺºï¸ı -ðŁĴį âĿ¤ï¸ı -ðŁİīðŁİģ ðŁİĪ -ð٧IJ ð٧IJ -ðŁ¥ĩð٥ΠðŁ¥ī -ê´ľ ì°® -ãĥIJ ãĥ³ãĥī -âĢĵ ... -म र -Ú© Ø´ -yam ah -versi ones -usa rec -under ling -um g -turi sm -tune n -tom greenlive -tetra pak -tessell ated -tan auan -tak ami -tablo id -sub domain -student nurse -stu hr -stu bbins -strath more -ssoci al -sociol inguistics -sk la -shrews morris -shou ty -sel vin -sch unk -sa ww -s ago -rose tta -rene ef -religionof peace -refu els -reduc tase -redon da -real tristan -rad or -r ning -projec tion -profun dis -pop surrealism -plym ou -pin on -pil ley -pe mc -open weight -once more -om n -om loop -official itm -ny kv -nucle o -nove cento -nim mayash -nie miec -ni had -ni ge -ni eve -nes sus -nd sufootball -natur inaughton -nash y -nar m -mr hs -motley fool -moren te -mongre ls -mol k -mcelli gott -mark mcmorris -mani sharma -mahesh war -mahar aj -lis se -li pan -lav ant -lar ı -kar avan -kal inda -ka aris -k dramas -jul quen -ju mah -john nosta -jethro tull -jar o -it begins -inve ctive -inthe middle -instruc tables -ing bottom -in sincerity -im it -hurl but -hock omo -health grades -he mat -happy jinday -great read -gh f -ge stede -gaur ilan -g biffle -fx ck -frank ly -for charity -falci parum -explore tocreate -exfoli ates -estad ouni -en id -em cer -dylan wang -dull stroom -dete sts -daysof happiness -coo oool -cle te -cl bv -chitt y -chap leau -catch me -bush c -bronchi olitis -broad street -bo kor -big il -beltr ame -bbc panorama -bb bz -bauhin ia -bal ey -b jr -awe sum -aqu ilo -antimal arial -anti k -angrybirds movie -amon dru -al mac -ahor ra -ab os -ðŁĴķ ðŁĻĪ -ðŁĴ¯ ! -ðŁijı ðŁĻı -ðŁijĢ " -ðŁıĪ ðŁĶ¥ -ðĿĻŀ ðĿĻ -ðĿijĸ ðĿij -âĸ Ķ -Ùĥ ر -и ÑĤе -zor ds -zeit lin -ystr day -yn p -xiumin day -women folk -wind pipe -wel ding -we pa -wa ac -vladimir putin -vital ogy -uni z -unex pressed -un dressing -u tube -u alber -tor tora -tony denison -thor ny -thereal autoblog -thejeep boss -the flying -story corps -stie ber -ste mp -so al -sin fin -shiamak official -shenmue hd -sf aulkner -semantic web -sarac en -sar tain -sammy watkins -sak ya -sac town -s dept -ritu ally -ri shab -ri oux -ree de -realestate investor -rat ers -quad er -q cd -pre dated -portu k -plan chette -pla iner -pink tober -pilo thouse -par anj -packer scamp -outre ach -on elu -obli gate -npl nsw -nott jmiller -northco teuk -ni ga -ne leg -my sad -must die -mul tani -muen ch -msd honi -miner alized -mi ked -melbourne rebels -mand saur -macro monday -macleod lisa -ma bon -lunch special -love fool -lo sch -list in -lew ys -laurin burg -lamin ck -laid ler -kn auer -kingsc lere -kelly hoppen -ke mber -k heim -je anie -jan edu -jahn joyce -ja ey -j nl -j fb -it ra -irish athletics -invest ingin -ice pick -iam nathancarter -ia edchat -hutter ite -hong qiao -homi letics -hand ball -ham burglar -ha eger -group suk -gos well -gop shutdown -glycol ysis -glo ben -gi aco -gerring ong -ge bra -gar do -fruit and -fein berg -fat ma -f ager -erit age -er la -end ment -ei jun -dro ege -down hearted -domode dovo -di mock -di gression -dham mapada -dell in -daniele wski -cre aking -cour tiers -cortin as -cook with -contextu alizing -ci pe -child actor -chi usa -cent conf -ce ducation -carol i -candy floss -can adam -cab ri -blue stockings -big hair -ber lyn -battle ship -bass fishntips -aure ole -as quare -artscentre melb -arti ste -ard glass -ap ari -an holt -alph on -alham dol -al ano -aju da -abq journal -abil aa -aar ya -ðŁļĢðŁļĢ ðŁļĢðŁļĢ -ðŁĺĴ ðŁĺĴðŁĺĴðŁĺĴ -ðŁĺįðŁĺį ðŁĺŃ -ðŁĴĭ ðŁĴĸ -ðŁİĤ âĿ¤ï¸ı -ìĪĺ ì§Ģ -ç» Ł -åı £ -à¸Ĺ ำ -اÙģ Ø© -ÑĢом айдан -youknowyou lovethem -women wh -w tr -uninterrup tible -un treatable -uk g -uc susa -tyne dale -tri ston -tim mies -thener d -the breakfastclub -tel er -tail pipes -suren dran -sparkle horse -spac enews -soton bloggers -sne ers -sm lb -shopif yl -sch one -sar us -sale able -sa kay -rugby team -reviv alist -readabook sa -re sund -queen y -propul sive -prom out -pol sk -po stol -petron io -pecz wolle -pate y -palm spring -our councilday -ound le -oti um -or pik -or ne -opera holland -onlin eradio -ok ane -oj simpson -obe tten -o war -nw ssan -nor afatehi -nfl trainingcamp -ne agoe -nbaf reeagency -n vr -mosque shooting -monster girl -miumiu official -may ben -mares me -maic har -mag li -m din -lyondell basell -lo docom -le em -le corbusier -lande cho -land lines -ladies coffeehour -kn filters -kim es -kihu en -ker shaw -ker no -ju bbly -jeremy shada -jeep neys -jare cki -ja jang -isag enix -intere sse -indy fuel -hi ggi -hec kel -har io -h á -grav ina -go kart -gis ella -gir llll -ge res -gam bi -gab r -fu jimura -frog men -forthe union -ff acts -fe iler -fatta hamin -famili ars -evelyne brochu -euro dollar -eu scienceinnov -eri zed -eri ously -eosinop hilic -edward sharpe -e ppie -e jig -e gil -dy fed -dued iligence -don nat -do ges -dent i -den ili -de pil -day in -data point -dan acar -conspiracy theories -clo ying -cl andon -choc taw -charger pride -ce se -carab iners -c scc -ble e -bi planes -be zal -bat as -bar ic -bali kavadhu -awu mia -apriv ate -ad fa -acrif ice -ðŁĻĪ ðŁĻī -ðŁĩ· ðŁĩºðŁĩ -ðŁĩ²ðŁĩ ² -ìĹIJìĿ´ íĭ° -éĿ ¢ -Ùģ Øª -Ø® ÙĪ -Ø« ÙĤ -zyl ka -ys w -ye sor -yar ai -ya hia -wheat croft -wap ello -want in -vo p -vir ushka -ven yc -use lessly -un tagged -tw en -tsu ji -tre zor -tn ks -thelast word -thefla bar -team r -strongman burner -stra ks -stoy show -spor tv -som ani -sof er -sneaker holics -shore ham -shar nbrook -sc broncos -says thanks -sarah jan -ru pesh -roc que -ran sparent -quarter maine -proven ce -power wolf -ph onic -peter reckell -perturb ations -perth saint -periscope tv -pere stro -party like -partnership working -par le -p vo -ori fic -on thames -on se -od deven -nt pol -my job -mon sun -moment a -mo hawke -mj h -mississ au -minority report -miner alisation -min cing -mil ius -max in -market smith -mar griet -mai ley -long town -lisan andy -lion t -lam born -lack o -kyo ka -kiku sharda -kad okawa -jehovah swit -j ú -j heel -institutional isation -ili on -i yogibabu -hu gest -green bonds -gra ze -gra da -get surrey -gell horn -gat ron -fuel ledby -freddie mac -flye ia -fer oz -f official -exoplane tapp -ex one -erin andrews -entren ching -eltonjohn dotcom -dz ire -drug policy -dre bin -decor s -de classification -dalecar negie -da than -cryo sphere -crooked media -creative coding -concert series -cel t -ce si -bra zza -border line -book ofthemonth -bobby deol -bo vespa -blue marble -bit ola -ber man -bench mark -bel man -bar bap -bad illo -az ore -at ering -and one -an dere -amdav ad -amb h -amazing world -ale ment -al verson -al caz -ac tr -ab caustralia -aash to -ðŁļ ¤ -ðŁİħðŁı¼ ðŁİĦ -ðŁİĤ ðŁį° -ðŁĩ²ðŁĩ¯ ðŁĩ²ðŁĩ¯ -ðŁĩ µ -ãĤ¹ãĤ¯ ãĥķãĤ§ãĤ¹ -â̦ /â̦/ -zz ap -young sheldon -ym piad -wyn and -women at -willi g -we cam -wan less -wald ner -vil ar -vi stap -vb hardwaj -vag h -us now -uri arte -ur baine -tru ssed -tru del -to god -titansof cosplay -timb res -thisi smo -think different -the empty -thames and -tec tonic -tat yan -tal aat -studi ob -star mall -spanish wine -space plane -sonyo pentennis -sonic youth -som osc -solfe ggio -smar tie -siame se -shore side -sho tof -she han -shark friday -sh man -serv ator -sen dit -saw bone -save forever -sage steele -s burning -rohit vbhardwaj -rock centernyc -river head -ricer ca -restin power -raise theroof -present ation -prepar ando -pose fx -plain smen -pic turi -photome tric -pen alizes -paint ourcountryred -out land -ou lihan -ont sciencectr -off man -ny saf -nun obetten -nix es -nik khil -nav orro -na ini -mw ff -msu bear -mont au -mittel stand -mi ahamm -medi apro -marcus rashford -male fic -ly sette -lunatic fringe -lover anch -lik elier -landol akes -ku bas -ko djia -kel an -jo bling -ji ayi -j simpson -iñ aki -im fact -ical cio -holy prophet -hk n -harms worth -happpp py -h gst -govisit donegal -gear hart -ge mc -fur r -fromthe heart -freedom for -free bet -first data -episode ix -emoun tain -drimn agh -dni propetrovsk -di ffs -dev yani -desol ated -cyto toxic -cro pland -cou pa -co yy -christi ano -char ring -cfas ummit -cel lier -catt olica -cas ely -car ron -ca they -c suf -c family -business world -bu ong -boo ooo -bluebull srugby -best cover -ber tini -b po -b hide -azam garh -arul nith -anne hill -anight club -amo u -ak sha -air lifting -ab baf -ðŁĺĺðŁĺĺðŁĺĺðŁĺĺ ðŁĺĺðŁĺĺðŁĺĺðŁĺĺ -âĻ Ŀ -| âĢ¢ -| " -youn gent -ye lem -x mpp -wuor nos -wrong doers -worldwar z -worl don -visi ón -ver su -up one -u cks -tweeds muir -twd season -tu fn -travis mills -tran sasia -tour an -tot teridge -tin man -ti ë -thelad bible -the code -thd specialt -thdspecialt yops -te poz -t way -t cb -sydney harbour -sura gi -stro zier -stay stron -star bird -squi shing -south yarra -small streamer -skan ks -sk imo -shey i -shaw kat -sha di -sece ded -se de -scul thorpe -scal endar -say antika -saras vati -sar afina -rtel atelateshow -roberts bridge -ri ser -retro game -red dragon -receipt bank -re sour -re nier -ra fan -pli ant -pinstripe bowl -picof day -pear ly -paladins art -paci fied -our planet -oikou mene -norman scat -nfl gameday -newzealand terroristattack -nat bookfest -n ées -n dogo -mur ra -mog wai -mo kel -mo bot -mitch ells -min ner -mer rick -men il -mee go -mat v -mat eu -malate sta -lund by -lon glo -less lie -leip sic -ku las -kit by -ke ala -kan kar -jeffrey deanmorgan -jan an -j iri -inter aksyon -in articulate -hibern ates -hfd cathedral -hemost asis -heidi montag -harps well -gri mble -glu ckman -gif tv -gerard cosmetics -fordair show -ford fiesta -flying lizard -fa zel -endic ott -em boss -elen aof -el row -el al -div ada -disp lease -dis neys -digital inclusion -dif fi -daniel pink -dam aja -dab u -curi g -cur vil -compli mentday -chicou timi -cep heus -cc am -casey stoney -calpur nia -by polls -bryl creem -bre mont -box elder -boom afoo -book tweeter -bolly spy -big land -bho pal -bend y -bemore bulldog -auto didact -at will -ann ayya -al thy -al ila -af zal -achil lea -aap ki -. âĺĢï¸ı --------------------------------- ---------------- -ðŁĴĹ ðŁIJ¾ -ìĨ IJ -人渣åıįæ´¾èĩªæķijç³» 绣 -Æ Ĵ -¨¨¨¨¨¨¨¨ ¨¨¨¨ -zwar te -zu biri -zo gby -zah ra -your style -yes yet -yash ar -wei den -veloci pede -van doorn -use dom -up setters -unmiss media -un amused -u ise -ty to -tru triciahelfer -trans gress -ton bori -thum amina -the sergiogarcia -th planet -targe ted -sy kora -sw j -suppre ssants -stree ting -st patricks -sports network -sle at -shiv amo -serj tankian -seago ville -s oper -roes ler -riv kin -rin king -rel ite -red l -re go -rc pe -ray rice -que ss -puntag orda -poetry club -pl w -pet teri -parac lete -p texp -oviya army -otta way -ole k -nrl south -ng w -n ber -morro co -mic ca -meinl cymbals -mar kova -manji mup -manav gat -malai kaarora -made lein -mad ingley -mad ill -mad diec -macau gp -m sian -logro ño -little wood -leon arda -kol la -ko stic -keep grinding -jung koo -julien solomita -juilliard school -jaime murray -itsoknotto beok -ir furugby -iphonex r -interrup ter -iam kevingates -hypoten use -holm quist -histri onic -h gw -guildhall school -guant á -ground out -good trouble -goian ia -go pis -gen ix -form alin -film friday -fe tus -evry thing -eudat ap -estor il -eri sta -ep ines -emil ys -elisa bet -eli el -edward norton -ecor re -echever ria -ear ther -e kywx -dramati sation -do tan -dism ally -dia gh -di photo -den el -de ko -dann yo -dal bir -cudd yer -con fort -community first -clanc ys -charlesmil ander -cau tioning -carre ra -cad le -by noe -bro eck -brian may -blue family -bit me -bil ayer -bie bers -bi ene -bhu pen -beit bridge -bat ala -bas smaster -bapti sing -bad ak -b ico -ar trave -anu sh -ano tti -ang ley -analy tically -amor gos -amanda seyfried -ama hal -akamegak ill -air craf -adi son -[ ..] -.. ðŁĺĤðŁĺĤðŁĺĤ -## ## -ðŁĴĹ ðŁĴĭ -âĺº @ -âĦ ĵ -zen er -yeezy season -workat bmo -wil cox -weare lions -water foot -wat more -vintage finery -vanqui shing -ucbt la -tw b -tra ks -tiru vann -theatric als -the peoples -the fresh -the culture -terry ville -ter ate -syncop ation -subo dh -su steren -styx theband -spir anac -sl pp -ski e -shur tle -shu bin -scor chers -scorchers bbl -scam bill -rø de -ry uu -run day -royal nottingham -roseng arten -roo ters -ro ved -restorative justice -rec d -ram k -produc ts -pral ines -po hn -phon te -perry farrell -opp en -om entum -olivi as -ol inger -oil prices -nucle ation -noo ksack -nikkhil advani -nem rut -muzz in -muzi ek -mul ligan -mont seny -monster shockey -money lifers -mo sk -mitt a -mi thi -mchen ry -may il -mate ch -mar jane -mak ris -mac aluso -ma bley -m mol -lions roar -limb u -legend sneverdie -ku si -kqed news -king crimson -kar ok -kane shiro -k jal -ju gni -jm sdf -inform ación -in adequately -i bid -hend ryx -heat world -hard head -gu lags -grand vintagefinery -ghar afa -gar zon -gallinu le -futu h -fried rice -frey tag -forever faster -fluid ly -fli kis -flat sharkfriday -fer it -f tir -ev ng -er kan -e od -dé but -dz mm -dyou th -dogre scu -dixie chicks -disc ordia -di ge -defen siveness -dead of -dac arter -com eta -cm madhyapradesh -chi architecture -chennairain shelp -change agent -ce sta -categor ising -camp illo -c cam -bw ca -brendon hartley -breeze wood -bon soir -blue diamond -black pride -black moor -bla sé -bicycle day -bibek debroy -bergü zarkorel -ber nd -bel apur -beav an -bali ke -az ri -aud ley -att ini -atmosph eric -ash bar -as ale -arulnith itamil -arte verywhere -arom ero -appell ations -ante y -alexiso hanian -alder maston -ah g -acon ite -aard wolf -åĽŀ æķ° -åĨįçĶŁ åĽŀæķ° -öster sund -é ire -à ¿ -zoek ravitz -z inner -yak ushima -wood art -william morris -whites ell -west ling -we sti -wall onie -ver ka -van badham -uni fortheunion -u mac -to cs -tiv ation -the tapi -the hsf -thal ic -tele babad -tc boe -tar kwa -tan trik -tac chini -sustainable seafood -su chy -stin ky -spini fex -somer sethour -skil ton -sepul ch -sci enza -sang ster -road and -res su -relation ships -re so -rand on -raim und -radi kal -qu ater -q lowes -purpose less -pow pow -pix s -petri fied -paul fox -pan american -pa korn -p canada -ow ls -ou ton -orig nal -on tour -omo bile -odi ya -o tunga -nur ture -nrl bulldog -ness week -mon em -mo akley -mma worldseries -mazz arri -mayor gregor -making it -lo aiza -lie bing -ler ay -leng let -la vac -kon tor -ko thi -kill star -khan e -jo konta -jer wood -inner strength -in cirlik -in ap -im un -illion aires -iihf hockey -hu mmm -heather smusical -he arers -hard talk -happy min -gu sev -gre athe -gayath rie -fli es -feno kee -engineer sday -enamor ada -du lli -dro yal -dewy ze -depart amento -denili quin -danielle peazer -danialve sd -danacar vey -cymb al -concur ring -co ins -clari fier -chol ar -chi el -chasti sement -bug zy -boon dox -body positivity -bloodh ound -bla go -bi agini -bath bomb -baby parts -b pt -awe bster -ash all -arr ancar -aq a -apal encia -allegh en -agains thate -adventure dub -adsby google -! ðŁĮ¸ -ðŁĺ³ ðŁĺĤðŁĺĤ -ðŁĺ³ @ -ðŁĴĥðŁĴĥ ðŁĴĥðŁĴĥðŁĴĥ -æģ © -ä» Ļ -à¸Ħภ¥ -Ï Ł -~ ' -yo gar -xmas gifts -wmc actionnews -wearit pink -uof california -ukho zi -uk coastwalk -u hud -tu shy -triste za -trek segafredo -trance music -ten sioned -team wendy -take warning -sto dge -star dock -st joe -st fest -srish ty -sri hari -sony pic -sol arc -siyab onga -sirr fs -signor ia -she el -shar q -sel z -see tha -school shooting -sali k -sal aah -sad atx -rockos modernlife -rit suko -ri mas -reinde er -re applied -rat te -pri ses -pp sells -pir on -pavlyu chenkova -papri kash -palazz olo -pac kexpo -p alike -ousp lants -opent ype -o vp -novis ad -ne wex -nat ore -my jam -moun tallison -mou stapha -moo somin -mo state -mo chizuki -mi sere -mar able -madeto order -lut senko -longstre th -lon hro -league acs -le so -lac tose -l voe -l nm -ku ze -kriti k -kir kelementary -kidsin museums -kc n -jermaine dupri -jazz giants -inter weaving -instap undit -inqu ilab -illinim bb -i pupa -hyper sensitive -hoch berg -hig nett -hi shoot -hernan es -handmade withlove -hand shaking -halloff amer -gun sand -gudi padwa -gre v -grange gorman -goldber gabc -get xo -fl anne -fi dalgo -feder alists -es rc -elf cosmetics -ef ell -eccle sfield -e off -dove tailed -diplom atic -di spiriting -dead locks -david haydnjones -darren aronofsky -dak ini -critt all -cor sair -compli ance -committee woman -chili bowl -cher rapun -chab rol -cash money -cambridge up -calde ira -bu zek -bol tzmann -blood worm -bird wing -bil lah -bhag want -ber ko -ato ols -at d -asi mha -asa pro -ap ta -an erley -aha ve -access oires -ab elson -ðŁĻı ðŁĺĺ -çĪ ± -âĢ ¹ -ب Ø© -Ñĥ ÑĢ -zo tero -zach aria -z ura -young dems -ye hia -ya x -wyo sports -world day -wir th -wil les -whatsin your -vet college -us ke -upaz ila -unk rich -uni fies -uk nighted -u pike -troop ingthe -travel holic -toom any -thisgirl canuk -theak ston -ter yl -ten o -techo bloc -tali on -t de -supri yo -sunny and -sul rich -su dd -st croix -spark s -space program -space ghost -somer ford -smash mouth -sm wnyc -sin dic -shiv shankar -shear man -schmoe down -ru ark -ribon ucle -real dlhughley -radial first -rac ters -quan go -prome sas -pow a -politec nico -pol itti -playboy plus -play z -phil health -petr arca -official rfdtv -ob ay -nigel walsh -nicol lette -nic col -ni gar -natural capital -my kindof -monic ac -miner strong -mi zo -mg mre -mer in -mend acious -mcgin lay -may apur -matthewk oma -materials science -mark downs -mac al -m power -long branch -lochgil phead -llamas oft -live performance -ley ne -lac us -l sl -kumbhal garh -ku dai -ke char -kari mov -kap ila -ka inos -jone goro -john wesley -joequ esada -jam y -iwant my -it l -impre cise -ii fym -ig noble -id aniel -hue ys -housen y -hau er -hart sock -guan eng -gu entzel -gr rm -gone withthe -gn x -give back -gaw thorpe -g dc -frees kiing -fli eger -fer riter -exc ite -ev anovich -eter n -energye ast -dz ic -dou gal -dhan ak -day party -daren th -d tek -cut worm -cunnin gham -cu fi -cri men -crave online -cool ly -collin sjr -clo ture -clavic les -chelt scifest -carnaby london -calcare ous -buffe l -bs gyn -brig and -bo vey -bo il -bi eler -beverly hill -baz alge -bazalge tte -barn house -back plane -baby shambles -ba stani -b nar -atthe beach -ation ists -at aman -articul ations -argo sy -ap oria -animation history -an ted -adventuresof sabrina -abdul kadir -ðŁĺĸ ðŁĺĸðŁĺĸ -ðŁĺĴ " -ðŁĹ ij -ðŁijĬ @ -â̳ ) -âĢ¢ | -è ce -zo ila -zak i -zait sev -za har -wonth aggi -wcs district -wai roa -wag staffe -virgin radio -vietnam war -uwh arrie -uss enate -under state -ugly sweater -tw bb -tux ford -tsu gumi -ts ve -trophy less -tri ppie -tor ok -tooth fairy -tom baugh -toib engaluru -to wards -time is -ti mex -thun berg -theland news -tell ing -tee garden -tc palm -tb al -tantrum jas -tagteam titles -strong and -stiff key -sport sand -sou k -si kar -sher inian -shaz aming -sharon tate -sh lomi -sc inemas -sap stat -sag acious -sa ison -rut les -roun drock -rother field -rosel ia -robert liefeld -regi one -refor mists -ram adoss -punks notdead -priyadarsh ini -power bar -pon tian -phyno fino -percy jackson -pa ek -p ds -op hrys -oko h -nor ds -mugg ings -mu barak -mr ts -mou sa -mo pan -mitch inson -mis ao -mi thai -mall er -malcolmb arrett -mainde foe -madison wi -lp family -long drive -lettu ces -letsgo fish -letsgo bluejays -lahore blast -la yl -la wr -la had -knee bone -ken yc -ke yeast -kc z -just jane -jack averymusic -j music -iso pods -in chi -il f -ho sey -guanab ara -gir nar -fleec ed -fla key -fieldwork friday -ex bury -eu onymus -en snare -el acrosse -ek po -ebay deals -dge y -dee sh -daun te -dam usic -dac ascos -cou lomb -cotsw ol -coffe ec -cityof york -christodou lou -chapp atte -cav ill -capo bianco -bul kier -bru jo -brit pod -bristol museum -brady bunch -botanical garden -bom e -bol len -beau ce -be sit -be achi -ban ach -bal tas -bal jit -azhar ali -ated atbirth -ar mon -ang ellic -all ready -aerop onic -advis ory -acul ture -acri mon -aa aj -ĥâĸĥâĸĥâĸĥâĸ ĥâĸĥâĸĥâĸĥâĸ -ðŁĴĻ ðŁĺĬ -ðŁı ¢ -âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -Î ¹ -än der -zet seguin -za im -ym g -yam en -xfiles revival -womenin football -whe ely -visit nsw -vill amil -var ur -uj fm -tur nings -tri lemma -tomas ino -ting in -ti em -thrombo embolism -thenext level -thanks you -tehseen p -taylor ville -tank girl -super mamc -stipul ates -st jinx -som d -snoo py -sloven ly -sini akova -shi garaki -shi bas -se aga -sawbone shex -salsha abilaa -sa has -ru dess -relief ph -quarry men -quadru plet -prin tr -pos thu -port ent -poli she -po ffo -pi b -ph arre -person ae -pel inka -pe psic -os mar -op tom -nr v -nerdy bookclub -nelli safb -ne zetseguin -nayanth ar -nav sari -mus thear -mon toro -mon er -men shair -men ashe -meflo quine -mazar ine -man esar -mack aye -maccab i -mac eration -lance hoyt -kol ten -ko hut -kne ipp -ki dul -keep cup -kbr shanthnu -kart arpur -kapil dev -jj project -ji ho -jared keeso -jam session -jail ene -jag at -israel houghton -isix hosa -ingex pert -im kbrshanthnu -herne hill -heck ingbottom -head water -grue somely -gregarious gus -gov tof -gored foxes -giri ja -ghat ak -gh anim -gaz coombes -gastro esophageal -gam le -gab ino -fry selectronics -for paws -for gan -flat shoes -firepro world -financial advisor -fi it -fe bo -fashion revolution -farn combe -exam inees -es op -dun shau -dontbuy thesun -di val -dday live -dark man -cole k -clayo quot -city comiccon -ci han -chop ta -chi am -catal oni -cap ensis -braue rei -bra ying -blue stein -billye ichner -benazir bhutto -bel ami -band elier -b plant -b mm -atx tvs -arbor vitae -andrew bird -and j -americane wsroom -alitabattle angel -ali h -album review -agu ars -agen der -afl footyshow -aegyp ti -aed rummer -ace to -a ahhhh -a abc -< -> -ðŁĺ» # -ðŁĵ Ł -ðŁĴľ ðŁĺĬ -âľ Ĺ -ص ب -zil los -zay lea -ys an -ye ea -y kids -y ge -wondo lowski -wn n -when the -web deals -wash post -upgrade able -underground hiphop -under stating -ukbiz lunch -ucc as -ty k -tu mut -toni morrison -themercury comau -th ast -tgi bf -techno cratic -susan oo -submer sion -su at -sty nes -stel co -start growthhack -splin ting -speake asies -smtown engsub -sh uru -ser ota -schum peter -sc atters -satra pi -s mino -ric key -rh show -re ino -re conversion -rco bsgyn -qu ynh -py mble -pure blood -pu pil -priyank sharma -ppe dup -plough shares -petal inews -on field -nswe ducation -nh scrisis -newscenter maine -na id -n be -mr tim -mm ts -mic nice -meg awith -med ine -manu script -locomo tor -lin tang -ley la -laureus sport -lane ways -kukush kin -ko lob -kl k -ken de -kaz em -ka ura -joke oftheday -joint address -j das -iy ana -is and -infirm ities -incongru ity -ibmin sight -hulkam ania -hu mawards -how live -hor stman -hin akhan -health coach -have it -hardrock cafe -ha sel -grim stoyshow -good sell -gods love -fro ilan -fm sport -fisher price -final cut -fb heroes -faul tin -fa kers -ex oxo -emph is -emo cion -elenaof avalor -ed codes -east bourne -dun dru -du ur -dog park -digital day -deve aux -del gada -deep space -day byday -daveand busters -da er -cur sos -cruis elife -crop science -cott aging -cor duff -conflu ences -cohe siveness -cel an -cat experience -caprio tti -cag iva -caf ferty -bus bee -buildseries nyc -bu et -bru el -bookof mormon -bo cage -blax land -blavat sky -benav ente -be sic -banc assurance -automotive industry -aston university -approxim ations -amy adams -am mal -alex ius -alber thall -aj arian -ac cc -. ðŁijĢ -. âľĮï¸ı -ðŁĺŃ ðŁĺįâĿ¤ï¸ı -ðŁĺ³ ) -ðŁIJ « -ðŁİīðŁİĤ ðŁİģ -ñ ol -zale ski -z aib -youth hockeyhub -yacht club -woof woof -with cnbctv -wil born -whit efly -west water -west texas -wen gie -weare ky -water colorist -wa ik -w mca -w be -vou ching -visual isations -var ro -v ants -utt lesford -us ing -un feeling -u fp -tory belleci -tiruvann amalai -ti schler -texas music -test drive -te pa -t wh -super malls -sun s -style sheet -spectro meters -sol do -sign ano -sci pol -scher zo -sar b -sanguine tti -san a -samani ego -salaf is -sa wal -ro ep -rit am -rising fc -reaction aries -rang zen -rado van -ra fer -po tty -petro logy -pel ters -par sed -opor tuni -oke fenokee -o ic -nou ak -nor doffro -naz ari -navo daya -nat andalex -nai adi -mun chie -mor uya -monu mental -mir am -mill house -mi mar -met c -mergan sers -mb un -martial law -maro cain -local artist -late junction -l cac -kur kova -krewella jahan -kias oul -kendall ville -jobsat sap -jay atv -jav elina -jar nail -jake snake -jad wal -ir rera -im mobilization -ill ich -heat pumps -har im -grou pltd -go bbi -gin sider -gen l -gautam i -fuji feed -fra is -for mby -food systems -feel on -fast ford -eye inthesky -equestri ans -ef vater -dream it -dh ani -dest inee -derek blasberg -de santo -de mel -dce aglecam -dau di -darth maul -d mi -cw fc -contin i -christen sen -chocl ate -chil duk -chatter is -challenge mtv -chall oner -ca estecker -buz dar -bo als -bloomberg nef -blon del -bil gi -bidden den -bey eler -ber ti -be filter -bc so -bath couk -ban cos -awami league -aw ls -atra vels -annu alised -angelamer kel -and ray -amorpho phallus -amai zing -agh oulihan -ac b -abid sherali -\ : -ðŁĺŃðŁĺŃ ðŁĺį -ðŁĺĮ ðŁĺį -ðĿĺ Ģ -ãģĦ ãģ -âĿ¤ï¸ı ðŁİ¸ -à¹Ĥ ม -غ ز -اÙĦ اÙħ -zu er -z lin -your face -yo hio -yn k -wissen schaft -who afro -white sox -whati wore -west norwood -wak amatsu -wa gh -w abush -vat an -uno suke -ulster wildlife -trul ly -tor il -ti sc -this weekend -thel in -thekenny johnson -theatric ality -tapa chula -tab ulation -ta waf -sunder bans -strong room -stop p -sser vice -snow drifts -sisse ton -shriner shosp -sherri saum -sheil aedrummer -shar m -schul tze -sch ow -saving species -sahl berg -ru sin -romul ans -ro tte -re der -railway stoday -ra gging -quarter backing -qu ashes -prolet arian -por che -play renegade -photo sensitive -pasteuri zation -party city -parkh rc -pa ed -os bournes -oo ks -octa hedron -oce ang -nw mt -nelly furtado -ne si -nase by -ms sen -mr sc -mon ell -mon acan -mom entu -me aker -mayur bhanj -manische witz -mag sa -mac abe -m cree -ludwig shafen -luckywelive hawaii -lodocom ello -lil lahi -lik ha -liber ate -leonard peltier -lc sw -lai kuanlin -l boro -kier vi -ki prop -kerast ase -kcb group -kay yem -kal dor -k gf -jx mmi -jvp live -jo ee -jnd newin -jn tu -ite u -inter nists -indra dhanush -ilo tt -id lesband -hou mous -hex en -hend aye -hani m -ha patra -gwent police -go ar -gli atti -gla snow -gir lof -ger land -garethe mery -freethe children -flow cytometry -flam ini -fe ye -est agram -ent reco -eng les -electro magnet -dst govza -drugab use -dri pper -dl bcl -dese gregate -democrat sare -day today -davidal angrier -david w -dae han -cornell birds -colin cowherd -co ia -co el -cloud busting -clat sop -ci endo -chilling adventuresofsabrina -cha itra -ch kala -central valley -can teens -cam t -caffe y -brueg gemann -bren ham -brace less -boy ss -blo wh -bit on -big rig -big bluerising -bharathanen enu -beauty awards -bar nicle -ballo onist -bag mati -ba rex -aur ic -au ta -asburypark press -ap ada -ande cho -ald inga -albion parkhrc -af ic -________________ _ -( _ -" --- -ðŁij º -ëĤ ł -æ¸ĭ è°· -ઠ® -ب ÛĮ -z eli -ye ley -yan o -women slibrary -willi son -whole food -whitt all -white shell -w lo -visit nh -tz ipi -tomat ina -toledo zoo -thu bb -then ow -then ex -thelong dark -tey hainpyaarke -tar buck -ta bet -t san -suc ci -stu xnet -specu laas -sock puppet -smi leys -sl mpd -shi pre -shannon od -shannonod komo -sgvn sports -se mar -scream official -sc cg -sau dara -sar athi -ry uko -righ ton -rig don -realmike fox -rass lin -radion z -r carter -quote sabout -purlo ined -pueblo bonito -projec tive -pnp benguet -pin ia -piase cki -phil star -pain free -paddy considine -oo ley -onmy way -ok ream -official ntas -of ar -occi dente -o ssia -nz greens -nov is -my chal -music magazine -msc cruises -ms as -monte squi -mon stru -mk malarkey -minof healthug -metax a -metamor ph -me sta -mazdar acing -max okream -mal gudi -maas ante -m doc -love guernsey -lee goldbergabc -lar ale -kom achi -knit ted -kee fe -joanne clifton -jingo istic -jh pie -jg quintel -jam shoro -jahang ir -indonesi agaruda -in sofar -ho thouse -hiphop news -helpin ghand -he ree -ham on -h murray -goun damani -glen rock -gi gh -floral design -film ation -fili povic -ex pl -eun jiwon -eo connor -dun church -dream theater -dirty heads -dicky johnson -di si -davidd avis -cup ation -cou va -corn elio -cor nexchange -che mun -cham bana -cb cy -catalu ña -carolo ates -carlo scon -carbon ates -car ras -c smt -businessc ard -boy ton -bo stik -bleep ed -baltimore ravens -bad ley -auror amax -audit ore -atribe called -arse holes -arr anca -ar saigh -alnwick gazette -ak ino -air bnb -adventure awaits -ach on -ab copen -;____ ; -! & -ðŁĺį âĿ¤ï¸ıðŁĺį -ðŁĺĬ ðŁIJ¶ -âĿ¤ï¸ı ðŁijı -à¹ĢภĦภ-ä n -zy lo -zel az -zam belli -yoshi e -women slax -wiz kids -whitman comics -was u -war ta -viv ant -vin u -vast atin -under city -twicelight sin -torfa en -tik vah -thisishow we -the sc -the official -the legendof -th q -tatt ler -sweeney todd -swan scombe -sw oc -suga day -su azo -studio time -stou dam -stop islam -steep ly -st bcbeer -smy ly -sky boxes -sk yo -shesthe man -sh Åį -se ak -sd in -schoen aerts -scam ps -salute our -s vea -rol lei -rock fall -ro mo -right ness -rh hs -rec afe -rang y -racing usa -q waq -pá draig -pro pp -prachu ap -poly chromatic -place res -pidge y -parthi epan -over it -oppur tunity -oo ak -one on -omat osis -o shii -o asys -nye timber -nunobetten court -nor dha -night lights -news gathering -nar annual -na ig -na ee -n clt -muss ina -mud bound -mu co -moz eliak -mousc ron -mor ges -monso onal -mj d -migo satl -michel isz -michael aconlin -melen chon -marykill speople -marvel s -mad chester -ma iga -loong abba -lincsc athedral -lad bible -kir kk -keeping familiesclose -ke ino -k hil -joedon rooney -ji om -jessi ka -janet mock -jac at -itsme angelie -itsmeangelie ofc -ing change -infer nos -independ anceday -ima ik -illustr ator -hut cheon -head wrap -hang ar -gun buster -gu end -go vikes -gla zer -gis elle -franklin ville -foo ks -focu sed -flu ting -ff mpeg -fabu list -encyclo pedic -el ak -eeeeeeee eee -ec tasis -earn history -ea si -du gald -dramati sts -don adoni -dog ar -divyak ho -digi pack -day breakers -dar da -daniel biss -cra ze -cour town -coste ssey -cooking class -chocol ati -chester ville -chester see -chast ising -charles stur -carne secca -can tin -buland shahr -book clubs -blo ater -black label -big bro -bed kar -be yo -baliunited shop -ayud ham -astri x -as agi -arthur s -art less -antan stead -annel amott -anis arahma -anime today -ang ono -amik kr -alpeng low -almam ater -air bushc -adri ve -ac athletics -!!!! !!" -ðŁļ¨ðŁļ¨ðŁļ¨ðŁļ¨ ðŁļ¨ðŁļ¨ðŁļ¨ðŁļ¨ -ðŁĺĪ ðŁıĢ -ðŁĺĩ # -ðŁĺģ ðŁijı -ðŁĶ¥ðŁĶ¥ . -ðŁĩ²ðŁĩ » -ëĪ Ī -ãĥĹ ãĥª -âķŃ âķ® -Å µ -ze idler -ya hara -with that -winter reise -weal den -wake ford -visionary art -v india -un heeded -un decorated -u vo -towand abraxton -tour nai -tlal pan -tilling hast -thur a -theun toldstory -the diamond -tah niah -tab qa -stu me -st stephen -sportsin kansas -shrimp sofficial -sf vae -sem ler -scotland rhshow -sari kaya -sanit ary -sa via -sa aya -s gu -ry stal -rock umentary -ro woon -ro stro -ro stered -rescu eme -rachael ray -pyrac antha -pulver ize -pu late -promo zione -poo jak -pin aco -perfect match -par rs -p tit -onthe air -one wyoming -ol ar -ohed chat -nyche althy -nu thatches -ni elle -nett uno -nb storm -nandamuri kalyan -mussel burgh -musco vite -mud jug -mo ated -millstreet brew -marti ka -makeyour fringe -mahar anap -mag daily -louder than -loop back -lon ers -le ya -laura bell -laurabell bundy -ko ger -kingscross n -kha os -keral ite -ker cher -kelly music -kel me -karne val -joshu agates -jim and -jas ong -itsa jeepthing -isol ators -int fi -indol ent -imagine ers -ic ole -hu meral -home of -hillary shealth -gun di -gr atulations -gior nale -gat ty -freer adio -flx wine -fluori dated -fi da -father christmas -fair lop -ec ran -dragon slayer -dr paul -do ink -derry berry -decor dova -david lloy -cra han -cla sping -chor hai -chint amani -che state -chatter ji -chao imh -chak ma -carrol lisd -cam anach -caf fi -c mk -c jones -buzz ing -bran well -bracken bury -bo twood -blom field -bla x -bemore chill -bed post -bas ant -ap lc -ansp ach -anisi mov -al chemist -ac credit -ab da -ab ali -a strong -ðŁĻıðŁı¼ ðŁĻıðŁı¼ -ðŁĴµ ðŁĴµ -æĽľ æĹ¥ -âĿ¤ï¸ı ðŁĺģ -âĥ£ % -ö mer -ze ppo -yi mou -ww norton -womeninthe arts -wom ex -wi ze -where on -waltham forest -vinyl record -vil oria -vicom te -ven dee -uta at -un ha -un alaska -ultimat ums -uli sses -u schi -twiz tid -tubabu stun -tri kala -travel manitoba -town site -tony danza -tn f -thom mo -thetrade shub -the missing -the max -ten ements -summ icron -staffordshire bullterrier -sp global -sole bury -sit all -si delight -shr u -selfiewith daughter -see tickets -sar agar -sany u -run ing -royal blooduk -richard madden -regi stro -red ale -ra be -quins rugbyunion -psycho therapists -pre eran -poke mons -pocket watch -please dont -photo ssmh -pe texpo -pau ll -patrio tically -padam see -onthe mic -on wood -on sports -om durman -nye pi -nouak chott -nati oggi -nan twich -mtv lebanon -moor thy -mono drama -mo state -mo realive -milwauke etool -mb loggers -may nard -maverick mack -mathi ascor -mat twil -mark knopfler -macand cheese -louisi anat -lolit afashion -lo ey -leit ao -leaving neverland -latavi us -l rn -kuri yama -kreu zer -koso ko -ko pec -kar oli -justin roiland -jump shot -jess alyn -jacket pride -ja hannam -ipu parliament -ingui stic -ik wy -hur v -hi ral -hesj edal -hel an -hei hachi -he ming -har bored -guantá namo -gam is -fr in -flip flop -fiat friday -fen cers -famili ares -euphe mia -ell l -el anna -e guchi -divul ges -disco teca -didyou know -devon shire -destabil ising -dent su -de tto -danger zone -da sein -cy matics -crand ell -comer mx -colossal con -clark dale -clan lupi -chil dof -cher itage -chaudhary mos -charli ea -castle derg -castle comer -cast ilian -can zoni -c cea -black butler -beng haz -bbce urovision -bar wa -b sales -aw ali -avoc at -augu stu -ani x -andre c -amil ies -am ti -alay kum -ais beautiful -ack enzie -abr antes -! ðŁĶ¥ðŁĶ¥ -ðŁĩ®ðŁĩ¹ # -ðŁĩ¨ðŁĩ¦ ' -ìĹIJìĿ´íĭ° ì¦Ī -ãģ Ŀ -âĿ¤ï¸ı : -á¶ ł -à¹Ģภļ -à· Ļ -ó t -yeg biz -y tm -world wired -wol ffe -wil lesden -wi od -wel le -vl cc -ushe rette -unis sen -un constrained -u pert -twoo fus -tu loy -tu ffs -tsu en -travel photographer -tra inning -tor ridge -tokam ak -thor gerson -thol land -the vinyl -thal mic -th bday -texas roadhouse -taxonom ies -talmu dic -synop ses -super talent -sumbasturtt ooo -sumbasturttooo sday -state ofe -ssi ers -soul is -smu k -silver alert -se zer -se hat -scots man -sat elite -san alytics -saddle brook -s mets -russ diemon -rspb norfolk -rspbnorfolk linc -rou bini -ronnie fieg -rio jaw -reic hel -rei ki -rare pic -r risd -quo test -qld premier -prow lers -pre ve -plant breeding -pic torials -photogra hy -pe ya -pat ro -over simplification -our planet -osun decides -oo di -oe dema -nkab inde -ner ang -music ally -more so -mon now -mod bury -mit sun -minim i -minic ar -min son -min dover -meto we -melt zer -medi bang -m chan -ly de -ludo vica -lovethi splace -love construction -lored ana -lesc aut -leonard nimoy -lee music -lawenforce men -lan o -lali berte -l do -kush n -krono squartet -kit ching -kimberley jwalsh -ki ddle -kan aloa -jossel yn -jo vem -jes see -je witt -jani kowski -janella salvador -jane eyre -it speter -in ie -il kay -id led -hus ar -h dh -goog let -go wers -glac iology -gil le -gi x -food guide -fol ke -fnb sa -fle isch -finger picking -f cie -dz um -dyskine sia -dundee fc -double ornothing -disfru tar -din kel -desig no -deodor ants -del ille -de veau -da ay -cut more -cub scouts -cook county -common weal -clwyd tweets -circe anna -chin maya -chilli da -ce dros -cat mint -carri on -buse ireann -braun stein -bobs redmill -bir e -belvo irst -bel ing -ban kes -b iti -autor oute -an ory -all hallow -al maj -aguil ar -af fy -adri aen -ad sk -ad me -.... : -ðŁĻĢ ðŁĻĢ -âľ ¡ï¸ı -zar o -yu uko -ye u -ww c -world teamtennis -wi jn -whit sett -wesle ys -watson iot -walt frazier -w bn -vin en -vi ggen -valley field -vak il -ut la -ump ed -ul ys -twee ti -travel deeper -topdrawer london -tiny house -till ers -thi stv -ten ka -tarta kovsky -tac ek -t sparks -sutt les -survi vin -sucess ful -stau ber -spra shanth -sonnen ch -sn itching -sm supermalls -sli vers -sla bajo -shun ts -seanan mcguire -scav olini -sc ake -saraj cox -sandy ford -sand fire -sal sas -saiy uki -rosemary shrager -rip muhammadali -ri ya -rhon dd -ren ta -ren old -reen ie -rec chia -re education -r ferl -quality improvement -pur ps -pull inger -pro lapsed -peta india -pe pero -pe ahen -paste bin -oun taine -oto ko -ni ver -newport folkfest -never y -music i -mu sina -mon twood -modular synth -mississ inewa -mcin doe -mari yam -mar os -mar ing -mand ola -macca bee -loe we -lo cash -liven good -le rena -lavo isier -lam bi -koo ser -ko leos -khush want -k lun -k cee -jamesh askell -ja afari -ithac acollege -ira sci -indy to -idu bbbz -huar az -ho plr -hit sugaya -hi va -her bo -han lan -ha sc -gre tag -grand baby -gor ls -gor aiders -geni y -gargan tua -full kit -flat lands -fel id -falken spotting -ezz at -extrac orporeal -en larger -eat slee -dor si -dev log -demon ised -dash board -dar bari -dan sa -da ij -d mart -d conf -cu bing -county gov -collo quy -cat boy -castig lia -calix to -calend ers -ca via -burn sday -bud gies -bs fc -brainte aser -br ata -book bug -bo ies -blue grey -bloomberg dotorg -birthr ate -bibli ophiles -bi ra -bi ggles -au rion -at ation -asmode us -apart ners -ao i -anz ca -antho cyanin -analge sics -am maasante -alone together -agrit erra -adel ica -! ðŁĴĥ -ðŁįĴ @ -ðŁįĭðŁįĭ ðŁįĭ -ðĿĺ ¦ -ë²Ī ì§ -ñ e -zlo ty -zel f -ze ich -ye agles -yam it -ya ke -wwt worldwide -wri thing -webber naturals -wc f -ur za -uof denver -underestim ation -un oh -troopingthe colour -tre mont -tok ina -thelittle idiot -the global -termin ologies -teas ley -ta kt -sw yn -strato volcano -spokes man -spectro gram -somo za -smo squito -sme ad -sm ta -sj susp -shim my -schin kel -salvad orean -sag ged -ru man -ridge ley -rich thofen -reyn es -repudi ation -reg no -re ade -pure gold -pier paolo -part low -oyster mouth -ottawa hospital -oster tag -osh kosh -om ah -o city -neuro typical -mull aly -mu larkey -mogwai band -michigand ers -mel ua -me ppel -me iz -mars global -mark richt -mani er -ma sat -luce scu -live ga -livega aresults -lind h -li zam -league one -lancashire day -lanc shospitals -la fd -kush waha -kri os -ko hr -kick s -kati ek -kar ad -ju hi -jodie whittaker -jha adu -jan sport -jackie morrisart -j angling -irish hockey -invol vements -ing peace -immun ologist -i yam -humber side -hu gz -heem skerk -hed vig -healing crystals -he yn -gü ne -guad ar -gor zata -galent ines -g dr -fresh meat -finne more -ferr arif -fer mi -feel it -faithe vans -facebook ads -ek land -echo esof -ec atepec -duke sof -digital nomads -diane sawyer -dhaula giri -denter tainer -david schwimmer -cy f -cruz ado -cor saire -coastto coast -clon curry -charlie baker -chao tix -cel ina -cavanagh tom -c ttw -business day -bur ki -buch la -bronchi ectasis -bro sius -bor Ã¥s -black gold -big ass -ber de -bel ittles -beauty chic -az on -ash p -arti fact -andrew bogut -alexandri av -ain hoa -a amo -:- )" -ìŬìŀIJ ìķĦìĿ´ëĵ¤ -ãĢ ķ -âĿ¤ï¸ı ðŁĴĸ -yoshi kawa -world pressphoto -work with -wonder swan -wildwater stu -whata view -water stone -walker artcenter -w pr -volu bilis -ver no -veebha anand -vag rancy -tumble weeds -tubabu yukustun -tri shap -travel gumbo -tor rente -tor por -ti sca -thel y -thebusiness show -temp tation -te gid -tann ahill -sweet life -sure shra -strep tomy -spr ou -spark ly -sonic fox -sombre ros -sof nature -sob tians -so gard -sla vica -sky light -sksk sks -skill sshow -sk top -simi on -sime k -side one -sfe ir -ser rate -senator cardin -se wanee -sco tian -sch leg -scatter brain -satoshil ite -sand town -ry dell -ronnie oddo -road sbrewing -rishab h -restaur ante -ren ounces -redar row -rachel boston -pter osaurs -psycho logies -poo bah -picture h -phrase book -pepp ino -p kn -ocal an -no bin -newar knj -nelson piquet -ndom bele -n pw -n nab -mount juliet -mondaw min -moderni stic -mo chan -mindbody soul -mindbody green -midnight madness -michael irvin -me dair -matt makens -mar ny -mag adan -lol rt -listento this -le drew -lam poons -ki goma -karlo slabajo -ka et -just inj -jazz radio -janak puri -is scr -il tm -hu mn -hin de -hef ti -han ly -han ayo -ha fa -go grow -gibr al -ger ace -gau t -from dec -freen hs -fr ann -floo w -fab by -easty orkshire -du pleader -dra il -dian eneal -di wak -davi dru -craz yyy -coulom be -concor di -cl unie -cho key -char len -cha erin -central pictureh -cc mv -cat fished -carloscon dit -buy black -butchart gardens -brin apalencia -bir cham -bi ff -bhagav atam -beta thetapi -beng tson -bell roy -bare bone -bancos antander -b horsetrials -as cents -arth quake -ar matures -animal sasia -ancient art -aloe blacc -ah music -actof kindness -acceler ometers -ac lock -aa ar -... ðŁĺĺ -ðŁĹ£ ðŁĹ£ -å¤ ļ -ãĥŀ ãĥ³ -âĽ³ï¸ı âĽ³ï¸ı -âĺģï¸ı âĺģï¸ıâĺģï¸ı -à¹Ĩ à¹Ĩ -ยย ยย -z v -yo wen -y endi -y bn -wood working -winder mere -whoo kid -walker stalker -vivic afox -visit orlando -vie wing -vertic ality -ve ille -van horn -up there -uof m -uf ford -to logists -the men -suppor ter -su amico -stele com -stefan molyneux -star z -sram road -spun out -spen guins -spann ers -smoke out -smith mp -sma kers -si sts -shan el -sh ales -segre to -seen onmy -scint ill -sche iner -sanlu iso -sakura gi -s ga -rutherford ton -rubber ised -pu asa -prayfor syria -port credit -pon ent -point break -pir sig -personal brand -peri winkles -per mit -ped lars -pam bondi -open wrt -ome body -odi dev -nov as -nott z -north face -nordoffro bbins -non standard -noki a -nishar awal -ninot chka -newss vc -neg aunee -nav ed -n sen -mytwitter anniversary -mumbai metro -move more -moon rock -minim isation -micro management -met to -memo ires -mcga hee -maxi on -ly cian -lovethi steam -loud mouth -losf eliz -lopes rising -limp sfield -like ability -lan ken -kn or -kir ari -kids games -kid problems -keala settle -karish ma -jo ongi -jin bei -jfl mtl -jamie chung -iw amoto -insec tiv -injury pics -ight club -ht delhi -hon ge -heck ert -han ai -ha iri -h music -gu ill -gru mbled -gra fi -gote ana -glo winthedark -gil das -fun dus -fred vanvleet -fre as -france diplo -fo el -fix edin -fas sler -faha dh -fabi of -f é -espa illat -en fren -el rancho -el nido -el arry -ee x -dro op -dontbuy aticket -dis believing -din nington -deray davis -dem ander -dash pay -crazy horse -cor moran -cold feet -clu bre -cloak coin -clay pole -clan king -cine rea -child lessness -chat ur -cel sus -ce dentertainer -car ris -cal fire -bun inyong -bt group -brø nd -bru hs -bring itback -borro wings -booster club -bli t -bho sale -bar de -bad ha -bach alo -aw oo -angelalan sbury -ana q -alm shouse -ald well -ad dae -acec ar -ac ats -= ))))) -ðŁĴ ¾ -ðŁij¨âĢį ðŁĶ¬ -ðŁIJ ¡ -ðŁİĬðŁİĬ ðŁİĬ -ðŁįªðŁįª ðŁįª -âĺĿ ðŁı» -اÙĨ ÛĮ -yu a -ys auce -yaa dein -y nasty -xmas jumperday -x ende -wkc dogs -win tle -westerni zed -welcometo fife -wearable art -vol f -v orders -unborn livesmatter -un inviting -ultra chat -tyn drum -trump taxscam -troeg sbeer -trave sties -tom ove -time suk -thisweek abc -ther uf -then asem -the blues -thatcher ism -tender foot -teacher training -super cili -stol per -stif les -ster rett -sta el -spl endo -space walks -so zo -so be -skelton sophie -she kar -shaw sheen -shar bat -scienti sm -schoolo flaw -sand nes -sa stry -ruby tandoh -ru sal -roger bezanis -ridge view -r ttowin -r nu -qu ach -q esh -pv z -pol ster -physio logically -peter kin -pe prally -pat ar -paci fying -ou gars -om n -olu wa -of thel -oci ation -oat cakes -o ja -nw fl -no stell -nhsc trust -ne utdfc -nbc sandiego -nar ges -nak aka -myri am -monte jo -mis ael -milak unis -mero ving -me hi -matte son -mathiascor mann -mal content -mah ana -ma zzi -m xc -m rad -lou sa -lob sang -lind asu -liat ris -li jk -ldn ent -lamb dal -la har -kres se -kra z -kot ze -kathe vans -ka than -ka det -jim cameron -j achat -iso topic -iow acubs -inthe usa -inspira si -ici onal -ib tiss -hoursof spa -hou gaard -homin ids -home makers -herz berg -hello ooooo -han am -hamilton ians -hal lux -h mis -greeng ables -gr itti -glyco sy -gl ace -gabby logan -frank town -fb nation -fazak erley -exti rp -en cwx -emiratesair line -emili op -ell ac -dolant wins -do blo -disbur se -devi ates -den cia -del amar -de aries -cor ton -colo colo -codi fy -christma scards -by word -bryo phytes -bro g -boath ouses -bare illy -baldri ge -ar field -anc ook -alway sab -ï¸ı âĻ -ìķ Ī -åIJį åı¤ -à® ľ -zap ier -ys london -x bit -wy kes -wsc atlanta -work flo -wool loongabba -wied lin -wake ful -vitru vius -vijay awards -vel ive -van ss -tur ri -tokyo pop -the pretty -the orlando -that sthe -team c -t zy -t byd -sun catcher -stephen colletti -stal inism -spag nu -so tis -snowmob ilers -shop my -sho ward -she kel -sharma bjp -ser zh -scru mv -sat un -sas one -s los -s line -s bt -ru ski -quarter finalists -quand t -pun kt -pp an -pin acol -pepper idge -opti ks -officialtf gm -nottm playhouse -nor dan -no ter -newtech network -naf t -n mmu -multi beam -motor ing -montesqui eu -minof culture -minofculture goi -mime sis -micror nas -mi ani -mazz anti -masa an -mal bork -m wak -ley green -le ther -la ging -kurt schlichter -ki ke -kal ona -ju dai -janele eves -jale el -itv westcountry -is ci -inthe box -impu dent -ih re -iamking promise -hy pixel -hugh i -hau dio -han kerson -gru sin -grand view -gra vid -godd d -go puram -gas sy -galactic elliot -fra ger -fow le -fon er -fest spiele -fandom btsarmy -esc aflow -dispropor tional -des barres -den ker -cred ito -cr ite -consu ls -cl aman -chimpsin socks -cheer up -che shirec -charliebaker ma -chang kat -caleb shomo -bra sh -bor ra -black work -bharat bandh -bha d -bell let -avi vauk -atra ircraft -arvid sson -ano d -anjun adeep -anim ate -angela white -alco pop -ade en -ac coya -" .- -ðŁĴľ ðŁĸ¤ -íķ ł -ìľ¤ ìķĦ -åĽ Ľ -âĿ¤ ðŁIJ¾ -ൠį -़ ा -© × -zan aco -yw pd -yu va -y rian -wood works -we stor -wak an -vel iko -vanguard ngr -vanguardngr news -vanc leave -un learning -uk crafter -uih lein -tur ay -tum mel -trelaw ney -tour nee -tho ckey -therealt boz -thereal mattkemp -te un -ta sik -swag gg -steph end -star ring -spe ace -souley mane -soo o -sonic forces -sinful sunday -simp er -silli er -shop uk -shon ibare -shay kh -shan kha -sham shad -sever ally -sef covic -se ow -scar is -scale bound -sandi acre -salty ard -ru ta -ru gosa -ronald say -rn wn -resusc itating -ratche tness -ranc agua -proudto bean -propor tionately -posh mark -plu tus -petro ff -peter gallagher -pers ico -pas crell -par amo -oun ion -orgreave justice -oar sman -no iz -nca avolleyball -nca atennis -navy seal -n lex -my scar -mor io -minn ich -mil aj -micro tia -michael jackson -ment is -mein en -matt bennett -m qi -lub wx -lo tan -leo burnett -legalize marijuana -le scu -kuchi ki -kon omi -kha sh -key amo -kel y -kare em -kal vin -in humanely -in coming -iam sandraoh -hydro electricity -high wycombe -her dsman -hel dt -healthy habits -hand printed -ham re -hait ink -guter man -gg davidjohnston -finger hut -fel tbicycles -euron cap -er and -emu fb -ed din -dran ks -di wata -desro chers -ddin shah -dayton flyers -dam ed -cry onics -cream tea -chev rier -che wy -castle berry -car leen -canni zzaro -cal c -cadi gan -buddy hield -bor rero -bn ppm -blove is -beast men -be fi -bash kor -az ed -audible uk -aten cion -asab fb -ant sy -andri us -ana am -allen ge -ag onies -ag ian -ad dax -actin ic -ach ats -acci dente -* â̦ -) âĿ¤ï¸ı -ðŁİĦðŁİħ ðŁı» -âĢ ¥ -Äį ek -yoo hoo -yar wanda -wo hn -wi mey -warren dale -waja hat -vidy ape -uoft medicine -unct ad -un scramble -tri fid -travel ph -trade deadline -top starnews -the ophile -terror tuesday -tan imals -subscri bes -su chard -stone cutters -stev elu -star darshan -st mark -southpoint lv -sin fulness -shi bley -sher lyn -shepar d -sham o -sentom cotton -seems legit -secre tof -school snc -sche ster -scam era -sar ny -sal tal -saint anselm -s wn -raf fi -pu gh -proudto workatbmo -projec tre -pratt and -pm ct -pie za -ph m -peten ajarian -peop lemw -pentag onal -p wt -om pt -old spice -ol au -nyu stern -north park -news journal -new sen -near by -nas lofficial -nag ase -n gh -mor th -moder nam -mi len -melissaand joey -meli odas -me cham -man zar -man asu -ma br -m roz -ly u -lili enthal -kyo suke -ku fr -kra viz -kk c -jäger bomb -julian marley -jrr tolkien -join aap -je pang -jam ar -iv ri -in most -il ys -il ok -i give -he ymo -hak ko -h tcu -green skeeper -gravity x -gol dies -go inghome -gh arib -gart side -gab ru -fly y -fil by -fi dan -fet life -fay ad -fant ino -eno ir -ema son -em itchell -eli p -el angana -ear thers -dun igan -dor f -do j -ditt mer -dex po -cre aky -corri mal -coraz on -con fab -chang an -cha amp -cer vi -caer u -bur le -bull ington -bry anna -broom all -blo ks -billy porter -ben koku -bell ringing -bel ou -be informed -balu arte -bad sha -b surveillance -b gi -atasco sa -armend ariz -ake ley -ak ers -ag od -ag grandi -af rc -act itud -abe sigye -aa fia -? ðŁĺľ -ðŁĺĥ âĿ¤ï¸ı -ðŁĺĤ .. -ðŁķ İ -ðŁĶ¥ ðŁĴ¥ -ðŁ¤Ń ðŁ¤Ń -ìŀ¥ ìĿ´ìͽ -ìĽ Į -ì ¦ -æľ ± -ãĥ¼ãĥ IJ -âĨ © -à¹Ģภģ -world alzheimersday -wine review -willmott dixon -welcom ing -warri gal -waifu wednesday -w acs -von ian -vinyl collector -valu eless -tvguide magazine -tru eee -troy aikman -trap soul -ton ature -tic toc -theti den -theroyal opera -there bel -thekings fund -the feed -that swy -thal f -team tuesday -team psg -te bogo -talis manic -swar na -supriyo babul -sulay maniyah -stubb ington -straw man -stoudam ire -ssel berghe -sp ak -son amo -sm ic -shack ling -scott k -school trip -scandal ously -ryu junyeol -rukh sana -ri sin -reic hard -reflexi vity -red lines -raim undo -r ki -r kg -r ills -ps j -pre ndre -pra dera -plat in -pir atical -pig nat -picke ters -philippe gilbert -ph um -pe otone -pap olitics -pap ad -padmash ree -p sms -over stepping -osu v -ooster beek -ocam l -o izo -nc po -national pastaday -nat aly -nan kana -nag ari -n fum -myco toxin -mr h -mo ayush -mitch gerads -mis uponus -mike j -mendo za -mass generalnews -mar kes -ma kinson -m sy -m ll -lu u -lin gotto -light itup -lie bes -liciou sto -le pper -le compte -lady tron -lac aze -lab corp -ku rien -kle infeld -kin nard -k sp -japanese chin -j williams -is b -ine te -ima am -hong seok -hell yes -health food -ham med -h bogo -h barnes -guer cio -gi puz -gal is -g tc -futureof mobility -fu miko -fre jus -france sinha -flu mes -fal am -entreprenu ership -elek tronik -elast o -ed widge -early risers -dutch nat -du breuil -dont panic -do xy -digital divide -di ack -deuse x -de it -de cle -dark matter -dac apo -cow pens -conten to -coach d -clackmannan shire -cin zano -chin y -child safety -cc stca -castille jo -bo jonegoro -bmw champs -bio engineered -big dayout -beer advocate -baycity rollers -bashkor tostan -band master -ban sal -bailey sprize -bag nell -avo ices -august ine -atu cker -at avi -as kincare -ari v -ari ana -ar ten -ar pad -anne tta -angi olini -ang ini -alex ail -alber tan -agor aphobic -ago g -acar r -ab ration -ðŁijIJ ðŁı¼ -ðŁıħ ðŁıħ -ëĵ ł -ê³łë§Ī ìĽĮ -zoo sk -zam in -z eca -ysrc party -wux ian -wonder lust -win fromwithin -w chl -vanhoo ser -van ak -urbang ardening -twee zer -top speed -toi fa -to ghe -tic hen -thesam icallihan -then bhd -the plac -th ate -te sl -tar kowski -swan ee -sub plots -star ac -sse m -south church -shet ler -share thedream -shar my -shane helm -shanehelm scom -sham sher -sh amy -sewing bee -sen o -security council -se tif -se ap -sco bar -sand alphon -rosen gren -ri ina -pro pa -prime performer -pri d -pod cas -par mley -par ise -pail waan -open jdk -op lus -on hot -obi dos -oak v -night club -nec primeperformer -national nappingday -nadal ind -mush taq -mure san -mo dan -miln row -mil ing -meyer land -marang oni -mal ope -maje sty -luci ano -lobo tom -lean or -laro ja -lab and -khar al -katie qlowes -kar adeniz -k beauty -jon ty -joann alum -jiz an -jak elong -it railer -is sou -indie gaming -ill ero -ile v -i sho -huguen ots -hr block -hoch schild -heart this -har bisson -gu zheng -gu li -graven ey -go stags -gno sticism -glasgo wc -gc punknewwave -gar field -for c -foodre volution -food mag -fle sch -finan za -fin ning -fieldof dreams -extr atropical -estadouni dense -est il -ero ski -er mer -election pakistan -el mes -eh c -ed ar -e tec -donnell rawlings -don kiss -don avon -dil raju -den mead -dar le -dal um -cyber goth -cra ige -cow rote -cortel you -ci flacs -chir stmas -che in -challenging stardarshan -catholic newssvc -calvin ists -c xr -brou weri -bro sse -bir gunj -big wig -ber lage -bell oni -be ze -be sting -api er -anat oli -allo tt -ali ko -alcon bury -al ver -adobe symp -ab rin -@ _____ -ðŁĺŃ âľ¨ -ðŁįĬ ðŁıĪ -éĻ Ī -æĿ ¨ -ä¿ Ĭ -کر ÙĪ -» ðĿĹ -zi bo -wrp stoday -wey bourne -wbc baseball -water town -vo lei -viol ino -vers ation -vend itti -vee redi -value walk -valky rie -tü v -twick enham -tweetyour seat -tra ven -tow yn -too ie -tmr kt -tin sider -thereal stylesp -the quietus -talis ca -ta aa -suppor ts -sun omiya -su el -stru tters -stpaul saints -squirrela ppreciationday -speak up -sour cing -so rell -smee th -sle zak -singul arities -simul ink -shor ne -se iner -se gan -sawak ened -s was -s enger -ru mi -roman ized -rin der -rhy d -rayne spark -pushawards donkiss -pu yi -pro max -pres anctified -pou rover -pom bo -pi kappaphi -phe l -perver sely -patriot sawakened -o canada -nil an -namak kal -nam ja -mull ery -mt cc -ms ss -mol ls -mil ner -mi datlantic -mend on -medic aleducation -medi acon -mc nichol -mb raves -matricul ated -mat thu -marcin iak -magic weekend -ma assen -lun amaya -lu skin -loc all -le ury -lawn mowers -kum bia -ku wabara -knap ton -klo veradio -kizz abesigye -kirkby lonsdale -king e -kap ar -kalev ala -kad ay -k me -jumu iya -joey kramer -jhar su -j nc -ittf world -invinci ble -insinu ated -initi ald -indra prastha -ide e -ic v -hob goblins -harrogate hour -ha ab -gu lab -green party -god des -gir ouard -gb ball -gas pe -funny bone -fore sti -fla k -fin back -fan tome -fairfax county -fa ecal -f mtv -eli zed -el khound -eeve elu -ec lo -dur ley -dun ord -dublin pride -duba iland -drainthe deepstate -dpc dsb -doun reay -delight ful -del mon -daf trucksuk -crê pes -cruci form -creati va -countyof gp -cot trill -corpor ately -cooper union -chi ayi -che doke -ce of -catul lus -capodi monte -callum smith -bu cheon -brun elle -bren a -brand l -bis sell -bis cay -big dreams -bha gira -bearcat nation -be tw -bau dry -bath wick -bangerz tour -att lers -an tum -ameli ar -all am -agelim it -aga pe -ag l -ach ari -abstr acting -a hini -( âĹı -ðŁİħðŁı» ðŁİĦ -zo boomafoo -zeetv jodhaakbar -wur d -woody harrelson -wol bachia -white way -we ma -wash dc -walker hayes -w assim -val orem -v atika -us vi -turkeye lections -tro binson -thegreatest showman -the oscars -the core -telegraph news -tarheel nation -tar ge -tan it -ta zz -syd ni -surve il -sul fites -sub soil -str m -sten nett -sonthe hill -so sick -snorkel ers -skit ouring -showyour stripes -sh kar -sexu ales -se alift -scifit v -same sex -s mag -royal jordanian -rou k -rosen heim -rosen ama -rosenama junas -ron quillo -rock solid -rit zy -re orient -re negotiating -r atta -prote aceae -pronoun cements -pp s -plot lines -plen itude -on p -oliviap alermo -oakland county -northeaster ly -nikhil chinapa -night cliff -nic oti -next topmodel -near buy -nas ution -mote ts -mill woods -migun amig -micha elia -mi kazuki -mez quita -mar ls -mar lee -magicmike xxl -ma gre -london calling -lo wit -live phish -lies matter -li viu -larry king -land use -kristi ana -kib bie -khu lic -kavanaugh now -kassi us -inked girls -ic gc -hughi efury -house sitter -hon asan -hir ingnow -helg ason -hear ty -head stall -hartford courant -hang leton -ham lett -halton police -gro es -griffon ramsey -goulet pens -general isation -fore stier -fi ere -event prof -et ats -et at -et ags -eric thomas -embroide rers -el sner -eet ings -easter island -depu is -delhi ites -dan brown -dal riada -cosmopolit anism -con cious -colling wood -cl at -chinese medicine -cephalo pod -cdn press -cau stin -bull frogs -bruno tonioli -broad cloth -bombay bicycle -blood brothers -bic ultural -beren berg -ber ro -bd smovement -bar in -augu ay -ash es -ash combe -aschaf fenburg -ar groupsuk -app l -ap na -annecy festival -altam irano -aj w -aga inste -abster go -ðŁķ ¡ -ðŁĶ¥ ðŁĴ¯ -ðŁij¦ âĢį -åĭ Ł -ãģĹ ãģ¦ -âĽĦ âĿĦ -à¹Ĥà¸Ľ ร -à¹ģà¸ Ĺ -youth homelessness -y da -whid bey -wat onga -visith ampshire -vi rion -vg com -vel ux -uri en -ukcrafter shour -tur ville -tur rican -tsong khapa -tourdecor se -timber ners -tier no -ti rl -thirty something -thermo plastics -thelo af -tb q -tal aash -ta kuma -swan son -superbowl xlviii -spencer boldman -sort sintl -sleepyhollow fox -sla vik -si dro -shet terly -scroun ged -san mate -safe haven -run du -ruff ner -rod ina -ride ox -rep ens -rec chi -re zeki -prophe tically -plan um -ping ry -parrs boro -paraparau mu -p cori -or rinhatch -olive tte -oli vella -official blue -of ashion -nush rat -nun an -nie man -ne rea -ne grin -naq sh -nant garw -na hlhockey -na anum -mycause my -my journey -modern warfare -mitt agong -mis appropriated -min der -middlesex uni -micro tubules -mgmre sortsintl -mer na -maru game -malm strom -mait ake -macmillan kidsuk -lemon is -lance field -kra g -ko sty -ko li -km fm -kad aga -kacz marek -ivel isse -iti er -inter bay -intelli j -in sou -ili um -i imc -hrtech world -hoo fer -hit parade -hill crest -hapand leonard -hair growth -hail stone -haha aha -gurun anak -grac ed -gemini ds -gd st -gal v -for umb -flo tte -flash man -fl outed -fent on -fe tters -family goals -fa wnl -eviden cing -escal ada -em j -el r -eff lorescence -di ant -dev lin -depend ants -death ly -dark and -d bo -crimin alizes -crashed ice -cor robo -cop us -cm chat -ci ot -cast en -carlo sainz -british pieweek -brad wall -bor on -bird shot -biomole cules -bi bby -bestteam in -balle tic -bagat sing -bac ton -au ghtme -at the -as afo -ar ness -aqual ad -apit alist -anu media -americanc rime -ali ah -aldub thering -air worthiness -aegon championships -abu il -aa aan -ðŁĻĮ ðŁĻı -ðĿĺª ðĿĺ -å¤ ª -âĿ¤ï¸ıðŁĴĻ âĿ¤ï¸ıðŁĴĻ -âĺĢï¸ıâĺĢï¸ı âĺĢï¸ıâĺĢï¸ı -âĬ Ļ -à¹ģภģภ-zyg munt -y ula -wy lie -work space -wild scotland -weather tech -wean ling -viz quel -vit olo -vi gg -ver day -usu l -umich hockey -uk health -ty pennington -ton et -thisis fusion -ther saorg -the wee -the village -tele conferencing -tab lature -sv vsd -sun burns -sul tra -star my -spring isd -spat ter -smac cus -sku ld -sizz lin -sin space -shu ji -sfor you -scol lide -sche ana -roth gar -roo ke -rohan mehra -radi oman -rach els -ra ditional -que star -pra des -post secret -pon dy -pi lea -oto scope -ol kata -official sslazio -of books -ny jv -nord berg -nice attack -nax alite -nar ducci -nad asurf -n sula -my babies -msh sl -mom of -moist ened -mit r -min di -mid wales -mel ena -meg u -me urer -mayward for -margare tho -man ov -mal ouda -mah ra -mackin lay -luxor lv -loun gers -lo pers -lim pid -ligab an -ligaban comermx -land wehr -l alive -kumar u -khulic hana -kho si -khaz anah -kell am -jewer ly -jenniem calpine -interven tionism -ini sti -in volu -husky pride -he tt -he aver -harri sfaulkner -handmade jewellery -h laudi -gü nter -guadar rama -greeting card -goo dge -glen ns -ge tb -gann icus -fun ck -fountain sabbey -fficial page -fa thy -escut cheon -eric ans -emb erton -ei der -ecor nish -dj ze -dj david -dil bar -dia internacional -deob andi -del ice -dej oun -degre esof -de mountable -dang le -daffo dil -cp gs -corre os -cocc inea -chub buck -chic lana -cassad aga -bul lock -bu erk -bru v -bom ar -bh vr -bass rush -ban kon -ax ons -all inthe -aleu tians -agar nier -af und -act for -ab ct -a septic -ðŁĶĿ # -ðŁĵ ľ -åĴ² èī¯ -âĽı ï¸ı -âĺİ ï¸ı: -âĢ¢Ìħ _ -ص ÙĪØ±Ø© -ин а -zel jko -your plate -xylo phones -xu an -wire uk -w kc -visit norway -vann elli -tone bell -to car -ti gi -thi el -the tachi -the doctors -teryl rothery -tauto u -sunsout gunsout -sunday live -sun od -su chus -st mun -sou li -sn ts -smom entum -si saket -sfra hm -sean sch -scott adam -sch ank -regin a -recycle sday -ratche t -rapo so -ram page -prof david -ppsells babyparts -policy maker -pol lex -plus blogs -pion ate -pe avine -pan ache -otta war -os by -or be -npa ie -neapol itan -natural is -nar r -nal im -nail sinc -na thuram -n lg -moto red -montan astate -meik le -marqu am -ma whinney -lu ria -loyol amar -lone some -live aboard -lection fraud -koval ainen -ki anand -kath imerini -kar dia -kad av -jur ra -jugend stil -jim parsons -ji ye -ji goku -janete van -jackierobinson day -ishin omaki -indu sind -indiant ellyawards -hus n -ho din -him zahawi -hel goland -hal mahera -hack neye -grind time -granul arity -gon injas -gobel ins -go pa -gab led -fu ke -free bets -fra bbits -fior ucci -fam z -fake facts -express js -every corner -euro scepticism -eu karyotes -es w -erik solheim -ephemer is -ellen ville -elec ciones -eg ner -dundru mtc -ducati uk -du stria -dou ge -den nys -demarcu sware -del luk -deduc tibles -decade of -debash is -de muro -cumbri ans -cor abi -con ures -col ter -char ri -ceremon ially -ce tin -catar aqui -casc ina -cas eros -carrauntoo hil -carr aro -capitul ated -brown coats -br cnews -bong bong -blood root -bir bhum -big dog -bi gr -be wafa -bar gy -awe som -au zon -aspho del -arro el -ar ace -ann erley -al annah -ah jussi -ag op -aber rations -aan and -ðŁĻıðŁı¾ . -ä¹ ħ -âĿ¤ï¸ı âĺĢï¸ı -zen kmm -y the -wood z -wood burner -wol fin -wic cans -who p -wetter ling -wer ki -wel len -weid ler -wartho gs -virtu osi -vi aj -veteran sday -utre ch -unicorn day -un seasoned -un mas -tu dela -tre acher -tou rage -tororosso spy -tit res -thi g -thelon gest -the budget -table tennis -supt king -sub structure -sri devil -sridevil ives -sridevilives forever -sportac cord -sloven sko -sha shan -sequ el -senergy drink -sal vac -sal guero -ryandun gey -rter ugby -rou st -retin ue -reti rez -recre ationally -q bl -proco pio -pro digi -pri matologist -pram ukh -phobla cht -pets alive -perver ting -personality disorder -paulo grady -pat chen -pachu lia -p drc -over step -oneof ourown -now all -new show -nat aly -nasag lenn -nanomat erial -nan ing -monast icism -mohandas pai -mobile al -mo yn -min ju -mh clg -medi us -maracan ã -mac m -lur d -loin ie -lobby day -lil ya -les b -laer dal -kyle brandt -ky naston -know thyself -kk k -kenner ley -ken ichiro -kemer ovo -kear ly -juli er -ioc prev -insu rable -industri ally -indian ad -in ot -i play -hur ford -high park -heine mann -hay akawa -hann elore -gol dglove -gi lets -ge ph -fun mi -free india -fowl kes -foresth ills -for ap -for africa -feelthe burn -fal guni -es man -eni ola -e special -dis contented -de personalization -david the -dad aist -con ow -clow nish -classic horror -cj leblanc -chri sf -cho dron -chee siest -chau sson -chan dos -chall inor -ch ado -canter o -candre va -cal stock -cad avers -buon arro -brandon heath -bra hm -block ades -ben ayoun -bad ab -ba artman -b girl -assisted living -are op -anast aciam -amusement park -amath us -alec bradley -ab dal -ðŁķ Ŀ -ðŁ¤Ļ ðŁı¾ -ãĥ ĸ -à° µ -௠ģ -zsas z -z ok -yoshim itsu -ym x -wj bf -wella pro -we aried -wal kal -vital signs -vini fera -urock radionet -tvweek mag -ti ii -the viperroom -the gift -the festival -the angry -te ds -tce lectronic -tai k -super collider -stü ssy -stre ats -ster ritory -stat ev -ssi one -spar xxx -space invaders -so ini -sheep adoodle -sexiest manalive -semper fidelis -sec ant -se sotho -scol aire -sal onica -sa repta -s monday -ry de -ribble valley -re ssed -re deploy -rail pictures -ra sm -q ag -potat os -post lethwaite -pl iner -pd news -parli ment -park boyoung -or ito -opp ermann -ooster hout -official donegal -nr ms -nor walk -nin ak -nick swag -nad himzahawi -na ho -n á -mt pa -monet arily -mo tac -miss vogueuk -mi amis -metr onews -mc curtain -massey ferguson -mar azzi -man liest -mame tro -mag si -mac alister -lu bez -lo salam -lie shout -legen ius -l wow -kri korian -kan zaki -kam pu -ka ther -ka ida -joss elin -jo su -jes shar -jeff erys -jdr f -japan gov -jackolan tern -j gi -itscold outside -intellij idea -hypnoti zes -hur u -hub bert -hu zoor -hu sen -hondac ar -hill i -har leys -h wv -gu se -grin berg -glu on -giant games -gi ously -ger hard -g gh -fre eness -flor a -fleet line -fit forlife -ev ak -europe echecs -el op -dor sa -deep veer -decem bre -david burtka -dave meltzer -ctb ase -cru ll -crit care -coron ado -coachtom herman -clark university -cityo ff -ci fa -chin chin -changeagent sa -catherine tresa -cate che -cas ula -cas kale -caroline manzo -bull riding -breck in -boving don -bot kin -bon ner -bo ie -black welder -bi yani -begum pet -bbc spoty -bad guy -ay tas -atv show -as ml -art deco -apod aca -am aa -alu z -ake sson -ak sy -ag aya -aero tropolis -ac ire -ac d -a ang -! --> -ðŁĺĺ ðŁĴĺ -ðŁĺį ðŁĺĪ -ðŁĶij ðŁĶij -ðŁİ¸ðŁİ¸ ðŁİ¸ -ðŁįĤ ðŁįĥ -âľ µ -Ùĥ Ø© -ع Ø´ -é l -youre ye -yacht smen -x fire -writer life -wilmington nc -w ne -vv pat -vroom vroom -visit richmond -v cc -untam ed -un accustomed -tusk ys -to eat -thom astur -theatre news -ter amo -taq iyya -supper sunny -sue anna -stan doff -spi key -sp uppet -solit ario -sm itt -sic ard -shurtle ff -sell wood -scout scanada -scott age -scien cel -rudolf schenker -ring sidec -ravi shed -pride seeds -popul arizing -pin elli -pfe il -pe skin -pav oni -patric ian -over doing -oli sa -of arevolution -od ley -nut case -nu us -nu fbfamily -nou ll -nor df -non committal -nin der -nil sfrahm -nes see -nc isla -nation scup -n ment -my army -mon naie -min oo -micro aggression -mechanic ville -mcl ane -mam mill -makeupforever us -ll nl -larcen ciel -koni shi -ko tto -ko sk -jiha di -jezz ine -jewish chron -jeh lum -jam rock -jack fish -hw ys -hoy les -ho el -healthy ireland -havan aclub -hate story -hash t -haiti en -gwal tney -gun fights -gre han -go wings -gha ith -ger vase -gemin id -ge u -gal im -g ct -fre chette -fr yn -fight stick -feltrin elli -fast car -en hor -el pais -ec bc -du bonnet -dragmedown musicvideo -drag ali -dou bloon -do eee -di ks -depon ia -dece m -deal z -davis jr -david suzuki -dat ar -dan agould -damekelly holmes -d hun -cycl onep -cur sus -cra pped -cool runnings -conden ses -coco abeach -co ie -bur ghs -boy ata -bound forglory -bor stal -bo bin -bin ley -biblio graphic -bethe sd -bel fer -beg awan -bbvacom pass -barbap apa -ath let -aspher ical -asic s -art smith -ang ely -am ancio -alway son -aero tech -adul terers -ach inery -acclimati se -ab util --. -" -ðŁĺĺ ðŁĺįâĿ¤ -ðŁİĢ ðŁİĢ -âĵ Ķ -y anti -xx music -win don -visu ali -vid mar -vic is -va ad -urbann ax -un sr -ukin theusa -thisday ing -thewilson center -thereal b -the pink -tape o -tann ersville -takam ina -ta isuke -t soi -sylvan us -super humans -stu ckin -simel ane -shu ddle -sex scandal -seriou seats -sa official -s alive -ruz icka -royal freenhs -rosequ artz -roo tin -rock box -robert m -realm royale -real remyma -rawn sley -radhi ka -ra ee -puppete ering -psych ical -pro positioned -prick ly -preacher amc -pr z -poshan abhiyaan -playbook athlete -pim enta -peri ence -penn sboro -pen cak -pb ks -panch ali -ov ando -ou uuu -ot ch -op r -onthe farm -ong kong -ol szewski -nj con -nas sa -na ag -myhouse idea -mtu hky -mm ilive -mentionsomeoneyou rethankfulfor -meg acon -mann ino -man field -mal ins -mal alay -m itic -luv vie -lu to -living uk -let my -led lights -le zz -la ves -la er -kroko dil -konicamin olta -kir mani -ker mes -kelly hu -kam io -k wei -juego de -jim henson -jan netty -insider tweets -ine us -in chon -huck berry -horseback riding -her ault -he arer -har uki -good wyn -gon zi -gil ardi -gaunt let -gar lock -fur ni -from me -fle xbox -fiore tti -fence post -fac ed -e board -e anes -domestic violence -dissoci ating -dem u -de briefed -davemeltzer won -copp el -com tesse -cle lia -chiropo dist -cate ley -carlin i -can ongate -caed mon -ca thal -bru d -brett cateley -bran sford -book qw -black street -blabber mouth -bi gup -ax illary -auto gly -anan sie -an wr -an ax -amblyo pia -amar deep -aji mobi -air show -aesthe te -ad oes -ac loud -ab culture -ðŁĺĺðŁĺĺ ðŁĺį -ðŁĮ Ĩ -æĺİ æĹ¥ -åģ ¶ -âĻª âĻªâĻª -ÙĨÙĪ Ø§Ø² -yr self -youss ouf -ylon agarcia -yeee haaa -xl center -xende sktop -wl k -vote sforwomen -volk man -vo ssen -union bank -unicy clist -tro is -tri ppe -tr b -ton kawa -tin su -three words -thom an -the wave -the party -te ann -tarahu mara -sy lum -swee thome -stick in -steep ing -stavro pol -sound transit -sophi atown -slike these -sk n -sk ille -simply santafe -simon parkin -si pri -si dero -si benik -ser dar -sch ronicle -sander stead -sabah tourism -s thorpe -s ates -ry sselberghe -red way -rec tus -re ba -ravi pudi -ravens thorpe -rath more -ranfur ly -rad itya -ra pra -ra pacious -quan zhou -prinsen gracht -photo ed -phon on -phenomen ons -people smosquito -pd mf -pdmf nb -particip a -par malat -papp ano -palaeonto logist -oli var -ol ink -o fu -npr freshair -noe mie -niç oise -ng tindia -nc statec -n toko -mun tashir -ml bn -marches afashion -marcel hirscher -macgy ver -mac chia -lung fish -leh to -kon tiki -kk as -ki pro -kerry on -kendra para -ivan ovich -inte gra -hirsch man -hin tze -hemi plegia -har ned -happyhappy labs -hanafu da -halam adri -h ure -greece central -gra gson -goodby enewton -goodbyenewton trees -go with -go scots -go cubs -gb x -football museum -fly boy -fil enames -fearthe fin -fast web -f muganda -ext ents -eure kalert -escaflow ne -erra zu -ero bbins -entourage movie -enni es -ea fifamobile -dur utti -dri se -dimp led -di ard -de coloni -de blois -dak shin -crink les -cra ving -chak otay -casano vas -cancer uk -can id -brin sley -brian stann -bravest warriors -bobb ys -black guard -bay anis -bassen dean -bas eload -bar si -bar ato -bac onf -aw ong -aru iz -armad afc -ap rice -ang ame -and aman -an ani -algar ve -acar on -??? !!!! -? !!!!! -:) :) -..... !!! -**************** **************** -ðŁij§ ðŁı» -ðŁİ ı -ðŁħ°ðŁĨ ĸ -ê·ľ íĺĦ -ê³ ¨ -âĿ¤ï¸ı ðŁĴĽðŁĴĻ -âĿ¤ ðŁijij -اÙĦ رÙĬاض -yumm my -yi fang -yas ui -xx s -xer oroadshow -white knights -watch on -w wh -var key -v ril -ut kar -ushl draft -us x -un enforceable -trekon linegame -toiv onen -the bear -th sc -tex ana -tand ang -sw is -sun gazing -suha imi -suf fused -subb u -stgeorge groves -stephanie sheh -stell arton -stel ton -spur pose -sp fc -som pting -slush hq -shu dders -shor rock -sh ring -se belum -sclero tinia -sav ban -sand ham -san ral -sadi ya -rv g -resilient cities -repre sen -reha shed -re spu -ran ee -ram rahim -pur ani -profli gate -pride chs -pretty boy -photo grams -persian food -pen men -ori ol -or ale -on ii -ome where -official allegri -of riday -oak bay -now akowski -nick mangwana -nep tun -nd lea -nb fc -nat ale -much ly -most beautiful -missal ex -mis sl -mass roots -marqu art -man oh -lu hh -london winefair -loe ws -live it -launch pad -la senza -kin nick -ker inci -kel k -kar lov -kan oa -jec t -iw lca -is ya -invent ory -institution alize -ine w -incre el -ifyou can -house judiciary -hoss ack -holroyd howe -hil ditch -happ ier -hammer son -hail mary -go ward -gm si -glo fish -ghot ki -gh im -ger ges -gee kin -gav increel -gal ov -g mu -fortean times -flyn as -flesh god -feis al -fe well -fareshare uk -extra dition -eu funded -es ame -eras ure -dy ah -down light -do ki -do dgin -discover the -digital print -desau tels -deloitte us -de ports -countr ys -coo ee -commu te -cob ber -co pai -cli ente -choo sen -choices ong -che ska -chalk paint -cele stin -cathedr ale -car leasing -ca vil -ca chaca -bé la -brum mel -box ley -bour goin -bot swan -bongbong marcos -bon te -black field -b ville -az ette -autonomous driving -au ob -are ynolds -anu grah -andre wro -an ter -an se -an m -alap ai -al mand -ak bars -ah scult -ah ine -aglew ings -af feldt -ae g -ad ush -action uk -abscon der -! ðŁİģ -ðŁijį ) -è İ -ห ล -Ø ¤ -zing t -x tension -ws ferries -wo yz -will ers -wi an -walpur gis -wac ket -w mt -visit dartmoor -vil na -vi mala -u eli -tougher together -tothe max -torin ofc -thi ong -theris enation -then ic -tammy baldwin -synec doche -swanseab ay -sw ingle -strath peffer -steadi ed -ste arn -ss afety -spo well -space shi -sou live -son s -social ism -sec nav -seapor tmrkt -seabir d -scra pp -saf fold -ro pical -rmh c -ric eless -ri sp -red sky -rath aur -ram ban -race check -princess of -pressuri zation -porsch ec -plun ket -pavlo vic -paracel sus -or go -oo chee -om oon -obstetr icians -nushrat bharucha -ni fe -nes golf -ne reus -nd preps -nar n -museumc ats -montpellier hsc -mont one -meddle some -makin en -macro scopic -m dd -ly oness -locum tenens -lee ching -laurit zen -kü n -kaw ara -k gaf -jurassic june -jk jk -jeff stinco -jann arden -jackier obinson -j atim -iamjer maindefoe -i aye -hunie pop -hov de -hfx seaportmrkt -heat seeker -hatt in -ha ssi -h wd -gutt macher -gri ha -gi rolles -geor geor -geer twil -ga jap -g pdf -flyo ver -fj all -ex positions -emirates nbd -em n -drum beats -dropou thillary -drach ma -door ley -doc tober -den dera -deal maker -curmudge only -crook ham -county fire -coun ties -cosme tically -core values -col dly -co we -co group -clay travis -ce fr -carbonell nestor -capital factory -camanach d -cal ore -buy ingit -brighton hove -bou lot -blue box -blessed ness -bel liveau -beck ler -bbc sportsday -bandar ban -ban ter -az oo -aven port -ave t -aren ga -arch uk -ar é -ant acids -andre ev -amin ute -alexail acad -alber tini -ak hali -ab ish -, _ -, '" -( .@ -éĽ Ĩ -âĿĵ âĿĵ -âĢĶ ' -Ì Ģ -Ã¥le sund -zu banski -zel alem -zar ine -zar autz -yp young -yal u -y io -wood pigeon -won de -winne shiek -whe ee -well don -wall now -w pu -view park -val pro -twin kly -traffick ing -tipsare vic -thur m -thi az -theat r -the three -thailand news -team blue -t vix -t qs -sureshra ina -stu min -stock fish -stable mates -sq d -spelun king -spar ano -sn whs -smith sburg -sleip nir -sin aia -sin a -sher locks -she w -sel b -sec nielsen -schol ly -sch ellenberg -saving abel -sau vie -sath letic -sajal aly -safaricom plc -sa pper -rowh ouses -ross mann -revan th -retro spection -repre sses -relinqui shes -red squirrel -re thinking -qui zz -q alam -pw tc -protec tively -probation er -pres stitute -pre sto -pom pano -politic isation -point swest -pla smon -per mai -pe mbe -pau leen -pang lima -palmo il -p fk -over write -or nc -oc s -nub lar -north well -no senergydrink -nine tte -nikol ina -nickswag ypyoung -nick naming -nhs leadership -nadi gar -n world -mykitchen rules -my husband -moreno valley -mo ers -mike dirnt -men stennis -mclo one -may i -mat za -magdas zubanski -machin eries -luke kuechly -lu ken -lu er -lock chain -lie bermann -lati um -la wro -l blogger -ky leigh -kp tv -ke ston -ke edy -ka elyn -k te -jonim itchell -iz ingly -inter locks -il ahi -hyacin the -house master -ho bar -hindi imposition -her omoto -hab lar -gu sm -gra e -glass making -ger old -future decoded -fur ano -fra yne -fox terrier -ff xiii -fent yx -fen cing -explo iters -eu ws -eng ill -dw mtweets -dige sters -de wis -dangerous wom -danger mouse -d do -cs ba -croy de -cre te -chi bu -chat on -ch live -cece winans -calu met -bu dig -br ama -berner ay -bed clothes -be san -bayanis andiego -average hunter -aust int -append ices -anti racism -americ andad -ame sh -al cona -afre zza -afloor test -ade mo -ac ohen -ðŁĻı ðŁĩ®ðŁĩ³ -ðŁĺĢðŁĺĢ ðŁĺĢðŁĺĢ -ðŁįĵ ðŁįĵ -ðŁį¸ ðŁį¸ðŁį¸ -íģ¬ëĤĺíģ ° -ë¥ ´ -Ạ¡ -ห ร -yul ong -wor boys -wolf ers -win ick -willi ston -vote forchange -visit snowdonia -vento aureo -tom mor -timore se -thekingof queens -the cove -the club -tamar isk -t je -sw sb -sw l -sunking brewing -sub by -spring is -splinter ing -slo bber -skep tic -sir tomjones -sid lowe -sh wrs -seun gh -saint leo -sa wano -ri par -rel lik -reh mat -real jonghyun -readyfor hillary -ra elyn -prolong ation -pre views -piccin ini -pic ea -penit ence -pe ditions -pak ula -or ai -oliver io -o tide -nh cw -new battle -national assembly -nac ott -n ttw -moreco wbell -michigan tech -mayak ovsky -matil dam -mass challenge -man inder -mali kyo -malikyo ba -lymphoe dema -lor ac -lly r -llibertat preso -lig ny -libraries week -lam ey -lam be -lab at -la duma -kre pt -ko dos -killthe trade -kelsen rally -kaatru veliyidai -ka im -jose canseco -jen te -jay asurya -jay anta -jani k -jaj pur -j mac -ish ima -iren aeus -inter cal -in sley -in bangkok -illumin ed -husker fbnation -hil dr -high ams -henrik stenson -hej duk -han pti -hac ke -h ct -grail lot -gow anda -gott alo -girl love -gar çons -gangster ism -fulle rene -fin t -fel o -est court -entdeck t -em ill -ele ssp -edinbur ght -dry ads -dramati sed -dol vett -di oxin -di ame -cultu relle -cul turi -cu uuu -cru sin -cl volley -chil koot -cha aaa -cell reports -castel vetrano -bus news -bursle don -boxer bond -book posse -bon u -bon temps -bla zin -bates burg -bashi rah -bas ar -az ha -assi r -ar me -ap hl -anti serum -anthony bourdain -antece dents -ane us -amy ra -amik kelsenrally -allian zarena -ale v -ad ma -abull dogs -aa sher -,, / -( âģ¦@ -ðŁİ¶ðŁİ¶ ðŁİ¶ðŁİ¶ -ðŁİ į -ðŁįĶ ðŁįŁ -è ĸ -åĢ ī -âĿ ľ -ج ÙĪ -y pu -wx by -wirele s -win diest -weare international -wang xian -wain scot -w top -vhs india -van os -up setter -un wholesome -u ov -u ou -turbo jet -tsur ugi -tru lia -tor ino -to er -thrott le -the office -the har -the fix -testim oni -teacher friends -taec cool -stra ss -spe ters -sinthe sky -sier pinski -shichi mi -she is -shangha ima -sales enablement -sack cloth -s gro -s followparty -routledge books -roque brune -roo th -re uk -rally x -r xr -q school -pro les -pin al -pendu la -pas ku -outdoor fun -oooooooo ooooooo -oh gov -obscen ely -obi ano -obas i -nu ffin -non conformity -no ten -nar cis -mus ick -mun daring -mormon probs -mor ale -mis sam -mend elian -me gui -man ley -lili angarcia -leapfro gged -lamb swool -ker newe -kenya power -katak lysm -juve derm -joyce caroloates -jim wkyt -jean not -jackie o -it slit -it ac -isof ix -ir ão -inj akarta -im ats -humphrey bogart -hom etour -hinter land -herit ability -haway thelads -harmon ise -har ik -gy umri -gun makers -gre glou -gio i -gastri que -g vw -fun home -fren do -fort mcmurray -for youth -fix able -essenti a -ess lingen -es news -eric vergne -er minator -ep chihuahuas -ent le -engine shed -eller ton -el sayed -ebol a -e issa -dy mph -du monde -dragon lord -do gan -dil utes -die for -desertisland discs -den een -deceler ating -country boy -cor ser -cop tic -cly ffe -cher ri -casam ance -cas ona -bukitt inggi -brujer ia -book quotes -boardwalk hall -bio terrorism -bend all -behe moth -bak assi -au clair -ast mh -arou ca -app ending -alpha deltapi -ales und -ale ksa -aldubxe bloveis -alchem illa -across the -ach ing -? !# -!!! * -ðŁĺģ âľĮï¸ı -ðŁĴĽðŁĴĻðŁĴľ ðŁĴļâĿ¤ -ðŁĴĶ ðŁĺĶ -ðŁıĴ ðŁ¥ħ -ðŁ¤¤ ðŁĺį -à¸Ńภ° -zuc chi -york dale -yan a -womenin law -wine mag -walkin stown -vote dem -violet chachki -usat sport -unitedin orange -umb reon -ultram ar -ukbusiness lunch -uef ayouth -tyson foods -ttro pez -tsh ering -toy ne -ton geren -tim the -ti anti -the market -the key -tf con -tero th -team sailer -t reader -swi ley -swach hta -sur sok -summ ilux -storytell er -ssou ths -sp res -sonymusic india -smu ller -sly james -slo viansk -sis rael -she hab -sha j -senyor a -sch aff -scan al -remington arms -remb au -rati gan -ra smu -ra gen -r hanews -r fe -pym nts -prow res -pra iz -pr ss -pi ents -phel ps -pe gan -pavlovic nbcs -pab owl -p ton -over heads -ou standing -os f -on scene -offici o -occa sion -ober heim -ob cs -nis man -ni sta -nbad raft -nat ics -nanopore conf -mur rey -mu tasa -mu dgal -mt sen -mis represents -mis classification -min oa -mi at -manne h -lun guk -lov ly -let scher -len asia -lad ha -l ff -l ario -kon ichi -kerri son -keep working -k deleon -k cur -juju tsu -joseph jett -jau har -jat inder -jann ation -insinu ation -ingh orse -indiam art -honey pots -healthand fitness -haw era -hare brained -han ge -h tb -great gatsby -gott ardo -goodnightt witter -golf ball -go ias -glow sticks -glow stick -ge etv -gb hour -gar net -g pf -fur ze -fuer zas -fu gee -fri endof -frauen kirche -forec ourts -for tun -fal me -esp guitar -epistemo logical -enumer ate -elast omeric -eh s -ed w -dulwich gallery -dublin horseshow -don lan -digiov anni -deer park -daily bot -cs gazette -cotonde tulear -col ber -clear way -celebration of -cbc sask -caul kins -cartoon hangover -carol vorders -care full -car meli -by ne -buonarro ti -bum stead -bre el -bras stown -brad by -bored oms -blow fly -bloody scotland -blo q -betro thal -beng old -be ara -basil don -barbar acom -ba set -ba his -ato records -at ok -aru sh -ar si -antron brown -aman zo -amalgam ate -alleno very -ali ghting -ale au -al vy -agu std -aerop uer -ae expo -adul tedu -ad ate -acl are -ab illion -ðŁĺįðŁĺŃ ðŁĺįðŁĺŃ -ðŁ¥ĩðŁ¥ĩ ðŁ¥ĩ -îĮ ª -å½ © -à¹ĥ à¸Ī -your vote -yo liverpool -yam l -world cafe -won kyu -women fortrump -wit tes -wilton musichall -whid don -wh oring -ward ine -w bbm -van tho -val verde -val ory -v nu -ut mb -us sey -under brush -tv mohandaspai -trapezo idal -tom az -ther mali -the kitchn -the dilipkumar -the aaf -th are -team bnn -team ashishians -ta kkar -t sin -sub heading -st lucie -spacec am -smo del -sile sian -shawn stockman -shak oor -score board -sara watkins -san siro -sai pem -rt pi -rou shy -repudi ate -remed ying -reli ve -re ik -pic poul -pc s -pan jab -p kushn -or ding -onther ocks -ocv updates -obfusc ated -ob ad -oab aab -no ac -nester ov -nb h -nak amichi -na jim -mickey avalon -melissar auch -me chi -mcla gan -mc girr -magn itudes -ma ws -ma sp -m monogram -lit rpg -leg alizes -lar a -la ppe -kid swb -key shot -kar lan -k lime -juda ic -jenny lewis -jenna elfman -inclu sively -im ls -i set -homony m -ho pley -hir ta -her lings -haynes ville -happy anniversary -guar neri -gu o -gro the -google home -gon i -global health -glade sville -gl c -georgel ucas -foot light -fluff ball -fcn antes -fan army -extrapol ated -exacerb ation -er sclub -emil ym -east sussex -early start -dy dd -du etting -dry ga -dom tar -divul ging -di po -dez ma -desol at -den er -csed week -cor zo -co tulla -clark mp -cher ney -chan del -cant waitfor -ca ha -bu ghead -brush wood -bombay times -blueridge parkway -blu eroom -bikel anes -big bear -bharath iraja -beav en -b fore -awi ki -auto bus -author sofinstagram -athen sga -asi mon -ash rafi -arrabbi ata -ann curry -ambi ga -alkal ine -algorith mically -al si -al dou -afric acom -abre go -abe dian -:) .. -ðŁĴĻðŁĴļ ðŁĴĽðŁĴľ -ðŁĴĥ @ -ðŁijĮðŁijĮ ðŁijĮðŁijĮðŁijĮ -å¯ Į -ãħ ĩ -yy o -y iz -wr ona -world changers -water gate -wal eshour -vla ar -veoli auk -usace hq -us amateur -uru bamba -up welling -ul ts -uefayouth league -tupac shakur -trishap aytas -trio works -travelo gues -trampol ene -tra ister -tor con -toni and -ton der -toiletekprem katha -today is -thec gf -tham esc -tennis australia -tat lı -tart lets -swift current -su te -speed wy -spac eneedle -soci été -snap shot -sme w -shat to -shan atics -senator wong -sd ny -schar lie -sc indi -samgye opsal -sam gyimah -ry usei -ry l -ro seee -rhe o -re organizes -rdan ational -pun ahou -pre fabrication -power glide -por tw -plan ted -pete doherty -pa chan -ou mu -on love -not given -north wich -niantic labs -newworld order -mr josh -mr f -million views -metas ploit -marucci sports -mark burnett -markburnett tv -marie hamn -mar nell -mar lowe -mar ise -malasak it -mal nourishment -mad lang -m wf -ly nah -lot fi -lion smusic -li ths -lewis capaldi -learning analytics -lead o -las dun -l arian -ku ss -ku dat -key ano -ke ely -k ch -jueve s -jet charter -jay mohr -ja eden -istigh far -isles app -ios app -inx ile -intrepid museum -iklan terbaru -hill billy -helic obacter -health data -harro wer -hannah spearritt -gu wop -grow yourown -gratu ito -grape seed -gland ore -gin ato -gho stre -geon osis -fifty shade -fas cic -far lane -extre mely -eliti sts -ed ps -dw l -dungeon family -djima vic -din ghouse -deep spac -de gate -daw nzpost -davidlove photog -dar ner -crump sall -cre gan -cochlear implant -cheru bic -chel ation -chase masterson -ch under -cellu lar -canaryisland sen -bsor ules -bro seley -blk perspectives -behavi orist -barne sy -augh rim -aqu atica -amat ata -am one -allameric agame -________ ________ -! ⾨ -ðŁĻĭâĢįâĻĢï¸ı ðŁĻĭâĢįâĻĤï¸ı -ðŁĸķ ðŁı½ -ðŁijİðŁijİ ðŁijİ -ðŁİĻ ï¸ı@ -ðŁİĨ ðŁİĩ -ì Ł -⾨ âľĶ -âĻ¥ï¸ı ⾨ -âĸº # -à¸Ļภª -ج اÙħ -ö l -z wel -xfactor final -wood bury -wild child -wan tit -wa urn -viol on -ve gam -v nl -uro logy -ur araka -upone aglewings -unc wilmington -unanim ity -ubi que -transgender ism -tipping point -thinking outloud -the church -tech nip -team blackberry -tavis smiley -tam lyn -swart berg -style me -ste ds -ste acher -sp acc -solor zano -sin ghs -side m -sha be -set by -seri ally -sean hayes -satur ates -san wool -sal ar -saints row -ru stin -ru ffing -rock face -road warrior -reprezent radio -reno omokri -reboot liberty -pronovi as -pra kriti -polar ities -pete sessions -perth and -pas sp -oo iman -onemore time -one yearof -okone do -ojama jo -o week -nit zan -ngi reland -negr oni -n fre -mus lera -mu squ -mortg aging -monsta xin -mm wave -mitch y -ming les -mil utta -memphis fb -melissa ordway -may fest -man repeller -m mie -m le -ly sa -legiti mized -la ffs -knowledge management -kiernan shipka -khal is -kawarthan ow -jean ericvergne -jason bourne -jack o -ja ked -ja ima -inf am -in sky -homep ages -ho vered -ho sch -hi the -herto genbosch -he gerty -hall marking -gyor ko -gul ick -gu apa -gre gs -good foryou -gen berger -gandalf wasme -ful bourn -fru gally -fpv racing -food fact -flo y -flo rets -fe dele -el vin -effi ong -een age -eddi reader -eag ar -div vy -distill ates -deb ello -day sss -dani eller -cork chamber -cold water -cla ggett -chick y -ce oil -capability brown -camero onians -california fires -calcu tt -cal dey -brian azzarello -bren er -boys brigade -bmwmotor ra -blen kin -bio compatible -binge watching -bin nington -big bos -ber ating -basal tic -babun aidu -as ph -anthology film -angh el -al cos -ai fam -acro pora -ab berton -ðŁĺįðŁĺį ðŁĺįðŁĺĺ -ðŁĺĤ ðŁ¤Ķ -ìķĦ íĬ¸ -æĭ¡ æķ£ -ÙĦ ÛĮ -ا٠ĩ -yl p -yad u -what sinthe -westmid shour -web socket -voo c -vm ro -viv adelrio -victori ao -veen stra -ve dran -v ch -ul ing -uk business -tur ron -trin ita -times magazine -thibau d -thewrit elist -the face -th st -ter za -team nike -ta share -swan bourne -svt foe -steph on -statueof unity -st nd -speci fier -spagnu olo -so hlhockey -small faces -sin till -shus kies -shoo fly -shakti rajan -shahi dul -sd pd -schul enburg -sch tick -sawal ha -sal soul -sag acity -s vig -royalvisit canada -rox by -roeth ke -reson ances -re eni -ram blin -pwe tty -pri mark -pramo d -polo club -plu ghole -photo chemistry -phillips academy -pete sohlhockey -pe dir -ost friesland -oke chukwu -noynoy aquino -now streaming -nive les -nikon india -neo classicism -negro ponte -ne sd -nbc nightshift -na thu -n tis -n pas -n bb -n acon -my ah -mur ari -mubar ik -mo jis -missk atie -mis wak -mirror sedge -min ow -men jadi -melb derby -masch io -mar ji -mal ine -ma quis -ly onnaise -lier se -late y -large format -kour a -kost ner -king sdale -kick the -ken gen -k bbq -jw j -justicefor benghazi -juse yo -jur nee -jasminec ain -jacqu elin -inthe clouds -id lo -hss vca -honey wood -hockey isforeveryone -he bron -ha seo -h ke -gold wing -gold mines -girl slax -gi ya -garri ga -forest dale -foot action -flash game -fiat chrysler -felipe calderon -facto tum -ew stv -ev as -er kin -emiliop ucci -elock hart -ego yan -ebel ing -e iders -discer ned -demor alize -darting tonhall -damaris cotta -dairy month -cutthroat kitchen -cu bas -correspon ded -cin ar -che ssies -canton io -bowie baysox -blue chip -blair ite -bili moria -be yourbest -bb s -ban karena -ba shaw -armc andy -an chi -amberrudd hr -alex bracing -ab ashi -ðŁļ´ ðŁı¼ -ðŁĺĺ ðŁĺģ -ðŁĺ© ðŁĺŃ -ðŁİ¬ # -ðŁĮį . -ðŁĮ¾ ðŁĮ¾ -ãħ Ĭ -ñ ana -zz ato -zer din -zer be -zan ele -z aco -xxx viii -wych wood -wha a -week endo -we cantwait -viennois erie -vide op -v laminck -uta ware -un enviable -ul le -tran shu -torye lectionfraud -topo logies -tomato e -timy the -the change -ten ali -tech cc -super bock -stra uch -ss mb -sri vastav -spor tawards -sp robz -sof ÃŃa -so hi -slow travel -sic ut -si ring -sea fishing -sc ea -sbut d -sain ttropez -saaksh isra -roust about -roadtrip tv -ro chambeau -rf k -ren a -reggie bush -rege hr -re stuar -rain men -rail budget -proble mas -pon zio -perfume genius -per loff -pap azian -ou tu -ossi pee -or vis -oh hey -o zzy -nv sd -north leach -nfl freeagency -na os -myo c -mur alists -mu scaria -mo ton -mo gens -midnight red -me ins -matt sson -mark field -map info -mang ino -lucre zia -love qub -louisianat ravel -law ther -lat u -lam pson -la ppa -krisa quino -kohi stan -kit i -john nyo -iti sprashanth -hul ley -hedon ic -hass i -hackneye mpire -greens bor -gam po -futureready libs -forti fying -follow in -fle ek -flag ship -fer id -feel like -fashion week -ey b -evel ynn -entertain ingly -embe ddings -dhan u -depor te -day pack -dar rin -d pict -consul ates -conow ingo -chi yoda -cas spi -carbon ic -car ota -call ic -c da -bryo zoan -bo sio -bir dy -bab bu -aye she -av ui -archang el -ar val -aqu igley -ap lic -anti ago -an sen -ak asi -ad owns -ad fw -ac unity -:( "@ -į ° -ðŁļĹ ðŁĴ¨ -ðŁĴģ ðŁı»âĢįâĻĤï¸ı -ìĤ¬ë ¬´ -ìĤ¬ë¬´ ìĹĺ -ãģĬ ãĤģ -à´ ³ -تص ÙħÙĬ -yasuk uni -worl dy -wool ens -wentworth miller -wemy ss -we stri -waf s -vol tige -vo et -vin c -vil de -ve aled -urban wildlife -up f -uni vienna -u kyo -twitter uk -truck fest -tro caire -trail ering -too vey -togar ashi -tn ell -tin h -the jo -the hunter -the heat -tex turi -terra za -ter im -ter batas -telfor dutd -tech nation -te gh -sy ren -sud duth -submer ge -su fis -stre gi -sten zel -stech ford -st assen -splendo red -smar thomes -slumber party -sim sim -shee sha -shant iniketan -sf ballet -semen ov -schalk wyk -say es -saty amev -sap skzn -s woman -rubeng allego -ro iz -reher sal -re analysis -rainor shine -radio aire -qu mran -port lethen -por gie -plough mans -pine iro -pat nap -pap en -palar ong -over up -om achenko -nor gaard -ni dia -new bridge -national ise -mul lum -moscow mitch -mil ko -meri weather -me official -mazz etti -marian rivera -map úa -mand ai -man at -maan karate -ma sya -lore to -lop ate -latelate toyshow -lambda chi -kwa hu -kr n -kim sey -khat ami -judgen ap -joshu as -jami elynn -jami ah -j adel -it matters -ison zo -inter med -inco terms -in mind -i anni -hoo ft -hi way -hay on -hands comb -han ske -half adams -guimar as -gos lin -gian tuk -get tested -gaw k -g ww -g stephanopoulos -foe ticide -fil in -exist ences -excell encies -evam arc -ene spanol -en ext -el tiempo -dra ugr -ditt mar -disco tek -day day -dar a -dan icim -d chat -cow ering -comple tly -color adop -chou sing -chima ira -ch n -cel ite -cas bah -caro emerald -can ta -calm down -buden holzer -brink manship -boywith luv -boh len -blogger suk -bedtime story -basketbal laus -bak ht -b craw -ato gether -asho kk -as cb -art dubai -architec tes -aram m -ar pin -ant middleton -ani poke -andro logy -alexand rina -alex a -ajax capetown -* \(^ -ðŁĺĢ ðŁĺģ -ðŁĺ¿ ðŁĺ¿ -ìĪĺ íĺ¸ -모 모 -âĺºï¸ı ðŁĺĤ -à¸Ńภ¡ -à° ¶ -Ø§Ø · -yun an -worley parsons -workflo whq -witney carson -win z -we ymouth -vu cevic -vou liag -vin expo -vic gov -venkat raman -venezi ano -urgent care -udyo kta -ud yog -twee abondthatcantbebroken -tl aloc -timel ord -ticket webuk -thorn leigh -thor sby -the press -the kevin -tech forum -tau malolo -tara weeh -tan jung -t strong -sy kess -swag gart -sw amy -storybehind myscar -stein haus -sr ini -sphy g -sonamo hapatra -son en -sn ck -sle v -silic osis -sextu ple -sev aks -se infel -sc avenge -s veri -roadsof mumbai -road ton -rho diola -re entering -raymond ville -rang arajan -quir rel -q sfp -preeti karao -polit is -per versity -pat tee -oc ele -oak wood -o scott -ny drock -nature medicine -n ads -memory monday -mak tab -ma thu -lobb an -land bou -lago sians -l day -kra bbe -karan vir -jof frey -joe thomas -intercon hotels -inter web -inform acion -indeli bly -in training -il ho -hydro geology -hun ch -hell and -hahah hahahaha -ha kai -h sia -gre port -girlsin science -gen ga -fo tis -fo sbury -flanne lette -financial domination -festivalof lights -eu ets -emanu elle -eas ilocks -driven by -dream iest -dr seuss -doy ley -dorse techo -don health -dj whookid -disav owed -dic o -desi o -dean karnazes -day music -daw illiams -crowd cube -craig leith -cor bell -constant inos -col ler -co fee -co as -cme group -cho ck -catt ell -cat news -cast ner -card room -carab ins -cali bri -bor sato -ben ighted -bea sting -be yoglu -basti dores -bah man -ba rest -avell aneda -atur days -aspl und -as oe -arquite tura -ard vark -arctic frontiers -anewh ope -ai ku -adjac ency -ad um -academicswith cats -aber daron -aaron yan -ðŁĩ¬ðŁĩ§ @ -éŁ ³ -ãı Į -zor aida -yig it -wes ther -way de -water melon -wac sports -wa fula -villano vau -vicis situ -var nado -vap elove -utel aforever -ur ro -universal ism -un constitutionally -tu fan -tru iden -trij icon -topal ov -tomor ph -tomoh on -tn ght -tit lan -tit anium -thomastur goose -tho ct -this winter -thing for -theruf friderz -the ashes -tattle tale -tarte ist -tam arab -sym pathetically -student problems -stop knifecrime -spo ints -sne ider -singh is -si menon -seman as -scri bble -sc ros -sas a -sar b -sahib zada -sahara occidental -s gc -s des -row let -rc jh -rare breed -ram anan -raising awareness -rain sford -rai sen -radu lov -proc tors -pres spass -pre season -po ori -plu ot -pennstatem hky -pal en -oxfords bs -oun ified -operaholland pk -nt w -nor tec -nikkis anderson -ne xx -nav agio -na xx -na imi -muzi k -mur aco -mu hle -mother nature -moneyinthe bank -mn dnr -mirror monday -mer ville -mcne ice -mayor slyjames -marq ise -mal var -main aure -lux us -luck yday -lu per -loisa andalio -lo si -linux foundation -l ct -ky aaa -kotze bue -kirko bangz -kier sey -keh rer -k gra -john key -jhpie go -jeanne de -jav adekar -janak pur -j ni -iti oned -inv ited -international teaday -ian ziering -i boy -hid aka -heck scher -heather dubrow -hd palooza -hallo way -gu apas -gr hs -gotoireland us -good for -fuel ing -fl ö -ferdin and -fan support -evamarc ille -er ca -emabiggest fan -em f -el bridge -eco ins -dumer vil -duck s -dove awards -double standards -discover greece -dhe er -desig nin -dec ca -dd insi -dab bin -curvil inear -counterfe its -cob hc -coachj franklin -ck w -chandra shekar -cebit aus -cabernet franc -by sea -buy social -bucc al -bu sco -brody jenner -brec bassinger -bou illet -bf hardline -ber halter -bent eng -be your -bas c -bag anac -atten bury -att aboy -as kea -ari ano -ann nnnn -alimi ballard -ad mn -acher on -> ... -" "@ -ðŁĺĺ ðŁĺľ -ðŁĴķðŁĴķðŁĴķðŁĴķ ðŁĴķðŁĴķðŁĴķðŁĴķ -íĺķ ìĽIJ -ë· Ķ -âļª âļ« -ઠľ -zin nias -zale wski -yogag irl -wyr ley -woyz eck -worth morealive -world sight -won u -wil drose -wei hen -vu ko -vendredi lecture -tz on -twinpeak s -tur non -total football -top golf -thur sley -thr on -the pi -thatsmy girl -terrific tuesday -tal uk -symp a -sunny beach -su deley -ste idl -star uk -spi ano -sperkin sdnd -soule ater -sop rou -solfe ge -smo or -sketch noting -sidec inema -shubhan gi -sh indler -sed its -se dat -sd chat -scotti e -sap inker -sab ba -river park -ri mowa -reason ableness -readju sted -ran jana -quer as -py ong -pu ggy -promo products -prayforthe world -phosphat ase -ph v -pau lone -open studio -nr sv -nose k -nis ch -ng wa -new rules -ne scafe -my wolfsong -morphe tt -mon n -mon kee -mini atura -micdro premix -mesop orous -mc pher -mc coo -mbl season -marin ka -mal asada -m do -luni z -lse plc -love youu -lo ew -libret tist -letter sto -lair g -lac on -kou ga -kid shealth -kend riya -kay han -kau shiki -kan de -june jo -ju styn -john inne -johninne scentre -jo bad -jharsu guda -jer ri -jame spear -jal na -infl iction -ine gypt -incarcer ating -im hof -i asb -hel pre -head casey -headcasey mike -hallucino gen -hal lettsville -h ilife -goo din -go sparks -global summit -ger an -freethe arctic -fre aker -for trose -for summer -fe her -fcu trecht -face time -ext gen -er awan -enew man -ellef sondavid -el il -ed ball -duc ted -dr marty -doh ring -dhar ti -des ford -dent in -dau lat -climate breakdown -ci wf -chri sperkinsdnd -chill er -chevening fco -can ids -bro mides -bid dies -bham donkeys -bed in -be idou -be honest -bat en -bare la -bac ademy -b ment -b dl -anastaciam usic -an erjee -am pex -al fas -al ben -ak hir -aed as -adam aofficial -ack in -achievement unlocked -abutil on -abdel rahman -aar sbl -?? "@ -! ðŁĶ¥ðŁĶ¥ðŁĶ¥ -! ðŁijī -! :( -ðŁĺį ðŁĺĻ -ðŁİĬ ðŁİī -ë§ ¤ -ë¦ ´ -åĵ ģ -ze ma -youngen terprise -yaqu b -xavier daniel -wit tic -win st -wag ar -vovin am -vor ov -vijay filmaker -ver ilog -vapor ware -uri m -up ends -tre sham -tre mpe -total y -tor ie -today at -thimble weed -the chase -swit chers -swati jaihind -swap meet -stru ms -stock photos -stin ch -speed prayers -southernmiss fb -so ca -simon webbe -shep newsteam -ser via -sean cardo -sam ish -saakshisra wat -sa otome -rough rider -rond ina -roadand track -righ tist -ric c -renew ui -ren lagann -re treat -rc psychic -rae bareli -py x -pron o -present ando -poo jai -pau gh -pat roberts -ovi de -over development -ometal lic -nfl pabowl -nep tunes -mt dna -mother and -moore senate -mjin nocent -mistre s -mike tirico -med itech -marky ramone -maquilla je -low theband -love tour -lift back -li arin -latt in -labor atorium -ky bourbon -kr ach -ken sit -kazakh stan -kati ed -kaan ur -jones jr -jac kel -it ain -isser lis -interrup tus -international youthday -insan ity -indo chinese -im mbm -ig awa -hydro graphy -hi mitsu -herak les -her se -hend all -he ssel -havil ah -happy jhopeday -ham ina -h wu -h wp -h kt -gy res -guy ra -gun sense -gul fair -greglou ganis -grease paint -ghaz ala -gang neung -gambrin us -foodis medicine -fon ua -fi ii -felice herrig -ero icab -ero ars -er lend -engie group -ell p -eli sir -einstein maga -efra im -earl ham -e peeps -dr marth -do towsky -dis love -dim witted -de juan -daniel s -dak os -d scc -cri an -contr alto -commun is -clergy men -christmas music -chi ded -chest nu -chazz palminteri -cd na -castle martyr -cab by -brighton pride -bm v -big and -bel mon -be oplay -bat sky -bag amoyo -australian shepherd -audio boom -ath boy -as chi -arcadia unified -ap ure -ap ate -anc ities -amand ac -alife dotowsky -al san -ake elah -af sar -adam rank -. ;) -" ¡ -!! ðŁİīðŁİī -ðŁĴļðŁĴļ ðŁĴļðŁĴļðŁĴļ -ðŁİīðŁİĬ ðŁİĪ -ðŁĮ¼ ðŁĮ¼ -ðŁ§Ł âĢįâĻĢï¸ı -íĭ° ìķĦëĿ¼ -éī Ħ -âĿ¤ï¸ı ðŁĴª -ᥠ± -о ÑĤ -your car -york theatre -ye sil -yam ma -ya hog -wt fff -writers festival -worldfood prize -wor dle -we yer -vo xx -vendee globe -var ico -vancity buzz -under development -tran scultural -tor neo -tor mentors -tiltro tor -thisisse th -thisisseth sblog -the bonni -th year -tayl an -tahaw y -sw fclive -super soft -suburban ites -str ator -speaker series -sp sm -sou ad -slo per -sla visa -skipp ered -sketch cards -show pieces -sho wi -shin han -sf hs -seg no -se chs -school meals -schel de -sau rian -sag ami -ry p -rump f -rou lston -ro ffey -riz al -renega des -ren alovelis -regionalli ga -region ale -rb k -ravin dersingh -ra ux -pu plovers -pro scribed -present an -pre heated -pr illy -poul son -po ids -pm dc -pik app -photo video -phi bbs -pc j -par ash -pa tha -p rum -p drm -our community -oph ils -ny rd -nonprofit day -non resident -nin ny -ne ira -nat oli -nalim bachia -my app -muke sham -msccruise susa -morning rush -monagh angaa -mol let -mile posts -mi thu -meaning lessness -mcken ny -mathi sen -masterchef sheep -mar one -mamat abanerjee -ly dden -lon ie -lo bat -lin foot -lgb thistory -lec ats -kilmac ud -kerry katona -ke ens -karol sevilla -kam akshi -jrod fromoz -jose cuervo -jai my -interior designideas -ino ise -inder jit -hon gi -hill erman -hemam alini -hayley mcqueen -hand maids -hal kett -gui z -gross ers -gre el -gib let -gay les -fou sey -fli k -female entrepreneur -feels badman -fanni bal -f staste -erc p -ent el -en in -eli kes -ei ichiro -ed postcards -ec kankar -duc s -dor mammu -domin ik -dogand puplovers -disp leasing -dge l -del fonics -del at -de ase -d pm -cu cks -cronkit enews -congress muktbharat -color smarathi -col avita -clen buter -cipri an -cbc news -carleton college -car nal -black nose -bior xiv -bhav nalimbachia -best t -be chard -bar ma -babs draws -b fest -az atho -avon rep -att ac -asph alt -ap sf -anton etti -annane trebko -ang om -ameth asone -am oner -ah hh -ag proud -affor dance -ad joint -: ~ -//// // -$ ] -! :)) -ðŁĴį ðŁĴİ -ðŁijįðŁı½ ðŁijįðŁı½ -zar da -yuk ito -work athome -women scienceday -wit s -where withal -vic ta -vas elines -v any -utaware ru -us fda -un competitive -un believe -twoo odley -tw ofer -truck driver -tri stin -trans acted -threep wood -the yyam -the shoe -the il -tari kh -tali m -sussex lifemag -sus open -sugi mori -su long -stati stik -sta this -spring side -smo ss -set su -sch aer -sc ana -sat oh -sar la -santa anita -sambu cus -saig on -ru perts -ru ia -roman i -robb ins -real muto -reading festival -read justment -provision als -pro kabaddi -ppl summit -poe mas -pig tail -pdp nigeria -party yyy -ow lets -news sport -neptun o -naray ang -nan tong -nai ad -mur rin -mo scon -ml h -merq ury -mc t -marcus butler -makha chkala -lucky man -loe hr -ll cc -liveyour dream -lin acre -lime stone -lifeof an -li ffs -lesmiz bway -leh ri -learn coding -le user -lan l -lake eri -lado ga -ko chunni -k dd -justicele ague -jen nar -iyanla vanzant -im pi -i stre -i ib -hondac anada -hey ns -har diest -hannah bronfman -h pr -h fc -gw m -guar in -greatbritish menu -ghu ggi -ghost story -gec dsb -ge ats -gaslight anthem -garci aparra -friend sday -fl ye -fis chl -fent anil -fair vote -ery ri -episco po -eng cro -electrocardio gram -ek mainaure -dun ces -duc ators -dub nyk -distru stful -deton ators -deceler ate -debbie reynolds -de mais -day z -d th -cuar ón -cu pich -cros well -courts matter -cool kid -chol ar -cha que -catholic faith -cap olitics -c pride -by land -bran sholme -bla zek -bicy clec -be calmed -bas combe -bae jin -bad on -auri fil -audi op -attenu ated -ar ki -ar dara -anti theism -ames waran -am paio -al isms -ag api -abo g -!!! ?? -! âĿ¤ï¸ıâĿ¤ï¸ıâĿ¤ï¸ı -ðŁĴĻ ðŁĴļðŁĴĽ -ðŁĩ´ ðŁĩ² -ìĨ Ķë -미ë Ĥĺ -é İ -åį ģ -âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ -z abu -ye young -ye ji -y ma -wild boyz -weald stonefc -vote ariana -ven ne -v bn -ut zon -uise du -ufo table -ufo sighting -uff ington -tu le -tt itz -troph ication -travel awesome -transcendent alism -tra pper -tik va -ti sed -thisis england -teenwolf season -tech support -sundar c -suare zg -su sy -stron gheart -street food -story bots -sto c -st gile -srsg vac -southeast ward -soccer saturday -so zone -smid t -sm city -sli mey -sin claire -sd reader -scare d diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index ee69d7ecff..1f476ef2cb 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -55,8 +55,7 @@ class ONNX extends MLFramework { @override Future loadTextModel(String path) async { final startTime = DateTime.now(); - // Doing this from main isolate since `rootBundle` cannot be accessed outside it - await _clipText.initTokenizer(); + await _computer.compute(_clipText.initTokenizer); _textEncoderAddress = await _computer.compute( _clipText.loadModel, param: { diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart index 7f954ed7f3..09d3a33e83 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart @@ -2,19 +2,22 @@ import "dart:io"; import "dart:math"; import "dart:typed_data"; -import "package:flutter/services.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart'; +import "package:photos/services/remote_assets_service.dart"; class OnnxTextEncoder { - static const kVocabFilePath = "assets/models/clip/bpe_simple_vocab_16e6.txt"; + static const kVocabRemotePath = + "https://models.ente.io/bpe_simple_vocab_16e6.txt"; final _logger = Logger("OnnxTextEncoder"); final OnnxTextTokenizer _tokenizer = OnnxTextTokenizer(); // Do not run in an isolate since rootBundle can only be accessed in the main isolate Future initTokenizer() async { - final vocab = await rootBundle.loadString(kVocabFilePath); + final File vocabFile = + await RemoteAssetsService.instance.getAsset(kVocabRemotePath); + final String vocab = await vocabFile.readAsString(); await _tokenizer.init(vocab); } From 2299e69227c51cc54cf55110c63aabc689008c93 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 15:10:12 +0530 Subject: [PATCH 0015/1179] [mob][photos] Assets tokenizer cleanup --- mobile/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index ce76349f15..b4e2cb23ee 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -238,7 +238,6 @@ flutter_native_splash: flutter: assets: - assets/ - - assets/models/clip/ - assets/video-editor/ fonts: - family: Inter From dcb90f9e59555129b4da7976e7c54d3604d2233f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 15:29:24 +0530 Subject: [PATCH 0016/1179] [mob][photos] Only do tokenizer init in computer --- .../semantic_search/frameworks/onnx/onnx.dart | 8 +++++++- .../frameworks/onnx/onnx_text_encoder.dart | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index 1f476ef2cb..09623a1457 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -55,7 +55,13 @@ class ONNX extends MLFramework { @override Future loadTextModel(String path) async { final startTime = DateTime.now(); - await _computer.compute(_clipText.initTokenizer); + final String vocabPath = await _clipText.getVocab(); + await _computer.compute( + _clipText.initTokenizer, + param: { + "vocabPath": vocabPath, + }, + ); _textEncoderAddress = await _computer.compute( _clipText.loadModel, param: { diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart index 09d3a33e83..df90ef66b8 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart @@ -13,10 +13,16 @@ class OnnxTextEncoder { final _logger = Logger("OnnxTextEncoder"); final OnnxTextTokenizer _tokenizer = OnnxTextTokenizer(); - // Do not run in an isolate since rootBundle can only be accessed in the main isolate - Future initTokenizer() async { + Future getVocab() async { final File vocabFile = await RemoteAssetsService.instance.getAsset(kVocabRemotePath); + return vocabFile.path; + } + + // Do not run in an isolate since rootBundle can only be accessed in the main isolate + Future initTokenizer(Map args) async { + final String path = args["vocabPath"]; + final File vocabFile = File(path); final String vocab = await vocabFile.readAsString(); await _tokenizer.init(vocab); } From 5eb02c242c2b507cbc5b3f451d3a91294cd1f9c2 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 19:17:47 +0530 Subject: [PATCH 0017/1179] [mob][photos] Small fix --- .../semantic_search/frameworks/onnx/onnx.dart | 9 ++------- .../frameworks/onnx/onnx_text_encoder.dart | 13 ++++--------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart index 09623a1457..44d6cabc49 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart @@ -54,14 +54,9 @@ class ONNX extends MLFramework { @override Future loadTextModel(String path) async { + _logger.info('loadTextModel called'); final startTime = DateTime.now(); - final String vocabPath = await _clipText.getVocab(); - await _computer.compute( - _clipText.initTokenizer, - param: { - "vocabPath": vocabPath, - }, - ); + await _clipText.initTokenizer(); _textEncoderAddress = await _computer.compute( _clipText.loadModel, param: { diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart index df90ef66b8..7094447cae 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart @@ -1,7 +1,7 @@ import "dart:io"; import "dart:math"; -import "dart:typed_data"; +import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart'; @@ -11,18 +11,13 @@ class OnnxTextEncoder { static const kVocabRemotePath = "https://models.ente.io/bpe_simple_vocab_16e6.txt"; final _logger = Logger("OnnxTextEncoder"); + final OnnxTextTokenizer _tokenizer = OnnxTextTokenizer(); - Future getVocab() async { + + Future initTokenizer() async { final File vocabFile = await RemoteAssetsService.instance.getAsset(kVocabRemotePath); - return vocabFile.path; - } - - // Do not run in an isolate since rootBundle can only be accessed in the main isolate - Future initTokenizer(Map args) async { - final String path = args["vocabPath"]; - final File vocabFile = File(path); final String vocab = await vocabFile.readAsString(); await _tokenizer.init(vocab); } From 6d1c73d90eee033be8437effb4249120f6139ba0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 19:20:48 +0530 Subject: [PATCH 0018/1179] [mob][photos] Enable only clip embedding push again --- .../machine_learning/semantic_search/embedding_store.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index 8797667d8b..00859a20ce 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -58,7 +58,6 @@ class EmbeddingStore { } Future pushEmbeddings() async { - return; // TODO: remove this final pendingItems = await EmbeddingsDB.instance.getUnsyncedEmbeddings(); final fileMap = await FilesDB.instance .getFilesFromIDs(pendingItems.map((e) => e.fileID).toList()); @@ -83,7 +82,7 @@ class EmbeddingStore { Future storeEmbedding(EnteFile file, Embedding embedding) async { await EmbeddingsDB.instance.put(embedding); - // unawaited(_pushEmbedding(file, embedding)); // TODO: uncomment this + unawaited(_pushEmbedding(file, embedding)); } Future clearEmbeddings(Model model) async { @@ -96,7 +95,7 @@ class EmbeddingStore { final encryptionKey = getFileKey(file); final embeddingJSON = jsonEncode(embedding.embedding); final encryptedEmbedding = await CryptoUtil.encryptChaCha( - utf8.encode(embeddingJSON) as Uint8List, + utf8.encode(embeddingJSON), encryptionKey, ); final encryptedData = From 0fe85390d3bb81cfcef10a2b330378c95f89ac68 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 19:22:55 +0530 Subject: [PATCH 0019/1179] [mob][photos] Temp lower minimum similarity threshold --- .../semantic_search/semantic_search_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 7d9844ec7e..f6acea55a6 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -36,7 +36,7 @@ class SemanticSearchService { static final LRUMap> _queryCache = LRUMap(20); static const kEmbeddingLength = 512; - static const kMinimumSimilarityThreshold = 0.23; + static const kMinimumSimilarityThreshold = 0.20; static const kShouldPushEmbeddings = true; static const kDebounceDuration = Duration(milliseconds: 4000); From b0c92f8fe0a5df08f48ee3707a5877dd6511c1fb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 29 Jun 2024 19:25:13 +0530 Subject: [PATCH 0020/1179] [mob][photos] Some debug prints --- .../semantic_search_service.dart | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index f6acea55a6..aade953f3b 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -1,5 +1,6 @@ import "dart:async"; import "dart:collection"; +import "dart:developer" as dev show log; import "dart:math" show min; import "package:computer/computer.dart"; @@ -236,8 +237,16 @@ class SemanticSearchService { }) async { final textEmbedding = await _getTextEmbedding(query); - final queryResults = - await _getSimilarities(textEmbedding, minimumSimilarity: scoreThreshold); + final queryResults = await _getSimilarities( + textEmbedding, + minimumSimilarity: scoreThreshold, + ); + + // print query for top ten scores + for (int i = 0; i < min(10, queryResults.length); i++) { + final result = queryResults[i]; + dev.log("Query: $query, Score: ${result.score}, index $i"); + } final filesMap = await FilesDB.instance .getFilesFromIDs(queryResults.map((e) => e.id).toList()); @@ -267,11 +276,16 @@ class SemanticSearchService { return results; } - Future> getMatchingFileIDs(String query, double minimumSimilarity) async { + Future> getMatchingFileIDs( + String query, + double minimumSimilarity, + ) async { final textEmbedding = await _getTextEmbedding(query); - final queryResults = - await _getSimilarities(textEmbedding, minimumSimilarity: minimumSimilarity); + final queryResults = await _getSimilarities( + textEmbedding, + minimumSimilarity: minimumSimilarity, + ); final queryResultIds = []; for (QueryResult result in queryResults) { @@ -475,6 +489,12 @@ List computeBulkSimilarities(Map args) { imageEmbedding.embedding, textEmbedding, ); + if (imageEmbedding.fileID == 61353139 || + imageEmbedding.fileID == 61921627) { + dev.log( + "Embedding for image ${imageEmbedding.fileID}: ${imageEmbedding.embedding}", + ); + } // TODO: remove this later if (score >= minimumSimilarity) { queryResults.add(QueryResult(imageEmbedding.fileID, score)); } @@ -484,7 +504,10 @@ List computeBulkSimilarities(Map args) { return queryResults; } -double computeCosineSimilarity(List imageEmbedding, List textEmbedding) { +double computeCosineSimilarity( + List imageEmbedding, + List textEmbedding, +) { assert( imageEmbedding.length == textEmbedding.length, "The two embeddings should have the same length", From b3a48194c5f824bf31b7a37c67006e462ace6a1f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:13:29 +0530 Subject: [PATCH 0021/1179] [mob][android] Expose custom onnx plugin --- mobile/android/app/build.gradle | 3 +- .../kotlin/io/ente/photos/MainActivity.kt | 2 + .../kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt | 208 ++++++++++++++++++ mobile/lib/nativeplugins/onnx.dart | 0 4 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt create mode 100644 mobile/lib/nativeplugins/onnx.dart diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index b5225db8ef..3250f82066 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -129,7 +129,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21" implementation 'com.android.support:multidex:1.0.3' implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' + implementation 'com.microsoft.onnxruntime:onnxruntime-android:1.8.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} +} \ No newline at end of file diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt index 8200954d3f..227bc1788e 100644 --- a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt +++ b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt @@ -3,9 +3,11 @@ package io.ente.photos import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant +import io.ente.photos.ml.onnx.EnteOnnxFlutterPlugin class MainActivity : FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) + flutterEngine.plugins.add(EnteOnnxFlutterPlugin()) } } diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt new file mode 100644 index 0000000000..fc6205e82d --- /dev/null +++ b/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt @@ -0,0 +1,208 @@ +package io.ente.photos.ml.onnx + +import android.content.Context +import androidx.annotation.NonNull +import ai.onnxruntime.* +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import kotlinx.coroutines.* +import java.nio.FloatBuffer +import java.util.concurrent.ConcurrentHashMap +import android.util.Log +import java.io.File +import java.util.concurrent.ConcurrentLinkedQueue + +object LongArrayPool { + private val pool = ConcurrentLinkedQueue() + + fun get(size: Int): LongArray { + return pool.poll() ?: LongArray(size) + } + + fun release(array: LongArray) { + pool.offer(array) + } +} + +class EnteOnnxFlutterPlugin : FlutterPlugin, MethodCallHandler { + private var faceOrtEnv: OrtEnvironment = OrtEnvironment.getEnvironment() + private lateinit var channel: MethodChannel + private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + private val sessionMap = ConcurrentHashMap() + private lateinit var context: Context + + companion object { + const val DEFAULT_SESSION_COUNT = 1 + const val K_INPUT_WIDTH = 640 + const val K_INPUT_HEIGHT = 640 + const val K_NUM_CHANNELS = 3 + } + + enum class ModelType { + CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE + } + + data class ModelState( + var isInitialized: Boolean = false, + val sessionAddresses: ConcurrentHashMap = ConcurrentHashMap(), + // number of sessions that should have been created for given model + var sessionsCount: Int = DEFAULT_SESSION_COUNT + ) + + override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "ente_onnx_flutter_plugin") + channel.setMethodCallHandler(this) + context = flutterPluginBinding.applicationContext + } + + override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + releaseAllSessions() + scope.cancel() + } + + override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { + when (call.method) { + "init" -> { + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + val modelPath = call.argument("modelPath") ?: run { + result.error("INVALID_ARGUMENT", "Model path is missing", null) + return + } + val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT + init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) + } + "release" -> { + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + release(ModelType.valueOf(modelType), result) + } + "predict" -> { + val sessionAddress = call.argument("sessionAddress") + val inputData = call.argument>("inputData") + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + if (sessionAddress == null || inputData == null) { + result.error("INVALID_ARGUMENT", "Session address or input data is missing", null) + return + } + val inputDataArray = inputData.map { it.toFloat() }.toFloatArray() + predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, result) + } + else -> result.notImplemented() + } + } + + private fun readModelFile(modelPath: String): ByteArray { + return File(modelPath).readBytes() + } + + private fun init(modelType: ModelType, modelPath: String, sessionsCount: Int, result: Result) { + scope.launch { + val modelState: ModelState + if (sessionMap.containsKey(modelType)) { + modelState = sessionMap[modelType]!! + } else { + modelState = ModelState() + sessionMap[modelType] = modelState + } + if (!modelState.isInitialized) { + val modelBytes = readModelFile(modelPath) + for (i in 0 until sessionsCount) { + val session = createSession(faceOrtEnv, modelBytes) + if (session != null) { + modelState.sessionAddresses[i] = session + } + } + modelState.isInitialized = true + modelState.sessionsCount = sessionsCount + withContext(Dispatchers.Main) { + result.success(true) + } + } else { + withContext(Dispatchers.Main) { + result.success(false) + } + } + } + } + + private fun release(modelType: ModelType, result: Result) { + scope.launch { + val modelState = sessionMap[modelType] + modelState?.let { + it.sessionAddresses.forEach { entry: Map.Entry -> + entry.value.close() + } + it.sessionAddresses.clear() + it.isInitialized = false + } + withContext(Dispatchers.Main) { + result.success(true) + } + } + } + + private fun predict(modelType: ModelType, sessionAddress: Int, inputData: FloatArray, result: Result) { + scope.launch { + val modelState = sessionMap[modelType] + val session = modelState?.sessionAddresses?.get(sessionAddress) + if (session == null) { + withContext(Dispatchers.Main) { + result.error("SESSION_NOT_FOUND", "Session not found for address: $sessionAddress", null) + } + return@launch + } + + try { + val env = OrtEnvironment.getEnvironment() + val inputTensorShape = LongArrayPool.get(4).apply { + this[0] = 1 + this[1] = K_NUM_CHANNELS.toLong() + this[2] = K_INPUT_HEIGHT.toLong() + this[3] = K_INPUT_WIDTH.toLong() + } + val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) + val inputs = mapOf("input" to inputTensor) + val outputs = session.run(inputs) + Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") + + inputTensor.close() + outputs.close() + LongArrayPool.release(inputTensorShape) + withContext(Dispatchers.Main) { + val dummyResult = listOf(0.1, 0.2) // Replace with actual result processing + result.success(dummyResult) + } + } catch (e: OrtException) { + withContext(Dispatchers.Main) { + result.error("PREDICTION_ERROR", "Error during prediction: ${e.message}", null) + } + } + } + } + + private fun createSession(env: OrtEnvironment, modelBytes: ByteArray): OrtSession? { + return env.createSession(modelBytes, OrtSession.SessionOptions()) + } + + private fun releaseAllSessions() { + sessionMap.forEach { (_, modelState) -> + modelState.sessionAddresses.forEach { entry -> + entry.value.close() + } + modelState.sessionAddresses.clear() + } + sessionMap.clear() + } +} diff --git a/mobile/lib/nativeplugins/onnx.dart b/mobile/lib/nativeplugins/onnx.dart new file mode 100644 index 0000000000..e69de29bb2 From 45b570367845f8f1a842f91d9b757a9b05d21266 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:19:11 +0530 Subject: [PATCH 0022/1179] [mob] Use model path for session creation --- .../app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt index fc6205e82d..b301850681 100644 --- a/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt +++ b/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt @@ -117,9 +117,8 @@ class EnteOnnxFlutterPlugin : FlutterPlugin, MethodCallHandler { sessionMap[modelType] = modelState } if (!modelState.isInitialized) { - val modelBytes = readModelFile(modelPath) for (i in 0 until sessionsCount) { - val session = createSession(faceOrtEnv, modelBytes) + val session = createSession(faceOrtEnv, modelPath) if (session != null) { modelState.sessionAddresses[i] = session } @@ -192,8 +191,8 @@ class EnteOnnxFlutterPlugin : FlutterPlugin, MethodCallHandler { } } - private fun createSession(env: OrtEnvironment, modelBytes: ByteArray): OrtSession? { - return env.createSession(modelBytes, OrtSession.SessionOptions()) + private fun createSession(env: OrtEnvironment, modalPath: String): OrtSession? { + return env.createSession(modalPath, OrtSession.SessionOptions()) } private fun releaseAllSessions() { From 487175514005accb5096a48c2cf9c076cf6b9825 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 13:20:09 +0530 Subject: [PATCH 0023/1179] [mob][photos] FileML for faces cleanup unused clip embedding attribute --- .../services/machine_learning/file_ml/file_ml.dart | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/machine_learning/file_ml/file_ml.dart index 9909902766..4ac1370834 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/machine_learning/file_ml/file_ml.dart @@ -5,14 +5,12 @@ class FileMl { final int? height; final int? width; final FaceEmbeddings faceEmbedding; - final ClipEmbedding? clipEmbedding; FileMl( this.fileID, this.faceEmbedding, { this.height, this.width, - this.clipEmbedding, }); // toJson @@ -21,7 +19,6 @@ class FileMl { 'height': height, 'width': width, 'faceEmbedding': faceEmbedding.toJson(), - 'clipEmbedding': clipEmbedding?.toJson(), }; // fromJson factory FileMl.fromJson(Map json) { @@ -30,11 +27,6 @@ class FileMl { FaceEmbeddings.fromJson(json['faceEmbedding'] as Map), height: json['height'] as int?, width: json['width'] as int?, - clipEmbedding: json['clipEmbedding'] == null - ? null - : ClipEmbedding.fromJson( - json['clipEmbedding'] as Map, - ), ); } } @@ -64,8 +56,7 @@ class FaceEmbeddings { json['faces'].map((x) => Face.fromJson(x as Map)), ), json['version'] as int, - client: json['client'] ?? - 'unknown', + client: json['client'] ?? 'unknown', ); } } From 9e76c31655c85b6151ad49ce69309d02e3788473 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 13:30:23 +0530 Subject: [PATCH 0024/1179] [mob][photos] Move cosine function --- .../face_clustering/cosine_distance.dart | 18 ++++++++++++++++++ .../semantic_search_service.dart | 17 +---------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/cosine_distance.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/cosine_distance.dart index 72b9dafead..17b783558d 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/cosine_distance.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/cosine_distance.dart @@ -67,3 +67,21 @@ double cosineDistForNormVectors(List vector1, List vector2) { } return 1.0 - dotProduct; } + +/// NOTE: This function assumes that both embeddings are normalized! +@pragma("vm:prefer-inline") +double computeCosineSimilarity( + List embedding1, + List embedding2, +) { + assert( + embedding1.length == embedding2.length, + "The two embeddings should have the same length", + ); + double cosineSimilarity = 0; + final length = embedding1.length; + for (int index = 0; index < length; index++) { + cosineSimilarity += embedding1[index] * embedding2[index]; + } + return cosineSimilarity; +} diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index aade953f3b..1e39e722df 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -18,6 +18,7 @@ import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; import "package:photos/services/collections_service.dart"; +import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; import 'package:photos/services/machine_learning/semantic_search/frameworks/ggml.dart'; import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; @@ -504,22 +505,6 @@ List computeBulkSimilarities(Map args) { return queryResults; } -double computeCosineSimilarity( - List imageEmbedding, - List textEmbedding, -) { - assert( - imageEmbedding.length == textEmbedding.length, - "The two embeddings should have the same length", - ); - double cosineSimilarity = 0; - final length = imageEmbedding.length; - for (int index = 0; index < length; index++) { - cosineSimilarity += imageEmbedding[index] * textEmbedding[index]; - } - return cosineSimilarity; -} - class QueryResult { final int id; final double score; From f77a33a2c0031786d3fe59bdea18503b7ece9294 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 13:31:00 +0530 Subject: [PATCH 0025/1179] [mob][photos] Remove old todo --- .../semantic_search/semantic_search_service.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 1e39e722df..be1bc08aab 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -490,12 +490,6 @@ List computeBulkSimilarities(Map args) { imageEmbedding.embedding, textEmbedding, ); - if (imageEmbedding.fileID == 61353139 || - imageEmbedding.fileID == 61921627) { - dev.log( - "Embedding for image ${imageEmbedding.fileID}: ${imageEmbedding.embedding}", - ); - } // TODO: remove this later if (score >= minimumSimilarity) { queryResults.add(QueryResult(imageEmbedding.fileID, score)); } From 6622441b38fec2e29c948c9a645179b79322e524 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 13:32:36 +0530 Subject: [PATCH 0026/1179] [mob][photos] Add todo --- mobile/lib/utils/image_isolate.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/utils/image_isolate.dart index ce67c9fa9f..e5850dba29 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/utils/image_isolate.dart @@ -187,6 +187,7 @@ class ImageIsolate { ).then((value) => value.cast()); } + // TODO: remove this later to have clip indexing combined with faces Future> inferClipImageEmbedding(String imagePath, int encoderAddress) async { return await _runInIsolate( ( From 6c3ba60b1bb695b0613dc585b5687a0edf86ab6c Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 14:01:23 +0530 Subject: [PATCH 0027/1179] [mob][photos] Create separate FaceRecognitionService --- .../face_ml/face_ml_service.dart | 34 ++--------- .../face_ml/face_recognition_service.dart | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 62cf99a252..c12e29b121 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -14,7 +14,6 @@ import "package:onnxruntime/onnxruntime.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; -import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/list.dart"; @@ -36,6 +35,7 @@ import 'package:photos/services/machine_learning/face_ml/face_detection/face_det import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import 'package:photos/services/machine_learning/face_ml/face_ml_result.dart'; +import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; @@ -91,8 +91,6 @@ class FaceMlService { bool _mlControllerStatus = false; bool _isIndexingOrClusteringRunning = false; bool _shouldPauseIndexingAndClustering = false; - bool _shouldSyncPeople = false; - bool _isSyncing = false; static const int _fileDownloadLimit = 10; static const _embeddingFetchLimit = 200; @@ -106,6 +104,9 @@ class FaceMlService { } _logger.info("init called"); + // Activate FaceRecognitionService + await FaceRecognitionService.instance.init(); + // Listen on MachineLearningController Bus.instance.on().listen((event) { if (LocalSettings.instance.isFaceIndexingEnabled == false) { @@ -132,41 +133,17 @@ class FaceMlService { } }); - // Listen on DiffSync - Bus.instance.on().listen((event) async { - unawaited(sync()); - }); - - // Listne on PeopleChanged - Bus.instance.on().listen((event) { - if (event.type == PeopleEventType.syncDone) return; - _shouldSyncPeople = true; - }); - _isInitialized = true; _logger.info('init done'); } - Future sync({bool forceSync = true}) async { - if (_isSyncing) { - return; - } - _isSyncing = true; - if (forceSync) { - await PersonService.instance.reconcileClusters(); - Bus.instance.fire(PeopleChangedEvent(type: PeopleEventType.syncDone)); - _shouldSyncPeople = false; - } - _isSyncing = false; - } - Future runAllFaceML({bool force = false}) async { if (force) { _mlControllerStatus = true; } if (_cannotRunMLFunction() && !force) return; - await sync(forceSync: _shouldSyncPeople); + await FaceRecognitionService.instance.sync(); final int unclusteredFacesCount = await FaceMLDataDB.instance.getUnclusteredFaceCount(); @@ -1177,7 +1154,6 @@ class FaceMlService { isIndexingOrClusteringRunning: $_isIndexingOrClusteringRunning shouldPauseIndexingAndClustering: $_shouldPauseIndexingAndClustering debugIndexingDisabled: $debugIndexingDisabled - shouldSyncPeople: $_shouldSyncPeople '''; _logger.info(status); } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart new file mode 100644 index 0000000000..7563f3d9ca --- /dev/null +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -0,0 +1,57 @@ +import "dart:async" show unawaited; + +import "package:logging/logging.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/diff_sync_complete_event.dart"; +import "package:photos/events/people_changed_event.dart"; +import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; + +class FaceRecognitionService { + final _logger = Logger("FaceRecognitionService"); + + // Singleton pattern + FaceRecognitionService._privateConstructor(); + static final instance = FaceRecognitionService._privateConstructor(); + factory FaceRecognitionService() => instance; + + bool _isInitialized = false; + + bool get isInitialized => _isInitialized; + + bool _shouldSyncPeople = false; + bool _isSyncing = false; + + Future init() async { + if (_isInitialized) { + return; + } + _logger.info("init called"); + + // Listen on DiffSync + Bus.instance.on().listen((event) async { + unawaited(sync()); + }); + + // Listen on PeopleChanged + Bus.instance.on().listen((event) { + if (event.type == PeopleEventType.syncDone) return; + _shouldSyncPeople = true; + }); + + _isInitialized = true; + _logger.info('init done'); + } + + Future sync() async { + if (_isSyncing) { + return; + } + _isSyncing = true; + if (_shouldSyncPeople) { + await PersonService.instance.reconcileClusters(); + Bus.instance.fire(PeopleChangedEvent(type: PeopleEventType.syncDone)); + _shouldSyncPeople = false; + } + _isSyncing = false; + } +} From 351d5f85ac2cd5e418b83f0260fd8fc27d9207ce Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 14:27:37 +0530 Subject: [PATCH 0028/1179] [mob][photos] Minor change --- .../semantic_search/semantic_search_service.dart | 5 +---- mobile/lib/utils/ml_util.dart | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index be1bc08aab..0c717d9791 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -222,10 +222,7 @@ class SemanticSearchService { final embeddedFileIDs = await EmbeddingsDB.instance.getFileIDs(_currentModel); - uploadedFileIDs.removeWhere( - (id) => embeddedFileIDs.contains(id), - ); - return uploadedFileIDs; + return uploadedFileIDs.difference(embeddedFileIDs).toList(); } Future clearQueue() async { diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index f440d6868f..c81a288dd2 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -14,8 +14,10 @@ final _logger = Logger("MlUtil"); enum FileDataForML { thumbnailData, fileData } -Future> getIndexableFileIDs() async { - return FilesDB.instance.getOwnedFileIDs(Configuration.instance.getUserID()!); +Future> getIndexableFileIDs() async { + final fileIDs = await FilesDB.instance + .getOwnedFileIDs(Configuration.instance.getUserID()!); + return fileIDs.toSet(); } Future getImagePathForML( From d15138de9b0b0ad7870539f42e9618a93e189678 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 15:30:49 +0530 Subject: [PATCH 0029/1179] [mob][photos] Minor change --- mobile/lib/utils/network_util.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/lib/utils/network_util.dart b/mobile/lib/utils/network_util.dart index a3b28561cf..a6e1fa0c44 100644 --- a/mobile/lib/utils/network_util.dart +++ b/mobile/lib/utils/network_util.dart @@ -17,5 +17,7 @@ Future canUseHighBandwidth() async { ); } } - return canUploadUnderCurrentNetworkConditions; + final canDownloadOverMobileData = + Configuration.instance.shouldBackupOverMobileData(); + return canUploadUnderCurrentNetworkConditions || canDownloadOverMobileData; } From 55858eba0bc0a59b1d660a776423185c784f2e8d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 15:45:42 +0530 Subject: [PATCH 0030/1179] [mob][photos] Small cleanup of FaceMlService --- .../face_ml/face_ml_service.dart | 95 +++---------------- .../file_ml/remote_fileml_service.dart | 44 +++++++++ 2 files changed, 55 insertions(+), 84 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index c12e29b121..473f911ada 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -8,7 +8,7 @@ import "dart:ui" show Image; import "package:computer/computer.dart"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; -import "package:flutter/foundation.dart" show debugPrint, kDebugMode; +import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:package_info_plus/package_info_plus.dart"; @@ -17,7 +17,6 @@ import "package:photos/db/files_db.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/list.dart"; -import "package:photos/extensions/stop_watch.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/box.dart"; import "package:photos/face/model/detection.dart" as face_detection; @@ -173,23 +172,21 @@ class FaceMlService { _isIndexingOrClusteringRunning = true; _logger.info('starting image indexing'); - final w = (kDebugMode ? EnteWatch('prepare indexing files') : null) - ?..start(); + // Get indexed fileIDs, all regular files, and all hidden files final Map alreadyIndexedFiles = await FaceMLDataDB.instance.getIndexedFileIds(); - w?.log('getIndexedFileIds'); final List enteFiles = await SearchService.instance.getAllFiles(); - w?.log('getAllFiles'); + final List hiddenFiles = + await SearchService.instance.getHiddenFiles(); + // Sort out what should be indexed and in what order int fileAnalyzedCount = 0; int fileSkippedCount = 0; final stopwatch = Stopwatch()..start(); final List filesWithLocalID = []; final List filesWithoutLocalID = []; final List hiddenFilesToIndex = []; - w?.log('getIndexableFileIDs'); - for (final EnteFile enteFile in enteFiles) { if (_skipAnalysisEnteFile(enteFile, alreadyIndexedFiles)) { fileSkippedCount++; @@ -201,10 +198,6 @@ class FaceMlService { filesWithLocalID.add(enteFile); } } - w?.log('sifting through all normal files'); - final List hiddenFiles = - await SearchService.instance.getHiddenFiles(); - w?.log('getHiddenFiles: ${hiddenFiles.length} hidden files'); for (final EnteFile enteFile in hiddenFiles) { if (_skipAnalysisEnteFile(enteFile, alreadyIndexedFiles)) { fileSkippedCount++; @@ -212,26 +205,20 @@ class FaceMlService { } hiddenFilesToIndex.add(enteFile); } - - // list of files where files with localID are first final sortedBylocalID = []; sortedBylocalID.addAll(filesWithLocalID); sortedBylocalID.addAll(filesWithoutLocalID); sortedBylocalID.addAll(hiddenFilesToIndex); - w?.log('preparing all files to index'); final List> chunks = - sortedBylocalID.chunks(_embeddingFetchLimit); + sortedBylocalID.chunks(_embeddingFetchLimit); // Chunks of 200 + int fetchedCount = 0; outerLoop: for (final chunk in chunks) { + // Fetching and storing remote embeddings if (LocalSettings.instance.remoteFetchEnabled) { try { - final Set fileIds = - {}; // if there are duplicates here server returns 400 - // Try to find embeddings on the remote server - for (final f in chunk) { - fileIds.add(f.uploadedFileID!); - } + final fileIds = chunk.map((file) => file.uploadedFileID!).toSet(); _logger.info('starting remote fetch for ${fileIds.length} files'); final res = await RemoteFileMLService.instance.getFilessEmbedding(fileIds); @@ -240,7 +227,7 @@ class FaceMlService { final List faces = []; final remoteFileIdToVersion = {}; for (FileMl fileMl in res.mlData.values) { - if (_shouldDiscardRemoteEmbedding(fileMl)) continue; + if (shouldDiscardRemoteEmbedding(fileMl)) continue; if (fileMl.faceEmbedding.faces.isEmpty) { faces.add( Face.empty( @@ -297,6 +284,7 @@ class FaceMlService { 'Not fetching embeddings because user manually disabled it in debug options', ); } + final smallerChunks = chunk.chunks(_fileDownloadLimit); for (final smallestChunk in smallerChunks) { final futures = >[]; @@ -807,8 +795,6 @@ class FaceMlService { /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. Future _analyzeImageInSingleIsolate(EnteFile enteFile) async { - _checkEnteFileForID(enteFile); - final String filePath = await getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); @@ -1038,66 +1024,7 @@ class FaceMlService { } } - bool _shouldDiscardRemoteEmbedding(FileMl fileMl) { - if (fileMl.faceEmbedding.version < faceMlVersion) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); - return true; - } - // are all landmarks equal? - bool allLandmarksEqual = true; - if (fileMl.faceEmbedding.faces.isEmpty) { - debugPrint("No face for ${fileMl.fileID}"); - allLandmarksEqual = false; - } - for (final face in fileMl.faceEmbedding.faces) { - if (face.detection.landmarks.isEmpty) { - allLandmarksEqual = false; - break; - } - if (face.detection.landmarks - .any((landmark) => landmark.x != landmark.y)) { - allLandmarksEqual = false; - break; - } - } - if (allLandmarksEqual) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because landmarks are equal"); - debugPrint( - fileMl.faceEmbedding.faces - .map((e) => e.detection.landmarks.toString()) - .toList() - .toString(), - ); - return true; - } - if (fileMl.width == null || fileMl.height == null) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because width is null"); - return true; - } - return false; - } - - /// Checks if the ente file to be analyzed actually can be analyzed: it must be uploaded and in the correct format. - void _checkEnteFileForID(EnteFile enteFile) { - if (_skipAnalysisEnteFile(enteFile, {})) { - final String logString = - '''Skipped analysis of image with enteFile, it might be the wrong format or has no uploadedFileID, or MLController doesn't allow it to run. - enteFile: ${enteFile.toString()} - '''; - _logger.warning(logString); - _logStatus(); - throw GeneralFaceMlException(logString); - } - } - bool _skipAnalysisEnteFile(EnteFile enteFile, Map indexedFileIds) { - if (_isIndexingOrClusteringRunning == false || - _mlControllerStatus == false) { - return true; - } // Skip if the file is not uploaded or not owned by the user if (!enteFile.isUploaded || enteFile.isOwner == false) { return true; diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 4712916d07..4bff78a35b 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -2,10 +2,12 @@ import "dart:async"; import "dart:convert"; import "package:computer/computer.dart"; +import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; import "package:photos/services/machine_learning/semantic_search/embedding_store.dart"; @@ -139,4 +141,46 @@ Future> _decryptFileMLComputer( result[input.embedding.fileID] = decodedEmbedding; } return result; + } + +bool shouldDiscardRemoteEmbedding(FileMl fileMl) { + if (fileMl.faceEmbedding.version < faceMlVersion) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); + return true; + } + // are all landmarks equal? + bool allLandmarksEqual = true; + if (fileMl.faceEmbedding.faces.isEmpty) { + debugPrint("No face for ${fileMl.fileID}"); + allLandmarksEqual = false; + } + for (final face in fileMl.faceEmbedding.faces) { + if (face.detection.landmarks.isEmpty) { + allLandmarksEqual = false; + break; + } + if (face.detection.landmarks + .any((landmark) => landmark.x != landmark.y)) { + allLandmarksEqual = false; + break; + } + } + if (allLandmarksEqual) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because landmarks are equal"); + debugPrint( + fileMl.faceEmbedding.faces + .map((e) => e.detection.landmarks.toString()) + .toList() + .toString(), + ); + return true; + } + if (fileMl.width == null || fileMl.height == null) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because width is null"); + return true; + } + return false; } \ No newline at end of file From 53d56254993fb6770dfd2b8e358972b735566159 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 17:18:40 +0530 Subject: [PATCH 0031/1179] [mob][photos] Move ONNX model initialization in abstract class --- .../face_detection_service.dart | 83 ++----------------- .../face_embedding_service.dart | 80 ++---------------- .../services/machine_learning/ml_model.dart | 76 +++++++++++++++++ 3 files changed, 94 insertions(+), 145 deletions(-) create mode 100644 mobile/lib/services/machine_learning/ml_model.dart diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 455f4e9c8d..7619bc9015 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -1,79 +1,40 @@ import "dart:async"; import "dart:developer" as dev show log; -import "dart:io" show File; import 'dart:typed_data' show ByteData; import 'dart:ui' as ui show Image; -import "package:computer/computer.dart"; import 'package:logging/logging.dart'; import 'package:onnxruntime/onnxruntime.dart'; import "package:photos/face/model/dimension.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_postprocessing.dart"; -import "package:photos/services/remote_assets_service.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/utils/image_ml_util.dart"; class YOLOFaceInterpreterRunException implements Exception {} /// This class is responsible for running the face detection model (YOLOv5Face) on ONNX runtime, and can be accessed through the singleton instance [FaceDetectionService.instance]. -class FaceDetectionService { +class FaceDetectionService extends MlModel { + static const kRemoteBucketModelPath = "yolov5s_face_640_640_dynamic.onnx"; + + @override + String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; + + @override + Logger get logger => _logger; static final _logger = Logger('FaceDetectionService'); - final _computer = Computer.shared(); - - int sessionAddress = 0; - - static const String kModelBucketEndpoint = "https://models.ente.io/"; - static const String kRemoteBucketModelPath = - "yolov5s_face_640_640_dynamic.onnx"; - static const String modelRemotePath = - kModelBucketEndpoint + kRemoteBucketModelPath; - static const int kInputWidth = 640; static const int kInputHeight = 640; static const double kIouThreshold = 0.4; static const double kMinScoreSigmoidThreshold = 0.7; static const int kNumKeypoints = 5; - bool isInitialized = false; - // Singleton pattern FaceDetectionService._privateConstructor(); static final instance = FaceDetectionService._privateConstructor(); factory FaceDetectionService() => instance; - /// Check if the interpreter is initialized, if not initialize it with `loadModel()` - Future init() async { - if (!isInitialized) { - _logger.info('init is called'); - final model = - await RemoteAssetsService.instance.getAsset(modelRemotePath); - final startTime = DateTime.now(); - sessionAddress = await _computer.compute( - _loadModel, - param: { - "modelPath": model.path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Face detection model loaded, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - if (sessionAddress != -1) { - isInitialized = true; - } - } - } - - Future release() async { - if (isInitialized) { - await _computer - .compute(_releaseModel, param: {'address': sessionAddress}); - isInitialized = false; - sessionAddress = 0; - } - } - /// Detects faces in the given image data. static Future<(List, Dimensions)> predict( ui.Image image, @@ -184,30 +145,4 @@ class FaceDetectionService { return relativeDetections; } - - /// Initialize the interpreter by loading the model file. - static Future _loadModel(Map args) async { - final sessionOptions = OrtSessionOptions() - ..setInterOpNumThreads(1) - ..setIntraOpNumThreads(1) - ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); - try { - final session = - OrtSession.fromFile(File(args["modelPath"]), sessionOptions); - return session.address; - } catch (e, s) { - _logger.severe('Face detection model not loaded', e, s); - } - return -1; - } - - static Future _releaseModel(Map args) async { - final address = args['address'] as int; - if (address == 0) { - return; - } - final session = OrtSession.fromAddress(address); - session.release(); - return; - } } diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index 0e49cb8c4f..e4536dfeaa 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -1,95 +1,33 @@ -import "dart:io" show File; import 'dart:math' as math show sqrt; import 'dart:typed_data' show Float32List; -import 'package:computer/computer.dart'; import 'package:logging/logging.dart'; import 'package:onnxruntime/onnxruntime.dart'; -import "package:photos/services/remote_assets_service.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; class MobileFaceNetInterpreterRunException implements Exception {} /// This class is responsible for running the face embedding model (MobileFaceNet) on ONNX runtime, and can be accessed through the singleton instance [FaceEmbeddingService.instance]. -class FaceEmbeddingService { - static const kModelBucketEndpoint = "https://models.ente.io/"; +class FaceEmbeddingService extends MlModel { static const kRemoteBucketModelPath = "mobilefacenet_opset15.onnx"; - static const modelRemotePath = kModelBucketEndpoint + kRemoteBucketModelPath; + + @override + String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; + + @override + Logger get logger => _logger; + static final _logger = Logger('FaceEmbeddingService'); static const int kInputSize = 112; static const int kEmbeddingSize = 192; static const int kNumChannels = 3; static const bool kPreWhiten = false; - static final _logger = Logger('FaceEmbeddingService'); - - bool isInitialized = false; - int sessionAddress = 0; - - final _computer = Computer.shared(); - // Singleton pattern FaceEmbeddingService._privateConstructor(); static final instance = FaceEmbeddingService._privateConstructor(); factory FaceEmbeddingService() => instance; - /// Check if the interpreter is initialized, if not initialize it with `loadModel()` - Future init() async { - if (!isInitialized) { - _logger.info('init is called'); - final model = - await RemoteAssetsService.instance.getAsset(modelRemotePath); - final startTime = DateTime.now(); - // Doing this from main isolate since `rootBundle` cannot be accessed outside it - sessionAddress = await _computer.compute( - _loadModel, - param: { - "modelPath": model.path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Face embedding model loaded, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - if (sessionAddress != -1) { - isInitialized = true; - } - } - } - - Future release() async { - if (isInitialized) { - await _computer - .compute(_releaseModel, param: {'address': sessionAddress}); - isInitialized = false; - sessionAddress = 0; - } - } - - static Future _loadModel(Map args) async { - final sessionOptions = OrtSessionOptions() - ..setInterOpNumThreads(1) - ..setIntraOpNumThreads(1) - ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); - try { - final session = - OrtSession.fromFile(File(args["modelPath"]), sessionOptions); - return session.address; - } catch (e, s) { - _logger.severe('Face embedding model not loaded', e, s); - } - return -1; - } - - static Future _releaseModel(Map args) async { - final address = args['address'] as int; - if (address == 0) { - return; - } - final session = OrtSession.fromAddress(address); - session.release(); - return; - } - static Future>> predict( Float32List input, int sessionAddress, diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart new file mode 100644 index 0000000000..6565b67edb --- /dev/null +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -0,0 +1,76 @@ +import "dart:io" show File; + +import "package:computer/computer.dart"; +import "package:logging/logging.dart"; +import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/services/remote_assets_service.dart"; + +abstract class MlModel { + Logger get logger; + + String get kModelBucketEndpoint => "https://models.ente.io/"; + static const kRemoteBucketModelPath = ""; + + String get modelRemotePath; + + bool isInitialized = false; + int sessionAddress = 0; + + final computer = Computer.shared(); + + Future init() async { + if (!isInitialized) { + logger.info('init is called'); + final model = + await RemoteAssetsService.instance.getAsset(modelRemotePath); + final startTime = DateTime.now(); + try { + sessionAddress = await computer.compute( + _loadModel, + param: { + "modelPath": model.path, + }, + ); + isInitialized = true; + final endTime = DateTime.now(); + logger.info( + "model loaded, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", + ); + } catch (e, s) { + logger.severe('model not loaded', e, s); + } + } + } + + Future release() async { + if (isInitialized) { + await computer.compute(_releaseModel, param: {'address': sessionAddress}); + isInitialized = false; + sessionAddress = 0; + } + } + + static Future _loadModel(Map args) async { + final sessionOptions = OrtSessionOptions() + ..setInterOpNumThreads(1) + ..setIntraOpNumThreads(1) + ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); + try { + final session = + OrtSession.fromFile(File(args["modelPath"]), sessionOptions); + return session.address; + } catch (e) { + rethrow; + } + } + + static Future _releaseModel(Map args) async { + final address = args['address'] as int; + if (address == 0) { + return; + } + final session = OrtSession.fromAddress(address); + session.release(); + return; + } +} From 16e68123199a0fba004541bc7f4637af7aea9095 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 17:34:22 +0530 Subject: [PATCH 0032/1179] [mob][photos] Embedding normalization function --- .../face_embedding_service.dart | 11 +---- .../frameworks/onnx/onnx_image_encoder.dart | 45 ++++++++----------- mobile/lib/utils/ml_util.dart | 12 +++++ 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index e4536dfeaa..e7862c288f 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -1,9 +1,9 @@ -import 'dart:math' as math show sqrt; import 'dart:typed_data' show Float32List; import 'package:logging/logging.dart'; import 'package:onnxruntime/onnxruntime.dart'; import "package:photos/services/machine_learning/ml_model.dart"; +import "package:photos/utils/ml_util.dart"; class MobileFaceNetInterpreterRunException implements Exception {} @@ -48,14 +48,7 @@ class FaceEmbeddingService extends MlModel { final embeddings = outputs[0]?.value as List>; for (final embedding in embeddings) { - double normalization = 0; - for (int i = 0; i < kEmbeddingSize; i++) { - normalization += embedding[i] * embedding[i]; - } - final double sqrtNormalization = math.sqrt(normalization); - for (int i = 0; i < kEmbeddingSize; i++) { - embedding[i] = embedding[i] / sqrtNormalization; - } + normalizeEmbedding(embedding); } stopwatch.stop(); _logger.info( diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index f4fe9c4c0f..df31e34e05 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -1,32 +1,29 @@ import "dart:io"; -import "dart:math"; import "dart:typed_data"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/utils/image_ml_util.dart"; +import "package:photos/utils/ml_util.dart"; -class OnnxImageEncoder { - final _logger = Logger("OnnxImageEncoder"); +class ClipImageEncoder extends MlModel { + static const kRemoteBucketModelPath = "clip-image-vit-32-float32.onnx"; + // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; - Future loadModel(Map args) async { - final sessionOptions = OrtSessionOptions() - ..setInterOpNumThreads(1) - ..setIntraOpNumThreads(1) - ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); - try { - final session = - OrtSession.fromFile(File(args["imageModelPath"]), sessionOptions); - _logger.info('image model loaded'); + @override + String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; - return session.address; - } catch (e, s) { - _logger.severe(e, s); - } - return -1; - } + @override + Logger get logger => _logger; + static final _logger = Logger('ClipImageEncoder'); - static Future> inferByImage(Map args) async { + // Singleton pattern + ClipImageEncoder._privateConstructor(); + static final instance = ClipImageEncoder._privateConstructor(); + factory ClipImageEncoder() => instance; + + static Future> predict(Map args) async { final imageData = await File(args["imagePath"]).readAsBytes(); final image = await decodeImageFromData(imageData); final ByteData imgByteData = await getByteDataFromImage(image); @@ -41,14 +38,8 @@ class OnnxImageEncoder { final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; - double imageNormalization = 0; - for (int i = 0; i < 512; i++) { - imageNormalization += embedding[i] * embedding[i]; - } - final double sqrtImageNormalization = sqrt(imageNormalization); - for (int i = 0; i < 512; i++) { - embedding[i] = embedding[i] / sqrtImageNormalization; - } + normalizeEmbedding(embedding); + return embedding; } } diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index c81a288dd2..cc783ad1db 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,4 +1,5 @@ import "dart:io" show File; +import "dart:math" as math show sqrt; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; @@ -89,3 +90,14 @@ Future getImagePathForML( return imagePath; } + +void normalizeEmbedding(List embedding) { + double normalization = 0; + for (int i = 0; i < embedding.length; i++) { + normalization += embedding[i] * embedding[i]; + } + final double sqrtNormalization = math.sqrt(normalization); + for (int i = 0; i < embedding.length; i++) { + embedding[i] = embedding[i] / sqrtNormalization; + } +} From e84c9e604ade9b78c70f06d1dfce404168f1e220 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 17:37:28 +0530 Subject: [PATCH 0033/1179] [mob][photos] misplaced comment --- .../semantic_search/frameworks/onnx/onnx_image_encoder.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index df31e34e05..248772cbe1 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -9,7 +9,6 @@ import "package:photos/utils/ml_util.dart"; class ClipImageEncoder extends MlModel { static const kRemoteBucketModelPath = "clip-image-vit-32-float32.onnx"; - // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; From 63c570b73af09da9468c1d1d0088ce0ff5ab97ca Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 17:38:45 +0530 Subject: [PATCH 0034/1179] [mob][photos] Redundant line --- mobile/lib/services/machine_learning/ml_model.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 6565b67edb..8ade4acc64 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -9,7 +9,6 @@ abstract class MlModel { Logger get logger; String get kModelBucketEndpoint => "https://models.ente.io/"; - static const kRemoteBucketModelPath = ""; String get modelRemotePath; From e76d26914d712258246b3099273aa6ff5f5fccd0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 2 Jul 2024 17:47:40 +0530 Subject: [PATCH 0035/1179] [mob][photos] Delete clip ggml --- .../semantic_search/frameworks/ggml.dart | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 mobile/lib/services/machine_learning/semantic_search/frameworks/ggml.dart diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/ggml.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/ggml.dart deleted file mode 100644 index f83a2a6698..0000000000 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/ggml.dart +++ /dev/null @@ -1,115 +0,0 @@ -import "package:clip_ggml/clip_ggml.dart"; -import "package:computer/computer.dart"; -import "package:logging/logging.dart"; -import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; - -class GGML extends MLFramework { - static const kModelBucketEndpoint = "https://models.ente.io/"; - static const kImageModel = "clip-vit-base-patch32_ggml-vision-model-f16.gguf"; - static const kTextModel = "clip-vit-base-patch32_ggml-text-model-f16.gguf"; - - final _computer = Computer.shared(); - final _logger = Logger("GGML"); - - GGML(super.shouldDownloadOverMobileData); - - @override - String getImageModelRemotePath() { - return kModelBucketEndpoint + kImageModel; - } - - @override - String getTextModelRemotePath() { - return kModelBucketEndpoint + kTextModel; - } - - @override - Future loadImageModel(String path) async { - final startTime = DateTime.now(); - await _computer.compute( - loadModel, - param: { - "imageModelPath": path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Loading image model took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } - - @override - Future loadTextModel(String path) async { - final startTime = DateTime.now(); - await _computer.compute( - loadModel, - param: { - "textModelPath": path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Loading text model took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } - - @override - Future> getImageEmbedding(String imagePath) async { - try { - final startTime = DateTime.now(); - final result = await _computer.compute( - _createImageEmbedding, - param: { - "imagePath": imagePath, - }, - taskName: "createImageEmbedding", - ) as List; - final endTime = DateTime.now(); - _logger.info( - "createImageEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", - ); - return result; - } catch (e, s) { - _logger.severe(e, s); - rethrow; - } - } - - @override - Future> getTextEmbedding(String text) async { - try { - final startTime = DateTime.now(); - final result = await _computer.compute( - _createTextEmbedding, - param: { - "text": text, - }, - taskName: "createTextEmbedding", - ) as List; - final endTime = DateTime.now(); - _logger.info( - "createTextEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", - ); - return result; - } catch (e, s) { - _logger.severe(e, s); - rethrow; - } - } -} - -void loadModel(Map args) { - if (args["imageModelPath"] != null) { - CLIP.loadImageModel(args["imageModelPath"]); - } else if (args["textModelPath"] != null) { - CLIP.loadTextModel(args["textModelPath"]); - } -} - -List _createImageEmbedding(Map args) { - return CLIP.createImageEmbedding(args["imagePath"]); -} - -List _createTextEmbedding(Map args) { - return CLIP.createTextEmbedding(args["text"]); -} From 4cdbb0c12849565a00a9d35b1a1a492e19d68e61 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 11:11:09 +0530 Subject: [PATCH 0036/1179] [mob][photos] Automatically init ONNX environment --- .../face_detection_service.dart | 3 ++ .../face_embedding_service.dart | 3 ++ .../services/machine_learning/ml_model.dart | 5 ++ .../services/machine_learning/onnx_env.dart | 31 +++++++++++++ .../frameworks/onnx/onnx_image_encoder.dart | 3 ++ .../frameworks/onnx/onnx_text_encoder.dart | 46 +++++++++---------- 6 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 mobile/lib/services/machine_learning/onnx_env.dart diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 7619bc9015..baf7e65744 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -24,6 +24,9 @@ class FaceDetectionService extends MlModel { Logger get logger => _logger; static final _logger = Logger('FaceDetectionService'); + @override + String get modelName => "YOLOv5Face"; + static const int kInputWidth = 640; static const int kInputHeight = 640; static const double kIouThreshold = 0.4; diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index e7862c288f..9dd1ec2b08 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -18,6 +18,9 @@ class FaceEmbeddingService extends MlModel { Logger get logger => _logger; static final _logger = Logger('FaceEmbeddingService'); + @override + String get modelName => "MobileFaceNet"; + static const int kInputSize = 112; static const int kEmbeddingSize = 192; static const int kNumChannels = 3; diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 8ade4acc64..83cff7ad65 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -3,6 +3,7 @@ import "dart:io" show File; import "package:computer/computer.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/services/machine_learning/onnx_env.dart"; import "package:photos/services/remote_assets_service.dart"; abstract class MlModel { @@ -12,6 +13,8 @@ abstract class MlModel { String get modelRemotePath; + String get modelName; + bool isInitialized = false; int sessionAddress = 0; @@ -30,6 +33,7 @@ abstract class MlModel { "modelPath": model.path, }, ); + await ONNXEnv.instance.initONNX(modelName); isInitialized = true; final endTime = DateTime.now(); logger.info( @@ -44,6 +48,7 @@ abstract class MlModel { Future release() async { if (isInitialized) { await computer.compute(_releaseModel, param: {'address': sessionAddress}); + await ONNXEnv.instance.releaseONNX(modelName); isInitialized = false; sessionAddress = 0; } diff --git a/mobile/lib/services/machine_learning/onnx_env.dart b/mobile/lib/services/machine_learning/onnx_env.dart new file mode 100644 index 0000000000..fadf3c6d4f --- /dev/null +++ b/mobile/lib/services/machine_learning/onnx_env.dart @@ -0,0 +1,31 @@ +import "package:computer/computer.dart"; +import "package:onnxruntime/onnxruntime.dart"; + +class ONNXEnv { + final Set _loadedModels = {}; + + final _computer = Computer.shared(); + + // Singleton pattern + ONNXEnv._privateConstructor(); + static final instance = ONNXEnv._privateConstructor(); + factory ONNXEnv() => instance; + + Future initONNX(String modelName) async { + if (_loadedModels.isEmpty) { + await _computer.compute(() => OrtEnv.instance.init()); + } + _loadedModels.add(modelName); + } + + Future releaseONNX(String modelName) async { + _loadedModels.remove(modelName); + if (_loadedModels.isEmpty) { + await _computer.compute(() => OrtEnv.instance.release()); + } + } + + bool isInit() { + return _loadedModels.isNotEmpty; + } +} diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart index 248772cbe1..b563186b00 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart @@ -17,6 +17,9 @@ class ClipImageEncoder extends MlModel { Logger get logger => _logger; static final _logger = Logger('ClipImageEncoder'); + @override + String get modelName => "ClipImageEncoder"; + // Singleton pattern ClipImageEncoder._privateConstructor(); static final instance = ClipImageEncoder._privateConstructor(); diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart index 7094447cae..6c35f49450 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart @@ -4,17 +4,34 @@ import "dart:math"; import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart'; import "package:photos/services/remote_assets_service.dart"; -class OnnxTextEncoder { - static const kVocabRemotePath = - "https://models.ente.io/bpe_simple_vocab_16e6.txt"; - final _logger = Logger("OnnxTextEncoder"); +class ClipTextEncoder extends MlModel { + static const kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; + // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; + static const kRemoteBucketVocabPath = "bpe_simple_vocab_16e6.txt"; + + @override + String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; + + String get kVocabRemotePath => kModelBucketEndpoint + kRemoteBucketVocabPath; + + @override + Logger get logger => _logger; + static final _logger = Logger('ClipTextEncoder'); + + @override + String get modelName => "ClipTextEncoder"; + + // Singleton pattern + ClipTextEncoder._privateConstructor(); + static final instance = ClipTextEncoder._privateConstructor(); + factory ClipTextEncoder() => instance; final OnnxTextTokenizer _tokenizer = OnnxTextTokenizer(); - Future initTokenizer() async { final File vocabFile = await RemoteAssetsService.instance.getAsset(kVocabRemotePath); @@ -22,23 +39,6 @@ class OnnxTextEncoder { await _tokenizer.init(vocab); } - Future loadModel(Map args) async { - final sessionOptions = OrtSessionOptions() - ..setInterOpNumThreads(1) - ..setIntraOpNumThreads(1) - ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); - try { - _logger.info("Loading text model"); - final session = - OrtSession.fromFile(File(args["textModelPath"]), sessionOptions); - _logger.info('text model loaded'); - return session.address; - } catch (e, s) { - _logger.severe('text model not loaded', e, s); - } - return -1; - } - Future> infer(Map args) async { final text = args["text"]; final address = args["address"] as int; @@ -54,7 +54,7 @@ class OnnxTextEncoder { for (int i = 0; i < 512; i++) { textNormalization += embedding[i] * embedding[i]; } - + final double sqrtTextNormalization = sqrt(textNormalization); for (int i = 0; i < 512; i++) { embedding[i] = embedding[i] / sqrtTextNormalization; From 2d0cadc8c9c068b0a7bd5496e6e8c4397e3513f3 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 11:19:59 +0530 Subject: [PATCH 0037/1179] [mob][photos] Rename and delete lot of clip stuff --- .../clip_image_encoder.dart} | 0 .../clip_text_encoder.dart} | 2 +- .../clip_text_tokenizer.dart} | 0 .../frameworks/ml_framework.dart | 156 ------------------ .../semantic_search/frameworks/onnx/onnx.dart | 127 -------------- 5 files changed, 1 insertion(+), 284 deletions(-) rename mobile/lib/services/machine_learning/semantic_search/{frameworks/onnx/onnx_image_encoder.dart => clip/clip_image_encoder.dart} (100%) rename mobile/lib/services/machine_learning/semantic_search/{frameworks/onnx/onnx_text_encoder.dart => clip/clip_text_encoder.dart} (98%) rename mobile/lib/services/machine_learning/semantic_search/{frameworks/onnx/onnx_text_tokenizer.dart => clip/clip_text_tokenizer.dart} (100%) delete mode 100644 mobile/lib/services/machine_learning/semantic_search/frameworks/ml_framework.dart delete mode 100644 mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart similarity index 100% rename from mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart rename to mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart similarity index 98% rename from mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart rename to mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 6c35f49450..e6db45ff3c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -5,7 +5,7 @@ import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:photos/services/machine_learning/ml_model.dart"; -import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart'; +import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart'; import "package:photos/services/remote_assets_service.dart"; class ClipTextEncoder extends MlModel { diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart similarity index 100% rename from mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_tokenizer.dart rename to mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/ml_framework.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/ml_framework.dart deleted file mode 100644 index d3736d7680..0000000000 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/ml_framework.dart +++ /dev/null @@ -1,156 +0,0 @@ -import "dart:async"; -import "dart:io"; - -import "package:connectivity_plus/connectivity_plus.dart"; -import "package:logging/logging.dart"; -import "package:photos/core/errors.dart"; -import "package:photos/core/event_bus.dart"; -import "package:photos/events/event.dart"; -import "package:photos/services/remote_assets_service.dart"; - -abstract class MLFramework { - static const kImageEncoderEnabled = true; - static const kMaximumRetrials = 3; - - static final _logger = Logger("MLFramework"); - - final bool shouldDownloadOverMobileData; - final _initializationCompleter = Completer(); - - InitializationState _state = InitializationState.notInitialized; - - MLFramework(this.shouldDownloadOverMobileData) { - Connectivity() - .onConnectivityChanged - .listen((List result) async { - _logger.info("Connectivity changed to $result"); - if (_state == InitializationState.waitingForNetwork && - await _canDownload()) { - unawaited(init()); - } - }); - } - - InitializationState get initializationState => _state; - - set _initState(InitializationState state) { - Bus.instance.fire(MLFrameworkInitializationUpdateEvent(state)); - _logger.info("Init state is $state"); - _state = state; - } - - /// Returns the path of the Image Model hosted remotely - String getImageModelRemotePath(); - - /// Returns the path of the Text Model hosted remotely - String getTextModelRemotePath(); - - /// Loads the Image Model stored at [path] into the framework - Future loadImageModel(String path); - - /// Loads the Text Model stored at [path] into the framework - Future loadTextModel(String path); - - /// Returns the Image Embedding for a file stored at [imagePath] - Future> getImageEmbedding(String imagePath); - - /// Returns the Text Embedding for [text] - Future> getTextEmbedding(String text); - - /// Downloads the models from remote, caches them and loads them into the - /// framework. Override this method if you would like to control the - /// initialization. For eg. if you wish to load the model from `/assets` - /// instead of a CDN. - Future init() async { - try { - _initState = InitializationState.initializing; - await Future.wait([_initImageModel(), _initTextModel()]); - } catch (e, s) { - _logger.warning(e, s); - if (e is WiFiUnavailableError) { - return _initializationCompleter.future; - } else { - rethrow; - } - } - _initState = InitializationState.initialized; - _initializationCompleter.complete(); - } - - // Releases any resources held by the framework - Future release() async {} - - /// Returns the cosine similarity between [imageEmbedding] and [textEmbedding] - double computeScore(List imageEmbedding, List textEmbedding) { - assert( - imageEmbedding.length == textEmbedding.length, - "The two embeddings should have the same length", - ); - double score = 0; - for (int index = 0; index < imageEmbedding.length; index++) { - score += imageEmbedding[index] * textEmbedding[index]; - } - return score; - } - - // --- - // Private methods - // --- - - Future _initImageModel() async { - if (!kImageEncoderEnabled) { - return; - } - final imageModel = await _getModel(getImageModelRemotePath()); - await loadImageModel(imageModel.path); - } - - Future _initTextModel() async { - final textModel = await _getModel(getTextModelRemotePath()); - await loadTextModel(textModel.path); - } - - Future _getModel( - String url, { - int trialCount = 1, - }) async { - if (await RemoteAssetsService.instance.hasAsset(url)) { - return RemoteAssetsService.instance.getAsset(url); - } - if (!await _canDownload()) { - _initState = InitializationState.waitingForNetwork; - throw WiFiUnavailableError(); - } - try { - return RemoteAssetsService.instance.getAsset(url); - } catch (e, s) { - _logger.severe(e, s); - if (trialCount < kMaximumRetrials) { - return _getModel(url, trialCount: trialCount + 1); - } else { - rethrow; - } - } - } - - Future _canDownload() async { - final List connections = - await (Connectivity().checkConnectivity()); - final bool isConnectedToMobile = - connections.contains(ConnectivityResult.mobile); - return !isConnectedToMobile || shouldDownloadOverMobileData; - } -} - -class MLFrameworkInitializationUpdateEvent extends Event { - final InitializationState state; - - MLFrameworkInitializationUpdateEvent(this.state); -} - -enum InitializationState { - notInitialized, - waitingForNetwork, - initializing, - initialized, -} diff --git a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart b/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart deleted file mode 100644 index 44d6cabc49..0000000000 --- a/mobile/lib/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart +++ /dev/null @@ -1,127 +0,0 @@ -import "package:computer/computer.dart"; -import "package:logging/logging.dart"; -import "package:onnxruntime/onnxruntime.dart"; -import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; -import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart'; -import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_text_encoder.dart'; -import "package:photos/utils/image_isolate.dart"; - -class ONNX extends MLFramework { - static const kModelBucketEndpoint = "https://models.ente.io/"; - static const kImageModel = "clip-image-vit-32-float32.onnx"; - // static const kTextModel = "clip-text-vit-32-uint8.onnx"; // TODO: check later whether to revert back or not - static const kTextModel = "clip-text-vit-32-float32-int32.onnx"; - - final _computer = Computer.shared(); - final _logger = Logger("ONNX"); - final _clipImage = OnnxImageEncoder(); - final _clipText = OnnxTextEncoder(); - int _textEncoderAddress = 0; - int _imageEncoderAddress = 0; - - ONNX(super.shouldDownloadOverMobileData); - - @override - String getImageModelRemotePath() { - return kModelBucketEndpoint + kImageModel; - } - - @override - String getTextModelRemotePath() { - return kModelBucketEndpoint + kTextModel; - } - - @override - Future init() async { - await _computer.compute(initOrtEnv); - await super.init(); - } - - @override - Future loadImageModel(String path) async { - final startTime = DateTime.now(); - _imageEncoderAddress = await _computer.compute( - _clipImage.loadModel, - param: { - "imageModelPath": path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Loading image model took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } - - @override - Future loadTextModel(String path) async { - _logger.info('loadTextModel called'); - final startTime = DateTime.now(); - await _clipText.initTokenizer(); - _textEncoderAddress = await _computer.compute( - _clipText.loadModel, - param: { - "textModelPath": path, - }, - ); - final endTime = DateTime.now(); - _logger.info( - "Loading text model took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } - - @override - Future> getImageEmbedding(String imagePath) async { - _logger.info('getImageEmbedding called'); - try { - final startTime = DateTime.now(); - // TODO: properly integrate with other ml later (FaceMlService) - final result = await ImageIsolate.instance.inferClipImageEmbedding( - imagePath, - _imageEncoderAddress, - ); - final endTime = DateTime.now(); - _logger.info( - "getImageEmbedding done in ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", - ); - return result; - } catch (e, s) { - _logger.severe(e, s); - rethrow; - } - } - - @override - Future> getTextEmbedding(String text) async { - try { - final startTime = DateTime.now(); - final result = await _computer.compute( - _clipText.infer, - param: { - "text": text, - "address": _textEncoderAddress, - }, - taskName: "createTextEmbedding", - ) as List; - final endTime = DateTime.now(); - _logger.info( - "createTextEmbedding took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", - ); - return result; - } catch (e, s) { - _logger.severe(e, s); - rethrow; - } - } - - @override - Future release() async { - final session = OrtSession.fromAddress(_textEncoderAddress); - session.release(); - OrtEnv.instance.release(); - _logger.info('Released'); - } -} - -void initOrtEnv() async { - OrtEnv.instance.init(); -} From 523d3fa201e7f45feb0bda3cc0ee4c31a9db50be Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 11:20:53 +0530 Subject: [PATCH 0038/1179] [mob][photos] Remove any model differentiation between onnx and ggml --- mobile/lib/db/embeddings_db.dart | 49 ++++--------------- mobile/lib/models/embedding.dart | 36 +------------- .../semantic_search/embedding_store.dart | 19 +++---- 3 files changed, 16 insertions(+), 88 deletions(-) diff --git a/mobile/lib/db/embeddings_db.dart b/mobile/lib/db/embeddings_db.dart index 4da5c056a5..0d98314d8c 100644 --- a/mobile/lib/db/embeddings_db.dart +++ b/mobile/lib/db/embeddings_db.dart @@ -16,7 +16,6 @@ class EmbeddingsDB { static const databaseName = "ente.embeddings.db"; static const tableName = "embeddings"; static const columnFileID = "file_id"; - static const columnModel = "model"; static const columnEmbedding = "embedding"; static const columnUpdationTime = "updation_time"; @@ -42,7 +41,7 @@ class EmbeddingsDB { 1, (tx) async { await tx.execute( - 'CREATE TABLE $tableName ($columnFileID INTEGER NOT NULL, $columnModel INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnUpdationTime INTEGER, UNIQUE ($columnFileID, $columnModel))', + 'CREATE TABLE $tableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnUpdationTime INTEGER, UNIQUE ($columnFileID))', ); }, ), @@ -57,19 +56,16 @@ class EmbeddingsDB { await db.execute('DELETE FROM $tableName'); } - Future> getAll(Model model) async { + Future> getAll() async { final db = await _database; final results = await db.getAll('SELECT * FROM $tableName'); return _convertToEmbeddings(results); } // Get FileIDs for a specific model - Future> getFileIDs(Model model) async { + Future> getFileIDs() async { final db = await _database; - final results = await db.getAll( - 'SELECT $columnFileID FROM $tableName WHERE $columnModel = ?', - [modelToInt(model)!], - ); + final results = await db.getAll('SELECT $columnFileID FROM $tableName'); if (results.isEmpty) { return {}; } @@ -79,7 +75,7 @@ class EmbeddingsDB { Future put(Embedding embedding) async { final db = await _database; await db.execute( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnModel, $columnEmbedding, $columnUpdationTime) VALUES (?, ?, ?, ?)', + 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnUpdationTime) VALUES (?, ?, ?, ?)', _getRowFromEmbedding(embedding), ); Bus.instance.fire(EmbeddingUpdatedEvent()); @@ -89,7 +85,7 @@ class EmbeddingsDB { final db = await _database; final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList(); await db.executeBatch( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnModel, $columnEmbedding, $columnUpdationTime) values(?, ?, ?, ?)', + 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnUpdationTime) values(?, ?, ?, ?)', inputs, ); Bus.instance.fire(EmbeddingUpdatedEvent()); @@ -111,12 +107,9 @@ class EmbeddingsDB { Bus.instance.fire(EmbeddingUpdatedEvent()); } - Future deleteAllForModel(Model model) async { + Future deleteAll() async { final db = await _database; - await db.execute( - 'DELETE FROM $tableName WHERE $columnModel = ?', - [modelToInt(model)!], - ); + await db.execute('DELETE FROM $tableName'); Bus.instance.fire(EmbeddingUpdatedEvent()); } @@ -132,16 +125,14 @@ class EmbeddingsDB { Embedding _getEmbeddingFromRow(Map row) { final fileID = row[columnFileID]; - final model = intToModel(row[columnModel])!; final bytes = row[columnEmbedding] as Uint8List; final list = Float32List.view(bytes.buffer); - return Embedding(fileID: fileID, model: model, embedding: list); + return Embedding(fileID: fileID, embedding: list); } List _getRowFromEmbedding(Embedding embedding) { return [ embedding.fileID, - modelToInt(embedding.model)!, Float32List.fromList(embedding.embedding).buffer.asUint8List(), embedding.updationTime, ]; @@ -157,26 +148,4 @@ class EmbeddingsDB { await deprecatedIsar.delete(); } } - - int? modelToInt(Model model) { - switch (model) { - case Model.onnxClip: - return 1; - case Model.ggmlClip: - return 2; - default: - return null; - } - } - - Model? intToModel(int model) { - switch (model) { - case 1: - return Model.onnxClip; - case 2: - return Model.ggmlClip; - default: - return null; - } - } } diff --git a/mobile/lib/models/embedding.dart b/mobile/lib/models/embedding.dart index 91ac9a0213..60554538b3 100644 --- a/mobile/lib/models/embedding.dart +++ b/mobile/lib/models/embedding.dart @@ -2,7 +2,6 @@ import "dart:convert"; class Embedding { final int fileID; - final Model model; final List embedding; int? updationTime; @@ -10,15 +9,13 @@ class Embedding { Embedding({ required this.fileID, - required this.model, required this.embedding, this.updationTime, }); - factory Embedding.empty(int fileID, Model model) { + factory Embedding.empty(int fileID) { return Embedding( fileID: fileID, - model: model, embedding: [], ); } @@ -31,34 +28,3 @@ class Embedding { return jsonEncode(embedding); } } - -enum Model { - onnxClip, - ggmlClip, -} - -extension ModelExtension on Model { - String get name => serialize(this); -} - -String serialize(Model model) { - switch (model) { - case Model.onnxClip: - return 'onnx-clip'; - case Model.ggmlClip: - return 'ggml-clip'; - default: - throw Exception('$model is not a valid Model'); - } -} - -Model deserialize(String model) { - switch (model) { - case 'onnx-clip': - return Model.onnxClip; - case 'ggml-clip': - return Model.ggmlClip; - default: - throw Exception('$model is not a valid Model'); - } -} diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index 00859a20ce..e2acbb6871 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -33,17 +33,16 @@ class EmbeddingStore { _preferences = await SharedPreferences.getInstance(); } - Future pullEmbeddings(Model model) async { - return true; // TODO: remove this + Future pullEmbeddings() async { if (_remoteSyncStatus != null) { return _remoteSyncStatus!.future; } _remoteSyncStatus = Completer(); try { - var remoteEmbeddings = await _getRemoteEmbeddings(model); + var remoteEmbeddings = await _getRemoteEmbeddings(); await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); while (remoteEmbeddings.hasMore) { - remoteEmbeddings = await _getRemoteEmbeddings(model); + remoteEmbeddings = await _getRemoteEmbeddings(); await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); } _remoteSyncStatus!.complete(true); @@ -85,8 +84,8 @@ class EmbeddingStore { unawaited(_pushEmbedding(file, embedding)); } - Future clearEmbeddings(Model model) async { - await EmbeddingsDB.instance.deleteAllForModel(model); + Future clearEmbeddings() async { + await EmbeddingsDB.instance.deleteAll(); await _preferences.remove(kEmbeddingsSyncTimeKey); } @@ -106,7 +105,6 @@ class EmbeddingStore { "/embeddings", data: { "fileID": embedding.fileID, - "model": embedding.model.name, "encryptedEmbedding": encryptedData, "decryptionHeader": header, }, @@ -119,10 +117,7 @@ class EmbeddingStore { } } - Future _getRemoteEmbeddings( - Model model, { - int limit = 200, - }) async { + Future _getRemoteEmbeddings({int limit = 200}) async { final remoteEmbeddings = []; try { final sinceTime = _preferences.getInt(kEmbeddingsSyncTimeKey) ?? 0; @@ -130,7 +125,6 @@ class EmbeddingStore { final response = await _dio.get( "/embeddings/diff", queryParameters: { - "model": model.name, "sinceTime": sinceTime, "limit": limit, }, @@ -212,7 +206,6 @@ Future> _decodeEmbeddings(Map args) async { embeddings.add( Embedding( fileID: input.embedding.fileID, - model: deserialize(input.embedding.model), embedding: decodedEmbedding, updationTime: input.embedding.updatedAt, ), From fd6c5216492aa1dda0743d0702d02ce8a3f4b4c0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 16:55:21 +0530 Subject: [PATCH 0039/1179] [mob][photos] Decouple face embedding fetch from indexing --- mobile/lib/db/embeddings_db.dart | 15 +- mobile/lib/models/ml/ml_versions.dart | 3 +- .../face_ml/face_ml_service.dart | 188 +++--------------- .../face_ml/face_recognition_service.dart | 98 ++++++++- mobile/lib/utils/ml_util.dart | 96 +++++++++ 5 files changed, 232 insertions(+), 168 deletions(-) diff --git a/mobile/lib/db/embeddings_db.dart b/mobile/lib/db/embeddings_db.dart index 0d98314d8c..66b91b5070 100644 --- a/mobile/lib/db/embeddings_db.dart +++ b/mobile/lib/db/embeddings_db.dart @@ -6,6 +6,7 @@ import 'package:path_provider/path_provider.dart'; import "package:photos/core/event_bus.dart"; import "package:photos/events/embedding_updated_event.dart"; import "package:photos/models/embedding.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:sqlite_async/sqlite_async.dart"; class EmbeddingsDB { @@ -62,14 +63,16 @@ class EmbeddingsDB { return _convertToEmbeddings(results); } - // Get FileIDs for a specific model - Future> getFileIDs() async { + // Get indexed FileIDs + Future> getIndexedFileIds() async { final db = await _database; - final results = await db.getAll('SELECT $columnFileID FROM $tableName'); - if (results.isEmpty) { - return {}; + final maps = await db.getAll('SELECT $columnFileID FROM $tableName'); + final Map result = {}; + for (final map in maps) { + result[map[columnFileID] as int] = + clipMlVersion; // TODO: Add an actual column for version } - return results.map((e) => e[columnFileID] as int).toSet(); + return result; } Future put(Embedding embedding) async { diff --git a/mobile/lib/models/ml/ml_versions.dart b/mobile/lib/models/ml/ml_versions.dart index 857bef33c5..315f6c74b5 100644 --- a/mobile/lib/models/ml/ml_versions.dart +++ b/mobile/lib/models/ml/ml_versions.dart @@ -1,3 +1,4 @@ const faceMlVersion = 1; +const clipMlVersion = 2; const clusterMlVersion = 1; -const minimumClusterSize = 2; \ No newline at end of file +const minimumClusterSize = 2; diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 473f911ada..6e2a9c470d 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -22,10 +22,7 @@ import "package:photos/face/model/box.dart"; import "package:photos/face/model/detection.dart" as face_detection; import "package:photos/face/model/face.dart"; import "package:photos/face/model/landmark.dart"; -import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; -import "package:photos/models/file/file_type.dart"; -import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart'; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; @@ -39,7 +36,6 @@ import "package:photos/services/machine_learning/face_ml/person/person_service.d import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; -import "package:photos/services/search_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -92,7 +88,6 @@ class FaceMlService { bool _shouldPauseIndexingAndClustering = false; static const int _fileDownloadLimit = 10; - static const _embeddingFetchLimit = 200; static const _kForceClusteringFaceCount = 8000; /// Only call this function once at app startup, after that you can directly call [runAllFaceML] @@ -136,13 +131,17 @@ class FaceMlService { _logger.info('init done'); } + Future sync() async { + await FaceRecognitionService.instance.sync(); + } + Future runAllFaceML({bool force = false}) async { if (force) { _mlControllerStatus = true; } if (_cannotRunMLFunction() && !force) return; - await FaceRecognitionService.instance.sync(); + await sync(); final int unclusteredFacesCount = await FaceMLDataDB.instance.getUnclusteredFaceCount(); @@ -165,162 +164,47 @@ class FaceMlService { /// Analyzes all the images in the database with the latest ml version and stores the results in the database. /// /// This function first checks if the image has already been analyzed with the lastest faceMlVersion and stored in the database. If so, it skips the image. - Future indexAllImages({int retryFetchCount = 10}) async { + Future indexAllImages() async { if (_cannotRunMLFunction()) return; try { _isIndexingOrClusteringRunning = true; _logger.info('starting image indexing'); - // Get indexed fileIDs, all regular files, and all hidden files - final Map alreadyIndexedFiles = - await FaceMLDataDB.instance.getIndexedFileIds(); - final List enteFiles = - await SearchService.instance.getAllFiles(); - final List hiddenFiles = - await SearchService.instance.getHiddenFiles(); + final filesToIndex = await getFilesForMlIndexing(); + + final List> chunks = + filesToIndex.chunks(_fileDownloadLimit); - // Sort out what should be indexed and in what order int fileAnalyzedCount = 0; - int fileSkippedCount = 0; - final stopwatch = Stopwatch()..start(); - final List filesWithLocalID = []; - final List filesWithoutLocalID = []; - final List hiddenFilesToIndex = []; - for (final EnteFile enteFile in enteFiles) { - if (_skipAnalysisEnteFile(enteFile, alreadyIndexedFiles)) { - fileSkippedCount++; - continue; - } - if ((enteFile.localID ?? '').isEmpty) { - filesWithoutLocalID.add(enteFile); - } else { - filesWithLocalID.add(enteFile); - } - } - for (final EnteFile enteFile in hiddenFiles) { - if (_skipAnalysisEnteFile(enteFile, alreadyIndexedFiles)) { - fileSkippedCount++; - continue; - } - hiddenFilesToIndex.add(enteFile); - } - final sortedBylocalID = []; - sortedBylocalID.addAll(filesWithLocalID); - sortedBylocalID.addAll(filesWithoutLocalID); - sortedBylocalID.addAll(hiddenFilesToIndex); - final List> chunks = - sortedBylocalID.chunks(_embeddingFetchLimit); // Chunks of 200 - - int fetchedCount = 0; + final Stopwatch stopwatch = Stopwatch()..start(); outerLoop: for (final chunk in chunks) { - // Fetching and storing remote embeddings - if (LocalSettings.instance.remoteFetchEnabled) { - try { - final fileIds = chunk.map((file) => file.uploadedFileID!).toSet(); - _logger.info('starting remote fetch for ${fileIds.length} files'); - final res = - await RemoteFileMLService.instance.getFilessEmbedding(fileIds); - _logger.info('fetched ${res.mlData.length} embeddings'); - fetchedCount += res.mlData.length; - final List faces = []; - final remoteFileIdToVersion = {}; - for (FileMl fileMl in res.mlData.values) { - if (shouldDiscardRemoteEmbedding(fileMl)) continue; - if (fileMl.faceEmbedding.faces.isEmpty) { - faces.add( - Face.empty( - fileMl.fileID, - ), - ); - } else { - for (final f in fileMl.faceEmbedding.faces) { - f.fileInfo = FileInfo( - imageHeight: fileMl.height, - imageWidth: fileMl.width, - ); - faces.add(f); - } - } - remoteFileIdToVersion[fileMl.fileID] = - fileMl.faceEmbedding.version; - } - if (res.noEmbeddingFileIDs.isNotEmpty) { - _logger.info( - 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', - ); - for (final fileID in res.noEmbeddingFileIDs) { - faces.add(Face.empty(fileID, error: false)); - remoteFileIdToVersion[fileID] = faceMlVersion; - } - } - - await FaceMLDataDB.instance.bulkInsertFaces(faces); - _logger.info('stored embeddings'); - for (final entry in remoteFileIdToVersion.entries) { - alreadyIndexedFiles[entry.key] = entry.value; - } - _logger - .info('already indexed files ${remoteFileIdToVersion.length}'); - } catch (e, s) { - _logger.severe("err while getting files embeddings", e, s); - if (retryFetchCount < 1000) { - Future.delayed(Duration(seconds: retryFetchCount), () { - unawaited(indexAllImages(retryFetchCount: retryFetchCount * 2)); - }); - return; - } else { - _logger.severe( - "Failed to fetch embeddings for files after multiple retries", - e, - s, - ); - rethrow; - } - } - } else { - _logger.warning( - 'Not fetching embeddings because user manually disabled it in debug options', + if (!await canUseHighBandwidth()) { + _logger.info( + 'stopping indexing because user is not connected to wifi', ); + break outerLoop; } - - final smallerChunks = chunk.chunks(_fileDownloadLimit); - for (final smallestChunk in smallerChunks) { - final futures = >[]; - if (!await canUseHighBandwidth()) { - _logger.info( - 'stopping indexing because user is not connected to wifi', - ); + final futures = >[]; + for (final instruction in chunk) { + if (_shouldPauseIndexingAndClustering) { + _logger.info("indexAllImages() was paused, stopping"); break outerLoop; } - for (final enteFile in smallestChunk) { - if (_shouldPauseIndexingAndClustering) { - _logger.info("indexAllImages() was paused, stopping"); - break outerLoop; - } - if (_skipAnalysisEnteFile( - enteFile, - alreadyIndexedFiles, - )) { - fileSkippedCount++; - continue; - } - await _ensureReadyForInference(); - futures.add(processImage(enteFile)); - } - final awaitedFutures = await Future.wait(futures); - final sumFutures = awaitedFutures.fold( - 0, - (previousValue, element) => previousValue + (element ? 1 : 0), - ); - fileAnalyzedCount += sumFutures; + await _ensureReadyForInference(); + futures.add(processImage(instruction.enteFile)); } + final awaitedFutures = await Future.wait(futures); + final sumFutures = awaitedFutures.fold( + 0, + (previousValue, element) => previousValue + (element ? 1 : 0), + ); + fileAnalyzedCount += sumFutures; } - stopwatch.stop(); _logger.info( - "`indexAllImages()` finished. Fetched $fetchedCount and analyzed $fileAnalyzedCount images, in ${stopwatch.elapsed.inSeconds} seconds (avg of ${stopwatch.elapsed.inSeconds / fileAnalyzedCount} seconds per image, skipped $fileSkippedCount images)", + "`indexAllImages()` finished. Analyzed $fileAnalyzedCount images, in ${stopwatch.elapsed.inSeconds} seconds (avg of ${stopwatch.elapsed.inSeconds / fileAnalyzedCount} seconds per image)", ); _logStatus(); } catch (e, s) { @@ -1024,22 +908,6 @@ class FaceMlService { } } - bool _skipAnalysisEnteFile(EnteFile enteFile, Map indexedFileIds) { - // Skip if the file is not uploaded or not owned by the user - if (!enteFile.isUploaded || enteFile.isOwner == false) { - return true; - } - // I don't know how motionPhotos and livePhotos work, so I'm also just skipping them for now - if (enteFile.fileType == FileType.other) { - return true; - } - // Skip if the file is already analyzed with the latest ml version - final id = enteFile.uploadedFileID!; - - return indexedFileIds.containsKey(id) && - indexedFileIds[id]! >= faceMlVersion; - } - bool _cannotRunMLFunction({String function = ""}) { if (_isIndexingOrClusteringRunning) { _logger.info( diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 7563f3d9ca..c141c0eb10 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -4,7 +4,15 @@ import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/people_changed_event.dart"; +import "package:photos/extensions/list.dart"; +import "package:photos/face/db.dart"; +import "package:photos/face/model/face.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; +import "package:photos/services/machine_learning/file_ml/file_ml.dart"; +import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; +import "package:photos/utils/local_settings.dart"; +import "package:photos/utils/ml_util.dart"; class FaceRecognitionService { final _logger = Logger("FaceRecognitionService"); @@ -21,6 +29,8 @@ class FaceRecognitionService { bool _shouldSyncPeople = false; bool _isSyncing = false; + static const _embeddingFetchLimit = 200; + Future init() async { if (_isInitialized) { return; @@ -29,7 +39,7 @@ class FaceRecognitionService { // Listen on DiffSync Bus.instance.on().listen((event) async { - unawaited(sync()); + unawaited(_syncPersonFeedback()); }); // Listen on PeopleChanged @@ -43,6 +53,17 @@ class FaceRecognitionService { } Future sync() async { + await _syncPersonFeedback(); + if (LocalSettings.instance.remoteFetchEnabled) { + await _syncFaceEmbeddings(); + } else { + _logger.severe( + 'Not fetching embeddings because user manually disabled it in debug options', + ); + } + } + + Future _syncPersonFeedback() async { if (_isSyncing) { return; } @@ -54,4 +75,79 @@ class FaceRecognitionService { } _isSyncing = false; } + + Future _syncFaceEmbeddings({int retryFetchCount = 10}) async { + final filesToIndex = await getFilesForMlIndexing(); + + final List> chunks = + filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 + + int fetchedCount = 0; + for (final chunk in chunks) { + // Fetching and storing remote embeddings + try { + final fileIds = chunk + .map((instruction) => instruction.enteFile.uploadedFileID!) + .toSet(); + _logger.info('starting remote fetch for ${fileIds.length} files'); + final res = + await RemoteFileMLService.instance.getFilessEmbedding(fileIds); + _logger.info('fetched ${res.mlData.length} embeddings'); + fetchedCount += res.mlData.length; + final List faces = []; + final remoteFileIdToVersion = {}; + for (FileMl fileMl in res.mlData.values) { + if (shouldDiscardRemoteEmbedding(fileMl)) continue; + if (fileMl.faceEmbedding.faces.isEmpty) { + faces.add( + Face.empty( + fileMl.fileID, + ), + ); + } else { + for (final f in fileMl.faceEmbedding.faces) { + f.fileInfo = FileInfo( + imageHeight: fileMl.height, + imageWidth: fileMl.width, + ); + faces.add(f); + } + } + remoteFileIdToVersion[fileMl.fileID] = fileMl.faceEmbedding.version; + } + if (res.noEmbeddingFileIDs.isNotEmpty) { + _logger.info( + 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', + ); + for (final fileID in res.noEmbeddingFileIDs) { + faces.add(Face.empty(fileID, error: false)); + remoteFileIdToVersion[fileID] = faceMlVersion; + } + } + + await FaceMLDataDB.instance.bulkInsertFaces(faces); + _logger.info( + 'stored embeddings, already indexed files ${remoteFileIdToVersion.length}', + ); + } catch (e, s) { + _logger.severe("err while getting files embeddings", e, s); + if (retryFetchCount < 1000) { + Future.delayed(Duration(seconds: retryFetchCount), () { + unawaited( + _syncFaceEmbeddings(retryFetchCount: retryFetchCount * 2), + ); + }); + return; + } else { + _logger.severe( + "Failed to fetch embeddings for files after multiple retries", + e, + s, + ); + rethrow; + } + } + } + _logger.info('Fetched $fetchedCount embeddings'); + } } diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index cc783ad1db..fdb578d7d4 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -4,10 +4,15 @@ import "dart:math" as math show sqrt; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; +import "package:photos/db/embeddings_db.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/face/db.dart"; +import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; +import "package:photos/services/search_service.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/thumbnail_util.dart"; @@ -15,6 +20,80 @@ final _logger = Logger("MlUtil"); enum FileDataForML { thumbnailData, fileData } +class FileMLInstruction { + final EnteFile enteFile; + + final bool shouldRunFaces; + final bool shouldRunClip; + + FileMLInstruction({ + required this.enteFile, + required this.shouldRunFaces, + required this.shouldRunClip, + }); +} + +Future> getFilesForMlIndexing() async { + _logger.info('getFilesForMlIndexing called'); + final time = DateTime.now(); + // Get indexed fileIDs for each ML service + final Map faceIndexedFileIDs = + await FaceMLDataDB.instance.getIndexedFileIds(); + final Map clipIndexedFileIDs = + await EmbeddingsDB.instance.getIndexedFileIds(); + + // Get all regular files and all hidden files + final enteFiles = await SearchService.instance.getAllFiles(); + final hiddenFiles = await SearchService.instance.getHiddenFiles(); + + // Sort out what should be indexed and in what order + final List filesWithLocalID = []; + final List filesWithoutLocalID = []; + final List hiddenFilesToIndex = []; + for (final EnteFile enteFile in enteFiles) { + final skip = _skipAnalysisEnteFile(enteFile); + final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs); + final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs); + if (skip && !shouldRunFaces && !shouldRunClip) { + continue; + } + final instruction = FileMLInstruction( + enteFile: enteFile, + shouldRunFaces: shouldRunFaces, + shouldRunClip: shouldRunClip, + ); + if ((enteFile.localID ?? '').isEmpty) { + filesWithoutLocalID.add(instruction); + } else { + filesWithLocalID.add(instruction); + } + } + for (final EnteFile enteFile in hiddenFiles) { + final skip = _skipAnalysisEnteFile(enteFile); + final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs); + final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs); + if (skip && !shouldRunFaces && !shouldRunClip) { + continue; + } + final instruction = FileMLInstruction( + enteFile: enteFile, + shouldRunFaces: shouldRunFaces, + shouldRunClip: shouldRunClip, + ); + hiddenFilesToIndex.add(instruction); + } + final sortedBylocalID = [ + ...filesWithLocalID, + ...filesWithoutLocalID, + ...hiddenFilesToIndex, + ]; + _logger.info( + "Getting list of files to index for ML took ${DateTime.now().difference(time).inMilliseconds} ms", + ); + + return sortedBylocalID; +} + Future> getIndexableFileIDs() async { final fileIDs = await FilesDB.instance .getOwnedFileIDs(Configuration.instance.getUserID()!); @@ -91,6 +170,23 @@ Future getImagePathForML( return imagePath; } +bool _skipAnalysisEnteFile(EnteFile enteFile) { + // Skip if the file is not uploaded or not owned by the user + if (!enteFile.isUploaded || enteFile.isOwner == false) { + return true; + } + // I don't know how motionPhotos and livePhotos work, so I'm also just skipping them for now + if (enteFile.fileType == FileType.other) { + return true; + } + return false; +} + +bool _shouldRunIndexing(EnteFile enteFile, Map indexedFileIds) { + final id = enteFile.uploadedFileID!; + return !indexedFileIds.containsKey(id) || indexedFileIds[id]! < faceMlVersion; +} + void normalizeEmbedding(List embedding) { double normalization = 0; for (int i = 0; i < embedding.length; i++) { From 36224b45ef2ee69f4e73a3316508976f16fee058 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 22:08:19 +0530 Subject: [PATCH 0040/1179] [mob][photos] Move faces pipeline to FaceRecognitionService --- .../face_ml/face_ml_service.dart | 163 +----------------- .../face_ml/face_recognition_service.dart | 154 +++++++++++++++++ 2 files changed, 162 insertions(+), 155 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 6e2a9c470d..2dab96fb58 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -3,8 +3,7 @@ import "dart:developer" as dev show log; import "dart:io" show File; import "dart:isolate"; import "dart:math" show min; -import "dart:typed_data" show Uint8List, Float32List, ByteData; -import "dart:ui" show Image; +import "dart:typed_data" show Uint8List, ByteData; import "package:computer/computer.dart"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; @@ -26,7 +25,6 @@ import "package:photos/models/file/file.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart'; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; -import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; @@ -736,178 +734,33 @@ class FaceMlService { final int faceDetectionAddress = args["faceDetectionAddress"] as int; final int faceEmbeddingAddress = args["faceEmbeddingAddress"] as int; - final resultBuilder = FaceMlResult.fromEnteFileID(enteFileID); - dev.log( "Start analyzing image with uploadedFileID: $enteFileID inside the isolate", ); - final stopwatchTotal = Stopwatch()..start(); - final stopwatch = Stopwatch()..start(); + final time = DateTime.now(); // Decode the image once to use for both face detection and alignment final imageData = await File(imagePath).readAsBytes(); final image = await decodeImageFromData(imageData); - final ByteData imgByteData = await getByteDataFromImage(image); + final ByteData imageByteData = await getByteDataFromImage(image); dev.log('Reading and decoding image took ' - '${stopwatch.elapsedMilliseconds} ms'); - stopwatch.reset(); + '${DateTime.now().difference(time).inMilliseconds} ms'); - // Get the faces - final List faceDetectionResult = - await FaceMlService._detectFacesSync( + final resultFaces = await FaceRecognitionService.runFacesPipeline( + enteFileID, image, - imgByteData, + imageByteData, faceDetectionAddress, - resultBuilder: resultBuilder, - ); - - dev.log( - "${faceDetectionResult.length} faces detected with scores ${faceDetectionResult.map((e) => e.score).toList()}: completed `detectFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); - - // If no faces were detected, return a result with no faces. Otherwise, continue. - if (faceDetectionResult.isEmpty) { - dev.log( - "No faceDetectionResult, Completed analyzing image with uploadedFileID $enteFileID, in " - "${stopwatch.elapsedMilliseconds} ms"); - resultBuilder.noFaceDetected(); - return resultBuilder; - } - - stopwatch.reset(); - // Align the faces - final Float32List faceAlignmentResult = - await FaceMlService._alignFacesSync( - image, - imgByteData, - faceDetectionResult, - resultBuilder: resultBuilder, - ); - - dev.log("Completed `alignFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); - - stopwatch.reset(); - // Get the embeddings of the faces - final embeddings = await FaceMlService._embedFacesSync( - faceAlignmentResult, faceEmbeddingAddress, - resultBuilder: resultBuilder, ); - dev.log("Completed `embedFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); - - stopwatch.stop(); - stopwatchTotal.stop(); - dev.log("Finished Analyze image (${embeddings.length} faces) with " - "uploadedFileID $enteFileID, in " - "${stopwatchTotal.elapsedMilliseconds} ms"); - - return resultBuilder; + return resultFaces; } catch (e, s) { dev.log("Could not analyze image: \n e: $e \n s: $s"); rethrow; } } - /// Detects faces in the given image data. - /// - /// `imageData`: The image data to analyze. - /// - /// Returns a list of face detection results. - static Future> _detectFacesSync( - Image image, - ByteData imageByteData, - int interpreterAddress, { - FaceMlResult? resultBuilder, - }) async { - try { - // Get the bounding boxes of the faces - final (List faces, dataSize) = - await FaceDetectionService.predict( - image, - imageByteData, - interpreterAddress, - ); - - // Add detected faces to the resultBuilder - if (resultBuilder != null) { - resultBuilder.addNewlyDetectedFaces(faces, dataSize); - } - - return faces; - } on YOLOFaceInterpreterRunException { - throw CouldNotRunFaceDetector(); - } catch (e) { - dev.log('[SEVERE] Face detection failed: $e'); - throw GeneralFaceMlException('Face detection failed: $e'); - } - } - - /// Aligns multiple faces from the given image data. - /// - /// `imageData`: The image data in [Uint8List] that contains the faces. - /// `faces`: The face detection results in a list of [FaceDetectionAbsolute] for the faces to align. - /// - /// Returns a list of the aligned faces as image data. - static Future _alignFacesSync( - Image image, - ByteData imageByteData, - List faces, { - FaceMlResult? resultBuilder, - }) async { - try { - final stopwatch = Stopwatch()..start(); - final (alignedFaces, alignmentResults, _, blurValues, _) = - await preprocessToMobileFaceNetFloat32List( - image, - imageByteData, - faces, - ); - stopwatch.stop(); - dev.log( - "Face alignment image decoding and processing took ${stopwatch.elapsedMilliseconds} ms", - ); - - if (resultBuilder != null) { - resultBuilder.addAlignmentResults( - alignmentResults, - blurValues, - ); - } - - return alignedFaces; - } catch (e, s) { - dev.log('[SEVERE] Face alignment failed: $e $s'); - throw CouldNotWarpAffine(); - } - } - - static Future>> _embedFacesSync( - Float32List facesList, - int interpreterAddress, { - FaceMlResult? resultBuilder, - }) async { - try { - // Get the embedding of the faces - final List> embeddings = - await FaceEmbeddingService.predict(facesList, interpreterAddress); - - // Add the embeddings to the resultBuilder - if (resultBuilder != null) { - resultBuilder.addEmbeddingsToExistingFaces(embeddings); - } - - return embeddings; - } on MobileFaceNetInterpreterRunException { - throw CouldNotRunFaceEmbeddor(); - } catch (e) { - dev.log('[SEVERE] Face embedding (batch) failed: $e'); - throw GeneralFaceMlException('Face embedding (batch) failed: $e'); - } - } - bool _cannotRunMLFunction({String function = ""}) { if (_isIndexingOrClusteringRunning) { _logger.info( diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index c141c0eb10..e5b687d3dd 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -1,4 +1,7 @@ import "dart:async" show unawaited; +import "dart:developer" as dev show log; +import "dart:typed_data" show ByteData, Float32List; +import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; @@ -8,9 +11,15 @@ import "package:photos/extensions/list.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/face.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; +import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; +import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; +import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/machine_learning/file_ml/file_ml.dart"; import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; +import "package:photos/services/machine_learning/ml_exceptions.dart"; +import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -150,4 +159,149 @@ class FaceRecognitionService { } _logger.info('Fetched $fetchedCount embeddings'); } + + static Future runFacesPipeline( + int enteFileID, + Image image, + ByteData imageByteData, + int faceDetectionAddress, + int faceEmbeddingAddress, + ) async { + final resultBuilder = FaceMlResult.fromEnteFileID(enteFileID); + + final Stopwatch stopwatch = Stopwatch()..start(); + final startTime = DateTime.now(); + + // Get the faces + final List faceDetectionResult = + await _detectFacesSync( + image, + imageByteData, + faceDetectionAddress, + resultBuilder, + ); + dev.log( + "${faceDetectionResult.length} faces detected with scores ${faceDetectionResult.map((e) => e.score).toList()}: completed `detectFacesSync` function, in " + "${stopwatch.elapsedMilliseconds} ms"); + + // If no faces were detected, return a result with no faces. Otherwise, continue. + if (faceDetectionResult.isEmpty) { + dev.log( + "No faceDetectionResult, Completed analyzing image with uploadedFileID $enteFileID, in " + "${stopwatch.elapsedMilliseconds} ms"); + resultBuilder.noFaceDetected(); + return resultBuilder; + } + + stopwatch.reset(); + // Align the faces + final Float32List faceAlignmentResult = await _alignFacesSync( + image, + imageByteData, + faceDetectionResult, + resultBuilder, + ); + dev.log("Completed `alignFacesSync` function, in " + "${stopwatch.elapsedMilliseconds} ms"); + + stopwatch.reset(); + // Get the embeddings of the faces + final embeddings = await _embedFacesSync( + faceAlignmentResult, + faceEmbeddingAddress, + resultBuilder, + ); + dev.log("Completed `embedFacesSync` function, in " + "${stopwatch.elapsedMilliseconds} ms"); + stopwatch.stop(); + + dev.log("Finished faces pipeline (${embeddings.length} faces) with " + "uploadedFileID $enteFileID, in " + "${DateTime.now().difference(startTime).inMilliseconds} ms"); + + return resultBuilder; + } + + /// Runs face recognition on the given image data. + static Future> _detectFacesSync( + Image image, + ByteData imageByteData, + int interpreterAddress, + FaceMlResult resultBuilder, + ) async { + try { + // Get the bounding boxes of the faces + final (List faces, dataSize) = + await FaceDetectionService.predict( + image, + imageByteData, + interpreterAddress, + ); + + // Add detected faces to the resultBuilder + resultBuilder.addNewlyDetectedFaces(faces, dataSize); + + return faces; + } on YOLOFaceInterpreterRunException { + throw CouldNotRunFaceDetector(); + } catch (e) { + dev.log('[SEVERE] Face detection failed: $e'); + throw GeneralFaceMlException('Face detection failed: $e'); + } + } + + /// Aligns multiple faces from the given image data. + /// Returns a list of the aligned faces as image data. + static Future _alignFacesSync( + Image image, + ByteData imageByteData, + List faces, + FaceMlResult resultBuilder, + ) async { + try { + final stopwatch = Stopwatch()..start(); + final (alignedFaces, alignmentResults, _, blurValues, _) = + await preprocessToMobileFaceNetFloat32List( + image, + imageByteData, + faces, + ); + stopwatch.stop(); + dev.log( + "Face alignment image decoding and processing took ${stopwatch.elapsedMilliseconds} ms", + ); + + resultBuilder.addAlignmentResults( + alignmentResults, + blurValues, + ); + + return alignedFaces; + } catch (e, s) { + dev.log('[SEVERE] Face alignment failed: $e $s'); + throw CouldNotWarpAffine(); + } + } + + static Future>> _embedFacesSync( + Float32List facesList, + int interpreterAddress, + FaceMlResult resultBuilder, + ) async { + try { + // Get the embedding of the faces + final List> embeddings = + await FaceEmbeddingService.predict(facesList, interpreterAddress); + + // Add the embeddings to the resultBuilder + resultBuilder.addEmbeddingsToExistingFaces(embeddings); + + return embeddings; + } on MobileFaceNetInterpreterRunException { + throw CouldNotRunFaceEmbeddor(); + } catch (e) { + dev.log('[SEVERE] Face embedding (batch) failed: $e'); + throw GeneralFaceMlException('Face embedding (batch) failed: $e'); + } + } } From 64a2544e959c104323563ac0d2d188814c1f7a10 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 22:33:38 +0530 Subject: [PATCH 0041/1179] [mob][photos] Face detection cleanup --- .../face_detection_service.dart | 7 +++--- mobile/lib/utils/image_ml_util.dart | 22 ++----------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index baf7e65744..80f84a80f6 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -39,7 +39,7 @@ class FaceDetectionService extends MlModel { factory FaceDetectionService() => instance; /// Detects faces in the given image data. - static Future<(List, Dimensions)> predict( + static Future> predict( ui.Image image, ByteData imageByteData, int sessionAddress, @@ -49,7 +49,7 @@ class FaceDetectionService extends MlModel { final stopwatch = Stopwatch()..start(); final stopwatchPreprocessing = Stopwatch()..start(); - final (inputImageList, originalSize, newSize) = + final (inputImageList, newSize) = await preprocessImageToFloat32ChannelsFirst( image, imageByteData, @@ -77,7 +77,6 @@ class FaceDetectionService extends MlModel { _logger.info( 'Image decoding and preprocessing is finished, in ${stopwatchPreprocessing.elapsedMilliseconds}ms', ); - _logger.info('original size: $originalSize \n new size: $newSize'); // Run inference final stopwatchInterpreter = Stopwatch()..start(); @@ -104,7 +103,7 @@ class FaceDetectionService extends MlModel { 'predict() face detection executed in ${stopwatch.elapsedMilliseconds}ms', ); - return (relativeDetections, originalSize); + return relativeDetections; } static List _yoloPostProcessOutputs( diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 9d2f13d95d..bb41645cef 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -120,8 +120,7 @@ Future> generateFaceThumbnailsUsingCanvas( } } -Future<(Float32List, Dimensions, Dimensions)> - preprocessImageToFloat32ChannelsFirst( +Future<(Float32List, Dimensions)> preprocessImageToFloat32ChannelsFirst( Image image, ByteData imgByteData, { required int normalization, @@ -135,19 +134,6 @@ Future<(Float32List, Dimensions, Dimensions)> : normalization == 1 ? _normalizePixelRange1 : _normalizePixelNoRange; - final originalSize = Dimensions(width: image.width, height: image.height); - - if (image.width == requiredWidth && image.height == requiredHeight) { - return ( - _createFloat32ListFromImageChannelsFirst( - image, - imgByteData, - normFunction: normFunction, - ), - originalSize, - originalSize - ); - } double scaleW = requiredWidth / image.width; double scaleH = requiredHeight / image.height; @@ -186,11 +172,7 @@ Future<(Float32List, Dimensions, Dimensions)> } } - return ( - processedBytes, - originalSize, - Dimensions(width: scaledWidth, height: scaledHeight) - ); + return (processedBytes, Dimensions(width: scaledWidth, height: scaledHeight)); } Future preprocessImageClip( From 680c8784fb3f6e678fe6bc61947cbbb03db08d20 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 22:46:49 +0530 Subject: [PATCH 0042/1179] [mob][photos] Refactor results object --- .../face_ml/face_ml_result.dart | 66 ++++--------------- .../face_ml/face_ml_service.dart | 29 ++++---- .../face_ml/face_recognition_service.dart | 66 ++++++++++++------- 3 files changed, 70 insertions(+), 91 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_result.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_result.dart index 81fc8c9da7..ab39a4a332 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_result.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_result.dart @@ -7,7 +7,7 @@ import 'package:photos/services/machine_learning/face_ml/face_alignment/alignmen import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; -class FaceMlResult { +class MLResult { int fileId; List faces = []; @@ -20,7 +20,7 @@ class FaceMlResult { bool get hasFaces => faces.isNotEmpty; - FaceMlResult({ + MLResult({ this.fileId = -1, this.faces = const [], this.mlVersion = faceMlVersion, @@ -29,7 +29,7 @@ class FaceMlResult { this.decodedImageSize = const Dimensions(width: -1, height: -1), }); - FaceMlResult.fromEnteFileID( + MLResult.fromEnteFileID( fileID, { this.mlVersion = faceMlVersion, this.errorOccured = false, @@ -37,50 +37,6 @@ class FaceMlResult { this.decodedImageSize = const Dimensions(width: -1, height: -1), }) : fileId = fileID; - void addNewlyDetectedFaces( - List faceDetections, - Dimensions originalSize, - ) { - decodedImageSize = originalSize; - for (var i = 0; i < faceDetections.length; i++) { - faces.add( - FaceResult.fromFaceDetection( - faceDetections[i], - resultBuilder: this, - ), - ); - } - } - - void addAlignmentResults( - List alignmentResults, - List blurValues, - ) { - if (alignmentResults.length != faces.length) { - throw Exception( - "The amount of alignment results (${alignmentResults.length}) does not match the number of faces (${faces.length})", - ); - } - - for (var i = 0; i < alignmentResults.length; i++) { - faces[i].alignment = alignmentResults[i]; - faces[i].blurValue = blurValues[i]; - } - } - - void addEmbeddingsToExistingFaces( - List embeddings, - ) { - if (embeddings.length != faces.length) { - throw Exception( - "The amount of embeddings (${embeddings.length}) does not match the number of faces (${faces.length})", - ); - } - for (var faceIndex = 0; faceIndex < faces.length; faceIndex++) { - faces[faceIndex].embedding = embeddings[faceIndex]; - } - } - void noFaceDetected() { faces = []; } @@ -104,8 +60,8 @@ class FaceMlResult { String toJsonString() => jsonEncode(_toJson()); - static FaceMlResult _fromJson(Map json) { - return FaceMlResult( + static MLResult _fromJson(Map json) { + return MLResult( fileId: json['fileId'], faces: (json['faces'] as List) .map((item) => FaceResult.fromJson(item as Map)) @@ -129,7 +85,7 @@ class FaceMlResult { ); } - static FaceMlResult fromJsonString(String jsonString) { + static MLResult fromJsonString(String jsonString) { return _fromJson(jsonDecode(jsonString)); } } @@ -154,11 +110,11 @@ class FaceResult { }); FaceResult.fromFaceDetection( - FaceDetectionRelative faceDetection, { - required FaceMlResult resultBuilder, - }) { - fileId = resultBuilder.fileId; - faceId = faceDetection.toFaceID(fileID: resultBuilder.fileId); + FaceDetectionRelative faceDetection, + int fileID, + ) { + fileId = fileID; + faceId = faceDetection.toFaceID(fileID: fileID); detection = faceDetection; } diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 2dab96fb58..e5aa43d7e4 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -19,6 +19,7 @@ import "package:photos/extensions/list.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/box.dart"; import "package:photos/face/model/detection.dart" as face_detection; +import "package:photos/face/model/dimension.dart"; import "package:photos/face/model/face.dart"; import "package:photos/face/model/landmark.dart"; import "package:photos/models/file/file.dart"; @@ -390,7 +391,7 @@ class FaceMlService { ); try { - final FaceMlResult? result = await _analyzeImageInSingleIsolate( + final MLResult? result = await _analyzeImageInSingleIsolate( enteFile, // preferUsingThumbnailForEverything: false, // disposeImageIsolateAfterUse: false, @@ -590,8 +591,7 @@ class FaceMlService { switch (function) { case FaceMlOperation.analyzeImage: final time = DateTime.now(); - final FaceMlResult result = - await FaceMlService._analyzeImageSync(args); + final MLResult result = await FaceMlService._analyzeImageSync(args); dev.log( "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", ); @@ -676,12 +676,12 @@ class FaceMlService { } /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. - Future _analyzeImageInSingleIsolate(EnteFile enteFile) async { + Future _analyzeImageInSingleIsolate(EnteFile enteFile) async { final String filePath = await getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); final Stopwatch stopwatch = Stopwatch()..start(); - late FaceMlResult result; + late MLResult result; try { final resultJsonString = await _runInIsolate( @@ -703,7 +703,7 @@ class FaceMlService { } return null; } - result = FaceMlResult.fromJsonString(resultJsonString); + result = MLResult.fromJsonString(resultJsonString); } catch (e, s) { _logger.severe( "Could not analyze image with ID ${enteFile.uploadedFileID} \n", @@ -713,9 +713,8 @@ class FaceMlService { debugPrint( "This image with ID ${enteFile.uploadedFileID} has name ${enteFile.displayName}.", ); - final resultBuilder = - FaceMlResult.fromEnteFileID(enteFile.uploadedFileID!) - ..errorOccurred(); + final resultBuilder = MLResult.fromEnteFileID(enteFile.uploadedFileID!) + ..errorOccurred(); return resultBuilder; } stopwatch.stop(); @@ -727,7 +726,7 @@ class FaceMlService { return result; } - static Future _analyzeImageSync(Map args) async { + static Future _analyzeImageSync(Map args) async { try { final int enteFileID = args["enteFileID"] as int; final String imagePath = args["filePath"] as String; @@ -745,6 +744,8 @@ class FaceMlService { final ByteData imageByteData = await getByteDataFromImage(image); dev.log('Reading and decoding image took ' '${DateTime.now().difference(time).inMilliseconds} ms'); + final decodedImageSize = + Dimensions(height: image.height, width: image.width); final resultFaces = await FaceRecognitionService.runFacesPipeline( enteFileID, @@ -753,8 +754,14 @@ class FaceMlService { faceDetectionAddress, faceEmbeddingAddress, ); + if (resultFaces.isEmpty) { + return MLResult.fromEnteFileID(enteFileID)..noFaceDetected(); + } - return resultFaces; + final result = MLResult.fromEnteFileID(enteFileID); + result.faces = resultFaces; + + return result; } catch (e, s) { dev.log("Could not analyze image: \n e: $e \n s: $s"); rethrow; diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index e5b687d3dd..fb3a05e15b 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -160,14 +160,14 @@ class FaceRecognitionService { _logger.info('Fetched $fetchedCount embeddings'); } - static Future runFacesPipeline( + static Future> runFacesPipeline( int enteFileID, Image image, ByteData imageByteData, int faceDetectionAddress, int faceEmbeddingAddress, ) async { - final resultBuilder = FaceMlResult.fromEnteFileID(enteFileID); + final faceResults = []; final Stopwatch stopwatch = Stopwatch()..start(); final startTime = DateTime.now(); @@ -175,10 +175,11 @@ class FaceRecognitionService { // Get the faces final List faceDetectionResult = await _detectFacesSync( + enteFileID, image, imageByteData, faceDetectionAddress, - resultBuilder, + faceResults, ); dev.log( "${faceDetectionResult.length} faces detected with scores ${faceDetectionResult.map((e) => e.score).toList()}: completed `detectFacesSync` function, in " @@ -189,8 +190,7 @@ class FaceRecognitionService { dev.log( "No faceDetectionResult, Completed analyzing image with uploadedFileID $enteFileID, in " "${stopwatch.elapsedMilliseconds} ms"); - resultBuilder.noFaceDetected(); - return resultBuilder; + return []; } stopwatch.reset(); @@ -199,7 +199,7 @@ class FaceRecognitionService { image, imageByteData, faceDetectionResult, - resultBuilder, + faceResults, ); dev.log("Completed `alignFacesSync` function, in " "${stopwatch.elapsedMilliseconds} ms"); @@ -209,7 +209,7 @@ class FaceRecognitionService { final embeddings = await _embedFacesSync( faceAlignmentResult, faceEmbeddingAddress, - resultBuilder, + faceResults, ); dev.log("Completed `embedFacesSync` function, in " "${stopwatch.elapsedMilliseconds} ms"); @@ -219,27 +219,35 @@ class FaceRecognitionService { "uploadedFileID $enteFileID, in " "${DateTime.now().difference(startTime).inMilliseconds} ms"); - return resultBuilder; + return faceResults; } /// Runs face recognition on the given image data. static Future> _detectFacesSync( + int fileID, Image image, ByteData imageByteData, int interpreterAddress, - FaceMlResult resultBuilder, + List faceResults, ) async { try { // Get the bounding boxes of the faces - final (List faces, dataSize) = + final List faces = await FaceDetectionService.predict( image, imageByteData, interpreterAddress, ); - // Add detected faces to the resultBuilder - resultBuilder.addNewlyDetectedFaces(faces, dataSize); + // Add detected faces to the faceResults + for (var i = 0; i < faces.length; i++) { + faceResults.add( + FaceResult.fromFaceDetection( + faces[i], + fileID, + ), + ); + } return faces; } on YOLOFaceInterpreterRunException { @@ -256,25 +264,26 @@ class FaceRecognitionService { Image image, ByteData imageByteData, List faces, - FaceMlResult resultBuilder, + List faceResults, ) async { try { - final stopwatch = Stopwatch()..start(); final (alignedFaces, alignmentResults, _, blurValues, _) = await preprocessToMobileFaceNetFloat32List( image, imageByteData, faces, ); - stopwatch.stop(); - dev.log( - "Face alignment image decoding and processing took ${stopwatch.elapsedMilliseconds} ms", - ); - resultBuilder.addAlignmentResults( - alignmentResults, - blurValues, - ); + // Store the results + if (alignmentResults.length != faces.length) { + throw Exception( + "The amount of alignment results (${alignmentResults.length}) does not match the number of faces (${faces.length})", + ); + } + for (var i = 0; i < alignmentResults.length; i++) { + faceResults[i].alignment = alignmentResults[i]; + faceResults[i].blurValue = blurValues[i]; + } return alignedFaces; } catch (e, s) { @@ -286,15 +295,22 @@ class FaceRecognitionService { static Future>> _embedFacesSync( Float32List facesList, int interpreterAddress, - FaceMlResult resultBuilder, + List faceResults, ) async { try { // Get the embedding of the faces final List> embeddings = await FaceEmbeddingService.predict(facesList, interpreterAddress); - // Add the embeddings to the resultBuilder - resultBuilder.addEmbeddingsToExistingFaces(embeddings); + // Store the results + if (embeddings.length != faceResults.length) { + throw Exception( + "The amount of embeddings (${embeddings.length}) does not match the number of faces (${faceResults.length})", + ); + } + for (var faceIndex = 0; faceIndex < faceResults.length; faceIndex++) { + faceResults[faceIndex].embedding = embeddings[faceIndex]; + } return embeddings; } on MobileFaceNetInterpreterRunException { From 37cc447d4f2806090ae6726596249e68d901acfd Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 22:51:17 +0530 Subject: [PATCH 0043/1179] [mob][photos] Rename to MLService --- mobile/lib/face/db.dart | 2 +- mobile/lib/face/model/face.dart | 2 +- mobile/lib/main.dart | 2 +- .../face_ml/face_clustering/face_clustering_service.dart | 2 +- .../machine_learning/face_ml/face_recognition_service.dart | 2 +- .../machine_learning/face_ml/feedback/cluster_feedback.dart | 2 +- .../{face_ml/face_ml_result.dart => ml_result.dart} | 0 .../{face_ml/face_ml_service.dart => ml_service.dart} | 2 +- mobile/lib/ui/settings/debug/face_debug_section_widget.dart | 3 +-- mobile/lib/ui/viewer/people/cluster_app_bar.dart | 2 +- 10 files changed, 9 insertions(+), 10 deletions(-) rename mobile/lib/services/machine_learning/{face_ml/face_ml_result.dart => ml_result.dart} (100%) rename mobile/lib/services/machine_learning/{face_ml/face_ml_service.dart => ml_service.dart} (99%) diff --git a/mobile/lib/face/db.dart b/mobile/lib/face/db.dart index 20118e6661..4af0f1cf30 100644 --- a/mobile/lib/face/db.dart +++ b/mobile/lib/face/db.dart @@ -12,7 +12,7 @@ import "package:photos/face/db_model_mappers.dart"; import "package:photos/face/model/face.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/ml_util.dart"; import 'package:sqlite_async/sqlite_async.dart'; diff --git a/mobile/lib/face/model/face.dart b/mobile/lib/face/model/face.dart index 7088908f28..ee14c2af78 100644 --- a/mobile/lib/face/model/face.dart +++ b/mobile/lib/face/model/face.dart @@ -1,6 +1,6 @@ import "package:photos/face/model/detection.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; // FileInfo contains the image width and height of the image the face was detected in. class FileInfo { diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index db0f52d82b..18148c897d 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -32,10 +32,10 @@ import 'package:photos/services/home_widget_service.dart'; import 'package:photos/services/local_file_update_service.dart'; import 'package:photos/services/local_sync_service.dart'; import "package:photos/services/location_service.dart"; -import 'package:photos/services/machine_learning/face_ml/face_ml_service.dart'; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import "package:photos/services/machine_learning/machine_learning_controller.dart"; +import 'package:photos/services/machine_learning/ml_service.dart'; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import "package:photos/services/magic_cache_service.dart"; import 'package:photos/services/memories_service.dart'; diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index 1360e8ca92..69b8fc06b8 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -12,7 +12,7 @@ import "package:ml_linalg/vector.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:synchronized/synchronized.dart"; class FaceInfo { diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index fb3a05e15b..532f655f98 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -14,11 +14,11 @@ import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/machine_learning/file_ml/file_ml.dart"; import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index 688b142235..9da4f1ce2f 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -15,8 +15,8 @@ import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/models/file/file.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/search_service.dart"; class ClusterSuggestion { diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_result.dart b/mobile/lib/services/machine_learning/ml_result.dart similarity index 100% rename from mobile/lib/services/machine_learning/face_ml/face_ml_result.dart rename to mobile/lib/services/machine_learning/ml_result.dart diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart similarity index 99% rename from mobile/lib/services/machine_learning/face_ml/face_ml_service.dart rename to mobile/lib/services/machine_learning/ml_service.dart index e5aa43d7e4..4d46c9220b 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -29,12 +29,12 @@ import "package:photos/services/machine_learning/face_ml/face_clustering/face_db import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; -import 'package:photos/services/machine_learning/face_ml/face_ml_result.dart'; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; +import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; diff --git a/mobile/lib/ui/settings/debug/face_debug_section_widget.dart b/mobile/lib/ui/settings/debug/face_debug_section_widget.dart index 1658d6a5f7..b64343e53d 100644 --- a/mobile/lib/ui/settings/debug/face_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/face_debug_section_widget.dart @@ -1,15 +1,14 @@ import "dart:async"; -import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/person.dart"; -import 'package:photos/services/machine_learning/face_ml/face_ml_service.dart'; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; +import 'package:photos/services/machine_learning/ml_service.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart'; diff --git a/mobile/lib/ui/viewer/people/cluster_app_bar.dart b/mobile/lib/ui/viewer/people/cluster_app_bar.dart index e2b3c10824..fbfade9013 100644 --- a/mobile/lib/ui/viewer/people/cluster_app_bar.dart +++ b/mobile/lib/ui/viewer/people/cluster_app_bar.dart @@ -14,8 +14,8 @@ import "package:photos/models/file/file.dart"; import 'package:photos/models/gallery_type.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; -import "package:photos/services/machine_learning/face_ml/face_ml_result.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import 'package:photos/ui/actions/collection/collection_sharing_actions.dart'; import "package:photos/ui/common/popup_item.dart"; import "package:photos/ui/viewer/people/cluster_breakup_page.dart"; From 8609cb9498111a26f43afaf7ce83af4ee2d42f32 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 3 Jul 2024 22:54:52 +0530 Subject: [PATCH 0044/1179] [mob][photos] ORTEnv fix --- mobile/lib/services/machine_learning/ml_model.dart | 2 +- mobile/lib/services/machine_learning/ml_service.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 83cff7ad65..b806e37bdb 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -27,13 +27,13 @@ abstract class MlModel { await RemoteAssetsService.instance.getAsset(modelRemotePath); final startTime = DateTime.now(); try { + await ONNXEnv.instance.initONNX(modelName); sessionAddress = await computer.compute( _loadModel, param: { "modelPath": model.path, }, ); - await ONNXEnv.instance.initONNX(modelName); isInitialized = true; final endTime = DateTime.now(); logger.info( diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 4d46c9220b..c3720f58d2 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -508,7 +508,6 @@ class FaceMlService { _logger.info("client: $client"); // Initialize models - await _computer.compute(() => OrtEnv.instance.init()); try { await FaceDetectionService.instance.init(); } catch (e, s) { From 11656a59a61f7e1638b2560f3b18ad0ec684140e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 4 Jul 2024 06:28:19 +0530 Subject: [PATCH 0045/1179] [mob][photos] Include clip in MLResult --- .../services/machine_learning/ml_result.dart | 46 +++++- .../services/machine_learning/ml_service.dart | 151 +++++++++--------- 2 files changed, 119 insertions(+), 78 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_result.dart b/mobile/lib/services/machine_learning/ml_result.dart index ab39a4a332..254564cfc6 100644 --- a/mobile/lib/services/machine_learning/ml_result.dart +++ b/mobile/lib/services/machine_learning/ml_result.dart @@ -10,7 +10,8 @@ import 'package:photos/services/machine_learning/face_ml/face_filtering/face_fil class MLResult { int fileId; - List faces = []; + List? faces = []; + ClipResult? clip; Dimensions decodedImageSize; @@ -18,11 +19,16 @@ class MLResult { bool errorOccured; bool onlyThumbnailUsed; - bool get hasFaces => faces.isNotEmpty; + bool get facesRan => faces != null; + bool get clipRan => clip != null; + + bool get foundFaces => facesRan && faces!.isNotEmpty; + bool get foundNoFaces => facesRan && faces!.isEmpty; MLResult({ this.fileId = -1, this.faces = const [], + this.clip, this.mlVersion = faceMlVersion, this.errorOccured = false, this.onlyThumbnailUsed = false, @@ -48,7 +54,8 @@ class MLResult { Map _toJson() => { 'fileId': fileId, - 'faces': faces.map((face) => face.toJson()).toList(), + 'faces': faces?.map((face) => face.toJson()).toList(), + 'clip': clip?.toJson(), 'mlVersion': mlVersion, 'errorOccured': errorOccured, 'onlyThumbnailUsed': onlyThumbnailUsed, @@ -63,9 +70,14 @@ class MLResult { static MLResult _fromJson(Map json) { return MLResult( fileId: json['fileId'], - faces: (json['faces'] as List) - .map((item) => FaceResult.fromJson(item as Map)) - .toList(), + faces: json['faces'] != null + ? (json['faces'] as List) + .map((item) => FaceResult.fromJson(item as Map)) + .toList() + : null, + clip: json['clip'] != null + ? ClipResult.fromJson(json['clip'] as Map) + : null, mlVersion: json['mlVersion'], errorOccured: json['errorOccured'] ?? false, onlyThumbnailUsed: json['onlyThumbnailUsed'] ?? false, @@ -90,6 +102,28 @@ class MLResult { } } +class ClipResult { + final int fileID; + final Embedding embedding; + + ClipResult({ + required this.fileID, + required this.embedding, + }); + + Map toJson() => { + 'fileID': fileID, + 'embedding': embedding, + }; + + static ClipResult fromJson(Map json) { + return ClipResult( + fileID: json['fileID'], + embedding: Embedding.from(json['embedding']), + ); + } +} + class FaceResult { late FaceDetectionRelative detection; late double blurValue; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index c3720f58d2..4343a4b7b5 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -389,6 +389,7 @@ class FaceMlService { _logger.info( "`processImage` start processing image with uploadedFileID: ${enteFile.uploadedFileID}", ); + bool actuallyRanML = false; try { final MLResult? result = await _analyzeImageInSingleIsolate( @@ -402,82 +403,86 @@ class FaceMlService { "Failed to analyze image with uploadedFileID: ${enteFile.uploadedFileID}", ); } - return false; + return actuallyRanML; } - final List faces = []; - if (!result.hasFaces) { - debugPrint( - 'No faces detected for file with name:${enteFile.displayName}', - ); - faces.add( - Face.empty(result.fileId, error: result.errorOccured), - ); - } else { - if (result.decodedImageSize.width == -1 || - result.decodedImageSize.height == -1) { - _logger - .severe("decodedImageSize is not stored correctly for image with " - "ID: ${enteFile.uploadedFileID}"); - _logger.info( - "Using aligned image size for image with ID: ${enteFile.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${enteFile.width}x${enteFile.height} in the metadata", - ); - } - for (int i = 0; i < result.faces.length; ++i) { - final FaceResult faceRes = result.faces[i]; - final detection = face_detection.Detection( - box: FaceBox( - x: faceRes.detection.xMinBox, - y: faceRes.detection.yMinBox, - width: faceRes.detection.width, - height: faceRes.detection.height, - ), - landmarks: faceRes.detection.allKeypoints - .map( - (keypoint) => Landmark( - x: keypoint[0], - y: keypoint[1], - ), - ) - .toList(), + if (result.facesRan) { + actuallyRanML = true; + final List faces = []; + if (result.foundNoFaces) { + debugPrint( + 'No faces detected for file with name:${enteFile.displayName}', ); faces.add( - Face( - faceRes.faceId, - result.fileId, - faceRes.embedding, - faceRes.detection.score, - detection, - faceRes.blurValue, - fileInfo: FileInfo( - imageHeight: result.decodedImageSize.height, - imageWidth: result.decodedImageSize.width, - ), - ), + Face.empty(result.fileId, error: result.errorOccured), ); } - } - _logger.info("inserting ${faces.length} faces for ${result.fileId}"); - if (!result.errorOccured) { - await RemoteFileMLService.instance.putFileEmbedding( - enteFile, - FileMl( - enteFile.uploadedFileID!, - FaceEmbeddings( - faces, - result.mlVersion, - client: client, + if (result.foundFaces) { + if (result.decodedImageSize.width == -1 || + result.decodedImageSize.height == -1) { + _logger.severe( + "decodedImageSize is not stored correctly for image with " + "ID: ${enteFile.uploadedFileID}"); + _logger.info( + "Using aligned image size for image with ID: ${enteFile.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${enteFile.width}x${enteFile.height} in the metadata", + ); + } + for (int i = 0; i < result.faces!.length; ++i) { + final FaceResult faceRes = result.faces![i]; + final detection = face_detection.Detection( + box: FaceBox( + x: faceRes.detection.xMinBox, + y: faceRes.detection.yMinBox, + width: faceRes.detection.width, + height: faceRes.detection.height, + ), + landmarks: faceRes.detection.allKeypoints + .map( + (keypoint) => Landmark( + x: keypoint[0], + y: keypoint[1], + ), + ) + .toList(), + ); + faces.add( + Face( + faceRes.faceId, + result.fileId, + faceRes.embedding, + faceRes.detection.score, + detection, + faceRes.blurValue, + fileInfo: FileInfo( + imageHeight: result.decodedImageSize.height, + imageWidth: result.decodedImageSize.width, + ), + ), + ); + } + } + _logger.info("inserting ${faces.length} faces for ${result.fileId}"); + if (!result.errorOccured) { + await RemoteFileMLService.instance.putFileEmbedding( + enteFile, + FileMl( + enteFile.uploadedFileID!, + FaceEmbeddings( + faces, + result.mlVersion, + client: client, + ), + height: result.decodedImageSize.height, + width: result.decodedImageSize.width, ), - height: result.decodedImageSize.height, - width: result.decodedImageSize.width, - ), - ); - } else { - _logger.warning( - 'Skipped putting embedding because of error ${result.toJsonString()}', - ); + ); + } else { + _logger.warning( + 'Skipped putting embedding because of error ${result.toJsonString()}', + ); + } + await FaceMLDataDB.instance.bulkInsertFaces(faces); + return actuallyRanML; } - await FaceMLDataDB.instance.bulkInsertFaces(faces); - return true; } on ThumbnailRetrievalException catch (e, s) { _logger.severe( 'ThumbnailRetrievalException while processing image with ID ${enteFile.uploadedFileID}, storing empty face so indexing does not get stuck', @@ -495,6 +500,7 @@ class FaceMlService { ); return false; } + return actuallyRanML; } Future _initModels() async { @@ -718,7 +724,7 @@ class FaceMlService { } stopwatch.stop(); _logger.info( - "Finished Analyze image (${result.faces.length} faces) with uploadedFileID ${enteFile.uploadedFileID}, in " + "Finished Analyze image with uploadedFileID ${enteFile.uploadedFileID}, in " "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", ); @@ -745,6 +751,8 @@ class FaceMlService { '${DateTime.now().difference(time).inMilliseconds} ms'); final decodedImageSize = Dimensions(height: image.height, width: image.width); + final result = MLResult.fromEnteFileID(enteFileID); + result.decodedImageSize = decodedImageSize; final resultFaces = await FaceRecognitionService.runFacesPipeline( enteFileID, @@ -754,10 +762,9 @@ class FaceMlService { faceEmbeddingAddress, ); if (resultFaces.isEmpty) { - return MLResult.fromEnteFileID(enteFileID)..noFaceDetected(); + return result..noFaceDetected(); } - final result = MLResult.fromEnteFileID(enteFileID); result.faces = resultFaces; return result; From e65b4643cd38e35e02900e9fae389fd9b0eacc30 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 4 Jul 2024 07:24:42 +0530 Subject: [PATCH 0046/1179] [mob][photos] Add clip indexing to MLService --- .../services/machine_learning/ml_service.dart | 117 ++++++++++++------ .../clip/clip_image_encoder.dart | 18 +-- .../semantic_search_service.dart | 86 +++++++------ 3 files changed, 135 insertions(+), 86 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 4343a4b7b5..e9bdd74241 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -9,7 +9,6 @@ import "package:computer/computer.dart"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; -import "package:onnxruntime/onnxruntime.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; @@ -22,7 +21,6 @@ import "package:photos/face/model/detection.dart" as face_detection; import "package:photos/face/model/dimension.dart"; import "package:photos/face/model/face.dart"; import "package:photos/face/model/landmark.dart"; -import "package:photos/models/file/file.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart'; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; @@ -35,6 +33,8 @@ import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; +import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -192,7 +192,7 @@ class FaceMlService { break outerLoop; } await _ensureReadyForInference(); - futures.add(processImage(instruction.enteFile)); + futures.add(processImage(instruction)); } final awaitedFutures = await Future.wait(futures); final sumFutures = awaitedFutures.fold( @@ -385,22 +385,20 @@ class FaceMlService { } } - Future processImage(EnteFile enteFile) async { + Future processImage(FileMLInstruction instruction) async { // TODO: clean this function up _logger.info( - "`processImage` start processing image with uploadedFileID: ${enteFile.uploadedFileID}", + "`processImage` start processing image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", ); bool actuallyRanML = false; try { final MLResult? result = await _analyzeImageInSingleIsolate( - enteFile, - // preferUsingThumbnailForEverything: false, - // disposeImageIsolateAfterUse: false, + instruction, ); if (result == null) { if (!_shouldPauseIndexingAndClustering) { _logger.severe( - "Failed to analyze image with uploadedFileID: ${enteFile.uploadedFileID}", + "Failed to analyze image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", ); } return actuallyRanML; @@ -410,7 +408,7 @@ class FaceMlService { final List faces = []; if (result.foundNoFaces) { debugPrint( - 'No faces detected for file with name:${enteFile.displayName}', + 'No faces detected for file with name:${instruction.enteFile.displayName}', ); faces.add( Face.empty(result.fileId, error: result.errorOccured), @@ -421,9 +419,9 @@ class FaceMlService { result.decodedImageSize.height == -1) { _logger.severe( "decodedImageSize is not stored correctly for image with " - "ID: ${enteFile.uploadedFileID}"); + "ID: ${instruction.enteFile.uploadedFileID}"); _logger.info( - "Using aligned image size for image with ID: ${enteFile.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${enteFile.width}x${enteFile.height} in the metadata", + "Using aligned image size for image with ID: ${instruction.enteFile.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${instruction.enteFile.width}x${instruction.enteFile.height} in the metadata", ); } for (int i = 0; i < result.faces!.length; ++i) { @@ -463,9 +461,9 @@ class FaceMlService { _logger.info("inserting ${faces.length} faces for ${result.fileId}"); if (!result.errorOccured) { await RemoteFileMLService.instance.putFileEmbedding( - enteFile, + instruction.enteFile, FileMl( - enteFile.uploadedFileID!, + instruction.enteFile.uploadedFileID!, FaceEmbeddings( faces, result.mlVersion, @@ -483,18 +481,30 @@ class FaceMlService { await FaceMLDataDB.instance.bulkInsertFaces(faces); return actuallyRanML; } + + if (result.clipRan) { + actuallyRanML = true; + await SemanticSearchService.storeClipImageResult( + result.clip!, + instruction.enteFile, + ); + } } on ThumbnailRetrievalException catch (e, s) { _logger.severe( - 'ThumbnailRetrievalException while processing image with ID ${enteFile.uploadedFileID}, storing empty face so indexing does not get stuck', + 'ThumbnailRetrievalException while processing image with ID ${instruction.enteFile.uploadedFileID}, storing empty face so indexing does not get stuck', e, s, ); - await FaceMLDataDB.instance - .bulkInsertFaces([Face.empty(enteFile.uploadedFileID!, error: true)]); + await FaceMLDataDB.instance.bulkInsertFaces( + [Face.empty(instruction.enteFile.uploadedFileID!, error: true)], + ); + await SemanticSearchService.storeEmptyClipImageResult( + instruction.enteFile, + ); return true; } catch (e, s) { _logger.severe( - "Failed to analyze using FaceML for image with ID: ${enteFile.uploadedFileID}. Not storing any faces, which means it will be automatically retried later.", + "Failed to analyze using FaceML for image with ID: ${instruction.enteFile.uploadedFileID}. Not storing any faces, which means it will be automatically retried later.", e, s, ); @@ -524,6 +534,11 @@ class FaceMlService { } catch (e, s) { _logger.severe("Could not initialize mobilefacenet", e, s); } + try { + await ClipImageEncoder.instance.init(); + } catch (e, s) { + _logger.severe("Could not initialize clip image", e, s); + } _isModelsInitialized = true; _logger.info('initModels done'); _logStatus(); @@ -546,7 +561,11 @@ class FaceMlService { } catch (e, s) { _logger.severe("Could not dispose mobilefacenet", e, s); } - OrtEnv.instance.release(); + try { + await ClipImageEncoder.instance.release(); + } catch (e, s) { + _logger.severe("Could not dispose clip image", e, s); + } _isModelsInitialized = false; }); } @@ -681,9 +700,13 @@ class FaceMlService { } /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. - Future _analyzeImageInSingleIsolate(EnteFile enteFile) async { - final String filePath = - await getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); + Future _analyzeImageInSingleIsolate( + FileMLInstruction instruction, + ) async { + final String filePath = await getImagePathForML( + instruction.enteFile, + typeOfData: FileDataForML.fileData, + ); final Stopwatch stopwatch = Stopwatch()..start(); late MLResult result; @@ -693,12 +716,15 @@ class FaceMlService { ( FaceMlOperation.analyzeImage, { - "enteFileID": enteFile.uploadedFileID ?? -1, + "enteFileID": instruction.enteFile.uploadedFileID ?? -1, "filePath": filePath, + "runFaces": instruction.shouldRunFaces, + "runClip": instruction.shouldRunClip, "faceDetectionAddress": FaceDetectionService.instance.sessionAddress, "faceEmbeddingAddress": FaceEmbeddingService.instance.sessionAddress, + "clipImageAddress": ClipImageEncoder.instance.sessionAddress, } ), ) as String?; @@ -711,20 +737,21 @@ class FaceMlService { result = MLResult.fromJsonString(resultJsonString); } catch (e, s) { _logger.severe( - "Could not analyze image with ID ${enteFile.uploadedFileID} \n", + "Could not analyze image with ID ${instruction.enteFile.uploadedFileID} \n", e, s, ); debugPrint( - "This image with ID ${enteFile.uploadedFileID} has name ${enteFile.displayName}.", + "This image with ID ${instruction.enteFile.uploadedFileID} has name ${instruction.enteFile.displayName}.", ); - final resultBuilder = MLResult.fromEnteFileID(enteFile.uploadedFileID!) - ..errorOccurred(); + final resultBuilder = + MLResult.fromEnteFileID(instruction.enteFile.uploadedFileID!) + ..errorOccurred(); return resultBuilder; } stopwatch.stop(); _logger.info( - "Finished Analyze image with uploadedFileID ${enteFile.uploadedFileID}, in " + "Finished Analyze image with uploadedFileID ${instruction.enteFile.uploadedFileID}, in " "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", ); @@ -735,8 +762,11 @@ class FaceMlService { try { final int enteFileID = args["enteFileID"] as int; final String imagePath = args["filePath"] as String; + final bool runFaces = args["runFaces"] as bool; + final bool runClip = args["runClip"] as bool; final int faceDetectionAddress = args["faceDetectionAddress"] as int; final int faceEmbeddingAddress = args["faceEmbeddingAddress"] as int; + final int clipImageAddress = args["clipImageAddress"] as int; dev.log( "Start analyzing image with uploadedFileID: $enteFileID inside the isolate", @@ -754,18 +784,29 @@ class FaceMlService { final result = MLResult.fromEnteFileID(enteFileID); result.decodedImageSize = decodedImageSize; - final resultFaces = await FaceRecognitionService.runFacesPipeline( - enteFileID, - image, - imageByteData, - faceDetectionAddress, - faceEmbeddingAddress, - ); - if (resultFaces.isEmpty) { - return result..noFaceDetected(); + if (runFaces) { + final resultFaces = await FaceRecognitionService.runFacesPipeline( + enteFileID, + image, + imageByteData, + faceDetectionAddress, + faceEmbeddingAddress, + ); + if (resultFaces.isEmpty) { + return result..noFaceDetected(); + } + result.faces = resultFaces; } - result.faces = resultFaces; + if (runClip) { + final clipResult = await SemanticSearchService.runClipImage( + enteFileID, + image, + imageByteData, + clipImageAddress, + ); + result.clip = clipResult; + } return result; } catch (e, s) { diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index b563186b00..3bacee5fd5 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -1,5 +1,5 @@ -import "dart:io"; -import "dart:typed_data"; +import "dart:typed_data" show ByteData; +import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; @@ -25,17 +25,17 @@ class ClipImageEncoder extends MlModel { static final instance = ClipImageEncoder._privateConstructor(); factory ClipImageEncoder() => instance; - static Future> predict(Map args) async { - final imageData = await File(args["imagePath"]).readAsBytes(); - final image = await decodeImageFromData(imageData); - final ByteData imgByteData = await getByteDataFromImage(image); - - final inputList = await preprocessImageClip(image, imgByteData); + static Future> predict( + Image image, + ByteData imageByteData, + int sessionAddress, + ) async { + final inputList = await preprocessImageClip(image, imageByteData); final inputOrt = OrtValueTensor.createTensorWithDataList(inputList, [1, 3, 224, 224]); final inputs = {'input': inputOrt}; - final session = OrtSession.fromAddress(args["address"]); + final session = OrtSession.fromAddress(sessionAddress); final runOptions = OrtRunOptions(); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 0c717d9791..4cfd7b9d20 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -2,9 +2,11 @@ import "dart:async"; import "dart:collection"; import "dart:developer" as dev show log; import "dart:math" show min; +import "dart:typed_data" show ByteData; +import "dart:ui" show Image; import "package:computer/computer.dart"; -import "package:flutter/services.dart"; +import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; import "package:photos/core/cache/lru_map.dart"; import "package:photos/core/configuration.dart"; @@ -17,14 +19,13 @@ import "package:photos/events/file_uploaded_event.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; -import 'package:photos/services/machine_learning/semantic_search/frameworks/ggml.dart'; -import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; -import 'package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx.dart'; import "package:photos/utils/debouncer.dart"; -import "package:photos/utils/device_info.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; // import "package:photos/utils/thumbnail_util.dart"; @@ -44,12 +45,9 @@ class SemanticSearchService { final _logger = Logger("SemanticSearchService"); final _queue = Queue(); - final _frameworkInitialization = Completer(); final _embeddingLoaderDebouncer = Debouncer(kDebounceDuration, executionInterval: kDebounceDuration); - late Model _currentModel; - late MLFramework _mlFramework; bool _hasInitialized = false; bool _isComputingEmbeddings = false; bool _isSyncing = false; @@ -70,12 +68,6 @@ class SemanticSearchService { return; } _hasInitialized = true; - final shouldDownloadOverMobileData = - Configuration.instance.shouldBackupOverMobileData(); - _currentModel = await _getCurrentModel(); - _mlFramework = _currentModel == Model.onnxClip - ? ONNX(shouldDownloadOverMobileData) - : GGML(shouldDownloadOverMobileData); await EmbeddingStore.instance.init(); await EmbeddingsDB.instance.init(); await _loadEmbeddings(); @@ -115,19 +107,12 @@ class SemanticSearchService { }); } - Future release() async { - if (_frameworkInitialization.isCompleted) { - await _mlFramework.release(); - } - } - Future sync() async { if (_isSyncing) { return; } _isSyncing = true; - final fetchCompleted = - await EmbeddingStore.instance.pullEmbeddings(_currentModel); + final fetchCompleted = await EmbeddingStore.instance.pullEmbeddings(); if (fetchCompleted) { await _backFill(); } @@ -183,14 +168,14 @@ class SemanticSearchService { } Future clearIndexes() async { - await EmbeddingStore.instance.clearEmbeddings(_currentModel); - _logger.info("Indexes cleared for $_currentModel"); + await EmbeddingStore.instance.clearEmbeddings(); + _logger.info("Indexes cleared"); } Future _loadEmbeddings() async { _logger.info("Pulling cached embeddings"); final startTime = DateTime.now(); - _cachedEmbeddings = await EmbeddingsDB.instance.getAll(_currentModel); + _cachedEmbeddings = await EmbeddingsDB.instance.getAll(); final endTime = DateTime.now(); _logger.info( "Loading ${_cachedEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", @@ -219,10 +204,10 @@ class SemanticSearchService { Future> _getFileIDsToBeIndexed() async { final uploadedFileIDs = await getIndexableFileIDs(); - final embeddedFileIDs = - await EmbeddingsDB.instance.getFileIDs(_currentModel); + final embeddedFileIDs = await EmbeddingsDB.instance.getIndexedFileIds(); + embeddedFileIDs.removeWhere((key, value) => value < clipMlVersion); - return uploadedFileIDs.difference(embeddedFileIDs).toList(); + return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); } Future clearQueue() async { @@ -386,7 +371,6 @@ class SemanticSearchService { final embedding = Embedding( fileID: file.uploadedFileID!, - model: _currentModel, embedding: result, ); await EmbeddingStore.instance.storeEmbedding( @@ -398,7 +382,7 @@ class SemanticSearchService { "Could not get embedding for $file because FormatException occured, storing empty result locally", e, ); - final embedding = Embedding.empty(file.uploadedFileID!, _currentModel); + final embedding = Embedding.empty(file.uploadedFileID!); await EmbeddingsDB.instance.put(embedding); } on PlatformException catch (e, s) { _logger.severe( @@ -406,13 +390,32 @@ class SemanticSearchService { e, s, ); - final embedding = Embedding.empty(file.uploadedFileID!, _currentModel); + final embedding = Embedding.empty(file.uploadedFileID!); await EmbeddingsDB.instance.put(embedding); } catch (e, s) { _logger.severe(e, s); } } + static Future storeClipImageResult( + ClipResult clipResult, + EnteFile entefile, + ) async { + final embedding = Embedding( + fileID: clipResult.fileID, + embedding: clipResult.embedding, + ); + await EmbeddingStore.instance.storeEmbedding( + entefile, + embedding, + ); + } + + static Future storeEmptyClipImageResult(EnteFile entefile) async { + final embedding = Embedding.empty(entefile.uploadedFileID!); + await EmbeddingsDB.instance.put(embedding); + } + Future> _getTextEmbedding(String query) async { _logger.info("Searching for " + query); final cachedResult = _queryCache.get(query); @@ -453,14 +456,6 @@ class SemanticSearchService { return queryResults; } - Future _getCurrentModel() async { - if (await isGrapheneOS()) { - return Model.ggmlClip; - } else { - return Model.onnxClip; - } - } - void _startIndexing() { _logger.info("Start indexing"); if (!_mlController.isCompleted) { @@ -474,6 +469,19 @@ class SemanticSearchService { _mlController = Completer(); } } + + static Future runClipImage( + int enteFileID, + Image image, + ByteData imageByteData, + int clipImageAddress, + ) async { + final embedding = + await ClipImageEncoder.predict(image, imageByteData, clipImageAddress); + final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); + + return clipResult; + } } List computeBulkSimilarities(Map args) { From ff5dc490f86f1e7fb0bf57010b79d037c897beeb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 4 Jul 2024 09:14:31 +0530 Subject: [PATCH 0047/1179] [mob][photos] Small changes --- .../services/machine_learning/ml_service.dart | 7 +- mobile/lib/utils/ml_util.dart | 101 +++++++----------- 2 files changed, 44 insertions(+), 64 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index e9bdd74241..4bfc2e5de1 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -5,7 +5,6 @@ import "dart:isolate"; import "dart:math" show min; import "dart:typed_data" show Uint8List, ByteData; -import "package:computer/computer.dart"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; @@ -68,8 +67,6 @@ class FaceMlService { final _functionLock = Lock(); final _initIsolateLock = Lock(); - final _computer = Computer.shared(); - bool _isInitialized = false; bool _isModelsInitialized = false; bool _isIsolateSpawned = false; @@ -132,6 +129,7 @@ class FaceMlService { Future sync() async { await FaceRecognitionService.instance.sync(); + await SemanticSearchService.instance.sync(); } Future runAllFaceML({bool force = false}) async { @@ -385,7 +383,8 @@ class FaceMlService { } } - Future processImage(FileMLInstruction instruction) async { // TODO: clean this function up + Future processImage(FileMLInstruction instruction) async { + // TODO: clean this function up _logger.info( "`processImage` start processing image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index fdb578d7d4..301ce40f2c 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -52,8 +52,10 @@ Future> getFilesForMlIndexing() async { final List hiddenFilesToIndex = []; for (final EnteFile enteFile in enteFiles) { final skip = _skipAnalysisEnteFile(enteFile); - final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs); - final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs); + final shouldRunFaces = + _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); + final shouldRunClip = + _shouldRunIndexing(enteFile, clipIndexedFileIDs, clipMlVersion); if (skip && !shouldRunFaces && !shouldRunClip) { continue; } @@ -70,8 +72,10 @@ Future> getFilesForMlIndexing() async { } for (final EnteFile enteFile in hiddenFiles) { final skip = _skipAnalysisEnteFile(enteFile); - final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs); - final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs); + final shouldRunFaces = + _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); + final shouldRunClip = + _shouldRunIndexing(enteFile, clipIndexedFileIDs, clipMlVersion); if (skip && !shouldRunFaces && !shouldRunClip) { continue; } @@ -100,65 +104,38 @@ Future> getIndexableFileIDs() async { return fileIDs.toSet(); } -Future getImagePathForML( - EnteFile enteFile, { - FileDataForML typeOfData = FileDataForML.fileData, -}) async { +Future getImagePathForML(EnteFile enteFile) async { String? imagePath; - switch (typeOfData) { - case FileDataForML.fileData: - final stopwatch = Stopwatch()..start(); - File? file; - if (enteFile.fileType == FileType.video) { - try { - file = await getThumbnailForUploadedFile(enteFile); - } on PlatformException catch (e, s) { - _logger.severe( - "Could not get thumbnail for $enteFile due to PlatformException", - e, - s, - ); - throw ThumbnailRetrievalException(e.toString(), s); - } - } else { - try { - file = await getFile(enteFile, isOrigin: true); - } catch (e, s) { - _logger.severe( - "Could not get file for $enteFile", - e, - s, - ); - } - } - if (file == null) { - _logger.warning( - "Could not get file for $enteFile of type ${enteFile.fileType.toString()}", - ); - break; - } - imagePath = file.path; - stopwatch.stop(); - _logger.info( - "Getting file data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", + final stopwatch = Stopwatch()..start(); + File? file; + if (enteFile.fileType == FileType.video) { + try { + file = await getThumbnailForUploadedFile(enteFile); + } on PlatformException catch (e, s) { + _logger.severe( + "Could not get thumbnail for $enteFile due to PlatformException", + e, + s, ); - break; - - case FileDataForML.thumbnailData: - final stopwatch = Stopwatch()..start(); - final File? thumbnail = await getThumbnailForUploadedFile(enteFile); - if (thumbnail == null) { - _logger.warning("Could not get thumbnail for $enteFile"); - break; - } - imagePath = thumbnail.path; - stopwatch.stop(); - _logger.info( - "Getting thumbnail data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", + throw ThumbnailRetrievalException(e.toString(), s); + } + } else { + try { + file = await getFile(enteFile, isOrigin: true); + } catch (e, s) { + _logger.severe( + "Could not get file for $enteFile", + e, + s, ); - break; + } } + imagePath = file?.path; + stopwatch.stop(); + _logger.info( + "Getting file data for uploadedFileID ${enteFile.uploadedFileID} took ${stopwatch.elapsedMilliseconds} ms", + ); if (imagePath == null) { _logger.warning( @@ -182,9 +159,13 @@ bool _skipAnalysisEnteFile(EnteFile enteFile) { return false; } -bool _shouldRunIndexing(EnteFile enteFile, Map indexedFileIds) { +bool _shouldRunIndexing( + EnteFile enteFile, + Map indexedFileIds, + int newestVersion, +) { final id = enteFile.uploadedFileID!; - return !indexedFileIds.containsKey(id) || indexedFileIds[id]! < faceMlVersion; + return !indexedFileIds.containsKey(id) || indexedFileIds[id]! < newestVersion; } void normalizeEmbedding(List embedding) { From e2241df86556ec8b0e5710bf266715ce0e3f7f8b Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 4 Jul 2024 09:49:00 +0530 Subject: [PATCH 0048/1179] [mob][photos] First cleanup of SemanticSearchService --- .../semantic_search_service.dart | 195 ++---------------- 1 file changed, 22 insertions(+), 173 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 4cfd7b9d20..e8f8e636ef 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -1,22 +1,16 @@ import "dart:async"; -import "dart:collection"; import "dart:developer" as dev show log; import "dart:math" show min; import "dart:typed_data" show ByteData; import "dart:ui" show Image; import "package:computer/computer.dart"; -import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; import "package:photos/core/cache/lru_map.dart"; -import "package:photos/core/configuration.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/embeddings_db.dart"; import "package:photos/db/files_db.dart"; -import "package:photos/events/diff_sync_complete_event.dart"; import 'package:photos/events/embedding_updated_event.dart'; -import "package:photos/events/file_uploaded_event.dart"; -import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; @@ -24,11 +18,11 @@ import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; -// import "package:photos/utils/thumbnail_util.dart"; class SemanticSearchService { SemanticSearchService._privateConstructor(); @@ -38,28 +32,23 @@ class SemanticSearchService { static final Computer _computer = Computer.shared(); static final LRUMap> _queryCache = LRUMap(20); - static const kEmbeddingLength = 512; static const kMinimumSimilarityThreshold = 0.20; - static const kShouldPushEmbeddings = true; static const kDebounceDuration = Duration(milliseconds: 4000); final _logger = Logger("SemanticSearchService"); - final _queue = Queue(); final _embeddingLoaderDebouncer = Debouncer(kDebounceDuration, executionInterval: kDebounceDuration); bool _hasInitialized = false; - bool _isComputingEmbeddings = false; + bool _textModelIsLoaded = false; bool _isSyncing = false; List _cachedEmbeddings = []; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; - Completer _mlController = Completer(); - get hasInitialized => _hasInitialized; - Future init({bool shouldSyncImmediately = false}) async { + Future init() async { if (!LocalSettings.instance.hasEnabledMagicSearch()) { return; } @@ -76,35 +65,13 @@ class SemanticSearchService { await _loadEmbeddings(); }); }); - Bus.instance.on().listen((event) { - // Diff sync is complete, we can now pull embeddings from remote - unawaited(sync()); - }); - if (Configuration.instance.hasConfiguredAccount() && - kShouldPushEmbeddings) { - unawaited(EmbeddingStore.instance.pushEmbeddings()); - } // ignore: unawaited_futures - _loadModels().then((v) async { + _loadTextModel().then((_) async { _logger.info("Getting text embedding"); await _getTextEmbedding("warm up text encoder"); _logger.info("Got text embedding"); }); - // Adding to queue only on init? - Bus.instance.on().listen((event) async { - _addToQueue(event.file); - }); - if (shouldSyncImmediately) { - unawaited(sync()); - } - Bus.instance.on().listen((event) { - if (event.shouldRun) { - _startIndexing(); - } else { - _pauseIndexing(); - } - }); } Future sync() async { @@ -112,16 +79,13 @@ class SemanticSearchService { return; } _isSyncing = true; - final fetchCompleted = await EmbeddingStore.instance.pullEmbeddings(); - if (fetchCompleted) { - await _backFill(); - } + await EmbeddingStore.instance.pullEmbeddings(); + unawaited(EmbeddingStore.instance.pushEmbeddings()); _isSyncing = false; } bool isMagicSearchEnabledAndReady() { - return LocalSettings.instance.hasEnabledMagicSearch() && - _frameworkInitialization.isCompleted; + return LocalSettings.instance.hasEnabledMagicSearch() && _textModelIsLoaded; } // searchScreenQuery should only be used for the user initiate query on the search screen. @@ -160,13 +124,6 @@ class SemanticSearchService { ); } - InitializationState getFrameworkInitializationState() { - if (!_hasInitialized) { - return InitializationState.notInitialized; - } - return _mlFramework.initializationState; - } - Future clearIndexes() async { await EmbeddingStore.instance.clearEmbeddings(); _logger.info("Indexes cleared"); @@ -184,24 +141,6 @@ class SemanticSearchService { _logger.info("Cached embeddings: " + _cachedEmbeddings.length.toString()); } - Future _backFill() async { - if (!LocalSettings.instance.hasEnabledMagicSearch() || - !MLFramework.kImageEncoderEnabled) { - return; - } - await _frameworkInitialization.future; - _logger.info("Attempting backfill for image embeddings"); - final fileIDs = await _getFileIDsToBeIndexed(); - if (fileIDs.isEmpty) { - return; - } - final files = await FilesDB.instance.getUploadedFiles(fileIDs); - _logger.info(files.length.toString() + " to be embedded"); - // await _cacheThumbnails(files); - _queue.addAll(files); - unawaited(_pollQueue()); - } - Future> _getFileIDsToBeIndexed() async { final uploadedFileIDs = await getIndexableFileIDs(); final embeddedFileIDs = await EmbeddingsDB.instance.getIndexedFileIds(); @@ -210,10 +149,6 @@ class SemanticSearchService { return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); } - Future clearQueue() async { - _queue.clear(); - } - Future> getMatchingFiles( String query, { double? scoreThreshold, @@ -307,94 +242,15 @@ class SemanticSearchService { return matchingFileIDs; } - void _addToQueue(EnteFile file) { - if (!LocalSettings.instance.hasEnabledMagicSearch()) { - return; - } - _logger.info("Adding " + file.toString() + " to the queue"); - _queue.add(file); - _pollQueue(); - } - - Future _loadModels() async { + Future _loadTextModel() async { _logger.info("Initializing ML framework"); try { - await _mlFramework.init(); - _frameworkInitialization.complete(true); + await ClipTextEncoder.instance.init(); + _textModelIsLoaded = true; } catch (e, s) { - _logger.severe("ML framework initialization failed", e, s); - } - _logger.info("ML framework initialized"); - } - - Future _pollQueue() async { - if (_isComputingEmbeddings) { - return; - } - _isComputingEmbeddings = true; - - while (_queue.isNotEmpty) { - await computeImageEmbedding(_queue.removeLast()); - } - - _isComputingEmbeddings = false; - } - - Future computeImageEmbedding(EnteFile file) async { - if (!MLFramework.kImageEncoderEnabled) { - return; - } - if (!_frameworkInitialization.isCompleted) { - return; - } - if (!_mlController.isCompleted) { - _logger.info("Waiting for a green signal from controller..."); - await _mlController.future; - } - try { - // TODO: revert this later - // final thumbnail = await getThumbnailForUploadedFile(file); - // if (thumbnail == null) { - // _logger.warning("Could not get thumbnail for $file"); - // return; - // } - // final filePath = thumbnail.path; - final filePath = - await getImagePathForML(file, typeOfData: FileDataForML.fileData); - - _logger.info("Running clip over $file"); - final result = await _mlFramework.getImageEmbedding(filePath); - if (result.length != kEmbeddingLength) { - _logger.severe("Discovered incorrect embedding for $file - $result"); - return; - } - - final embedding = Embedding( - fileID: file.uploadedFileID!, - embedding: result, - ); - await EmbeddingStore.instance.storeEmbedding( - file, - embedding, - ); - } on FormatException catch (e, _) { - _logger.severe( - "Could not get embedding for $file because FormatException occured, storing empty result locally", - e, - ); - final embedding = Embedding.empty(file.uploadedFileID!); - await EmbeddingsDB.instance.put(embedding); - } on PlatformException catch (e, s) { - _logger.severe( - "Could not get thumbnail for $file due to PlatformException related to thumbnails, storing empty result locally", - e, - s, - ); - final embedding = Embedding.empty(file.uploadedFileID!); - await EmbeddingsDB.instance.put(embedding); - } catch (e, s) { - _logger.severe(e, s); + _logger.severe("Clip text loading failed", e, s); } + _logger.info("Clip text model loaded"); } static Future storeClipImageResult( @@ -423,9 +279,16 @@ class SemanticSearchService { return cachedResult; } try { - final result = await _mlFramework.getTextEmbedding(query); - _queryCache.put(query, result); - return result; + final int clipAddress = ClipTextEncoder.instance.sessionAddress; + final textEmbedding = await _computer.compute( + ClipTextEncoder.instance.infer, + param: { + "text": query, + "address": clipAddress, + }, + ) as List; + _queryCache.put(query, textEmbedding); + return textEmbedding; } catch (e) { _logger.severe("Could not get text embedding", e); return []; @@ -456,20 +319,6 @@ class SemanticSearchService { return queryResults; } - void _startIndexing() { - _logger.info("Start indexing"); - if (!_mlController.isCompleted) { - _mlController.complete(); - } - } - - void _pauseIndexing() { - if (_mlController.isCompleted) { - _logger.info("Pausing indexing"); - _mlController = Completer(); - } - } - static Future runClipImage( int enteFileID, Image image, From 37519179a1386eae0e645c9df01821bd9e545e17 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 4 Jul 2024 13:35:27 +0530 Subject: [PATCH 0049/1179] [mob] Add OnnxFlutterPlugin --- mobile/lib/nativeplugins/onnx.dart | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/mobile/lib/nativeplugins/onnx.dart b/mobile/lib/nativeplugins/onnx.dart index e69de29bb2..58f8bfe7d2 100644 --- a/mobile/lib/nativeplugins/onnx.dart +++ b/mobile/lib/nativeplugins/onnx.dart @@ -0,0 +1,41 @@ +import 'package:flutter/services.dart'; + +class OnnxFlutterPlugin { + static const MethodChannel _channel = + MethodChannel('ente_onnx_flutter_plugin'); + + static Future init( + String modelType, + String modelPath, { + int sessionsCount = 1, + }) async { + final bool result = await _channel.invokeMethod('init', { + 'modelType': modelType, + 'modelPath': modelPath, + 'sessionsCount': sessionsCount, + }); + return result; + } + + static Future release(String modelType) async { + final bool result = + await _channel.invokeMethod('release', {'modelType': modelType}); + return result; + } + + static Future> predict( + List inputData, + String modelType, { + int sessionAddress = 0, + }) async { + final List result = await _channel.invokeMethod( + 'predict', + { + 'sessionAddress': sessionAddress, + 'inputData': inputData, + 'modelType': modelType, + }, + ); + return result.cast(); + } +} From 8f4a8672522a2e5f7a89599472c380cb84d534ff Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 5 Jul 2024 13:00:45 +0530 Subject: [PATCH 0050/1179] [mob][photos] Minor change --- mobile/lib/services/machine_learning/ml_service.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 4bfc2e5de1..a03625873e 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -702,10 +702,7 @@ class FaceMlService { Future _analyzeImageInSingleIsolate( FileMLInstruction instruction, ) async { - final String filePath = await getImagePathForML( - instruction.enteFile, - typeOfData: FileDataForML.fileData, - ); + final String filePath = await getImagePathForML(instruction.enteFile); final Stopwatch stopwatch = Stopwatch()..start(); late MLResult result; From 552d6dfb301c7993f4156f8ba4b4d6d45a568f30 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 5 Jul 2024 13:02:31 +0530 Subject: [PATCH 0051/1179] [mob][photos] Cleanup temp clip in ImageIsolate --- mobile/lib/utils/image_isolate.dart | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/utils/image_isolate.dart index e5850dba29..9ebad2bb94 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/utils/image_isolate.dart @@ -6,13 +6,11 @@ import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:logging/logging.dart"; import "package:photos/face/model/box.dart"; -import "package:photos/services/machine_learning/semantic_search/frameworks/onnx/onnx_image_encoder.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:synchronized/synchronized.dart"; enum ImageOperation { generateFaceThumbnails, - clip, } class ImageIsolate { @@ -90,15 +88,6 @@ class ImageIsolate { faceBoxes, ); sendPort.send(List.from(results)); - case ImageOperation.clip: - final imagePath = args['imagePath'] as String; - final address = args['address'] as int; - final result = await OnnxImageEncoder.inferByImage({ - 'imagePath': imagePath, - 'address': address, - }); - sendPort.send(List.from(result)); - break; } } catch (e, stackTrace) { sendPort @@ -186,17 +175,4 @@ class ImageIsolate { ), ).then((value) => value.cast()); } - - // TODO: remove this later to have clip indexing combined with faces - Future> inferClipImageEmbedding(String imagePath, int encoderAddress) async { - return await _runInIsolate( - ( - ImageOperation.clip, - { - 'imagePath': imagePath, - 'address': encoderAddress, - }, - ), - ).then((value) => value.cast()); - } } From d2f6a533ce1e0f976689bdd94294db802c5edbb7 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 5 Jul 2024 13:05:09 +0530 Subject: [PATCH 0052/1179] [mob][photos] Cleanup MagicSection --- .../lib/ui/viewer/search_tab/magic_section.dart | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/mobile/lib/ui/viewer/search_tab/magic_section.dart b/mobile/lib/ui/viewer/search_tab/magic_section.dart index b5ec65b02a..97996a433d 100644 --- a/mobile/lib/ui/viewer/search_tab/magic_section.dart +++ b/mobile/lib/ui/viewer/search_tab/magic_section.dart @@ -8,7 +8,6 @@ import "package:photos/events/event.dart"; import "package:photos/models/search/generic_search_result.dart"; import "package:photos/models/search/recent_searches.dart"; import "package:photos/models/search/search_types.dart"; -import "package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/viewer/file/no_thumbnail_widget.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; @@ -37,15 +36,11 @@ class _MagicSectionState extends State { for (Stream stream in streamsToListenTo) { streamSubscriptions.add( stream.listen((event) async { - final mlFrameWorkEvent = - event as MLFrameworkInitializationUpdateEvent; - if (mlFrameWorkEvent.state == InitializationState.initialized) { - _magicSearchResults = (await SectionType.magic.getData( - context, - limit: kSearchSectionLimit, - )) as List; - setState(() {}); - } + _magicSearchResults = (await SectionType.magic.getData( + context, + limit: kSearchSectionLimit, + )) as List; + setState(() {}); }), ); } From f95331c8f530f35d26101231c71d4ec791f2cd22 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 5 Jul 2024 13:12:51 +0530 Subject: [PATCH 0053/1179] [mob][photos] Minor changes --- .../semantic_search_service.dart | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index e8f8e636ef..1cc99073c2 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -42,7 +42,7 @@ class SemanticSearchService { bool _hasInitialized = false; bool _textModelIsLoaded = false; bool _isSyncing = false; - List _cachedEmbeddings = []; + List _cachedImageEmbeddings = []; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -59,10 +59,10 @@ class SemanticSearchService { _hasInitialized = true; await EmbeddingStore.instance.init(); await EmbeddingsDB.instance.init(); - await _loadEmbeddings(); + await _loadImageEmbeddings(); Bus.instance.on().listen((event) { _embeddingLoaderDebouncer.run(() async { - await _loadEmbeddings(); + await _loadImageEmbeddings(); }); }); @@ -85,7 +85,9 @@ class SemanticSearchService { } bool isMagicSearchEnabledAndReady() { - return LocalSettings.instance.hasEnabledMagicSearch() && _textModelIsLoaded; + return LocalSettings.instance.hasEnabledMagicSearch() && + _textModelIsLoaded && + _cachedImageEmbeddings.isNotEmpty; } // searchScreenQuery should only be used for the user initiate query on the search screen. @@ -119,7 +121,7 @@ class SemanticSearchService { Future getIndexStatus() async { final indexableFileIDs = await getIndexableFileIDs(); return IndexStatus( - min(_cachedEmbeddings.length, indexableFileIDs.length), + min(_cachedImageEmbeddings.length, indexableFileIDs.length), (await _getFileIDsToBeIndexed()).length, ); } @@ -129,16 +131,17 @@ class SemanticSearchService { _logger.info("Indexes cleared"); } - Future _loadEmbeddings() async { + Future _loadImageEmbeddings() async { _logger.info("Pulling cached embeddings"); final startTime = DateTime.now(); - _cachedEmbeddings = await EmbeddingsDB.instance.getAll(); + _cachedImageEmbeddings = await EmbeddingsDB.instance.getAll(); final endTime = DateTime.now(); _logger.info( - "Loading ${_cachedEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", + "Loading ${_cachedImageEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", ); Bus.instance.fire(EmbeddingCacheUpdatedEvent()); - _logger.info("Cached embeddings: " + _cachedEmbeddings.length.toString()); + _logger + .info("Cached embeddings: " + _cachedImageEmbeddings.length.toString()); } Future> _getFileIDsToBeIndexed() async { @@ -303,7 +306,7 @@ class SemanticSearchService { final List queryResults = await _computer.compute( computeBulkSimilarities, param: { - "imageEmbeddings": _cachedEmbeddings, + "imageEmbeddings": _cachedImageEmbeddings, "textEmbedding": textEmbedding, "minimumSimilarity": minimumSimilarity, }, From 9232cd150bf3c64de7e42f0d32902f7409b822e3 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 5 Jul 2024 13:26:26 +0530 Subject: [PATCH 0054/1179] [mob][photos] SemanticSearchService minor changes --- .../semantic_search/semantic_search_service.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 1cc99073c2..dd5f52f894 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -61,6 +61,7 @@ class SemanticSearchService { await EmbeddingsDB.instance.init(); await _loadImageEmbeddings(); Bus.instance.on().listen((event) { + if (!_hasInitialized) return; _embeddingLoaderDebouncer.run(() async { await _loadImageEmbeddings(); }); @@ -74,6 +75,13 @@ class SemanticSearchService { }); } + Future dispose() async { + if (!_hasInitialized) return; + _hasInitialized = false; + await ClipTextEncoder.instance.release(); + _cachedImageEmbeddings.clear(); + } + Future sync() async { if (_isSyncing) { return; @@ -90,6 +98,11 @@ class SemanticSearchService { _cachedImageEmbeddings.isNotEmpty; } + bool bothClipModelsLoaded() { + return ClipImageEncoder.instance.isInitialized && + ClipTextEncoder.instance.isInitialized; + } + // searchScreenQuery should only be used for the user initiate query on the search screen. // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { From 1f0686d84d0f83846c8b9df0c89c66715e145204 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 15:18:28 +0530 Subject: [PATCH 0055/1179] [mob][photos] ML debug section --- ...dget.dart => ml_debug_section_widget.dart} | 30 +++++++++++++------ mobile/lib/ui/settings_page.dart | 4 +-- 2 files changed, 23 insertions(+), 11 deletions(-) rename mobile/lib/ui/settings/debug/{face_debug_section_widget.dart => ml_debug_section_widget.dart} (92%) diff --git a/mobile/lib/ui/settings/debug/face_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart similarity index 92% rename from mobile/lib/ui/settings/debug/face_debug_section_widget.dart rename to mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index b64343e53d..022229ba00 100644 --- a/mobile/lib/ui/settings/debug/face_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -9,6 +9,7 @@ import "package:photos/face/model/person.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; +import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart'; @@ -18,14 +19,14 @@ import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/local_settings.dart"; import 'package:photos/utils/toast_util.dart'; -class FaceDebugSectionWidget extends StatefulWidget { - const FaceDebugSectionWidget({Key? key}) : super(key: key); +class MLDebugSectionWidget extends StatefulWidget { + const MLDebugSectionWidget({Key? key}) : super(key: key); @override - State createState() => _FaceDebugSectionWidgetState(); + State createState() => _MLDebugSectionWidgetState(); } -class _FaceDebugSectionWidgetState extends State { +class _MLDebugSectionWidgetState extends State { Timer? _timer; @override void initState() { @@ -46,14 +47,14 @@ class _FaceDebugSectionWidgetState extends State { @override Widget build(BuildContext context) { return ExpandableMenuItemWidget( - title: "Faces Debug", + title: "ML Debug", selectionOptionsWidget: _getSectionOptions(context), leadingIcon: Icons.bug_report_outlined, ); } Widget _getSectionOptions(BuildContext context) { - final Logger _logger = Logger("FaceDebugSectionWidget"); + final Logger _logger = Logger("MLDebugSectionWidget"); return Column( children: [ MenuItemWidget( @@ -252,7 +253,7 @@ class _FaceDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Reset feedback", + title: "Reset faces feedback", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -281,7 +282,7 @@ class _FaceDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Reset feedback and clustering", + title: "Reset faces feedback and clustering", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -314,7 +315,7 @@ class _FaceDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Reset everything (embeddings)", + title: "Reset faces everything (embeddings)", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -340,6 +341,17 @@ class _FaceDebugSectionWidgetState extends State { ); }, ), + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Reset clip embeddings", + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + await SemanticSearchService.instance.clearIndexes(); + }, + ), ], ); } diff --git a/mobile/lib/ui/settings_page.dart b/mobile/lib/ui/settings_page.dart index cc0064a306..a3c3c83cb9 100644 --- a/mobile/lib/ui/settings_page.dart +++ b/mobile/lib/ui/settings_page.dart @@ -18,7 +18,7 @@ import 'package:photos/ui/settings/account_section_widget.dart'; import 'package:photos/ui/settings/app_version_widget.dart'; import 'package:photos/ui/settings/backup/backup_section_widget.dart'; import 'package:photos/ui/settings/debug/debug_section_widget.dart'; -import "package:photos/ui/settings/debug/face_debug_section_widget.dart"; +import "package:photos/ui/settings/debug/ml_debug_section_widget.dart"; import "package:photos/ui/settings/developer_settings_widget.dart"; import 'package:photos/ui/settings/general_section_widget.dart'; import 'package:photos/ui/settings/inherited_settings_state.dart'; @@ -145,7 +145,7 @@ class SettingsPage extends StatelessWidget { if (hasLoggedIn && flagService.internalUser) { contents.addAll([sectionSpacing, const DebugSectionWidget()]); if (flagService.faceSearchEnabled) { - contents.addAll([sectionSpacing, const FaceDebugSectionWidget()]); + contents.addAll([sectionSpacing, const MLDebugSectionWidget()]); } } contents.add(const AppVersionWidget()); From c1fe756a869e948e4226cfd278f4fc09e1039b82 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 19:13:32 +0530 Subject: [PATCH 0056/1179] [mob][photos] Rename --- mobile/lib/services/machine_learning/ml_service.dart | 6 +++--- mobile/lib/ui/settings/debug/ml_debug_section_widget.dart | 2 +- mobile/lib/ui/settings/machine_learning_settings_page.dart | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index a03625873e..f7642c2a57 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -86,7 +86,7 @@ class FaceMlService { static const int _fileDownloadLimit = 10; static const _kForceClusteringFaceCount = 8000; - /// Only call this function once at app startup, after that you can directly call [runAllFaceML] + /// Only call this function once at app startup, after that you can directly call [runAllML] Future init() async { if (LocalSettings.instance.isFaceIndexingEnabled == false || _isInitialized) { @@ -114,7 +114,7 @@ class FaceMlService { "MLController allowed running ML, faces indexing starting", ); } - unawaited(runAllFaceML()); + unawaited(runAllML()); } else { _logger.info( "MLController stopped running ML, faces indexing will be paused (unless it's fetching embeddings)", @@ -132,7 +132,7 @@ class FaceMlService { await SemanticSearchService.instance.sync(); } - Future runAllFaceML({bool force = false}) async { + Future runAllML({bool force = false}) async { if (force) { _mlControllerStatus = true; } diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 022229ba00..825fba3dcf 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -149,7 +149,7 @@ class _MLDebugSectionWidgetState extends State { onTap: () async { try { FaceMlService.instance.debugIndexingDisabled = false; - unawaited(FaceMlService.instance.runAllFaceML()); + unawaited(FaceMlService.instance.runAllML()); } catch (e, s) { _logger.warning('indexAndClusterAll failed ', e, s); await showGenericErrorDialog(context: context, error: e); diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index c2f8ffaf54..80ce29a15a 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -224,7 +224,8 @@ class _MachineLearningSettingsPageState await LocalSettings.instance.toggleFaceIndexing(); if (isEnabled) { await FaceMlService.instance.init(); - unawaited(FaceMlService.instance.runAllFaceML(force: true)); + await SemanticSearchService.instance.init(); + unawaited(FaceMlService.instance.runAllML(force: true)); } else { FaceMlService.instance.pauseIndexingAndClustering(); } From 47ac7e0c9ca283b3b29d6b96cb04c07668be56bf Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 19:20:09 +0530 Subject: [PATCH 0057/1179] [mob][photos] Rename --- mobile/lib/main.dart | 2 +- .../services/machine_learning/ml_service.dart | 12 +++++---- .../debug/ml_debug_section_widget.dart | 25 +++++++++---------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 18148c897d..0ca8f28ebf 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -292,7 +292,7 @@ Future _init(bool isBackground, {String via = ''}) async { _logger.info("MachineLearningController done"); if (flagService.faceSearchEnabled) { - unawaited(FaceMlService.instance.init()); + unawaited(MLService.instance.init()); } else { if (LocalSettings.instance.isFaceIndexingEnabled) { unawaited(LocalSettings.instance.toggleFaceIndexing()); diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index f7642c2a57..da9658d6c1 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -47,7 +47,7 @@ enum FaceMlOperation { analyzeImage } /// WARNING: For getting the ML results needed for the UI, you should use `FaceSearchService` instead of this class! /// /// The pipeline consists of face detection, face alignment and face embedding. -class FaceMlService { +class MLService { final _logger = Logger("FaceMlService"); // Flutter isolate things for running the image ml pipeline @@ -59,9 +59,9 @@ class FaceMlService { late SendPort _mainSendPort; // Singleton pattern - FaceMlService._privateConstructor(); - static final instance = FaceMlService._privateConstructor(); - factory FaceMlService() => instance; + MLService._privateConstructor(); + static final instance = MLService._privateConstructor(); + factory MLService() => instance; final _initModelLock = Lock(); final _functionLock = Lock(); @@ -77,6 +77,8 @@ class FaceMlService { bool get showClusteringIsHappening => _showClusteringIsHappening; + bool get allModelsLoaded => _isModelsInitialized; + bool debugIndexingDisabled = false; bool _showClusteringIsHappening = false; bool _mlControllerStatus = false; @@ -614,7 +616,7 @@ class FaceMlService { switch (function) { case FaceMlOperation.analyzeImage: final time = DateTime.now(); - final MLResult result = await FaceMlService._analyzeImageSync(args); + final MLResult result = await MLService._analyzeImageSync(args); dev.log( "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", ); diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 825fba3dcf..19a90ead9b 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -79,7 +79,7 @@ class _MLDebugSectionWidgetState extends State { final isEnabled = await LocalSettings.instance.toggleFaceIndexing(); if (!isEnabled) { - FaceMlService.instance.pauseIndexingAndClustering(); + MLService.instance.pauseIndexingAndClustering(); } if (mounted) { setState(() {}); @@ -115,7 +115,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: FaceMlService.instance.debugIndexingDisabled + title: MLService.instance.debugIndexingDisabled ? "Debug enable indexing again" : "Debug disable indexing", ), @@ -124,10 +124,10 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - FaceMlService.instance.debugIndexingDisabled = - !FaceMlService.instance.debugIndexingDisabled; - if (FaceMlService.instance.debugIndexingDisabled) { - FaceMlService.instance.pauseIndexingAndClustering(); + MLService.instance.debugIndexingDisabled = + !MLService.instance.debugIndexingDisabled; + if (MLService.instance.debugIndexingDisabled) { + MLService.instance.pauseIndexingAndClustering(); } if (mounted) { setState(() {}); @@ -148,8 +148,8 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - FaceMlService.instance.debugIndexingDisabled = false; - unawaited(FaceMlService.instance.runAllML()); + MLService.instance.debugIndexingDisabled = false; + unawaited(MLService.instance.runAllML()); } catch (e, s) { _logger.warning('indexAndClusterAll failed ', e, s); await showGenericErrorDialog(context: context, error: e); @@ -166,8 +166,8 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - FaceMlService.instance.debugIndexingDisabled = false; - unawaited(FaceMlService.instance.indexAllImages()); + MLService.instance.debugIndexingDisabled = false; + unawaited(MLService.instance.indexAllImages()); } catch (e, s) { _logger.warning('indexing failed ', e, s); await showGenericErrorDialog(context: context, error: e); @@ -194,9 +194,8 @@ class _MLDebugSectionWidgetState extends State { onTap: () async { try { await PersonService.instance.fetchRemoteClusterFeedback(); - FaceMlService.instance.debugIndexingDisabled = false; - await FaceMlService.instance - .clusterAllImages(clusterInBuckets: true); + MLService.instance.debugIndexingDisabled = false; + await MLService.instance.clusterAllImages(clusterInBuckets: true); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { From bb3f3b0e75351764f1781fa03fd9327767ce82a4 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 19:20:32 +0530 Subject: [PATCH 0058/1179] [mob][photos] String intl --- mobile/lib/generated/intl/messages_cs.dart | 1 + mobile/lib/generated/intl/messages_de.dart | 1 + mobile/lib/generated/intl/messages_en.dart | 1 + mobile/lib/generated/intl/messages_es.dart | 1 + mobile/lib/generated/intl/messages_fr.dart | 1 + mobile/lib/generated/intl/messages_it.dart | 1 + mobile/lib/generated/intl/messages_ko.dart | 1 + mobile/lib/generated/intl/messages_nl.dart | 1 + mobile/lib/generated/intl/messages_no.dart | 1 + mobile/lib/generated/intl/messages_pl.dart | 1 + mobile/lib/generated/intl/messages_pt.dart | 1 + mobile/lib/generated/intl/messages_ru.dart | 1 + mobile/lib/generated/intl/messages_zh.dart | 1 + mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_cs.arb | 3 ++- mobile/lib/l10n/intl_de.arb | 3 ++- mobile/lib/l10n/intl_en.arb | 8 ++++---- mobile/lib/l10n/intl_es.arb | 3 ++- mobile/lib/l10n/intl_fr.arb | 3 ++- mobile/lib/l10n/intl_it.arb | 3 ++- mobile/lib/l10n/intl_ko.arb | 3 ++- mobile/lib/l10n/intl_nl.arb | 3 ++- mobile/lib/l10n/intl_no.arb | 3 ++- mobile/lib/l10n/intl_pl.arb | 3 ++- mobile/lib/l10n/intl_pt.arb | 3 ++- mobile/lib/l10n/intl_ru.arb | 3 ++- mobile/lib/l10n/intl_zh.arb | 3 ++- 27 files changed, 51 insertions(+), 16 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 3de2f825b3..31bac6903a 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -59,6 +59,7 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index a68a9df651..1ee2aee143 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -983,6 +983,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Bitte beachten Sie, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 2123a2adf5..689bb0f436 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -946,6 +946,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index c5500a5d2c..7ec87a8a11 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -993,6 +993,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Mercancías"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Por favor, ten en cuenta que el aprendizaje automático resultará en un mayor ancho de banda y uso de batería hasta que todos los elementos sean indexados."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 7cae363308..87bf9bf47c 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -920,6 +920,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Marchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Ordinateur"), "moderateStrength": diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 2ca1cb0531..62315169b8 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -889,6 +889,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Mediocre"), diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index a174b77072..480d64c618 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -59,6 +59,7 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index eedbb366f0..d7651ed783 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -965,6 +965,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobiel, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Matig"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index d3f7ffa1f3..749b7bbf0e 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -81,6 +81,7 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 32689eca5e..281205e284 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -141,6 +141,7 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Umiarkowana"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 967755efac..b8bd440b7b 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -975,6 +975,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Produtos"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 5f39e1e9fd..107bc23192 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -976,6 +976,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Товары"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Пожалуйста, обратите внимание, что машинное обучение приведет к увеличению затрат интернета и энергопотребления до тех пор, пока не будут индексированы все элементы."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 242f35b651..e8d3dc6d75 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -800,6 +800,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("商品"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。"), "mobileWebDesktop": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index ee55ac66f1..5055c220bc 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -8974,6 +8974,16 @@ class S { args: [name], ); } + + /// `ML functions` + String get mlFunctions { + return Intl.message( + 'ML functions', + name: 'mlFunctions', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 024197d9ec..3d95649c79 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -25,5 +25,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 689ff3adc7..66162a59ef 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1251,5 +1251,6 @@ "left": "Links", "right": "Rechts", "whatsNew": "Neue Funktionen", - "reviewSuggestions": "Vorschläge überprüfen" + "reviewSuggestions": "Vorschläge überprüfen", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 8617d0fb83..abdc91841c 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1200,7 +1200,7 @@ "passkey": "Passkey", "passkeyAuthTitle": "Passkey verification", "passKeyPendingVerification": "Verification is still pending", - "loginSessionExpired" : "Session expired", + "loginSessionExpired": "Session expired", "loginSessionExpiredDetails": "Your session has expired. Please login again.", "verifyPasskey": "Verify passkey", "playOnTv": "Play album on TV", @@ -1262,6 +1262,6 @@ "type": "String" } } - } -} - + }, + "mlFunctions": "ML functions" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index c57d7fce28..2e0adc2411 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1251,5 +1251,6 @@ "left": "Izquierda", "right": "Derecha", "whatsNew": "Qué hay de nuevo", - "reviewSuggestions": "Revisar sugerencias" + "reviewSuggestions": "Revisar sugerencias", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 44206d6347..b80289a044 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1168,5 +1168,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index ddcaa3aac0..90893a3c73 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1130,5 +1130,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 024197d9ec..3d95649c79 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -25,5 +25,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 968345316d..526f579395 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1231,5 +1231,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 40085833b9..ec322bccb1 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -39,5 +39,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index b3eb778793..cf99bdcf98 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -126,5 +126,6 @@ "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", "foundFaces": "Found faces", "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index c402867a0b..7487bbccc1 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1251,5 +1251,6 @@ "left": "Esquerda", "right": "Direita", "whatsNew": "O que há de novo", - "reviewSuggestions": "Revisar sugestões" + "reviewSuggestions": "Revisar sugestões", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index f992659db3..c05ff62917 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1250,5 +1250,6 @@ "rotate": "Повернуть", "left": "Влево", "right": "Вправо", - "whatsNew": "Что нового" + "whatsNew": "Что нового", + "mlFunctions": "ML functions" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 2d8e51446e..2f3fc1f2d8 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1251,5 +1251,6 @@ "left": "向左", "right": "向右", "whatsNew": "更新日志", - "reviewSuggestions": "查看建议" + "reviewSuggestions": "查看建议", + "mlFunctions": "ML functions" } \ No newline at end of file From d3e3a9c78404d8213c815bc2679cf2b55aa032ac Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 20:32:02 +0530 Subject: [PATCH 0059/1179] [mob][photos] Better default for DB method --- mobile/lib/face/db.dart | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mobile/lib/face/db.dart b/mobile/lib/face/db.dart index 4af0f1cf30..81c896e164 100644 --- a/mobile/lib/face/db.dart +++ b/mobile/lib/face/db.dart @@ -10,6 +10,7 @@ import "package:photos/extensions/stop_watch.dart"; import 'package:photos/face/db_fields.dart'; import "package:photos/face/db_model_mappers.dart"; import "package:photos/face/model/face.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/ml_result.dart"; @@ -157,15 +158,15 @@ class FaceMLDataDB { } /// Returns a map of fileID to the indexed ML version - Future> getIndexedFileIds({int? minimumMlVersion}) async { + Future> getIndexedFileIds({ + int minimumMlVersion = faceMlVersion, + }) async { final db = await instance.asyncDB; - String query = ''' + final String query = ''' SELECT $fileIDColumn, $mlVersionColumn - FROM $facesTable + FROM $facesTable + WHERE $mlVersionColumn >= $minimumMlVersion '''; - if (minimumMlVersion != null) { - query += ' WHERE $mlVersionColumn >= $minimumMlVersion'; - } final List> maps = await db.getAll(query); final Map result = {}; for (final map in maps) { @@ -174,13 +175,12 @@ class FaceMLDataDB { return result; } - Future getIndexedFileCount({int? minimumMlVersion}) async { + Future getIndexedFileCount({ + int minimumMlVersion = faceMlVersion, + }) async { final db = await instance.asyncDB; - String query = - 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $facesTable'; - if (minimumMlVersion != null) { - query += ' WHERE $mlVersionColumn >= $minimumMlVersion'; - } + final String query = + 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $facesTable WHERE $mlVersionColumn >= $minimumMlVersion'; final List> maps = await db.getAll(query); return maps.first['count'] as int; } From 90c8972a26d49d77a81be8c1f679875b9990c106 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 20:32:24 +0530 Subject: [PATCH 0060/1179] [mob][photos] Cleanup ML settings page --- mobile/lib/db/embeddings_db.dart | 9 + .../semantic_search_service.dart | 6 - .../machine_learning_settings_page.dart | 320 +++--------------- mobile/lib/utils/ml_util.dart | 26 +- 4 files changed, 83 insertions(+), 278 deletions(-) diff --git a/mobile/lib/db/embeddings_db.dart b/mobile/lib/db/embeddings_db.dart index 66b91b5070..2b10413933 100644 --- a/mobile/lib/db/embeddings_db.dart +++ b/mobile/lib/db/embeddings_db.dart @@ -75,6 +75,15 @@ class EmbeddingsDB { return result; } + // TODO: Add actual colomn for version and use here, similar to faces + Future getIndexedFileCount() async { + final db = await _database; + const String query = + 'SELECT COUNT(DISTINCT $columnFileID) as count FROM $tableName'; + final List> maps = await db.getAll(query); + return maps.first['count'] as int; + } + Future put(Embedding embedding) async { final db = await _database; await db.execute( diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index dd5f52f894..22fe1f7f99 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -375,9 +375,3 @@ class QueryResult { QueryResult(this.id, this.score); } - -class IndexStatus { - final int indexedItems, pendingItems; - - IndexStatus(this.indexedItems, this.pendingItems); -} diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 80ce29a15a..6fb617160a 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -1,18 +1,11 @@ import "dart:async"; -import "dart:math" show max, min; import "package:flutter/material.dart"; import "package:intl/intl.dart"; -import "package:logging/logging.dart"; -import "package:photos/core/event_bus.dart"; -import 'package:photos/events/embedding_updated_event.dart'; -import "package:photos/face/db.dart"; import "package:photos/generated/l10n.dart"; -import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; -import "package:photos/services/machine_learning/face_ml/face_ml_service.dart"; import "package:photos/services/machine_learning/machine_learning_controller.dart"; -import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart'; +import "package:photos/services/machine_learning/ml_service.dart"; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import "package:photos/services/remote_assets_service.dart"; import "package:photos/theme/ente_theme.dart"; @@ -30,8 +23,6 @@ import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/wakelock_util.dart"; -final _logger = Logger("MachineLearningSettingsPage"); - class MachineLearningSettingsPage extends StatefulWidget { const MachineLearningSettingsPage({super.key}); @@ -42,41 +33,24 @@ class MachineLearningSettingsPage extends StatefulWidget { class _MachineLearningSettingsPageState extends State { - late InitializationState _state; final EnteWakeLock _wakeLock = EnteWakeLock(); - late StreamSubscription - _eventSubscription; - @override void initState() { super.initState(); - _eventSubscription = - Bus.instance.on().listen((event) { - _fetchState(); - setState(() {}); - }); - _fetchState(); _wakeLock.enable(); MachineLearningController.instance.forceOverrideML(turnOn: true); } - void _fetchState() { - _state = SemanticSearchService.instance.getFrameworkInitializationState(); - } - @override void dispose() { super.dispose(); - _eventSubscription.cancel(); _wakeLock.disable(); MachineLearningController.instance.forceOverrideML(turnOn: false); } @override Widget build(BuildContext context) { - final bool facesFlag = flagService.faceSearchEnabled; - _logger.info("On page open, facesFlag: $facesFlag"); return Scaffold( body: CustomScrollView( primary: false, @@ -119,16 +93,7 @@ class _MachineLearningSettingsPageState padding: const EdgeInsets.symmetric(horizontal: 16), child: Padding( padding: const EdgeInsets.symmetric(vertical: 20), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - _getMagicSearchSettings(context), - const SizedBox(height: 12), - facesFlag - ? _getFacesSearchSettings(context) - : const SizedBox.shrink(), - ], - ), + child: _getMlSettings(context), ), ); }, @@ -140,81 +105,14 @@ class _MachineLearningSettingsPageState ); } - Widget _getMagicSearchSettings(BuildContext context) { - final colorScheme = getEnteColorScheme(context); - final hasEnabled = LocalSettings.instance.hasEnabledMagicSearch(); - return Column( - children: [ - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).magicSearch, - ), - menuItemColor: colorScheme.fillFaint, - trailingWidget: ToggleSwitchWidget( - value: () => LocalSettings.instance.hasEnabledMagicSearch(), - onChanged: () async { - await LocalSettings.instance.setShouldEnableMagicSearch( - !LocalSettings.instance.hasEnabledMagicSearch(), - ); - if (LocalSettings.instance.hasEnabledMagicSearch()) { - unawaited( - SemanticSearchService.instance - .init(shouldSyncImmediately: true), - ); - } else { - await SemanticSearchService.instance.clearQueue(); - } - setState(() {}); - }, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - ), - const SizedBox( - height: 12, - ), - hasEnabled - ? Column( - children: [ - _state == InitializationState.initialized - ? const MagicSearchIndexStatsWidget() - : ModelLoadingState(_state), - const SizedBox( - height: 12, - ), - flagService.internalUser - ? MenuItemWidget( - leadingIcon: Icons.delete_sweep_outlined, - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).clearIndexes, - ), - menuItemColor: getEnteColorScheme(context).fillFaint, - singleBorderRadius: 8, - alwaysShowSuccessState: true, - onTap: () async { - await SemanticSearchService.instance.clearIndexes(); - if (mounted) { - setState(() => {}); - } - }, - ) - : const SizedBox.shrink(), - ], - ) - : const SizedBox.shrink(), - ], - ); - } - - Widget _getFacesSearchSettings(BuildContext context) { + Widget _getMlSettings(BuildContext context) { final colorScheme = getEnteColorScheme(context); final hasEnabled = LocalSettings.instance.isFaceIndexingEnabled; return Column( children: [ MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: S.of(context).faceRecognition, + title: S.of(context).mlFunctions, ), menuItemColor: colorScheme.fillFaint, trailingWidget: ToggleSwitchWidget( @@ -223,12 +121,10 @@ class _MachineLearningSettingsPageState final isEnabled = await LocalSettings.instance.toggleFaceIndexing(); if (isEnabled) { - await FaceMlService.instance.init(); + await MLService.instance.init(); await SemanticSearchService.instance.init(); - unawaited(FaceMlService.instance.runAllML(force: true)); - } else { - FaceMlService.instance.pauseIndexingAndClustering(); - } + unawaited(MLService.instance.runAllML(force: true)); + } else {} if (mounted) { setState(() {}); } @@ -242,7 +138,9 @@ class _MachineLearningSettingsPageState height: 12, ), hasEnabled - ? const FaceRecognitionStatusWidget() + ? MLService.instance.allModelsLoaded + ? const MLStatusWidget() + : const ModelLoadingState() : const SizedBox.shrink(), ], ); @@ -250,10 +148,7 @@ class _MachineLearningSettingsPageState } class ModelLoadingState extends StatefulWidget { - final InitializationState state; - - const ModelLoadingState( - this.state, { + const ModelLoadingState({ Key? key, }) : super(key: key); @@ -274,6 +169,10 @@ class _ModelLoadingStateState extends State { title = "Image Model"; } else if (url.contains("clip-text")) { title = "Text Model"; + } else if (url.contains("yolov5s_face")) { + title = "Face Detection Model"; + } else if (url.contains("mobilefacenet")) { + title = "Face Embedding Model"; } if (title.isNotEmpty) { _progressMap[title] = (event.$2, event.$3); @@ -330,149 +229,37 @@ class _ModelLoadingStateState extends State { } String _getTitle(BuildContext context) { - switch (widget.state) { - case InitializationState.waitingForNetwork: - return S.of(context).waitingForWifi; - default: - return S.of(context).loadingModel; - } + // TODO: uncomment code below to actually check for high bandwidth + // final usableConnection = await canUseHighBandwidth(); + // if (!usableConnection) { + // return S.of(context).waitingForWifi; + // } + return S.of(context).loadingModel; } } -class MagicSearchIndexStatsWidget extends StatefulWidget { - const MagicSearchIndexStatsWidget({ +class MLStatusWidget extends StatefulWidget { + const MLStatusWidget({ super.key, }); @override - State createState() => - _MagicSearchIndexStatsWidgetState(); + State createState() => MLStatusWidgetState(); } -class _MagicSearchIndexStatsWidgetState - extends State { - IndexStatus? _status; - late StreamSubscription _eventSubscription; - - @override - void initState() { - super.initState(); - _eventSubscription = - Bus.instance.on().listen((event) { - _fetchIndexStatus(); - }); - _fetchIndexStatus(); - } - - void _fetchIndexStatus() { - SemanticSearchService.instance.getIndexStatus().then((status) { - _status = status; - setState(() {}); - }); - } - - @override - void dispose() { - super.dispose(); - _eventSubscription.cancel(); - } - - @override - Widget build(BuildContext context) { - if (_status == null) { - return const EnteLoadingWidget(); - } - return Column( - children: [ - Row( - children: [ - MenuSectionTitle(title: S.of(context).status), - Expanded(child: Container()), - _status!.pendingItems > 0 - ? EnteLoadingWidget( - color: getEnteColorScheme(context).fillMuted, - ) - : const SizedBox.shrink(), - ], - ), - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).indexedItems, - ), - trailingWidget: Text( - NumberFormat().format(_status!.indexedItems), - style: Theme.of(context).textTheme.bodySmall, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - // Setting a key here to ensure trailingWidget is refreshed - key: ValueKey("indexed_items_" + _status!.indexedItems.toString()), - ), - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).pendingItems, - ), - trailingWidget: Text( - NumberFormat().format(_status!.pendingItems), - style: Theme.of(context).textTheme.bodySmall, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - // Setting a key here to ensure trailingWidget is refreshed - key: ValueKey("pending_items_" + _status!.pendingItems.toString()), - ), - ], - ); - } -} - -class FaceRecognitionStatusWidget extends StatefulWidget { - const FaceRecognitionStatusWidget({ - super.key, - }); - - @override - State createState() => - FaceRecognitionStatusWidgetState(); -} - -class FaceRecognitionStatusWidgetState - extends State { +class MLStatusWidgetState extends State { Timer? _timer; @override void initState() { super.initState(); _timer = Timer.periodic(const Duration(seconds: 10), (timer) { - setState(() { - // Your state update logic here - }); + setState(() {}); }); } - Future<(int, int, double, bool)> getIndexStatus() async { - try { - final indexedFiles = await FaceMLDataDB.instance - .getIndexedFileCount(minimumMlVersion: faceMlVersion); - final indexableFiles = (await getIndexableFileIDs()).length; - final showIndexedFiles = min(indexedFiles, indexableFiles); - final pendingFiles = max(indexableFiles - indexedFiles, 0); - final clusteringDoneRatio = - await FaceMLDataDB.instance.getClusteredToIndexableFilesRatio(); - final bool deviceIsHealthy = - MachineLearningController.instance.isDeviceHealthy; - - return ( - showIndexedFiles, - pendingFiles, - clusteringDoneRatio, - deviceIsHealthy - ); - } catch (e, s) { - _logger.severe('Error getting face recognition status', e, s); - rethrow; - } + Future _getIndexStatus() async { + final status = await getIndexStatus(); + return status; } @override @@ -492,18 +279,15 @@ class FaceRecognitionStatusWidgetState ], ), FutureBuilder( - future: getIndexStatus(), + future: _getIndexStatus(), builder: (context, snapshot) { if (snapshot.hasData) { - final int indexedFiles = snapshot.data!.$1; - final int pendingFiles = snapshot.data!.$2; - final double clusteringDoneRatio = snapshot.data!.$3; - final double clusteringPercentage = - (clusteringDoneRatio * 100).clamp(0, 100); - final bool isDeviceHealthy = snapshot.data!.$4; + final bool isDeviceHealthy = + MachineLearningController.instance.isDeviceHealthy; + final int indexedFiles = snapshot.data!.indexedItems; + final int pendingFiles = snapshot.data!.pendingItems; - if (!isDeviceHealthy && - (pendingFiles > 0 || clusteringPercentage < 99)) { + if (!isDeviceHealthy && pendingFiles > 0) { return MenuSectionDescriptionWidget( content: S.of(context).indexingIsPaused, ); @@ -537,26 +321,20 @@ class FaceRecognitionStatusWidgetState isGestureDetectorDisabled: true, key: ValueKey("pending_items_" + pendingFiles.toString()), ), - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).clusteringProgress, - ), - trailingWidget: Text( - FaceMlService.instance.showClusteringIsHappening - ? "currently running" - : "${clusteringPercentage.toStringAsFixed(0)}%", - style: Theme.of(context).textTheme.bodySmall, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - key: ValueKey( - FaceMlService.instance.showClusteringIsHappening - ? "currently running" - : "clustering_progress_" + - clusteringPercentage.toStringAsFixed(0), - ), - ), + MLService.instance.showClusteringIsHappening + ? MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).clusteringProgress, + ), + trailingWidget: Text( + "currently running", + style: Theme.of(context).textTheme.bodySmall, + ), + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + isGestureDetectorDisabled: true, + ) + : const SizedBox.shrink(), ], ); } diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 301ce40f2c..9f06bdaedc 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,5 +1,5 @@ import "dart:io" show File; -import "dart:math" as math show sqrt; +import "dart:math" as math show sqrt, min, max; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; @@ -20,6 +20,12 @@ final _logger = Logger("MlUtil"); enum FileDataForML { thumbnailData, fileData } +class IndexStatus { + final int indexedItems, pendingItems; + + IndexStatus(this.indexedItems, this.pendingItems); +} + class FileMLInstruction { final EnteFile enteFile; @@ -33,6 +39,24 @@ class FileMLInstruction { }); } +Future getIndexStatus() async { + try { + final int indexableFiles = (await getIndexableFileIDs()).length; + final int facesIndexedFiles = + await FaceMLDataDB.instance.getIndexedFileCount(); + final int clipIndexedFiles = + await EmbeddingsDB.instance.getIndexedFileCount(); + final int indexedFiles = math.min(facesIndexedFiles, clipIndexedFiles); + + final showIndexedFiles = math.min(indexedFiles, indexableFiles); + final showPendingFiles = math.max(indexableFiles - indexedFiles, 0); + return IndexStatus(showIndexedFiles, showPendingFiles); + } catch (e, s) { + _logger.severe('Error getting ML status', e, s); + rethrow; + } +} + Future> getFilesForMlIndexing() async { _logger.info('getFilesForMlIndexing called'); final time = DateTime.now(); From baac183835d66792439db8f185696d756dae1c34 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 22:14:30 +0700 Subject: [PATCH 0061/1179] [mob][photos] First cleanup of clip flags --- .../semantic_search_service.dart | 4 ++-- mobile/lib/services/search_service.dart | 2 +- mobile/lib/utils/local_settings.dart | 19 ------------------- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 22fe1f7f99..8b148369f4 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -49,7 +49,7 @@ class SemanticSearchService { get hasInitialized => _hasInitialized; Future init() async { - if (!LocalSettings.instance.hasEnabledMagicSearch()) { + if (!LocalSettings.instance.isFaceIndexingEnabled) { return; } if (_hasInitialized) { @@ -93,7 +93,7 @@ class SemanticSearchService { } bool isMagicSearchEnabledAndReady() { - return LocalSettings.instance.hasEnabledMagicSearch() && + return LocalSettings.instance.isFaceIndexingEnabled && _textModelIsLoaded && _cachedImageEmbeddings.isNotEmpty; } diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index 2161e654b7..c850576bb1 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -178,7 +178,7 @@ class SearchService { } Future> getMagicSectionResutls() async { - if (LocalSettings.instance.hasEnabledMagicSearch() && + if (LocalSettings.instance.isFaceIndexingEnabled && flagService.internalUser) { return MagicCacheService.instance.getMagicGenericSearchResult(); } else { diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index 6b81e76971..481b894659 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -45,17 +45,6 @@ class LocalSettings { await _prefs.setInt(kPhotoGridSize, value); } - bool hasEnabledMagicSearch() { - if (_prefs.containsKey(kEnableMagicSearch)) { - return _prefs.getBool(kEnableMagicSearch)!; - } - return false; - } - - Future setShouldEnableMagicSearch(bool value) async { - await _prefs.setBool(kEnableMagicSearch, value); - } - int getRateUsShownCount() { if (_prefs.containsKey(kRateUsShownCount)) { return _prefs.getInt(kRateUsShownCount)!; @@ -75,9 +64,6 @@ class LocalSettings { bool get isFaceIndexingEnabled => _prefs.getBool(kEnableFaceIndexing) ?? false; - bool get isFaceClusteringEnabled => - _prefs.getBool(kEnableFaceIndexing) ?? false; - /// toggleFaceIndexing toggles the face indexing setting and returns the new value Future toggleFaceIndexing() async { await _prefs.setBool(kEnableFaceIndexing, !isFaceIndexingEnabled); @@ -92,9 +78,4 @@ class LocalSettings { } //#endregion - /// toggleFaceClustering toggles the face clustering setting and returns the new value - Future toggleFaceClustering() async { - await _prefs.setBool(kEnableFaceClustering, !isFaceClusteringEnabled); - return isFaceClusteringEnabled; - } } From abd0dedc5759cf3bcb0c86ecff164f2bea994850 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 6 Jul 2024 22:21:35 +0700 Subject: [PATCH 0062/1179] [mob][photos] Debug option --- .../settings/debug/ml_debug_section_widget.dart | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 19a90ead9b..4aa0d85224 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -348,7 +348,22 @@ class _MLDebugSectionWidgetState extends State { trailingIcon: Icons.chevron_right_outlined, trailingIconIsMuted: true, onTap: () async { - await SemanticSearchService.instance.clearIndexes(); + await showChoiceDialog( + context, + title: "Are you sure?", + body: + "You will need to again re-index or fetch all clip image embeddings.", + firstButtonLabel: "Yes, confirm", + firstButtonOnTap: () async { + try { + await SemanticSearchService.instance.clearIndexes(); + showShortToast(context, "Done"); + } catch (e, s) { + _logger.warning('drop clip embeddings failed ', e, s); + await showGenericErrorDialog(context: context, error: e); + } + }, + ); }, ), ], From 240099df83bfd3b741842a5f56acc7463dd8dea1 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 8 Jul 2024 17:48:18 +0700 Subject: [PATCH 0063/1179] [mob][photos] Run clip tokenizer in isolate --- .../clip/clip_text_encoder.dart | 18 +---- .../clip/clip_text_tokenizer.dart | 72 +++++++++++-------- .../semantic_search_service.dart | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index e6db45ff3c..2840aa52c3 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -1,4 +1,3 @@ -import "dart:io"; import "dart:math"; import "package:flutter/foundation.dart"; @@ -6,18 +5,14 @@ import "package:logging/logging.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart'; -import "package:photos/services/remote_assets_service.dart"; class ClipTextEncoder extends MlModel { static const kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; - static const kRemoteBucketVocabPath = "bpe_simple_vocab_16e6.txt"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; - String get kVocabRemotePath => kModelBucketEndpoint + kRemoteBucketVocabPath; - @override Logger get logger => _logger; static final _logger = Logger('ClipTextEncoder'); @@ -30,20 +25,11 @@ class ClipTextEncoder extends MlModel { static final instance = ClipTextEncoder._privateConstructor(); factory ClipTextEncoder() => instance; - final OnnxTextTokenizer _tokenizer = OnnxTextTokenizer(); - - Future initTokenizer() async { - final File vocabFile = - await RemoteAssetsService.instance.getAsset(kVocabRemotePath); - final String vocab = await vocabFile.readAsString(); - await _tokenizer.init(vocab); - } - - Future> infer(Map args) async { + static Future> infer(Map args) async { final text = args["text"]; final address = args["address"] as int; final runOptions = OrtRunOptions(); - final tokenize = _tokenizer.tokenize(text); + final List tokenize = await ClipTextTokenizer.instance.tokenize(text); final data = List.filled(1, Int32List.fromList(tokenize)); final inputOrt = OrtValueTensor.createTensorWithDataList(data, [1, 77]); final inputs = {'input': inputOrt}; diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart index c8d5e4c9c2..3338547f0c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart @@ -2,9 +2,13 @@ import "dart:convert"; import "dart:math"; import "package:html_unescape/html_unescape.dart"; +import "package:photos/services/remote_assets_service.dart"; import "package:tuple/tuple.dart"; -class OnnxTextTokenizer { +class ClipTextTokenizer { + static const String kVocabRemotePath = + "https://models.ente.io/bpe_simple_vocab_16e6.txt"; + late String vocabulary; late Map byteEncoder; late Map byteDecoder; @@ -26,12 +30,35 @@ class OnnxTextTokenizer { late int sot; late int eot; - OnnxTextTokenizer(); + bool _isInitialized = false; - // Async method since the loadFile returns a Future and dart constructor cannot be async - Future init(String vocabulary) async { + // Singleton pattern + ClipTextTokenizer._privateConstructor(); + static final instance = ClipTextTokenizer._privateConstructor(); + factory ClipTextTokenizer() => instance; + + Future> tokenize( + String text, { + int nText = 76, + bool pad = true, + }) async { + await _init(); + var tokens = _encode(text); + tokens = [sot] + tokens.sublist(0, min(nText - 1, tokens.length)) + [eot]; + if (pad) { + return tokens + List.filled(nText + 1 - tokens.length, 0); + } else { + return tokens; + } + } + + Future _init() async { + if (_isInitialized) return; + final vocabFile = + await RemoteAssetsService.instance.getAsset(kVocabRemotePath); + final String vocabulary = await vocabFile.readAsString(); this.vocabulary = vocabulary; - byteEncoder = bytesToUnicode(); + byteEncoder = _bytesToUnicode(); byteDecoder = byteEncoder.map((k, v) => MapEntry(v, k)); var split = vocabulary.split('\n'); @@ -58,28 +85,29 @@ class OnnxTextTokenizer { sot = encoder['<|startoftext|>']!; eot = encoder['<|endoftext|>']!; + _isInitialized = true; } - List encode(String text) { + List _encode(String text) { final List bpeTokens = []; - text = whitespaceClean(basicClean(text)).toLowerCase(); + text = _whitespaceClean(_basicClean(text)).toLowerCase(); for (Match match in pat.allMatches(text)) { String token = match[0]!; token = utf8.encode(token).map((b) => byteEncoder[b]).join(); - bpe(token) + _bpe(token) .split(' ') .forEach((bpeToken) => bpeTokens.add(encoder[bpeToken]!)); } return bpeTokens; } - String bpe(String token) { + String _bpe(String token) { if (cache.containsKey(token)) { return cache[token]!; } var word = token.split('').map((char) => char).toList(); word[word.length - 1] = '${word.last}'; - var pairs = getPairs(word); + var pairs = _getPairs(word); if (pairs.isEmpty) { return '$token'; } @@ -123,7 +151,7 @@ class OnnxTextTokenizer { if (word.length == 1) { break; } else { - pairs = getPairs(word); + pairs = _getPairs(word); } } final wordStr = word.join(' '); @@ -131,21 +159,7 @@ class OnnxTextTokenizer { return wordStr; } - List tokenize(String text, {int nText = 76, bool pad = true}) { - var tokens = encode(text); - tokens = [sot] + tokens.sublist(0, min(nText - 1, tokens.length)) + [eot]; - if (pad) { - return tokens + List.filled(nText + 1 - tokens.length, 0); - } else { - return tokens; - } - } - - List pad(List x, int padLength) { - return x + List.filled(padLength - x.length, 0); - } - - Map bytesToUnicode() { + Map _bytesToUnicode() { final List bs = []; for (int i = '!'.codeUnitAt(0); i <= '~'.codeUnitAt(0); i++) { bs.add(i); @@ -171,7 +185,7 @@ class OnnxTextTokenizer { return Map.fromIterables(bs, ds); } - Set> getPairs(List word) { + Set> _getPairs(List word) { final Set> pairs = {}; String prevChar = word[0]; for (var i = 1; i < word.length; i++) { @@ -181,13 +195,13 @@ class OnnxTextTokenizer { return pairs; } - String basicClean(String text) { + String _basicClean(String text) { final unescape = HtmlUnescape(); text = unescape.convert(unescape.convert(text)); return text.trim(); } - String whitespaceClean(String text) { + String _whitespaceClean(String text) { text = text.replaceAll(RegExp(r'\s+'), ' '); return text.trim(); } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 8b148369f4..e7486a2071 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -297,7 +297,7 @@ class SemanticSearchService { try { final int clipAddress = ClipTextEncoder.instance.sessionAddress; final textEmbedding = await _computer.compute( - ClipTextEncoder.instance.infer, + ClipTextEncoder.infer, param: { "text": query, "address": clipAddress, From 877b833a6d44df4397bbf03c6088a12a93f38f6d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 8 Jul 2024 17:57:12 +0700 Subject: [PATCH 0064/1179] [mob][photos] Simplify --- .../clip/clip_text_tokenizer.dart | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart index 3338547f0c..404234effc 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart @@ -8,6 +8,7 @@ import "package:tuple/tuple.dart"; class ClipTextTokenizer { static const String kVocabRemotePath = "https://models.ente.io/bpe_simple_vocab_16e6.txt"; + static const int totalTokens = 77; late String vocabulary; late Map byteEncoder; @@ -37,19 +38,12 @@ class ClipTextTokenizer { static final instance = ClipTextTokenizer._privateConstructor(); factory ClipTextTokenizer() => instance; - Future> tokenize( - String text, { - int nText = 76, - bool pad = true, - }) async { + Future> tokenize(String text) async { await _init(); var tokens = _encode(text); - tokens = [sot] + tokens.sublist(0, min(nText - 1, tokens.length)) + [eot]; - if (pad) { - return tokens + List.filled(nText + 1 - tokens.length, 0); - } else { - return tokens; - } + tokens = + [sot] + tokens.sublist(0, min(totalTokens - 2, tokens.length)) + [eot]; + return tokens + List.filled(totalTokens - tokens.length, 0); } Future _init() async { From 273e5b88ebeb3738ded74b4c10ca8d40350bd5d0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 8 Jul 2024 17:41:37 +0530 Subject: [PATCH 0065/1179] [mob][droid] Use custom dart plugin for face detection --- .../kotlin/io/ente/photos/MainActivity.kt | 3 +- .../kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt | 207 -------------- mobile/ios/Podfile.lock | 2 +- mobile/lib/nativeplugins/onnx.dart | 41 --- .../face_detection_service.dart | 139 ++++++---- .../face_ml/face_ml_service.dart | 2 +- mobile/plugins/onnx_dart/.metadata | 30 +++ mobile/plugins/onnx_dart/README.md | 15 ++ .../plugins/onnx_dart/analysis_options.yaml | 1 + mobile/plugins/onnx_dart/android/build.gradle | 70 +++++ .../onnx_dart/android/local.properties | 2 + .../plugins/onnx_dart/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 253 ++++++++++++++++++ mobile/plugins/onnx_dart/lib/onnx_dart.dart | 27 ++ .../lib/onnx_dart_method_channel.dart | 73 +++++ .../lib/onnx_dart_platform_interface.dart | 51 ++++ mobile/plugins/onnx_dart/pubspec.lock | 213 +++++++++++++++ mobile/plugins/onnx_dart/pubspec.yaml | 70 +++++ mobile/pubspec.lock | 9 +- mobile/pubspec.yaml | 2 + 21 files changed, 913 insertions(+), 301 deletions(-) delete mode 100644 mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt delete mode 100644 mobile/lib/nativeplugins/onnx.dart create mode 100644 mobile/plugins/onnx_dart/.metadata create mode 100644 mobile/plugins/onnx_dart/README.md create mode 100644 mobile/plugins/onnx_dart/analysis_options.yaml create mode 100644 mobile/plugins/onnx_dart/android/build.gradle create mode 100644 mobile/plugins/onnx_dart/android/local.properties create mode 100644 mobile/plugins/onnx_dart/android/settings.gradle create mode 100644 mobile/plugins/onnx_dart/android/src/main/AndroidManifest.xml create mode 100644 mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt create mode 100644 mobile/plugins/onnx_dart/lib/onnx_dart.dart create mode 100644 mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart create mode 100644 mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart create mode 100644 mobile/plugins/onnx_dart/pubspec.lock create mode 100644 mobile/plugins/onnx_dart/pubspec.yaml diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt index 227bc1788e..75edded083 100644 --- a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt +++ b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt @@ -3,11 +3,10 @@ package io.ente.photos import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant -import io.ente.photos.ml.onnx.EnteOnnxFlutterPlugin class MainActivity : FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) - flutterEngine.plugins.add(EnteOnnxFlutterPlugin()) + } } diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt deleted file mode 100644 index b301850681..0000000000 --- a/mobile/android/app/src/main/kotlin/io/ente/photos/ml/onnx/EnteOnnx.kt +++ /dev/null @@ -1,207 +0,0 @@ -package io.ente.photos.ml.onnx - -import android.content.Context -import androidx.annotation.NonNull -import ai.onnxruntime.* -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import io.flutter.plugin.common.MethodChannel.Result -import kotlinx.coroutines.* -import java.nio.FloatBuffer -import java.util.concurrent.ConcurrentHashMap -import android.util.Log -import java.io.File -import java.util.concurrent.ConcurrentLinkedQueue - -object LongArrayPool { - private val pool = ConcurrentLinkedQueue() - - fun get(size: Int): LongArray { - return pool.poll() ?: LongArray(size) - } - - fun release(array: LongArray) { - pool.offer(array) - } -} - -class EnteOnnxFlutterPlugin : FlutterPlugin, MethodCallHandler { - private var faceOrtEnv: OrtEnvironment = OrtEnvironment.getEnvironment() - private lateinit var channel: MethodChannel - private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - private val sessionMap = ConcurrentHashMap() - private lateinit var context: Context - - companion object { - const val DEFAULT_SESSION_COUNT = 1 - const val K_INPUT_WIDTH = 640 - const val K_INPUT_HEIGHT = 640 - const val K_NUM_CHANNELS = 3 - } - - enum class ModelType { - CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE - } - - data class ModelState( - var isInitialized: Boolean = false, - val sessionAddresses: ConcurrentHashMap = ConcurrentHashMap(), - // number of sessions that should have been created for given model - var sessionsCount: Int = DEFAULT_SESSION_COUNT - ) - - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "ente_onnx_flutter_plugin") - channel.setMethodCallHandler(this) - context = flutterPluginBinding.applicationContext - } - - override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) - releaseAllSessions() - scope.cancel() - } - - override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { - when (call.method) { - "init" -> { - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return - } - val modelPath = call.argument("modelPath") ?: run { - result.error("INVALID_ARGUMENT", "Model path is missing", null) - return - } - val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT - init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) - } - "release" -> { - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return - } - release(ModelType.valueOf(modelType), result) - } - "predict" -> { - val sessionAddress = call.argument("sessionAddress") - val inputData = call.argument>("inputData") - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return - } - if (sessionAddress == null || inputData == null) { - result.error("INVALID_ARGUMENT", "Session address or input data is missing", null) - return - } - val inputDataArray = inputData.map { it.toFloat() }.toFloatArray() - predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, result) - } - else -> result.notImplemented() - } - } - - private fun readModelFile(modelPath: String): ByteArray { - return File(modelPath).readBytes() - } - - private fun init(modelType: ModelType, modelPath: String, sessionsCount: Int, result: Result) { - scope.launch { - val modelState: ModelState - if (sessionMap.containsKey(modelType)) { - modelState = sessionMap[modelType]!! - } else { - modelState = ModelState() - sessionMap[modelType] = modelState - } - if (!modelState.isInitialized) { - for (i in 0 until sessionsCount) { - val session = createSession(faceOrtEnv, modelPath) - if (session != null) { - modelState.sessionAddresses[i] = session - } - } - modelState.isInitialized = true - modelState.sessionsCount = sessionsCount - withContext(Dispatchers.Main) { - result.success(true) - } - } else { - withContext(Dispatchers.Main) { - result.success(false) - } - } - } - } - - private fun release(modelType: ModelType, result: Result) { - scope.launch { - val modelState = sessionMap[modelType] - modelState?.let { - it.sessionAddresses.forEach { entry: Map.Entry -> - entry.value.close() - } - it.sessionAddresses.clear() - it.isInitialized = false - } - withContext(Dispatchers.Main) { - result.success(true) - } - } - } - - private fun predict(modelType: ModelType, sessionAddress: Int, inputData: FloatArray, result: Result) { - scope.launch { - val modelState = sessionMap[modelType] - val session = modelState?.sessionAddresses?.get(sessionAddress) - if (session == null) { - withContext(Dispatchers.Main) { - result.error("SESSION_NOT_FOUND", "Session not found for address: $sessionAddress", null) - } - return@launch - } - - try { - val env = OrtEnvironment.getEnvironment() - val inputTensorShape = LongArrayPool.get(4).apply { - this[0] = 1 - this[1] = K_NUM_CHANNELS.toLong() - this[2] = K_INPUT_HEIGHT.toLong() - this[3] = K_INPUT_WIDTH.toLong() - } - val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) - val inputs = mapOf("input" to inputTensor) - val outputs = session.run(inputs) - Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") - - inputTensor.close() - outputs.close() - LongArrayPool.release(inputTensorShape) - withContext(Dispatchers.Main) { - val dummyResult = listOf(0.1, 0.2) // Replace with actual result processing - result.success(dummyResult) - } - } catch (e: OrtException) { - withContext(Dispatchers.Main) { - result.error("PREDICTION_ERROR", "Error during prediction: ${e.message}", null) - } - } - } - } - - private fun createSession(env: OrtEnvironment, modalPath: String): OrtSession? { - return env.createSession(modalPath, OrtSession.SessionOptions()) - } - - private fun releaseAllSessions() { - sessionMap.forEach { (_, modelState) -> - modelState.sessionAddresses.forEach { entry -> - entry.value.close() - } - modelState.sessionAddresses.clear() - } - sessionMap.clear() - } -} diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index fd11b0a5b1..5f03149e8d 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -466,7 +466,7 @@ SPEC CHECKSUMS: package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 - photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604 + photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437 screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 diff --git a/mobile/lib/nativeplugins/onnx.dart b/mobile/lib/nativeplugins/onnx.dart deleted file mode 100644 index 58f8bfe7d2..0000000000 --- a/mobile/lib/nativeplugins/onnx.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/services.dart'; - -class OnnxFlutterPlugin { - static const MethodChannel _channel = - MethodChannel('ente_onnx_flutter_plugin'); - - static Future init( - String modelType, - String modelPath, { - int sessionsCount = 1, - }) async { - final bool result = await _channel.invokeMethod('init', { - 'modelType': modelType, - 'modelPath': modelPath, - 'sessionsCount': sessionsCount, - }); - return result; - } - - static Future release(String modelType) async { - final bool result = - await _channel.invokeMethod('release', {'modelType': modelType}); - return result; - } - - static Future> predict( - List inputData, - String modelType, { - int sessionAddress = 0, - }) async { - final List result = await _channel.invokeMethod( - 'predict', - { - 'sessionAddress': sessionAddress, - 'inputData': inputData, - 'modelType': modelType, - }, - ); - return result.cast(); - } -} diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 455f4e9c8d..9935ed19ac 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -1,11 +1,12 @@ import "dart:async"; import "dart:developer" as dev show log; -import "dart:io" show File; -import 'dart:typed_data' show ByteData; +import "dart:io" show File, Platform; +import 'dart:typed_data' show ByteBuffer, ByteData, Float32List, Uint8List; import 'dart:ui' as ui show Image; import "package:computer/computer.dart"; import 'package:logging/logging.dart'; +import "package:onnx_dart/onnx_dart.dart"; import 'package:onnxruntime/onnxruntime.dart'; import "package:photos/face/model/dimension.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; @@ -34,6 +35,7 @@ class FaceDetectionService { static const double kIouThreshold = 0.4; static const double kMinScoreSigmoidThreshold = 0.7; static const int kNumKeypoints = 5; + static bool useCustomPlugin = Platform.isAndroid; bool isInitialized = false; @@ -49,19 +51,23 @@ class FaceDetectionService { final model = await RemoteAssetsService.instance.getAsset(modelRemotePath); final startTime = DateTime.now(); - sessionAddress = await _computer.compute( - _loadModel, - param: { - "modelPath": model.path, - }, - ); + if (useCustomPlugin) { + final OnnxDart plugin = OnnxDart(); + final bool? initResult = await plugin.init("YOLO_FACE", model.path); + isInitialized = initResult ?? false; + } else { + sessionAddress = await _computer.compute( + _loadModel, + param: { + "modelPath": model.path, + }, + ); + isInitialized = sessionAddress != -1; + } final endTime = DateTime.now(); _logger.info( "Face detection model loaded, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", ); - if (sessionAddress != -1) { - isInitialized = true; - } } } @@ -80,7 +86,10 @@ class FaceDetectionService { ByteData imageByteData, int sessionAddress, ) async { - assert(sessionAddress != 0 && sessionAddress != -1); + assert( + !useCustomPlugin ? (sessionAddress != 0 && sessionAddress != -1) : true, + 'sessionAddress should be valid', + ); final stopwatch = Stopwatch()..start(); @@ -94,18 +103,6 @@ class FaceDetectionService { requiredHeight: kInputHeight, maintainAspectRatio: true, ); - - final inputShape = [ - 1, - 3, - kInputHeight, - kInputWidth, - ]; - final inputOrt = OrtValueTensor.createTensorWithDataList( - inputImageList, - inputShape, - ); - final inputs = {'input': inputOrt}; stopwatchPreprocessing.stop(); dev.log( 'Face detection image preprocessing is finished, in ${stopwatchPreprocessing.elapsedMilliseconds}ms', @@ -117,39 +114,90 @@ class FaceDetectionService { // Run inference final stopwatchInterpreter = Stopwatch()..start(); - List? outputs; + + List>>? nestedResults = []; try { - final runOptions = OrtRunOptions(); - final session = OrtSession.fromAddress(sessionAddress); - outputs = session.run(runOptions, inputs); - // inputOrt.release(); - // runOptions.release(); + if (useCustomPlugin) { + nestedResults = await _runCustomPlugin(inputImageList); + } else { + nestedResults = _runJNIBasedPlugin( + sessionAddress, + inputImageList, + ); // [1, 25200, 16] + } } catch (e, s) { - _logger.severe('Error while running inference: $e \n $s'); + dev.log('Error while running inference', error: e, stackTrace: s); throw YOLOFaceInterpreterRunException(); } stopwatchInterpreter.stop(); - _logger.info( - 'interpreter.run is finished, in ${stopwatchInterpreter.elapsedMilliseconds} ms', + try { + _logger.info( + 'interpreter.run is finished, in ${stopwatchInterpreter.elapsedMilliseconds} ms', + ); + + final relativeDetections = + _yoloPostProcessOutputs(nestedResults!, newSize); + stopwatch.stop(); + _logger.info( + 'predict() face detection executed in ${stopwatch.elapsedMilliseconds}ms', + ); + + return (relativeDetections, originalSize); + } catch (e, s) { + _logger.severe('Error while post processing', e, s); + rethrow; + } + } + + static List>>? _runJNIBasedPlugin( + int sessionAddress, + Float32List inputImageList, + ) { + final inputShape = [ + 1, + 3, + kInputHeight, + kInputWidth, + ]; + final inputOrt = OrtValueTensor.createTensorWithDataList( + inputImageList, + inputShape, ); + final inputs = {'input': inputOrt}; - final relativeDetections = _yoloPostProcessOutputs(outputs, newSize); + final runOptions = OrtRunOptions(); + final session = OrtSession.fromAddress(sessionAddress); + final List? outputs = session.run(runOptions, inputs); + // inputOrt.release(); + // runOptions.release(); + return outputs?[0]?.value as List>>; // [1, 25200, 16] + } - stopwatch.stop(); - _logger.info( - 'predict() face detection executed in ${stopwatch.elapsedMilliseconds}ms', + static Future>>> _runCustomPlugin( + Float32List inputImageList, + ) async { + final OnnxDart plugin = OnnxDart(); + final result = await plugin.predict( + inputImageList, + "YOLO_FACE", ); - - return (relativeDetections, originalSize); + final List>> reconstructedTensor = []; + for (int i = 0; i < result.length; i += 25200 * 16) { + final List> outerArray = []; + for (int j = 0; j < 25200; j++) { + final List innerArray = + result.sublist(i + j * 16, i + (j + 1) * 16).cast(); + outerArray.add(innerArray); + } + reconstructedTensor.add(outerArray); + } + return reconstructedTensor; } static List _yoloPostProcessOutputs( - List? outputs, + List>> nestedResults, Dimensions newSize, ) { - // // Get output tensors - final nestedResults = - outputs?[0]?.value as List>>; // [1, 25200, 16] final firstResults = nestedResults[0]; // [25200, 16] // Filter output @@ -160,11 +208,6 @@ class FaceDetectionService { results: firstResults, ); - // Release outputs - // outputs?.forEach((element) { - // element?.release(); - // }); - // Account for the fact that the aspect ratio was maintained for (final faceDetection in relativeDetections) { faceDetection.correctForMaintainedAspectRatio( diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart index 99172153b5..1bfb13b622 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart @@ -744,6 +744,7 @@ class FaceMlService { final sendPort = message[2] as SendPort; try { + await FaceDetectionService.instance.init(); switch (function) { case FaceMlOperation.analyzeImage: final time = DateTime.now(); @@ -838,7 +839,6 @@ class FaceMlService { final String? filePath = await _getImagePathForML(enteFile, typeOfData: FileDataForML.fileData); - if (filePath == null) { _logger.warning( "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null", diff --git a/mobile/plugins/onnx_dart/.metadata b/mobile/plugins/onnx_dart/.metadata new file mode 100644 index 0000000000..cf57c0cccc --- /dev/null +++ b/mobile/plugins/onnx_dart/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + channel: "[user-branch]" + +project_type: plugin + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: android + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/mobile/plugins/onnx_dart/README.md b/mobile/plugins/onnx_dart/README.md new file mode 100644 index 0000000000..c4b8097695 --- /dev/null +++ b/mobile/plugins/onnx_dart/README.md @@ -0,0 +1,15 @@ +# onnx_dart + +A new Flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/developing-packages/), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter development, view the +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/mobile/plugins/onnx_dart/analysis_options.yaml b/mobile/plugins/onnx_dart/analysis_options.yaml new file mode 100644 index 0000000000..fac60e247c --- /dev/null +++ b/mobile/plugins/onnx_dart/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml \ No newline at end of file diff --git a/mobile/plugins/onnx_dart/android/build.gradle b/mobile/plugins/onnx_dart/android/build.gradle new file mode 100644 index 0000000000..61a05bb66a --- /dev/null +++ b/mobile/plugins/onnx_dart/android/build.gradle @@ -0,0 +1,70 @@ +group = "io.ente.photos.onnx_dart" +version = "1.0-SNAPSHOT" + +buildscript { + ext.kotlin_version = "1.7.10" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:7.3.0") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" +apply plugin: "kotlin-android" + +android { + if (project.android.hasProperty("namespace")) { + namespace = "io.ente.photos.onnx_dart" + } + + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + defaultConfig { + minSdk = 21 + } + + dependencies { + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + + implementation 'com.microsoft.onnxruntime:onnxruntime-android:latest.release' + } + + testOptions { + unitTests.all { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } +} diff --git a/mobile/plugins/onnx_dart/android/local.properties b/mobile/plugins/onnx_dart/android/local.properties new file mode 100644 index 0000000000..54c35dc361 --- /dev/null +++ b/mobile/plugins/onnx_dart/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/ua741/Library/Android/sdk +flutter.sdk=/Users/ua741/work/flutter \ No newline at end of file diff --git a/mobile/plugins/onnx_dart/android/settings.gradle b/mobile/plugins/onnx_dart/android/settings.gradle new file mode 100644 index 0000000000..d207db8c75 --- /dev/null +++ b/mobile/plugins/onnx_dart/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'onnx_dart' diff --git a/mobile/plugins/onnx_dart/android/src/main/AndroidManifest.xml b/mobile/plugins/onnx_dart/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..7582c8c286 --- /dev/null +++ b/mobile/plugins/onnx_dart/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt new file mode 100644 index 0000000000..4091f7106c --- /dev/null +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -0,0 +1,253 @@ +package io.ente.photos.onnx_dart + +import android.content.Context +import androidx.annotation.NonNull +import ai.onnxruntime.* +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import kotlinx.coroutines.* +import java.nio.FloatBuffer +import java.util.concurrent.ConcurrentHashMap +import android.util.Log +import java.io.File +import java.nio.ByteBuffer +import java.nio.ByteOrder +import java.util.concurrent.ConcurrentLinkedQueue + +object LongArrayPool { + private val poolMap = ConcurrentHashMap>() + + fun get(size: Int): LongArray { + val pool = getPool(size) + return pool.poll() ?: LongArray(size) + } + + fun release(array: LongArray) { + val pool = getPool(array.size) + pool.offer(array) + } + + private fun getPool(size: Int): ConcurrentLinkedQueue { + var pool = poolMap[size] + if (pool == null) { + synchronized(poolMap) { + pool = poolMap[size] + if (pool == null) { + pool = ConcurrentLinkedQueue() + poolMap[size] = pool!! + } + } + } + return pool!! + } +} +/** OnnxDartPlugin */ +class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private lateinit var channel : MethodChannel + + private var faceOrtEnv: OrtEnvironment = OrtEnvironment.getEnvironment() + private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) + private val sessionMap = ConcurrentHashMap() + private lateinit var context: Context + + companion object { + const val DEFAULT_SESSION_COUNT = 1 + const val K_INPUT_WIDTH = 640 + const val K_INPUT_HEIGHT = 640 + const val K_NUM_CHANNELS = 3 + } + + enum class ModelType { + CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE + } + + data class ModelState( + var isInitialized: Boolean = false, + val sessionAddresses: ConcurrentHashMap = ConcurrentHashMap(), + // number of sessions that should have been created for given model + var sessionsCount: Int = DEFAULT_SESSION_COUNT + ) + + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "onnx_dart") + channel.setMethodCallHandler(this) + context = flutterPluginBinding.applicationContext + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + } + + + override fun onMethodCall(call: MethodCall, result: Result) { + if (call.method == "getPlatformVersion") { + result.success("Android ${android.os.Build.VERSION.RELEASE}") + } else if (call.method == "init") { + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + val modelPath = call.argument("modelPath") ?: run { + result.error("INVALID_ARGUMENT", "Model path is missing", null) + return + } + val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT + init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) + } + else if (call.method == "release" ) { + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + release(ModelType.valueOf(modelType), result) + } + else if (call.method == "predict" ) { + val sessionAddress = call.argument("sessionAddress") + val modelType = call.argument("modelType") ?: run { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + val inputDataArray = call.argument("inputData") + + if (sessionAddress == null || inputDataArray == null) { + result.error("INVALID_ARGUMENT", "Session address or input data is missing", null) + return + } +// val inputDataArray = inputData.map { it.toFloat() }.toFloatArray() + predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, result) + } else { + result.notImplemented() + } + } + + + private fun readModelFile(modelPath: String): ByteArray { + return File(modelPath).readBytes() + } + + private fun init(modelType: ModelType, modelPath: String, sessionsCount: Int, result: Result) { + Log.d("OnnxFlutterPlugin", " v: $modelType, path: $modelPath, sessionsCount: $sessionsCount") + scope.launch { + val modelState: ModelState + if (sessionMap.containsKey(modelType)) { + modelState = sessionMap[modelType]!! + } else { + modelState = ModelState() + sessionMap[modelType] = modelState + } + if (!modelState.isInitialized) { + for (i in 0 until sessionsCount) { + val session = createSession(faceOrtEnv, modelPath) + if (session != null) { + modelState.sessionAddresses[i] = session + } + } + modelState.isInitialized = true + modelState.sessionsCount = sessionsCount + withContext(Dispatchers.Main) { + Log.d("OnnxFlutterPlugin", "Model initialized: $modelType") + result.success(true) + } + } else { + withContext(Dispatchers.Main) { + result.success(false) + } + } + } + } + + private fun release(modelType: ModelType, result: Result) { + scope.launch { + val modelState = sessionMap[modelType] + modelState?.let { + it.sessionAddresses.forEach { entry: Map.Entry -> + entry.value.close() + } + it.sessionAddresses.clear() + it.isInitialized = false + } + withContext(Dispatchers.Main) { + result.success(true) + } + } + } + + private fun predict(modelType: ModelType, sessionAddress: Int, inputData: FloatArray, result: Result) { + scope.launch { + val modelState = sessionMap[modelType] + val session = modelState?.sessionAddresses?.get(sessionAddress) + if (session == null) { + withContext(Dispatchers.Main) { + result.error("SESSION_NOT_FOUND", "Session not found for address: $sessionAddress", null) + } + return@launch + } + + try { + val env = OrtEnvironment.getEnvironment() + val inputTensorShape = LongArrayPool.get(4).apply { + this[0] = 1 + this[1] = K_NUM_CHANNELS.toLong() + this[2] = K_INPUT_HEIGHT.toLong() + this[3] = K_INPUT_WIDTH.toLong() + } + val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) + val inputs = mapOf("input" to inputTensor) + val outputs = session.run(inputs) + Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") + + + inputTensor.close() + val totalSize = 1 * 25200 * 16 + val flatArray = FloatArray(totalSize) { index -> index + 1.0f } + + val outputTensor2 = Array(1) { outerIndex -> + Array(25200) { innerIndex -> + val startIndex = (outerIndex * 25200 + innerIndex) * 16 + flatArray.sliceArray(startIndex until startIndex + 16) + } + } + val outputTensor = outputs[0].value as Array> + Log.d("OnnxFlutterPlugin", "Output2 shape: ${outputTensor.size}") + + outputs.close() + LongArrayPool.release(inputTensorShape) + // Send the result back to the Dart layer + val flatList = outputTensor.flatten().flatMap { it.toList() } + val flatList2 = outputTensor2.flatten().flatMap { it.toList() } + + + withContext(Dispatchers.Main) { + result.success(flatList) +// result.success(flatList2) + + } + } catch (e: OrtException) { + withContext(Dispatchers.Main) { + result.error("PREDICTION_ERROR", "Error during prediction: ${e.message}", null) + } + } + } + } + + private fun createSession(env: OrtEnvironment, modalPath: String): OrtSession? { + return env.createSession(modalPath, OrtSession.SessionOptions()) + } + + private fun releaseAllSessions() { + sessionMap.forEach { (_, modelState) -> + modelState.sessionAddresses.forEach { entry -> + entry.value.close() + } + modelState.sessionAddresses.clear() + } + sessionMap.clear() + } +} diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart.dart b/mobile/plugins/onnx_dart/lib/onnx_dart.dart new file mode 100644 index 0000000000..5beaee034c --- /dev/null +++ b/mobile/plugins/onnx_dart/lib/onnx_dart.dart @@ -0,0 +1,27 @@ +import 'dart:typed_data'; + +import 'package:onnx_dart/onnx_dart_platform_interface.dart'; + +class OnnxDart { + Future getPlatformVersion() { + return OnnxDartPlatform.instance.getPlatformVersion(); + } + + Future init( + String modelType, + String modelPath, { + int sessionsCount = 1, + }) { + return OnnxDartPlatform.instance + .init(modelType, modelPath, sessionsCount: sessionsCount); + } + + Future predict( + Float32List inputData, + String modelType, { + int sessionAddress = 0, + }) async { + return OnnxDartPlatform.instance + .predict(inputData, modelType, sessionAddress: sessionAddress); + } +} diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart new file mode 100644 index 0000000000..4a9d301fd5 --- /dev/null +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart @@ -0,0 +1,73 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'onnx_dart_platform_interface.dart'; + +/// An implementation of [OnnxDartPlatform] that uses method channels. +class MethodChannelOnnxDart extends OnnxDartPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('onnx_dart'); + + @override + Future getPlatformVersion() async { + final version = + await methodChannel.invokeMethod('getPlatformVersion'); + return version; + } + + @override + Future init( + String modelType, + String modelPath, { + int sessionsCount = 1, + }) async { + final result = await methodChannel.invokeMethod('init', { + 'modelType': modelType, + 'modelPath': modelPath, + 'sessionsCount': sessionsCount, + }); + return result; + } + + @override + Future release(String modelType) async { + final bool? result = await methodChannel + .invokeMethod('release', {'modelType': modelType}); + return result; + } + + // @override + // Future?> predict( + // List inputData, + // String modelType, { + // int sessionAddress = 0, + // }) async { + // final List? result = + // await methodChannel.invokeMethod?>( + // 'predict', + // { + // 'sessionAddress': sessionAddress, + // 'inputData': inputData, + // 'modelType': modelType, + // }, + // ); + // return result!.cast(); + // } + + @override + Future predict( + Float32List inputData, + String modelType, { + int sessionAddress = 0, + }) { + return methodChannel.invokeMethod( + 'predict', + { + 'sessionAddress': sessionAddress, + 'inputData': inputData, + 'modelType': modelType, + }, + ); + } +} diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart new file mode 100644 index 0000000000..40f80fe523 --- /dev/null +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart @@ -0,0 +1,51 @@ +import 'dart:typed_data'; + +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'onnx_dart_method_channel.dart'; + +abstract class OnnxDartPlatform extends PlatformInterface { + /// Constructs a OnnxDartPlatform. + OnnxDartPlatform() : super(token: _token); + + static final Object _token = Object(); + + static OnnxDartPlatform _instance = MethodChannelOnnxDart(); + + /// The default instance of [OnnxDartPlatform] to use. + /// + /// Defaults to [MethodChannelOnnxDart]. + static OnnxDartPlatform get instance => _instance; + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [OnnxDartPlatform] when + /// they register themselves. + static set instance(OnnxDartPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + Future getPlatformVersion() { + throw UnimplementedError('platformVersion() has not been implemented.'); + } + + Future init( + String modelType, + String modelPath, { + int sessionsCount = 1, + }) { + throw UnimplementedError('init() has not been implemented.'); + } + + Future release(String modelType) { + throw UnimplementedError('release() has not been implemented.'); + } + + Future predict( + Float32List inputData, + String modelType, { + int sessionAddress = 0, + }) { + throw UnimplementedError('predict() has not been implemented.'); + } +} diff --git a/mobile/plugins/onnx_dart/pubspec.lock b/mobile/plugins/onnx_dart/pubspec.lock new file mode 100644 index 0000000000..c14d3ed876 --- /dev/null +++ b/mobile/plugins/onnx_dart/pubspec.lock @@ -0,0 +1,213 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + plugin_platform_interface: + dependency: "direct main" + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" +sdks: + dart: ">=3.4.3 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/mobile/plugins/onnx_dart/pubspec.yaml b/mobile/plugins/onnx_dart/pubspec.yaml new file mode 100644 index 0000000000..5c08c872a4 --- /dev/null +++ b/mobile/plugins/onnx_dart/pubspec.yaml @@ -0,0 +1,70 @@ +name: onnx_dart +description: "A new Flutter plugin project." +version: 0.0.1 +homepage: + +environment: + sdk: '>=3.4.3 <4.0.0' + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) + # which should be registered in the plugin registry. This is required for + # using method channels. + # The Android 'package' specifies package in which the registered class is. + # This is required for using method channels on Android. + # The 'ffiPlugin' specifies that native code should be built and bundled. + # This is required for using `dart:ffi`. + # All these are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: io.ente.photos.onnx_dart + pluginClass: OnnxDartPlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index bd536e27a7..db75a4328b 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1606,6 +1606,13 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + onnx_dart: + dependency: "direct main" + description: + path: "plugins/onnx_dart" + relative: true + source: path + version: "0.0.1" onnxruntime: dependency: "direct main" description: @@ -2775,5 +2782,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.4.0 <4.0.0" + dart: ">=3.4.3 <4.0.0" flutter: ">=3.22.0" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 58116972ce..2e9a71a4a2 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -128,6 +128,8 @@ dependencies: git: url: https://github.com/ente-io/onnxruntime.git ref: ente_onnxruntime + onnx_dart: + path: plugins/onnx_dart open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 From bc04a3f87f1c39d670ee8eaae5f07d06ba564dc1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:29:28 +0530 Subject: [PATCH 0066/1179] [mob][onnx] Specify return type --- .../face_detection_service.dart | 2 +- mobile/plugins/onnx_dart/lib/onnx_dart.dart | 2 +- .../lib/onnx_dart_method_channel.dart | 22 ++----------------- .../lib/onnx_dart_platform_interface.dart | 2 +- 4 files changed, 5 insertions(+), 23 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index dea6be2213..749a5b7a46 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -142,7 +142,7 @@ class FaceDetectionService extends MlModel { "YOLO_FACE", ); final List>> reconstructedTensor = []; - for (int i = 0; i < result.length; i += 25200 * 16) { + for (int i = 0; i < result!.length; i += 25200 * 16) { final List> outerArray = []; for (int j = 0; j < 25200; j++) { final List innerArray = diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart.dart b/mobile/plugins/onnx_dart/lib/onnx_dart.dart index 5beaee034c..4d089e3374 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart.dart @@ -16,7 +16,7 @@ class OnnxDart { .init(modelType, modelPath, sessionsCount: sessionsCount); } - Future predict( + Future predict( Float32List inputData, String modelType, { int sessionAddress = 0, diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart index 4a9d301fd5..bd92c1a5c1 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart @@ -37,31 +37,13 @@ class MethodChannelOnnxDart extends OnnxDartPlatform { return result; } - // @override - // Future?> predict( - // List inputData, - // String modelType, { - // int sessionAddress = 0, - // }) async { - // final List? result = - // await methodChannel.invokeMethod?>( - // 'predict', - // { - // 'sessionAddress': sessionAddress, - // 'inputData': inputData, - // 'modelType': modelType, - // }, - // ); - // return result!.cast(); - // } - @override - Future predict( + Future predict( Float32List inputData, String modelType, { int sessionAddress = 0, }) { - return methodChannel.invokeMethod( + return methodChannel.invokeMethod( 'predict', { 'sessionAddress': sessionAddress, diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart index 40f80fe523..1545915859 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart @@ -41,7 +41,7 @@ abstract class OnnxDartPlatform extends PlatformInterface { throw UnimplementedError('release() has not been implemented.'); } - Future predict( + Future predict( Float32List inputData, String modelType, { int sessionAddress = 0, From f422dea00e8d87e3604fca8da346d0037d50dfc9 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:31:03 +0530 Subject: [PATCH 0067/1179] [mob][onnx] Clean up --- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index 4091f7106c..49bdc90856 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -17,33 +17,6 @@ import java.nio.ByteBuffer import java.nio.ByteOrder import java.util.concurrent.ConcurrentLinkedQueue -object LongArrayPool { - private val poolMap = ConcurrentHashMap>() - - fun get(size: Int): LongArray { - val pool = getPool(size) - return pool.poll() ?: LongArray(size) - } - - fun release(array: LongArray) { - val pool = getPool(array.size) - pool.offer(array) - } - - private fun getPool(size: Int): ConcurrentLinkedQueue { - var pool = poolMap[size] - if (pool == null) { - synchronized(poolMap) { - pool = poolMap[size] - if (pool == null) { - pool = ConcurrentLinkedQueue() - poolMap[size] = pool!! - } - } - } - return pool!! - } -} /** OnnxDartPlugin */ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { /// The MethodChannel that will the communication between Flutter and native Android @@ -192,18 +165,12 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { try { val env = OrtEnvironment.getEnvironment() - val inputTensorShape = LongArrayPool.get(4).apply { - this[0] = 1 - this[1] = K_NUM_CHANNELS.toLong() - this[2] = K_INPUT_HEIGHT.toLong() - this[3] = K_INPUT_WIDTH.toLong() - } + val inputTensorShape = longArrayOf(1, K_NUM_CHANNELS.toLong(), K_INPUT_HEIGHT.toLong(), K_INPUT_WIDTH.toLong()) val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") - inputTensor.close() val totalSize = 1 * 25200 * 16 val flatArray = FloatArray(totalSize) { index -> index + 1.0f } @@ -218,7 +185,6 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { Log.d("OnnxFlutterPlugin", "Output2 shape: ${outputTensor.size}") outputs.close() - LongArrayPool.release(inputTensorShape) // Send the result back to the Dart layer val flatList = outputTensor.flatten().flatMap { it.toList() } val flatList2 = outputTensor2.flatten().flatMap { it.toList() } From 69923baedd24a74f8b69886d103935f03bec7241 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:15:41 +0530 Subject: [PATCH 0068/1179] [mob][droid] Clean up --- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index 49bdc90856..c1862c204f 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -3,6 +3,7 @@ package io.ente.photos.onnx_dart import android.content.Context import androidx.annotation.NonNull import ai.onnxruntime.* +import java.util.EnumMap import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel @@ -30,6 +31,9 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { private val sessionMap = ConcurrentHashMap() private lateinit var context: Context + enum class ModelType { + CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE + } companion object { const val DEFAULT_SESSION_COUNT = 1 const val K_INPUT_WIDTH = 640 @@ -37,9 +41,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { const val K_NUM_CHANNELS = 3 } - enum class ModelType { - CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE - } + data class ModelState( var isInitialized: Boolean = false, @@ -170,30 +172,15 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") - inputTensor.close() - val totalSize = 1 * 25200 * 16 - val flatArray = FloatArray(totalSize) { index -> index + 1.0f } - - val outputTensor2 = Array(1) { outerIndex -> - Array(25200) { innerIndex -> - val startIndex = (outerIndex * 25200 + innerIndex) * 16 - flatArray.sliceArray(startIndex until startIndex + 16) - } - } val outputTensor = outputs[0].value as Array> Log.d("OnnxFlutterPlugin", "Output2 shape: ${outputTensor.size}") - outputs.close() // Send the result back to the Dart layer val flatList = outputTensor.flatten().flatMap { it.toList() } - val flatList2 = outputTensor2.flatten().flatMap { it.toList() } - withContext(Dispatchers.Main) { result.success(flatList) -// result.success(flatList2) - } } catch (e: OrtException) { withContext(Dispatchers.Main) { From 9318182160a16bb9e78cd3031bade773c0ede3b3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:41:16 +0530 Subject: [PATCH 0069/1179] [mob][droid] Refactor --- .../face_detection_service.dart | 14 ++-- .../face_ml/face_recognition_service.dart | 1 + .../services/machine_learning/ml_model.dart | 80 ++++++++++++------- .../services/machine_learning/ml_service.dart | 6 +- .../semantic_search_service.dart | 2 +- 5 files changed, 64 insertions(+), 39 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 749a5b7a46..688f8e6439 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -17,6 +17,7 @@ class YOLOFaceInterpreterRunException implements Exception {} /// This class is responsible for running the face detection model (YOLOv5Face) on ONNX runtime, and can be accessed through the singleton instance [FaceDetectionService.instance]. class FaceDetectionService extends MlModel { static const kRemoteBucketModelPath = "yolov5s_face_640_640_dynamic.onnx"; + static const _modelName = "YOLOv5Face"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; @@ -26,7 +27,7 @@ class FaceDetectionService extends MlModel { static final _logger = Logger('FaceDetectionService'); @override - String get modelName => "YOLOv5Face"; + String get modelName => _modelName; static const int kInputWidth = 640; static const int kInputHeight = 640; @@ -43,12 +44,11 @@ class FaceDetectionService extends MlModel { static Future> predict( ui.Image image, ByteData imageByteData, - int sessionAddress, - ) async { + int sessionAddress, { + bool useEntePlugin = false, + }) async { assert( - !MlModel.useCustomPlugin - ? (sessionAddress != 0 && sessionAddress != -1) - : true, + !useEntePlugin ? (sessionAddress != 0 && sessionAddress != -1) : true, 'sessionAddress should be valid', ); @@ -77,7 +77,7 @@ class FaceDetectionService extends MlModel { List>>? nestedResults = []; try { - if (MlModel.useCustomPlugin) { + if (useEntePlugin) { nestedResults = await _runCustomPlugin(inputImageList); } else { nestedResults = _runJNIBasedPlugin( diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 532f655f98..281292b6ff 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -237,6 +237,7 @@ class FaceRecognitionService { image, imageByteData, interpreterAddress, + useEntePlugin: true, ); // Add detected faces to the faceResults diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index d4e299d4d9..ec2e729974 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -16,40 +16,64 @@ abstract class MlModel { String get modelName; + // isInitialized is used to check if the model is loaded by the ffi based + // plugin bool isInitialized = false; + + bool isNativePluginInitialized = false; int sessionAddress = 0; final computer = Computer.shared(); - static bool useCustomPlugin = Platform.isAndroid; - Future init() async { - if (!isInitialized) { - logger.info('init is called'); - final model = - await RemoteAssetsService.instance.getAsset(modelRemotePath); - final startTime = DateTime.now(); - try { - if (useCustomPlugin) { - final OnnxDart plugin = OnnxDart(); - final bool? initResult = await plugin.init(modelName, model.path); - isInitialized = initResult ?? false; - } else { - await ONNXEnv.instance.initONNX(modelName); - sessionAddress = await computer.compute( - _loadModel, - param: { - "modelPath": model.path, - }, - ); - isInitialized = true; - } - final endTime = DateTime.now(); - logger.info( - "model loaded, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } catch (e, s) { - logger.severe('model not loaded', e, s); + // Initializes the model. + // If `useEntePlugin` is set to true, the custom plugin is used for initialization. + // Note: The custom plugin requires a dedicated isolate for loading the model to ensure thread safety and performance isolation. + // In contrast, the current FFI-based plugin leverages the session memory address for session management, which does not require a dedicated isolate. + Future loadModel({bool useEntePlugin = false}) async { + final model = await RemoteAssetsService.instance.getAsset(modelRemotePath); + if (useEntePlugin) { + await _loadModelWithEntePlugin(modelName, model.path); + } else { + await _loadModelWithFFI(modelName, model.path); + } + } + + Future _loadModelWithEntePlugin( + String modelName, + String modelPath, + ) async { + if (!isNativePluginInitialized) { + logger.info('Initializing model with Ente Plugin'); + final OnnxDart plugin = OnnxDart(); + final bool? initResult = await plugin.init(modelName, modelPath); + isNativePluginInitialized = initResult ?? false; + if (isNativePluginInitialized) { + logger.info("Model initialized successfully with Ente Plugin."); + } else { + logger.severe("Failed to initialize model with Ente Plugin."); } + } else { + logger.info("Model already initialized with Ente Plugin."); + } + } + + Future _loadModelWithFFI(String modelName, String modelPath) async { + if (!isInitialized) { + logger.info('Initializing model with FFI'); + final startTime = DateTime.now(); + sessionAddress = await computer.compute( + _loadModel, + param: { + "modelPath": modelPath, + }, + ); + isInitialized = true; + final endTime = DateTime.now(); + logger.info( + "Model loaded with FFI, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", + ); + } else { + logger.info("Model already initialized with FFI."); } } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index da9658d6c1..b28354d96b 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -526,17 +526,17 @@ class MLService { // Initialize models try { - await FaceDetectionService.instance.init(); + await FaceDetectionService.instance.loadModel(); } catch (e, s) { _logger.severe("Could not initialize yolo onnx", e, s); } try { - await FaceEmbeddingService.instance.init(); + await FaceEmbeddingService.instance.loadModel(); } catch (e, s) { _logger.severe("Could not initialize mobilefacenet", e, s); } try { - await ClipImageEncoder.instance.init(); + await ClipImageEncoder.instance.loadModel(); } catch (e, s) { _logger.severe("Could not initialize clip image", e, s); } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index e7486a2071..cf1626bc0c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -261,7 +261,7 @@ class SemanticSearchService { Future _loadTextModel() async { _logger.info("Initializing ML framework"); try { - await ClipTextEncoder.instance.init(); + await ClipTextEncoder.instance.loadModel(); _textModelIsLoaded = true; } catch (e, s) { _logger.severe("Clip text loading failed", e, s); From 111972e0e6833bd623df900962cbb0a814f7f7a9 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:07:17 +0530 Subject: [PATCH 0070/1179] [mob][droid] Return FloatArray instead of List --- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index c1862c204f..c181fe82c2 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -26,13 +26,16 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { /// when the Flutter Engine is detached from the Activity private lateinit var channel : MethodChannel + private val TAG = OnnxDartPlugin::class.java.name + + private var faceOrtEnv: OrtEnvironment = OrtEnvironment.getEnvironment() private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private val sessionMap = ConcurrentHashMap() private lateinit var context: Context enum class ModelType { - CLIP_TEXT, CLIP_VISUAL, YOLO_FACE, MOBILENET_FACE + CLIP_TEXT, ClipImageEncoder, YOLOv5Face, MobileFaceNet } companion object { const val DEFAULT_SESSION_COUNT = 1 @@ -108,7 +111,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } private fun init(modelType: ModelType, modelPath: String, sessionsCount: Int, result: Result) { - Log.d("OnnxFlutterPlugin", " v: $modelType, path: $modelPath, sessionsCount: $sessionsCount") + Log.d(TAG, " v: $modelType, path: $modelPath, sessionsCount: $sessionsCount") scope.launch { val modelState: ModelState if (sessionMap.containsKey(modelType)) { @@ -171,17 +174,16 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) - Log.d("OnnxFlutterPlugin", "Output shape: ${outputs.size()}") - inputTensor.close() - val outputTensor = outputs[0].value as Array> - Log.d("OnnxFlutterPlugin", "Output2 shape: ${outputTensor.size}") - outputs.close() - // Send the result back to the Dart layer - val flatList = outputTensor.flatten().flatMap { it.toList() } + Log.d(TAG, "Output shape: ${outputs.size()}") + val outputTensor = outputs[0].value as Array> + val flatList = outputTensor.flatMapToFloatArray() withContext(Dispatchers.Main) { result.success(flatList) } + Log.d(TAG, "Closing output tensor and input tensor") + outputs.close() + inputTensor.close() } catch (e: OrtException) { withContext(Dispatchers.Main) { result.error("PREDICTION_ERROR", "Error during prediction: ${e.message}", null) @@ -203,4 +205,18 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } sessionMap.clear() } + + fun Array>.flatMapToFloatArray(): FloatArray { + val outputSize = this.sumOf { it.sumOf { it.size } } + val result = FloatArray(outputSize) + var index = 0 + for (outer in this) { + for (inner in outer) { + for (value in inner) { + result[index++] = value + } + } + } + return result + } } From 02ca6342d2a08b7fa755e83be42779091161b52a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:29:24 +0530 Subject: [PATCH 0071/1179] [mob][droid] Perform detection using ente plugin --- .../face_detection_service.dart | 10 +++--- .../services/machine_learning/ml_service.dart | 36 +++++++++++++++++-- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 2 -- mobile/plugins/onnx_dart/lib/onnx_dart.dart | 3 +- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 688f8e6439..f1dab0d935 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -78,9 +78,9 @@ class FaceDetectionService extends MlModel { List>>? nestedResults = []; try { if (useEntePlugin) { - nestedResults = await _runCustomPlugin(inputImageList); + nestedResults = await _runEntePlugin(inputImageList); } else { - nestedResults = _runJNIBasedPlugin( + nestedResults = _runFFIBasedPlugin( sessionAddress, inputImageList, ); // [1, 25200, 16] @@ -109,7 +109,7 @@ class FaceDetectionService extends MlModel { } } - static List>>? _runJNIBasedPlugin( + static List>>? _runFFIBasedPlugin( int sessionAddress, Float32List inputImageList, ) { @@ -133,13 +133,13 @@ class FaceDetectionService extends MlModel { return outputs?[0]?.value as List>>; // [1, 25200, 16] } - static Future>>> _runCustomPlugin( + static Future>>> _runEntePlugin( Float32List inputImageList, ) async { final OnnxDart plugin = OnnxDart(); final result = await plugin.predict( inputImageList, - "YOLO_FACE", + _modelName, ); final List>> reconstructedTensor = []; for (int i = 0; i < result!.length; i += 25200 * 16) { diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index b28354d96b..e9aab60a0a 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -40,7 +40,7 @@ import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; -enum FaceMlOperation { analyzeImage } +enum FaceMlOperation { analyzeImage, loadModels } /// This class is responsible for running the full face ml pipeline on images. /// @@ -69,6 +69,7 @@ class MLService { bool _isInitialized = false; bool _isModelsInitialized = false; + bool _isModelsInitUsingEntePlugin = false; bool _isIsolateSpawned = false; late String client; @@ -546,6 +547,30 @@ class MLService { }); } + Future _initModelUsingEntePlugin() async { + return _initModelLock.synchronized(() async { + if (_isModelsInitUsingEntePlugin) return; + _logger.info('initModelUsingEntePlugin called'); + + // Get client name + final packageInfo = await PackageInfo.fromPlatform(); + client = "${packageInfo.packageName}/${packageInfo.version}"; + _logger.info("client: $client"); + + // Initialize models + try { + await _runInIsolate( + (FaceMlOperation.loadModels, {}), + ); + _isModelsInitUsingEntePlugin = true; + } catch (e, s) { + _logger.severe("Could not initialize clip image", e, s); + } + _logger.info('initModelUsingEntePlugin done'); + _logStatus(); + }); + } + Future _releaseModels() async { return _initModelLock.synchronized(() async { _logger.info("dispose called"); @@ -596,8 +621,9 @@ class MLService { } Future _ensureReadyForInference() async { - await _initModels(); await _initIsolate(); + await _initModels(); + await _initModelUsingEntePlugin(); } /// The main execution function of the isolate. @@ -622,6 +648,12 @@ class MLService { ); sendPort.send(result.toJsonString()); break; + case FaceMlOperation.loadModels: + await FaceDetectionService.instance.loadModel(useEntePlugin: true); + await FaceEmbeddingService.instance.loadModel(useEntePlugin: true); + await ClipImageEncoder.instance.loadModel(useEntePlugin: true); + sendPort.send(true); + break; } } catch (e, stackTrace) { dev.log( diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index c181fe82c2..c93da66a1e 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -175,13 +175,11 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) Log.d(TAG, "Output shape: ${outputs.size()}") - val outputTensor = outputs[0].value as Array> val flatList = outputTensor.flatMapToFloatArray() withContext(Dispatchers.Main) { result.success(flatList) } - Log.d(TAG, "Closing output tensor and input tensor") outputs.close() inputTensor.close() } catch (e: OrtException) { diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart.dart b/mobile/plugins/onnx_dart/lib/onnx_dart.dart index 4d089e3374..f21ebae21a 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart.dart @@ -21,7 +21,8 @@ class OnnxDart { String modelType, { int sessionAddress = 0, }) async { - return OnnxDartPlatform.instance + final result = await OnnxDartPlatform.instance .predict(inputData, modelType, sessionAddress: sessionAddress); + return result; } } From 234efb63b23d652b8ac52d737fbfa16cec772f44 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 12:55:13 +0530 Subject: [PATCH 0072/1179] [mob] Refactor --- .../face_detection_service.dart | 26 +++++++++++-------- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 15 +++++++++-- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index f1dab0d935..46a748f27c 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -37,7 +37,9 @@ class FaceDetectionService extends MlModel { // Singleton pattern FaceDetectionService._privateConstructor(); + static final instance = FaceDetectionService._privateConstructor(); + factory FaceDetectionService() => instance; /// Detects faces in the given image data. @@ -141,17 +143,19 @@ class FaceDetectionService extends MlModel { inputImageList, _modelName, ); - final List>> reconstructedTensor = []; - for (int i = 0; i < result!.length; i += 25200 * 16) { - final List> outerArray = []; - for (int j = 0; j < 25200; j++) { - final List innerArray = - result.sublist(i + j * 16, i + (j + 1) * 16).cast(); - outerArray.add(innerArray); - } - reconstructedTensor.add(outerArray); - } - return reconstructedTensor; + + final int resultLength = result!.length; + assert(resultLength % 25200 * 16 == 0); + const int outerLength = 1; + const int middleLength = 25200; + const int innerLength = 16; + return List.generate( + outerLength, + (_) => List.generate( + middleLength, + (j) => result.sublist(j * innerLength, (j + 1) * innerLength).toList(), + ), + ); } static List _yoloPostProcessOutputs( diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index c93da66a1e..61d7246050 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -175,8 +175,8 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) Log.d(TAG, "Output shape: ${outputs.size()}") - val outputTensor = outputs[0].value as Array> - val flatList = outputTensor.flatMapToFloatArray() + val outputTensor = (outputs[0].value as Array>).get(0) + val flatList = outputTensor.flattenToFloatArray() withContext(Dispatchers.Main) { result.success(flatList) } @@ -217,4 +217,15 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } return result } + fun Array.flattenToFloatArray(): FloatArray { + val outputSize = this.sumOf { it.size } + val result = FloatArray(outputSize) + var index = 0 + for (inner in this) { + for (value in inner) { + result[index++] = value + } + } + return result + } } From 6b78ce715fceeef6c14e5e9fd3111eea3303b16c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:04:10 +0530 Subject: [PATCH 0073/1179] [mob][onnx] inline const --- .../main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index 61d7246050..d212b75ab3 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -39,9 +39,6 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } companion object { const val DEFAULT_SESSION_COUNT = 1 - const val K_INPUT_WIDTH = 640 - const val K_INPUT_HEIGHT = 640 - const val K_NUM_CHANNELS = 3 } @@ -170,7 +167,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { try { val env = OrtEnvironment.getEnvironment() - val inputTensorShape = longArrayOf(1, K_NUM_CHANNELS.toLong(), K_INPUT_HEIGHT.toLong(), K_INPUT_WIDTH.toLong()) + val inputTensorShape = longArrayOf(1, 3, 640, 640) val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) val inputs = mapOf("input" to inputTensor) val outputs = session.run(inputs) From 68e3a36e8e880f78d012aded3a844a90fad6f6d4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:05:13 +0530 Subject: [PATCH 0074/1179] [mob][onnx] remove unused code --- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index d212b75ab3..5ed553ed6d 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -76,7 +76,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) } - else if (call.method == "release" ) { + else if (call.method == "release" ) { val modelType = call.argument("modelType") ?: run { result.error("INVALID_ARGUMENT", "Model type is missing", null) return @@ -90,12 +90,10 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { return } val inputDataArray = call.argument("inputData") - if (sessionAddress == null || inputDataArray == null) { result.error("INVALID_ARGUMENT", "Session address or input data is missing", null) return } -// val inputDataArray = inputData.map { it.toFloat() }.toFloatArray() predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, result) } else { result.notImplemented() @@ -103,10 +101,6 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } - private fun readModelFile(modelPath: String): ByteArray { - return File(modelPath).readBytes() - } - private fun init(modelType: ModelType, modelPath: String, sessionsCount: Int, result: Result) { Log.d(TAG, " v: $modelType, path: $modelPath, sessionsCount: $sessionsCount") scope.launch { @@ -201,20 +195,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { sessionMap.clear() } - fun Array>.flatMapToFloatArray(): FloatArray { - val outputSize = this.sumOf { it.sumOf { it.size } } - val result = FloatArray(outputSize) - var index = 0 - for (outer in this) { - for (inner in outer) { - for (value in inner) { - result[index++] = value - } - } - } - return result - } - fun Array.flattenToFloatArray(): FloatArray { + private fun Array.flattenToFloatArray(): FloatArray { val outputSize = this.sumOf { it.size } val result = FloatArray(outputSize) var index = 0 From 1033f26a814070890cd5daa98f799b0a0f7418aa Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:24:23 +0530 Subject: [PATCH 0075/1179] [mob] Switch to custom plugin for face embedding --- .../face_embedding_service.dart | 94 ++++++++++++++----- .../face_ml/face_recognition_service.dart | 10 +- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 30 +++++- 3 files changed, 100 insertions(+), 34 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index 9dd1ec2b08..26e593f945 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -1,6 +1,7 @@ import 'dart:typed_data' show Float32List; import 'package:logging/logging.dart'; +import "package:onnx_dart/onnx_dart.dart"; import 'package:onnxruntime/onnxruntime.dart'; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/utils/ml_util.dart"; @@ -10,6 +11,7 @@ class MobileFaceNetInterpreterRunException implements Exception {} /// This class is responsible for running the face embedding model (MobileFaceNet) on ONNX runtime, and can be accessed through the singleton instance [FaceEmbeddingService.instance]. class FaceEmbeddingService extends MlModel { static const kRemoteBucketModelPath = "mobilefacenet_opset15.onnx"; + static const String _modelName = "MobileFaceNet"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; @@ -19,7 +21,7 @@ class FaceEmbeddingService extends MlModel { static final _logger = Logger('FaceEmbeddingService'); @override - String get modelName => "MobileFaceNet"; + String get modelName => _modelName; static const int kInputSize = 112; static const int kEmbeddingSize = 192; @@ -33,35 +35,75 @@ class FaceEmbeddingService extends MlModel { static Future>> predict( Float32List input, - int sessionAddress, - ) async { - assert(sessionAddress != 0 && sessionAddress != -1); + int sessionAddress, { + bool useEntePlugin = false, + }) async { + if (!useEntePlugin) { + assert(sessionAddress != 0 && sessionAddress != -1); + } try { - final stopwatch = Stopwatch()..start(); - _logger.info('MobileFaceNet interpreter.run is called'); - final runOptions = OrtRunOptions(); - final int numberOfFaces = input.length ~/ (kInputSize * kInputSize * 3); - final inputOrt = OrtValueTensor.createTensorWithDataList( - input, - [numberOfFaces, kInputSize, kInputSize, kNumChannels], - ); - final inputs = {'img_inputs': inputOrt}; - final session = OrtSession.fromAddress(sessionAddress); - final List outputs = session.run(runOptions, inputs); - final embeddings = outputs[0]?.value as List>; - - for (final embedding in embeddings) { - normalizeEmbedding(embedding); + if (useEntePlugin) { + return await _runEntePlugin(input); + } else { + return _runFFIBasedPredict(input, sessionAddress); } - stopwatch.stop(); - _logger.info( - 'MobileFaceNet interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', - ); - - return embeddings; } catch (e) { - _logger.info('MobileFaceNet Error while running inference: $e'); + _logger.info( + 'MobileFaceNet (entePlugin: $useEntePlugin)Error while running inference: $e'); throw MobileFaceNetInterpreterRunException(); } } + + static List> _runFFIBasedPredict( + Float32List input, + int sessionAddress, + ) { + final stopwatch = Stopwatch()..start(); + _logger.info('MobileFaceNet interpreter.run is called'); + final runOptions = OrtRunOptions(); + final int numberOfFaces = input.length ~/ (kInputSize * kInputSize * 3); + final inputOrt = OrtValueTensor.createTensorWithDataList( + input, + [numberOfFaces, kInputSize, kInputSize, kNumChannels], + ); + final inputs = {'img_inputs': inputOrt}; + final session = OrtSession.fromAddress(sessionAddress); + final List outputs = session.run(runOptions, inputs); + final embeddings = outputs[0]?.value as List>; + + for (final embedding in embeddings) { + normalizeEmbedding(embedding); + } + stopwatch.stop(); + _logger.info( + 'MobileFaceNetFFI interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', + ); + + return embeddings; + } + + static Future>> _runEntePlugin( + Float32List inputImageList, + ) async { + final stopwatch = Stopwatch()..start(); + final OnnxDart plugin = OnnxDart(); + final int numberOfFaces = + inputImageList.length ~/ (kInputSize * kInputSize * 3); + final result = await plugin.predict( + inputImageList, + _modelName, + ); + final List> embeddings = []; + for (int i = 0; i < numberOfFaces; i++) { + embeddings + .add(result!.sublist(i * kEmbeddingSize, (i + 1) * kEmbeddingSize)); + } + for (final embedding in embeddings) { + normalizeEmbedding(embedding); + } + _logger.info( + 'MobileFaceNetEntePlugin interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', + ); + return embeddings; + } } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 281292b6ff..b8bc29e1d5 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -1,5 +1,6 @@ import "dart:async" show unawaited; import "dart:developer" as dev show log; +import "dart:io"; import "dart:typed_data" show ByteData, Float32List; import "dart:ui" show Image; @@ -237,7 +238,7 @@ class FaceRecognitionService { image, imageByteData, interpreterAddress, - useEntePlugin: true, + useEntePlugin: Platform.isAndroid, ); // Add detected faces to the faceResults @@ -300,8 +301,11 @@ class FaceRecognitionService { ) async { try { // Get the embedding of the faces - final List> embeddings = - await FaceEmbeddingService.predict(facesList, interpreterAddress); + final List> embeddings = await FaceEmbeddingService.predict( + facesList, + interpreterAddress, + useEntePlugin: Platform.isAndroid, + ); // Store the results if (embeddings.length != faceResults.length) { diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index 5ed553ed6d..ad6419c8b3 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -39,6 +39,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } companion object { const val DEFAULT_SESSION_COUNT = 1 + const val FACENET_SINGLE_INPUT_SIZE = 112*112*3 } @@ -162,14 +163,33 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { try { val env = OrtEnvironment.getEnvironment() val inputTensorShape = longArrayOf(1, 3, 640, 640) + if (modelType == ModelType.MobileFaceNet) { + inputTensorShape[0] = inputData.size.toLong()/ FACENET_SINGLE_INPUT_SIZE + inputTensorShape[1] = 112 + inputTensorShape[2] = 112 + inputTensorShape[3] = 3 + } val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) - val inputs = mapOf("input" to inputTensor) + val inputs = mutableMapOf() + if (modelType == ModelType.MobileFaceNet) { + inputs["img_inputs"] = inputTensor + } else { + inputs["input"] = inputTensor + } val outputs = session.run(inputs) Log.d(TAG, "Output shape: ${outputs.size()}") - val outputTensor = (outputs[0].value as Array>).get(0) - val flatList = outputTensor.flattenToFloatArray() - withContext(Dispatchers.Main) { - result.success(flatList) + if (modelType == ModelType.MobileFaceNet) { + val outputTensor = (outputs[0].value as Array) + val flatList = outputTensor.flattenToFloatArray() + withContext(Dispatchers.Main) { + result.success(flatList) + } + } else { + val outputTensor = (outputs[0].value as Array>).get(0) + val flatList = outputTensor.flattenToFloatArray() + withContext(Dispatchers.Main) { + result.success(flatList) + } } outputs.close() inputTensor.close() From 756954ae45db5ef8df69778d2a75e0d411418803 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:24:53 +0530 Subject: [PATCH 0076/1179] [mob] Catch unexpected error in custom plugin --- .../main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index ad6419c8b3..2caa2c4236 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -197,6 +197,11 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { withContext(Dispatchers.Main) { result.error("PREDICTION_ERROR", "Error during prediction: ${e.message}", null) } + } catch (e: Exception) { + Log.e(TAG, "Error during prediction: ${e.message}", e) + withContext(Dispatchers.Main) { + result.error("UNHANDLED_ERROR", "Error during prediction: ${e.message}", null) + } } } } From c31f573f1ad4d6f5475ece88f5a0749103719006 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:32:01 +0530 Subject: [PATCH 0077/1179] [mob] Remove unused method --- .../semantic_search/semantic_search_service.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index cf1626bc0c..740f84f342 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -98,11 +98,6 @@ class SemanticSearchService { _cachedImageEmbeddings.isNotEmpty; } - bool bothClipModelsLoaded() { - return ClipImageEncoder.instance.isInitialized && - ClipTextEncoder.instance.isInitialized; - } - // searchScreenQuery should only be used for the user initiate query on the search screen. // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { From 74a37edaa44c54273491cff30988c8c09af1c2fe Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:10:27 +0530 Subject: [PATCH 0078/1179] [mob] Improve logs --- .../services/machine_learning/ml_model.dart | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index ec2e729974..2ee76b7e5c 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -43,23 +43,27 @@ abstract class MlModel { String modelPath, ) async { if (!isNativePluginInitialized) { - logger.info('Initializing model with Ente Plugin'); + final startTime = DateTime.now(); + logger.info('Initializing $modelName with EntePlugin'); final OnnxDart plugin = OnnxDart(); final bool? initResult = await plugin.init(modelName, modelPath); isNativePluginInitialized = initResult ?? false; if (isNativePluginInitialized) { - logger.info("Model initialized successfully with Ente Plugin."); + final endTime = DateTime.now(); + logger.info( + "$modelName loaded via EntePlugin ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", + ); } else { - logger.severe("Failed to initialize model with Ente Plugin."); + logger.severe("Failed to initialize $modelName with EntePlugin."); } } else { - logger.info("Model already initialized with Ente Plugin."); + logger.info("$modelName already initialized with Ente Plugin."); } } Future _loadModelWithFFI(String modelName, String modelPath) async { if (!isInitialized) { - logger.info('Initializing model with FFI'); + logger.info('Initializing $modelName with FFI'); final startTime = DateTime.now(); sessionAddress = await computer.compute( _loadModel, @@ -70,10 +74,10 @@ abstract class MlModel { isInitialized = true; final endTime = DateTime.now(); logger.info( - "Model loaded with FFI, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", + "$modelName loaded with FFI, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", ); } else { - logger.info("Model already initialized with FFI."); + logger.info("$modelName already initialized with FFI."); } } From 519d7a9a5e1fe08d278393fb3063949a15823d9a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:13:37 +0530 Subject: [PATCH 0079/1179] [mob] Print logs from MLIsolate --- mobile/lib/services/machine_learning/ml_service.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index e9aab60a0a..eca77c95ee 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -6,9 +6,10 @@ import "dart:math" show min; import "dart:typed_data" show Uint8List, ByteData; import "package:dart_ui_isolate/dart_ui_isolate.dart"; -import "package:flutter/foundation.dart" show debugPrint; +import "package:flutter/foundation.dart" show debugPrint, kDebugMode; import "package:logging/logging.dart"; import "package:package_info_plus/package_info_plus.dart"; +import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; import "package:photos/events/machine_learning_control_event.dart"; @@ -629,9 +630,12 @@ class MLService { /// The main execution function of the isolate. @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { + Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; + Logger.root.onRecord.listen((LogRecord rec) { + debugPrint('[MLIsolate] ${rec.toPrettyString()}'); + }); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); - receivePort.listen((message) async { final functionIndex = message[0] as int; final function = FaceMlOperation.values[functionIndex]; From 08f846c315eb1e0b2dd1b034f18488f6f151d86a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:22:04 +0530 Subject: [PATCH 0080/1179] [mob] Use custom plugin for clip image encoding --- .../services/machine_learning/ml_service.dart | 3 +- .../clip/clip_image_encoder.dart | 44 ++++++++++++++++--- .../semantic_search_service.dart | 13 ++++-- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 11 +++-- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index eca77c95ee..469fa289be 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -1,6 +1,6 @@ import "dart:async"; import "dart:developer" as dev show log; -import "dart:io" show File; +import "dart:io" show File, Platform; import "dart:isolate"; import "dart:math" show min; import "dart:typed_data" show Uint8List, ByteData; @@ -838,6 +838,7 @@ class MLService { image, imageByteData, clipImageAddress, + useEntePlugin: Platform.isAndroid, ); result.clip = clipResult; } diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index 3bacee5fd5..ba68ed1dc7 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -1,14 +1,17 @@ -import "dart:typed_data" show ByteData; +import "dart:typed_data"; import "dart:ui" show Image; import "package:logging/logging.dart"; +import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/extensions/stop_watch.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/ml_util.dart"; class ClipImageEncoder extends MlModel { static const kRemoteBucketModelPath = "clip-image-vit-32-float32.onnx"; + static const _modelName = "ClipImageEncoder"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; @@ -18,7 +21,7 @@ class ClipImageEncoder extends MlModel { static final _logger = Logger('ClipImageEncoder'); @override - String get modelName => "ClipImageEncoder"; + String get modelName => _modelName; // Singleton pattern ClipImageEncoder._privateConstructor(); @@ -28,10 +31,27 @@ class ClipImageEncoder extends MlModel { static Future> predict( Image image, ByteData imageByteData, - int sessionAddress, - ) async { + int sessionAddress, { + bool useEntePlugin = false, + }) async { + final w = EnteWatch("ClipImageEncoder.predict")..start(); final inputList = await preprocessImageClip(image, imageByteData); + w.log("preprocessImageClip"); + if (useEntePlugin) { + final result = await _runEntePlugin(inputList); + w.stopWithLog("done"); + return result; + } + final result = _runFFIBasedPredict(inputList, sessionAddress); + w.stopWithLog("done"); + return result; + } + static List _runFFIBasedPredict( + Float32List inputList, + int sessionAddress, + ) { + final w = EnteWatch("ClipImageEncoder._runFFIBasedPredict")..start(); final inputOrt = OrtValueTensor.createTensorWithDataList(inputList, [1, 3, 224, 224]); final inputs = {'input': inputOrt}; @@ -39,9 +59,23 @@ class ClipImageEncoder extends MlModel { final runOptions = OrtRunOptions(); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; - normalizeEmbedding(embedding); + w.stopWithLog("done"); + return embedding; + } + static Future> _runEntePlugin( + Float32List inputImageList, + ) async { + final w = EnteWatch("ClipImageEncoder._runEntePlugin")..start(); + final OnnxDart plugin = OnnxDart(); + final result = await plugin.predict( + inputImageList, + _modelName, + ); + final List embedding = result!.sublist(0, 512); + normalizeEmbedding(embedding); + w.stopWithLog("done"); return embedding; } } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 740f84f342..a03fe19a5a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -334,10 +334,15 @@ class SemanticSearchService { int enteFileID, Image image, ByteData imageByteData, - int clipImageAddress, - ) async { - final embedding = - await ClipImageEncoder.predict(image, imageByteData, clipImageAddress); + int clipImageAddress, { + bool useEntePlugin = false, + }) async { + final embedding = await ClipImageEncoder.predict( + image, + imageByteData, + clipImageAddress, + useEntePlugin: useEntePlugin, + ); final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); return clipResult; diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index 2caa2c4236..a2dfbae4fb 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -168,6 +168,11 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { inputTensorShape[1] = 112 inputTensorShape[2] = 112 inputTensorShape[3] = 3 + } else if(modelType == ModelType.ClipImageEncoder) { + inputTensorShape[0] = 1 + inputTensorShape[1] = 3 + inputTensorShape[2] = 224 + inputTensorShape[3] = 224 } val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) val inputs = mutableMapOf() @@ -178,14 +183,14 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } val outputs = session.run(inputs) Log.d(TAG, "Output shape: ${outputs.size()}") - if (modelType == ModelType.MobileFaceNet) { - val outputTensor = (outputs[0].value as Array) + if (modelType == ModelType.YOLOv5Face) { + val outputTensor = (outputs[0].value as Array>).get(0) val flatList = outputTensor.flattenToFloatArray() withContext(Dispatchers.Main) { result.success(flatList) } } else { - val outputTensor = (outputs[0].value as Array>).get(0) + val outputTensor = (outputs[0].value as Array) val flatList = outputTensor.flattenToFloatArray() withContext(Dispatchers.Main) { result.success(flatList) From 0bd04a0b8d1f8352680dd899fc9e8c761561e2f7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:26:43 +0530 Subject: [PATCH 0081/1179] [mob] Select load models --- mobile/lib/services/machine_learning/ml_service.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 469fa289be..1d54325cbf 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -516,7 +516,7 @@ class MLService { return actuallyRanML; } - Future _initModels() async { + Future _initModelsUsingFfiBasedPlugin() async { return _initModelLock.synchronized(() async { if (_isModelsInitialized) return; _logger.info('initModels called'); @@ -623,8 +623,11 @@ class MLService { Future _ensureReadyForInference() async { await _initIsolate(); - await _initModels(); - await _initModelUsingEntePlugin(); + if (Platform.isAndroid) { + await _initModelUsingEntePlugin(); + } else { + await _initModelsUsingFfiBasedPlugin(); + } } /// The main execution function of the isolate. From 2eea98a4df1fe46fc4b71a5cd458321ff06d2b9e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:15:50 +0530 Subject: [PATCH 0082/1179] [mob] Lint fixed --- .../face_ml/face_detection/face_detection_service.dart | 2 +- .../face_ml/face_embedding/face_embedding_service.dart | 2 +- mobile/lib/services/machine_learning/ml_model.dart | 2 +- mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart | 3 +-- .../plugins/onnx_dart/lib/onnx_dart_platform_interface.dart | 3 +-- mobile/plugins/onnx_dart/pubspec.yaml | 3 ++- mobile/pubspec.yaml | 4 ++-- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 46a748f27c..e13985e50a 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -1,6 +1,6 @@ import "dart:async"; import "dart:developer" as dev show log; -import 'dart:typed_data' show ByteBuffer, ByteData, Float32List, Uint8List; +import 'dart:typed_data' show ByteData, Float32List; import 'dart:ui' as ui show Image; import 'package:logging/logging.dart'; diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index 26e593f945..acbac0262c 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -49,7 +49,7 @@ class FaceEmbeddingService extends MlModel { } } catch (e) { _logger.info( - 'MobileFaceNet (entePlugin: $useEntePlugin)Error while running inference: $e'); + 'MobileFaceNet (entePlugin: $useEntePlugin)Error while running inference: $e',); throw MobileFaceNetInterpreterRunException(); } } diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 2ee76b7e5c..1127f57d27 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -1,4 +1,4 @@ -import "dart:io" show File, Platform; +import "dart:io" show File; import "package:computer/computer.dart"; import "package:logging/logging.dart"; diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart index bd92c1a5c1..669ceca1eb 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart @@ -1,7 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; - -import 'onnx_dart_platform_interface.dart'; +import 'package:onnx_dart/onnx_dart_platform_interface.dart'; /// An implementation of [OnnxDartPlatform] that uses method channels. class MethodChannelOnnxDart extends OnnxDartPlatform { diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart index 1545915859..626f5236a1 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart @@ -1,9 +1,8 @@ import 'dart:typed_data'; +import 'package:onnx_dart/onnx_dart_method_channel.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'onnx_dart_method_channel.dart'; - abstract class OnnxDartPlatform extends PlatformInterface { /// Constructs a OnnxDartPlatform. OnnxDartPlatform() : super(token: _token); diff --git a/mobile/plugins/onnx_dart/pubspec.yaml b/mobile/plugins/onnx_dart/pubspec.yaml index 5c08c872a4..63baff5a48 100644 --- a/mobile/plugins/onnx_dart/pubspec.yaml +++ b/mobile/plugins/onnx_dart/pubspec.yaml @@ -13,9 +13,10 @@ dependencies: plugin_platform_interface: ^2.0.2 dev_dependencies: + flutter_lints: ^3.0.0 flutter_test: sdk: flutter - flutter_lints: ^3.0.0 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 01397a6115..9eca74d11f 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -124,12 +124,12 @@ dependencies: motionphoto: git: "https://github.com/ente-io/motionphoto.git" move_to_background: ^1.0.2 + onnx_dart: + path: plugins/onnx_dart onnxruntime: git: url: https://github.com/ente-io/onnxruntime.git ref: ente_onnxruntime - onnx_dart: - path: plugins/onnx_dart open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 From 6f98a79cb07e8c40843ddf7c19bd27697e3b4d87 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:23:04 +0530 Subject: [PATCH 0083/1179] [mob] Clean up --- .../kotlin/io/ente/photos/MainActivity.kt | 1 - mobile/lib/l10n/intl_cs.arb | 4 --- mobile/lib/l10n/intl_de.arb | 4 +-- mobile/lib/l10n/intl_en.arb | 5 --- mobile/lib/l10n/intl_es.arb | 6 +--- mobile/lib/l10n/intl_fr.arb | 6 +--- mobile/lib/l10n/intl_it.arb | 6 +--- mobile/lib/l10n/intl_ko.arb | 6 +--- mobile/lib/l10n/intl_nl.arb | 4 +-- mobile/lib/l10n/intl_no.arb | 6 +--- mobile/lib/l10n/intl_pl.arb | 1 - mobile/lib/l10n/intl_pt.arb | 4 +-- mobile/lib/l10n/intl_ru.arb | 6 +--- mobile/lib/l10n/intl_zh.arb | 4 +-- mobile/plugins/onnx_dart/README.md | 15 --------- mobile/plugins/onnx_dart/pubspec.yaml | 33 +------------------ 16 files changed, 11 insertions(+), 100 deletions(-) delete mode 100644 mobile/plugins/onnx_dart/README.md diff --git a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt index 75edded083..8200954d3f 100644 --- a/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt +++ b/mobile/android/app/src/main/kotlin/io/ente/photos/MainActivity.kt @@ -7,6 +7,5 @@ import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity : FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) - } } diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 14d0c8c4f0..23550f6d12 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -28,8 +28,6 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -43,6 +41,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 1d3ab03721..2080fc5080 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1266,7 +1266,7 @@ "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "mlFunctions": "ML functions", -"useAsCover": "Als Titelbild festlegen", + "useAsCover": "Als Titelbild festlegen", "notPersonLabel": "Nicht {name}?", "@notPersonLabel": { "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", @@ -1290,6 +1290,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfigurieren Sie bitte den Gerätepasscode oder die Bildschirmsperre in Ihren Systemeinstellungen.", "tapToUnlock": "Zum Entsperren antippen", "tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche" - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 4526c3d420..5a8dce66f9 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1263,9 +1263,7 @@ } } }, - "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", @@ -1279,7 +1277,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index fa567a63fa..e5154733c6 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1254,8 +1254,7 @@ "reviewSuggestions": "Revisar sugerencias", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1268,7 +1267,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index a4e5894749..2069ad0a5e 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1171,8 +1171,7 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1185,7 +1184,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 46b118b97f..a78573bcab 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1133,8 +1133,7 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1147,7 +1146,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 92f64e2471..5c3ee67a53 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -28,8 +28,7 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -43,7 +42,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 5cb3013251..9af8c52156 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1257,7 +1257,7 @@ "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "mlFunctions": "ML functions", -"savingEdits": "Bewerken opslaan...", + "savingEdits": "Bewerken opslaan...", "autoPair": "Automatisch koppelen", "pairWithPin": "Koppelen met PIN", "faceRecognition": "Gezichtsherkenning", @@ -1295,6 +1295,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", "tapToUnlock": "Tik om te ontgrendelen", "tooManyIncorrectAttempts": "Te veel onjuiste pogingen" - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 1fb375af20..86c2cea9c6 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -42,8 +42,7 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -57,7 +56,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 6e815169b7..533db7e36e 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -142,5 +142,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index db1dee85ff..4eb1b8933a 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1266,7 +1266,7 @@ "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "mlFunctions": "ML functions", -"useAsCover": "Usar como capa", + "useAsCover": "Usar como capa", "notPersonLabel": "Não é {name}?", "@notPersonLabel": { "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", @@ -1290,6 +1290,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", "tapToUnlock": "Toque para desbloquear", "tooManyIncorrectAttempts": "Muitas tentativas incorretas" - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 3dba12488b..bc6e2196b7 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1253,8 +1253,7 @@ "whatsNew": "Что нового", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", -"reenterPassword": "Re-enter password", - + "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1267,7 +1266,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts" - - - } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 3ce9c62702..5bfd97ccec 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1266,7 +1266,7 @@ "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "mlFunctions": "ML functions", -"useAsCover": "用作封面", + "useAsCover": "用作封面", "notPersonLabel": "不是 {name}?", "@notPersonLabel": { "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", @@ -1290,6 +1290,4 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。", "tapToUnlock": "点击解锁", "tooManyIncorrectAttempts": "错误尝试次数过多" - - } \ No newline at end of file diff --git a/mobile/plugins/onnx_dart/README.md b/mobile/plugins/onnx_dart/README.md deleted file mode 100644 index c4b8097695..0000000000 --- a/mobile/plugins/onnx_dart/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# onnx_dart - -A new Flutter plugin project. - -## Getting Started - -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/developing-packages/), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. - -For help getting started with Flutter development, view the -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. - diff --git a/mobile/plugins/onnx_dart/pubspec.yaml b/mobile/plugins/onnx_dart/pubspec.yaml index 63baff5a48..fe7dd8c484 100644 --- a/mobile/plugins/onnx_dart/pubspec.yaml +++ b/mobile/plugins/onnx_dart/pubspec.yaml @@ -1,7 +1,7 @@ name: onnx_dart description: "A new Flutter plugin project." version: 0.0.1 -homepage: +homepage: http://ente.io environment: sdk: '>=3.4.3 <4.0.0' @@ -38,34 +38,3 @@ flutter: android: package: io.ente.photos.onnx_dart pluginClass: OnnxDartPlugin - - # To add assets to your plugin package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # To add custom fonts to your plugin package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages From 227877bd07e27930da8596200289dfa3f61d9c4f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:43:31 +0530 Subject: [PATCH 0084/1179] [mob] Add support for Clip text in custom plugin --- .../ente/photos/onnx_dart/OnnxDartPlugin.kt | 106 ++++++++++-------- mobile/plugins/onnx_dart/lib/onnx_dart.dart | 12 +- .../lib/onnx_dart_method_channel.dart | 4 +- .../lib/onnx_dart_platform_interface.dart | 5 +- 4 files changed, 80 insertions(+), 47 deletions(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index a2dfbae4fb..eaf32c21e1 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -1,6 +1,7 @@ package io.ente.photos.onnx_dart import android.content.Context +import java.nio.IntBuffer import androidx.annotation.NonNull import ai.onnxruntime.* import java.util.EnumMap @@ -35,7 +36,7 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { private lateinit var context: Context enum class ModelType { - CLIP_TEXT, ClipImageEncoder, YOLOv5Face, MobileFaceNet + ClipTextEncoder, ClipImageEncoder, YOLOv5Face, MobileFaceNet } companion object { const val DEFAULT_SESSION_COUNT = 1 @@ -63,41 +64,46 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { override fun onMethodCall(call: MethodCall, result: Result) { - if (call.method == "getPlatformVersion") { - result.success("Android ${android.os.Build.VERSION.RELEASE}") - } else if (call.method == "init") { - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return + when (call.method) { + "getPlatformVersion" -> { + result.success("Android ${android.os.Build.VERSION.RELEASE}") } - val modelPath = call.argument("modelPath") ?: run { - result.error("INVALID_ARGUMENT", "Model path is missing", null) - return + "init" -> { + val modelType = call.argument("modelType") + val modelPath = call.argument("modelPath") + val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT + + if (modelType == null || modelPath == null) { + result.error("INVALID_ARGUMENT", "Model type or path is missing", null) + return + } + + init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) } - val sessionsCount = call.argument("sessionsCount") ?: DEFAULT_SESSION_COUNT - init(ModelType.valueOf(modelType), modelPath, sessionsCount, result) - } - else if (call.method == "release" ) { - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return + "release" -> { + val modelType = call.argument("modelType") + if (modelType == null) { + result.error("INVALID_ARGUMENT", "Model type is missing", null) + return + } + release(ModelType.valueOf(modelType), result) } - release(ModelType.valueOf(modelType), result) - } - else if (call.method == "predict" ) { - val sessionAddress = call.argument("sessionAddress") - val modelType = call.argument("modelType") ?: run { - result.error("INVALID_ARGUMENT", "Model type is missing", null) - return + "predict" -> { + val sessionAddress = call.argument("sessionAddress") + val modelType = call.argument("modelType") + val inputDataArray = call.argument("inputData") + val inputIntDataArray = call.argument("inputDataInt") + + if (sessionAddress == null || modelType == null || (inputDataArray == null && inputIntDataArray == null)) { + result.error("INVALID_ARGUMENT", "Session address, model type, or input data is missing", null) + return + } + + predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, inputIntDataArray, result) } - val inputDataArray = call.argument("inputData") - if (sessionAddress == null || inputDataArray == null) { - result.error("INVALID_ARGUMENT", "Session address or input data is missing", null) - return + else -> { + result.notImplemented() } - predict(ModelType.valueOf(modelType), sessionAddress, inputDataArray, result) - } else { - result.notImplemented() } } @@ -149,7 +155,10 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { } } - private fun predict(modelType: ModelType, sessionAddress: Int, inputData: FloatArray, result: Result) { + private fun predict(modelType: ModelType, sessionAddress: Int, inputDataFloat: FloatArray? = null, inputDataInt: IntArray? = null, result: Result) { + // Assert that exactly one of inputDataFloat or inputDataInt is provided + assert((inputDataFloat != null).xor(inputDataInt != null)) { "Exactly one of inputDataFloat or inputDataInt must be provided" } + scope.launch { val modelState = sessionMap[modelType] val session = modelState?.sessionAddresses?.get(sessionAddress) @@ -162,19 +171,28 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { try { val env = OrtEnvironment.getEnvironment() - val inputTensorShape = longArrayOf(1, 3, 640, 640) - if (modelType == ModelType.MobileFaceNet) { - inputTensorShape[0] = inputData.size.toLong()/ FACENET_SINGLE_INPUT_SIZE - inputTensorShape[1] = 112 - inputTensorShape[2] = 112 - inputTensorShape[3] = 3 - } else if(modelType == ModelType.ClipImageEncoder) { - inputTensorShape[0] = 1 - inputTensorShape[1] = 3 - inputTensorShape[2] = 224 - inputTensorShape[3] = 224 + var inputTensorShape = longArrayOf(1, 3, 640, 640) + when (modelType) { + ModelType.MobileFaceNet -> { + val totalSize = inputDataFloat!!.size.toLong() / FACENET_SINGLE_INPUT_SIZE + inputTensorShape = longArrayOf(totalSize, 112, 112, 3) + } + ModelType.ClipImageEncoder -> { + inputTensorShape = longArrayOf(1, 3, 224, 224) + } + ModelType.ClipTextEncoder -> { + inputTensorShape = longArrayOf(1, 77) + } + ModelType.YOLOv5Face -> { + inputTensorShape = longArrayOf(1, 3, 640, 640) + } + } + + val inputTensor = when { + inputDataFloat != null -> OnnxTensor.createTensor(env, FloatBuffer.wrap(inputDataFloat), inputTensorShape) + inputDataInt != null -> OnnxTensor.createTensor(env, IntBuffer.wrap(inputDataInt), inputTensorShape) + else -> throw IllegalArgumentException("No input data provided") } - val inputTensor = OnnxTensor.createTensor(env, FloatBuffer.wrap(inputData), inputTensorShape) val inputs = mutableMapOf() if (modelType == ModelType.MobileFaceNet) { inputs["img_inputs"] = inputTensor diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart.dart b/mobile/plugins/onnx_dart/lib/onnx_dart.dart index f21ebae21a..e04462958b 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart.dart @@ -22,7 +22,17 @@ class OnnxDart { int sessionAddress = 0, }) async { final result = await OnnxDartPlatform.instance - .predict(inputData, modelType, sessionAddress: sessionAddress); + .predict(inputData, null, modelType, sessionAddress: sessionAddress); + return result; + } + + Future predictInt( + Int32List inputDataInt, + String modelType, { + int sessionAddress = 0, + }) async { + final result = await OnnxDartPlatform.instance + .predict(null, inputDataInt, modelType, sessionAddress: sessionAddress); return result; } } diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart index 669ceca1eb..8d638eb1f9 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_method_channel.dart @@ -38,7 +38,8 @@ class MethodChannelOnnxDart extends OnnxDartPlatform { @override Future predict( - Float32List inputData, + Float32List? inputData, + Int32List? inputDataInt, String modelType, { int sessionAddress = 0, }) { @@ -47,6 +48,7 @@ class MethodChannelOnnxDart extends OnnxDartPlatform { { 'sessionAddress': sessionAddress, 'inputData': inputData, + 'inputDataInt': inputDataInt, 'modelType': modelType, }, ); diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart index 626f5236a1..25ada82f8d 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart_platform_interface.dart @@ -41,10 +41,13 @@ abstract class OnnxDartPlatform extends PlatformInterface { } Future predict( - Float32List inputData, + Float32List? inputData, + Int32List? inputDataInt, String modelType, { int sessionAddress = 0, }) { throw UnimplementedError('predict() has not been implemented.'); } + + } From 10b939e728e29969f9397c0006e43094813eea25 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:50:24 +0530 Subject: [PATCH 0085/1179] [mob] Text embedding changes --- .../services/machine_learning/ml_service.dart | 1 + .../clip/clip_text_encoder.dart | 34 ++++++++++++++++--- .../semantic_search_service.dart | 29 ++++++++++------ 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 1d54325cbf..fb2d9c1251 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -623,6 +623,7 @@ class MLService { Future _ensureReadyForInference() async { await _initIsolate(); + await _initModelsUsingFfiBasedPlugin(); if (Platform.isAndroid) { await _initModelUsingEntePlugin(); } else { diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 2840aa52c3..58a042c534 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -2,13 +2,18 @@ import "dart:math"; import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; +import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; +import "package:photos/extensions/stop_watch.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart'; +import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { static const kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; + // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; + static const _modelName = "ClipTextEncoder"; @override String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; @@ -18,7 +23,7 @@ class ClipTextEncoder extends MlModel { static final _logger = Logger('ClipTextEncoder'); @override - String get modelName => "ClipTextEncoder"; + String get modelName => _modelName; // Singleton pattern ClipTextEncoder._privateConstructor(); @@ -28,9 +33,17 @@ class ClipTextEncoder extends MlModel { static Future> infer(Map args) async { final text = args["text"]; final address = args["address"] as int; - final runOptions = OrtRunOptions(); final List tokenize = await ClipTextTokenizer.instance.tokenize(text); - final data = List.filled(1, Int32List.fromList(tokenize)); + final int32list = Int32List.fromList(tokenize); + return _runFFIBasedPredict(int32list, address); + } + + static List _runFFIBasedPredict( + Int32List int32list, + int address, + ) { + final runOptions = OrtRunOptions(); + final data = List.filled(1, int32list); final inputOrt = OrtValueTensor.createTensorWithDataList(data, [1, 77]); final inputs = {'input': inputOrt}; final session = OrtSession.fromAddress(address); @@ -40,12 +53,23 @@ class ClipTextEncoder extends MlModel { for (int i = 0; i < 512; i++) { textNormalization += embedding[i] * embedding[i]; } - final double sqrtTextNormalization = sqrt(textNormalization); for (int i = 0; i < 512; i++) { embedding[i] = embedding[i] / sqrtTextNormalization; } + return embedding; + } - return (embedding); + static Future> _runEntePlugin(Int32List int32list) async { + final w = EnteWatch("ClipTextEncoder._runEntePlugin")..start(); + final OnnxDart plugin = OnnxDart(); + final result = await plugin.predictInt( + int32list, + _modelName, + ); + final List embedding = result!.sublist(0, 512); + normalizeEmbedding(embedding); + w.stopWithLog("done"); + return embedding; } } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index a03fe19a5a..5d6475bb55 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -69,9 +69,13 @@ class SemanticSearchService { // ignore: unawaited_futures _loadTextModel().then((_) async { - _logger.info("Getting text embedding"); - await _getTextEmbedding("warm up text encoder"); - _logger.info("Got text embedding"); + try { + _logger.info("Getting text embedding"); + await _getTextEmbedding("warm up text encoder"); + _logger.info("Got text embedding"); + } catch (e) { + _logger.severe("Failed to get text embedding", e); + } }); } @@ -257,6 +261,7 @@ class SemanticSearchService { _logger.info("Initializing ML framework"); try { await ClipTextEncoder.instance.loadModel(); + await ClipTextEncoder.instance.loadModel(useEntePlugin: true); _textModelIsLoaded = true; } catch (e, s) { _logger.severe("Clip text loading failed", e, s); @@ -291,13 +296,16 @@ class SemanticSearchService { } try { final int clipAddress = ClipTextEncoder.instance.sessionAddress; - final textEmbedding = await _computer.compute( - ClipTextEncoder.infer, - param: { - "text": query, - "address": clipAddress, - }, - ) as List; + // final textEmbedding = await _computer.compute( + // ClipTextEncoder.infer, + // param: { + // "text": query, + // "address": clipAddress, + // }, + // ) as List; + final textEmbedding = await ClipTextEncoder.infer( + {"text": query, "address": clipAddress}, + ); _queryCache.put(query, textEmbedding); return textEmbedding; } catch (e) { @@ -343,6 +351,7 @@ class SemanticSearchService { clipImageAddress, useEntePlugin: useEntePlugin, ); + final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); return clipResult; From 5bc2fd1e1e4dfcbf18cd907ebbaa9aed7893c671 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 18 Jul 2024 15:35:40 +0200 Subject: [PATCH 0086/1179] [mob][photos] Remove ggml plugin --- .gitmodules | 3 --- mobile/plugins/clip_ggml | 1 - 2 files changed, 4 deletions(-) delete mode 160000 mobile/plugins/clip_ggml diff --git a/.gitmodules b/.gitmodules index cfea8359b6..956aedf684 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,9 +9,6 @@ [submodule "auth/assets/simple-icons"] path = auth/assets/simple-icons url = https://github.com/simple-icons/simple-icons.git -[submodule "mobile/plugins/clip_ggml"] - path = mobile/plugins/clip_ggml - url = https://github.com/ente-io/clip-ggml.git [submodule "web/apps/photos/thirdparty/ffmpeg-wasm"] path = web/apps/photos/thirdparty/ffmpeg-wasm url = https://github.com/abhinavkgrd/ffmpeg.wasm.git diff --git a/mobile/plugins/clip_ggml b/mobile/plugins/clip_ggml deleted file mode 160000 index 16c7daea5d..0000000000 --- a/mobile/plugins/clip_ggml +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 16c7daea5d6b80235ac473f1a823b0ff44f5305e From f20a33749578dcbd6e4cc56175b533591c81860f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 14:37:34 +0530 Subject: [PATCH 0087/1179] Remove clip-ggml dependency --- mobile/pubspec.lock | 7 ------- mobile/pubspec.yaml | 2 -- 2 files changed, 9 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index f0747aeab9..0727058023 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -251,13 +251,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.1" - clip_ggml: - dependency: "direct main" - description: - path: "plugins/clip_ggml" - relative: true - source: path - version: "0.0.1" clock: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 6c6ccb2e84..69d51541b6 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -31,8 +31,6 @@ dependencies: git: url: https://github.com/ente-io/chewie.git ref: forked_video_player_plus - clip_ggml: - path: plugins/clip_ggml collection: # dart computer: git: "https://github.com/ente-io/computer.git" From 56b019aa1e768bc8ccae81486b5a8e277ac75248 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:28:46 +0530 Subject: [PATCH 0088/1179] [mob] Fix text embedding --- .../semantic_search_service.dart | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 5d6475bb55..3768e034f5 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -1,5 +1,6 @@ import "dart:async"; import "dart:developer" as dev show log; +import "dart:io"; import "dart:math" show min; import "dart:typed_data" show ByteData; import "dart:ui" show Image; @@ -260,8 +261,8 @@ class SemanticSearchService { Future _loadTextModel() async { _logger.info("Initializing ML framework"); try { - await ClipTextEncoder.instance.loadModel(); - await ClipTextEncoder.instance.loadModel(useEntePlugin: true); + await ClipTextEncoder.instance + .loadModel(useEntePlugin: Platform.isAndroid); _textModelIsLoaded = true; } catch (e, s) { _logger.severe("Clip text loading failed", e, s); @@ -296,16 +297,21 @@ class SemanticSearchService { } try { final int clipAddress = ClipTextEncoder.instance.sessionAddress; - // final textEmbedding = await _computer.compute( - // ClipTextEncoder.infer, - // param: { - // "text": query, - // "address": clipAddress, - // }, - // ) as List; - final textEmbedding = await ClipTextEncoder.infer( - {"text": query, "address": clipAddress}, - ); + late final List textEmbedding; + if (Platform.isAndroid) { + textEmbedding = await ClipTextEncoder.infer( + {"text": query, "address": clipAddress}, + ); + } else { + textEmbedding = await _computer.compute( + ClipTextEncoder.infer, + param: { + "text": query, + "address": clipAddress, + }, + ) as List; + } + _queryCache.put(query, textEmbedding); return textEmbedding; } catch (e) { From 0a3c61515f0f81071341b26dc90af64d10951edb Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:01:48 +0530 Subject: [PATCH 0089/1179] [mob] Always allow running ML on iOS Sim --- mobile/lib/services/machine_learning/ml_service.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index fb2d9c1251..8f3bf3f1b5 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -855,6 +855,9 @@ class MLService { } bool _cannotRunMLFunction({String function = ""}) { + if (kDebugMode && Platform.isIOS) { + return false; + } if (_isIndexingOrClusteringRunning) { _logger.info( "Cannot run $function because indexing or clustering is already running", From 1e15825617e8d2f6e2b2d4660994d19fccf92b0f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:02:19 +0530 Subject: [PATCH 0090/1179] [mob] Rename method --- .../face_ml/face_recognition_service.dart | 2 +- .../file_ml/remote_fileml_service.dart | 112 +++++++++--------- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index b8bc29e1d5..17546d58cc 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -101,7 +101,7 @@ class FaceRecognitionService { .toSet(); _logger.info('starting remote fetch for ${fileIds.length} files'); final res = - await RemoteFileMLService.instance.getFilessEmbedding(fileIds); + await RemoteFileMLService.instance.getFaceEmbedding(fileIds); _logger.info('fetched ${res.mlData.length} embeddings'); fetchedCount += res.mlData.length; final List faces = []; diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 4bff78a35b..edfd6293e1 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -56,7 +56,7 @@ class RemoteFileMLService { } } - Future getFilessEmbedding( + Future getFaceEmbedding( Set fileIds, ) async { try { @@ -119,68 +119,66 @@ class RemoteFileMLService { }, ); } - } Future> _decryptFileMLComputer( - Map args, - ) async { - final result = {}; - final inputs = args["inputs"] as List; - for (final input in inputs) { - final decryptArgs = {}; - decryptArgs["source"] = - CryptoUtil.base642bin(input.embedding.encryptedEmbedding); - decryptArgs["key"] = input.decryptionKey; - decryptArgs["header"] = - CryptoUtil.base642bin(input.embedding.decryptionHeader); - final embeddingData = chachaDecryptData(decryptArgs); - final decodedJson = jsonDecode(utf8.decode(embeddingData)); - final FileMl decodedEmbedding = - FileMl.fromJson(decodedJson as Map); - result[input.embedding.fileID] = decodedEmbedding; - } - return result; + Map args, +) async { + final result = {}; + final inputs = args["inputs"] as List; + for (final input in inputs) { + final decryptArgs = {}; + decryptArgs["source"] = + CryptoUtil.base642bin(input.embedding.encryptedEmbedding); + decryptArgs["key"] = input.decryptionKey; + decryptArgs["header"] = + CryptoUtil.base642bin(input.embedding.decryptionHeader); + final embeddingData = chachaDecryptData(decryptArgs); + final decodedJson = jsonDecode(utf8.decode(embeddingData)); + final FileMl decodedEmbedding = + FileMl.fromJson(decodedJson as Map); + result[input.embedding.fileID] = decodedEmbedding; } + return result; +} bool shouldDiscardRemoteEmbedding(FileMl fileMl) { - if (fileMl.faceEmbedding.version < faceMlVersion) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); - return true; - } - // are all landmarks equal? - bool allLandmarksEqual = true; - if (fileMl.faceEmbedding.faces.isEmpty) { - debugPrint("No face for ${fileMl.fileID}"); + if (fileMl.faceEmbedding.version < faceMlVersion) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); + return true; + } + // are all landmarks equal? + bool allLandmarksEqual = true; + if (fileMl.faceEmbedding.faces.isEmpty) { + debugPrint("No face for ${fileMl.fileID}"); + allLandmarksEqual = false; + } + for (final face in fileMl.faceEmbedding.faces) { + if (face.detection.landmarks.isEmpty) { allLandmarksEqual = false; + break; } - for (final face in fileMl.faceEmbedding.faces) { - if (face.detection.landmarks.isEmpty) { - allLandmarksEqual = false; - break; - } - if (face.detection.landmarks - .any((landmark) => landmark.x != landmark.y)) { - allLandmarksEqual = false; - break; - } + if (face.detection.landmarks.any((landmark) => landmark.x != landmark.y)) { + allLandmarksEqual = false; + break; } - if (allLandmarksEqual) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because landmarks are equal"); - debugPrint( - fileMl.faceEmbedding.faces - .map((e) => e.detection.landmarks.toString()) - .toList() - .toString(), - ); - return true; - } - if (fileMl.width == null || fileMl.height == null) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because width is null"); - return true; - } - return false; - } \ No newline at end of file + } + if (allLandmarksEqual) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because landmarks are equal"); + debugPrint( + fileMl.faceEmbedding.faces + .map((e) => e.detection.landmarks.toString()) + .toList() + .toString(), + ); + return true; + } + if (fileMl.width == null || fileMl.height == null) { + debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + "because width is null"); + return true; + } + return false; +} From 506bc852ff4cf4f7cfc67c8f744f307e0cbefcc2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:24:45 +0530 Subject: [PATCH 0091/1179] [mob] Add try catch around runML --- .../services/machine_learning/ml_service.dart | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 8f3bf3f1b5..875d54a650 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -137,23 +137,28 @@ class MLService { } Future runAllML({bool force = false}) async { - if (force) { - _mlControllerStatus = true; - } - if (_cannotRunMLFunction() && !force) return; + try { + if (force) { + _mlControllerStatus = true; + } + if (_cannotRunMLFunction() && !force) return; - await sync(); + await sync(); - final int unclusteredFacesCount = - await FaceMLDataDB.instance.getUnclusteredFaceCount(); - if (unclusteredFacesCount > _kForceClusteringFaceCount) { - _logger.info( - "There are $unclusteredFacesCount unclustered faces, doing clustering first", - ); + final int unclusteredFacesCount = + await FaceMLDataDB.instance.getUnclusteredFaceCount(); + if (unclusteredFacesCount > _kForceClusteringFaceCount) { + _logger.info( + "There are $unclusteredFacesCount unclustered faces, doing clustering first", + ); + await clusterAllImages(); + } + await indexAllImages(); await clusterAllImages(); + } catch (e, s) { + _logger.severe("runAllML failed", e, s); + rethrow; } - await indexAllImages(); - await clusterAllImages(); } void pauseIndexingAndClustering() { From 6d06c02148c7d911e4e7df2bf79515f13b28d480 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:27:28 +0530 Subject: [PATCH 0092/1179] [mob] Fix bug --- mobile/lib/utils/ml_util.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 9f06bdaedc..c901e8dba3 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -75,12 +75,14 @@ Future> getFilesForMlIndexing() async { final List filesWithoutLocalID = []; final List hiddenFilesToIndex = []; for (final EnteFile enteFile in enteFiles) { - final skip = _skipAnalysisEnteFile(enteFile); + if (_skipAnalysisEnteFile(enteFile)) { + continue; + } final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs, clipMlVersion); - if (skip && !shouldRunFaces && !shouldRunClip) { + if (!shouldRunFaces && !shouldRunClip) { continue; } final instruction = FileMLInstruction( From 39b8223979028a4c3e994c143d9554b89a88e7a6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 20 Jul 2024 00:04:44 +0530 Subject: [PATCH 0093/1179] [mob] Store face embeddings from remote --- .../face_ml/face_recognition_service.dart | 8 +- .../machine_learning/file_ml/file_ml.dart | 91 ++++++++++++------- .../file_ml/files_ml_data_response.dart | 2 +- .../file_ml/remote_fileml_service.dart | 44 +++++---- .../services/machine_learning/ml_service.dart | 21 +++-- 5 files changed, 102 insertions(+), 64 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 17546d58cc..e75546b803 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -101,12 +101,12 @@ class FaceRecognitionService { .toSet(); _logger.info('starting remote fetch for ${fileIds.length} files'); final res = - await RemoteFileMLService.instance.getFaceEmbedding(fileIds); + await RemoteFileMLService.instance.getFileEmbeddings(fileIds); _logger.info('fetched ${res.mlData.length} embeddings'); fetchedCount += res.mlData.length; final List faces = []; final remoteFileIdToVersion = {}; - for (FileMl fileMl in res.mlData.values) { + for (RemoteFileML fileMl in res.mlData.values) { if (shouldDiscardRemoteEmbedding(fileMl)) continue; if (fileMl.faceEmbedding.faces.isEmpty) { faces.add( @@ -117,8 +117,8 @@ class FaceRecognitionService { } else { for (final f in fileMl.faceEmbedding.faces) { f.fileInfo = FileInfo( - imageHeight: fileMl.height, - imageWidth: fileMl.width, + imageHeight: fileMl.faceEmbedding.height, + imageWidth: fileMl.faceEmbedding.width, ); faces.add(f); } diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/machine_learning/file_ml/file_ml.dart index 4ac1370834..51b2ceec6a 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/machine_learning/file_ml/file_ml.dart @@ -1,46 +1,54 @@ import "package:photos/face/model/face.dart"; -class FileMl { +class RemoteFileML { final int fileID; - final int? height; - final int? width; - final FaceEmbeddings faceEmbedding; + final Map remoteRawData; + final RemoteFaceEmbedding faceEmbedding; + final RemoteClipEmbedding? clipEmbedding; - FileMl( + RemoteFileML( this.fileID, - this.faceEmbedding, { - this.height, - this.width, + this.remoteRawData, { + required this.faceEmbedding, + this.clipEmbedding, }); // toJson - Map toJson() => { - 'fileID': fileID, - 'height': height, - 'width': width, - 'faceEmbedding': faceEmbedding.toJson(), - }; - // fromJson - factory FileMl.fromJson(Map json) { - return FileMl( - json['fileID'] as int, - FaceEmbeddings.fromJson(json['faceEmbedding'] as Map), - height: json['height'] as int?, - width: json['width'] as int?, + Map toJson() { + throw UnimplementedError(); + } + + // fromRemote + factory RemoteFileML.fromRemote(int fileID, Map json) { + return RemoteFileML( + fileID, + json, + faceEmbedding: RemoteFaceEmbedding.fromJson( + json['face'] as Map, + ), + clipEmbedding: json['clip'] == null + ? null + : RemoteClipEmbedding.fromJson( + json['clip'] as Map, + ), ); } } -class FaceEmbeddings { +class RemoteFaceEmbedding { final List faces; final int version; - // pkgname/version + // packageName/version final String client; + final int height; + final int width; - FaceEmbeddings( + RemoteFaceEmbedding( this.faces, this.version, { required this.client, + required this.height, + required this.width, }); // toJson @@ -48,33 +56,48 @@ class FaceEmbeddings { 'faces': faces.map((x) => x.toJson()).toList(), 'version': version, 'client': client, + 'height': height, + 'width': width, }; + // fromJson - factory FaceEmbeddings.fromJson(Map json) { - return FaceEmbeddings( + factory RemoteFaceEmbedding.fromJson(Map json) { + return RemoteFaceEmbedding( List.from( json['faces'].map((x) => Face.fromJson(x as Map)), ), json['version'] as int, - client: json['client'] ?? 'unknown', + client: json['client'] as String, + height: json['height'] as int, + width: json['width'] as int, ); } } -class ClipEmbedding { - final int? version; +class RemoteClipEmbedding { + final int version; + final String client; final List embedding; - ClipEmbedding(this.embedding, {this.version}); + + RemoteClipEmbedding( + this.embedding, { + required this.version, + required this.client, + }); + // toJson Map toJson() => { - 'version': version, 'embedding': embedding, + 'version': version, + 'client': client, }; + // fromJson - factory ClipEmbedding.fromJson(Map json) { - return ClipEmbedding( + factory RemoteClipEmbedding.fromJson(Map json) { + return RemoteClipEmbedding( List.from(json['embedding'] as List), - version: json['version'] as int?, + version: json['version'] as int, + client: json['client'] as String, ); } } diff --git a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart index 475f52d0a3..67b69dcf5c 100644 --- a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart +++ b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart @@ -1,7 +1,7 @@ import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; class FilesMLDataResponse { - final Map mlData; + final Map mlData; // fileIDs that were indexed but they don't contain any meaningful embeddings // and hence should be discarded for re-indexing final Set noEmbeddingFileIDs; diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index edfd6293e1..51b52fbaf0 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -1,8 +1,9 @@ import "dart:async"; import "dart:convert"; +import "dart:io"; import "package:computer/computer.dart"; -import "package:flutter/foundation.dart" show debugPrint; +import "package:flutter/foundation.dart" show Uint8List, debugPrint; import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; @@ -29,7 +30,8 @@ class RemoteFileMLService { void init(SharedPreferences prefs) {} - Future putFileEmbedding(EnteFile file, FileMl fileML) async { + Future putFileEmbedding(EnteFile file, RemoteFileML fileML) async { + throw Exception("need to update implementation"); final encryptionKey = getFileKey(file); final embeddingJSON = jsonEncode(fileML.toJson()); final encryptedEmbedding = await CryptoUtil.encryptChaCha( @@ -56,7 +58,7 @@ class RemoteFileMLService { } } - Future getFaceEmbedding( + Future getFileEmbeddings( Set fileIds, ) async { try { @@ -64,7 +66,7 @@ class RemoteFileMLService { "/embeddings/files", data: { "fileIDs": fileIds.toList(), - "model": 'file-ml-clip-face', + "model": 'ggml-clip', }, ); final remoteEmb = res.data['embeddings'] as List; @@ -93,10 +95,10 @@ class RemoteFileMLService { } } - Future> decryptFileMLData( + Future> decryptFileMLData( List remoteEmbeddings, ) async { - final result = {}; + final result = {}; if (remoteEmbeddings.isEmpty) { return result; } @@ -112,7 +114,7 @@ class RemoteFileMLService { final input = EmbeddingsDecoderInput(embedding, fileKey); inputs.add(input); } - return _computer.compute, Map>( + return _computer.compute, Map>( _decryptFileMLComputer, param: { "inputs": inputs, @@ -121,10 +123,16 @@ class RemoteFileMLService { } } -Future> _decryptFileMLComputer( +Uint8List ungzipUint8List(Uint8List compressedData) { + final codec = GZipCodec(); + final List decompressedList = codec.decode(compressedData); + return Uint8List.fromList(decompressedList); +} + +Future> _decryptFileMLComputer( Map args, ) async { - final result = {}; + final result = {}; final inputs = args["inputs"] as List; for (final input in inputs) { final decryptArgs = {}; @@ -134,15 +142,19 @@ Future> _decryptFileMLComputer( decryptArgs["header"] = CryptoUtil.base642bin(input.embedding.decryptionHeader); final embeddingData = chachaDecryptData(decryptArgs); - final decodedJson = jsonDecode(utf8.decode(embeddingData)); - final FileMl decodedEmbedding = - FileMl.fromJson(decodedJson as Map); + // unzip the gzip data + final unzippedData = ungzipUint8List(embeddingData); + final decodedJson = jsonDecode(utf8.decode(unzippedData)); + final RemoteFileML decodedEmbedding = RemoteFileML.fromRemote( + input.embedding.fileID, + decodedJson as Map, + ); result[input.embedding.fileID] = decodedEmbedding; } return result; } -bool shouldDiscardRemoteEmbedding(FileMl fileMl) { +bool shouldDiscardRemoteEmbedding(RemoteFileML fileMl) { if (fileMl.faceEmbedding.version < faceMlVersion) { debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); @@ -175,10 +187,6 @@ bool shouldDiscardRemoteEmbedding(FileMl fileMl) { ); return true; } - if (fileMl.width == null || fileMl.height == null) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because width is null"); - return true; - } + return false; } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 875d54a650..52aad2a824 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -29,8 +29,8 @@ import 'package:photos/services/machine_learning/face_ml/face_embedding/face_emb import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; -import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; -import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; +import "package:photos/services/machine_learning/file_ml/file_ml.dart"; +import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; import 'package:photos/services/machine_learning/ml_exceptions.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; @@ -470,15 +470,23 @@ class MLService { if (!result.errorOccured) { await RemoteFileMLService.instance.putFileEmbedding( instruction.enteFile, - FileMl( + RemoteFileML( instruction.enteFile.uploadedFileID!, - FaceEmbeddings( + {}, + faceEmbedding: RemoteFaceEmbedding( faces, result.mlVersion, client: client, + height: result.decodedImageSize.height, + width: result.decodedImageSize.width, ), - height: result.decodedImageSize.height, - width: result.decodedImageSize.width, + clipEmbedding: result.clipRan + ? RemoteClipEmbedding( + result.clip!.embedding, + version: result.mlVersion, + client: client, + ) + : null, ), ); } else { @@ -487,7 +495,6 @@ class MLService { ); } await FaceMLDataDB.instance.bulkInsertFaces(faces); - return actuallyRanML; } if (result.clipRan) { From 32912be9c2f9a3cec58d2f6c040115eb5492d13c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 20 Jul 2024 00:29:17 +0530 Subject: [PATCH 0094/1179] [mob] Remove embedding store --- .../file_ml/remote_fileml_service.dart | 8 +- .../semantic_search/embedding_store.dart | 189 ------------------ .../semantic_search_service.dart | 15 +- 3 files changed, 13 insertions(+), 199 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 51b52fbaf0..ba4bdf49bf 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -11,7 +11,6 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; -import "package:photos/services/machine_learning/semantic_search/embedding_store.dart"; import "package:photos/services/machine_learning/semantic_search/remote_embedding.dart"; import "package:photos/utils/crypto_util.dart"; import "package:photos/utils/file_download_util.dart"; @@ -154,6 +153,13 @@ Future> _decryptFileMLComputer( return result; } +class EmbeddingsDecoderInput { + final RemoteEmbedding embedding; + final Uint8List decryptionKey; + + EmbeddingsDecoderInput(this.embedding, this.decryptionKey); +} + bool shouldDiscardRemoteEmbedding(RemoteFileML fileMl) { if (fileMl.faceEmbedding.version < faceMlVersion) { debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index e2acbb6871..ed01cc6318 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -1,17 +1,9 @@ import "dart:async"; -import "dart:convert"; -import "dart:typed_data"; import "package:computer/computer.dart"; import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/embeddings_db.dart"; -import "package:photos/db/files_db.dart"; -import "package:photos/models/embedding.dart"; -import "package:photos/models/file/file.dart"; -import 'package:photos/services/machine_learning/semantic_search/remote_embedding.dart'; -import "package:photos/utils/crypto_util.dart"; -import "package:photos/utils/file_download_util.dart"; import "package:shared_preferences/shared_preferences.dart"; class EmbeddingStore { @@ -33,191 +25,10 @@ class EmbeddingStore { _preferences = await SharedPreferences.getInstance(); } - Future pullEmbeddings() async { - if (_remoteSyncStatus != null) { - return _remoteSyncStatus!.future; - } - _remoteSyncStatus = Completer(); - try { - var remoteEmbeddings = await _getRemoteEmbeddings(); - await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); - while (remoteEmbeddings.hasMore) { - remoteEmbeddings = await _getRemoteEmbeddings(); - await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); - } - _remoteSyncStatus!.complete(true); - _remoteSyncStatus = null; - return true; - } catch (e, s) { - _logger.severe("failed to fetch & store remote embeddings", e, s); - _remoteSyncStatus!.complete(false); - _remoteSyncStatus = null; - return false; - } - } - Future pushEmbeddings() async { - final pendingItems = await EmbeddingsDB.instance.getUnsyncedEmbeddings(); - final fileMap = await FilesDB.instance - .getFilesFromIDs(pendingItems.map((e) => e.fileID).toList()); - _logger.info("Pushing ${pendingItems.length} embeddings"); - final deletedEntries = []; - for (final item in pendingItems) { - try { - final file = fileMap[item.fileID]; - if (file != null) { - await _pushEmbedding(file, item); - } else { - deletedEntries.add(item.fileID); - } - } catch (e, s) { - _logger.severe(e, s); - } - } - if (deletedEntries.isNotEmpty) { - await EmbeddingsDB.instance.deleteEmbeddings(deletedEntries); - } - } - - Future storeEmbedding(EnteFile file, Embedding embedding) async { - await EmbeddingsDB.instance.put(embedding); - unawaited(_pushEmbedding(file, embedding)); - } Future clearEmbeddings() async { await EmbeddingsDB.instance.deleteAll(); await _preferences.remove(kEmbeddingsSyncTimeKey); } - - Future _pushEmbedding(EnteFile file, Embedding embedding) async { - _logger.info("Pushing embedding for $file"); - final encryptionKey = getFileKey(file); - final embeddingJSON = jsonEncode(embedding.embedding); - final encryptedEmbedding = await CryptoUtil.encryptChaCha( - utf8.encode(embeddingJSON), - encryptionKey, - ); - final encryptedData = - CryptoUtil.bin2base64(encryptedEmbedding.encryptedData!); - final header = CryptoUtil.bin2base64(encryptedEmbedding.header!); - try { - final response = await _dio.put( - "/embeddings", - data: { - "fileID": embedding.fileID, - "encryptedEmbedding": encryptedData, - "decryptionHeader": header, - }, - ); - final updationTime = response.data["updatedAt"]; - embedding.updationTime = updationTime; - await EmbeddingsDB.instance.put(embedding); - } catch (e, s) { - _logger.severe(e, s); - } - } - - Future _getRemoteEmbeddings({int limit = 200}) async { - final remoteEmbeddings = []; - try { - final sinceTime = _preferences.getInt(kEmbeddingsSyncTimeKey) ?? 0; - _logger.info("Fetching embeddings since $sinceTime"); - final response = await _dio.get( - "/embeddings/diff", - queryParameters: { - "sinceTime": sinceTime, - "limit": limit, - }, - ); - final diff = response.data["diff"] as List; - for (var entry in diff) { - final embedding = RemoteEmbedding.fromMap(entry); - remoteEmbeddings.add(embedding); - } - } catch (e, s) { - _logger.warning("Fetching embeddings failed", e, s); - rethrow; - } - - _logger.info("${remoteEmbeddings.length} embeddings fetched"); - - return RemoteEmbeddings( - remoteEmbeddings, - // keep fetching until we get all embeddings. Avoid limit check as - // some embedding fetch might fail on server - remoteEmbeddings.isNotEmpty, - ); - } - - Future _storeRemoteEmbeddings( - List remoteEmbeddings, - ) async { - if (remoteEmbeddings.isEmpty) { - return; - } - final inputs = []; - final fileMap = await FilesDB.instance - .getFilesFromIDs(remoteEmbeddings.map((e) => e.fileID).toList()); - - for (final embedding in remoteEmbeddings) { - final file = fileMap[embedding.fileID]; - if (file == null) { - continue; - } - final fileKey = getFileKey(file); - final input = EmbeddingsDecoderInput(embedding, fileKey); - inputs.add(input); - } - final embeddings = await _computer.compute( - _decodeEmbeddings, - param: { - "inputs": inputs, - }, - ); - _logger.info("${embeddings.length} embeddings decoded"); - await EmbeddingsDB.instance.putMany(embeddings); - await _preferences.setInt( - kEmbeddingsSyncTimeKey, - embeddings.last.updationTime!, - ); - _logger.info("${embeddings.length} embeddings stored"); - } -} - -Future> _decodeEmbeddings(Map args) async { - final embeddings = []; - - final inputs = args["inputs"] as List; - - for (final input in inputs) { - final decryptArgs = {}; - decryptArgs["source"] = - CryptoUtil.base642bin(input.embedding.encryptedEmbedding); - decryptArgs["key"] = input.decryptionKey; - decryptArgs["header"] = - CryptoUtil.base642bin(input.embedding.decryptionHeader); - final embeddingData = chachaDecryptData(decryptArgs); - - final List decodedEmbedding = jsonDecode(utf8.decode(embeddingData)) - .map((item) => item.toDouble()) - .cast() - .toList(); - - embeddings.add( - Embedding( - fileID: input.embedding.fileID, - embedding: decodedEmbedding, - updationTime: input.embedding.updatedAt, - ), - ); - } - - return embeddings; -} - -class EmbeddingsDecoderInput { - final RemoteEmbedding embedding; - final Uint8List decryptionKey; - - EmbeddingsDecoderInput(this.embedding, this.decryptionKey); } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 3768e034f5..7a5ae8cb65 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -20,10 +20,10 @@ import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_ import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; -import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; +import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { SemanticSearchService._privateConstructor(); @@ -58,7 +58,6 @@ class SemanticSearchService { return; } _hasInitialized = true; - await EmbeddingStore.instance.init(); await EmbeddingsDB.instance.init(); await _loadImageEmbeddings(); Bus.instance.on().listen((event) { @@ -92,8 +91,7 @@ class SemanticSearchService { return; } _isSyncing = true; - await EmbeddingStore.instance.pullEmbeddings(); - unawaited(EmbeddingStore.instance.pushEmbeddings()); + _isSyncing = false; } @@ -140,7 +138,9 @@ class SemanticSearchService { } Future clearIndexes() async { - await EmbeddingStore.instance.clearEmbeddings(); + await EmbeddingsDB.instance.deleteAll(); + final preferences = await SharedPreferences.getInstance(); + await preferences.remove("sync_time_embeddings_v3"); _logger.info("Indexes cleared"); } @@ -278,10 +278,7 @@ class SemanticSearchService { fileID: clipResult.fileID, embedding: clipResult.embedding, ); - await EmbeddingStore.instance.storeEmbedding( - entefile, - embedding, - ); + await EmbeddingsDB.instance.put(embedding); } static Future storeEmptyClipImageResult(EnteFile entefile) async { From 68d10be79eb6d4ed3dfd138087ad435d849b5077 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:36:31 +0530 Subject: [PATCH 0095/1179] [mob] Add new table for clip embedding --- mobile/lib/db/embeddings_db.dart | 59 +++++++++++-------- mobile/lib/models/embedding.dart | 13 ++-- .../semantic_search_service.dart | 9 +-- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/mobile/lib/db/embeddings_db.dart b/mobile/lib/db/embeddings_db.dart index 2b10413933..1cdd331c30 100644 --- a/mobile/lib/db/embeddings_db.dart +++ b/mobile/lib/db/embeddings_db.dart @@ -6,7 +6,6 @@ import 'package:path_provider/path_provider.dart'; import "package:photos/core/event_bus.dart"; import "package:photos/events/embedding_updated_event.dart"; import "package:photos/models/embedding.dart"; -import "package:photos/models/ml/ml_versions.dart"; import "package:sqlite_async/sqlite_async.dart"; class EmbeddingsDB { @@ -15,9 +14,13 @@ class EmbeddingsDB { static final EmbeddingsDB instance = EmbeddingsDB._privateConstructor(); static const databaseName = "ente.embeddings.db"; - static const tableName = "embeddings"; + static const tableName = "clip_embedding"; + static const oldTableName = "embeddings"; static const columnFileID = "file_id"; static const columnEmbedding = "embedding"; + static const columnVersion = "version"; + + @Deprecated("") static const columnUpdationTime = "updation_time"; static Future? _dbFuture; @@ -41,8 +44,21 @@ class EmbeddingsDB { SqliteMigration( 1, (tx) async { + // Avoid creating the old table + // await tx.execute( + // 'CREATE TABLE $oldTableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnUpdationTime INTEGER, UNIQUE ($columnFileID))', + // ); + }, + ), + ) + ..add( + SqliteMigration( + 2, + (tx) async { + // delete old table + await tx.execute('DROP TABLE IF EXISTS $oldTableName'); await tx.execute( - 'CREATE TABLE $tableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnUpdationTime INTEGER, UNIQUE ($columnFileID))', + 'CREATE TABLE $tableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnVersion INTEGER, UNIQUE ($columnFileID))', ); }, ), @@ -57,7 +73,7 @@ class EmbeddingsDB { await db.execute('DELETE FROM $tableName'); } - Future> getAll() async { + Future> getAll() async { final db = await _database; final results = await db.getAll('SELECT * FROM $tableName'); return _convertToEmbeddings(results); @@ -66,11 +82,11 @@ class EmbeddingsDB { // Get indexed FileIDs Future> getIndexedFileIds() async { final db = await _database; - final maps = await db.getAll('SELECT $columnFileID FROM $tableName'); + final maps = await db + .getAll('SELECT $columnFileID , $columnVersion FROM $tableName'); final Map result = {}; for (final map in maps) { - result[map[columnFileID] as int] = - clipMlVersion; // TODO: Add an actual column for version + result[map[columnFileID] as int] = map[columnVersion] as int; } return result; } @@ -84,33 +100,25 @@ class EmbeddingsDB { return maps.first['count'] as int; } - Future put(Embedding embedding) async { + Future put(ClipEmbedding embedding) async { final db = await _database; await db.execute( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnUpdationTime) VALUES (?, ?, ?, ?)', + 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnVersion) VALUES (?, ?, ?)', _getRowFromEmbedding(embedding), ); Bus.instance.fire(EmbeddingUpdatedEvent()); } - Future putMany(List embeddings) async { + Future putMany(List embeddings) async { final db = await _database; final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList(); await db.executeBatch( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnUpdationTime) values(?, ?, ?, ?)', + 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnVersion) values(?, ?, ?)', inputs, ); Bus.instance.fire(EmbeddingUpdatedEvent()); } - Future> getUnsyncedEmbeddings() async { - final db = await _database; - final results = await db.getAll( - 'SELECT * FROM $tableName WHERE $columnUpdationTime IS NULL', - ); - return _convertToEmbeddings(results); - } - Future deleteEmbeddings(List fileIDs) async { final db = await _database; await db.execute( @@ -125,8 +133,8 @@ class EmbeddingsDB { Bus.instance.fire(EmbeddingUpdatedEvent()); } - List _convertToEmbeddings(List> results) { - final List embeddings = []; + List _convertToEmbeddings(List> results) { + final List embeddings = []; for (final result in results) { final embedding = _getEmbeddingFromRow(result); if (embedding.isEmpty) continue; @@ -135,18 +143,19 @@ class EmbeddingsDB { return embeddings; } - Embedding _getEmbeddingFromRow(Map row) { + ClipEmbedding _getEmbeddingFromRow(Map row) { final fileID = row[columnFileID]; final bytes = row[columnEmbedding] as Uint8List; + final version = row[columnVersion] as int; final list = Float32List.view(bytes.buffer); - return Embedding(fileID: fileID, embedding: list); + return ClipEmbedding(fileID: fileID, embedding: list, version: version); } - List _getRowFromEmbedding(Embedding embedding) { + List _getRowFromEmbedding(ClipEmbedding embedding) { return [ embedding.fileID, Float32List.fromList(embedding.embedding).buffer.asUint8List(), - embedding.updationTime, + embedding.version, ]; } diff --git a/mobile/lib/models/embedding.dart b/mobile/lib/models/embedding.dart index 60554538b3..0fb054b3bb 100644 --- a/mobile/lib/models/embedding.dart +++ b/mobile/lib/models/embedding.dart @@ -1,22 +1,23 @@ import "dart:convert"; -class Embedding { +class ClipEmbedding { final int fileID; final List embedding; - int? updationTime; + int version; bool get isEmpty => embedding.isEmpty; - Embedding({ + ClipEmbedding({ required this.fileID, required this.embedding, - this.updationTime, + required this.version, }); - factory Embedding.empty(int fileID) { - return Embedding( + factory ClipEmbedding.empty(int fileID) { + return ClipEmbedding( fileID: fileID, embedding: [], + version: 0, ); } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 7a5ae8cb65..c01c42ae95 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -43,7 +43,7 @@ class SemanticSearchService { bool _hasInitialized = false; bool _textModelIsLoaded = false; bool _isSyncing = false; - List _cachedImageEmbeddings = []; + List _cachedImageEmbeddings = []; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -274,15 +274,16 @@ class SemanticSearchService { ClipResult clipResult, EnteFile entefile, ) async { - final embedding = Embedding( + final embedding = ClipEmbedding( fileID: clipResult.fileID, embedding: clipResult.embedding, + version: clipMlVersion, ); await EmbeddingsDB.instance.put(embedding); } static Future storeEmptyClipImageResult(EnteFile entefile) async { - final embedding = Embedding.empty(entefile.uploadedFileID!); + final embedding = ClipEmbedding.empty(entefile.uploadedFileID!); await EmbeddingsDB.instance.put(embedding); } @@ -363,7 +364,7 @@ class SemanticSearchService { List computeBulkSimilarities(Map args) { final queryResults = []; - final imageEmbeddings = args["imageEmbeddings"] as List; + final imageEmbeddings = args["imageEmbeddings"] as List; final textEmbedding = args["textEmbedding"] as List; final minimumSimilarity = args["minimumSimilarity"] ?? SemanticSearchService.kMinimumSimilarityThreshold; From 6654b24da931885b727594bd5c242204f9bb5315 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:38:05 +0530 Subject: [PATCH 0096/1179] [mob] Remove unused Embedding store --- .../remote_embedding.dart | 0 .../file_ml/remote_fileml_service.dart | 2 +- .../semantic_search/embedding_store.dart | 34 ------------------- 3 files changed, 1 insertion(+), 35 deletions(-) rename mobile/lib/services/machine_learning/{semantic_search => file_ml}/remote_embedding.dart (100%) delete mode 100644 mobile/lib/services/machine_learning/semantic_search/embedding_store.dart diff --git a/mobile/lib/services/machine_learning/semantic_search/remote_embedding.dart b/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart similarity index 100% rename from mobile/lib/services/machine_learning/semantic_search/remote_embedding.dart rename to mobile/lib/services/machine_learning/file_ml/remote_embedding.dart diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index ba4bdf49bf..32b08d4452 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -11,7 +11,7 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; -import "package:photos/services/machine_learning/semantic_search/remote_embedding.dart"; +import "package:photos/services/machine_learning/file_ml/remote_embedding.dart"; import "package:photos/utils/crypto_util.dart"; import "package:photos/utils/file_download_util.dart"; import "package:shared_preferences/shared_preferences.dart"; diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart deleted file mode 100644 index ed01cc6318..0000000000 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ /dev/null @@ -1,34 +0,0 @@ -import "dart:async"; - -import "package:computer/computer.dart"; -import "package:logging/logging.dart"; -import "package:photos/core/network/network.dart"; -import "package:photos/db/embeddings_db.dart"; -import "package:shared_preferences/shared_preferences.dart"; - -class EmbeddingStore { - EmbeddingStore._privateConstructor(); - - static final EmbeddingStore instance = EmbeddingStore._privateConstructor(); - - static const kEmbeddingsSyncTimeKey = "sync_time_embeddings_v3"; - - final _logger = Logger("EmbeddingStore"); - final _dio = NetworkClient.instance.enteDio; - final _computer = Computer.shared(); - - late SharedPreferences _preferences; - - Completer? _remoteSyncStatus; - - Future init() async { - _preferences = await SharedPreferences.getInstance(); - } - - - - Future clearEmbeddings() async { - await EmbeddingsDB.instance.deleteAll(); - await _preferences.remove(kEmbeddingsSyncTimeKey); - } -} From 9b5d6cd5a16272ea2bb154deb039858c889ab989 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:55:10 +0530 Subject: [PATCH 0097/1179] [mob] Refactor --- mobile/lib/utils/ml_util.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index c901e8dba3..8203612921 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -97,12 +97,14 @@ Future> getFilesForMlIndexing() async { } } for (final EnteFile enteFile in hiddenFiles) { - final skip = _skipAnalysisEnteFile(enteFile); + if (_skipAnalysisEnteFile(enteFile)) { + continue; + } final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); final shouldRunClip = _shouldRunIndexing(enteFile, clipIndexedFileIDs, clipMlVersion); - if (skip && !shouldRunFaces && !shouldRunClip) { + if (!shouldRunFaces && !shouldRunClip) { continue; } final instruction = FileMLInstruction( From b406f0c0d834616251961a1a38c24aba1d1ba5e5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:30:27 +0530 Subject: [PATCH 0098/1179] [mob] Store remote clip and face embeddings --- mobile/lib/models/ml/ml_versions.dart | 2 +- .../face_ml/face_recognition_service.dart | 75 ++++++++++++------- .../machine_learning/file_ml/file_ml.dart | 10 ++- .../file_ml/remote_fileml_service.dart | 20 ++--- 4 files changed, 67 insertions(+), 40 deletions(-) diff --git a/mobile/lib/models/ml/ml_versions.dart b/mobile/lib/models/ml/ml_versions.dart index 315f6c74b5..d22c4c0670 100644 --- a/mobile/lib/models/ml/ml_versions.dart +++ b/mobile/lib/models/ml/ml_versions.dart @@ -1,4 +1,4 @@ const faceMlVersion = 1; -const clipMlVersion = 2; +const clipMlVersion = 1; const clusterMlVersion = 1; const minimumClusterSize = 2; diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index e75546b803..3e0c234c34 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -6,11 +6,13 @@ import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/db/embeddings_db.dart"; import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/list.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/face.dart"; +import "package:photos/models/embedding.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; @@ -88,11 +90,11 @@ class FaceRecognitionService { Future _syncFaceEmbeddings({int retryFetchCount = 10}) async { final filesToIndex = await getFilesForMlIndexing(); - final List> chunks = filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 - int fetchedCount = 0; + int filesIndexedForFaces = 0; + int filesIndexedForClip = 0; for (final chunk in chunks) { // Fetching and storing remote embeddings try { @@ -105,39 +107,39 @@ class FaceRecognitionService { _logger.info('fetched ${res.mlData.length} embeddings'); fetchedCount += res.mlData.length; final List faces = []; - final remoteFileIdToVersion = {}; + final List clipEmbeddings = []; for (RemoteFileML fileMl in res.mlData.values) { - if (shouldDiscardRemoteEmbedding(fileMl)) continue; - if (fileMl.faceEmbedding.faces.isEmpty) { - faces.add( - Face.empty( - fileMl.fileID, + final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); + //Note: Always do null check, empty value means no face was found. + if (facesFromRemoteEmbedding != null) { + faces.addAll(facesFromRemoteEmbedding); + filesIndexedForFaces++; + } + if (fileMl.clipEmbedding != null && + fileMl.clipEmbedding!.version >= clipMlVersion) { + clipEmbeddings.add( + ClipEmbedding( + fileID: fileMl.fileID, + embedding: fileMl.clipEmbedding!.embedding, + version: fileMl.clipEmbedding!.version, ), ); - } else { - for (final f in fileMl.faceEmbedding.faces) { - f.fileInfo = FileInfo( - imageHeight: fileMl.faceEmbedding.height, - imageWidth: fileMl.faceEmbedding.width, - ); - faces.add(f); - } + filesIndexedForClip++; } - remoteFileIdToVersion[fileMl.fileID] = fileMl.faceEmbedding.version; } + if (res.noEmbeddingFileIDs.isNotEmpty) { _logger.info( 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', ); for (final fileID in res.noEmbeddingFileIDs) { faces.add(Face.empty(fileID, error: false)); - remoteFileIdToVersion[fileID] = faceMlVersion; } } - await FaceMLDataDB.instance.bulkInsertFaces(faces); + await EmbeddingsDB.instance.putMany(clipEmbeddings); _logger.info( - 'stored embeddings, already indexed files ${remoteFileIdToVersion.length}', + 'Embedding store files for face $filesIndexedForFaces, and clip $filesIndexedForClip', ); } catch (e, s) { _logger.severe("err while getting files embeddings", e, s); @@ -149,16 +151,37 @@ class FaceRecognitionService { }); return; } else { - _logger.severe( - "Failed to fetch embeddings for files after multiple retries", - e, - s, - ); + _logger.severe("embeddingFetch failed with retries", e, s); rethrow; } } } - _logger.info('Fetched $fetchedCount embeddings'); + } + + // Returns a list of faces from the given remote fileML. null if the version is less than the current version + // or if the remote faceEmbedding is null. + List? _getFacesFromRemoteEmbedding(RemoteFileML fileMl) { + final RemoteFaceEmbedding? remoteFaceEmbedding = fileMl.faceEmbedding; + if (shouldDiscardRemoteEmbedding(fileMl)) { + return null; + } + final List faces = []; + if (remoteFaceEmbedding!.faces.isEmpty) { + faces.add( + Face.empty( + fileMl.fileID, + ), + ); + } else { + for (final f in remoteFaceEmbedding.faces) { + f.fileInfo = FileInfo( + imageHeight: remoteFaceEmbedding.height, + imageWidth: remoteFaceEmbedding.width, + ); + faces.add(f); + } + } + return faces; } static Future> runFacesPipeline( diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/machine_learning/file_ml/file_ml.dart index 51b2ceec6a..6a149af664 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/machine_learning/file_ml/file_ml.dart @@ -3,7 +3,7 @@ import "package:photos/face/model/face.dart"; class RemoteFileML { final int fileID; final Map remoteRawData; - final RemoteFaceEmbedding faceEmbedding; + final RemoteFaceEmbedding? faceEmbedding; final RemoteClipEmbedding? clipEmbedding; RemoteFileML( @@ -23,9 +23,11 @@ class RemoteFileML { return RemoteFileML( fileID, json, - faceEmbedding: RemoteFaceEmbedding.fromJson( - json['face'] as Map, - ), + faceEmbedding: json['face'] != null + ? RemoteFaceEmbedding.fromJson( + json['face'] as Map, + ) + : null, clipEmbedding: json['clip'] == null ? null : RemoteClipEmbedding.fromJson( diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 32b08d4452..23c1da9dfc 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -160,19 +160,21 @@ class EmbeddingsDecoderInput { EmbeddingsDecoderInput(this.embedding, this.decryptionKey); } -bool shouldDiscardRemoteEmbedding(RemoteFileML fileMl) { - if (fileMl.faceEmbedding.version < faceMlVersion) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " - "because version is ${fileMl.faceEmbedding.version} and we need $faceMlVersion"); +bool shouldDiscardRemoteEmbedding(RemoteFileML fileML) { + final fileID = fileML.fileID; + final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; + if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { + debugPrint("Discarding remote embedding for fileID $fileID " + "because version is ${faceEmbedding?.version} and we need $faceMlVersion"); return true; } // are all landmarks equal? bool allLandmarksEqual = true; - if (fileMl.faceEmbedding.faces.isEmpty) { - debugPrint("No face for ${fileMl.fileID}"); + if (faceEmbedding.faces.isEmpty) { + debugPrint("No face for ${fileID}"); allLandmarksEqual = false; } - for (final face in fileMl.faceEmbedding.faces) { + for (final face in faceEmbedding.faces) { if (face.detection.landmarks.isEmpty) { allLandmarksEqual = false; break; @@ -183,10 +185,10 @@ bool shouldDiscardRemoteEmbedding(RemoteFileML fileMl) { } } if (allLandmarksEqual) { - debugPrint("Discarding remote embedding for fileID ${fileMl.fileID} " + debugPrint("Discarding remote embedding for fileID $fileID " "because landmarks are equal"); debugPrint( - fileMl.faceEmbedding.faces + faceEmbedding.faces .map((e) => e.detection.landmarks.toString()) .toList() .toString(), From 5a003b6d5cdb0d4dc997c9ce5ecca2b60a7f1821 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:38:43 +0530 Subject: [PATCH 0099/1179] [mob] Refactor --- .../face_ml/face_recognition_service.dart | 1 - .../file_ml/remote_fileml_service.dart | 40 ------------------- .../services/machine_learning/ml_service.dart | 1 - mobile/lib/utils/ml_util.dart | 39 ++++++++++++++++++ 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 3e0c234c34..45d2240344 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -96,7 +96,6 @@ class FaceRecognitionService { int filesIndexedForFaces = 0; int filesIndexedForClip = 0; for (final chunk in chunks) { - // Fetching and storing remote embeddings try { final fileIds = chunk .map((instruction) => instruction.enteFile.uploadedFileID!) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 23c1da9dfc..f8d6fe629c 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -8,7 +8,6 @@ import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; import "package:photos/models/file/file.dart"; -import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; import "package:photos/services/machine_learning/file_ml/remote_embedding.dart"; @@ -159,42 +158,3 @@ class EmbeddingsDecoderInput { EmbeddingsDecoderInput(this.embedding, this.decryptionKey); } - -bool shouldDiscardRemoteEmbedding(RemoteFileML fileML) { - final fileID = fileML.fileID; - final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; - if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { - debugPrint("Discarding remote embedding for fileID $fileID " - "because version is ${faceEmbedding?.version} and we need $faceMlVersion"); - return true; - } - // are all landmarks equal? - bool allLandmarksEqual = true; - if (faceEmbedding.faces.isEmpty) { - debugPrint("No face for ${fileID}"); - allLandmarksEqual = false; - } - for (final face in faceEmbedding.faces) { - if (face.detection.landmarks.isEmpty) { - allLandmarksEqual = false; - break; - } - if (face.detection.landmarks.any((landmark) => landmark.x != landmark.y)) { - allLandmarksEqual = false; - break; - } - } - if (allLandmarksEqual) { - debugPrint("Discarding remote embedding for fileID $fileID " - "because landmarks are equal"); - debugPrint( - faceEmbedding.faces - .map((e) => e.detection.landmarks.toString()) - .toList() - .toString(), - ); - return true; - } - - return false; -} diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 52aad2a824..800ad07502 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -178,7 +178,6 @@ class MLService { _logger.info('starting image indexing'); final filesToIndex = await getFilesForMlIndexing(); - final List> chunks = filesToIndex.chunks(_fileDownloadLimit); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 8203612921..46feaca3c6 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -11,6 +11,7 @@ import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/services/machine_learning/file_ml/file_ml.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/search_service.dart"; import "package:photos/utils/file_util.dart"; @@ -126,6 +127,44 @@ Future> getFilesForMlIndexing() async { return sortedBylocalID; } +bool shouldDiscardRemoteEmbedding(RemoteFileML fileML) { + final fileID = fileML.fileID; + final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; + if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { + _logger.info("Discarding remote embedding for fileID $fileID " + "because version is ${faceEmbedding?.version} and we need $faceMlVersion"); + return true; + } + // are all landmarks equal? + bool allLandmarksEqual = true; + if (faceEmbedding.faces.isEmpty) { + allLandmarksEqual = false; + } + for (final face in faceEmbedding.faces) { + if (face.detection.landmarks.isEmpty) { + allLandmarksEqual = false; + break; + } + if (face.detection.landmarks.any((landmark) => landmark.x != landmark.y)) { + allLandmarksEqual = false; + break; + } + } + if (allLandmarksEqual) { + _logger.info("Discarding remote embedding for fileID $fileID " + "because landmarks are equal"); + _logger.info( + faceEmbedding.faces + .map((e) => e.detection.landmarks.toString()) + .toList() + .toString(), + ); + return true; + } + + return false; +} + Future> getIndexableFileIDs() async { final fileIDs = await FilesDB.instance .getOwnedFileIDs(Configuration.instance.getUserID()!); From bfc67d741dbc8d4e30f2d0cbb87598eba7ac21ba Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:32:06 +0530 Subject: [PATCH 0100/1179] [mob] Zip embeddings --- .../face_ml/face_recognition_service.dart | 2 +- .../machine_learning/file_ml/file_ml.dart | 57 ++++++++++++------- .../file_ml/remote_fileml_service.dart | 32 +++++++---- .../services/machine_learning/ml_service.dart | 38 +++++++------ mobile/lib/utils/ml_util.dart | 2 + 5 files changed, 79 insertions(+), 52 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 45d2240344..06941cbb30 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -89,7 +89,7 @@ class FaceRecognitionService { } Future _syncFaceEmbeddings({int retryFetchCount = 10}) async { - final filesToIndex = await getFilesForMlIndexing(); + final List filesToIndex = await getFilesForMlIndexing(); final List> chunks = filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 int fetchedCount = 0; diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/machine_learning/file_ml/file_ml.dart index 6a149af664..b97a59e4eb 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/machine_learning/file_ml/file_ml.dart @@ -1,45 +1,58 @@ import "package:photos/face/model/face.dart"; +const _faceKey = 'face'; +const _clipKey = 'clip'; + class RemoteFileML { final int fileID; final Map remoteRawData; - final RemoteFaceEmbedding? faceEmbedding; - final RemoteClipEmbedding? clipEmbedding; RemoteFileML( this.fileID, - this.remoteRawData, { - required this.faceEmbedding, - this.clipEmbedding, - }); + this.remoteRawData, + ); - // toJson - Map toJson() { - throw UnimplementedError(); - } - - // fromRemote factory RemoteFileML.fromRemote(int fileID, Map json) { return RemoteFileML( fileID, json, - faceEmbedding: json['face'] != null - ? RemoteFaceEmbedding.fromJson( - json['face'] as Map, - ) - : null, - clipEmbedding: json['clip'] == null - ? null - : RemoteClipEmbedding.fromJson( - json['clip'] as Map, - ), ); } + + static RemoteFileML empty(int i) { + final Map json = {}; + return RemoteFileML(i, json); + } + + void putFaceIfNotNull(RemoteFaceEmbedding? faceEmbedding) { + if (faceEmbedding != null) { + remoteRawData[_faceKey] = faceEmbedding.toJson(); + } + } + + void putClipIfNotNull(RemoteClipEmbedding? clipEmbedding) { + if (clipEmbedding != null) { + remoteRawData[_clipKey] = clipEmbedding.toJson(); + } + } + + RemoteFaceEmbedding? get faceEmbedding => remoteRawData[_faceKey] != null + ? RemoteFaceEmbedding.fromJson( + remoteRawData[_faceKey] as Map, + ) + : null; + + RemoteClipEmbedding? get clipEmbedding => remoteRawData[_clipKey] != null + ? RemoteClipEmbedding.fromJson( + remoteRawData[_clipKey] as Map, + ) + : null; } class RemoteFaceEmbedding { final List faces; final int version; + // packageName/version final String client; final int height; diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index f8d6fe629c..7fb62155e2 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -3,7 +3,7 @@ import "dart:convert"; import "dart:io"; import "package:computer/computer.dart"; -import "package:flutter/foundation.dart" show Uint8List, debugPrint; +import "package:flutter/foundation.dart" show Uint8List; import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; @@ -28,14 +28,19 @@ class RemoteFileMLService { void init(SharedPreferences prefs) {} - Future putFileEmbedding(EnteFile file, RemoteFileML fileML) async { - throw Exception("need to update implementation"); + Future putFileEmbedding( + EnteFile file, + RemoteFileML fileML, { + RemoteClipEmbedding? clipEmbedding, + RemoteFaceEmbedding? faceEmbedding, + }) async { + fileML.putClipIfNotNull(clipEmbedding); + fileML.putFaceIfNotNull(faceEmbedding); final encryptionKey = getFileKey(file); - final embeddingJSON = jsonEncode(fileML.toJson()); - final encryptedEmbedding = await CryptoUtil.encryptChaCha( - utf8.encode(embeddingJSON), - encryptionKey, - ); + final embeddingJSON = jsonEncode(fileML.remoteRawData); + final compressedData = gzipUInt8List(utf8.encode(embeddingJSON)); + final encryptedEmbedding = + await CryptoUtil.encryptChaCha(compressedData, encryptionKey); final encryptedData = CryptoUtil.bin2base64(encryptedEmbedding.encryptedData!); final header = CryptoUtil.bin2base64(encryptedEmbedding.header!); @@ -44,12 +49,11 @@ class RemoteFileMLService { "/embeddings", data: { "fileID": file.uploadedFileID!, - "model": 'file-ml-clip-face', + "model": 'ggml-clip', "encryptedEmbedding": encryptedData, "decryptionHeader": header, }, ); - // final updationTime = response.data["updatedAt"]; } catch (e, s) { _logger.severe("Failed to put embedding", e, s); rethrow; @@ -127,6 +131,13 @@ Uint8List ungzipUint8List(Uint8List compressedData) { return Uint8List.fromList(decompressedList); } +// gzipUInt8List +Uint8List gzipUInt8List(Uint8List data) { + final codec = GZipCodec(); + final compressedData = codec.encode(data); + return Uint8List.fromList(compressedData); +} + Future> _decryptFileMLComputer( Map args, ) async { @@ -140,7 +151,6 @@ Future> _decryptFileMLComputer( decryptArgs["header"] = CryptoUtil.base642bin(input.embedding.decryptionHeader); final embeddingData = chachaDecryptData(decryptArgs); - // unzip the gzip data final unzippedData = ungzipUint8List(embeddingData); final decodedJson = jsonDecode(utf8.decode(unzippedData)); final RemoteFileML decodedEmbedding = RemoteFileML.fromRemote( diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 800ad07502..96cf021515 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -469,24 +469,26 @@ class MLService { if (!result.errorOccured) { await RemoteFileMLService.instance.putFileEmbedding( instruction.enteFile, - RemoteFileML( - instruction.enteFile.uploadedFileID!, - {}, - faceEmbedding: RemoteFaceEmbedding( - faces, - result.mlVersion, - client: client, - height: result.decodedImageSize.height, - width: result.decodedImageSize.width, - ), - clipEmbedding: result.clipRan - ? RemoteClipEmbedding( - result.clip!.embedding, - version: result.mlVersion, - client: client, - ) - : null, - ), + instruction.existingRemoteFileML ?? + RemoteFileML.empty( + instruction.enteFile.uploadedFileID!, + ), + faceEmbedding: result.facesRan + ? RemoteFaceEmbedding( + faces, + result.mlVersion, + client: client, + height: result.decodedImageSize.height, + width: result.decodedImageSize.width, + ) + : null, + clipEmbedding: result.clipRan + ? RemoteClipEmbedding( + result.clip!.embedding, + version: result.mlVersion, + client: client, + ) + : null, ); } else { _logger.warning( diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 46feaca3c6..f70a1b7cc2 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -32,12 +32,14 @@ class FileMLInstruction { final bool shouldRunFaces; final bool shouldRunClip; + RemoteFileML? existingRemoteFileML; FileMLInstruction({ required this.enteFile, required this.shouldRunFaces, required this.shouldRunClip, }); + } Future getIndexStatus() async { From 1524d2b2463aaea9a65859ff9e45de4b709bf76c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:47:33 +0530 Subject: [PATCH 0101/1179] [mob] Remove unused field --- .../machine_learning/face_ml/face_recognition_service.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index b8bc29e1d5..f65ba6add1 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -92,7 +92,6 @@ class FaceRecognitionService { final List> chunks = filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 - int fetchedCount = 0; for (final chunk in chunks) { // Fetching and storing remote embeddings try { @@ -103,7 +102,6 @@ class FaceRecognitionService { final res = await RemoteFileMLService.instance.getFilessEmbedding(fileIds); _logger.info('fetched ${res.mlData.length} embeddings'); - fetchedCount += res.mlData.length; final List faces = []; final remoteFileIdToVersion = {}; for (FileMl fileMl in res.mlData.values) { @@ -134,7 +132,6 @@ class FaceRecognitionService { remoteFileIdToVersion[fileID] = faceMlVersion; } } - await FaceMLDataDB.instance.bulkInsertFaces(faces); _logger.info( 'stored embeddings, already indexed files ${remoteFileIdToVersion.length}', @@ -158,7 +155,6 @@ class FaceRecognitionService { } } } - _logger.info('Fetched $fetchedCount embeddings'); } static Future> runFacesPipeline( From 7bf0b398ab23ec25c182d487e701bf1a97947ae0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 13:55:27 +0530 Subject: [PATCH 0102/1179] [mob] clean up --- mobile/lib/services/machine_learning/ml_service.dart | 1 - .../semantic_search/semantic_search_service.dart | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 96cf021515..da59044c8f 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -133,7 +133,6 @@ class MLService { Future sync() async { await FaceRecognitionService.instance.sync(); - await SemanticSearchService.instance.sync(); } Future runAllML({bool force = false}) async { diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index c01c42ae95..07111d8b06 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -42,7 +42,6 @@ class SemanticSearchService { bool _hasInitialized = false; bool _textModelIsLoaded = false; - bool _isSyncing = false; List _cachedImageEmbeddings = []; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -86,15 +85,6 @@ class SemanticSearchService { _cachedImageEmbeddings.clear(); } - Future sync() async { - if (_isSyncing) { - return; - } - _isSyncing = true; - - _isSyncing = false; - } - bool isMagicSearchEnabledAndReady() { return LocalSettings.instance.isFaceIndexingEnabled && _textModelIsLoaded && From af95421b3ab5487d452c0c1f7c9f745860ae746d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:09:22 +0530 Subject: [PATCH 0103/1179] Refactor --- mobile/lib/utils/gzip.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mobile/lib/utils/gzip.dart diff --git a/mobile/lib/utils/gzip.dart b/mobile/lib/utils/gzip.dart new file mode 100644 index 0000000000..e69de29bb2 From 8283432f7a1570c3fa40fa0fdba8f4e7662ca7e5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:21:12 +0530 Subject: [PATCH 0104/1179] [mob] Refactor --- .../file_ml/remote_fileml_service.dart | 17 ++--------------- mobile/lib/utils/gzip.dart | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 7fb62155e2..86e50eb5cd 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -1,6 +1,5 @@ import "dart:async"; import "dart:convert"; -import "dart:io"; import "package:computer/computer.dart"; import "package:flutter/foundation.dart" show Uint8List; @@ -13,6 +12,7 @@ import "package:photos/services/machine_learning/file_ml/files_ml_data_response. import "package:photos/services/machine_learning/file_ml/remote_embedding.dart"; import "package:photos/utils/crypto_util.dart"; import "package:photos/utils/file_download_util.dart"; +import "package:photos/utils/gzip.dart"; import "package:shared_preferences/shared_preferences.dart"; class RemoteFileMLService { @@ -125,19 +125,6 @@ class RemoteFileMLService { } } -Uint8List ungzipUint8List(Uint8List compressedData) { - final codec = GZipCodec(); - final List decompressedList = codec.decode(compressedData); - return Uint8List.fromList(decompressedList); -} - -// gzipUInt8List -Uint8List gzipUInt8List(Uint8List data) { - final codec = GZipCodec(); - final compressedData = codec.encode(data); - return Uint8List.fromList(compressedData); -} - Future> _decryptFileMLComputer( Map args, ) async { @@ -151,7 +138,7 @@ Future> _decryptFileMLComputer( decryptArgs["header"] = CryptoUtil.base642bin(input.embedding.decryptionHeader); final embeddingData = chachaDecryptData(decryptArgs); - final unzippedData = ungzipUint8List(embeddingData); + final unzippedData = unGzipUInt8List(embeddingData); final decodedJson = jsonDecode(utf8.decode(unzippedData)); final RemoteFileML decodedEmbedding = RemoteFileML.fromRemote( input.embedding.fileID, diff --git a/mobile/lib/utils/gzip.dart b/mobile/lib/utils/gzip.dart index e69de29bb2..1b2787959d 100644 --- a/mobile/lib/utils/gzip.dart +++ b/mobile/lib/utils/gzip.dart @@ -0,0 +1,16 @@ +import "dart:io"; + +import "package:flutter/foundation.dart"; + +Uint8List unGzipUInt8List(Uint8List compressedData) { + final codec = GZipCodec(); + final List decompressedList = codec.decode(compressedData); + return Uint8List.fromList(decompressedList); +} + +// gzipUInt8List +Uint8List gzipUInt8List(Uint8List data) { + final codec = GZipCodec(); + final compressedData = codec.encode(data); + return Uint8List.fromList(compressedData); +} From 8106b17442fc9ccc169c295eb8214333a22c7186 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 23 Jul 2024 11:31:57 +0200 Subject: [PATCH 0105/1179] [mob][photos] Fix text tokenizer --- .../clip/clip_text_encoder.dart | 3 ++- .../clip/clip_text_tokenizer.dart | 11 ++++----- .../semantic_search_service.dart | 23 +++++++++++-------- .../lib/services/remote_assets_service.dart | 14 +++++++++++ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 58a042c534..6f74ab48c7 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -33,7 +33,8 @@ class ClipTextEncoder extends MlModel { static Future> infer(Map args) async { final text = args["text"]; final address = args["address"] as int; - final List tokenize = await ClipTextTokenizer.instance.tokenize(text); + final vocabPath = args["vocabPath"] as String; + final List tokenize = await ClipTextTokenizer.instance.tokenize(text, vocabPath); final int32list = Int32List.fromList(tokenize); return _runFFIBasedPredict(int32list, address); } diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart index 404234effc..a0c3d1c6c0 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart @@ -1,8 +1,8 @@ import "dart:convert"; +import "dart:io" show File; import "dart:math"; import "package:html_unescape/html_unescape.dart"; -import "package:photos/services/remote_assets_service.dart"; import "package:tuple/tuple.dart"; class ClipTextTokenizer { @@ -38,18 +38,17 @@ class ClipTextTokenizer { static final instance = ClipTextTokenizer._privateConstructor(); factory ClipTextTokenizer() => instance; - Future> tokenize(String text) async { - await _init(); + Future> tokenize(String text, String vocabPath) async { + await _init(vocabPath); var tokens = _encode(text); tokens = [sot] + tokens.sublist(0, min(totalTokens - 2, tokens.length)) + [eot]; return tokens + List.filled(totalTokens - tokens.length, 0); } - Future _init() async { + Future _init(String vocabPath) async { if (_isInitialized) return; - final vocabFile = - await RemoteAssetsService.instance.getAsset(kVocabRemotePath); + final vocabFile = File(vocabPath); final String vocabulary = await vocabFile.readAsString(); this.vocabulary = vocabulary; byteEncoder = _bytesToUnicode(); diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 5d6475bb55..ca45633ac1 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -19,7 +19,9 @@ import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_ import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; +import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -296,16 +298,17 @@ class SemanticSearchService { } try { final int clipAddress = ClipTextEncoder.instance.sessionAddress; - // final textEmbedding = await _computer.compute( - // ClipTextEncoder.infer, - // param: { - // "text": query, - // "address": clipAddress, - // }, - // ) as List; - final textEmbedding = await ClipTextEncoder.infer( - {"text": query, "address": clipAddress}, - ); + const remotePath = ClipTextTokenizer.kVocabRemotePath; + final String tokenizerVocabPath = + await RemoteAssetsService.instance.getAssetPath(remotePath); + final textEmbedding = await _computer.compute( + ClipTextEncoder.infer, + param: { + "text": query, + "address": clipAddress, + "vocabPath": tokenizerVocabPath, + }, + ) as List; _queryCache.put(query, textEmbedding); return textEmbedding; } catch (e) { diff --git a/mobile/lib/services/remote_assets_service.dart b/mobile/lib/services/remote_assets_service.dart index b9bed09b50..bbceb4ac13 100644 --- a/mobile/lib/services/remote_assets_service.dart +++ b/mobile/lib/services/remote_assets_service.dart @@ -32,6 +32,20 @@ class RemoteAssetsService { } } + Future getAssetPath(String remotePath, {bool refetch = false}) async { + final path = await _getLocalPath(remotePath); + final file = File(path); + if (file.existsSync() && !refetch) { + _logger.info("Returning path of cached file for $remotePath"); + return file.path; + } else { + final tempFile = File(path + ".temp"); + await _downloadFile(remotePath, tempFile.path); + tempFile.renameSync(path); + return path; + } + } + ///Returns asset if the remote asset is new compared to the local copy of it Future getAssetIfUpdated(String remotePath) async { try { From b8ccc74dacfe198a741cc381e03fa2e50c93dc33 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 23 Jul 2024 11:33:06 +0200 Subject: [PATCH 0106/1179] [mob][photos] Simplify --- mobile/lib/services/remote_assets_service.dart | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/remote_assets_service.dart b/mobile/lib/services/remote_assets_service.dart index bbceb4ac13..8426c286eb 100644 --- a/mobile/lib/services/remote_assets_service.dart +++ b/mobile/lib/services/remote_assets_service.dart @@ -33,17 +33,8 @@ class RemoteAssetsService { } Future getAssetPath(String remotePath, {bool refetch = false}) async { - final path = await _getLocalPath(remotePath); - final file = File(path); - if (file.existsSync() && !refetch) { - _logger.info("Returning path of cached file for $remotePath"); - return file.path; - } else { - final tempFile = File(path + ".temp"); - await _downloadFile(remotePath, tempFile.path); - tempFile.renameSync(path); - return path; - } + final file = await getAsset(remotePath, refetch: refetch); + return file.path; } ///Returns asset if the remote asset is new compared to the local copy of it From 56b4d3cd46c45d83952635dd5867283dfcf99e54 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 23 Jul 2024 11:48:14 +0200 Subject: [PATCH 0107/1179] [mob][photos] Rename for consistency --- .../semantic_search/clip/clip_text_encoder.dart | 5 +++-- .../semantic_search/semantic_search_service.dart | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 6f74ab48c7..2c3e6b7e8a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -30,11 +30,12 @@ class ClipTextEncoder extends MlModel { static final instance = ClipTextEncoder._privateConstructor(); factory ClipTextEncoder() => instance; - static Future> infer(Map args) async { + static Future> predict(Map args) async { final text = args["text"]; final address = args["address"] as int; final vocabPath = args["vocabPath"] as String; - final List tokenize = await ClipTextTokenizer.instance.tokenize(text, vocabPath); + final List tokenize = + await ClipTextTokenizer.instance.tokenize(text, vocabPath); final int32list = Int32List.fromList(tokenize); return _runFFIBasedPredict(int32list, address); } diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index ca45633ac1..caf0a879f0 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -302,7 +302,7 @@ class SemanticSearchService { final String tokenizerVocabPath = await RemoteAssetsService.instance.getAssetPath(remotePath); final textEmbedding = await _computer.compute( - ClipTextEncoder.infer, + ClipTextEncoder.predict, param: { "text": query, "address": clipAddress, From 4a1cb3a7323fb65ea23f6053579017795632414d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:18:45 +0530 Subject: [PATCH 0108/1179] [mob] Refactor to simplify gzip/unzip enc --- .../file_ml/remote_fileml_service.dart | 39 ++++------ mobile/lib/utils/gzip.dart | 72 ++++++++++++++++++- 2 files changed, 84 insertions(+), 27 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 86e50eb5cd..3e9345f72b 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -1,5 +1,4 @@ import "dart:async"; -import "dart:convert"; import "package:computer/computer.dart"; import "package:flutter/foundation.dart" show Uint8List; @@ -10,7 +9,6 @@ import "package:photos/models/file/file.dart"; import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; import "package:photos/services/machine_learning/file_ml/remote_embedding.dart"; -import "package:photos/utils/crypto_util.dart"; import "package:photos/utils/file_download_util.dart"; import "package:photos/utils/gzip.dart"; import "package:shared_preferences/shared_preferences.dart"; @@ -36,22 +34,18 @@ class RemoteFileMLService { }) async { fileML.putClipIfNotNull(clipEmbedding); fileML.putFaceIfNotNull(faceEmbedding); - final encryptionKey = getFileKey(file); - final embeddingJSON = jsonEncode(fileML.remoteRawData); - final compressedData = gzipUInt8List(utf8.encode(embeddingJSON)); - final encryptedEmbedding = - await CryptoUtil.encryptChaCha(compressedData, encryptionKey); - final encryptedData = - CryptoUtil.bin2base64(encryptedEmbedding.encryptedData!); - final header = CryptoUtil.bin2base64(encryptedEmbedding.header!); + final ChaChaEncryptionResult encryptionResult = await gzipAndEncryptJson( + fileML.remoteRawData, + getFileKey(file), + ); try { final _ = await _dio.put( "/embeddings", data: { "fileID": file.uploadedFileID!, "model": 'ggml-clip', - "encryptedEmbedding": encryptedData, - "decryptionHeader": header, + "encryptedEmbedding": encryptionResult.encData, + "decryptionHeader": encryptionResult.header, }, ); } catch (e, s) { @@ -131,20 +125,15 @@ Future> _decryptFileMLComputer( final result = {}; final inputs = args["inputs"] as List; for (final input in inputs) { - final decryptArgs = {}; - decryptArgs["source"] = - CryptoUtil.base642bin(input.embedding.encryptedEmbedding); - decryptArgs["key"] = input.decryptionKey; - decryptArgs["header"] = - CryptoUtil.base642bin(input.embedding.decryptionHeader); - final embeddingData = chachaDecryptData(decryptArgs); - final unzippedData = unGzipUInt8List(embeddingData); - final decodedJson = jsonDecode(utf8.decode(unzippedData)); - final RemoteFileML decodedEmbedding = RemoteFileML.fromRemote( - input.embedding.fileID, - decodedJson as Map, + final decodedJson = decryptAndUnzipJsonSync( + input.decryptionKey, + encryptedData: input.embedding.encryptedEmbedding, + header: input.embedding.decryptionHeader, + ); + result[input.embedding.fileID] = RemoteFileML.fromRemote( + input.embedding.fileID, + decodedJson, ); - result[input.embedding.fileID] = decodedEmbedding; } return result; } diff --git a/mobile/lib/utils/gzip.dart b/mobile/lib/utils/gzip.dart index 1b2787959d..d1680d43e7 100644 --- a/mobile/lib/utils/gzip.dart +++ b/mobile/lib/utils/gzip.dart @@ -1,16 +1,84 @@ +import "dart:convert"; import "dart:io"; +import "package:computer/computer.dart"; import "package:flutter/foundation.dart"; +import "package:photos/utils/crypto_util.dart"; -Uint8List unGzipUInt8List(Uint8List compressedData) { +class ChaChaEncryptionResult { + final String encData; + final String header; + + ChaChaEncryptionResult({ + required this.encData, + required this.header, + }); +} + +Uint8List _unGzipUInt8List(Uint8List compressedData) { final codec = GZipCodec(); final List decompressedList = codec.decode(compressedData); return Uint8List.fromList(decompressedList); } // gzipUInt8List -Uint8List gzipUInt8List(Uint8List data) { +Uint8List _gzipUInt8List(Uint8List data) { final codec = GZipCodec(); final compressedData = codec.encode(data); return Uint8List.fromList(compressedData); } + +Map decryptAndUnzipJsonSync( + Uint8List key, { + required String encryptedData, + required String header, +}) { + final decryptedData = chachaDecryptData({ + "source": CryptoUtil.base642bin(encryptedData), + "key": key, + "header": CryptoUtil.base642bin(header), + }); + final decompressedData = _unGzipUInt8List(decryptedData); + final json = utf8.decode(decompressedData); + return jsonDecode(json); +} + +// zipJsonAndEncryptSync performs all operations synchronously, on a single isolate. +ChaChaEncryptionResult gzipAndEncryptJsonSync( + Map jsonData, + Uint8List key, +) { + final json = utf8.encode(jsonEncode(jsonData)); + final compressedJson = _gzipUInt8List(Uint8List.fromList(json)); + final encryptedData = chachaEncryptData({ + "source": compressedJson, + "key": key, + }); + return ChaChaEncryptionResult( + encData: CryptoUtil.bin2base64(encryptedData.encryptedData!), + header: CryptoUtil.bin2base64(encryptedData.header!), + ); +} + +Future gzipAndEncryptJson( + Map jsonData, + Uint8List key, +) async { + final Computer computer = Computer.shared(); + final response = + await computer.compute, ChaChaEncryptionResult>( + _gzipAndEncryptJsonSync, + param: { + "jsonData": jsonData, + "key": key, + }, + taskName: "gzipAndEncryptJson", + ); + return response; +} + +ChaChaEncryptionResult _gzipAndEncryptJsonSync( + Map args, +) { + return gzipAndEncryptJsonSync(args["jsonData"], args["key"]); +} From ef372ebfa4fe6983b809f66eef2be45745a55c2d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:32:56 +0530 Subject: [PATCH 0109/1179] [mob] Modify instruction based on remote response --- .../face_ml/face_recognition_service.dart | 102 +++++++++--------- .../services/machine_learning/ml_service.dart | 36 +++---- mobile/lib/utils/ml_util.dart | 16 +-- 3 files changed, 76 insertions(+), 78 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 666df043aa..db5bf2c047 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -88,71 +88,69 @@ class FaceRecognitionService { _isSyncing = false; } - Future _syncFaceEmbeddings({int retryFetchCount = 10}) async { + Future> _syncFaceEmbeddings() async { final List filesToIndex = await getFilesForMlIndexing(); + final Map pendingIndex = {}; final List> chunks = filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 int filesIndexedForFaces = 0; int filesIndexedForClip = 0; for (final chunk in chunks) { - try { - final fileIds = chunk - .map((instruction) => instruction.enteFile.uploadedFileID!) - .toSet(); - _logger.info('starting remote fetch for ${fileIds.length} files'); - final res = - await RemoteFileMLService.instance.getFileEmbeddings(fileIds); - _logger.info('fetched ${res.mlData.length} embeddings'); - final List faces = []; - final List clipEmbeddings = []; - for (RemoteFileML fileMl in res.mlData.values) { - final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); - //Note: Always do null check, empty value means no face was found. - if (facesFromRemoteEmbedding != null) { - faces.addAll(facesFromRemoteEmbedding); - filesIndexedForFaces++; - } - if (fileMl.clipEmbedding != null && - fileMl.clipEmbedding!.version >= clipMlVersion) { - clipEmbeddings.add( - ClipEmbedding( - fileID: fileMl.fileID, - embedding: fileMl.clipEmbedding!.embedding, - version: fileMl.clipEmbedding!.version, - ), - ); - filesIndexedForClip++; - } + final Set ids = {}; + for (final instruction in chunk) { + ids.add(instruction.file.uploadedFileID!); + pendingIndex[instruction.file.uploadedFileID!] = instruction; + } + _logger.info('starting remote fetch for ${ids.length} files'); + final res = await RemoteFileMLService.instance.getFileEmbeddings(ids); + _logger.info('fetched ${res.mlData.length} embeddings'); + final List faces = []; + final List clipEmbeddings = []; + for (RemoteFileML fileMl in res.mlData.values) { + final existingInstruction = pendingIndex[fileMl.fileID]!; + final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); + //Note: Always do null check, empty value means no face was found. + if (facesFromRemoteEmbedding != null) { + faces.addAll(facesFromRemoteEmbedding); + filesIndexedForFaces++; + existingInstruction.shouldRunFaces = false; } - - if (res.noEmbeddingFileIDs.isNotEmpty) { - _logger.info( - 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', + if (fileMl.clipEmbedding != null && + fileMl.clipEmbedding!.version >= clipMlVersion) { + clipEmbeddings.add( + ClipEmbedding( + fileID: fileMl.fileID, + embedding: fileMl.clipEmbedding!.embedding, + version: fileMl.clipEmbedding!.version, + ), ); - for (final fileID in res.noEmbeddingFileIDs) { - faces.add(Face.empty(fileID, error: false)); - } + existingInstruction.shouldRunClip = false; + filesIndexedForClip++; } - await FaceMLDataDB.instance.bulkInsertFaces(faces); - await EmbeddingsDB.instance.putMany(clipEmbeddings); - _logger.info( - 'Embedding store files for face $filesIndexedForFaces, and clip $filesIndexedForClip', - ); - } catch (e, s) { - _logger.severe("err while getting files embeddings", e, s); - if (retryFetchCount < 1000) { - Future.delayed(Duration(seconds: retryFetchCount), () { - unawaited( - _syncFaceEmbeddings(retryFetchCount: retryFetchCount * 2), - ); - }); - return; + if (!existingInstruction.pendingML) { + pendingIndex.remove(fileMl.fileID); } else { - _logger.severe("embeddingFetch failed with retries", e, s); - rethrow; + existingInstruction.existingRemoteFileML = fileMl; + pendingIndex[fileMl.fileID] = existingInstruction; } } + + if (res.noEmbeddingFileIDs.isNotEmpty) { + _logger.info( + 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', + ); + for (final fileID in res.noEmbeddingFileIDs) { + faces.add(Face.empty(fileID, error: false)); + } + } + await FaceMLDataDB.instance.bulkInsertFaces(faces); + await EmbeddingsDB.instance.putMany(clipEmbeddings); + _logger.info( + 'Embedding store files for face $filesIndexedForFaces, and clip $filesIndexedForClip', + ); } + final List instructions = pendingIndex.values.toList(); + return instructions; } // Returns a list of faces from the given remote fileML. null if the version is less than the current version diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index da59044c8f..6c2d6f7074 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -393,7 +393,7 @@ class MLService { Future processImage(FileMLInstruction instruction) async { // TODO: clean this function up _logger.info( - "`processImage` start processing image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", + "`processImage` start processing image with uploadedFileID: ${instruction.file.uploadedFileID}", ); bool actuallyRanML = false; @@ -404,7 +404,7 @@ class MLService { if (result == null) { if (!_shouldPauseIndexingAndClustering) { _logger.severe( - "Failed to analyze image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", + "Failed to analyze image with uploadedFileID: ${instruction.file.uploadedFileID}", ); } return actuallyRanML; @@ -414,7 +414,7 @@ class MLService { final List faces = []; if (result.foundNoFaces) { debugPrint( - 'No faces detected for file with name:${instruction.enteFile.displayName}', + 'No faces detected for file with name:${instruction.file.displayName}', ); faces.add( Face.empty(result.fileId, error: result.errorOccured), @@ -425,9 +425,9 @@ class MLService { result.decodedImageSize.height == -1) { _logger.severe( "decodedImageSize is not stored correctly for image with " - "ID: ${instruction.enteFile.uploadedFileID}"); + "ID: ${instruction.file.uploadedFileID}"); _logger.info( - "Using aligned image size for image with ID: ${instruction.enteFile.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${instruction.enteFile.width}x${instruction.enteFile.height} in the metadata", + "Using aligned image size for image with ID: ${instruction.file.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${instruction.file.width}x${instruction.file.height} in the metadata", ); } for (int i = 0; i < result.faces!.length; ++i) { @@ -467,10 +467,10 @@ class MLService { _logger.info("inserting ${faces.length} faces for ${result.fileId}"); if (!result.errorOccured) { await RemoteFileMLService.instance.putFileEmbedding( - instruction.enteFile, + instruction.file, instruction.existingRemoteFileML ?? RemoteFileML.empty( - instruction.enteFile.uploadedFileID!, + instruction.file.uploadedFileID!, ), faceEmbedding: result.facesRan ? RemoteFaceEmbedding( @@ -501,25 +501,25 @@ class MLService { actuallyRanML = true; await SemanticSearchService.storeClipImageResult( result.clip!, - instruction.enteFile, + instruction.file, ); } } on ThumbnailRetrievalException catch (e, s) { _logger.severe( - 'ThumbnailRetrievalException while processing image with ID ${instruction.enteFile.uploadedFileID}, storing empty face so indexing does not get stuck', + 'ThumbnailRetrievalException while processing image with ID ${instruction.file.uploadedFileID}, storing empty face so indexing does not get stuck', e, s, ); await FaceMLDataDB.instance.bulkInsertFaces( - [Face.empty(instruction.enteFile.uploadedFileID!, error: true)], + [Face.empty(instruction.file.uploadedFileID!, error: true)], ); await SemanticSearchService.storeEmptyClipImageResult( - instruction.enteFile, + instruction.file, ); return true; } catch (e, s) { _logger.severe( - "Failed to analyze using FaceML for image with ID: ${instruction.enteFile.uploadedFileID}. Not storing any faces, which means it will be automatically retried later.", + "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID}. Not storing any faces, which means it will be automatically retried later.", e, s, ); @@ -756,7 +756,7 @@ class MLService { Future _analyzeImageInSingleIsolate( FileMLInstruction instruction, ) async { - final String filePath = await getImagePathForML(instruction.enteFile); + final String filePath = await getImagePathForML(instruction.file); final Stopwatch stopwatch = Stopwatch()..start(); late MLResult result; @@ -766,7 +766,7 @@ class MLService { ( FaceMlOperation.analyzeImage, { - "enteFileID": instruction.enteFile.uploadedFileID ?? -1, + "enteFileID": instruction.file.uploadedFileID ?? -1, "filePath": filePath, "runFaces": instruction.shouldRunFaces, "runClip": instruction.shouldRunClip, @@ -787,21 +787,21 @@ class MLService { result = MLResult.fromJsonString(resultJsonString); } catch (e, s) { _logger.severe( - "Could not analyze image with ID ${instruction.enteFile.uploadedFileID} \n", + "Could not analyze image with ID ${instruction.file.uploadedFileID} \n", e, s, ); debugPrint( - "This image with ID ${instruction.enteFile.uploadedFileID} has name ${instruction.enteFile.displayName}.", + "This image with ID ${instruction.file.uploadedFileID} has name ${instruction.file.displayName}.", ); final resultBuilder = - MLResult.fromEnteFileID(instruction.enteFile.uploadedFileID!) + MLResult.fromEnteFileID(instruction.file.uploadedFileID!) ..errorOccurred(); return resultBuilder; } stopwatch.stop(); _logger.info( - "Finished Analyze image with uploadedFileID ${instruction.enteFile.uploadedFileID}, in " + "Finished Analyze image with uploadedFileID ${instruction.file.uploadedFileID}, in " "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index f70a1b7cc2..0b38f3b825 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -28,18 +28,18 @@ class IndexStatus { } class FileMLInstruction { - final EnteFile enteFile; - - final bool shouldRunFaces; - final bool shouldRunClip; + final EnteFile file; + bool shouldRunFaces; + bool shouldRunClip; RemoteFileML? existingRemoteFileML; FileMLInstruction({ - required this.enteFile, + required this.file, required this.shouldRunFaces, required this.shouldRunClip, }); - + // Returns true if the file should be indexed for either faces or clip + bool get pendingML => shouldRunFaces || shouldRunClip; } Future getIndexStatus() async { @@ -89,7 +89,7 @@ Future> getFilesForMlIndexing() async { continue; } final instruction = FileMLInstruction( - enteFile: enteFile, + file: enteFile, shouldRunFaces: shouldRunFaces, shouldRunClip: shouldRunClip, ); @@ -111,7 +111,7 @@ Future> getFilesForMlIndexing() async { continue; } final instruction = FileMLInstruction( - enteFile: enteFile, + file: enteFile, shouldRunFaces: shouldRunFaces, shouldRunClip: shouldRunClip, ); From 6d7d7b88a6355a253fcda164e9d23e167e1b8dd8 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 13:42:04 +0530 Subject: [PATCH 0110/1179] [mob] iOS build changes --- mobile/ios/Podfile.lock | 6 ------ mobile/ios/Runner.xcodeproj/project.pbxproj | 2 -- 2 files changed, 8 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 3fee5e8c6e..6b65278be4 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -201,8 +201,6 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - smart_auth (0.0.1): - - Flutter - sqflite (0.0.3): - Flutter - FlutterMacOS @@ -282,7 +280,6 @@ DEPENDENCIES: - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - smart_auth (from `.symlinks/plugins/smart_auth/ios`) - sqflite (from `.symlinks/plugins/sqflite/darwin`) - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) - uni_links (from `.symlinks/plugins/uni_links/ios`) @@ -405,8 +402,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - smart_auth: - :path: ".symlinks/plugins/smart_auth/ios" sqflite: :path: ".symlinks/plugins/sqflite/darwin" sqlite3_flutter_libs: @@ -488,7 +483,6 @@ SPEC CHECKSUMS: SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 02d1f07eaaa01f80a1c16b4b31dfcbb3345ee01a sqlite3_flutter_libs: af0e8fe9bce48abddd1ffdbbf839db0302d72d80 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 2c954cdfce..6fda5cd213 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -330,7 +330,6 @@ "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework", "${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework", "${BUILT_PRODUCTS_DIR}/shared_preferences_foundation/shared_preferences_foundation.framework", - "${BUILT_PRODUCTS_DIR}/smart_auth/smart_auth.framework", "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", "${BUILT_PRODUCTS_DIR}/sqlite3/sqlite3.framework", "${BUILT_PRODUCTS_DIR}/sqlite3_flutter_libs/sqlite3_flutter_libs.framework", @@ -423,7 +422,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_foundation.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/smart_auth.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3_flutter_libs.framework", From e134d599b7451b4079c230a375021c4805043074 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 13:45:18 +0530 Subject: [PATCH 0111/1179] [mob] Use stream to optimize processing --- .../face_ml/face_recognition_service.dart | 44 +++++++++++-------- .../file_ml/files_ml_data_response.dart | 13 ++++++ .../services/machine_learning/ml_service.dart | 19 ++++---- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index db5bf2c047..392a9df20f 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -67,7 +67,6 @@ class FaceRecognitionService { Future sync() async { await _syncPersonFeedback(); if (LocalSettings.instance.remoteFetchEnabled) { - await _syncFaceEmbeddings(); } else { _logger.severe( 'Not fetching embeddings because user manually disabled it in debug options', @@ -88,22 +87,24 @@ class FaceRecognitionService { _isSyncing = false; } - Future> _syncFaceEmbeddings() async { + Stream> syncEmbeddings({ + int yieldSize = 10, + }) async* { final List filesToIndex = await getFilesForMlIndexing(); - final Map pendingIndex = {}; final List> chunks = - filesToIndex.chunks(_embeddingFetchLimit); // Chunks of 200 - int filesIndexedForFaces = 0; - int filesIndexedForClip = 0; + filesToIndex.chunks(_embeddingFetchLimit); + List batchToYield = []; + for (final chunk in chunks) { final Set ids = {}; + final Map pendingIndex = {}; for (final instruction in chunk) { ids.add(instruction.file.uploadedFileID!); pendingIndex[instruction.file.uploadedFileID!] = instruction; } - _logger.info('starting remote fetch for ${ids.length} files'); + _logger.info("fetching embeddings for ${ids.length} files"); final res = await RemoteFileMLService.instance.getFileEmbeddings(ids); - _logger.info('fetched ${res.mlData.length} embeddings'); + _logger.info("embeddingResponse ${res.debugLog()}"); final List faces = []; final List clipEmbeddings = []; for (RemoteFileML fileMl in res.mlData.values) { @@ -112,7 +113,6 @@ class FaceRecognitionService { //Note: Always do null check, empty value means no face was found. if (facesFromRemoteEmbedding != null) { faces.addAll(facesFromRemoteEmbedding); - filesIndexedForFaces++; existingInstruction.shouldRunFaces = false; } if (fileMl.clipEmbedding != null && @@ -125,7 +125,6 @@ class FaceRecognitionService { ), ); existingInstruction.shouldRunClip = false; - filesIndexedForClip++; } if (!existingInstruction.pendingML) { pendingIndex.remove(fileMl.fileID); @@ -134,23 +133,30 @@ class FaceRecognitionService { pendingIndex[fileMl.fileID] = existingInstruction; } } - + for (final fileID in pendingIndex.keys) { + final instruction = pendingIndex[fileID]!; + if (instruction.pendingML) { + batchToYield.add(instruction); + if (batchToYield.length == yieldSize) { + _logger.info("queueing indexing for $yieldSize"); + yield batchToYield; + batchToYield = []; + } + } + } if (res.noEmbeddingFileIDs.isNotEmpty) { - _logger.info( - 'No embeddings found for ${res.noEmbeddingFileIDs.length} files', - ); for (final fileID in res.noEmbeddingFileIDs) { faces.add(Face.empty(fileID, error: false)); } } await FaceMLDataDB.instance.bulkInsertFaces(faces); await EmbeddingsDB.instance.putMany(clipEmbeddings); - _logger.info( - 'Embedding store files for face $filesIndexedForFaces, and clip $filesIndexedForClip', - ); } - final List instructions = pendingIndex.values.toList(); - return instructions; + // Yield any remaining instructions + if (batchToYield.isNotEmpty) { + _logger.info("queueing indexing for $batchToYield.length"); + yield batchToYield; + } } // Returns a list of faces from the given remote fileML. null if the version is less than the current version diff --git a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart index 67b69dcf5c..56da3adc58 100644 --- a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart +++ b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart @@ -16,4 +16,17 @@ class FilesMLDataResponse { required this.fetchErrorFileIDs, required this.pendingIndexFileIDs, }); + + String debugLog() { + final nonZeroNoEmbeddingFileIDs = noEmbeddingFileIDs.isNotEmpty + ? ', smallEmbeddings: ${noEmbeddingFileIDs.length}' + : ''; + final nonZeroFetchErrorFileIDs = fetchErrorFileIDs.isNotEmpty + ? ', errorForFileIDs: ${fetchErrorFileIDs.length}' + : ''; + final nonZeroPendingIndexFileIDs = pendingIndexFileIDs.isNotEmpty + ? ', pendingIndexFileIDs: ${pendingIndexFileIDs.length}' + : ''; + return 'MLRemote(mlData: ${mlData.length}$nonZeroNoEmbeddingFileIDs$nonZeroFetchErrorFileIDs$nonZeroPendingIndexFileIDs)'; + } } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 6c2d6f7074..3f2e96aac3 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -14,7 +14,6 @@ import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/extensions/list.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/box.dart"; import "package:photos/face/model/detection.dart" as face_detection; @@ -61,7 +60,9 @@ class MLService { // Singleton pattern MLService._privateConstructor(); + static final instance = MLService._privateConstructor(); + factory MLService() => instance; final _initModelLock = Lock(); @@ -175,26 +176,25 @@ class MLService { try { _isIndexingOrClusteringRunning = true; _logger.info('starting image indexing'); - - final filesToIndex = await getFilesForMlIndexing(); - final List> chunks = - filesToIndex.chunks(_fileDownloadLimit); + final Stream> instructionStream = + FaceRecognitionService.instance + .syncEmbeddings(yieldSize: _fileDownloadLimit); int fileAnalyzedCount = 0; final Stopwatch stopwatch = Stopwatch()..start(); - outerLoop: - for (final chunk in chunks) { + + await for (final chunk in instructionStream) { if (!await canUseHighBandwidth()) { _logger.info( 'stopping indexing because user is not connected to wifi', ); - break outerLoop; + break; } final futures = >[]; for (final instruction in chunk) { if (_shouldPauseIndexingAndClustering) { _logger.info("indexAllImages() was paused, stopping"); - break outerLoop; + break; } await _ensureReadyForInference(); futures.add(processImage(instruction)); @@ -206,7 +206,6 @@ class MLService { ); fileAnalyzedCount += sumFutures; } - _logger.info( "`indexAllImages()` finished. Analyzed $fileAnalyzedCount images, in ${stopwatch.elapsed.inSeconds} seconds (avg of ${stopwatch.elapsed.inSeconds / fileAnalyzedCount} seconds per image)", ); From 6b026678a361ddb1214ff71c87259561f3ccfb3b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:05:19 +0530 Subject: [PATCH 0112/1179] [mob] Update model name for derived data --- .../machine_learning/file_ml/remote_fileml_service.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 3e9345f72b..841332cf29 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -15,6 +15,7 @@ import "package:shared_preferences/shared_preferences.dart"; class RemoteFileMLService { RemoteFileMLService._privateConstructor(); + static const String _derivedModelKey = "derived"; static final Computer _computer = Computer.shared(); @@ -43,7 +44,7 @@ class RemoteFileMLService { "/embeddings", data: { "fileID": file.uploadedFileID!, - "model": 'ggml-clip', + "model": _derivedModelKey, "encryptedEmbedding": encryptionResult.encData, "decryptionHeader": encryptionResult.header, }, @@ -62,7 +63,7 @@ class RemoteFileMLService { "/embeddings/files", data: { "fileIDs": fileIds.toList(), - "model": 'ggml-clip', + "model": _derivedModelKey, }, ); final remoteEmb = res.data['embeddings'] as List; From ea4ab9d4cd1ac6b7faaa1799c0a68a542ef7edc3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:19:20 +0530 Subject: [PATCH 0113/1179] [mob] rename --- .../semantic_search/semantic_search_service.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 07111d8b06..dc154bf73c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -37,7 +37,7 @@ class SemanticSearchService { static const kDebounceDuration = Duration(milliseconds: 4000); final _logger = Logger("SemanticSearchService"); - final _embeddingLoaderDebouncer = + final _reloadCacheDebouncer = Debouncer(kDebounceDuration, executionInterval: kDebounceDuration); bool _hasInitialized = false; @@ -61,7 +61,7 @@ class SemanticSearchService { await _loadImageEmbeddings(); Bus.instance.on().listen((event) { if (!_hasInitialized) return; - _embeddingLoaderDebouncer.run(() async { + _reloadCacheDebouncer.run(() async { await _loadImageEmbeddings(); }); }); From 0afddd6949148bc3366c5f1a2d9c6b7c788429b9 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:21:34 +0530 Subject: [PATCH 0114/1179] [mob] inline --- .../semantic_search/semantic_search_service.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index dc154bf73c..73a88d1c8c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -34,11 +34,12 @@ class SemanticSearchService { static final LRUMap> _queryCache = LRUMap(20); static const kMinimumSimilarityThreshold = 0.20; - static const kDebounceDuration = Duration(milliseconds: 4000); final _logger = Logger("SemanticSearchService"); - final _reloadCacheDebouncer = - Debouncer(kDebounceDuration, executionInterval: kDebounceDuration); + final _reloadCacheDebouncer = Debouncer( + const Duration(milliseconds: 4000), + executionInterval: const Duration(milliseconds: 8000), + ); bool _hasInitialized = false; bool _textModelIsLoaded = false; From 07b4deba2ef99a47fc21919d5531083b3af5e41b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:24:11 +0530 Subject: [PATCH 0115/1179] [mob] inline --- .../semantic_search/semantic_search_service.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 73a88d1c8c..b398d39747 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -26,16 +26,16 @@ import "package:photos/utils/ml_util.dart"; import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { + final _logger = Logger("SemanticSearchService"); SemanticSearchService._privateConstructor(); static final SemanticSearchService instance = SemanticSearchService._privateConstructor(); - static final Computer _computer = Computer.shared(); - static final LRUMap> _queryCache = LRUMap(20); + static final Computer _computer = Computer.shared(); + final LRUMap> _queryCache = LRUMap(20); static const kMinimumSimilarityThreshold = 0.20; - final _logger = Logger("SemanticSearchService"); final _reloadCacheDebouncer = Debouncer( const Duration(milliseconds: 4000), executionInterval: const Duration(milliseconds: 8000), From 90a1481cdf613439986bbe78980d8af029cf2663 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:31:39 +0530 Subject: [PATCH 0116/1179] [mob] refactor --- mobile/lib/main.dart | 6 ++---- mobile/lib/service_locator.dart | 8 +++++++- mobile/lib/services/collections_service.dart | 3 ++- .../face_ml/face_recognition_service.dart | 4 ++-- mobile/lib/services/machine_learning/ml_service.dart | 8 +++----- .../semantic_search/semantic_search_service.dart | 6 +++--- mobile/lib/services/search_service.dart | 4 +--- mobile/lib/ui/settings/advanced_settings_screen.dart | 8 ++++---- .../lib/ui/settings/backup/free_space_options.dart | 12 ++++++------ .../ui/settings/debug/ml_debug_section_widget.dart | 11 +++++------ .../ui/settings/machine_learning_settings_page.dart | 8 +++----- mobile/lib/ui/tabs/user_collections_tab.dart | 5 +++-- mobile/lib/ui/viewer/file/file_details_widget.dart | 3 +-- .../component/multiple_groups_gallery_view.dart | 4 ++-- .../viewer/gallery/photo_grid_size_picker_page.dart | 6 +++--- .../location/dynamic_location_gallery_widget.dart | 4 ++-- mobile/lib/ui/viewer/search_tab/search_tab.dart | 4 ++-- mobile/lib/utils/local_settings.dart | 10 ++-------- 18 files changed, 53 insertions(+), 61 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 4b50abd240..6026fe2bb3 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -53,7 +53,6 @@ import 'package:photos/ui/tools/lock_screen.dart'; import 'package:photos/utils/crypto_util.dart'; import "package:photos/utils/email_util.dart"; import 'package:photos/utils/file_uploader.dart'; -import 'package:photos/utils/local_settings.dart'; import "package:photos/utils/lock_screen_settings.dart"; import 'package:shared_preferences/shared_preferences.dart'; @@ -267,7 +266,6 @@ Future _init(bool isBackground, {String via = ''}) async { _logger.info("SyncService init done"); MemoriesService.instance.init(preferences); - LocalSettings.instance.init(preferences); LocalFileUpdateService.instance.init(preferences); SearchService.instance.init(); StorageBonusService.instance.init(preferences); @@ -295,8 +293,8 @@ Future _init(bool isBackground, {String via = ''}) async { if (flagService.faceSearchEnabled) { unawaited(MLService.instance.init()); } else { - if (LocalSettings.instance.isFaceIndexingEnabled) { - unawaited(LocalSettings.instance.toggleFaceIndexing()); + if (localSettings.isFaceIndexingEnabled) { + unawaited(localSettings.toggleFaceIndexing()); } } PersonService.init( diff --git a/mobile/lib/service_locator.dart b/mobile/lib/service_locator.dart index 397703761e..053be4784e 100644 --- a/mobile/lib/service_locator.dart +++ b/mobile/lib/service_locator.dart @@ -2,6 +2,7 @@ import "package:dio/dio.dart"; import "package:ente_cast/ente_cast.dart"; import "package:ente_cast_normal/ente_cast_normal.dart"; import "package:ente_feature_flag/ente_feature_flag.dart"; +import "package:photos/utils/local_settings.dart"; import "package:shared_preferences/shared_preferences.dart"; class ServiceLocator { @@ -20,7 +21,6 @@ class ServiceLocator { } FlagService? _flagService; - FlagService get flagService { _flagService ??= FlagService( ServiceLocator.instance.prefs, @@ -34,3 +34,9 @@ CastService get castService { _castService ??= CastServiceImpl(); return _castService!; } + +LocalSettings? _localSettings; +LocalSettings get localSettings { + _localSettings ??= LocalSettings(ServiceLocator.instance.prefs); + return _localSettings!; +} diff --git a/mobile/lib/services/collections_service.dart b/mobile/lib/services/collections_service.dart index 3510597bb1..55aa6d6079 100644 --- a/mobile/lib/services/collections_service.dart +++ b/mobile/lib/services/collections_service.dart @@ -30,6 +30,7 @@ import 'package:photos/models/collection/collection_items.dart'; import 'package:photos/models/file/file.dart'; import "package:photos/models/files_split.dart"; import "package:photos/models/metadata/collection_magic.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/services/app_lifecycle_service.dart'; import "package:photos/services/favorites_service.dart"; import 'package:photos/services/file_magic_service.dart'; @@ -399,7 +400,7 @@ class CollectionsService { } Future> getCollectionForOnEnteSection() async { - final AlbumSortKey sortKey = LocalSettings.instance.albumSortKey(); + final AlbumSortKey sortKey = localSettings.albumSortKey(); final List collections = CollectionsService.instance.getCollectionsForUI(); final bool hasFavorites = FavoritesService.instance.hasFavorites(); diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 392a9df20f..e6f2f1a62e 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -14,6 +14,7 @@ import "package:photos/face/db.dart"; import "package:photos/face/model/face.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; @@ -23,7 +24,6 @@ import "package:photos/services/machine_learning/file_ml/remote_fileml_service.d import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/image_ml_util.dart"; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; class FaceRecognitionService { @@ -66,7 +66,7 @@ class FaceRecognitionService { Future sync() async { await _syncPersonFeedback(); - if (LocalSettings.instance.remoteFetchEnabled) { + if (localSettings.remoteFetchEnabled) { } else { _logger.severe( 'Not fetching embeddings because user manually disabled it in debug options', diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 3f2e96aac3..c95ba7920b 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -35,7 +35,6 @@ import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import "package:photos/utils/image_ml_util.dart"; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; @@ -93,8 +92,7 @@ class MLService { /// Only call this function once at app startup, after that you can directly call [runAllML] Future init() async { - if (LocalSettings.instance.isFaceIndexingEnabled == false || - _isInitialized) { + if (localSettings.isFaceIndexingEnabled == false || _isInitialized) { return; } _logger.info("init called"); @@ -104,7 +102,7 @@ class MLService { // Listen on MachineLearningController Bus.instance.on().listen((event) { - if (LocalSettings.instance.isFaceIndexingEnabled == false) { + if (localSettings.isFaceIndexingEnabled == false) { return; } _mlControllerStatus = event.shouldRun; @@ -904,7 +902,7 @@ class MLService { void _logStatus() { final String status = ''' isInternalUser: ${flagService.internalUser} - isFaceIndexingEnabled: ${LocalSettings.instance.isFaceIndexingEnabled} + isFaceIndexingEnabled: ${localSettings.isFaceIndexingEnabled} canRunMLController: $_mlControllerStatus isIndexingOrClusteringRunning: $_isIndexingOrClusteringRunning shouldPauseIndexingAndClustering: $_shouldPauseIndexingAndClustering diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index b398d39747..20f67d8ba7 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -15,13 +15,13 @@ import 'package:photos/events/embedding_updated_event.dart'; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/utils/debouncer.dart"; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:shared_preferences/shared_preferences.dart"; @@ -50,7 +50,7 @@ class SemanticSearchService { get hasInitialized => _hasInitialized; Future init() async { - if (!LocalSettings.instance.isFaceIndexingEnabled) { + if (!localSettings.isFaceIndexingEnabled) { return; } if (_hasInitialized) { @@ -87,7 +87,7 @@ class SemanticSearchService { } bool isMagicSearchEnabledAndReady() { - return LocalSettings.instance.isFaceIndexingEnabled && + return localSettings.isFaceIndexingEnabled && _textModelIsLoaded && _cachedImageEmbeddings.isNotEmpty; } diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index c850576bb1..b9b6736e3c 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -39,7 +39,6 @@ import "package:photos/ui/viewer/location/location_screen.dart"; import "package:photos/ui/viewer/people/cluster_page.dart"; import "package:photos/ui/viewer/people/people_page.dart"; import 'package:photos/utils/date_time_util.dart'; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/navigation_util.dart"; import 'package:tuple/tuple.dart'; @@ -178,8 +177,7 @@ class SearchService { } Future> getMagicSectionResutls() async { - if (LocalSettings.instance.isFaceIndexingEnabled && - flagService.internalUser) { + if (localSettings.isFaceIndexingEnabled && flagService.internalUser) { return MagicCacheService.instance.getMagicGenericSearchResult(); } else { return []; diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index 2a8733bc00..6792f254bd 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -3,6 +3,7 @@ import "dart:async"; import 'package:flutter/material.dart'; import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/memories_service.dart"; import "package:photos/services/user_remote_flag_service.dart"; import 'package:photos/theme/ente_theme.dart'; @@ -15,7 +16,6 @@ import "package:photos/ui/components/toggle_switch_widget.dart"; import "package:photos/ui/settings/machine_learning_settings_page.dart"; import 'package:photos/ui/tools/debug/app_storage_viewer.dart'; import 'package:photos/ui/viewer/gallery/photo_grid_size_picker_page.dart'; -import 'package:photos/utils/local_settings.dart'; import 'package:photos/utils/navigation_util.dart'; class AdvancedSettingsScreen extends StatefulWidget { @@ -30,7 +30,7 @@ class _AdvancedSettingsScreenState extends State { @override void initState() { - _photoGridSize = LocalSettings.instance.getPhotoGridSize(); + _photoGridSize = localSettings.getPhotoGridSize(); super.initState(); } @@ -101,8 +101,8 @@ class _AdvancedSettingsScreenState extends State { const PhotoGridSizePickerPage(), ).then((value) { setState(() { - _photoGridSize = LocalSettings.instance - .getPhotoGridSize(); + _photoGridSize = + localSettings.getPhotoGridSize(); }); }); }, diff --git a/mobile/lib/ui/settings/backup/free_space_options.dart b/mobile/lib/ui/settings/backup/free_space_options.dart index 1479dfdba8..1c900edb77 100644 --- a/mobile/lib/ui/settings/backup/free_space_options.dart +++ b/mobile/lib/ui/settings/backup/free_space_options.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; import "package:photos/models/backup_status.dart"; import "package:photos/models/duplicate_files.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/deduplication_service.dart"; import "package:photos/services/sync_service.dart"; import "package:photos/services/update_service.dart"; @@ -23,7 +24,6 @@ import "package:photos/ui/tools/free_space_page.dart"; import "package:photos/ui/viewer/gallery/large_files_page.dart"; import "package:photos/utils/data_util.dart"; import "package:photos/utils/dialog_util.dart"; -import 'package:photos/utils/local_settings.dart'; import 'package:photos/utils/navigation_util.dart'; import "package:photos/utils/toast_util.dart"; @@ -202,9 +202,9 @@ class _FreeUpSpaceOptionsScreenState extends State { onTap: () async { await routeToPage( context, - LargeFilesPagePage(), + LargeFilesPagePage(), ); - }, + }, ), MenuSectionDescriptionWidget( content: S.of(context).viewLargeFilesDesc, @@ -227,9 +227,9 @@ class _FreeUpSpaceOptionsScreenState extends State { } void _showSpaceFreedDialog(BackupStatus status) { - if (LocalSettings.instance.shouldPromptToRateUs()) { - LocalSettings.instance.setRateUsShownCount( - LocalSettings.instance.getRateUsShownCount() + 1, + if (localSettings.shouldPromptToRateUs()) { + localSettings.setRateUsShownCount( + localSettings.getRateUsShownCount() + 1, ); showChoiceDialog( context, diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 4aa0d85224..5eed505b86 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -6,6 +6,7 @@ import "package:photos/core/event_bus.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/person.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; @@ -16,7 +17,6 @@ import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/settings/common_settings.dart'; import "package:photos/utils/dialog_util.dart"; -import "package:photos/utils/local_settings.dart"; import 'package:photos/utils/toast_util.dart'; class MLDebugSectionWidget extends StatefulWidget { @@ -63,7 +63,7 @@ class _MLDebugSectionWidgetState extends State { builder: (context, snapshot) { if (snapshot.hasData) { return CaptionedTextWidget( - title: LocalSettings.instance.isFaceIndexingEnabled + title: localSettings.isFaceIndexingEnabled ? "Disable faces (${snapshot.data!} files done)" : "Enable faces (${snapshot.data!} files done)", ); @@ -76,8 +76,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - final isEnabled = - await LocalSettings.instance.toggleFaceIndexing(); + final isEnabled = await localSettings.toggleFaceIndexing(); if (!isEnabled) { MLService.instance.pauseIndexingAndClustering(); } @@ -93,7 +92,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: LocalSettings.instance.remoteFetchEnabled + title: localSettings.remoteFetchEnabled ? "Remote fetch enabled" : "Remote fetch disabled", ), @@ -102,7 +101,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - await LocalSettings.instance.toggleRemoteFetch(); + await localSettings.toggleRemoteFetch(); if (mounted) { setState(() {}); } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 6fb617160a..7482057588 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -19,7 +19,6 @@ import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; import "package:photos/utils/data_util.dart"; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/wakelock_util.dart"; @@ -107,7 +106,7 @@ class _MachineLearningSettingsPageState Widget _getMlSettings(BuildContext context) { final colorScheme = getEnteColorScheme(context); - final hasEnabled = LocalSettings.instance.isFaceIndexingEnabled; + final hasEnabled = localSettings.isFaceIndexingEnabled; return Column( children: [ MenuItemWidget( @@ -116,10 +115,9 @@ class _MachineLearningSettingsPageState ), menuItemColor: colorScheme.fillFaint, trailingWidget: ToggleSwitchWidget( - value: () => LocalSettings.instance.isFaceIndexingEnabled, + value: () => localSettings.isFaceIndexingEnabled, onChanged: () async { - final isEnabled = - await LocalSettings.instance.toggleFaceIndexing(); + final isEnabled = await localSettings.toggleFaceIndexing(); if (isEnabled) { await MLService.instance.init(); await SemanticSearchService.instance.init(); diff --git a/mobile/lib/ui/tabs/user_collections_tab.dart b/mobile/lib/ui/tabs/user_collections_tab.dart index 20a012d0c2..512248dd0c 100644 --- a/mobile/lib/ui/tabs/user_collections_tab.dart +++ b/mobile/lib/ui/tabs/user_collections_tab.dart @@ -10,6 +10,7 @@ import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/events/user_logged_out_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/collection/collection.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/collections_service.dart'; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/collections/button/archived_button.dart"; @@ -88,7 +89,7 @@ class _UserCollectionsTabState extends State setState(() {}); }); }); - sortKey = LocalSettings.instance.albumSortKey(); + sortKey = localSettings.albumSortKey(); } @override @@ -277,7 +278,7 @@ class _UserCollectionsTabState extends State ); if (selectedValue != null) { sortKey = AlbumSortKey.values[selectedValue]; - await LocalSettings.instance.setAlbumSortKey(sortKey!); + await localSettings.setAlbumSortKey(sortKey!); setState(() {}); } }, diff --git a/mobile/lib/ui/viewer/file/file_details_widget.dart b/mobile/lib/ui/viewer/file/file_details_widget.dart index d726d655f7..2a0036b7d2 100644 --- a/mobile/lib/ui/viewer/file/file_details_widget.dart +++ b/mobile/lib/ui/viewer/file/file_details_widget.dart @@ -34,7 +34,6 @@ import "package:photos/ui/viewer/file_details/location_tags_widget.dart"; import "package:photos/ui/viewer/file_details/video_exif_item.dart"; import "package:photos/utils/exif_util.dart"; import "package:photos/utils/file_util.dart"; -import "package:photos/utils/local_settings.dart"; class FileDetailsWidget extends StatefulWidget { final EnteFile file; @@ -281,7 +280,7 @@ class _FileDetailsWidgetState extends State { ]); } - if (LocalSettings.instance.isFaceIndexingEnabled) { + if (localSettings.isFaceIndexingEnabled) { fileDetailsTiles.addAll([ FacesItemWidget(file), const FileDetailsDivider(), diff --git a/mobile/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart b/mobile/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart index e7ad53f461..d4ecf73520 100644 --- a/mobile/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart +++ b/mobile/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart @@ -6,6 +6,7 @@ import "package:photos/ente_theme_data.dart"; import "package:photos/events/files_updated_event.dart"; import 'package:photos/models/file/file.dart'; import "package:photos/models/selected_files.dart"; +import "package:photos/service_locator.dart"; import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/huge_listview/huge_listview.dart"; import 'package:photos/ui/viewer/gallery/component/group/lazy_group_gallery.dart'; @@ -13,7 +14,6 @@ import "package:photos/ui/viewer/gallery/component/group/type.dart"; import "package:photos/ui/viewer/gallery/gallery.dart"; import "package:photos/ui/viewer/gallery/state/gallery_context_state.dart"; import "package:photos/utils/data_util.dart"; -import "package:photos/utils/local_settings.dart"; import "package:scrollable_positioned_list/scrollable_positioned_list.dart"; /* @@ -114,7 +114,7 @@ class MultipleGroupsGalleryView extends StatelessWidget { enableFileGrouping, showSelectAllByDefault, logTag: logTag, - photoGridSize: LocalSettings.instance.getPhotoGridSize(), + photoGridSize: localSettings.getPhotoGridSize(), limitSelectionToOne: limitSelectionToOne, ); if (header != null && index == 0) { diff --git a/mobile/lib/ui/viewer/gallery/photo_grid_size_picker_page.dart b/mobile/lib/ui/viewer/gallery/photo_grid_size_picker_page.dart index 3e89cf735b..6ca3d0fb70 100644 --- a/mobile/lib/ui/viewer/gallery/photo_grid_size_picker_page.dart +++ b/mobile/lib/ui/viewer/gallery/photo_grid_size_picker_page.dart @@ -3,13 +3,13 @@ import 'package:photos/core/constants.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/force_reload_home_gallery_event.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/divider_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/components/title_bar_title_widget.dart'; import 'package:photos/ui/components/title_bar_widget.dart'; -import 'package:photos/utils/local_settings.dart'; import 'package:photos/utils/separators_util.dart'; class PhotoGridSizePickerPage extends StatelessWidget { @@ -68,7 +68,7 @@ class _ItemsWidgetState extends State { final List gridSizes = []; @override void initState() { - currentGridSize = LocalSettings.instance.getPhotoGridSize(); + currentGridSize = localSettings.getPhotoGridSize(); for (int gridSize = photoGridSizeMin; gridSize <= photoGridSizeMax; gridSize++) { @@ -111,7 +111,7 @@ class _ItemsWidgetState extends State { isBottomBorderRadiusRemoved: true, showOnlyLoadingState: true, onTap: () async { - await LocalSettings.instance.setPhotoGridSize(gridSize).then( + await localSettings.setPhotoGridSize(gridSize).then( (value) => setState(() { currentGridSize = gridSize; }), diff --git a/mobile/lib/ui/viewer/location/dynamic_location_gallery_widget.dart b/mobile/lib/ui/viewer/location/dynamic_location_gallery_widget.dart index 04dbcd6a61..97ae881fda 100644 --- a/mobile/lib/ui/viewer/location/dynamic_location_gallery_widget.dart +++ b/mobile/lib/ui/viewer/location/dynamic_location_gallery_widget.dart @@ -6,12 +6,12 @@ import "package:photos/core/constants.dart"; import "package:photos/db/files_db.dart"; import 'package:photos/models/file/file.dart'; import "package:photos/models/file_load_result.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/filter/db_filters.dart"; import "package:photos/services/location_service.dart"; import 'package:photos/states/location_state.dart'; import "package:photos/ui/viewer/gallery/gallery.dart"; -import "package:photos/utils/local_settings.dart"; ///This gallery will get rebuilt with the updated radius when ///InheritedLocationTagData notifies a change in radius. @@ -127,7 +127,7 @@ class _DynamicLocationGalleryWidgetState } double _galleryHeight(int fileCount, double widthOfGrid) { - final photoGridSize = LocalSettings.instance.getPhotoGridSize(); + final photoGridSize = localSettings.getPhotoGridSize(); final totalWhiteSpaceBetweenPhotos = galleryGridSpacing * (photoGridSize - 1); diff --git a/mobile/lib/ui/viewer/search_tab/search_tab.dart b/mobile/lib/ui/viewer/search_tab/search_tab.dart index 07a13d9e2b..e6ffb43da8 100644 --- a/mobile/lib/ui/viewer/search_tab/search_tab.dart +++ b/mobile/lib/ui/viewer/search_tab/search_tab.dart @@ -8,6 +8,7 @@ import "package:photos/models/search/generic_search_result.dart"; import "package:photos/models/search/index_of_indexed_stack.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/search/search_types.dart"; +import "package:photos/service_locator.dart"; import "package:photos/states/all_sections_examples_state.dart"; import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/viewer/search/result/no_result_widget.dart"; @@ -21,7 +22,6 @@ import "package:photos/ui/viewer/search_tab/locations_section.dart"; import "package:photos/ui/viewer/search_tab/magic_section.dart"; import "package:photos/ui/viewer/search_tab/moments_section.dart"; import "package:photos/ui/viewer/search_tab/people_section.dart"; -import "package:photos/utils/local_settings.dart"; class SearchTab extends StatefulWidget { const SearchTab({Key? key}) : super(key: key); @@ -115,7 +115,7 @@ class _AllSearchSectionsState extends State { itemBuilder: (context, index) { switch (searchTypes[index]) { case SectionType.face: - if (!LocalSettings.instance.isFaceIndexingEnabled) { + if (!localSettings.isFaceIndexingEnabled) { return const SizedBox.shrink(); } return PeopleSection( diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index 481b894659..1ef00deaaf 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -8,9 +8,6 @@ enum AlbumSortKey { } class LocalSettings { - LocalSettings._privateConstructor(); - - static final LocalSettings instance = LocalSettings._privateConstructor(); static const kCollectionSortPref = "collection_sort_pref"; static const kPhotoGridSize = "photo_grid_size"; static const kEnableMagicSearch = "enable_magic_search"; @@ -19,11 +16,9 @@ class LocalSettings { static const kRateUsShownCount = "rate_us_shown_count"; static const kRateUsPromptThreshold = 2; - late SharedPreferences _prefs; + final SharedPreferences _prefs; - void init(SharedPreferences preferences) { - _prefs = preferences; - } + LocalSettings(this._prefs); AlbumSortKey albumSortKey() { return AlbumSortKey.values[_prefs.getInt(kCollectionSortPref) ?? 0]; @@ -77,5 +72,4 @@ class LocalSettings { await _prefs.setBool("remoteFetchEnabled", !remoteFetchEnabled); } //#endregion - } From 3a3cb016ed0c33349f3e95d9a6ba6b3998f54424 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 12:16:24 +0200 Subject: [PATCH 0117/1179] [mob][photos] Run clip text in ML isolate --- .../services/machine_learning/ml_service.dart | 33 ++++++++++++++++++- .../semantic_search_service.dart | 25 +++----------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index fb2d9c1251..0922212881 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -34,14 +34,17 @@ import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.d import 'package:photos/services/machine_learning/ml_exceptions.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; +import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; -enum FaceMlOperation { analyzeImage, loadModels } +enum FaceMlOperation { analyzeImage, loadModels, runClipText } /// This class is responsible for running the full face ml pipeline on images. /// @@ -662,6 +665,10 @@ class MLService { await ClipImageEncoder.instance.loadModel(useEntePlugin: true); sendPort.send(true); break; + case FaceMlOperation.runClipText: + final textEmbedding = await ClipTextEncoder.predict(args); + sendPort.send(List.from(textEmbedding, growable: false)); + break; } } catch (e, stackTrace) { dev.log( @@ -796,6 +803,30 @@ class MLService { return result; } + Future> runClipTextInIsolate(String query) async { + try { + final int clipAddress = ClipTextEncoder.instance.sessionAddress; + const remotePath = ClipTextTokenizer.kVocabRemotePath; + final String tokenizerVocabPath = + await RemoteAssetsService.instance.getAssetPath(remotePath); + final textEmbedding = await _runInIsolate( + ( + FaceMlOperation.runClipText, + { + "text": query, + "address": clipAddress, + "vocabPath": tokenizerVocabPath, + "useEntePlugin": Platform.isAndroid, + } + ), + ) as List; + return textEmbedding; + } catch (e, s) { + _logger.severe("Could not run clip text in isolate", e, s); + rethrow; + } + } + static Future _analyzeImageSync(Map args) async { try { final int enteFileID = args["enteFileID"] as int; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index caf0a879f0..81100df3ed 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -17,11 +17,10 @@ import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; import "package:photos/services/machine_learning/ml_result.dart"; +import "package:photos/services/machine_learning/ml_service.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; -import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -296,25 +295,9 @@ class SemanticSearchService { if (cachedResult != null) { return cachedResult; } - try { - final int clipAddress = ClipTextEncoder.instance.sessionAddress; - const remotePath = ClipTextTokenizer.kVocabRemotePath; - final String tokenizerVocabPath = - await RemoteAssetsService.instance.getAssetPath(remotePath); - final textEmbedding = await _computer.compute( - ClipTextEncoder.predict, - param: { - "text": query, - "address": clipAddress, - "vocabPath": tokenizerVocabPath, - }, - ) as List; - _queryCache.put(query, textEmbedding); - return textEmbedding; - } catch (e) { - _logger.severe("Could not get text embedding", e); - return []; - } + final textEmbedding = await MLService.instance.runClipTextInIsolate(query); + _queryCache.put(query, textEmbedding); + return textEmbedding; } Future> _getSimilarities( From 37285a087a08dbf6c7c1094367252d72093db713 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 12:21:36 +0200 Subject: [PATCH 0118/1179] [mob][photos] Simplify tokenizer path --- mobile/lib/services/machine_learning/ml_service.dart | 3 +-- .../semantic_search/clip/clip_text_encoder.dart | 7 +++++-- .../semantic_search/clip/clip_text_tokenizer.dart | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 0922212881..fd4a31e796 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -35,7 +35,6 @@ import 'package:photos/services/machine_learning/ml_exceptions.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; @@ -806,7 +805,7 @@ class MLService { Future> runClipTextInIsolate(String query) async { try { final int clipAddress = ClipTextEncoder.instance.sessionAddress; - const remotePath = ClipTextTokenizer.kVocabRemotePath; + final String remotePath = ClipTextEncoder.instance.vocabRemotePath; final String tokenizerVocabPath = await RemoteAssetsService.instance.getAssetPath(remotePath); final textEmbedding = await _runInIsolate( diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 2c3e6b7e8a..b73ea93d90 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -10,13 +10,15 @@ import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_ import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { - static const kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; + static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; + static const _kVocabRemotePath = "bpe_simple_vocab_16e6.txt"; // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; static const _modelName = "ClipTextEncoder"; @override - String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; + String get modelRemotePath => kModelBucketEndpoint + _kRemoteBucketModelPath; + String get vocabRemotePath => kModelBucketEndpoint + _kVocabRemotePath; @override Logger get logger => _logger; @@ -34,6 +36,7 @@ class ClipTextEncoder extends MlModel { final text = args["text"]; final address = args["address"] as int; final vocabPath = args["vocabPath"] as String; + final useEntePlugin = args["useEntePlugin"] ?? false; final List tokenize = await ClipTextTokenizer.instance.tokenize(text, vocabPath); final int32list = Int32List.fromList(tokenize); diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart index a0c3d1c6c0..e8d317dd43 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart @@ -6,8 +6,6 @@ import "package:html_unescape/html_unescape.dart"; import "package:tuple/tuple.dart"; class ClipTextTokenizer { - static const String kVocabRemotePath = - "https://models.ente.io/bpe_simple_vocab_16e6.txt"; static const int totalTokens = 77; late String vocabulary; From e6e9948fd88f3a988e2fc3eb0cfc20e7ece94a00 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 16:12:19 +0530 Subject: [PATCH 0119/1179] [mob] Avoid building fileSelection when no file is selected --- .../lib/ui/viewer/actions/file_selection_actions_widget.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index 9485326abb..a8aac620fa 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -114,6 +114,9 @@ class _FileSelectionActionsWidgetState @override Widget build(BuildContext context) { + if (widget.selectedFiles.files.isEmpty) { + return const SizedBox(); + } final ownedFilesCount = split.ownedByCurrentUser.length; final ownedAndPendingUploadFilesCount = ownedFilesCount + split.pendingUploads.length; From fcd1ec3b05da37d742ab1b5f4bd1ada845de225c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 24 Jul 2024 17:28:45 +0530 Subject: [PATCH 0120/1179] [mob] Download models before interence --- .../services/machine_learning/ml_model.dart | 4 +++ .../services/machine_learning/ml_service.dart | 31 ++++++++++++++++++- .../machine_learning_settings_page.dart | 4 ++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 1127f57d27..261a741c5e 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -38,6 +38,10 @@ abstract class MlModel { } } + Future downloadModel() async { + await RemoteAssetsService.instance.getAssetIfUpdated(modelRemotePath); + } + Future _loadModelWithEntePlugin( String modelName, String modelPath, diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index c95ba7920b..257d9c074d 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -33,7 +33,9 @@ import "package:photos/services/machine_learning/file_ml/remote_fileml_service.d import 'package:photos/services/machine_learning/ml_exceptions.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; +import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; @@ -65,11 +67,13 @@ class MLService { factory MLService() => instance; final _initModelLock = Lock(); + final _downloadModelLock = Lock(); final _functionLock = Lock(); final _initIsolateLock = Lock(); bool _isInitialized = false; bool _isModelsInitialized = false; + bool areModelDownloaded = false; bool _isModelsInitUsingEntePlugin = false; bool _isIsolateSpawned = false; @@ -525,6 +529,31 @@ class MLService { return actuallyRanML; } + Future downloadModels() { + if (areModelDownloaded) { + _logger.finest("Models already downloaded"); + return Future.value(); + } + if (_downloadModelLock.locked) { + _logger.finest("Download models already in progress"); + } + return _downloadModelLock.synchronized(() async { + if (areModelDownloaded) { + return; + } + _logger.info('Downloading models'); + await Future.wait([ + FaceDetectionService.instance.downloadModel(), + FaceEmbeddingService.instance.downloadModel(), + ClipImageEncoder.instance.downloadModel(), + ClipImageEncoder.instance.downloadModel(), + RemoteAssetsService.instance + .getAsset(ClipTextTokenizer.kVocabRemotePath), + ]); + areModelDownloaded = true; + }); + } + Future _initModelsUsingFfiBasedPlugin() async { return _initModelLock.synchronized(() async { if (_isModelsInitialized) return; @@ -632,7 +661,7 @@ class MLService { Future _ensureReadyForInference() async { await _initIsolate(); - await _initModelsUsingFfiBasedPlugin(); + await downloadModels(); if (Platform.isAndroid) { await _initModelUsingEntePlugin(); } else { diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 7482057588..65cb61e5e2 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -120,6 +120,8 @@ class _MachineLearningSettingsPageState final isEnabled = await localSettings.toggleFaceIndexing(); if (isEnabled) { await MLService.instance.init(); + MLService.instance.downloadModels().ignore(); + await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); } else {} @@ -136,7 +138,7 @@ class _MachineLearningSettingsPageState height: 12, ), hasEnabled - ? MLService.instance.allModelsLoaded + ? MLService.instance.areModelDownloaded ? const MLStatusWidget() : const ModelLoadingState() : const SizedBox.shrink(), From 68801398885e56848968cb27139fc73f797f79d1 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 15:53:26 +0200 Subject: [PATCH 0121/1179] [mob][photos] Separate ML Isolate --- .../services/machine_learning/ml_isolate.dart | 265 +++++++++++++++++ .../services/machine_learning/ml_service.dart | 276 ++---------------- .../semantic_search_service.dart | 4 +- 3 files changed, 284 insertions(+), 261 deletions(-) create mode 100644 mobile/lib/services/machine_learning/ml_isolate.dart diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart new file mode 100644 index 0000000000..720f45d8c4 --- /dev/null +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -0,0 +1,265 @@ +import "dart:async"; +import "dart:io" show Platform; +import "dart:isolate"; + +import "package:dart_ui_isolate/dart_ui_isolate.dart"; +import "package:flutter/foundation.dart" show debugPrint, kDebugMode; +import "package:logging/logging.dart"; +import "package:photos/core/error-reporting/super_logging.dart"; +import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; +import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; +import 'package:photos/services/machine_learning/ml_result.dart'; +import "package:photos/services/machine_learning/ml_service.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; +import "package:photos/services/remote_assets_service.dart"; +import "package:photos/utils/ml_util.dart"; +import "package:synchronized/synchronized.dart"; + +enum MLOperation { analyzeImage, loadModels, runClipText } + +class MLIsolate { + static final _logger = Logger("MLIsolate"); + + Timer? _inactivityTimer; + final Duration _inactivityDuration = const Duration(seconds: 120); + int _activeTasks = 0; + + final _functionLock = Lock(); + final _initIsolateLock = Lock(); + + late DartUiIsolate _isolate; + late ReceivePort _receivePort = ReceivePort(); + late SendPort _mainSendPort; + + bool _isIsolateSpawned = false; + + // Singleton pattern + MLIsolate._privateConstructor(); + static final instance = MLIsolate._privateConstructor(); + factory MLIsolate() => instance; + + Future _initIsolate() async { + return _initIsolateLock.synchronized(() async { + if (_isIsolateSpawned) return; + _logger.info("initIsolate called"); + + _receivePort = ReceivePort(); + + try { + _isolate = await DartUiIsolate.spawn( + _isolateMain, + _receivePort.sendPort, + ); + _mainSendPort = await _receivePort.first as SendPort; + _isIsolateSpawned = true; + + _resetInactivityTimer(); + _logger.info('initIsolate done'); + } catch (e) { + _logger.severe('Could not spawn isolate', e); + _isIsolateSpawned = false; + } + }); + } + + /// The main execution function of the isolate. + @pragma('vm:entry-point') + static void _isolateMain(SendPort mainSendPort) async { + Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; + Logger.root.onRecord.listen((LogRecord rec) { + debugPrint('[MLIsolate] ${rec.toPrettyString()}'); + }); + final receivePort = ReceivePort(); + mainSendPort.send(receivePort.sendPort); + receivePort.listen((message) async { + final functionIndex = message[0] as int; + final function = MLOperation.values[functionIndex]; + final args = message[1] as Map; + final sendPort = message[2] as SendPort; + + try { + switch (function) { + case MLOperation.analyzeImage: + final time = DateTime.now(); + final MLResult result = await MLService.analyzeImageSync(args); + _logger.info( + "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", + ); + sendPort.send(result.toJsonString()); + break; + case MLOperation.loadModels: + await FaceDetectionService.instance.loadModel(useEntePlugin: true); + await FaceEmbeddingService.instance.loadModel(useEntePlugin: true); + await ClipImageEncoder.instance.loadModel(useEntePlugin: true); + sendPort.send(true); + break; + case MLOperation.runClipText: + final textEmbedding = await ClipTextEncoder.predict(args); + sendPort.send(List.from(textEmbedding, growable: false)); + break; + } + } catch (e, s) { + _logger.severe("Error in FaceML isolate", e, s); + sendPort.send({'error': e.toString(), 'stackTrace': s.toString()}); + } + }); + } + + /// The common method to run any operation in the isolate. It sends the [message] to [_isolateMain] and waits for the result. + Future _runInIsolate( + (MLOperation, Map) message, + ) async { + await _initIsolate(); + return _functionLock.synchronized(() async { + _resetInactivityTimer(); + + if (message.$1 == MLOperation.analyzeImage && + MLService.instance.shouldPauseIndexingAndClustering) { + return null; + } + + final completer = Completer(); + final answerPort = ReceivePort(); + + _activeTasks++; + _mainSendPort.send([message.$1.index, message.$2, answerPort.sendPort]); + + answerPort.listen((receivedMessage) { + if (receivedMessage is Map && receivedMessage.containsKey('error')) { + // Handle the error + final errorMessage = receivedMessage['error']; + final errorStackTrace = receivedMessage['stackTrace']; + final exception = Exception(errorMessage); + final stackTrace = StackTrace.fromString(errorStackTrace); + completer.completeError(exception, stackTrace); + } else { + completer.complete(receivedMessage); + } + }); + _activeTasks--; + + return completer.future; + }); + } + + /// Resets a timer that kills the isolate after a certain amount of inactivity. + /// + /// Should be called after initialization (e.g. inside `init()`) and after every call to isolate (e.g. inside `_runInIsolate()`) + void _resetInactivityTimer() { + _inactivityTimer?.cancel(); + _inactivityTimer = Timer(_inactivityDuration, () { + if (_activeTasks > 0) { + _logger.info('Tasks are still running. Delaying isolate disposal.'); + // Optionally, reschedule the timer to check again later. + _resetInactivityTimer(); + } else { + _logger.info( + 'Clustering Isolate has been inactive for ${_inactivityDuration.inSeconds} seconds with no tasks running. Killing isolate.', + ); + _dispose(); + } + }); + } + + void _dispose() async { + if (!_isIsolateSpawned) return; + _logger.info('Disposing isolate and models'); + // await _releaseModels(); TODO: Implement this + _isIsolateSpawned = false; + _isolate.kill(); + _receivePort.close(); + _inactivityTimer?.cancel(); + } + + /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. + Future analyzeImage( + FileMLInstruction instruction, + ) async { + final String filePath = await getImagePathForML(instruction.enteFile); + + final Stopwatch stopwatch = Stopwatch()..start(); + late MLResult result; + + try { + final resultJsonString = await _runInIsolate( + ( + MLOperation.analyzeImage, + { + "enteFileID": instruction.enteFile.uploadedFileID ?? -1, + "filePath": filePath, + "runFaces": instruction.shouldRunFaces, + "runClip": instruction.shouldRunClip, + "faceDetectionAddress": + FaceDetectionService.instance.sessionAddress, + "faceEmbeddingAddress": + FaceEmbeddingService.instance.sessionAddress, + "clipImageAddress": ClipImageEncoder.instance.sessionAddress, + } + ), + ) as String?; + if (resultJsonString == null) { + if (!MLService.instance.shouldPauseIndexingAndClustering) { + _logger.severe('Analyzing image in isolate is giving back null'); + } + return null; + } + result = MLResult.fromJsonString(resultJsonString); + } catch (e, s) { + _logger.severe( + "Could not analyze image with ID ${instruction.enteFile.uploadedFileID} \n", + e, + s, + ); + debugPrint( + "This image with ID ${instruction.enteFile.uploadedFileID} has name ${instruction.enteFile.displayName}.", + ); + final resultBuilder = + MLResult.fromEnteFileID(instruction.enteFile.uploadedFileID!) + ..errorOccurred(); + return resultBuilder; + } + stopwatch.stop(); + _logger.info( + "Finished Analyze image with uploadedFileID ${instruction.enteFile.uploadedFileID}, in " + "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", + ); + + return result; + } + + Future> runClipText(String query) async { + try { + final int clipAddress = ClipTextEncoder.instance.sessionAddress; + final String remotePath = ClipTextEncoder.instance.vocabRemotePath; + final String tokenizerVocabPath = + await RemoteAssetsService.instance.getAssetPath(remotePath); + final textEmbedding = await _runInIsolate( + ( + MLOperation.runClipText, + { + "text": query, + "address": clipAddress, + "vocabPath": tokenizerVocabPath, + "useEntePlugin": Platform.isAndroid, + } + ), + ) as List; + return textEmbedding; + } catch (e, s) { + _logger.severe("Could not run clip text in isolate", e, s); + rethrow; + } + } + + Future loadModels() async { + try { + await _runInIsolate( + (MLOperation.loadModels, {}), + ); + } catch (e, s) { + _logger.severe("Could not load models in isolate", e, s); + rethrow; + } + } +} diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index fd4a31e796..1f9fe06cf9 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -1,15 +1,12 @@ import "dart:async"; import "dart:developer" as dev show log; import "dart:io" show File, Platform; -import "dart:isolate"; import "dart:math" show min; import "dart:typed_data" show Uint8List, ByteData; -import "package:dart_ui_isolate/dart_ui_isolate.dart"; -import "package:flutter/foundation.dart" show debugPrint, kDebugMode; +import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; import "package:package_info_plus/package_info_plus.dart"; -import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; import "package:photos/events/machine_learning_control_event.dart"; @@ -32,34 +29,18 @@ import "package:photos/services/machine_learning/face_ml/person/person_service.d import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; +import "package:photos/services/machine_learning/ml_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; -import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; -enum FaceMlOperation { analyzeImage, loadModels, runClipText } - -/// This class is responsible for running the full face ml pipeline on images. -/// -/// WARNING: For getting the ML results needed for the UI, you should use `FaceSearchService` instead of this class! -/// -/// The pipeline consists of face detection, face alignment and face embedding. class MLService { - final _logger = Logger("FaceMlService"); - - // Flutter isolate things for running the image ml pipeline - Timer? _inactivityTimer; - final Duration _inactivityDuration = const Duration(seconds: 120); - int _activeTasks = 0; - late DartUiIsolate _isolate; - late ReceivePort _receivePort = ReceivePort(); - late SendPort _mainSendPort; + final _logger = Logger("MLService"); // Singleton pattern MLService._privateConstructor(); @@ -67,13 +48,10 @@ class MLService { factory MLService() => instance; final _initModelLock = Lock(); - final _functionLock = Lock(); - final _initIsolateLock = Lock(); bool _isInitialized = false; bool _isModelsInitialized = false; bool _isModelsInitUsingEntePlugin = false; - bool _isIsolateSpawned = false; late String client; @@ -87,7 +65,7 @@ class MLService { bool _showClusteringIsHappening = false; bool _mlControllerStatus = false; bool _isIndexingOrClusteringRunning = false; - bool _shouldPauseIndexingAndClustering = false; + bool shouldPauseIndexingAndClustering = false; static const int _fileDownloadLimit = 10; static const _kForceClusteringFaceCount = 8000; @@ -110,8 +88,8 @@ class MLService { } _mlControllerStatus = event.shouldRun; if (_mlControllerStatus) { - if (_shouldPauseIndexingAndClustering) { - _shouldPauseIndexingAndClustering = false; + if (shouldPauseIndexingAndClustering) { + shouldPauseIndexingAndClustering = false; _logger.info( "MLController allowed running ML, faces indexing undoing previous pause", ); @@ -160,7 +138,7 @@ class MLService { void pauseIndexingAndClustering() { if (_isIndexingOrClusteringRunning) { - _shouldPauseIndexingAndClustering = true; + shouldPauseIndexingAndClustering = true; } } @@ -191,7 +169,7 @@ class MLService { } final futures = >[]; for (final instruction in chunk) { - if (_shouldPauseIndexingAndClustering) { + if (shouldPauseIndexingAndClustering) { _logger.info("indexAllImages() was paused, stopping"); break outerLoop; } @@ -214,7 +192,7 @@ class MLService { _logger.severe("indexAllImages failed", e, s); } finally { _isIndexingOrClusteringRunning = false; - _shouldPauseIndexingAndClustering = false; + shouldPauseIndexingAndClustering = false; } } @@ -275,7 +253,7 @@ class MLService { int bucket = 1; while (true) { - if (_shouldPauseIndexingAndClustering) { + if (shouldPauseIndexingAndClustering) { _logger.info( "MLController does not allow running ML, stopping before clustering bucket $bucket", ); @@ -385,7 +363,7 @@ class MLService { } finally { _showClusteringIsHappening = false; _isIndexingOrClusteringRunning = false; - _shouldPauseIndexingAndClustering = false; + shouldPauseIndexingAndClustering = false; } } @@ -397,11 +375,11 @@ class MLService { bool actuallyRanML = false; try { - final MLResult? result = await _analyzeImageInSingleIsolate( + final MLResult? result = await MLIsolate.instance.analyzeImage( instruction, ); if (result == null) { - if (!_shouldPauseIndexingAndClustering) { + if (!shouldPauseIndexingAndClustering) { _logger.severe( "Failed to analyze image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", ); @@ -562,9 +540,7 @@ class MLService { // Initialize models try { - await _runInIsolate( - (FaceMlOperation.loadModels, {}), - ); + await MLIsolate.instance.loadModels(); _isModelsInitUsingEntePlugin = true; } catch (e, s) { _logger.severe("Could not initialize clip image", e, s); @@ -599,32 +575,7 @@ class MLService { }); } - Future _initIsolate() async { - return _initIsolateLock.synchronized(() async { - if (_isIsolateSpawned) return; - _logger.info("initIsolate called"); - - _receivePort = ReceivePort(); - - try { - _isolate = await DartUiIsolate.spawn( - _isolateMain, - _receivePort.sendPort, - ); - _mainSendPort = await _receivePort.first as SendPort; - _isIsolateSpawned = true; - - _resetInactivityTimer(); - _logger.info('initIsolate done'); - } catch (e) { - _logger.severe('Could not spawn isolate', e); - _isIsolateSpawned = false; - } - }); - } - Future _ensureReadyForInference() async { - await _initIsolate(); await _initModelsUsingFfiBasedPlugin(); if (Platform.isAndroid) { await _initModelUsingEntePlugin(); @@ -633,200 +584,7 @@ class MLService { } } - /// The main execution function of the isolate. - @pragma('vm:entry-point') - static void _isolateMain(SendPort mainSendPort) async { - Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; - Logger.root.onRecord.listen((LogRecord rec) { - debugPrint('[MLIsolate] ${rec.toPrettyString()}'); - }); - final receivePort = ReceivePort(); - mainSendPort.send(receivePort.sendPort); - receivePort.listen((message) async { - final functionIndex = message[0] as int; - final function = FaceMlOperation.values[functionIndex]; - final args = message[1] as Map; - final sendPort = message[2] as SendPort; - - try { - switch (function) { - case FaceMlOperation.analyzeImage: - final time = DateTime.now(); - final MLResult result = await MLService._analyzeImageSync(args); - dev.log( - "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", - ); - sendPort.send(result.toJsonString()); - break; - case FaceMlOperation.loadModels: - await FaceDetectionService.instance.loadModel(useEntePlugin: true); - await FaceEmbeddingService.instance.loadModel(useEntePlugin: true); - await ClipImageEncoder.instance.loadModel(useEntePlugin: true); - sendPort.send(true); - break; - case FaceMlOperation.runClipText: - final textEmbedding = await ClipTextEncoder.predict(args); - sendPort.send(List.from(textEmbedding, growable: false)); - break; - } - } catch (e, stackTrace) { - dev.log( - "[SEVERE] Error in FaceML isolate: $e", - error: e, - stackTrace: stackTrace, - ); - sendPort - .send({'error': e.toString(), 'stackTrace': stackTrace.toString()}); - } - }); - } - - /// The common method to run any operation in the isolate. It sends the [message] to [_isolateMain] and waits for the result. - Future _runInIsolate( - (FaceMlOperation, Map) message, - ) async { - await _initIsolate(); - return _functionLock.synchronized(() async { - _resetInactivityTimer(); - - if (_shouldPauseIndexingAndClustering) { - return null; - } - - final completer = Completer(); - final answerPort = ReceivePort(); - - _activeTasks++; - _mainSendPort.send([message.$1.index, message.$2, answerPort.sendPort]); - - answerPort.listen((receivedMessage) { - if (receivedMessage is Map && receivedMessage.containsKey('error')) { - // Handle the error - final errorMessage = receivedMessage['error']; - final errorStackTrace = receivedMessage['stackTrace']; - final exception = Exception(errorMessage); - final stackTrace = StackTrace.fromString(errorStackTrace); - completer.completeError(exception, stackTrace); - } else { - completer.complete(receivedMessage); - } - }); - _activeTasks--; - - return completer.future; - }); - } - - /// Resets a timer that kills the isolate after a certain amount of inactivity. - /// - /// Should be called after initialization (e.g. inside `init()`) and after every call to isolate (e.g. inside `_runInIsolate()`) - void _resetInactivityTimer() { - _inactivityTimer?.cancel(); - _inactivityTimer = Timer(_inactivityDuration, () { - if (_activeTasks > 0) { - _logger.info('Tasks are still running. Delaying isolate disposal.'); - // Optionally, reschedule the timer to check again later. - _resetInactivityTimer(); - } else { - _logger.info( - 'Clustering Isolate has been inactive for ${_inactivityDuration.inSeconds} seconds with no tasks running. Killing isolate.', - ); - _dispose(); - } - }); - } - - void _dispose() async { - if (!_isIsolateSpawned) return; - _logger.info('Disposing isolate and models'); - await _releaseModels(); - _isIsolateSpawned = false; - _isolate.kill(); - _receivePort.close(); - _inactivityTimer?.cancel(); - } - - /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. - Future _analyzeImageInSingleIsolate( - FileMLInstruction instruction, - ) async { - final String filePath = await getImagePathForML(instruction.enteFile); - - final Stopwatch stopwatch = Stopwatch()..start(); - late MLResult result; - - try { - final resultJsonString = await _runInIsolate( - ( - FaceMlOperation.analyzeImage, - { - "enteFileID": instruction.enteFile.uploadedFileID ?? -1, - "filePath": filePath, - "runFaces": instruction.shouldRunFaces, - "runClip": instruction.shouldRunClip, - "faceDetectionAddress": - FaceDetectionService.instance.sessionAddress, - "faceEmbeddingAddress": - FaceEmbeddingService.instance.sessionAddress, - "clipImageAddress": ClipImageEncoder.instance.sessionAddress, - } - ), - ) as String?; - if (resultJsonString == null) { - if (!_shouldPauseIndexingAndClustering) { - _logger.severe('Analyzing image in isolate is giving back null'); - } - return null; - } - result = MLResult.fromJsonString(resultJsonString); - } catch (e, s) { - _logger.severe( - "Could not analyze image with ID ${instruction.enteFile.uploadedFileID} \n", - e, - s, - ); - debugPrint( - "This image with ID ${instruction.enteFile.uploadedFileID} has name ${instruction.enteFile.displayName}.", - ); - final resultBuilder = - MLResult.fromEnteFileID(instruction.enteFile.uploadedFileID!) - ..errorOccurred(); - return resultBuilder; - } - stopwatch.stop(); - _logger.info( - "Finished Analyze image with uploadedFileID ${instruction.enteFile.uploadedFileID}, in " - "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", - ); - - return result; - } - - Future> runClipTextInIsolate(String query) async { - try { - final int clipAddress = ClipTextEncoder.instance.sessionAddress; - final String remotePath = ClipTextEncoder.instance.vocabRemotePath; - final String tokenizerVocabPath = - await RemoteAssetsService.instance.getAssetPath(remotePath); - final textEmbedding = await _runInIsolate( - ( - FaceMlOperation.runClipText, - { - "text": query, - "address": clipAddress, - "vocabPath": tokenizerVocabPath, - "useEntePlugin": Platform.isAndroid, - } - ), - ) as List; - return textEmbedding; - } catch (e, s) { - _logger.severe("Could not run clip text in isolate", e, s); - rethrow; - } - } - - static Future _analyzeImageSync(Map args) async { + static Future analyzeImageSync(Map args) async { try { final int enteFileID = args["enteFileID"] as int; final String imagePath = args["filePath"] as String; @@ -906,7 +664,7 @@ class MLService { _logStatus(); return true; } - if (_shouldPauseIndexingAndClustering) { + if (shouldPauseIndexingAndClustering) { // This should ideally not be triggered, because one of the above should be triggered instead. _logger.warning( "Cannot run $function because indexing and clustering is being paused", @@ -923,7 +681,7 @@ class MLService { isFaceIndexingEnabled: ${LocalSettings.instance.isFaceIndexingEnabled} canRunMLController: $_mlControllerStatus isIndexingOrClusteringRunning: $_isIndexingOrClusteringRunning - shouldPauseIndexingAndClustering: $_shouldPauseIndexingAndClustering + shouldPauseIndexingAndClustering: $shouldPauseIndexingAndClustering debugIndexingDisabled: $debugIndexingDisabled '''; _logger.info(status); diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 81100df3ed..ffe6a5904a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -16,8 +16,8 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; +import "package:photos/services/machine_learning/ml_isolate.dart"; import "package:photos/services/machine_learning/ml_result.dart"; -import "package:photos/services/machine_learning/ml_service.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; @@ -295,7 +295,7 @@ class SemanticSearchService { if (cachedResult != null) { return cachedResult; } - final textEmbedding = await MLService.instance.runClipTextInIsolate(query); + final textEmbedding = await MLIsolate.instance.runClipText(query); _queryCache.put(query, textEmbedding); return textEmbedding; } From 00c4b7caa8a4c6f2af200588e4d85a4d5e6d7621 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 16:23:31 +0200 Subject: [PATCH 0122/1179] [mob][photos] Simplify functions in Isolate --- .../services/machine_learning/ml_isolate.dart | 9 +- .../services/machine_learning/ml_service.dart | 93 ++++--------------- mobile/lib/utils/ml_util.dart | 66 ++++++++++++- 3 files changed, 89 insertions(+), 79 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 720f45d8c4..0c7dc66cc3 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -9,7 +9,6 @@ import "package:photos/core/error-reporting/super_logging.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; import 'package:photos/services/machine_learning/ml_result.dart'; -import "package:photos/services/machine_learning/ml_service.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/services/remote_assets_service.dart"; @@ -34,6 +33,8 @@ class MLIsolate { bool _isIsolateSpawned = false; + bool shouldPauseIndexingAndClustering = false; + // Singleton pattern MLIsolate._privateConstructor(); static final instance = MLIsolate._privateConstructor(); @@ -82,7 +83,7 @@ class MLIsolate { switch (function) { case MLOperation.analyzeImage: final time = DateTime.now(); - final MLResult result = await MLService.analyzeImageSync(args); + final MLResult result = await analyzeImageStatic(args); _logger.info( "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", ); @@ -115,7 +116,7 @@ class MLIsolate { _resetInactivityTimer(); if (message.$1 == MLOperation.analyzeImage && - MLService.instance.shouldPauseIndexingAndClustering) { + shouldPauseIndexingAndClustering) { return null; } @@ -199,7 +200,7 @@ class MLIsolate { ), ) as String?; if (resultJsonString == null) { - if (!MLService.instance.shouldPauseIndexingAndClustering) { + if (!shouldPauseIndexingAndClustering) { _logger.severe('Analyzing image in isolate is giving back null'); } return null; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 1f9fe06cf9..fff0d14738 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -1,8 +1,7 @@ import "dart:async"; -import "dart:developer" as dev show log; -import "dart:io" show File, Platform; +import "dart:io" show Platform; import "dart:math" show min; -import "dart:typed_data" show Uint8List, ByteData; +import "dart:typed_data" show Uint8List; import "package:flutter/foundation.dart" show debugPrint; import "package:logging/logging.dart"; @@ -15,7 +14,6 @@ import "package:photos/extensions/list.dart"; import "package:photos/face/db.dart"; import "package:photos/face/model/box.dart"; import "package:photos/face/model/detection.dart" as face_detection; -import "package:photos/face/model/dimension.dart"; import "package:photos/face/model/face.dart"; import "package:photos/face/model/landmark.dart"; import "package:photos/service_locator.dart"; @@ -33,7 +31,6 @@ import "package:photos/services/machine_learning/ml_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; -import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; @@ -65,7 +62,7 @@ class MLService { bool _showClusteringIsHappening = false; bool _mlControllerStatus = false; bool _isIndexingOrClusteringRunning = false; - bool shouldPauseIndexingAndClustering = false; + bool _shouldPauseIndexingAndClustering = false; static const int _fileDownloadLimit = 10; static const _kForceClusteringFaceCount = 8000; @@ -88,8 +85,8 @@ class MLService { } _mlControllerStatus = event.shouldRun; if (_mlControllerStatus) { - if (shouldPauseIndexingAndClustering) { - shouldPauseIndexingAndClustering = false; + if (_shouldPauseIndexingAndClustering) { + _cancelPauseIndexingAndClustering(); _logger.info( "MLController allowed running ML, faces indexing undoing previous pause", ); @@ -138,10 +135,16 @@ class MLService { void pauseIndexingAndClustering() { if (_isIndexingOrClusteringRunning) { - shouldPauseIndexingAndClustering = true; + _shouldPauseIndexingAndClustering = true; + MLIsolate.instance.shouldPauseIndexingAndClustering = true; } } + void _cancelPauseIndexingAndClustering() { + _shouldPauseIndexingAndClustering = false; + MLIsolate.instance.shouldPauseIndexingAndClustering = false; + } + /// Analyzes all the images in the database with the latest ml version and stores the results in the database. /// /// This function first checks if the image has already been analyzed with the lastest faceMlVersion and stored in the database. If so, it skips the image. @@ -169,7 +172,7 @@ class MLService { } final futures = >[]; for (final instruction in chunk) { - if (shouldPauseIndexingAndClustering) { + if (_shouldPauseIndexingAndClustering) { _logger.info("indexAllImages() was paused, stopping"); break outerLoop; } @@ -192,7 +195,7 @@ class MLService { _logger.severe("indexAllImages failed", e, s); } finally { _isIndexingOrClusteringRunning = false; - shouldPauseIndexingAndClustering = false; + _cancelPauseIndexingAndClustering(); } } @@ -253,7 +256,7 @@ class MLService { int bucket = 1; while (true) { - if (shouldPauseIndexingAndClustering) { + if (_shouldPauseIndexingAndClustering) { _logger.info( "MLController does not allow running ML, stopping before clustering bucket $bucket", ); @@ -363,7 +366,7 @@ class MLService { } finally { _showClusteringIsHappening = false; _isIndexingOrClusteringRunning = false; - shouldPauseIndexingAndClustering = false; + _cancelPauseIndexingAndClustering(); } } @@ -379,7 +382,7 @@ class MLService { instruction, ); if (result == null) { - if (!shouldPauseIndexingAndClustering) { + if (!_shouldPauseIndexingAndClustering) { _logger.severe( "Failed to analyze image with uploadedFileID: ${instruction.enteFile.uploadedFileID}", ); @@ -584,64 +587,6 @@ class MLService { } } - static Future analyzeImageSync(Map args) async { - try { - final int enteFileID = args["enteFileID"] as int; - final String imagePath = args["filePath"] as String; - final bool runFaces = args["runFaces"] as bool; - final bool runClip = args["runClip"] as bool; - final int faceDetectionAddress = args["faceDetectionAddress"] as int; - final int faceEmbeddingAddress = args["faceEmbeddingAddress"] as int; - final int clipImageAddress = args["clipImageAddress"] as int; - - dev.log( - "Start analyzing image with uploadedFileID: $enteFileID inside the isolate", - ); - final time = DateTime.now(); - - // Decode the image once to use for both face detection and alignment - final imageData = await File(imagePath).readAsBytes(); - final image = await decodeImageFromData(imageData); - final ByteData imageByteData = await getByteDataFromImage(image); - dev.log('Reading and decoding image took ' - '${DateTime.now().difference(time).inMilliseconds} ms'); - final decodedImageSize = - Dimensions(height: image.height, width: image.width); - final result = MLResult.fromEnteFileID(enteFileID); - result.decodedImageSize = decodedImageSize; - - if (runFaces) { - final resultFaces = await FaceRecognitionService.runFacesPipeline( - enteFileID, - image, - imageByteData, - faceDetectionAddress, - faceEmbeddingAddress, - ); - if (resultFaces.isEmpty) { - return result..noFaceDetected(); - } - result.faces = resultFaces; - } - - if (runClip) { - final clipResult = await SemanticSearchService.runClipImage( - enteFileID, - image, - imageByteData, - clipImageAddress, - useEntePlugin: Platform.isAndroid, - ); - result.clip = clipResult; - } - - return result; - } catch (e, s) { - dev.log("Could not analyze image: \n e: $e \n s: $s"); - rethrow; - } - } - bool _cannotRunMLFunction({String function = ""}) { if (_isIndexingOrClusteringRunning) { _logger.info( @@ -664,7 +609,7 @@ class MLService { _logStatus(); return true; } - if (shouldPauseIndexingAndClustering) { + if (_shouldPauseIndexingAndClustering) { // This should ideally not be triggered, because one of the above should be triggered instead. _logger.warning( "Cannot run $function because indexing and clustering is being paused", @@ -681,7 +626,7 @@ class MLService { isFaceIndexingEnabled: ${LocalSettings.instance.isFaceIndexingEnabled} canRunMLController: $_mlControllerStatus isIndexingOrClusteringRunning: $_isIndexingOrClusteringRunning - shouldPauseIndexingAndClustering: $shouldPauseIndexingAndClustering + shouldPauseIndexingAndClustering: $_shouldPauseIndexingAndClustering debugIndexingDisabled: $debugIndexingDisabled '''; _logger.info(status); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 9f06bdaedc..aaddf4ed48 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,5 +1,6 @@ -import "dart:io" show File; +import "dart:io" show File, Platform; import "dart:math" as math show sqrt, min, max; +import "dart:typed_data" show ByteData; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; @@ -7,13 +8,18 @@ import "package:photos/core/configuration.dart"; import "package:photos/db/embeddings_db.dart"; import "package:photos/db/files_db.dart"; import "package:photos/face/db.dart"; +import "package:photos/face/model/dimension.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; +import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import "package:photos/services/search_service.dart"; import "package:photos/utils/file_util.dart"; +import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/thumbnail_util.dart"; final _logger = Logger("MlUtil"); @@ -202,3 +208,61 @@ void normalizeEmbedding(List embedding) { embedding[i] = embedding[i] / sqrtNormalization; } } + +Future analyzeImageStatic(Map args) async { + try { + final int enteFileID = args["enteFileID"] as int; + final String imagePath = args["filePath"] as String; + final bool runFaces = args["runFaces"] as bool; + final bool runClip = args["runClip"] as bool; + final int faceDetectionAddress = args["faceDetectionAddress"] as int; + final int faceEmbeddingAddress = args["faceEmbeddingAddress"] as int; + final int clipImageAddress = args["clipImageAddress"] as int; + + _logger.info( + "Start analyzing image with uploadedFileID: $enteFileID inside the isolate", + ); + final time = DateTime.now(); + + // Decode the image once to use for both face detection and alignment + final imageData = await File(imagePath).readAsBytes(); + final image = await decodeImageFromData(imageData); + final ByteData imageByteData = await getByteDataFromImage(image); + _logger.info('Reading and decoding image took ' + '${DateTime.now().difference(time).inMilliseconds} ms'); + final decodedImageSize = + Dimensions(height: image.height, width: image.width); + final result = MLResult.fromEnteFileID(enteFileID); + result.decodedImageSize = decodedImageSize; + + if (runFaces) { + final resultFaces = await FaceRecognitionService.runFacesPipeline( + enteFileID, + image, + imageByteData, + faceDetectionAddress, + faceEmbeddingAddress, + ); + if (resultFaces.isEmpty) { + return result..noFaceDetected(); + } + result.faces = resultFaces; + } + + if (runClip) { + final clipResult = await SemanticSearchService.runClipImage( + enteFileID, + image, + imageByteData, + clipImageAddress, + useEntePlugin: Platform.isAndroid, + ); + result.clip = clipResult; + } + + return result; + } catch (e, s) { + _logger.severe("Could not analyze image", e, s); + rethrow; + } +} From 2df64627a67c956b73ab57fb909cfe01542f402e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 16:57:18 +0200 Subject: [PATCH 0123/1179] [mob][photos] Init client exactly once --- .../services/machine_learning/ml_service.dart | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index fff0d14738..e254794dcc 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -75,6 +75,11 @@ class MLService { } _logger.info("init called"); + // Get client name + final packageInfo = await PackageInfo.fromPlatform(); + client = "${packageInfo.packageName}/${packageInfo.version}"; + _logger.info("client: $client"); + // Activate FaceRecognitionService await FaceRecognitionService.instance.init(); @@ -503,13 +508,6 @@ class MLService { return _initModelLock.synchronized(() async { if (_isModelsInitialized) return; _logger.info('initModels called'); - - // Get client name - final packageInfo = await PackageInfo.fromPlatform(); - client = "${packageInfo.packageName}/${packageInfo.version}"; - _logger.info("client: $client"); - - // Initialize models try { await FaceDetectionService.instance.loadModel(); } catch (e, s) { @@ -536,12 +534,6 @@ class MLService { if (_isModelsInitUsingEntePlugin) return; _logger.info('initModelUsingEntePlugin called'); - // Get client name - final packageInfo = await PackageInfo.fromPlatform(); - client = "${packageInfo.packageName}/${packageInfo.version}"; - _logger.info("client: $client"); - - // Initialize models try { await MLIsolate.instance.loadModels(); _isModelsInitUsingEntePlugin = true; From b506043b2c0b4c02bf7d191ed6bb66579f98a4bc Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 24 Jul 2024 17:11:35 +0200 Subject: [PATCH 0124/1179] [mob][photos] Add todo --- mobile/lib/services/machine_learning/ml_model.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 1127f57d27..2b973afa7c 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -81,6 +81,7 @@ abstract class MlModel { } } + // TODO: add release method for native plugin Future release() async { if (isInitialized) { await computer.compute(_releaseModel, param: {'address': sessionAddress}); From 06a093de81cc124b46c5c3425f851c7dd6d248f9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 13:08:26 +0200 Subject: [PATCH 0125/1179] [mob][photos] Run clip text in separate isolate --- .../services/machine_learning/ml_isolate.dart | 30 +---------------- .../semantic_search_service.dart | 4 +-- mobile/lib/utils/image_isolate.dart | 33 ++++++++++++++++++- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 0c7dc66cc3..01a36a768f 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -15,7 +15,7 @@ import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/ml_util.dart"; import "package:synchronized/synchronized.dart"; -enum MLOperation { analyzeImage, loadModels, runClipText } +enum MLOperation { analyzeImage, loadModels } class MLIsolate { static final _logger = Logger("MLIsolate"); @@ -95,10 +95,6 @@ class MLIsolate { await ClipImageEncoder.instance.loadModel(useEntePlugin: true); sendPort.send(true); break; - case MLOperation.runClipText: - final textEmbedding = await ClipTextEncoder.predict(args); - sendPort.send(List.from(textEmbedding, growable: false)); - break; } } catch (e, s) { _logger.severe("Error in FaceML isolate", e, s); @@ -229,30 +225,6 @@ class MLIsolate { return result; } - Future> runClipText(String query) async { - try { - final int clipAddress = ClipTextEncoder.instance.sessionAddress; - final String remotePath = ClipTextEncoder.instance.vocabRemotePath; - final String tokenizerVocabPath = - await RemoteAssetsService.instance.getAssetPath(remotePath); - final textEmbedding = await _runInIsolate( - ( - MLOperation.runClipText, - { - "text": query, - "address": clipAddress, - "vocabPath": tokenizerVocabPath, - "useEntePlugin": Platform.isAndroid, - } - ), - ) as List; - return textEmbedding; - } catch (e, s) { - _logger.severe("Could not run clip text in isolate", e, s); - rethrow; - } - } - Future loadModels() async { try { await _runInIsolate( diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index ffe6a5904a..5460a975ef 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -16,12 +16,12 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; -import "package:photos/services/machine_learning/ml_isolate.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; import "package:photos/utils/debouncer.dart"; +import "package:photos/utils/image_isolate.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -295,7 +295,7 @@ class SemanticSearchService { if (cachedResult != null) { return cachedResult; } - final textEmbedding = await MLIsolate.instance.runClipText(query); + final textEmbedding = await ImageIsolate.instance.runClipText(query); _queryCache.put(query, textEmbedding); return textEmbedding; } diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/utils/image_isolate.dart index 9ebad2bb94..e22a5ff2ce 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/utils/image_isolate.dart @@ -1,16 +1,19 @@ import 'dart:async'; -import "dart:io" show File; +import "dart:io" show File, Platform; import 'dart:isolate'; import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:logging/logging.dart"; import "package:photos/face/model/box.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; +import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:synchronized/synchronized.dart"; enum ImageOperation { generateFaceThumbnails, + runClipText, } class ImageIsolate { @@ -88,6 +91,10 @@ class ImageIsolate { faceBoxes, ); sendPort.send(List.from(results)); + case ImageOperation.runClipText: + final textEmbedding = await ClipTextEncoder.predict(args); + sendPort.send(List.from(textEmbedding, growable: false)); + break; } } catch (e, stackTrace) { sendPort @@ -175,4 +182,28 @@ class ImageIsolate { ), ).then((value) => value.cast()); } + + Future> runClipText(String query) async { + try { + final int clipAddress = ClipTextEncoder.instance.ffiSessionAddress; + final String remotePath = ClipTextEncoder.instance.vocabRemotePath; + final String tokenizerVocabPath = + await RemoteAssetsService.instance.getAssetPath(remotePath); + final textEmbedding = await _runInIsolate( + ( + ImageOperation.runClipText, + { + "text": query, + "address": clipAddress, + "vocabPath": tokenizerVocabPath, + "useEntePlugin": Platform.isAndroid, + } + ), + ) as List; + return textEmbedding; + } catch (e, s) { + _logger.severe("Could not run clip text in isolate", e, s); + rethrow; + } + } } From cfd5c22649a056e4f7dc15a8c854f3b618d18808 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 17:46:38 +0200 Subject: [PATCH 0126/1179] [mob][photos] Load models in isolate --- .../services/machine_learning/ml_isolate.dart | 70 ++++++++-- .../services/machine_learning/ml_model.dart | 132 ++++++++++-------- .../machine_learning/ml_models_overview.dart | 27 ++++ .../services/machine_learning/ml_service.dart | 78 ++++------- .../machine_learning_settings_page.dart | 6 +- 5 files changed, 181 insertions(+), 132 deletions(-) create mode 100644 mobile/lib/services/machine_learning/ml_models_overview.dart diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 01a36a768f..3172006812 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -1,5 +1,4 @@ import "dart:async"; -import "dart:io" show Platform; import "dart:isolate"; import "package:dart_ui_isolate/dart_ui_isolate.dart"; @@ -8,10 +7,10 @@ import "package:logging/logging.dart"; import "package:photos/core/error-reporting/super_logging.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; import 'package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart'; +import "package:photos/services/machine_learning/ml_model.dart"; +import "package:photos/services/machine_learning/ml_models_overview.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; -import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/ml_util.dart"; import "package:synchronized/synchronized.dart"; @@ -90,10 +89,17 @@ class MLIsolate { sendPort.send(result.toJsonString()); break; case MLOperation.loadModels: - await FaceDetectionService.instance.loadModel(useEntePlugin: true); - await FaceEmbeddingService.instance.loadModel(useEntePlugin: true); - await ClipImageEncoder.instance.loadModel(useEntePlugin: true); - sendPort.send(true); + final modelNames = args['modelNames'] as List; + final modelPaths = args['modelPaths'] as List; + final addresses = []; + for (int i = 0; i < modelNames.length; i++) { + final int address = await MlModel.loadModel( + modelNames[i], + modelPaths[i], + ); + addresses.add(address); + } + sendPort.send(List.from(addresses, growable: false)); break; } } catch (e, s) { @@ -188,10 +194,10 @@ class MLIsolate { "runFaces": instruction.shouldRunFaces, "runClip": instruction.shouldRunClip, "faceDetectionAddress": - FaceDetectionService.instance.sessionAddress, + FaceDetectionService.instance.ffiSessionAddress, "faceEmbeddingAddress": - FaceEmbeddingService.instance.sessionAddress, - "clipImageAddress": ClipImageEncoder.instance.sessionAddress, + FaceEmbeddingService.instance.ffiSessionAddress, + "clipImageAddress": ClipImageEncoder.instance.ffiSessionAddress, } ), ) as String?; @@ -225,11 +231,47 @@ class MLIsolate { return result; } - Future loadModels() async { + Future loadModels({ + required bool loadFaces, + required bool loadClip, + }) async { + if (!loadFaces && !loadClip) return; + final List models = []; + final List modelNames = []; + final List modelPaths = []; + if (loadFaces) { + models.addAll([MLModels.faceDetection, MLModels.faceEmbedding]); + final faceDetection = + await FaceDetectionService.instance.getModelNameAndPath(); + modelNames.add(faceDetection.$1); + modelPaths.add(faceDetection.$2); + final faceEmbedding = + await FaceEmbeddingService.instance.getModelNameAndPath(); + modelNames.add(faceEmbedding.$1); + modelPaths.add(faceEmbedding.$2); + } + if (loadClip) { + models.add(MLModels.clipImageEncoder); + final clipImage = await ClipImageEncoder.instance.getModelNameAndPath(); + modelNames.add(clipImage.$1); + modelPaths.add(clipImage.$2); + } + try { - await _runInIsolate( - (MLOperation.loadModels, {}), - ); + final addresses = await _runInIsolate( + ( + MLOperation.loadModels, + { + "modelNames": modelNames, + "modelPaths": modelPaths, + } + ), + ) as List; + for (int i = 0; i < models.length; i++) { + final model = models[i].model; + final address = addresses[i]; + model.storeSessionAddress(address); + } } catch (e, s) { _logger.severe("Could not load models in isolate", e, s); rethrow; diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 2b973afa7c..5eab535206 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -1,6 +1,5 @@ -import "dart:io" show File; +import "dart:io" show File, Platform; -import "package:computer/computer.dart"; import "package:logging/logging.dart"; import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; @@ -8,6 +7,7 @@ import "package:photos/services/machine_learning/onnx_env.dart"; import "package:photos/services/remote_assets_service.dart"; abstract class MlModel { + static final Logger isolateLogger = Logger("MlModelInIsolate"); Logger get logger; String get kModelBucketEndpoint => "https://models.ente.io/"; @@ -16,92 +16,100 @@ abstract class MlModel { String get modelName; + bool get isInitialized => + Platform.isAndroid ? isNativePluginInitialized : isFfiInitialized; + int get sessionAddress => + Platform.isAndroid ? nativePluginSessionIndex : ffiSessionAddress; + // isInitialized is used to check if the model is loaded by the ffi based // plugin - bool isInitialized = false; + bool isFfiInitialized = false; + int ffiSessionAddress = -1; bool isNativePluginInitialized = false; - int sessionAddress = 0; + int nativePluginSessionIndex = -1; - final computer = Computer.shared(); + Future<(String, String)> getModelNameAndPath() async { + final path = + await RemoteAssetsService.instance.getAssetPath(modelRemotePath); + return (modelName, path); + } + + void storeSessionAddress(int address) { + if (Platform.isAndroid) { + nativePluginSessionIndex = address; + isNativePluginInitialized = true; + } else { + ffiSessionAddress = address; + isFfiInitialized = true; + } + } // Initializes the model. // If `useEntePlugin` is set to true, the custom plugin is used for initialization. // Note: The custom plugin requires a dedicated isolate for loading the model to ensure thread safety and performance isolation. // In contrast, the current FFI-based plugin leverages the session memory address for session management, which does not require a dedicated isolate. - Future loadModel({bool useEntePlugin = false}) async { - final model = await RemoteAssetsService.instance.getAsset(modelRemotePath); - if (useEntePlugin) { - await _loadModelWithEntePlugin(modelName, model.path); - } else { - await _loadModelWithFFI(modelName, model.path); - } - } - - Future _loadModelWithEntePlugin( + static Future loadModel( String modelName, String modelPath, ) async { - if (!isNativePluginInitialized) { - final startTime = DateTime.now(); - logger.info('Initializing $modelName with EntePlugin'); - final OnnxDart plugin = OnnxDart(); - final bool? initResult = await plugin.init(modelName, modelPath); - isNativePluginInitialized = initResult ?? false; - if (isNativePluginInitialized) { - final endTime = DateTime.now(); - logger.info( - "$modelName loaded via EntePlugin ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", - ); - } else { - logger.severe("Failed to initialize $modelName with EntePlugin."); - } + if (Platform.isAndroid) { + return await _loadModelWithEntePlugin(modelName, modelPath); } else { - logger.info("$modelName already initialized with Ente Plugin."); + return await _loadModelWithFFI(modelName, modelPath); } } - Future _loadModelWithFFI(String modelName, String modelPath) async { - if (!isInitialized) { - logger.info('Initializing $modelName with FFI'); + static Future _loadModelWithEntePlugin( + String modelName, + String modelPath, + ) async { + final startTime = DateTime.now(); + isolateLogger.info('Initializing $modelName with EntePlugin'); + final OnnxDart plugin = OnnxDart(); + final bool? initResult = await plugin.init(modelName, modelPath); + if (initResult == null || !initResult) { + isolateLogger.severe("Failed to initialize $modelName with EntePlugin."); + throw Exception("Failed to initialize $modelName with EntePlugin."); + } + final endTime = DateTime.now(); + isolateLogger.info( + "$modelName loaded via EntePlugin in ${endTime.difference(startTime).inMilliseconds}ms", + ); + return 0; + } + + static Future _loadModelWithFFI( + String modelName, + String modelPath, + ) async { + isolateLogger.info('Initializing $modelName with FFI'); + try { final startTime = DateTime.now(); - sessionAddress = await computer.compute( - _loadModel, - param: { - "modelPath": modelPath, - }, - ); - isInitialized = true; + final sessionOptions = OrtSessionOptions() + ..setInterOpNumThreads(1) + ..setIntraOpNumThreads(1) + ..setSessionGraphOptimizationLevel( + GraphOptimizationLevel.ortEnableAll, + ); + final session = OrtSession.fromFile(File(modelPath), sessionOptions); final endTime = DateTime.now(); - logger.info( - "$modelName loaded with FFI, took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch).toString()}ms", + isolateLogger.info( + "$modelName loaded with FFI, took: ${endTime.difference(startTime).inMilliseconds}ms", ); - } else { - logger.info("$modelName already initialized with FFI."); + return session.address; + } catch (e) { + rethrow; } } // TODO: add release method for native plugin Future release() async { - if (isInitialized) { - await computer.compute(_releaseModel, param: {'address': sessionAddress}); + if (isFfiInitialized) { + await _releaseModel({'address': ffiSessionAddress}); await ONNXEnv.instance.releaseONNX(modelName); - isInitialized = false; - sessionAddress = 0; - } - } - - static Future _loadModel(Map args) async { - final sessionOptions = OrtSessionOptions() - ..setInterOpNumThreads(1) - ..setIntraOpNumThreads(1) - ..setSessionGraphOptimizationLevel(GraphOptimizationLevel.ortEnableAll); - try { - final session = - OrtSession.fromFile(File(args["modelPath"]), sessionOptions); - return session.address; - } catch (e) { - rethrow; + isFfiInitialized = false; + ffiSessionAddress = 0; } } diff --git a/mobile/lib/services/machine_learning/ml_models_overview.dart b/mobile/lib/services/machine_learning/ml_models_overview.dart new file mode 100644 index 0000000000..039628c142 --- /dev/null +++ b/mobile/lib/services/machine_learning/ml_models_overview.dart @@ -0,0 +1,27 @@ +import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; +import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; + +enum MLModels { + faceDetection, + faceEmbedding, + clipImageEncoder, + clipTextEncoder, +} + +extension MLModelsExtension on MLModels { + MlModel get model { + switch (this) { + case MLModels.faceDetection: + return FaceDetectionService.instance; + case MLModels.faceEmbedding: + return FaceEmbeddingService.instance; + case MLModels.clipImageEncoder: + return ClipImageEncoder.instance; + case MLModels.clipTextEncoder: + return ClipTextEncoder.instance; + } + } +} diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index e254794dcc..98089b6b6a 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -1,5 +1,4 @@ import "dart:async"; -import "dart:io" show Platform; import "dart:math" show min; import "dart:typed_data" show Uint8List; @@ -47,8 +46,6 @@ class MLService { final _initModelLock = Lock(); bool _isInitialized = false; - bool _isModelsInitialized = false; - bool _isModelsInitUsingEntePlugin = false; late String client; @@ -56,7 +53,7 @@ class MLService { bool get showClusteringIsHappening => _showClusteringIsHappening; - bool get allModelsLoaded => _isModelsInitialized; + bool modelsAreLoading = false; bool debugIndexingDisabled = false; bool _showClusteringIsHappening = false; @@ -181,7 +178,7 @@ class MLService { _logger.info("indexAllImages() was paused, stopping"); break outerLoop; } - await _ensureReadyForInference(); + await _ensureLoadedModels(instruction); futures.add(processImage(instruction)); } final awaitedFutures = await Future.wait(futures); @@ -504,47 +501,6 @@ class MLService { return actuallyRanML; } - Future _initModelsUsingFfiBasedPlugin() async { - return _initModelLock.synchronized(() async { - if (_isModelsInitialized) return; - _logger.info('initModels called'); - try { - await FaceDetectionService.instance.loadModel(); - } catch (e, s) { - _logger.severe("Could not initialize yolo onnx", e, s); - } - try { - await FaceEmbeddingService.instance.loadModel(); - } catch (e, s) { - _logger.severe("Could not initialize mobilefacenet", e, s); - } - try { - await ClipImageEncoder.instance.loadModel(); - } catch (e, s) { - _logger.severe("Could not initialize clip image", e, s); - } - _isModelsInitialized = true; - _logger.info('initModels done'); - _logStatus(); - }); - } - - Future _initModelUsingEntePlugin() async { - return _initModelLock.synchronized(() async { - if (_isModelsInitUsingEntePlugin) return; - _logger.info('initModelUsingEntePlugin called'); - - try { - await MLIsolate.instance.loadModels(); - _isModelsInitUsingEntePlugin = true; - } catch (e, s) { - _logger.severe("Could not initialize clip image", e, s); - } - _logger.info('initModelUsingEntePlugin done'); - _logStatus(); - }); - } - Future _releaseModels() async { return _initModelLock.synchronized(() async { _logger.info("dispose called"); @@ -570,13 +526,29 @@ class MLService { }); } - Future _ensureReadyForInference() async { - await _initModelsUsingFfiBasedPlugin(); - if (Platform.isAndroid) { - await _initModelUsingEntePlugin(); - } else { - await _initModelsUsingFfiBasedPlugin(); - } + Future _ensureLoadedModels(FileMLInstruction instruction) async { + return _initModelLock.synchronized(() async { + final faceDetectionLoaded = FaceDetectionService.instance.isInitialized; + final faceEmbeddingLoaded = FaceEmbeddingService.instance.isInitialized; + final facesModelsLoaded = faceDetectionLoaded && faceEmbeddingLoaded; + final clipModelsLoaded = ClipImageEncoder.instance.isInitialized; + + final shouldLoadFaces = instruction.shouldRunFaces && !facesModelsLoaded; + final shouldLoadClip = instruction.shouldRunClip && !clipModelsLoaded; + if (!shouldLoadFaces && !shouldLoadClip) { + return; + } + + modelsAreLoading = true; + _logger.info( + 'Loading models. faces: $shouldLoadFaces, clip: $shouldLoadClip', + ); + await MLIsolate.instance + .loadModels(loadFaces: shouldLoadFaces, loadClip: shouldLoadClip); + _logger.info('Models loaded'); + _logStatus(); + modelsAreLoading = false; + }); } bool _cannotRunMLFunction({String function = ""}) { diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 6fb617160a..798486b4b5 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -138,9 +138,9 @@ class _MachineLearningSettingsPageState height: 12, ), hasEnabled - ? MLService.instance.allModelsLoaded - ? const MLStatusWidget() - : const ModelLoadingState() + ? MLService.instance.modelsAreLoading + ? const ModelLoadingState() + : const MLStatusWidget() : const SizedBox.shrink(), ], ); From ea5eef0f2f314a3d977add3848d592227b70dd82 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 17:51:31 +0200 Subject: [PATCH 0127/1179] [mob][photos] Use correct session --- .../lib/services/machine_learning/ml_isolate.dart | 6 +++--- mobile/lib/services/machine_learning/ml_model.dart | 14 +++++++------- mobile/lib/utils/image_isolate.dart | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 3172006812..32987981e6 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -194,10 +194,10 @@ class MLIsolate { "runFaces": instruction.shouldRunFaces, "runClip": instruction.shouldRunClip, "faceDetectionAddress": - FaceDetectionService.instance.ffiSessionAddress, + FaceDetectionService.instance.sessionAddress, "faceEmbeddingAddress": - FaceEmbeddingService.instance.ffiSessionAddress, - "clipImageAddress": ClipImageEncoder.instance.ffiSessionAddress, + FaceEmbeddingService.instance.sessionAddress, + "clipImageAddress": ClipImageEncoder.instance.sessionAddress, } ), ) as String?; diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 5eab535206..d7da9c1afd 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -19,15 +19,15 @@ abstract class MlModel { bool get isInitialized => Platform.isAndroid ? isNativePluginInitialized : isFfiInitialized; int get sessionAddress => - Platform.isAndroid ? nativePluginSessionIndex : ffiSessionAddress; + Platform.isAndroid ? _nativePluginSessionIndex : _ffiSessionAddress; // isInitialized is used to check if the model is loaded by the ffi based // plugin bool isFfiInitialized = false; - int ffiSessionAddress = -1; + int _ffiSessionAddress = -1; bool isNativePluginInitialized = false; - int nativePluginSessionIndex = -1; + int _nativePluginSessionIndex = -1; Future<(String, String)> getModelNameAndPath() async { final path = @@ -37,10 +37,10 @@ abstract class MlModel { void storeSessionAddress(int address) { if (Platform.isAndroid) { - nativePluginSessionIndex = address; + _nativePluginSessionIndex = address; isNativePluginInitialized = true; } else { - ffiSessionAddress = address; + _ffiSessionAddress = address; isFfiInitialized = true; } } @@ -106,10 +106,10 @@ abstract class MlModel { // TODO: add release method for native plugin Future release() async { if (isFfiInitialized) { - await _releaseModel({'address': ffiSessionAddress}); + await _releaseModel({'address': _ffiSessionAddress}); await ONNXEnv.instance.releaseONNX(modelName); isFfiInitialized = false; - ffiSessionAddress = 0; + _ffiSessionAddress = 0; } } diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/utils/image_isolate.dart index e22a5ff2ce..c30767755f 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/utils/image_isolate.dart @@ -185,7 +185,7 @@ class ImageIsolate { Future> runClipText(String query) async { try { - final int clipAddress = ClipTextEncoder.instance.ffiSessionAddress; + final int clipAddress = ClipTextEncoder.instance.sessionAddress; final String remotePath = ClipTextEncoder.instance.vocabRemotePath; final String tokenizerVocabPath = await RemoteAssetsService.instance.getAssetPath(remotePath); From cdcc349157a0850dc021f032f83b912de219d730 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 17:54:18 +0200 Subject: [PATCH 0128/1179] [mob][photos] Abstract choice of onnx package --- mobile/lib/services/machine_learning/ml_model.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index d7da9c1afd..e2097beff4 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -16,10 +16,12 @@ abstract class MlModel { String get modelName; + static final bool usePlatformPlugin = Platform.isAndroid; + bool get isInitialized => - Platform.isAndroid ? isNativePluginInitialized : isFfiInitialized; + usePlatformPlugin ? isNativePluginInitialized : isFfiInitialized; int get sessionAddress => - Platform.isAndroid ? _nativePluginSessionIndex : _ffiSessionAddress; + usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; // isInitialized is used to check if the model is loaded by the ffi based // plugin @@ -36,7 +38,7 @@ abstract class MlModel { } void storeSessionAddress(int address) { - if (Platform.isAndroid) { + if (usePlatformPlugin) { _nativePluginSessionIndex = address; isNativePluginInitialized = true; } else { @@ -53,7 +55,7 @@ abstract class MlModel { String modelName, String modelPath, ) async { - if (Platform.isAndroid) { + if (usePlatformPlugin) { return await _loadModelWithEntePlugin(modelName, modelPath); } else { return await _loadModelWithFFI(modelName, modelPath); From e3908f3f2c1b4175d743498f07a645fa10c2eb28 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 17:55:49 +0200 Subject: [PATCH 0129/1179] [mob][photos] Minor change --- .../services/machine_learning/ml_model.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index e2097beff4..1770bdfa4d 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -16,19 +16,19 @@ abstract class MlModel { String get modelName; - static final bool usePlatformPlugin = Platform.isAndroid; + static final bool _usePlatformPlugin = Platform.isAndroid; bool get isInitialized => - usePlatformPlugin ? isNativePluginInitialized : isFfiInitialized; + _usePlatformPlugin ? _isNativePluginInitialized : _isFfiInitialized; int get sessionAddress => - usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; + _usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; // isInitialized is used to check if the model is loaded by the ffi based // plugin - bool isFfiInitialized = false; + bool _isFfiInitialized = false; int _ffiSessionAddress = -1; - bool isNativePluginInitialized = false; + bool _isNativePluginInitialized = false; int _nativePluginSessionIndex = -1; Future<(String, String)> getModelNameAndPath() async { @@ -38,12 +38,12 @@ abstract class MlModel { } void storeSessionAddress(int address) { - if (usePlatformPlugin) { + if (_usePlatformPlugin) { _nativePluginSessionIndex = address; - isNativePluginInitialized = true; + _isNativePluginInitialized = true; } else { _ffiSessionAddress = address; - isFfiInitialized = true; + _isFfiInitialized = true; } } @@ -55,7 +55,7 @@ abstract class MlModel { String modelName, String modelPath, ) async { - if (usePlatformPlugin) { + if (_usePlatformPlugin) { return await _loadModelWithEntePlugin(modelName, modelPath); } else { return await _loadModelWithFFI(modelName, modelPath); @@ -107,10 +107,10 @@ abstract class MlModel { // TODO: add release method for native plugin Future release() async { - if (isFfiInitialized) { + if (_isFfiInitialized) { await _releaseModel({'address': _ffiSessionAddress}); await ONNXEnv.instance.releaseONNX(modelName); - isFfiInitialized = false; + _isFfiInitialized = false; _ffiSessionAddress = 0; } } From 41aaf4a2dbd0e058c0194e9bae18dc8e2b6424f0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:03:43 +0200 Subject: [PATCH 0130/1179] [mob][photos] Change name --- mobile/lib/services/machine_learning/ml_model.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 1770bdfa4d..e941cf106d 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -56,13 +56,13 @@ abstract class MlModel { String modelPath, ) async { if (_usePlatformPlugin) { - return await _loadModelWithEntePlugin(modelName, modelPath); + return await _loadModelWithPlatformPlugin(modelName, modelPath); } else { return await _loadModelWithFFI(modelName, modelPath); } } - static Future _loadModelWithEntePlugin( + static Future _loadModelWithPlatformPlugin( String modelName, String modelPath, ) async { From 8d9b5a8ea0c8706ccaea5ac4e1db2a48df402b4d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:11:39 +0200 Subject: [PATCH 0131/1179] [mob][photos] ONNX Env FFI --- .../services/machine_learning/ml_model.dart | 1 + .../services/machine_learning/onnx_env.dart | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index e941cf106d..167902d02b 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -86,6 +86,7 @@ abstract class MlModel { String modelPath, ) async { isolateLogger.info('Initializing $modelName with FFI'); + ONNXEnvFFI.instance.initONNX(modelName); try { final startTime = DateTime.now(); final sessionOptions = OrtSessionOptions() diff --git a/mobile/lib/services/machine_learning/onnx_env.dart b/mobile/lib/services/machine_learning/onnx_env.dart index fadf3c6d4f..edb7d98a24 100644 --- a/mobile/lib/services/machine_learning/onnx_env.dart +++ b/mobile/lib/services/machine_learning/onnx_env.dart @@ -1,27 +1,24 @@ -import "package:computer/computer.dart"; import "package:onnxruntime/onnxruntime.dart"; -class ONNXEnv { +class ONNXEnvFFI { final Set _loadedModels = {}; - final _computer = Computer.shared(); - // Singleton pattern - ONNXEnv._privateConstructor(); - static final instance = ONNXEnv._privateConstructor(); - factory ONNXEnv() => instance; + ONNXEnvFFI._privateConstructor(); + static final instance = ONNXEnvFFI._privateConstructor(); + factory ONNXEnvFFI() => instance; - Future initONNX(String modelName) async { + void initONNX(String modelName) { if (_loadedModels.isEmpty) { - await _computer.compute(() => OrtEnv.instance.init()); + OrtEnv.instance.init(); } _loadedModels.add(modelName); } - Future releaseONNX(String modelName) async { + void releaseONNX(String modelName) { _loadedModels.remove(modelName); if (_loadedModels.isEmpty) { - await _computer.compute(() => OrtEnv.instance.release()); + OrtEnv.instance.release(); } } From d3e965fbb7de6af52b6a18b868a0f7b8fe63ba3a Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:43:47 +0200 Subject: [PATCH 0132/1179] [mob][photos] Release indexing models --- .../services/machine_learning/ml_isolate.dart | 49 ++++++++++++++++++- .../services/machine_learning/ml_model.dart | 42 +++++++++++----- .../machine_learning/ml_models_overview.dart | 11 +++++ 3 files changed, 89 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 32987981e6..1de70ce037 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -14,7 +14,7 @@ import "package:photos/services/machine_learning/semantic_search/clip/clip_image import "package:photos/utils/ml_util.dart"; import "package:synchronized/synchronized.dart"; -enum MLOperation { analyzeImage, loadModels } +enum MLOperation { analyzeImage, loadModels, releaseModels } class MLIsolate { static final _logger = Logger("MLIsolate"); @@ -101,6 +101,17 @@ class MLIsolate { } sendPort.send(List.from(addresses, growable: false)); break; + case MLOperation.releaseModels: + final modelNames = args['modelNames'] as List; + final modelAddresses = args['modelAddresses'] as List; + for (int i = 0; i < modelNames.length; i++) { + await MlModel.releaseModel( + modelNames[i], + modelAddresses[i], + ); + } + sendPort.send(true); + break; } } catch (e, s) { _logger.severe("Error in FaceML isolate", e, s); @@ -273,7 +284,41 @@ class MLIsolate { model.storeSessionAddress(address); } } catch (e, s) { - _logger.severe("Could not load models in isolate", e, s); + _logger.severe("Could not load models in MLIndexingIsolate", e, s); + rethrow; + } + } + + Future releaseModels() async { + final List modelNames = []; + final List modelAddresses = []; + final List models = []; + for (final model in MLModels.values) { + if (!model.isIndexingModel) continue; + final mlModel = model.model; + if (mlModel.isInitialized) { + models.add(model); + modelNames.add(mlModel.modelName); + modelAddresses.add(mlModel.sessionAddress); + } + } + if (modelNames.isEmpty) return; + try { + await _runInIsolate( + ( + MLOperation.releaseModels, + { + "modelNames": modelNames, + "modelAddresses": modelAddresses, + } + ), + ); + for (final model in models) { + model.model.releaseSessionAddress(); + } + _logger.info("Indexing models released in isolate"); + } catch (e, s) { + _logger.severe("Could not release models in MLIndexingIsolate", e, s); rethrow; } } diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 167902d02b..8c46b7d30e 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -47,6 +47,16 @@ abstract class MlModel { } } + void releaseSessionAddress() { + if (_usePlatformPlugin) { + _nativePluginSessionIndex = -1; + _isNativePluginInitialized = false; + } else { + _ffiSessionAddress = -1; + _isFfiInitialized = false; + } + } + // Initializes the model. // If `useEntePlugin` is set to true, the custom plugin is used for initialization. // Note: The custom plugin requires a dedicated isolate for loading the model to ensure thread safety and performance isolation. @@ -106,23 +116,33 @@ abstract class MlModel { } } - // TODO: add release method for native plugin - Future release() async { - if (_isFfiInitialized) { - await _releaseModel({'address': _ffiSessionAddress}); - await ONNXEnv.instance.releaseONNX(modelName); - _isFfiInitialized = false; - _ffiSessionAddress = 0; + static Future releaseModel(String modelName, int sessionAddress) async { + if (_usePlatformPlugin) { + await _releaseModelWithPlatformPlugin(modelName); + } else { + await _releaseModelWithFFI(modelName, sessionAddress); } } - static Future _releaseModel(Map args) async { - final address = args['address'] as int; - if (address == 0) { + static Future _releaseModelWithPlatformPlugin(String modelName) async { + final OnnxDart plugin = OnnxDart(); + final bool? initResult = await plugin.release(modelName); + if (initResult == null || !initResult) { + isolateLogger.severe("Failed to release $modelName with PlatformPlugin."); + throw Exception("Failed to release $modelName with PlatformPlugin."); + } + } + + static Future _releaseModelWithFFI( + String modelName, + int sessionAddress, + ) async { + if (sessionAddress == 0 || sessionAddress == -1) { return; } - final session = OrtSession.fromAddress(address); + final session = OrtSession.fromAddress(sessionAddress); session.release(); + ONNXEnvFFI.instance.releaseONNX(modelName); return; } } diff --git a/mobile/lib/services/machine_learning/ml_models_overview.dart b/mobile/lib/services/machine_learning/ml_models_overview.dart index 039628c142..bb1ec97d30 100644 --- a/mobile/lib/services/machine_learning/ml_models_overview.dart +++ b/mobile/lib/services/machine_learning/ml_models_overview.dart @@ -24,4 +24,15 @@ extension MLModelsExtension on MLModels { return ClipTextEncoder.instance; } } + + bool get isIndexingModel { + switch (this) { + case MLModels.faceDetection: + case MLModels.faceEmbedding: + case MLModels.clipImageEncoder: + return true; + case MLModels.clipTextEncoder: + return false; + } + } } From 16e611b9484c4fe57148208fbdb15197e1a3c04f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:45:41 +0200 Subject: [PATCH 0133/1179] [mob][photos] Release implementation in PlatformPlugin --- mobile/plugins/onnx_dart/lib/onnx_dart.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mobile/plugins/onnx_dart/lib/onnx_dart.dart b/mobile/plugins/onnx_dart/lib/onnx_dart.dart index e04462958b..37ac068dbf 100644 --- a/mobile/plugins/onnx_dart/lib/onnx_dart.dart +++ b/mobile/plugins/onnx_dart/lib/onnx_dart.dart @@ -16,6 +16,10 @@ class OnnxDart { .init(modelType, modelPath, sessionsCount: sessionsCount); } + Future release(String modelType) { + return OnnxDartPlatform.instance.release(modelType); + } + Future predict( Float32List inputData, String modelType, { From d30c04cc554170449655209766e14660fa67636c Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:48:55 +0200 Subject: [PATCH 0134/1179] [mob][photos] Make releasing indexing model automatic --- .../services/machine_learning/ml_isolate.dart | 4 +-- .../services/machine_learning/ml_service.dart | 25 ------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_isolate.dart index 1de70ce037..b450f1da72 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_isolate.dart @@ -179,7 +179,7 @@ class MLIsolate { void _dispose() async { if (!_isIsolateSpawned) return; _logger.info('Disposing isolate and models'); - // await _releaseModels(); TODO: Implement this + await _releaseModels(); _isIsolateSpawned = false; _isolate.kill(); _receivePort.close(); @@ -289,7 +289,7 @@ class MLIsolate { } } - Future releaseModels() async { + Future _releaseModels() async { final List modelNames = []; final List modelAddresses = []; final List models = []; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 98089b6b6a..ed878cdba7 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -501,31 +501,6 @@ class MLService { return actuallyRanML; } - Future _releaseModels() async { - return _initModelLock.synchronized(() async { - _logger.info("dispose called"); - if (!_isModelsInitialized) { - return; - } - try { - await FaceDetectionService.instance.release(); - } catch (e, s) { - _logger.severe("Could not dispose yolo onnx", e, s); - } - try { - await FaceEmbeddingService.instance.release(); - } catch (e, s) { - _logger.severe("Could not dispose mobilefacenet", e, s); - } - try { - await ClipImageEncoder.instance.release(); - } catch (e, s) { - _logger.severe("Could not dispose clip image", e, s); - } - _isModelsInitialized = false; - }); - } - Future _ensureLoadedModels(FileMLInstruction instruction) async { return _initModelLock.synchronized(() async { final faceDetectionLoaded = FaceDetectionService.instance.isInitialized; From 00beadbc0165e48d851936c79c3b0558aa159e9f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:50:56 +0200 Subject: [PATCH 0135/1179] [mob][photos] Rename to MLIndexingIsolate --- ..._isolate.dart => ml_indexing_isolate.dart} | 30 +++++++++---------- .../services/machine_learning/ml_service.dart | 10 +++---- 2 files changed, 20 insertions(+), 20 deletions(-) rename mobile/lib/services/machine_learning/{ml_isolate.dart => ml_indexing_isolate.dart} (93%) diff --git a/mobile/lib/services/machine_learning/ml_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart similarity index 93% rename from mobile/lib/services/machine_learning/ml_isolate.dart rename to mobile/lib/services/machine_learning/ml_indexing_isolate.dart index b450f1da72..fa435ac0eb 100644 --- a/mobile/lib/services/machine_learning/ml_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -14,10 +14,10 @@ import "package:photos/services/machine_learning/semantic_search/clip/clip_image import "package:photos/utils/ml_util.dart"; import "package:synchronized/synchronized.dart"; -enum MLOperation { analyzeImage, loadModels, releaseModels } +enum MLIndexingOperation { analyzeImage, loadModels, releaseModels } -class MLIsolate { - static final _logger = Logger("MLIsolate"); +class MLIndexingIsolate { + static final _logger = Logger("MLIndexingIsolate"); Timer? _inactivityTimer; final Duration _inactivityDuration = const Duration(seconds: 120); @@ -35,9 +35,9 @@ class MLIsolate { bool shouldPauseIndexingAndClustering = false; // Singleton pattern - MLIsolate._privateConstructor(); - static final instance = MLIsolate._privateConstructor(); - factory MLIsolate() => instance; + MLIndexingIsolate._privateConstructor(); + static final instance = MLIndexingIsolate._privateConstructor(); + factory MLIndexingIsolate() => instance; Future _initIsolate() async { return _initIsolateLock.synchronized(() async { @@ -74,13 +74,13 @@ class MLIsolate { mainSendPort.send(receivePort.sendPort); receivePort.listen((message) async { final functionIndex = message[0] as int; - final function = MLOperation.values[functionIndex]; + final function = MLIndexingOperation.values[functionIndex]; final args = message[1] as Map; final sendPort = message[2] as SendPort; try { switch (function) { - case MLOperation.analyzeImage: + case MLIndexingOperation.analyzeImage: final time = DateTime.now(); final MLResult result = await analyzeImageStatic(args); _logger.info( @@ -88,7 +88,7 @@ class MLIsolate { ); sendPort.send(result.toJsonString()); break; - case MLOperation.loadModels: + case MLIndexingOperation.loadModels: final modelNames = args['modelNames'] as List; final modelPaths = args['modelPaths'] as List; final addresses = []; @@ -101,7 +101,7 @@ class MLIsolate { } sendPort.send(List.from(addresses, growable: false)); break; - case MLOperation.releaseModels: + case MLIndexingOperation.releaseModels: final modelNames = args['modelNames'] as List; final modelAddresses = args['modelAddresses'] as List; for (int i = 0; i < modelNames.length; i++) { @@ -122,13 +122,13 @@ class MLIsolate { /// The common method to run any operation in the isolate. It sends the [message] to [_isolateMain] and waits for the result. Future _runInIsolate( - (MLOperation, Map) message, + (MLIndexingOperation, Map) message, ) async { await _initIsolate(); return _functionLock.synchronized(() async { _resetInactivityTimer(); - if (message.$1 == MLOperation.analyzeImage && + if (message.$1 == MLIndexingOperation.analyzeImage && shouldPauseIndexingAndClustering) { return null; } @@ -198,7 +198,7 @@ class MLIsolate { try { final resultJsonString = await _runInIsolate( ( - MLOperation.analyzeImage, + MLIndexingOperation.analyzeImage, { "enteFileID": instruction.enteFile.uploadedFileID ?? -1, "filePath": filePath, @@ -271,7 +271,7 @@ class MLIsolate { try { final addresses = await _runInIsolate( ( - MLOperation.loadModels, + MLIndexingOperation.loadModels, { "modelNames": modelNames, "modelPaths": modelPaths, @@ -306,7 +306,7 @@ class MLIsolate { try { await _runInIsolate( ( - MLOperation.releaseModels, + MLIndexingOperation.releaseModels, { "modelNames": modelNames, "modelAddresses": modelAddresses, diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index ed878cdba7..7ed1ddb8a3 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -26,7 +26,7 @@ import "package:photos/services/machine_learning/face_ml/person/person_service.d import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import 'package:photos/services/machine_learning/ml_exceptions.dart'; -import "package:photos/services/machine_learning/ml_isolate.dart"; +import "package:photos/services/machine_learning/ml_indexing_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; @@ -138,13 +138,13 @@ class MLService { void pauseIndexingAndClustering() { if (_isIndexingOrClusteringRunning) { _shouldPauseIndexingAndClustering = true; - MLIsolate.instance.shouldPauseIndexingAndClustering = true; + MLIndexingIsolate.instance.shouldPauseIndexingAndClustering = true; } } void _cancelPauseIndexingAndClustering() { _shouldPauseIndexingAndClustering = false; - MLIsolate.instance.shouldPauseIndexingAndClustering = false; + MLIndexingIsolate.instance.shouldPauseIndexingAndClustering = false; } /// Analyzes all the images in the database with the latest ml version and stores the results in the database. @@ -380,7 +380,7 @@ class MLService { bool actuallyRanML = false; try { - final MLResult? result = await MLIsolate.instance.analyzeImage( + final MLResult? result = await MLIndexingIsolate.instance.analyzeImage( instruction, ); if (result == null) { @@ -518,7 +518,7 @@ class MLService { _logger.info( 'Loading models. faces: $shouldLoadFaces, clip: $shouldLoadClip', ); - await MLIsolate.instance + await MLIndexingIsolate.instance .loadModels(loadFaces: shouldLoadFaces, loadClip: shouldLoadClip); _logger.info('Models loaded'); _logStatus(); From de5fd245ef21fc81443ce67c226fe3c6bd377ca8 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 21:54:31 +0200 Subject: [PATCH 0136/1179] [mob][photos] Rename to MLComputer --- .../machine_learning/ml_computer.dart} | 25 ++++++++++--------- .../semantic_search_service.dart | 4 +-- mobile/lib/utils/face/face_box_crop.dart | 4 +-- 3 files changed, 17 insertions(+), 16 deletions(-) rename mobile/lib/{utils/image_isolate.dart => services/machine_learning/ml_computer.dart} (91%) diff --git a/mobile/lib/utils/image_isolate.dart b/mobile/lib/services/machine_learning/ml_computer.dart similarity index 91% rename from mobile/lib/utils/image_isolate.dart rename to mobile/lib/services/machine_learning/ml_computer.dart index c30767755f..02f996ede3 100644 --- a/mobile/lib/utils/image_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -11,13 +11,13 @@ import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:synchronized/synchronized.dart"; -enum ImageOperation { +enum MLComputerOperation { generateFaceThumbnails, runClipText, } -class ImageIsolate { - final _logger = Logger('ImageIsolate'); +class MLComputerIsolate { + final _logger = Logger('MLComputerIsolate'); Timer? _inactivityTimer; final Duration _inactivityDuration = const Duration(seconds: 60); @@ -33,9 +33,10 @@ class ImageIsolate { bool isSpawned = false; // Singleton pattern - ImageIsolate._privateConstructor(); - static final ImageIsolate instance = ImageIsolate._privateConstructor(); - factory ImageIsolate() => instance; + MLComputerIsolate._privateConstructor(); + static final MLComputerIsolate instance = + MLComputerIsolate._privateConstructor(); + factory MLComputerIsolate() => instance; Future init() async { return _initLock.synchronized(() async { @@ -72,13 +73,13 @@ class ImageIsolate { receivePort.listen((message) async { final functionIndex = message[0] as int; - final function = ImageOperation.values[functionIndex]; + final function = MLComputerOperation.values[functionIndex]; final args = message[1] as Map; final sendPort = message[2] as SendPort; try { switch (function) { - case ImageOperation.generateFaceThumbnails: + case MLComputerOperation.generateFaceThumbnails: final imagePath = args['imagePath'] as String; final Uint8List imageData = await File(imagePath).readAsBytes(); final faceBoxesJson = @@ -91,7 +92,7 @@ class ImageIsolate { faceBoxes, ); sendPort.send(List.from(results)); - case ImageOperation.runClipText: + case MLComputerOperation.runClipText: final textEmbedding = await ClipTextEncoder.predict(args); sendPort.send(List.from(textEmbedding, growable: false)); break; @@ -105,7 +106,7 @@ class ImageIsolate { /// The common method to run any operation in the isolate. It sends the [message] to [_isolateMain] and waits for the result. Future _runInIsolate( - (ImageOperation, Map) message, + (MLComputerOperation, Map) message, ) async { await ensureSpawned(); return _functionLock.synchronized(() async { @@ -174,7 +175,7 @@ class ImageIsolate { faceBoxes.map((box) => box.toJson()).toList(); return await _runInIsolate( ( - ImageOperation.generateFaceThumbnails, + MLComputerOperation.generateFaceThumbnails, { 'imagePath': imagePath, 'faceBoxesList': faceBoxesJson, @@ -191,7 +192,7 @@ class ImageIsolate { await RemoteAssetsService.instance.getAssetPath(remotePath); final textEmbedding = await _runInIsolate( ( - ImageOperation.runClipText, + MLComputerOperation.runClipText, { "text": query, "address": clipAddress, diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 5460a975ef..0a88a8b1bf 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -16,12 +16,12 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart"; +import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/embedding_store.dart'; import "package:photos/utils/debouncer.dart"; -import "package:photos/utils/image_isolate.dart"; import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; @@ -295,7 +295,7 @@ class SemanticSearchService { if (cachedResult != null) { return cachedResult; } - final textEmbedding = await ImageIsolate.instance.runClipText(query); + final textEmbedding = await MLComputerIsolate.instance.runClipText(query); _queryCache.put(query, textEmbedding); return textEmbedding; } diff --git a/mobile/lib/utils/face/face_box_crop.dart b/mobile/lib/utils/face/face_box_crop.dart index d8e3a10bd1..eadc5834c3 100644 --- a/mobile/lib/utils/face/face_box_crop.dart +++ b/mobile/lib/utils/face/face_box_crop.dart @@ -5,8 +5,8 @@ import "package:photos/core/cache/lru_map.dart"; import "package:photos/face/model/box.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; +import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/utils/file_util.dart"; -import "package:photos/utils/image_isolate.dart"; import "package:photos/utils/thumbnail_util.dart"; import "package:pool/pool.dart"; @@ -53,7 +53,7 @@ Future?> getFaceCrops( faceBoxes.add(e.value); } final List faceCrop = - await ImageIsolate.instance.generateFaceThumbnails( + await MLComputerIsolate.instance.generateFaceThumbnails( // await generateJpgFaceThumbnails( imagePath, faceBoxes, From e65a36d5c71991afe5f0744db6398cc60f1cb7c9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 22:02:39 +0200 Subject: [PATCH 0137/1179] [mob][photos] Never dispose MLComputer --- .../machine_learning/ml_computer.dart | 41 +------------------ 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 02f996ede3..00044a4b8a 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -19,14 +19,9 @@ enum MLComputerOperation { class MLComputerIsolate { final _logger = Logger('MLComputerIsolate'); - Timer? _inactivityTimer; - final Duration _inactivityDuration = const Duration(seconds: 60); - int _activeTasks = 0; - final _initLock = Lock(); final _functionLock = Lock(); - late DartUiIsolate _isolate; late ReceivePort _receivePort = ReceivePort(); late SendPort _mainSendPort; @@ -45,14 +40,12 @@ class MLComputerIsolate { _receivePort = ReceivePort(); try { - _isolate = await DartUiIsolate.spawn( + await DartUiIsolate.spawn( _isolateMain, _receivePort.sendPort, ); _mainSendPort = await _receivePort.first as SendPort; isSpawned = true; - - _resetInactivityTimer(); } catch (e) { _logger.severe('Could not spawn isolate', e); isSpawned = false; @@ -110,11 +103,9 @@ class MLComputerIsolate { ) async { await ensureSpawned(); return _functionLock.synchronized(() async { - _resetInactivityTimer(); final completer = Completer(); final answerPort = ReceivePort(); - _activeTasks++; _mainSendPort.send([message.$1.index, message.$2, answerPort.sendPort]); answerPort.listen((receivedMessage) { @@ -129,41 +120,11 @@ class MLComputerIsolate { completer.complete(receivedMessage); } }); - _activeTasks--; return completer.future; }); } - /// Resets a timer that kills the isolate after a certain amount of inactivity. - /// - /// Should be called after initialization (e.g. inside `init()`) and after every call to isolate (e.g. inside `_runInIsolate()`) - void _resetInactivityTimer() { - _inactivityTimer?.cancel(); - _inactivityTimer = Timer(_inactivityDuration, () { - if (_activeTasks > 0) { - _logger.info('Tasks are still running. Delaying isolate disposal.'); - // Optionally, reschedule the timer to check again later. - _resetInactivityTimer(); - } else { - _logger.info( - 'Clustering Isolate has been inactive for ${_inactivityDuration.inSeconds} seconds with no tasks running. Killing isolate.', - ); - dispose(); - } - }); - } - - /// Disposes the isolate worker. - void dispose() { - if (!isSpawned) return; - - isSpawned = false; - _isolate.kill(); - _receivePort.close(); - _inactivityTimer?.cancel(); - } - /// Generates face thumbnails for all [faceBoxes] in [imageData]. /// /// Uses [generateFaceThumbnailsUsingCanvas] inside the isolate. From 1e695ffd84edb15656a93c0b9b8fc1f6f42c9b6a Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 22:32:16 +0200 Subject: [PATCH 0138/1179] [mob][photos] Make sure ClipText is loaded --- .../machine_learning/ml_computer.dart | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 00044a4b8a..8c370b31d1 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -6,6 +6,7 @@ import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:logging/logging.dart"; import "package:photos/face/model/box.dart"; +import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; @@ -13,6 +14,7 @@ import "package:synchronized/synchronized.dart"; enum MLComputerOperation { generateFaceThumbnails, + loadModel, runClipText, } @@ -85,6 +87,15 @@ class MLComputerIsolate { faceBoxes, ); sendPort.send(List.from(results)); + case MLComputerOperation.loadModel: + final modelName = args['modelName'] as String; + final modelPath = args['modelPath'] as String; + final int address = await MlModel.loadModel( + modelName, + modelPath, + ); + sendPort.send(address); + break; case MLComputerOperation.runClipText: final textEmbedding = await ClipTextEncoder.predict(args); sendPort.send(List.from(textEmbedding, growable: false)); @@ -147,10 +158,12 @@ class MLComputerIsolate { Future> runClipText(String query) async { try { + await _ensureLoadedClipTextModel(); final int clipAddress = ClipTextEncoder.instance.sessionAddress; - final String remotePath = ClipTextEncoder.instance.vocabRemotePath; + final String tokenizerRemotePath = + ClipTextEncoder.instance.vocabRemotePath; final String tokenizerVocabPath = - await RemoteAssetsService.instance.getAssetPath(remotePath); + await RemoteAssetsService.instance.getAssetPath(tokenizerRemotePath); final textEmbedding = await _runInIsolate( ( MLComputerOperation.runClipText, @@ -168,4 +181,27 @@ class MLComputerIsolate { rethrow; } } + + Future _ensureLoadedClipTextModel() async { + try { + if (ClipTextEncoder.instance.isInitialized) return; + final String modelName = ClipTextEncoder.instance.modelName; + final String remotePath = ClipTextEncoder.instance.modelRemotePath; + final String modelPath = + await RemoteAssetsService.instance.getAssetPath(remotePath); + final address = await _runInIsolate( + ( + MLComputerOperation.loadModel, + { + 'modelName': modelName, + 'modelPath': modelPath, + }, + ), + ) as int; + ClipTextEncoder.instance.storeSessionAddress(address); + } catch (e, s) { + _logger.severe("Could not load clip text model in MLComputer", e, s); + rethrow; + } + } } From 91789f7ece884523bc12f39425f3a25a78699029 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 22:34:28 +0200 Subject: [PATCH 0139/1179] [mob][photos] Tiny change --- mobile/lib/services/machine_learning/ml_computer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 8c370b31d1..29d7184bbc 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -183,8 +183,8 @@ class MLComputerIsolate { } Future _ensureLoadedClipTextModel() async { + if (ClipTextEncoder.instance.isInitialized) return; try { - if (ClipTextEncoder.instance.isInitialized) return; final String modelName = ClipTextEncoder.instance.modelName; final String remotePath = ClipTextEncoder.instance.modelRemotePath; final String modelPath = From c26a6039018b386bf1b93842c3672b444673adbd Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 22:43:40 +0200 Subject: [PATCH 0140/1179] [mob][photos] Make bool public --- mobile/lib/services/machine_learning/ml_model.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 8c46b7d30e..eef288423e 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -16,12 +16,12 @@ abstract class MlModel { String get modelName; - static final bool _usePlatformPlugin = Platform.isAndroid; + static final bool usePlatformPlugin = Platform.isAndroid; bool get isInitialized => - _usePlatformPlugin ? _isNativePluginInitialized : _isFfiInitialized; + usePlatformPlugin ? _isNativePluginInitialized : _isFfiInitialized; int get sessionAddress => - _usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; + usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; // isInitialized is used to check if the model is loaded by the ffi based // plugin @@ -38,7 +38,7 @@ abstract class MlModel { } void storeSessionAddress(int address) { - if (_usePlatformPlugin) { + if (usePlatformPlugin) { _nativePluginSessionIndex = address; _isNativePluginInitialized = true; } else { @@ -48,7 +48,7 @@ abstract class MlModel { } void releaseSessionAddress() { - if (_usePlatformPlugin) { + if (usePlatformPlugin) { _nativePluginSessionIndex = -1; _isNativePluginInitialized = false; } else { @@ -65,7 +65,7 @@ abstract class MlModel { String modelName, String modelPath, ) async { - if (_usePlatformPlugin) { + if (usePlatformPlugin) { return await _loadModelWithPlatformPlugin(modelName, modelPath); } else { return await _loadModelWithFFI(modelName, modelPath); @@ -117,7 +117,7 @@ abstract class MlModel { } static Future releaseModel(String modelName, int sessionAddress) async { - if (_usePlatformPlugin) { + if (usePlatformPlugin) { await _releaseModelWithPlatformPlugin(modelName); } else { await _releaseModelWithFFI(modelName, sessionAddress); From 18a5f4d212e2815b875b46a0bd9ff8594ffac72e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 22:49:59 +0200 Subject: [PATCH 0141/1179] [mob][photos] Clip text inference --- mobile/lib/services/machine_learning/ml_computer.dart | 3 +-- .../semantic_search/clip/clip_text_encoder.dart | 11 +++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 29d7184bbc..7697534471 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import "dart:io" show File, Platform; +import "dart:io" show File; import 'dart:isolate'; import 'dart:typed_data' show Uint8List; @@ -171,7 +171,6 @@ class MLComputerIsolate { "text": query, "address": clipAddress, "vocabPath": tokenizerVocabPath, - "useEntePlugin": Platform.isAndroid, } ), ) as List; diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index b73ea93d90..f7ce97d96a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -36,11 +36,14 @@ class ClipTextEncoder extends MlModel { final text = args["text"]; final address = args["address"] as int; final vocabPath = args["vocabPath"] as String; - final useEntePlugin = args["useEntePlugin"] ?? false; final List tokenize = await ClipTextTokenizer.instance.tokenize(text, vocabPath); final int32list = Int32List.fromList(tokenize); - return _runFFIBasedPredict(int32list, address); + if (MlModel.usePlatformPlugin) { + return await _runPlatformPlugin(int32list); + } else { + return _runFFIBasedPredict(int32list, address); + } } static List _runFFIBasedPredict( @@ -65,8 +68,8 @@ class ClipTextEncoder extends MlModel { return embedding; } - static Future> _runEntePlugin(Int32List int32list) async { - final w = EnteWatch("ClipTextEncoder._runEntePlugin")..start(); + static Future> _runPlatformPlugin(Int32List int32list) async { + final w = EnteWatch("ClipTextEncoder._runPlatformPlugin")..start(); final OnnxDart plugin = OnnxDart(); final result = await plugin.predictInt( int32list, From a5b47f16a99b3f4ef07d0b4918a42112f41518f9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 23:28:17 +0200 Subject: [PATCH 0142/1179] [mob][photos] Separate out tokenizer init --- .../machine_learning/ml_computer.dart | 68 ++++++++++++------- .../clip/clip_text_encoder.dart | 6 +- .../clip/clip_text_tokenizer.dart | 5 +- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 7697534471..4b92e41628 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -8,6 +8,7 @@ import "package:logging/logging.dart"; import "package:photos/face/model/box.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import "package:photos/services/remote_assets_service.dart"; import "package:photos/utils/image_ml_util.dart"; import "package:synchronized/synchronized.dart"; @@ -15,6 +16,7 @@ import "package:synchronized/synchronized.dart"; enum MLComputerOperation { generateFaceThumbnails, loadModel, + initializeClipTokenizer, runClipText, } @@ -23,6 +25,7 @@ class MLComputerIsolate { final _initLock = Lock(); final _functionLock = Lock(); + final _initModelLock = Lock(); late ReceivePort _receivePort = ReceivePort(); late SendPort _mainSendPort; @@ -96,6 +99,11 @@ class MLComputerIsolate { ); sendPort.send(address); break; + case MLComputerOperation.initializeClipTokenizer: + final vocabPath = args["vocabPath"] as String; + await ClipTextTokenizer.instance.init(vocabPath); + sendPort.send(true); + break; case MLComputerOperation.runClipText: final textEmbedding = await ClipTextEncoder.predict(args); sendPort.send(List.from(textEmbedding, growable: false)); @@ -160,17 +168,12 @@ class MLComputerIsolate { try { await _ensureLoadedClipTextModel(); final int clipAddress = ClipTextEncoder.instance.sessionAddress; - final String tokenizerRemotePath = - ClipTextEncoder.instance.vocabRemotePath; - final String tokenizerVocabPath = - await RemoteAssetsService.instance.getAssetPath(tokenizerRemotePath); final textEmbedding = await _runInIsolate( ( MLComputerOperation.runClipText, { "text": query, "address": clipAddress, - "vocabPath": tokenizerVocabPath, } ), ) as List; @@ -182,25 +185,40 @@ class MLComputerIsolate { } Future _ensureLoadedClipTextModel() async { - if (ClipTextEncoder.instance.isInitialized) return; - try { - final String modelName = ClipTextEncoder.instance.modelName; - final String remotePath = ClipTextEncoder.instance.modelRemotePath; - final String modelPath = - await RemoteAssetsService.instance.getAssetPath(remotePath); - final address = await _runInIsolate( - ( - MLComputerOperation.loadModel, - { - 'modelName': modelName, - 'modelPath': modelPath, - }, - ), - ) as int; - ClipTextEncoder.instance.storeSessionAddress(address); - } catch (e, s) { - _logger.severe("Could not load clip text model in MLComputer", e, s); - rethrow; - } + return _initModelLock.synchronized(() async { + if (ClipTextEncoder.instance.isInitialized) return; + try { + // Initialize ClipText tokenizer + final String tokenizerRemotePath = + ClipTextEncoder.instance.vocabRemotePath; + final String tokenizerVocabPath = await RemoteAssetsService.instance + .getAssetPath(tokenizerRemotePath); + await _runInIsolate( + ( + MLComputerOperation.initializeClipTokenizer, + {'vocabPath': tokenizerVocabPath}, + ), + ); + + // Load ClipText model + final String modelName = ClipTextEncoder.instance.modelName; + final String modelRemotePath = ClipTextEncoder.instance.modelRemotePath; + final String modelPath = + await RemoteAssetsService.instance.getAssetPath(modelRemotePath); + final address = await _runInIsolate( + ( + MLComputerOperation.loadModel, + { + 'modelName': modelName, + 'modelPath': modelPath, + }, + ), + ) as int; + ClipTextEncoder.instance.storeSessionAddress(address); + } catch (e, s) { + _logger.severe("Could not load clip text model in MLComputer", e, s); + rethrow; + } + }); } } diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index f7ce97d96a..ca25ef7a7d 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -33,11 +33,9 @@ class ClipTextEncoder extends MlModel { factory ClipTextEncoder() => instance; static Future> predict(Map args) async { - final text = args["text"]; + final text = args["text"] as String; final address = args["address"] as int; - final vocabPath = args["vocabPath"] as String; - final List tokenize = - await ClipTextTokenizer.instance.tokenize(text, vocabPath); + final List tokenize = await ClipTextTokenizer.instance.tokenize(text); final int32list = Int32List.fromList(tokenize); if (MlModel.usePlatformPlugin) { return await _runPlatformPlugin(int32list); diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart index e8d317dd43..7ac5c7950d 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart @@ -36,15 +36,14 @@ class ClipTextTokenizer { static final instance = ClipTextTokenizer._privateConstructor(); factory ClipTextTokenizer() => instance; - Future> tokenize(String text, String vocabPath) async { - await _init(vocabPath); + Future> tokenize(String text) async { var tokens = _encode(text); tokens = [sot] + tokens.sublist(0, min(totalTokens - 2, tokens.length)) + [eot]; return tokens + List.filled(totalTokens - tokens.length, 0); } - Future _init(String vocabPath) async { + Future init(String vocabPath) async { if (_isInitialized) return; final vocabFile = File(vocabPath); final String vocabulary = await vocabFile.readAsString(); From 533d5dfa889f9109941a795d00d7b991f91ea0eb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 23:31:34 +0200 Subject: [PATCH 0143/1179] [mob][photos] Use quantized text model --- .../semantic_search/clip/clip_text_encoder.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index ca25ef7a7d..864aa470a8 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -10,7 +10,8 @@ import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_ import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { - static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; + // static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; // Unquantized model + static const _kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; // Quantized model static const _kVocabRemotePath = "bpe_simple_vocab_16e6.txt"; // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; From 14451d522ed972d8b07ee775122722f2d53bf7b1 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 25 Jul 2024 23:34:33 +0200 Subject: [PATCH 0144/1179] [mob][photos] Simplify --- mobile/lib/services/machine_learning/ml_computer.dart | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 4b92e41628..545ad70a37 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -38,7 +38,7 @@ class MLComputerIsolate { MLComputerIsolate._privateConstructor(); factory MLComputerIsolate() => instance; - Future init() async { + Future _init() async { return _initLock.synchronized(() async { if (isSpawned) return; @@ -58,12 +58,6 @@ class MLComputerIsolate { }); } - Future ensureSpawned() async { - if (!isSpawned) { - await init(); - } - } - @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { final receivePort = ReceivePort(); @@ -120,7 +114,7 @@ class MLComputerIsolate { Future _runInIsolate( (MLComputerOperation, Map) message, ) async { - await ensureSpawned(); + await _init(); return _functionLock.synchronized(() async { final completer = Completer(); final answerPort = ReceivePort(); From 892e50b3581e3e1730d90ad1f0a0ac627ae157d7 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 11:34:21 +0200 Subject: [PATCH 0145/1179] [mob][photos] Translations --- mobile/lib/generated/intl/messages_de.dart | 3 ++ mobile/lib/generated/intl/messages_pl.dart | 33 ++++++++++++---------- mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 20 ++++++------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 90c21806c1..8cb4daf49a 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -1083,6 +1083,7 @@ class MessageLookup extends MessageLookupByLibrary { "pairWithPin": MessageLookupByLibrary.simpleMessage("Mit PIN verbinden"), "pairingComplete": MessageLookupByLibrary.simpleMessage("Verbunden"), + "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "Verifizierung steht noch aus"), "passkey": MessageLookupByLibrary.simpleMessage("Passkey"), @@ -1644,6 +1645,8 @@ class MessageLookup extends MessageLookupByLibrary { "verifying": MessageLookupByLibrary.simpleMessage("Verifiziere …"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungs-Schlüssel wird überprüft..."), + "videoInfo": + MessageLookupByLibrary.simpleMessage("Video-Informationen"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("Video"), "videos": MessageLookupByLibrary.simpleMessage("Videos"), "viewActiveSessions": diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 45e590d2ba..364b73e858 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -89,7 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m22(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; static String m23(email) => - "${email} nie posiada konta Ente.\n\nWyślij mu zaproszenie do udostępniania zdjęć."; + "${email} nie posiada konta Ente.\n\nWyślij im zaproszenie do udostępniania zdjęć."; static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; @@ -306,7 +306,7 @@ class MessageLookup extends MessageLookupByLibrary { "androidGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie biometryczne nie jest skonfigurowane na tym urządzeniu. Przejdź do \'Ustawienia > Bezpieczeństwo\', aby dodać uwierzytelnianie biometryczne."), "androidIosWebDesktop": MessageLookupByLibrary.simpleMessage( - "Android, iOS, Strona Internetowa, Komputer"), + "Android, iOS, Strona Internetowa, Aplikacja Komputerowa"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Wymagane uwierzytelnienie"), "appLock": MessageLookupByLibrary.simpleMessage( @@ -355,7 +355,7 @@ class MessageLookup extends MessageLookupByLibrary { "Proszę uwierzytelnić się, aby zmienić hasło"), "authToConfigureTwofactorAuthentication": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnij się, aby skonfigurować uwierzytelnianie dwuskładnikowe"), + "Uwierzytelnij się, aby skonfigurować uwierzytelnianie dwustopniowe"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Proszę uwierzytelnić się, aby zainicjować usuwanie konta"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( @@ -488,7 +488,7 @@ class MessageLookup extends MessageLookupByLibrary { "color": MessageLookupByLibrary.simpleMessage("Kolor"), "confirm": MessageLookupByLibrary.simpleMessage("Potwierdź"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( - "Czy na pewno chcesz wyłączyć uwierzytelnianie dwuetapowe?"), + "Czy na pewno chcesz wyłączyć uwierzytelnianie dwustopniowe?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Potwierdź usunięcie konta"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( @@ -620,7 +620,8 @@ class MessageLookup extends MessageLookupByLibrary { "Wyłącz blokadę ekranu urządzenia, gdy Ente jest na pierwszym planie i w trakcie tworzenia kopii zapasowej. Zwykle nie jest to potrzebne, ale może pomóc w szybszym przesyłaniu i początkowym imporcie dużych bibliotek."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Nie znaleziono urządzenia"), - "didYouKnow": MessageLookupByLibrary.simpleMessage("Czy wiedziałeś?"), + "didYouKnow": + MessageLookupByLibrary.simpleMessage("Czy wiedziałeś/aś?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage("Wyłącz automatyczną blokadę"), "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( @@ -629,10 +630,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Uwaga"), "disableLinkMessage": m18, "disableTwofactor": MessageLookupByLibrary.simpleMessage( - "Wyłącz Uwierzytelnianie Dwuetapowe"), + "Wyłącz uwierzytelnianie dwustopniowe"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie dwuskładnikowe jest wyłączane..."), + "Uwierzytelnianie dwustopniowe jest wyłączane..."), "discord": MessageLookupByLibrary.simpleMessage("Discord"), "dismiss": MessageLookupByLibrary.simpleMessage("Odrzuć"), "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("km"), @@ -1054,8 +1055,8 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("Powiadomienia"), "ok": MessageLookupByLibrary.simpleMessage("Ok"), "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), - "onEnte": MessageLookupByLibrary.simpleMessage( - "Na ente"), + "onEnte": + MessageLookupByLibrary.simpleMessage("W ente"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ups, nie udało się zapisać zmian"), @@ -1075,6 +1076,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sparuj z kodem PIN"), "pairingComplete": MessageLookupByLibrary.simpleMessage("Parowanie zakończone"), + "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "Weryfikacja jest nadal w toku"), "passkey": MessageLookupByLibrary.simpleMessage("Klucz dostępu"), @@ -1564,19 +1566,19 @@ class MessageLookup extends MessageLookupByLibrary { "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 miesiące za darmo w planach rocznych"), - "twofactor": - MessageLookupByLibrary.simpleMessage("Uwierzytelnianie dwuetapowe"), + "twofactor": MessageLookupByLibrary.simpleMessage( + "Uwierzytelnianie dwustopniowe"), "twofactorAuthenticationHasBeenDisabled": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie dwuskładnikowe zostało wyłączone"), + "Uwierzytelnianie dwustopniowe zostało wyłączone"), "twofactorAuthenticationPageTitle": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie dwuskładnikowe"), + "Uwierzytelnianie dwustopniowe"), "twofactorAuthenticationSuccessfullyReset": MessageLookupByLibrary.simpleMessage( - "Pomyślnie zresetowano uwierzytelnianie dwuskładnikowe"), + "Pomyślnie zresetowano uwierzytelnianie dwustopniowe"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie dwuskładnikowe"), + "Uwierzytelnianie dwustopniowe"), "unarchive": MessageLookupByLibrary.simpleMessage("Przywróć z archiwum"), "unarchiveAlbum": @@ -1632,6 +1634,7 @@ class MessageLookup extends MessageLookupByLibrary { "verifying": MessageLookupByLibrary.simpleMessage("Weryfikowanie..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Weryfikowanie klucza odzyskiwania..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("Informacje Wideo"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("wideo"), "videos": MessageLookupByLibrary.simpleMessage("Wideo"), "viewActiveSessions": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 014d33c7af..95fa87bcca 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -884,6 +884,7 @@ class MessageLookup extends MessageLookupByLibrary { "pair": MessageLookupByLibrary.simpleMessage("配对"), "pairWithPin": MessageLookupByLibrary.simpleMessage("用 PIN 配对"), "pairingComplete": MessageLookupByLibrary.simpleMessage("配对完成"), + "panorama": MessageLookupByLibrary.simpleMessage("全景"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage("仍需进行验证"), "passkey": MessageLookupByLibrary.simpleMessage("通行密钥"), @@ -1316,6 +1317,7 @@ class MessageLookup extends MessageLookupByLibrary { "verifying": MessageLookupByLibrary.simpleMessage("正在验证..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage("正在验证恢复密钥..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("视频详情"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("视频"), "videos": MessageLookupByLibrary.simpleMessage("视频"), "viewActiveSessions": MessageLookupByLibrary.simpleMessage("查看活动会话"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index cfa08f740e..563dec0669 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9135,16 +9135,6 @@ class S { ); } - /// `Auto lock` - String get autoLock { - return Intl.message( - 'Auto lock', - name: 'autoLock', - desc: '', - args: [], - ); - } - /// `To enable swipe lock, please setup device passcode or screen lock in your system settings.` String get swipeLockEnablePreSteps { return Intl.message( @@ -9155,6 +9145,16 @@ class S { ); } + /// `Auto lock` + String get autoLock { + return Intl.message( + 'Auto lock', + name: 'autoLock', + desc: '', + args: [], + ); + } + /// `Immediately` String get immediately { return Intl.message( From 739235836e7a65364359deb8ddffe0da3d57ab0a Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 11:39:22 +0200 Subject: [PATCH 0146/1179] [mob][photos] Resolve merge errors --- mobile/lib/services/machine_learning/ml_service.dart | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index a567f1e3ad..31887a7bf0 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -1,11 +1,8 @@ import "dart:async"; -import "dart:developer" as dev show log; -import "dart:io" show File, Platform; -import "dart:isolate"; +import "dart:io" show Platform; import "dart:math" show min; import "dart:typed_data" show Uint8List; -import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:flutter/foundation.dart" show debugPrint, kDebugMode; import "package:logging/logging.dart"; import "package:package_info_plus/package_info_plus.dart"; @@ -32,10 +29,7 @@ import 'package:photos/services/machine_learning/ml_exceptions.dart'; import "package:photos/services/machine_learning/ml_indexing_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; -import "package:photos/utils/image_ml_util.dart"; -import "package:photos/utils/local_settings.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; @@ -45,9 +39,7 @@ class MLService { // Singleton pattern MLService._privateConstructor(); - static final instance = MLService._privateConstructor(); - factory MLService() => instance; final _initModelLock = Lock(); From 1d0cf3875f67142662b3f07cbfd692c0fd5e28da Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 12:59:18 +0200 Subject: [PATCH 0147/1179] [mob][photos] Make sure models are downloaded --- .../services/machine_learning/ml_model.dart | 21 +++++++++++-- .../services/machine_learning/ml_service.dart | 30 +++++++++++++++---- .../machine_learning_settings_page.dart | 9 +++--- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index eef288423e..384ca2b4c5 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -5,6 +5,7 @@ import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:photos/services/machine_learning/onnx_env.dart"; import "package:photos/services/remote_assets_service.dart"; +import "package:synchronized/synchronized.dart"; abstract class MlModel { static final Logger isolateLogger = Logger("MlModelInIsolate"); @@ -16,6 +17,8 @@ abstract class MlModel { String get modelName; + final _downloadModelLock = Lock(); + static final bool usePlatformPlugin = Platform.isAndroid; bool get isInitialized => @@ -32,9 +35,21 @@ abstract class MlModel { int _nativePluginSessionIndex = -1; Future<(String, String)> getModelNameAndPath() async { - final path = - await RemoteAssetsService.instance.getAssetPath(modelRemotePath); - return (modelName, path); + return _downloadModelLock.synchronized(() async { + final path = + await RemoteAssetsService.instance.getAssetPath(modelRemotePath); + return (modelName, path); + }); + } + + Future downloadModel([bool forceRefresh = false]) async { + return _downloadModelLock.synchronized(() async { + if (forceRefresh) { + await RemoteAssetsService.instance.getAssetIfUpdated(modelRemotePath); + } else { + await RemoteAssetsService.instance.getAsset(modelRemotePath); + } + }); } void storeSessionAddress(int address) { diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 31887a7bf0..4235d3cb36 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -43,8 +43,10 @@ class MLService { factory MLService() => instance; final _initModelLock = Lock(); + final _downloadModelLock = Lock(); bool _isInitialized = false; + bool areModelsDownloaded = false; late String client; @@ -52,8 +54,6 @@ class MLService { bool get showClusteringIsHappening => _showClusteringIsHappening; - bool modelsAreLoading = false; - bool debugIndexingDisabled = false; bool _showClusteringIsHappening = false; bool _mlControllerStatus = false; @@ -64,7 +64,7 @@ class MLService { static const _kForceClusteringFaceCount = 8000; /// Only call this function once at app startup, after that you can directly call [runAllML] - Future init() async { + Future init({bool firstTime = false}) async { if (localSettings.isFaceIndexingEnabled == false || _isInitialized) { return; } @@ -78,6 +78,9 @@ class MLService { // Activate FaceRecognitionService await FaceRecognitionService.instance.init(); + // Download models if not already downloaded + unawaited(_ensureDownloadedModels(firstTime)); + // Listen on MachineLearningController Bus.instance.on().listen((event) { if (localSettings.isFaceIndexingEnabled == false) { @@ -509,6 +512,25 @@ class MLService { return actuallyRanML; } + Future _ensureDownloadedModels([bool forceRefresh = false]) async { + if (_downloadModelLock.locked) { + _logger.finest("Download models already in progress"); + } + return _downloadModelLock.synchronized(() async { + if (areModelsDownloaded) { + _logger.finest("Models already downloaded"); + return; + } + _logger.info('Downloading models'); + await Future.wait([ + FaceDetectionService.instance.downloadModel(forceRefresh), + FaceEmbeddingService.instance.downloadModel(forceRefresh), + ClipImageEncoder.instance.downloadModel(forceRefresh), + ]); + areModelsDownloaded = true; + }); + } + Future _ensureLoadedModels(FileMLInstruction instruction) async { return _initModelLock.synchronized(() async { final faceDetectionLoaded = FaceDetectionService.instance.isInitialized; @@ -522,7 +544,6 @@ class MLService { return; } - modelsAreLoading = true; _logger.info( 'Loading models. faces: $shouldLoadFaces, clip: $shouldLoadClip', ); @@ -530,7 +551,6 @@ class MLService { .loadModels(loadFaces: shouldLoadFaces, loadClip: shouldLoadClip); _logger.info('Models loaded'); _logStatus(); - modelsAreLoading = false; }); } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index b7f9158cc5..409f353469 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -119,8 +119,7 @@ class _MachineLearningSettingsPageState onChanged: () async { final isEnabled = await localSettings.toggleFaceIndexing(); if (isEnabled) { - await MLService.instance.init(); - MLService.instance.downloadModels().ignore(); + await MLService.instance.init(firstTime: true); await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); @@ -138,9 +137,9 @@ class _MachineLearningSettingsPageState height: 12, ), hasEnabled - ? MLService.instance.modelsAreLoading - ? const ModelLoadingState() - : const MLStatusWidget() + ? MLService.instance.areModelsDownloaded + ? const MLStatusWidget() + : const ModelLoadingState() : const SizedBox.shrink(), ], ); From e19f3ec99208f3268f831e318e722e3bac91d214 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:02:58 +0200 Subject: [PATCH 0148/1179] [mob][photos] Merge issues --- .../machine_learning/ml_indexing_isolate.dart | 12 ++++++------ mobile/lib/utils/ml_util.dart | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index fa435ac0eb..481dc7915c 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -190,7 +190,7 @@ class MLIndexingIsolate { Future analyzeImage( FileMLInstruction instruction, ) async { - final String filePath = await getImagePathForML(instruction.enteFile); + final String filePath = await getImagePathForML(instruction.file); final Stopwatch stopwatch = Stopwatch()..start(); late MLResult result; @@ -200,7 +200,7 @@ class MLIndexingIsolate { ( MLIndexingOperation.analyzeImage, { - "enteFileID": instruction.enteFile.uploadedFileID ?? -1, + "enteFileID": instruction.file.uploadedFileID ?? -1, "filePath": filePath, "runFaces": instruction.shouldRunFaces, "runClip": instruction.shouldRunClip, @@ -221,21 +221,21 @@ class MLIndexingIsolate { result = MLResult.fromJsonString(resultJsonString); } catch (e, s) { _logger.severe( - "Could not analyze image with ID ${instruction.enteFile.uploadedFileID} \n", + "Could not analyze image with ID ${instruction.file.uploadedFileID} \n", e, s, ); debugPrint( - "This image with ID ${instruction.enteFile.uploadedFileID} has name ${instruction.enteFile.displayName}.", + "This image with ID ${instruction.file.uploadedFileID} has name ${instruction.file.displayName}.", ); final resultBuilder = - MLResult.fromEnteFileID(instruction.enteFile.uploadedFileID!) + MLResult.fromEnteFileID(instruction.file.uploadedFileID!) ..errorOccurred(); return resultBuilder; } stopwatch.stop(); _logger.info( - "Finished Analyze image with uploadedFileID ${instruction.enteFile.uploadedFileID}, in " + "Finished Analyze image with uploadedFileID ${instruction.file.uploadedFileID}, in " "${stopwatch.elapsedMilliseconds} ms (including time waiting for inference engine availability)", ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index e32ffaeb81..dfc18121a5 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -14,6 +14,7 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; +import "package:photos/services/machine_learning/file_ml/file_ml.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; From 70bc65fc257d8080862d0c67f41567f457affc21 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:10:04 +0200 Subject: [PATCH 0149/1179] [mob][photos] Rename --- mobile/lib/services/machine_learning/ml_computer.dart | 9 ++++----- mobile/lib/utils/face/face_box_crop.dart | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 545ad70a37..9c4fabdd4f 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -20,7 +20,7 @@ enum MLComputerOperation { runClipText, } -class MLComputerIsolate { +class MLComputer { final _logger = Logger('MLComputerIsolate'); final _initLock = Lock(); @@ -33,10 +33,9 @@ class MLComputerIsolate { bool isSpawned = false; // Singleton pattern - MLComputerIsolate._privateConstructor(); - static final MLComputerIsolate instance = - MLComputerIsolate._privateConstructor(); - factory MLComputerIsolate() => instance; + MLComputer._privateConstructor(); + static final MLComputer instance = MLComputer._privateConstructor(); + factory MLComputer() => instance; Future _init() async { return _initLock.synchronized(() async { diff --git a/mobile/lib/utils/face/face_box_crop.dart b/mobile/lib/utils/face/face_box_crop.dart index eadc5834c3..197aa31f38 100644 --- a/mobile/lib/utils/face/face_box_crop.dart +++ b/mobile/lib/utils/face/face_box_crop.dart @@ -53,7 +53,7 @@ Future?> getFaceCrops( faceBoxes.add(e.value); } final List faceCrop = - await MLComputerIsolate.instance.generateFaceThumbnails( + await MLComputer.instance.generateFaceThumbnails( // await generateJpgFaceThumbnails( imagePath, faceBoxes, From f488eb35e2ee7fd13f1b6c4701dc8e7c9d056184 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:27:36 +0200 Subject: [PATCH 0150/1179] [mob][photos] Delay loading ClipText --- .../semantic_search_service.dart | 32 ++++--------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 9bc3f6d89d..af20abb9e0 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -1,6 +1,5 @@ -import "dart:async"; +import "dart:async" show unawaited; import "dart:developer" as dev show log; -import "dart:io"; import "dart:math" show min; import "dart:typed_data" show ByteData; import "dart:ui" show Image; @@ -21,7 +20,6 @@ import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_ import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; -import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/ml_util.dart"; import "package:shared_preferences/shared_preferences.dart"; @@ -68,23 +66,7 @@ class SemanticSearchService { }); }); - // ignore: unawaited_futures - _loadTextModel().then((_) async { - try { - _logger.info("Getting text embedding"); - await _getTextEmbedding("warm up text encoder"); - _logger.info("Got text embedding"); - } catch (e) { - _logger.severe("Failed to get text embedding", e); - } - }); - } - - Future dispose() async { - if (!_hasInitialized) return; - _hasInitialized = false; - await ClipTextEncoder.instance.release(); - _cachedImageEmbeddings.clear(); + unawaited(_loadTextModel(delay: true)); } bool isMagicSearchEnabledAndReady() { @@ -250,11 +232,11 @@ class SemanticSearchService { return matchingFileIDs; } - Future _loadTextModel() async { - _logger.info("Initializing ML framework"); + Future _loadTextModel({bool delay = false}) async { + _logger.info("Initializing ClipText"); try { - await ClipTextEncoder.instance - .loadModel(useEntePlugin: Platform.isAndroid); + if (delay) await Future.delayed(const Duration(seconds: 10)); + await MLComputer.instance.runClipText("warm up text encoder"); _textModelIsLoaded = true; } catch (e, s) { _logger.severe("Clip text loading failed", e, s); @@ -285,7 +267,7 @@ class SemanticSearchService { if (cachedResult != null) { return cachedResult; } - final textEmbedding = await MLComputerIsolate.instance.runClipText(query); + final textEmbedding = await MLComputer.instance.runClipText(query); _queryCache.put(query, textEmbedding); return textEmbedding; } From 627ec5f2a6249f98ced4137e369b9107be552ba0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:34:53 +0200 Subject: [PATCH 0151/1179] [mob][photos] Rename --- .../semantic_search/clip/clip_text_encoder.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 864aa470a8..1587a231fe 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -39,7 +39,7 @@ class ClipTextEncoder extends MlModel { final List tokenize = await ClipTextTokenizer.instance.tokenize(text); final int32list = Int32List.fromList(tokenize); if (MlModel.usePlatformPlugin) { - return await _runPlatformPlugin(int32list); + return await _runPlatformPluginPredict(int32list); } else { return _runFFIBasedPredict(int32list, address); } @@ -67,7 +67,7 @@ class ClipTextEncoder extends MlModel { return embedding; } - static Future> _runPlatformPlugin(Int32List int32list) async { + static Future> _runPlatformPluginPredict(Int32List int32list) async { final w = EnteWatch("ClipTextEncoder._runPlatformPlugin")..start(); final OnnxDart plugin = OnnxDart(); final result = await plugin.predictInt( From cf8b9e436504e5286b2f4d62e271542861c92a5b Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:41:45 +0200 Subject: [PATCH 0152/1179] [mob][photos] Simplify --- .../clip/clip_text_encoder.dart | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 1587a231fe..c033f6caf5 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -1,17 +1,15 @@ -import "dart:math"; - import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; -import "package:photos/extensions/stop_watch.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import 'package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart'; import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { // static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; // Unquantized model - static const _kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; // Quantized model + static const _kRemoteBucketModelPath = + "clip-text-vit-32-uint8.onnx"; // Quantized model static const _kVocabRemotePath = "bpe_simple_vocab_16e6.txt"; // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; @@ -56,19 +54,13 @@ class ClipTextEncoder extends MlModel { final session = OrtSession.fromAddress(address); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; - double textNormalization = 0; - for (int i = 0; i < 512; i++) { - textNormalization += embedding[i] * embedding[i]; - } - final double sqrtTextNormalization = sqrt(textNormalization); - for (int i = 0; i < 512; i++) { - embedding[i] = embedding[i] / sqrtTextNormalization; - } + normalizeEmbedding(embedding); return embedding; } - static Future> _runPlatformPluginPredict(Int32List int32list) async { - final w = EnteWatch("ClipTextEncoder._runPlatformPlugin")..start(); + static Future> _runPlatformPluginPredict( + Int32List int32list, + ) async { final OnnxDart plugin = OnnxDart(); final result = await plugin.predictInt( int32list, @@ -76,7 +68,6 @@ class ClipTextEncoder extends MlModel { ); final List embedding = result!.sublist(0, 512); normalizeEmbedding(embedding); - w.stopWithLog("done"); return embedding; } } From 3abf215f8c6d7814a7f54a5e800d0496da0d766e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:47:48 +0200 Subject: [PATCH 0153/1179] [mob][photos] Simplify ClipImage --- .../clip/clip_image_encoder.dart | 20 +++++++------------ .../semantic_search_service.dart | 6 ++---- mobile/lib/utils/ml_util.dart | 3 +-- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index ba68ed1dc7..ae00eea239 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -31,20 +31,14 @@ class ClipImageEncoder extends MlModel { static Future> predict( Image image, ByteData imageByteData, - int sessionAddress, { - bool useEntePlugin = false, - }) async { - final w = EnteWatch("ClipImageEncoder.predict")..start(); + int sessionAddress, + ) async { final inputList = await preprocessImageClip(image, imageByteData); - w.log("preprocessImageClip"); - if (useEntePlugin) { - final result = await _runEntePlugin(inputList); - w.stopWithLog("done"); - return result; + if (MlModel.usePlatformPlugin) { + return await _runPlatformPluginPredict(inputList); + } else { + return _runFFIBasedPredict(inputList, sessionAddress); } - final result = _runFFIBasedPredict(inputList, sessionAddress); - w.stopWithLog("done"); - return result; } static List _runFFIBasedPredict( @@ -64,7 +58,7 @@ class ClipImageEncoder extends MlModel { return embedding; } - static Future> _runEntePlugin( + static Future> _runPlatformPluginPredict( Float32List inputImageList, ) async { final w = EnteWatch("ClipImageEncoder._runEntePlugin")..start(); diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index af20abb9e0..1c196314b0 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -300,14 +300,12 @@ class SemanticSearchService { int enteFileID, Image image, ByteData imageByteData, - int clipImageAddress, { - bool useEntePlugin = false, - }) async { + int clipImageAddress, + ) async { final embedding = await ClipImageEncoder.predict( image, imageByteData, clipImageAddress, - useEntePlugin: useEntePlugin, ); final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index dfc18121a5..883c871e58 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,4 +1,4 @@ -import "dart:io" show File, Platform; +import "dart:io" show File; import "dart:math" as math show sqrt, min, max; import "dart:typed_data" show ByteData; @@ -300,7 +300,6 @@ Future analyzeImageStatic(Map args) async { image, imageByteData, clipImageAddress, - useEntePlugin: Platform.isAndroid, ); result.clip = clipResult; } From 166bcf79865b2b6bc1fe374ec47d4772c2fe39ee Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:53:21 +0200 Subject: [PATCH 0154/1179] [mob][photos] Simplify face detection --- .../face_detection_service.dart | 23 ++++++++++--------- .../face_ml/face_recognition_service.dart | 1 - 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index e13985e50a..2aeb68d604 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -46,11 +46,12 @@ class FaceDetectionService extends MlModel { static Future> predict( ui.Image image, ByteData imageByteData, - int sessionAddress, { - bool useEntePlugin = false, - }) async { + int sessionAddress, + ) async { assert( - !useEntePlugin ? (sessionAddress != 0 && sessionAddress != -1) : true, + !MlModel.usePlatformPlugin + ? (sessionAddress != 0 && sessionAddress != -1) + : true, 'sessionAddress should be valid', ); @@ -79,10 +80,10 @@ class FaceDetectionService extends MlModel { List>>? nestedResults = []; try { - if (useEntePlugin) { - nestedResults = await _runEntePlugin(inputImageList); + if (MlModel.usePlatformPlugin) { + nestedResults = await _runPlatformPluginPredict(inputImageList); } else { - nestedResults = _runFFIBasedPlugin( + nestedResults = _runFFIBasedPredict( sessionAddress, inputImageList, ); // [1, 25200, 16] @@ -111,7 +112,7 @@ class FaceDetectionService extends MlModel { } } - static List>>? _runFFIBasedPlugin( + static List>>? _runFFIBasedPredict( int sessionAddress, Float32List inputImageList, ) { @@ -129,13 +130,13 @@ class FaceDetectionService extends MlModel { final runOptions = OrtRunOptions(); final session = OrtSession.fromAddress(sessionAddress); - final List? outputs = session.run(runOptions, inputs); + final List outputs = session.run(runOptions, inputs); // inputOrt.release(); // runOptions.release(); - return outputs?[0]?.value as List>>; // [1, 25200, 16] + return outputs[0]?.value as List>>; // [1, 25200, 16] } - static Future>>> _runEntePlugin( + static Future>>> _runPlatformPluginPredict( Float32List inputImageList, ) async { final OnnxDart plugin = OnnxDart(); diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index e6f2f1a62e..69e55e209c 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -262,7 +262,6 @@ class FaceRecognitionService { image, imageByteData, interpreterAddress, - useEntePlugin: Platform.isAndroid, ); // Add detected faces to the faceResults From b625bd1afcc17372f4d23af4969c0429e302b22e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:56:45 +0200 Subject: [PATCH 0155/1179] [mob][photos] Simplify face embedding service --- .../face_embedding/face_embedding_service.dart | 18 +++++++++--------- .../face_ml/face_recognition_service.dart | 2 -- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index acbac0262c..b2f0b2d9d1 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -35,21 +35,21 @@ class FaceEmbeddingService extends MlModel { static Future>> predict( Float32List input, - int sessionAddress, { - bool useEntePlugin = false, - }) async { - if (!useEntePlugin) { + int sessionAddress, + ) async { + if (!MlModel.usePlatformPlugin) { assert(sessionAddress != 0 && sessionAddress != -1); } try { - if (useEntePlugin) { - return await _runEntePlugin(input); + if (MlModel.usePlatformPlugin) { + return await _runPlatformPluginPredict(input); } else { return _runFFIBasedPredict(input, sessionAddress); } } catch (e) { _logger.info( - 'MobileFaceNet (entePlugin: $useEntePlugin)Error while running inference: $e',); + 'MobileFaceNet (PlatformPlugin: $MlModel.usePlatformPlugin)Error while running inference: $e', + ); throw MobileFaceNetInterpreterRunException(); } } @@ -82,7 +82,7 @@ class FaceEmbeddingService extends MlModel { return embeddings; } - static Future>> _runEntePlugin( + static Future>> _runPlatformPluginPredict( Float32List inputImageList, ) async { final stopwatch = Stopwatch()..start(); @@ -102,7 +102,7 @@ class FaceEmbeddingService extends MlModel { normalizeEmbedding(embedding); } _logger.info( - 'MobileFaceNetEntePlugin interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', + 'MobileFaceNetPlatformPlugin interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', ); return embeddings; } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 69e55e209c..3c00620873 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -1,6 +1,5 @@ import "dart:async" show unawaited; import "dart:developer" as dev show log; -import "dart:io"; import "dart:typed_data" show ByteData, Float32List; import "dart:ui" show Image; @@ -327,7 +326,6 @@ class FaceRecognitionService { final List> embeddings = await FaceEmbeddingService.predict( facesList, interpreterAddress, - useEntePlugin: Platform.isAndroid, ); // Store the results From 2a04af9be0a781a425c87e9d92d36845bb686937 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 13:59:58 +0200 Subject: [PATCH 0156/1179] [mob][photos] Inline --- mobile/lib/ui/settings/machine_learning_settings_page.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 409f353469..78f8c14b3f 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -148,8 +148,8 @@ class _MachineLearningSettingsPageState class ModelLoadingState extends StatefulWidget { const ModelLoadingState({ - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _ModelLoadingStateState(); @@ -222,7 +222,7 @@ class _ModelLoadingStateState extends State { alignCaptionedTextToLeft: true, isGestureDetectorDisabled: true, ); - }).toList(), + }), ], ); } From e205b07e6067354024eef3319ce31a025fcd0723 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 17:31:03 +0200 Subject: [PATCH 0157/1179] [mob][photos] Remove comments --- mobile/lib/services/machine_learning/ml_model.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index 384ca2b4c5..daad0ad61a 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -26,8 +26,6 @@ abstract class MlModel { int get sessionAddress => usePlatformPlugin ? _nativePluginSessionIndex : _ffiSessionAddress; - // isInitialized is used to check if the model is loaded by the ffi based - // plugin bool _isFfiInitialized = false; int _ffiSessionAddress = -1; @@ -72,9 +70,7 @@ abstract class MlModel { } } - // Initializes the model. - // If `useEntePlugin` is set to true, the custom plugin is used for initialization. - // Note: The custom plugin requires a dedicated isolate for loading the model to ensure thread safety and performance isolation. + // Note: The platform plugin requires a dedicated isolate for loading the model to ensure thread safety and performance isolation. // In contrast, the current FFI-based plugin leverages the session memory address for session management, which does not require a dedicated isolate. static Future loadModel( String modelName, From 3cc05d5c420bde52f7b5efff30b7a034ee1f1975 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 26 Jul 2024 17:39:34 +0200 Subject: [PATCH 0158/1179] [mob][photos] Fix in isolate message --- mobile/lib/services/machine_learning/ml_computer.dart | 6 +++--- .../lib/services/machine_learning/ml_indexing_isolate.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 9c4fabdd4f..753725abc0 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -21,7 +21,7 @@ enum MLComputerOperation { } class MLComputer { - final _logger = Logger('MLComputerIsolate'); + final _logger = Logger('MLComputer'); final _initLock = Lock(); final _functionLock = Lock(); @@ -99,7 +99,7 @@ class MLComputer { break; case MLComputerOperation.runClipText: final textEmbedding = await ClipTextEncoder.predict(args); - sendPort.send(List.from(textEmbedding, growable: false)); + sendPort.send(List.from(textEmbedding, growable: false)); break; } } catch (e, stackTrace) { @@ -158,8 +158,8 @@ class MLComputer { } Future> runClipText(String query) async { + await _ensureLoadedClipTextModel(); try { - await _ensureLoadedClipTextModel(); final int clipAddress = ClipTextEncoder.instance.sessionAddress; final textEmbedding = await _runInIsolate( ( diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index 481dc7915c..7636135289 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -99,7 +99,7 @@ class MLIndexingIsolate { ); addresses.add(address); } - sendPort.send(List.from(addresses, growable: false)); + sendPort.send(List.from(addresses, growable: false)); break; case MLIndexingOperation.releaseModels: final modelNames = args['modelNames'] as List; From d5b5b9bd51873e64d2a7e893aec7efe656da37f8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 1 Aug 2024 14:53:38 +0530 Subject: [PATCH 0159/1179] [mob][photos] Rename VideoWidgetNew to VideoWidgetMediaKit --- mobile/lib/ui/viewer/file/file_widget.dart | 4 ++-- ...{video_widget_new.dart => video_widget_media_kit.dart} | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) rename mobile/lib/ui/viewer/file/{video_widget_new.dart => video_widget_media_kit.dart} (98%) diff --git a/mobile/lib/ui/viewer/file/file_widget.dart b/mobile/lib/ui/viewer/file/file_widget.dart index 0fd1181d9a..c11c577914 100644 --- a/mobile/lib/ui/viewer/file/file_widget.dart +++ b/mobile/lib/ui/viewer/file/file_widget.dart @@ -6,7 +6,7 @@ import 'package:logging/logging.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; import "package:photos/ui/viewer/file/video_widget.dart"; -import "package:photos/ui/viewer/file/video_widget_new.dart"; +import "package:photos/ui/viewer/file/video_widget_media_kit.dart"; import "package:photos/ui/viewer/file/zoomable_live_image_new.dart"; class FileWidget extends StatelessWidget { @@ -51,7 +51,7 @@ class FileWidget extends StatelessWidget { playbackCallback: playbackCallback, ); } - return VideoWidgetNew( + return VideoWidgetMediaKit( file, tagPrefix: tagPrefix, playbackCallback: playbackCallback, diff --git a/mobile/lib/ui/viewer/file/video_widget_new.dart b/mobile/lib/ui/viewer/file/video_widget_media_kit.dart similarity index 98% rename from mobile/lib/ui/viewer/file/video_widget_new.dart rename to mobile/lib/ui/viewer/file/video_widget_media_kit.dart index dec11b3ca1..403eab3c67 100644 --- a/mobile/lib/ui/viewer/file/video_widget_new.dart +++ b/mobile/lib/ui/viewer/file/video_widget_media_kit.dart @@ -22,11 +22,11 @@ import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/toast_util.dart"; -class VideoWidgetNew extends StatefulWidget { +class VideoWidgetMediaKit extends StatefulWidget { final EnteFile file; final String? tagPrefix; final Function(bool)? playbackCallback; - const VideoWidgetNew( + const VideoWidgetMediaKit( this.file, { this.tagPrefix, this.playbackCallback, @@ -34,10 +34,10 @@ class VideoWidgetNew extends StatefulWidget { }); @override - State createState() => _VideoWidgetNewState(); + State createState() => _VideoWidgetMediaKitState(); } -class _VideoWidgetNewState extends State +class _VideoWidgetMediaKitState extends State with WidgetsBindingObserver { final Logger _logger = Logger("VideoWidgetNew"); static const verticalMargin = 72.0; From 9b5b1d297b806e7fb4b83cfa7a659d3282961b7c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 1 Aug 2024 15:52:41 +0530 Subject: [PATCH 0160/1179] [mob][photos] Start integrating native_video_player --- mobile/lib/ui/viewer/file/file_widget.dart | 4 +- .../ui/viewer/file/video_widget_native.dart | 349 ++++++++++++++++++ 2 files changed, 351 insertions(+), 2 deletions(-) create mode 100644 mobile/lib/ui/viewer/file/video_widget_native.dart diff --git a/mobile/lib/ui/viewer/file/file_widget.dart b/mobile/lib/ui/viewer/file/file_widget.dart index c11c577914..92c7a1523f 100644 --- a/mobile/lib/ui/viewer/file/file_widget.dart +++ b/mobile/lib/ui/viewer/file/file_widget.dart @@ -6,7 +6,7 @@ import 'package:logging/logging.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; import "package:photos/ui/viewer/file/video_widget.dart"; -import "package:photos/ui/viewer/file/video_widget_media_kit.dart"; +import "package:photos/ui/viewer/file/video_widget_native.dart"; import "package:photos/ui/viewer/file/zoomable_live_image_new.dart"; class FileWidget extends StatelessWidget { @@ -51,7 +51,7 @@ class FileWidget extends StatelessWidget { playbackCallback: playbackCallback, ); } - return VideoWidgetMediaKit( + return VideoWidgetNative( file, tagPrefix: tagPrefix, playbackCallback: playbackCallback, diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart new file mode 100644 index 0000000000..4754b4ba77 --- /dev/null +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -0,0 +1,349 @@ +import "dart:async"; +import "dart:io"; + +import "package:flutter/cupertino.dart"; +import "package:flutter/material.dart"; +import "package:logging/logging.dart"; +import "package:media_kit/media_kit.dart"; +import "package:media_kit_video/media_kit_video.dart"; +import "package:native_video_player/native_video_player.dart"; +import "package:photos/core/constants.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/file_swipe_lock_event.dart"; +import "package:photos/events/pause_video_event.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/file/extensions/file_props.dart"; +import "package:photos/models/file/file.dart"; +import "package:photos/services/files_service.dart"; +import "package:photos/theme/colors.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/actions/file/file_actions.dart"; +import "package:photos/ui/viewer/file/thumbnail_widget.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/file_util.dart"; +import "package:photos/utils/toast_util.dart"; + +class VideoWidgetNative extends StatefulWidget { + final EnteFile file; + final String? tagPrefix; + final Function(bool)? playbackCallback; + const VideoWidgetNative( + this.file, { + this.tagPrefix, + this.playbackCallback, + super.key, + }); + + @override + State createState() => _VideoWidgetNativeState(); +} + +class _VideoWidgetNativeState extends State + with WidgetsBindingObserver { + final Logger _logger = Logger("VideoWidgetNew"); + static const verticalMargin = 72.0; + late final player = Player(); + VideoController? controller; + final _progressNotifier = ValueNotifier(null); + late StreamSubscription playingStreamSubscription; + bool _isAppInFG = true; + late StreamSubscription pauseVideoSubscription; + bool _isFileSwipeLocked = false; + late final StreamSubscription + _fileSwipeLockEventSubscription; + + String? _filePath; + double? aspectRatio; + + @override + void initState() { + _logger.info( + 'initState for ${widget.file.generatedID} with tag ${widget.file.tag} and name ${widget.file.displayName}', + ); + super.initState(); + WidgetsBinding.instance.addObserver(this); + if (widget.file.isRemoteFile) { + _loadNetworkVideo(); + _setFileSizeIfNull(); + } else if (widget.file.isSharedMediaToAppSandbox) { + final localFile = File(getSharedMediaFilePath(widget.file)); + if (localFile.existsSync()) { + _setFilePathForNativePlayer(localFile.path); + } else if (widget.file.uploadedFileID != null) { + _loadNetworkVideo(); + } + } else { + widget.file.getAsset.then((asset) async { + if (asset == null || !(await asset.exists)) { + if (widget.file.uploadedFileID != null) { + _loadNetworkVideo(); + } + } else { + // ignore: unawaited_futures + asset.getMediaUrl().then((url) { + _setFilePathForNativePlayer( + url ?? + 'https://user-images.githubusercontent.com/28951144/229373695-22f88f13-d18f-4288-9bf1-c3e078d83722.mp4', + ); + }); + } + }); + } + playingStreamSubscription = player.stream.playing.listen((event) { + if (widget.playbackCallback != null && mounted) { + widget.playbackCallback!(event); + } + }); + + pauseVideoSubscription = Bus.instance.on().listen((event) { + player.pause(); + }); + _fileSwipeLockEventSubscription = + Bus.instance.on().listen((event) { + setState(() { + _isFileSwipeLocked = event.shouldSwipeLock; + }); + }); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _isAppInFG = true; + } else { + _isAppInFG = false; + } + } + + @override + void dispose() { + _fileSwipeLockEventSubscription.cancel(); + pauseVideoSubscription.cancel(); + removeCallBack(widget.file); + _progressNotifier.dispose(); + WidgetsBinding.instance.removeObserver(this); + playingStreamSubscription.cancel(); + player.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Hero( + tag: widget.tagPrefix! + widget.file.tag, + child: GestureDetector( + onVerticalDragUpdate: _isFileSwipeLocked + ? null + : (d) => { + if (d.delta.dy > dragSensitivity) + { + Navigator.of(context).pop(), + } + else if (d.delta.dy < (dragSensitivity * -1)) + { + showDetailsSheet(context, widget.file), + }, + }, + child: _filePath == null + ? _getLoadingWidget() + : Center( + child: AspectRatio( + aspectRatio: aspectRatio ?? 1, + child: NativeVideoPlayerView( + onViewReady: (controller) async { + final videoSource = await VideoSource.init( + path: _filePath!, + type: VideoSourceType.file, + ); + await controller.loadVideoSource(videoSource); + await controller.play(); + }, + ), + ), + ), + ), + ); + } + + void _loadNetworkVideo() { + getFileFromServer( + widget.file, + progressCallback: (count, total) { + if (!mounted) { + return; + } + _progressNotifier.value = count / (widget.file.fileSize ?? total); + if (_progressNotifier.value == 1) { + if (mounted) { + showShortToast(context, S.of(context).decryptingVideo); + } + } + }, + ).then((file) { + if (file != null) { + _setFilePathForNativePlayer(file.path); + } + }).onError((error, stackTrace) { + showErrorDialog(context, "Error", S.of(context).failedToDownloadVideo); + }); + } + + void _setFileSizeIfNull() { + if (widget.file.fileSize == null && widget.file.canEditMetaInfo) { + FilesService.instance + .getFileSize(widget.file.uploadedFileID!) + .then((value) { + widget.file.fileSize = value; + if (mounted) { + setState(() {}); + } + }); + } + } + + Widget _getLoadingWidget() { + return Stack( + children: [ + _getThumbnail(), + Container( + color: Colors.black12, + constraints: const BoxConstraints.expand(), + ), + Center( + child: SizedBox.fromSize( + size: const Size.square(20), + child: ValueListenableBuilder( + valueListenable: _progressNotifier, + builder: (BuildContext context, double? progress, _) { + return progress == null || progress == 1 + ? const CupertinoActivityIndicator( + color: Colors.white, + ) + : CircularProgressIndicator( + backgroundColor: Colors.black, + value: progress, + valueColor: const AlwaysStoppedAnimation( + Color.fromRGBO(45, 194, 98, 1.0), + ), + ); + }, + ), + ), + ), + ], + ); + } + + Widget _getThumbnail() { + return Container( + color: Colors.black, + constraints: const BoxConstraints.expand(), + child: ThumbnailWidget( + widget.file, + fit: BoxFit.contain, + ), + ); + } + + void _setFilePathForNativePlayer(String url) { + if (mounted) { + setState(() { + _filePath = url; + }); + // setAspectRatioFromVideoProps().then((_) { + // setState(() {}); + // }); + } + } +} + +class PausePlayAndDuration extends StatefulWidget { + final Player? player; + const PausePlayAndDuration(this.player, {super.key}); + + @override + State createState() => _PausePlayAndDurationState(); +} + +class _PausePlayAndDurationState extends State { + Color backgroundColor = fillStrongLight; + @override + Widget build(BuildContext context) { + return GestureDetector( + onTapDown: (details) { + setState(() { + backgroundColor = fillMutedDark; + }); + }, + onTapUp: (details) { + Future.delayed(const Duration(milliseconds: 175), () { + if (mounted) { + setState(() { + backgroundColor = fillStrongLight; + }); + } + }); + }, + onTapCancel: () { + Future.delayed(const Duration(milliseconds: 175), () { + if (mounted) { + setState(() { + backgroundColor = fillStrongLight; + }); + } + }); + }, + onTap: () => widget.player!.playOrPause(), + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + curve: Curves.easeInBack, + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + decoration: BoxDecoration( + color: backgroundColor, + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + borderRadius: BorderRadius.circular(24), + ), + child: AnimatedSize( + duration: const Duration(seconds: 2), + curve: Curves.easeInOutExpo, + child: Row( + children: [ + StreamBuilder( + builder: (context, snapshot) { + final bool isPlaying = snapshot.data ?? false; + return AnimatedSwitcher( + duration: const Duration(milliseconds: 350), + switchInCurve: Curves.easeInOutCirc, + switchOutCurve: Curves.easeInOutCirc, + child: Icon( + key: ValueKey( + isPlaying ? "pause_button" : "play_button", + ), + isPlaying + ? Icons.pause_rounded + : Icons.play_arrow_rounded, + color: backdropBaseLight, + size: 24, + ), + ); + }, + initialData: widget.player?.state.playing, + stream: widget.player?.stream.playing, + ), + const SizedBox(width: 8), + MaterialPositionIndicator( + style: getEnteTextTheme(context).tiny.copyWith( + color: textBaseDark, + ), + ), + const SizedBox(width: 10), + ], + ), + ), + ), + ); + } +} From 7d8a7257b40acf1c801b09553d70e0ffbd11e0ee Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:46:05 +0530 Subject: [PATCH 0161/1179] [cli] Add list of filters --- cli/pkg/model/export/filter.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 cli/pkg/model/export/filter.go diff --git a/cli/pkg/model/export/filter.go b/cli/pkg/model/export/filter.go new file mode 100644 index 0000000000..742d5fef38 --- /dev/null +++ b/cli/pkg/model/export/filter.go @@ -0,0 +1,14 @@ +package export + +type Filters struct { + // When true, none of the shared albums are exported + ExcludeShared bool + // When true, none of the shared files are exported + ExcludeSharedFiles bool + // When true, hidden albums are not exported + ExcludeHidden bool + // when album name is provided, only files in those albums are exported + Albums []string + // when email is provided, only files shared with that email are exported + Emails []string +} From 0526c63681e86ba20391126a7341290b7cac8707 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:52:58 +0530 Subject: [PATCH 0162/1179] [cli] Extend export command to pass filters --- cli/cmd/export.go | 29 +++++++++++++++++++++++++++-- cli/pkg/sync.go | 3 ++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/cli/cmd/export.go b/cli/cmd/export.go index 57548c4fe5..fa253cce64 100644 --- a/cli/cmd/export.go +++ b/cli/cmd/export.go @@ -1,19 +1,44 @@ package cmd import ( + "github.com/ente-io/cli/pkg/model/export" "github.com/spf13/cobra" ) -// versionCmd represents the version command +// exportCmd represents the export command var exportCmd = &cobra.Command{ Use: "export", Short: "Starts the export process", Long: ``, Run: func(cmd *cobra.Command, args []string) { - ctrl.Export() + // Retrieve flag values + shared, _ := cmd.Flags().GetBool("shared") + sharedFiles, _ := cmd.Flags().GetBool("shared-files") + hidden, _ := cmd.Flags().GetBool("hidden") + albums, _ := cmd.Flags().GetStringSlice("albums") + emails, _ := cmd.Flags().GetStringSlice("emails") + + // Create Filters struct with flag values + filters := export.Filters{ + ExcludeShared: !shared, + ExcludeSharedFiles: !sharedFiles, + ExcludeHidden: !hidden, + Albums: albums, + Emails: emails, + } + + // Call the Export function with the filters + ctrl.Export(filters) }, } func init() { rootCmd.AddCommand(exportCmd) + + // Add flags for Filters struct fields with default value true + exportCmd.Flags().Bool("shared", true, "Include shared albums in export") + exportCmd.Flags().Bool("shared-files", true, "Include shared files in export") + exportCmd.Flags().Bool("hidden", true, "Include hidden albums in export") + exportCmd.Flags().StringSlice("albums", []string{}, "Comma-separated list of album names to export") + exportCmd.Flags().StringSlice("emails", []string{}, "Comma-separated list of emails to export files shared with") } diff --git a/cli/pkg/sync.go b/cli/pkg/sync.go index 6aee7cbb75..d6cbf06bf5 100644 --- a/cli/pkg/sync.go +++ b/cli/pkg/sync.go @@ -7,12 +7,13 @@ import ( "github.com/ente-io/cli/internal" "github.com/ente-io/cli/internal/api" "github.com/ente-io/cli/pkg/model" + "github.com/ente-io/cli/pkg/model/export" bolt "go.etcd.io/bbolt" "log" "time" ) -func (c *ClICtrl) Export() error { +func (c *ClICtrl) Export(filters export.Filters) error { accounts, err := c.GetAccounts(context.Background()) if err != nil { return err From 31318f10d6da0aff609d20875012b309237f2c91 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 1 Aug 2024 18:38:34 +0530 Subject: [PATCH 0163/1179] [mob][photos] Set aspect ratio of video --- .../ui/viewer/file/video_widget_native.dart | 22 ++++++++++++++++--- mobile/lib/utils/exif_util.dart | 3 +++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 4754b4ba77..ba80325cf2 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -20,6 +20,7 @@ import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/file/file_actions.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/exif_util.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/toast_util.dart"; @@ -250,9 +251,24 @@ class _VideoWidgetNativeState extends State setState(() { _filePath = url; }); - // setAspectRatioFromVideoProps().then((_) { - // setState(() {}); - // }); + _setAspectRatioFromVideoProps().then((_) { + setState(() {}); + }); + } + } + + Future _setAspectRatioFromVideoProps() async { + final videoProps = await getVideoPropsAsync(File(_filePath!)); + if (videoProps != null) { + if (videoProps.width != null && videoProps.height != null) { + aspectRatio = videoProps.width! / videoProps.height!; + } else { + _logger.info("Video props width and height are null"); + aspectRatio = 1; + } + } else { + _logger.info("Video props are null"); + aspectRatio = 1; } } } diff --git a/mobile/lib/utils/exif_util.dart b/mobile/lib/utils/exif_util.dart index d9bac85e6d..cbe09502e8 100644 --- a/mobile/lib/utils/exif_util.dart +++ b/mobile/lib/utils/exif_util.dart @@ -58,6 +58,7 @@ Future?> getExifFromSourceFile(File originFile) async { Future getVideoPropsAsync(File originalFile) async { try { + final stopwatch = Stopwatch()..start(); final Map logs = {}; final completer = Completer(); @@ -95,6 +96,8 @@ Future getVideoPropsAsync(File originalFile) async { return null; } final properties = await FFProbeUtil.getProperties(mediaInfo); + _logger.info("getVideoPropsAsync took ${stopwatch.elapsedMilliseconds}ms"); + stopwatch.stop(); return properties; } catch (e, s) { _logger.severe("Failed to getVideoProps", e, s); From 395f0384a063dbb9693b70ba04c79d6f07994803 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 1 Aug 2024 19:13:03 +0530 Subject: [PATCH 0164/1179] [cli] Add option to exlude shared or hidden folders --- cli/cmd/export.go | 21 ++++------- cli/pkg/admin_actions.go | 2 +- cli/pkg/model/constants.go | 6 +++ cli/pkg/model/filter.go | 66 +++++++++++++++++++++++++++++++++ cli/pkg/model/remote.go | 7 ++++ cli/pkg/remote_sync.go | 5 +++ cli/pkg/remote_to_disk_album.go | 5 ++- cli/pkg/remote_to_disk_file.go | 14 +++++++ cli/pkg/sync.go | 19 +++++++--- 9 files changed, 124 insertions(+), 21 deletions(-) create mode 100644 cli/pkg/model/filter.go diff --git a/cli/cmd/export.go b/cli/cmd/export.go index fa253cce64..0979bbeb5e 100644 --- a/cli/cmd/export.go +++ b/cli/cmd/export.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/ente-io/cli/pkg/model/export" + "github.com/ente-io/cli/pkg/model" "github.com/spf13/cobra" ) @@ -13,20 +13,16 @@ var exportCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { // Retrieve flag values shared, _ := cmd.Flags().GetBool("shared") - sharedFiles, _ := cmd.Flags().GetBool("shared-files") hidden, _ := cmd.Flags().GetBool("hidden") albums, _ := cmd.Flags().GetStringSlice("albums") emails, _ := cmd.Flags().GetStringSlice("emails") - // Create Filters struct with flag values - filters := export.Filters{ - ExcludeShared: !shared, - ExcludeSharedFiles: !sharedFiles, - ExcludeHidden: !hidden, - Albums: albums, - Emails: emails, + filters := model.Filter{ + ExcludeShared: !shared, + ExcludeHidden: !hidden, + Albums: albums, + Emails: emails, } - // Call the Export function with the filters ctrl.Export(filters) }, @@ -36,9 +32,8 @@ func init() { rootCmd.AddCommand(exportCmd) // Add flags for Filters struct fields with default value true - exportCmd.Flags().Bool("shared", true, "Include shared albums in export") - exportCmd.Flags().Bool("shared-files", true, "Include shared files in export") - exportCmd.Flags().Bool("hidden", true, "Include hidden albums in export") + exportCmd.Flags().Bool("shared", true, "to exclude shared albums, pass --shared=false") + exportCmd.Flags().Bool("hidden", true, "to exclude hidden albums, pass --hidden=false") exportCmd.Flags().StringSlice("albums", []string{}, "Comma-separated list of album names to export") exportCmd.Flags().StringSlice("emails", []string{}, "Comma-separated list of emails to export files shared with") } diff --git a/cli/pkg/admin_actions.go b/cli/pkg/admin_actions.go index 44af3c27a9..1335ffceb1 100644 --- a/cli/pkg/admin_actions.go +++ b/cli/pkg/admin_actions.go @@ -186,7 +186,7 @@ func (c *ClICtrl) buildAdminContext(ctx context.Context, adminEmail string) (con if err != nil { return nil, err } - accountCtx := c.buildRequestContext(ctx, *acc) + accountCtx := c.buildRequestContext(ctx, *acc, model.Filter{}) c.Client.AddToken(acc.AccountKey(), secretInfo.TokenStr()) return accountCtx, nil } diff --git a/cli/pkg/model/constants.go b/cli/pkg/model/constants.go index 2a9f4cafa1..6ffef41dde 100644 --- a/cli/pkg/model/constants.go +++ b/cli/pkg/model/constants.go @@ -13,3 +13,9 @@ const ( CollectionsSyncKey = "lastCollectionSync" CollectionsFileSyncKeyFmt = "collectionFilesSync-%d" ) + +type ContextKey string + +const ( + FilterKey ContextKey = "export_filter" +) diff --git a/cli/pkg/model/filter.go b/cli/pkg/model/filter.go new file mode 100644 index 0000000000..6f083c3f32 --- /dev/null +++ b/cli/pkg/model/filter.go @@ -0,0 +1,66 @@ +package model + +import ( + "log" + "strings" +) + +type Filter struct { + // When true, none of the shared albums are exported + ExcludeShared bool + // When true, none of the shared files are exported + ExcludeSharedFiles bool + // When true, hidden albums are not exported + ExcludeHidden bool + // when album name is provided, only files in those albums are exported + Albums []string + // when email is provided, only files shared with that email are exported + Emails []string +} + +func (f Filter) SkipAccount(email string) bool { + if len(f.Emails) == 0 { + return false + } + for _, e := range f.Emails { + if strings.ToLower(e) == strings.ToLower(strings.TrimSpace(email)) { + return false + } + } + return true +} + +func (f Filter) SkipAlbum(album RemoteAlbum, shouldLog bool) bool { + if f.excludeByName(album) { + if shouldLog { + log.Printf("Skipping album %s as it's not part of album to export", album.AlbumName) + } + return true + } + if f.ExcludeShared && album.IsShared { + if shouldLog { + log.Printf("Skipping album %s as it's shared", album.AlbumName) + } + return true + } + if f.ExcludeHidden && album.IsHidden() { + if shouldLog { + log.Printf("Skipping album %s as it's hidden", album.AlbumName) + } + return true + } + return false +} + +// excludeByName returns true if albums list is not empty and album name is not in the list +func (f Filter) excludeByName(album RemoteAlbum) bool { + if len(f.Albums) > 0 { + for _, a := range f.Albums { + if strings.ToLower(a) == strings.ToLower(strings.TrimSpace(album.AlbumName)) { + return false + } + } + return true + } + return false +} diff --git a/cli/pkg/model/remote.go b/cli/pkg/model/remote.go index d8d6f3fcee..0f8db91fa5 100644 --- a/cli/pkg/model/remote.go +++ b/cli/pkg/model/remote.go @@ -47,6 +47,13 @@ type RemoteAlbum struct { LastUpdatedAt int64 `json:"lastUpdatedAt"` } +func (r *RemoteAlbum) IsHidden() bool { + if value, ok := r.PrivateMeta["visibility"]; ok { + return int64(value.(float64)) == int64(2) + } + return false +} + type AlbumFileEntry struct { FileID int64 `json:"fileID"` AlbumID int64 `json:"albumID"` diff --git a/cli/pkg/remote_sync.go b/cli/pkg/remote_sync.go index 5ca149d719..8ffb6ce41d 100644 --- a/cli/pkg/remote_sync.go +++ b/cli/pkg/remote_sync.go @@ -50,13 +50,18 @@ func (c *ClICtrl) fetchRemoteCollections(ctx context.Context) error { func (c *ClICtrl) fetchRemoteFiles(ctx context.Context) error { albums, err := c.getRemoteAlbums(ctx) + filter := ctx.Value(model.FilterKey).(model.Filter) if err != nil { return err } + for _, album := range albums { if album.IsDeleted { continue } + if filter.SkipAlbum(album, true) { + continue + } lastSyncTime, lastSyncTimeErr := c.GetInt64ConfigValue(ctx, fmt.Sprintf(model.CollectionsFileSyncKeyFmt, album.ID)) if lastSyncTimeErr != nil { diff --git a/cli/pkg/remote_to_disk_album.go b/cli/pkg/remote_to_disk_album.go index 7b0b64f972..dbdb065bec 100644 --- a/cli/pkg/remote_to_disk_album.go +++ b/cli/pkg/remote_to_disk_album.go @@ -24,8 +24,11 @@ func (c *ClICtrl) createLocalFolderForRemoteAlbums(ctx context.Context, account if err != nil { return err } - + filter := ctx.Value(model.FilterKey).(model.Filter) for _, album := range albums { + if filter.SkipAlbum(album, false) { + continue + } if album.IsDeleted { if meta, ok := albumIDToMetaMap[album.ID]; ok { log.Printf("Deleting album %s as it is deleted", meta.AlbumName) diff --git a/cli/pkg/remote_to_disk_file.go b/cli/pkg/remote_to_disk_file.go index 91a105032c..87f5362c6b 100644 --- a/cli/pkg/remote_to_disk_file.go +++ b/cli/pkg/remote_to_disk_file.go @@ -24,6 +24,17 @@ func (c *ClICtrl) syncFiles(ctx context.Context, account model.Account) error { if err != nil { return err } + albumsToSkip := make(map[int64]bool) + filter := ctx.Value(model.FilterKey).(model.Filter) + remoteAlbums, readAlbumErr := c.getRemoteAlbums(ctx) + if readAlbumErr != nil { + return readAlbumErr + } + for _, album := range remoteAlbums { + if !album.IsDeleted && filter.SkipAlbum(album, false) { + albumsToSkip[album.ID] = true + } + } entries, err := c.getRemoteAlbumEntries(ctx) if err != nil { return err @@ -36,6 +47,9 @@ func (c *ClICtrl) syncFiles(ctx context.Context, account model.Account) error { if albumFileEntry.SyncedLocally { continue } + if _, ok := albumsToSkip[albumFileEntry.AlbumID]; ok { + continue + } albumInfo, ok := albumIDToMetaMap[albumFileEntry.AlbumID] if !ok { log.Printf("Album %d not found in local metadata", albumFileEntry.AlbumID) diff --git a/cli/pkg/sync.go b/cli/pkg/sync.go index d6cbf06bf5..af8cc9f649 100644 --- a/cli/pkg/sync.go +++ b/cli/pkg/sync.go @@ -7,13 +7,12 @@ import ( "github.com/ente-io/cli/internal" "github.com/ente-io/cli/internal/api" "github.com/ente-io/cli/pkg/model" - "github.com/ente-io/cli/pkg/model/export" bolt "go.etcd.io/bbolt" "log" "time" ) -func (c *ClICtrl) Export(filters export.Filters) error { +func (c *ClICtrl) Export(filter model.Filter) error { accounts, err := c.GetAccounts(context.Background()) if err != nil { return err @@ -22,8 +21,13 @@ func (c *ClICtrl) Export(filters export.Filters) error { fmt.Printf("No accounts to sync\n Add account using `account add` cmd\n") return nil } + for _, account := range accounts { log.SetPrefix(fmt.Sprintf("[%s-%s] ", account.App, account.Email)) + if filter.SkipAccount(account.Email) { + log.Printf("Skip account %s: account is excluded by filter", account.Email) + continue + } if account.ExportDir == "" { log.Printf("Skip account %s: no export directory configured", account.Email) continue @@ -40,7 +44,7 @@ func (c *ClICtrl) Export(filters export.Filters) error { log.Println("start sync") retryCount := 0 for { - err = c.SyncAccount(account) + err = c.SyncAccount(account, filter) if err != nil { if model.ShouldRetrySync(err) && retryCount < 20 { retryCount = retryCount + 1 @@ -61,12 +65,12 @@ func (c *ClICtrl) Export(filters export.Filters) error { return nil } -func (c *ClICtrl) SyncAccount(account model.Account) error { +func (c *ClICtrl) SyncAccount(account model.Account, filters model.Filter) error { secretInfo, err := c.KeyHolder.LoadSecrets(account) if err != nil { return err } - ctx := c.buildRequestContext(context.Background(), account) + ctx := c.buildRequestContext(context.Background(), account, filters) err = createDataBuckets(c.DB, account) if err != nil { return err @@ -95,10 +99,13 @@ func (c *ClICtrl) SyncAccount(account model.Account) error { return nil } -func (c *ClICtrl) buildRequestContext(ctx context.Context, account model.Account) context.Context { +func (c *ClICtrl) buildRequestContext(ctx context.Context, + account model.Account, + filter model.Filter) context.Context { ctx = context.WithValue(ctx, "app", string(account.App)) ctx = context.WithValue(ctx, "account_key", account.AccountKey()) ctx = context.WithValue(ctx, "user_id", account.UserID) + ctx = context.WithValue(ctx, model.FilterKey, filter) return ctx } From 4f3fe73daa0e5235d97bac011fa808860bd3211a Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 2 Aug 2024 13:33:32 +0530 Subject: [PATCH 0165/1179] [mob][photos] Fix getVideoPropsAsync failing in native video player because a normal file and not the origin file was being passed to it in case of locally available vidoes --- .../lib/ui/viewer/file/video_widget_native.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index ba80325cf2..e4df35e140 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -81,11 +81,9 @@ class _VideoWidgetNativeState extends State } } else { // ignore: unawaited_futures - asset.getMediaUrl().then((url) { - _setFilePathForNativePlayer( - url ?? - 'https://user-images.githubusercontent.com/28951144/229373695-22f88f13-d18f-4288-9bf1-c3e078d83722.mp4', - ); + getFile(widget.file, isOrigin: true).then((file) { + _setFilePathForNativePlayer(file!.path); + file.delete(); }); } }); @@ -261,7 +259,12 @@ class _VideoWidgetNativeState extends State final videoProps = await getVideoPropsAsync(File(_filePath!)); if (videoProps != null) { if (videoProps.width != null && videoProps.height != null) { - aspectRatio = videoProps.width! / videoProps.height!; + if (videoProps.width != null && videoProps.height != 0) { + aspectRatio = videoProps.width! / videoProps.height!; + } else { + _logger.info("Video props height or width is 0"); + aspectRatio = 1; + } } else { _logger.info("Video props width and height are null"); aspectRatio = 1; From eab1be375351375a1b008400253e89045596dedb Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 6 Aug 2024 12:42:45 +0530 Subject: [PATCH 0166/1179] [mob][photos] Add native_video_player to pubspec.yaml --- mobile/pubspec.lock | 8 ++++++++ mobile/pubspec.yaml | 1 + 2 files changed, 9 insertions(+) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index ca98122697..a7eaee85ed 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1598,6 +1598,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.2+6" + native_video_player: + dependency: "direct main" + description: + name: native_video_player + sha256: "8df92df138c13ebf9df6b30525f9c4198534705fd450a98da14856d3a0e48cd4" + url: "https://pub.dev" + source: hosted + version: "1.3.1" nested: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index a03ba4143a..a735f1d973 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -124,6 +124,7 @@ dependencies: motionphoto: git: "https://github.com/ente-io/motionphoto.git" move_to_background: ^1.0.2 + native_video_player: ^1.3.1 onnxruntime: git: url: https://github.com/ente-io/onnxruntime.git From a4921110a2dea212c519c2ab87a88ab288635db4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:49:38 +0530 Subject: [PATCH 0167/1179] [mob] generated strings --- mobile/lib/generated/intl/messages_de.dart | 36 +++++++++++----------- mobile/lib/generated/intl/messages_pl.dart | 10 +++--- mobile/lib/generated/intl/messages_pt.dart | 10 +++--- mobile/lib/generated/intl/messages_zh.dart | 15 ++++----- 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 01a89b268e..0df23439d2 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -136,7 +136,7 @@ class MessageLookup extends MessageLookupByLibrary { "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; static String m40(endDate) => - "Kostenlose Testversion gültig bis ${endDate}.\nSie können anschließend ein bezahltes Paket auswählen."; + "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; static String m41(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; @@ -191,7 +191,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m60(id) => "Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support"; - static String m61(endDate) => "Ihr Abo endet am ${endDate}"; + static String m61(endDate) => "Dein Abo endet am ${endDate}"; static String m62(completed, total) => "${completed}/${total} Erinnerungsstücke gesichert"; @@ -343,12 +343,12 @@ class MessageLookup extends MessageLookupByLibrary { "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Was ist der Hauptgrund für die Löschung deines Kontos?"), "askYourLovedOnesToShare": MessageLookupByLibrary.simpleMessage( - "Bitte deine Liebsten ums teilen"), + "Bitte deine Liebsten ums Teilen"), "atAFalloutShelter": MessageLookupByLibrary.simpleMessage( "in einem ehemaligen Luftschutzbunker"), "authToChangeEmailVerificationSetting": MessageLookupByLibrary.simpleMessage( - "Bitte Authentifizieren um die E-Mail Bestätigung zu ändern"), + "Bitte authentifizieren, um die E-Mail-Bestätigung zu ändern"), "authToChangeLockscreenSetting": MessageLookupByLibrary.simpleMessage( "Bitte authentifizieren, um die Sperrbildschirm-Einstellung zu ändern"), "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( @@ -383,7 +383,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Zeit, nach der die App gesperrt wird, nachdem sie in den Hintergrund verschoben wurde"), "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( - "Aufgrund technischer Störungen wurden Sie abgemeldet. Wir entschuldigen uns für die Unannehmlichkeiten."), + "Du wurdest aufgrund technischer Störungen abgemeldet. Wir entschuldigen uns für die Unannehmlichkeiten."), "autoPair": MessageLookupByLibrary.simpleMessage("Automatisch verbinden"), "autoPairDesc": MessageLookupByLibrary.simpleMessage( @@ -1052,8 +1052,8 @@ class MessageLookup extends MessageLookupByLibrary { "Momentan werden keine Fotos gesichert"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Keine Fotos gefunden"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Keine schnellen Links ausgewählt"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage( "Kein Wiederherstellungs-Schlüssel?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1085,7 +1085,7 @@ class MessageLookup extends MessageLookupByLibrary { "openstreetmapContributors": MessageLookupByLibrary.simpleMessage("OpenStreetMap-Beitragende"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( - "Bei Bedarf auch so kurz wie Sie wollen..."), + "Bei Bedarf auch so kurz wie du willst..."), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage( "Oder eine vorherige auswählen"), "pair": MessageLookupByLibrary.simpleMessage("Koppeln"), @@ -1160,7 +1160,7 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), + "Bitte wähle die zu entfernenden schnellen Links"), "pleaseSendTheLogsTo": m42, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), @@ -1268,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "removePublicLink": MessageLookupByLibrary.simpleMessage("Öffentlichen Link entfernen"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Öffentliche Links entfernen"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Einige der Elemente, die du entfernst, wurden von anderen Nutzern hinzugefügt und du wirst den Zugriff auf sie verlieren"), "removeWithQuestionMark": @@ -1515,7 +1515,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"), "support": MessageLookupByLibrary.simpleMessage("Support"), "swipeLockEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "Um das Sperren beim Wischen zu aktivieren, richte bitte einen Gerätepasscode oder eine Bildschirmsperre in den Systemeinstellungen ein."), + "Um die Sperre für die Wischfunktion zu aktivieren, richte bitte einen Gerätepasscode oder eine Bildschirmsperre in den Systemeinstellungen ein."), "syncProgress": m62, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"), @@ -1573,7 +1573,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dadurch wirst du von diesem Gerät abgemeldet!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( "Um die App-Sperre zu aktivieren, konfigurieren Sie bitte den Gerätepasscode oder die Bildschirmsperre in Ihren Systemeinstellungen."), @@ -1638,7 +1638,7 @@ class MessageLookup extends MessageLookupByLibrary { "useAsCover": MessageLookupByLibrary.simpleMessage("Als Titelbild festlegen"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Verwenden Sie öffentliche Links für Personen, die kein Ente-Konto haben"), + "Verwende öffentliche Links für Personen, die kein Ente-Konto haben"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungs-Schlüssel verwenden"), "useSelectedPhoto": @@ -1718,12 +1718,12 @@ class MessageLookup extends MessageLookupByLibrary { "* Du kannst deinen Speicher maximal verdoppeln"), "youCanManageYourLinksInTheShareTab": MessageLookupByLibrary.simpleMessage( - "Sie können Ihre Links im \"Teilen\"-Tab verwalten."), + "Du kannst deine Links im \"Teilen\"-Tab verwalten."), "youCanTrySearchingForADifferentQuery": MessageLookupByLibrary.simpleMessage( "Sie können versuchen, nach einer anderen Abfrage suchen."), "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( - "Sie können nicht auf diesen Tarif wechseln"), + "Du kannst nicht auf diesen Tarif wechseln"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage( "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( @@ -1734,11 +1734,11 @@ class MessageLookup extends MessageLookupByLibrary { "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), "yourPlanWasSuccessfullyDowngraded": MessageLookupByLibrary.simpleMessage( - "Ihr Tarif wurde erfolgreich heruntergestuft"), + "Dein Tarif wurde erfolgreich heruntergestuft"), "yourPlanWasSuccessfullyUpgraded": MessageLookupByLibrary.simpleMessage( - "Ihr Abo wurde erfolgreich aufgestuft"), + "Dein Abo wurde erfolgreich hochgestuft"), "yourPurchaseWasSuccessful": MessageLookupByLibrary.simpleMessage( - "Ihr Einkauf war erfolgreich!"), + "Dein Einkauf war erfolgreich"), "yourStorageDetailsCouldNotBeFetched": MessageLookupByLibrary.simpleMessage( "Details zum Speicherplatz konnten nicht abgerufen werden"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index b5dcda8681..fc8ce93a56 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -1045,8 +1045,8 @@ class MessageLookup extends MessageLookupByLibrary { "W tej chwili nie wykonuje się kopii zapasowej zdjęć"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Nie znaleziono tutaj zdjęć"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Nie wybrano żadnych szybkich linków"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Brak klucza odzyskiwania?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1153,7 +1153,7 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), + "Prosimy wybrać szybkie linki do usunięcia"), "pleaseSendTheLogsTo": m42, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), @@ -1257,7 +1257,7 @@ class MessageLookup extends MessageLookupByLibrary { "removePublicLink": MessageLookupByLibrary.simpleMessage("Usuń link publiczny"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Usuń linki publiczne"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Niektóre z usuwanych elementów zostały dodane przez inne osoby i utracisz do nich dostęp"), "removeWithQuestionMark": @@ -1562,7 +1562,7 @@ class MessageLookup extends MessageLookupByLibrary { "To wyloguje Cię z tego urządzenia!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + "Spowoduje to usunięcie publicznych linków wszystkich zaznaczonych szybkich linków."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu."), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 759186362c..a421ea1740 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -1042,8 +1042,8 @@ class MessageLookup extends MessageLookupByLibrary { "No momento não há backup de fotos sendo feito"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage( "Nenhuma foto encontrada aqui"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Nenhum link rápido selecionado"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage( "Nenhuma chave de recuperação?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1149,7 +1149,7 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inicie sessão novamente"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), + "Selecione links rápidos para remover"), "pleaseSendTheLogsTo": m42, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Por favor, tente novamente"), @@ -1254,7 +1254,7 @@ class MessageLookup extends MessageLookupByLibrary { "removePublicLink": MessageLookupByLibrary.simpleMessage("Remover link público"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Remover link público"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Alguns dos itens que você está removendo foram adicionados por outras pessoas, e você perderá o acesso a eles"), "removeWithQuestionMark": @@ -1563,7 +1563,7 @@ class MessageLookup extends MessageLookupByLibrary { "Isso fará com que você saia deste dispositivo!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + "Isto removerá links públicos de todos os links rápidos selecionados."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo."), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 1c6515e8c6..0f3f60844e 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -367,7 +367,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("请确保您的设备与电视处于同一网络。"), "castIPMismatchTitle": MessageLookupByLibrary.simpleMessage("投放相册失败"), "castInstruction": MessageLookupByLibrary.simpleMessage( - "在您要配对的设备上访问 cast.ente.io。\n输入下面的代码即可在电视上播放相册。"), + "在您要配对的设备上访问 cast.ente.io。\n在下框中输入代码即可在电视上播放相册。"), "centerPoint": MessageLookupByLibrary.simpleMessage("中心点"), "changeEmail": MessageLookupByLibrary.simpleMessage("修改邮箱"), "changeLocationOfSelectedItems": @@ -858,8 +858,7 @@ class MessageLookup extends MessageLookupByLibrary { "noPhotosAreBeingBackedUpRightNow": MessageLookupByLibrary.simpleMessage("目前没有照片正在备份"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("这里没有找到照片"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage("未选择快速链接"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("没有恢复密钥吗?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( "由于我们端到端加密协议的性质,如果没有您的密码或恢复密钥,您的数据将无法解密"), @@ -942,8 +941,8 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseEmailUsAt": m41, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("请授予权限"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("请重新登录"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), + "pleaseSelectQuickLinksToRemove": + MessageLookupByLibrary.simpleMessage("请选择要删除的快速链接"), "pleaseSendTheLogsTo": m42, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("请重试"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1021,8 +1020,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeParticipantBody": m45, "removePersonLabel": MessageLookupByLibrary.simpleMessage("移除人物标签"), "removePublicLink": MessageLookupByLibrary.simpleMessage("删除公开链接"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + "removePublicLinks": MessageLookupByLibrary.simpleMessage("删除公开链接"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage("您要删除的某些项目是由其他人添加的,您将无法访问它们"), "removeWithQuestionMark": MessageLookupByLibrary.simpleMessage("要移除吗?"), @@ -1262,8 +1260,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage("这将使您在此设备上退出登录!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": - MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + MessageLookupByLibrary.simpleMessage("这将删除所有选定的快速链接的公共链接。"), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage("要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。"), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage("隐藏照片或视频"), From 2e82c96b2abd5c514c68591085175472983a9fdb Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:50:36 +0530 Subject: [PATCH 0168/1179] [mob] Update empty faceID --- mobile/lib/face/model/face.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/face/model/face.dart b/mobile/lib/face/model/face.dart index ee14c2af78..99f07cb2dc 100644 --- a/mobile/lib/face/model/face.dart +++ b/mobile/lib/face/model/face.dart @@ -18,11 +18,12 @@ class Face { Detection detection; final double score; final double blur; - + ///#region Local DB fields // This is not stored on the server, using it for local DB row FileInfo? fileInfo; final int fileID; + ///#endregion bool get isBlurry => blur < kLaplacianHardThreshold; @@ -43,7 +44,7 @@ class Face { factory Face.empty(int fileID, {bool error = false}) { return Face( - "$fileID-0", + "${fileID}_0_0_0_0", fileID, [], error ? -1.0 : 0.0, From 4ab03ee35f32124c46bfffea038d84643f3529b1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:27:28 +0530 Subject: [PATCH 0169/1179] [mob] Switch to new API --- .../file_ml/remote_fileml_service.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 841332cf29..31cdb023ff 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -15,7 +15,7 @@ import "package:shared_preferences/shared_preferences.dart"; class RemoteFileMLService { RemoteFileMLService._privateConstructor(); - static const String _derivedModelKey = "derived"; + static const String _derivedDataType = "derivedMeta"; static final Computer _computer = Computer.shared(); @@ -41,11 +41,11 @@ class RemoteFileMLService { ); try { final _ = await _dio.put( - "/embeddings", + "/files/data/", data: { "fileID": file.uploadedFileID!, - "model": _derivedModelKey, - "encryptedEmbedding": encryptionResult.encData, + "type": _derivedDataType, + "encryptedData": encryptionResult.encData, "decryptionHeader": encryptionResult.header, }, ); @@ -60,10 +60,10 @@ class RemoteFileMLService { ) async { try { final res = await _dio.post( - "/embeddings/files", + "/files/fetch-data/", data: { "fileIDs": fileIds.toList(), - "model": _derivedModelKey, + "type": _derivedDataType, }, ); final remoteEmb = res.data['embeddings'] as List; From 96a9782937ccfa176c1491c8d78c1f2ccbf9772c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:51:43 +0530 Subject: [PATCH 0170/1179] [mob] Switch to new APIs --- mobile/ios/Podfile.lock | 6 +++ mobile/ios/Runner.xcodeproj/project.pbxproj | 2 + .../face_ml/face_recognition_service.dart | 9 +--- .../machine_learning/file_ml/file_ml.dart | 24 ++++++++--- .../file_ml/files_ml_data_response.dart | 17 ++++---- .../file_ml/remote_embedding.dart | 31 ++++++------- .../file_ml/remote_fileml_service.dart | 43 +++++++++---------- .../services/machine_learning/ml_service.dart | 2 +- mobile/lib/utils/ml_util.dart | 5 +-- 9 files changed, 72 insertions(+), 67 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 6b65278be4..8aa33f9449 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -178,6 +178,8 @@ PODS: - photo_manager (2.0.0): - Flutter - FlutterMacOS + - privacy_screen (0.0.1): + - Flutter - PromisesObjC (2.4.0) - receive_sharing_intent (1.6.8): - Flutter @@ -275,6 +277,7 @@ DEPENDENCIES: - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`) + - privacy_screen (from `.symlinks/plugins/privacy_screen/ios`) - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) @@ -392,6 +395,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" photo_manager: :path: ".symlinks/plugins/photo_manager/ios" + privacy_screen: + :path: ".symlinks/plugins/privacy_screen/ios" receive_sharing_intent: :path: ".symlinks/plugins/receive_sharing_intent/ios" screen_brightness_ios: @@ -473,6 +478,7 @@ SPEC CHECKSUMS: path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a + privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437 screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 6fda5cd213..cb410f31da 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -325,6 +325,7 @@ "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework", "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", "${BUILT_PRODUCTS_DIR}/photo_manager/photo_manager.framework", + "${BUILT_PRODUCTS_DIR}/privacy_screen/privacy_screen.framework", "${BUILT_PRODUCTS_DIR}/receive_sharing_intent/receive_sharing_intent.framework", "${BUILT_PRODUCTS_DIR}/screen_brightness_ios/screen_brightness_ios.framework", "${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework", @@ -417,6 +418,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/photo_manager.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/privacy_screen.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/receive_sharing_intent.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/screen_brightness_ios.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework", diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 3c00620873..b821b0c01d 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -106,7 +106,7 @@ class FaceRecognitionService { _logger.info("embeddingResponse ${res.debugLog()}"); final List faces = []; final List clipEmbeddings = []; - for (RemoteFileML fileMl in res.mlData.values) { + for (RemoteFileDerivedData fileMl in res.mlData.values) { final existingInstruction = pendingIndex[fileMl.fileID]!; final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); //Note: Always do null check, empty value means no face was found. @@ -143,11 +143,6 @@ class FaceRecognitionService { } } } - if (res.noEmbeddingFileIDs.isNotEmpty) { - for (final fileID in res.noEmbeddingFileIDs) { - faces.add(Face.empty(fileID, error: false)); - } - } await FaceMLDataDB.instance.bulkInsertFaces(faces); await EmbeddingsDB.instance.putMany(clipEmbeddings); } @@ -160,7 +155,7 @@ class FaceRecognitionService { // Returns a list of faces from the given remote fileML. null if the version is less than the current version // or if the remote faceEmbedding is null. - List? _getFacesFromRemoteEmbedding(RemoteFileML fileMl) { + List? _getFacesFromRemoteEmbedding(RemoteFileDerivedData fileMl) { final RemoteFaceEmbedding? remoteFaceEmbedding = fileMl.faceEmbedding; if (shouldDiscardRemoteEmbedding(fileMl)) { return null; diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/machine_learning/file_ml/file_ml.dart index b97a59e4eb..2eca4ba2bd 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/machine_learning/file_ml/file_ml.dart @@ -3,25 +3,37 @@ import "package:photos/face/model/face.dart"; const _faceKey = 'face'; const _clipKey = 'clip'; -class RemoteFileML { +class RemoteFileDerivedData { final int fileID; final Map remoteRawData; - RemoteFileML( + RemoteFileDerivedData( this.fileID, this.remoteRawData, ); - factory RemoteFileML.fromRemote(int fileID, Map json) { - return RemoteFileML( + void putSanityCheck() { + if (remoteRawData[_faceKey] == null) { + throw Exception('Face embedding is null'); + } + if (remoteRawData[_clipKey] == null) { + throw Exception('Clip embedding is null'); + } + } + + factory RemoteFileDerivedData.fromRemote( + int fileID, + Map json, + ) { + return RemoteFileDerivedData( fileID, json, ); } - static RemoteFileML empty(int i) { + static RemoteFileDerivedData empty(int i) { final Map json = {}; - return RemoteFileML(i, json); + return RemoteFileDerivedData(i, json); } void putFaceIfNotNull(RemoteFaceEmbedding? faceEmbedding) { diff --git a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart index 56da3adc58..784113cb52 100644 --- a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart +++ b/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart @@ -1,10 +1,7 @@ import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; class FilesMLDataResponse { - final Map mlData; - // fileIDs that were indexed but they don't contain any meaningful embeddings - // and hence should be discarded for re-indexing - final Set noEmbeddingFileIDs; + final Map mlData; // fetchErrorFileIDs are the fileIDs for whom we failed failed to fetch embeddings // from the storage final Set fetchErrorFileIDs; @@ -12,21 +9,23 @@ class FilesMLDataResponse { final Set pendingIndexFileIDs; FilesMLDataResponse( this.mlData, { - required this.noEmbeddingFileIDs, required this.fetchErrorFileIDs, required this.pendingIndexFileIDs, }); + FilesMLDataResponse.empty({ + this.mlData = const {}, + this.fetchErrorFileIDs = const {}, + this.pendingIndexFileIDs = const {}, + }); + String debugLog() { - final nonZeroNoEmbeddingFileIDs = noEmbeddingFileIDs.isNotEmpty - ? ', smallEmbeddings: ${noEmbeddingFileIDs.length}' - : ''; final nonZeroFetchErrorFileIDs = fetchErrorFileIDs.isNotEmpty ? ', errorForFileIDs: ${fetchErrorFileIDs.length}' : ''; final nonZeroPendingIndexFileIDs = pendingIndexFileIDs.isNotEmpty ? ', pendingIndexFileIDs: ${pendingIndexFileIDs.length}' : ''; - return 'MLRemote(mlData: ${mlData.length}$nonZeroNoEmbeddingFileIDs$nonZeroFetchErrorFileIDs$nonZeroPendingIndexFileIDs)'; + return 'MLRemote(mlData: ${mlData.length}$nonZeroFetchErrorFileIDs$nonZeroPendingIndexFileIDs)'; } } diff --git a/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart b/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart index 388172d826..ae9c8e4b91 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart @@ -1,37 +1,30 @@ import "dart:convert"; -class RemoteEmbedding { +class FileDataEntity { final int fileID; - final String model; - final String encryptedEmbedding; + final String type; + final String encryptedData; final String decryptionHeader; final int updatedAt; - RemoteEmbedding({ + FileDataEntity({ required this.fileID, - required this.model, - required this.encryptedEmbedding, + required this.type, + required this.encryptedData, required this.decryptionHeader, required this.updatedAt, }); - factory RemoteEmbedding.fromMap(Map map) { - return RemoteEmbedding( + factory FileDataEntity.fromMap(Map map) { + return FileDataEntity( fileID: map['fileID']?.toInt() ?? 0, - model: map['model'] ?? '', - encryptedEmbedding: map['encryptedEmbedding'] ?? '', + type: map['type'] ?? '', + encryptedData: map['encryptedData'] ?? '', decryptionHeader: map['decryptionHeader'] ?? '', updatedAt: map['updatedAt']?.toInt() ?? 0, ); } - factory RemoteEmbedding.fromJson(String source) => - RemoteEmbedding.fromMap(json.decode(source)); -} - -class RemoteEmbeddings { - final List embeddings; - final bool hasMore; - - RemoteEmbeddings(this.embeddings, this.hasMore); + factory FileDataEntity.fromJson(String source) => + FileDataEntity.fromMap(json.decode(source)); } diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart index 31cdb023ff..2b1dfddad9 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart @@ -29,16 +29,18 @@ class RemoteFileMLService { Future putFileEmbedding( EnteFile file, - RemoteFileML fileML, { + RemoteFileDerivedData fileML, { RemoteClipEmbedding? clipEmbedding, RemoteFaceEmbedding? faceEmbedding, }) async { fileML.putClipIfNotNull(clipEmbedding); fileML.putFaceIfNotNull(faceEmbedding); + fileML.putSanityCheck(); final ChaChaEncryptionResult encryptionResult = await gzipAndEncryptJson( fileML.remoteRawData, getFileKey(file), ); + try { final _ = await _dio.put( "/files/data/", @@ -66,22 +68,18 @@ class RemoteFileMLService { "type": _derivedDataType, }, ); - final remoteEmb = res.data['embeddings'] as List; + final remoteEntries = res.data['data'] as List; final pendingIndexFiles = res.data['pendingIndexFileIDs'] as List; - final noEmbeddingFiles = res.data['noEmbeddingFileIDs'] as List; final errFileIds = res.data['errFileIDs'] as List; - final List remoteEmbeddings = []; - for (var entry in remoteEmb) { - final embedding = RemoteEmbedding.fromMap(entry); - remoteEmbeddings.add(embedding); + final List encFileData = []; + for (var entry in remoteEntries) { + encFileData.add(FileDataEntity.fromMap(entry)); } - final fileIDToFileMl = await decryptFileMLData(remoteEmbeddings); + final fileIDToFileMl = await decryptFileMLData(encFileData); return FilesMLDataResponse( fileIDToFileMl, - noEmbeddingFileIDs: - Set.from(noEmbeddingFiles.map((x) => x as int)), fetchErrorFileIDs: Set.from(errFileIds.map((x) => x as int)), pendingIndexFileIDs: Set.from(pendingIndexFiles.map((x) => x as int)), @@ -92,10 +90,10 @@ class RemoteFileMLService { } } - Future> decryptFileMLData( - List remoteEmbeddings, + Future> decryptFileMLData( + List remoteEmbeddings, ) async { - final result = {}; + final result = {}; if (remoteEmbeddings.isEmpty) { return result; } @@ -111,7 +109,8 @@ class RemoteFileMLService { final input = EmbeddingsDecoderInput(embedding, fileKey); inputs.add(input); } - return _computer.compute, Map>( + return _computer + .compute, Map>( _decryptFileMLComputer, param: { "inputs": inputs, @@ -120,19 +119,19 @@ class RemoteFileMLService { } } -Future> _decryptFileMLComputer( +Future> _decryptFileMLComputer( Map args, ) async { - final result = {}; + final result = {}; final inputs = args["inputs"] as List; for (final input in inputs) { final decodedJson = decryptAndUnzipJsonSync( input.decryptionKey, - encryptedData: input.embedding.encryptedEmbedding, - header: input.embedding.decryptionHeader, + encryptedData: input.data.encryptedData, + header: input.data.decryptionHeader, ); - result[input.embedding.fileID] = RemoteFileML.fromRemote( - input.embedding.fileID, + result[input.data.fileID] = RemoteFileDerivedData.fromRemote( + input.data.fileID, decodedJson, ); } @@ -140,8 +139,8 @@ Future> _decryptFileMLComputer( } class EmbeddingsDecoderInput { - final RemoteEmbedding embedding; + final FileDataEntity data; final Uint8List decryptionKey; - EmbeddingsDecoderInput(this.embedding, this.decryptionKey); + EmbeddingsDecoderInput(this.data, this.decryptionKey); } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 4235d3cb36..269cef8295 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -453,7 +453,7 @@ class MLService { await RemoteFileMLService.instance.putFileEmbedding( instruction.file, instruction.existingRemoteFileML ?? - RemoteFileML.empty( + RemoteFileDerivedData.empty( instruction.file.uploadedFileID!, ), faceEmbedding: result.facesRan diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 883c871e58..416a959506 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -37,7 +37,7 @@ class FileMLInstruction { final EnteFile file; bool shouldRunFaces; bool shouldRunClip; - RemoteFileML? existingRemoteFileML; + RemoteFileDerivedData? existingRemoteFileML; FileMLInstruction({ required this.file, @@ -131,11 +131,10 @@ Future> getFilesForMlIndexing() async { _logger.info( "Getting list of files to index for ML took ${DateTime.now().difference(time).inMilliseconds} ms", ); - return sortedBylocalID; } -bool shouldDiscardRemoteEmbedding(RemoteFileML fileML) { +bool shouldDiscardRemoteEmbedding(RemoteFileDerivedData fileML) { final fileID = fileML.fileID; final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { From 885aac832f03b8c43b21e79fcf30deddd80d94a3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:29:47 +0530 Subject: [PATCH 0171/1179] [mob] Fix bug --- mobile/lib/utils/ml_util.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 416a959506..6ea59cb4c1 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -288,8 +288,8 @@ Future analyzeImageStatic(Map args) async { faceEmbeddingAddress, ); if (resultFaces.isEmpty) { - return result..noFaceDetected(); - } + result.faces = []; + } else { result.faces = resultFaces; } From 5351377ae781a3e576c7b00ac0241fc5c1ceb165 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 6 Aug 2024 16:29:16 +0530 Subject: [PATCH 0172/1179] [mob][photos] Make play pause controls for native video player --- .../ui/viewer/file/video_widget_native.dart | 207 +++++++++--------- 1 file changed, 99 insertions(+), 108 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index e4df35e140..3750b76e55 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -4,19 +4,15 @@ import "dart:io"; import "package:flutter/cupertino.dart"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; -import "package:media_kit/media_kit.dart"; -import "package:media_kit_video/media_kit_video.dart"; import "package:native_video_player/native_video_player.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/file_swipe_lock_event.dart"; -import "package:photos/events/pause_video_event.dart"; +// import "package:photos/events/pause_video_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/services/files_service.dart"; -import "package:photos/theme/colors.dart"; -import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/file/file_actions.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/utils/dialog_util.dart"; @@ -43,18 +39,20 @@ class _VideoWidgetNativeState extends State with WidgetsBindingObserver { final Logger _logger = Logger("VideoWidgetNew"); static const verticalMargin = 72.0; - late final player = Player(); - VideoController? controller; + // late final player = Player(); + // VideoController? controller; final _progressNotifier = ValueNotifier(null); - late StreamSubscription playingStreamSubscription; + // late StreamSubscription playingStreamSubscription; bool _isAppInFG = true; - late StreamSubscription pauseVideoSubscription; + // late StreamSubscription pauseVideoSubscription; bool _isFileSwipeLocked = false; late final StreamSubscription _fileSwipeLockEventSubscription; + NativeVideoPlayerController? _controller; String? _filePath; double? aspectRatio; + final _isControllerInitialized = ValueNotifier(false); @override void initState() { @@ -88,15 +86,15 @@ class _VideoWidgetNativeState extends State } }); } - playingStreamSubscription = player.stream.playing.listen((event) { - if (widget.playbackCallback != null && mounted) { - widget.playbackCallback!(event); - } - }); + // playingStreamSubscription = player.stream.playing.listen((event) { + // if (widget.playbackCallback != null && mounted) { + // widget.playbackCallback!(event); + // } + // }); - pauseVideoSubscription = Bus.instance.on().listen((event) { - player.pause(); - }); + // pauseVideoSubscription = Bus.instance.on().listen((event) { + // player.pause(); + // }); _fileSwipeLockEventSubscription = Bus.instance.on().listen((event) { setState(() { @@ -117,12 +115,14 @@ class _VideoWidgetNativeState extends State @override void dispose() { _fileSwipeLockEventSubscription.cancel(); - pauseVideoSubscription.cancel(); + // pauseVideoSubscription.cancel(); removeCallBack(widget.file); _progressNotifier.dispose(); WidgetsBinding.instance.removeObserver(this); - playingStreamSubscription.cancel(); - player.dispose(); + // playingStreamSubscription.cancel(); + // player.dispose(); + + _controller?.onPlaybackEnded.removeListener(_onPlaybackEnded); super.dispose(); } @@ -145,25 +145,54 @@ class _VideoWidgetNativeState extends State }, child: _filePath == null ? _getLoadingWidget() - : Center( - child: AspectRatio( - aspectRatio: aspectRatio ?? 1, - child: NativeVideoPlayerView( - onViewReady: (controller) async { - final videoSource = await VideoSource.init( - path: _filePath!, - type: VideoSourceType.file, - ); - await controller.loadVideoSource(videoSource); - await controller.play(); - }, + : Stack( + children: [ + Center( + child: AspectRatio( + aspectRatio: aspectRatio ?? 1, + child: NativeVideoPlayerView( + onViewReady: _initializeController, + ), + ), ), - ), + Positioned.fill( + child: Center( + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? PlayPauseButton(_controller) + : const SizedBox(); + }, + valueListenable: _isControllerInitialized, + ), + ), + ), + ], ), ), ); } + Future _initializeController( + NativeVideoPlayerController controller, + ) async { + _controller = controller; + + controller.onPlaybackEnded.addListener(_onPlaybackEnded); + + final videoSource = await VideoSource.init( + path: _filePath!, + type: VideoSourceType.file, + ); + await controller.loadVideoSource(videoSource); + await controller.play(); + _isControllerInitialized.value = true; + } + + void _onPlaybackEnded() { + _controller?.play(); + } + void _loadNetworkVideo() { getFileFromServer( widget.file, @@ -276,93 +305,55 @@ class _VideoWidgetNativeState extends State } } -class PausePlayAndDuration extends StatefulWidget { - final Player? player; - const PausePlayAndDuration(this.player, {super.key}); +class PlayPauseButton extends StatefulWidget { + final NativeVideoPlayerController? controller; + const PlayPauseButton(this.controller, {super.key}); @override - State createState() => _PausePlayAndDurationState(); + State createState() => _PlayPauseButtonState(); } -class _PausePlayAndDurationState extends State { - Color backgroundColor = fillStrongLight; +class _PlayPauseButtonState extends State { @override Widget build(BuildContext context) { return GestureDetector( - onTapDown: (details) { - setState(() { - backgroundColor = fillMutedDark; - }); + behavior: HitTestBehavior.opaque, + onTap: () { + _playbackStatus == PlaybackStatus.playing + ? widget.controller?.pause() + : widget.controller?.play(); + setState(() {}); }, - onTapUp: (details) { - Future.delayed(const Duration(milliseconds: 175), () { - if (mounted) { - setState(() { - backgroundColor = fillStrongLight; - }); - } - }); - }, - onTapCancel: () { - Future.delayed(const Duration(milliseconds: 175), () { - if (mounted) { - setState(() { - backgroundColor = fillStrongLight; - }); - } - }); - }, - onTap: () => widget.player!.playOrPause(), - child: AnimatedContainer( - duration: const Duration(milliseconds: 150), - curve: Curves.easeInBack, - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: Container( + width: 54, + height: 54, decoration: BoxDecoration( - color: backgroundColor, - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - borderRadius: BorderRadius.circular(24), + color: Colors.black.withOpacity(0.3), + shape: BoxShape.circle, ), - child: AnimatedSize( - duration: const Duration(seconds: 2), - curve: Curves.easeInOutExpo, - child: Row( - children: [ - StreamBuilder( - builder: (context, snapshot) { - final bool isPlaying = snapshot.data ?? false; - return AnimatedSwitcher( - duration: const Duration(milliseconds: 350), - switchInCurve: Curves.easeInOutCirc, - switchOutCurve: Curves.easeInOutCirc, - child: Icon( - key: ValueKey( - isPlaying ? "pause_button" : "play_button", - ), - isPlaying - ? Icons.pause_rounded - : Icons.play_arrow_rounded, - color: backdropBaseLight, - size: 24, - ), - ); - }, - initialData: widget.player?.state.playing, - stream: widget.player?.stream.playing, - ), - const SizedBox(width: 8), - MaterialPositionIndicator( - style: getEnteTextTheme(context).tiny.copyWith( - color: textBaseDark, - ), - ), - const SizedBox(width: 10), - ], - ), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 250), + transitionBuilder: (Widget child, Animation animation) { + return ScaleTransition(scale: animation, child: child); + }, + switchInCurve: Curves.easeInOutQuart, + switchOutCurve: Curves.easeInOutQuart, + child: _playbackStatus == PlaybackStatus.playing + ? const Icon( + Icons.pause, + size: 32, + key: ValueKey("pause"), + ) + : const Icon( + Icons.play_arrow, + size: 36, + key: ValueKey("play"), + ), ), ), ); } + + PlaybackStatus? get _playbackStatus => + widget.controller?.playbackInfo?.status; } From 4abbb5c591b9aa1f9852382f3d22a25f54b65afd Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 6 Aug 2024 16:34:56 +0530 Subject: [PATCH 0173/1179] [mob][photos] Fix unexpected behaviour of play pause button --- .../ui/viewer/file/video_widget_native.dart | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 3750b76e55..3456323155 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -314,15 +314,23 @@ class PlayPauseButton extends StatefulWidget { } class _PlayPauseButtonState extends State { + bool _isPlaying = true; @override Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - _playbackStatus == PlaybackStatus.playing - ? widget.controller?.pause() - : widget.controller?.play(); - setState(() {}); + if (_playbackStatus == PlaybackStatus.playing) { + widget.controller?.pause(); + setState(() { + _isPlaying = false; + }); + } else { + widget.controller?.play(); + setState(() { + _isPlaying = true; + }); + } }, child: Container( width: 54, @@ -338,7 +346,7 @@ class _PlayPauseButtonState extends State { }, switchInCurve: Curves.easeInOutQuart, switchOutCurve: Curves.easeInOutQuart, - child: _playbackStatus == PlaybackStatus.playing + child: _isPlaying ? const Icon( Icons.pause, size: 32, From 7dadd1eb0a018d729cb9cb71feb5248ef4025ae9 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:50:37 +0530 Subject: [PATCH 0174/1179] [mob] Fix bug --- mobile/lib/utils/ml_util.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 6ea59cb4c1..f90d4639d6 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -290,7 +290,8 @@ Future analyzeImageStatic(Map args) async { if (resultFaces.isEmpty) { result.faces = []; } else { - result.faces = resultFaces; + result.faces = resultFaces; + } } if (runClip) { From 1cf9a15f48400dfe29f5ff393b7afa7e646f3143 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 7 Aug 2024 11:24:32 +0530 Subject: [PATCH 0175/1179] [mob] Refactor --- mobile/lib/main.dart | 4 +- .../filedata_service.dart} | 66 +++++++++---------- .../model/enc_file_data.dart} | 15 ++--- .../model/file_data.dart} | 12 ++-- .../model/response.dart} | 20 ++---- .../face_ml/face_recognition_service.dart | 14 ++-- .../services/machine_learning/ml_service.dart | 8 +-- mobile/lib/utils/ml_util.dart | 6 +- 8 files changed, 66 insertions(+), 79 deletions(-) rename mobile/lib/services/{machine_learning/file_ml/remote_fileml_service.dart => filedata/filedata_service.dart} (61%) rename mobile/lib/services/{machine_learning/file_ml/remote_embedding.dart => filedata/model/enc_file_data.dart} (57%) rename mobile/lib/services/{machine_learning/file_ml/file_ml.dart => filedata/model/file_data.dart} (92%) rename mobile/lib/services/{machine_learning/file_ml/files_ml_data_response.dart => filedata/model/response.dart} (54%) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 6026fe2bb3..cfbb4a8367 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -28,12 +28,12 @@ import 'package:photos/services/billing_service.dart'; import 'package:photos/services/collections_service.dart'; import "package:photos/services/entity_service.dart"; import 'package:photos/services/favorites_service.dart'; +import "package:photos/services/filedata/filedata_service.dart"; import 'package:photos/services/home_widget_service.dart'; import 'package:photos/services/local_file_update_service.dart'; import 'package:photos/services/local_sync_service.dart'; import "package:photos/services/location_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; -import 'package:photos/services/machine_learning/file_ml/remote_fileml_service.dart'; import "package:photos/services/machine_learning/machine_learning_controller.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; @@ -269,7 +269,7 @@ Future _init(bool isBackground, {String via = ''}) async { LocalFileUpdateService.instance.init(preferences); SearchService.instance.init(); StorageBonusService.instance.init(preferences); - RemoteFileMLService.instance.init(preferences); + FileDataService.instance.init(preferences); _logger.info("RemoteFileMLService done"); if (!isBackground && Platform.isAndroid && diff --git a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart b/mobile/lib/services/filedata/filedata_service.dart similarity index 61% rename from mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart rename to mobile/lib/services/filedata/filedata_service.dart index 2b1dfddad9..cae1ad66a8 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_fileml_service.dart +++ b/mobile/lib/services/filedata/filedata_service.dart @@ -6,30 +6,29 @@ import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; import "package:photos/models/file/file.dart"; -import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; -import "package:photos/services/machine_learning/file_ml/files_ml_data_response.dart"; -import "package:photos/services/machine_learning/file_ml/remote_embedding.dart"; +import "package:photos/services/filedata/model/enc_file_data.dart"; +import "package:photos/services/filedata/model/file_data.dart"; +import "package:photos/services/filedata/model/response.dart"; import "package:photos/utils/file_download_util.dart"; import "package:photos/utils/gzip.dart"; import "package:shared_preferences/shared_preferences.dart"; -class RemoteFileMLService { - RemoteFileMLService._privateConstructor(); +class FileDataService { + FileDataService._privateConstructor(); static const String _derivedDataType = "derivedMeta"; static final Computer _computer = Computer.shared(); - static final RemoteFileMLService instance = - RemoteFileMLService._privateConstructor(); + static final FileDataService instance = FileDataService._privateConstructor(); - final _logger = Logger("RemoteFileMLService"); + final _logger = Logger("FileDataService"); final _dio = NetworkClient.instance.enteDio; void init(SharedPreferences prefs) {} - Future putFileEmbedding( + Future putDerivedMetaData( EnteFile file, - RemoteFileDerivedData fileML, { + FileDataEntity fileML, { RemoteClipEmbedding? clipEmbedding, RemoteFaceEmbedding? faceEmbedding, }) async { @@ -52,12 +51,12 @@ class RemoteFileMLService { }, ); } catch (e, s) { - _logger.severe("Failed to put embedding", e, s); + _logger.severe("putDerivedMetaData failed", e, s); rethrow; } } - Future getFileEmbeddings( + Future getFilesData( Set fileIds, ) async { try { @@ -72,14 +71,14 @@ class RemoteFileMLService { final pendingIndexFiles = res.data['pendingIndexFileIDs'] as List; final errFileIds = res.data['errFileIDs'] as List; - final List encFileData = []; + final List encFileData = []; for (var entry in remoteEntries) { - encFileData.add(FileDataEntity.fromMap(entry)); + encFileData.add(EncryptedFileData.fromMap(entry)); } - final fileIDToFileMl = await decryptFileMLData(encFileData); - return FilesMLDataResponse( - fileIDToFileMl, + final fileIdToDataMap = await decryptRemoteFileData(encFileData); + return FileDataResponse( + fileIdToDataMap, fetchErrorFileIDs: Set.from(errFileIds.map((x) => x as int)), pendingIndexFileIDs: Set.from(pendingIndexFiles.map((x) => x as int)), @@ -90,27 +89,26 @@ class RemoteFileMLService { } } - Future> decryptFileMLData( - List remoteEmbeddings, + Future> decryptRemoteFileData( + List remoteData, ) async { - final result = {}; - if (remoteEmbeddings.isEmpty) { + final result = {}; + if (remoteData.isEmpty) { return result; } - final inputs = []; + final inputs = <_DecoderInput>[]; final fileMap = await FilesDB.instance - .getFilesFromIDs(remoteEmbeddings.map((e) => e.fileID).toList()); - for (final embedding in remoteEmbeddings) { + .getFilesFromIDs(remoteData.map((e) => e.fileID).toList()); + for (final embedding in remoteData) { final file = fileMap[embedding.fileID]; if (file == null) { continue; } final fileKey = getFileKey(file); - final input = EmbeddingsDecoderInput(embedding, fileKey); + final input = _DecoderInput(embedding, fileKey); inputs.add(input); } - return _computer - .compute, Map>( + return _computer.compute, Map>( _decryptFileMLComputer, param: { "inputs": inputs, @@ -119,18 +117,18 @@ class RemoteFileMLService { } } -Future> _decryptFileMLComputer( +Future> _decryptFileMLComputer( Map args, ) async { - final result = {}; - final inputs = args["inputs"] as List; + final result = {}; + final inputs = args["inputs"] as List<_DecoderInput>; for (final input in inputs) { final decodedJson = decryptAndUnzipJsonSync( input.decryptionKey, encryptedData: input.data.encryptedData, header: input.data.decryptionHeader, ); - result[input.data.fileID] = RemoteFileDerivedData.fromRemote( + result[input.data.fileID] = FileDataEntity.fromRemote( input.data.fileID, decodedJson, ); @@ -138,9 +136,9 @@ Future> _decryptFileMLComputer( return result; } -class EmbeddingsDecoderInput { - final FileDataEntity data; +class _DecoderInput { + final EncryptedFileData data; final Uint8List decryptionKey; - EmbeddingsDecoderInput(this.data, this.decryptionKey); + _DecoderInput(this.data, this.decryptionKey); } diff --git a/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart b/mobile/lib/services/filedata/model/enc_file_data.dart similarity index 57% rename from mobile/lib/services/machine_learning/file_ml/remote_embedding.dart rename to mobile/lib/services/filedata/model/enc_file_data.dart index ae9c8e4b91..80b2aacd06 100644 --- a/mobile/lib/services/machine_learning/file_ml/remote_embedding.dart +++ b/mobile/lib/services/filedata/model/enc_file_data.dart @@ -1,30 +1,27 @@ import "dart:convert"; -class FileDataEntity { +class EncryptedFileData { final int fileID; final String type; final String encryptedData; final String decryptionHeader; - final int updatedAt; - FileDataEntity({ + EncryptedFileData({ required this.fileID, required this.type, required this.encryptedData, required this.decryptionHeader, - required this.updatedAt, }); - factory FileDataEntity.fromMap(Map map) { - return FileDataEntity( + factory EncryptedFileData.fromMap(Map map) { + return EncryptedFileData( fileID: map['fileID']?.toInt() ?? 0, type: map['type'] ?? '', encryptedData: map['encryptedData'] ?? '', decryptionHeader: map['decryptionHeader'] ?? '', - updatedAt: map['updatedAt']?.toInt() ?? 0, ); } - factory FileDataEntity.fromJson(String source) => - FileDataEntity.fromMap(json.decode(source)); + factory EncryptedFileData.fromJson(String source) => + EncryptedFileData.fromMap(json.decode(source)); } diff --git a/mobile/lib/services/machine_learning/file_ml/file_ml.dart b/mobile/lib/services/filedata/model/file_data.dart similarity index 92% rename from mobile/lib/services/machine_learning/file_ml/file_ml.dart rename to mobile/lib/services/filedata/model/file_data.dart index 2eca4ba2bd..bb4fd774f4 100644 --- a/mobile/lib/services/machine_learning/file_ml/file_ml.dart +++ b/mobile/lib/services/filedata/model/file_data.dart @@ -3,11 +3,11 @@ import "package:photos/face/model/face.dart"; const _faceKey = 'face'; const _clipKey = 'clip'; -class RemoteFileDerivedData { +class FileDataEntity { final int fileID; final Map remoteRawData; - RemoteFileDerivedData( + FileDataEntity( this.fileID, this.remoteRawData, ); @@ -21,19 +21,19 @@ class RemoteFileDerivedData { } } - factory RemoteFileDerivedData.fromRemote( + factory FileDataEntity.fromRemote( int fileID, Map json, ) { - return RemoteFileDerivedData( + return FileDataEntity( fileID, json, ); } - static RemoteFileDerivedData empty(int i) { + static FileDataEntity empty(int i) { final Map json = {}; - return RemoteFileDerivedData(i, json); + return FileDataEntity(i, json); } void putFaceIfNotNull(RemoteFaceEmbedding? faceEmbedding) { diff --git a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart b/mobile/lib/services/filedata/model/response.dart similarity index 54% rename from mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart rename to mobile/lib/services/filedata/model/response.dart index 784113cb52..c65322114f 100644 --- a/mobile/lib/services/machine_learning/file_ml/files_ml_data_response.dart +++ b/mobile/lib/services/filedata/model/response.dart @@ -1,31 +1,25 @@ -import 'package:photos/services/machine_learning/file_ml/file_ml.dart'; +import "package:photos/services/filedata/model/file_data.dart"; -class FilesMLDataResponse { - final Map mlData; +class FileDataResponse { + final Map data; // fetchErrorFileIDs are the fileIDs for whom we failed failed to fetch embeddings // from the storage final Set fetchErrorFileIDs; // pendingIndexFileIDs are the fileIDs that were never indexed final Set pendingIndexFileIDs; - FilesMLDataResponse( - this.mlData, { + FileDataResponse( + this.data, { required this.fetchErrorFileIDs, required this.pendingIndexFileIDs, }); - FilesMLDataResponse.empty({ - this.mlData = const {}, - this.fetchErrorFileIDs = const {}, - this.pendingIndexFileIDs = const {}, - }); - String debugLog() { final nonZeroFetchErrorFileIDs = fetchErrorFileIDs.isNotEmpty - ? ', errorForFileIDs: ${fetchErrorFileIDs.length}' + ? 'errorForFileIDs: ${fetchErrorFileIDs.length}' : ''; final nonZeroPendingIndexFileIDs = pendingIndexFileIDs.isNotEmpty ? ', pendingIndexFileIDs: ${pendingIndexFileIDs.length}' : ''; - return 'MLRemote(mlData: ${mlData.length}$nonZeroFetchErrorFileIDs$nonZeroPendingIndexFileIDs)'; + return 'MLRemote(mlData: ${data.length}$nonZeroFetchErrorFileIDs$nonZeroPendingIndexFileIDs)'; } } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index b821b0c01d..8ac8091f31 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -14,12 +14,12 @@ import "package:photos/face/model/face.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; +import "package:photos/services/filedata/filedata_service.dart"; +import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; -import "package:photos/services/machine_learning/file_ml/file_ml.dart"; -import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/image_ml_util.dart"; @@ -102,11 +102,11 @@ class FaceRecognitionService { pendingIndex[instruction.file.uploadedFileID!] = instruction; } _logger.info("fetching embeddings for ${ids.length} files"); - final res = await RemoteFileMLService.instance.getFileEmbeddings(ids); + final res = await FileDataService.instance.getFilesData(ids); _logger.info("embeddingResponse ${res.debugLog()}"); final List faces = []; final List clipEmbeddings = []; - for (RemoteFileDerivedData fileMl in res.mlData.values) { + for (FileDataEntity fileMl in res.data.values) { final existingInstruction = pendingIndex[fileMl.fileID]!; final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); //Note: Always do null check, empty value means no face was found. @@ -155,7 +155,7 @@ class FaceRecognitionService { // Returns a list of faces from the given remote fileML. null if the version is less than the current version // or if the remote faceEmbedding is null. - List? _getFacesFromRemoteEmbedding(RemoteFileDerivedData fileMl) { + List? _getFacesFromRemoteEmbedding(FileDataEntity fileMl) { final RemoteFaceEmbedding? remoteFaceEmbedding = fileMl.faceEmbedding; if (shouldDiscardRemoteEmbedding(fileMl)) { return null; @@ -163,9 +163,7 @@ class FaceRecognitionService { final List faces = []; if (remoteFaceEmbedding!.faces.isEmpty) { faces.add( - Face.empty( - fileMl.fileID, - ), + Face.empty(fileMl.fileID), ); } else { for (final f in remoteFaceEmbedding.faces) { diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 269cef8295..1d95a3eb44 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -16,6 +16,8 @@ import "package:photos/face/model/detection.dart" as face_detection; import "package:photos/face/model/face.dart"; import "package:photos/face/model/landmark.dart"; import "package:photos/service_locator.dart"; +import "package:photos/services/filedata/filedata_service.dart"; +import "package:photos/services/filedata/model/file_data.dart"; import 'package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart'; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart'; @@ -23,8 +25,6 @@ import 'package:photos/services/machine_learning/face_ml/face_embedding/face_emb import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; -import "package:photos/services/machine_learning/file_ml/file_ml.dart"; -import "package:photos/services/machine_learning/file_ml/remote_fileml_service.dart"; import 'package:photos/services/machine_learning/ml_exceptions.dart'; import "package:photos/services/machine_learning/ml_indexing_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; @@ -450,10 +450,10 @@ class MLService { } _logger.info("inserting ${faces.length} faces for ${result.fileId}"); if (!result.errorOccured) { - await RemoteFileMLService.instance.putFileEmbedding( + await FileDataService.instance.putDerivedMetaData( instruction.file, instruction.existingRemoteFileML ?? - RemoteFileDerivedData.empty( + FileDataEntity.empty( instruction.file.uploadedFileID!, ), faceEmbedding: result.facesRan diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index f90d4639d6..bc0cb6c737 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -13,8 +13,8 @@ import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; -import "package:photos/services/machine_learning/file_ml/file_ml.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; @@ -37,7 +37,7 @@ class FileMLInstruction { final EnteFile file; bool shouldRunFaces; bool shouldRunClip; - RemoteFileDerivedData? existingRemoteFileML; + FileDataEntity? existingRemoteFileML; FileMLInstruction({ required this.file, @@ -134,7 +134,7 @@ Future> getFilesForMlIndexing() async { return sortedBylocalID; } -bool shouldDiscardRemoteEmbedding(RemoteFileDerivedData fileML) { +bool shouldDiscardRemoteEmbedding(FileDataEntity fileML) { final fileID = fileML.fileID; final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { From 4c02e8ffa3d8e653aefef15f2e399a0793b856e6 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 12:31:15 +0530 Subject: [PATCH 0176/1179] [mob][photos] Create seek bar that moves with video and animate the seek bar between each second with also handling edge cases The native video player package that is used only emits an event at each second when the video is played. For a good looking seek bar, have animate it in between seconds --- .../ui/viewer/file/video_widget_native.dart | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 3456323155..930dedff5f 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -51,6 +51,9 @@ class _VideoWidgetNativeState extends State NativeVideoPlayerController? _controller; String? _filePath; + + ///Duration in seconds + int? duration; double? aspectRatio; final _isControllerInitialized = ValueNotifier(false); @@ -167,12 +170,49 @@ class _VideoWidgetNativeState extends State ), ), ), + Positioned( + bottom: verticalMargin, + right: 0, + left: 0, + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? _SeekBar(_controller!, duration) + : const SizedBox(); + }, + valueListenable: _isControllerInitialized, + ), + ), ], ), ), ); } + int? _durationToSeconds(String? duration) { + if (duration == null) { + _logger.warning("Duration is null"); + return null; + } + final parts = duration.split(':'); + int seconds = 0; + + if (parts.length == 3) { + // Format: "h:mm:ss" + seconds += int.parse(parts[0]) * 3600; // Hours to seconds + seconds += int.parse(parts[1]) * 60; // Minutes to seconds + seconds += int.parse(parts[2]); // Seconds + } else if (parts.length == 2) { + // Format: "m:ss" + seconds += int.parse(parts[0]) * 60; // Minutes to seconds + seconds += int.parse(parts[1]); // Seconds + } else { + throw FormatException('Invalid duration format: $duration'); + } + + return seconds; + } + Future _initializeController( NativeVideoPlayerController controller, ) async { @@ -287,6 +327,8 @@ class _VideoWidgetNativeState extends State Future _setAspectRatioFromVideoProps() async { final videoProps = await getVideoPropsAsync(File(_filePath!)); if (videoProps != null) { + duration = _durationToSeconds(videoProps.propData?["duration"]); + if (videoProps.width != null && videoProps.height != null) { if (videoProps.width != null && videoProps.height != 0) { aspectRatio = videoProps.width! / videoProps.height!; @@ -365,3 +407,148 @@ class _PlayPauseButtonState extends State { PlaybackStatus? get _playbackStatus => widget.controller?.playbackInfo?.status; } + +class _SeekBar extends StatefulWidget { + final NativeVideoPlayerController controller; + final int? duration; + const _SeekBar(this.controller, this.duration); + + @override + State<_SeekBar> createState() => _SeekBarState(); +} + +class _SeekBarState extends State<_SeekBar> + with SingleTickerProviderStateMixin { + late final AnimationController _animationController; + double _prevPositionFraction = 0.0; + + @override + void initState() { + super.initState(); + + _animationController = AnimationController( + vsync: this, + value: 0, + ); + + widget.controller.onPlaybackStatusChanged.addListener( + _onPlaybackStatusChanged, + ); + widget.controller.onPlaybackPositionChanged.addListener( + _onPlaybackPositionChanged, + ); + + _startMovingSeekbar(); + } + + @override + void dispose() { + _animationController.dispose(); + widget.controller.onPlaybackStatusChanged.removeListener( + _onPlaybackStatusChanged, + ); + widget.controller.onPlaybackPositionChanged.removeListener( + _onPlaybackPositionChanged, + ); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _animationController, + builder: (_, __) { + return SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 2.0, + thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8.0), + overlayShape: const RoundSliderOverlayShape(overlayRadius: 14.0), + activeTrackColor: Colors.red, + inactiveTrackColor: Colors.grey, + thumbColor: Colors.red, + overlayColor: Colors.red.withOpacity(0.4), + ), + child: Slider( + min: 0.0, + max: 1.0, + value: _animationController.value, + onChanged: (value) { + // setState(() { + + // }); + // widget.controller?.seekTo(value.toInt()); + }, + onChangeEnd: (value) { + // widget.onSeek(Duration(milliseconds: value.round())); + }, + allowedInteraction: SliderInteraction.tapAndSlide, + ), + ); + }, + ); + } + + void _startMovingSeekbar() { + //Video starts playing after a slight delay. This delay is to ensure that + //the seek bar animation starts after the video starts playing. + Future.delayed(const Duration(milliseconds: 700), () { + if (widget.duration != null) { + unawaited( + _animationController.animateTo( + (1 / widget.duration!), + duration: const Duration(seconds: 1), + ), + ); + } else { + unawaited( + _animationController.animateTo( + 0, + duration: const Duration(seconds: 1), + ), + ); + } + }); + } + + void _onPlaybackStatusChanged() { + if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { + _animationController.stop(); + } + } + + void _onPlaybackPositionChanged() async { + final target = widget.controller.playbackInfo?.positionFraction ?? 0; + + //To immediately set the position to 0 when the ends when playing in loop + if (_prevPositionFraction == 1.0 && target == 0.0) { + unawaited( + _animationController.animateTo(0, duration: const Duration(seconds: 0)), + ); + } + + //There is a slight delay (around 350 ms) for the event being listened to + //by this listener on the next target (target that comes after 0). Adding + //this buffer to keep the seek bar animation smooth. + if (target == 0) { + await Future.delayed(const Duration(milliseconds: 450)); + } + + if (widget.duration != null) { + unawaited( + _animationController.animateTo( + target + (1 / widget.duration!), + duration: const Duration(seconds: 1), + ), + ); + } else { + unawaited( + _animationController.animateTo( + target, + duration: const Duration(seconds: 1), + ), + ); + } + + _prevPositionFraction = target; + } +} From d452d1acb0c66293ce5bf4d1b2198a5f8a688eb9 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 14:57:01 +0530 Subject: [PATCH 0177/1179] [mob][photos] Stop animating seek bar after being seeked when video is paused --- mobile/lib/ui/viewer/file/video_widget_native.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 930dedff5f..27937d59d1 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -517,6 +517,9 @@ class _SeekBarState extends State<_SeekBar> } void _onPlaybackPositionChanged() async { + if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { + return; + } final target = widget.controller.playbackInfo?.positionFraction ?? 0; //To immediately set the position to 0 when the ends when playing in loop From c572fc171c38e6675c8004f88832894382b9ea1c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 14:58:38 +0530 Subject: [PATCH 0178/1179] [mob][photos] Make seeking work (only when seeking ends) --- mobile/lib/ui/viewer/file/video_widget_native.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 27937d59d1..cfbc75452d 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -472,14 +472,14 @@ class _SeekBarState extends State<_SeekBar> min: 0.0, max: 1.0, value: _animationController.value, - onChanged: (value) { - // setState(() { - - // }); - // widget.controller?.seekTo(value.toInt()); - }, + onChanged: (value) {}, + divisions: 4500, onChangeEnd: (value) { - // widget.onSeek(Duration(milliseconds: value.round())); + widget.controller.seekTo((value * widget.duration!).round()); + _animationController.animateTo( + value, + duration: const Duration(microseconds: 0), + ); }, allowedInteraction: SliderInteraction.tapAndSlide, ), From 779562570861556880597ff0519ae641e4e8c490 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 15:07:52 +0530 Subject: [PATCH 0179/1179] [mob][photos] Move SeekBar and PlayPauseButton widgets to separate files --- .../play_pause_button.dart | 63 ++++++ .../seek_bar.dart | 151 +++++++++++++ .../ui/viewer/file/video_widget_native.dart | 213 +----------------- 3 files changed, 217 insertions(+), 210 deletions(-) create mode 100644 mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart create mode 100644 mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart new file mode 100644 index 0000000000..9ad34fc4e8 --- /dev/null +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -0,0 +1,63 @@ +import "package:flutter/material.dart"; +import "package:native_video_player/native_video_player.dart"; + +class PlayPauseButton extends StatefulWidget { + final NativeVideoPlayerController? controller; + const PlayPauseButton(this.controller, {super.key}); + + @override + State createState() => _PlayPauseButtonState(); +} + +class _PlayPauseButtonState extends State { + bool _isPlaying = true; + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (_playbackStatus == PlaybackStatus.playing) { + widget.controller?.pause(); + setState(() { + _isPlaying = false; + }); + } else { + widget.controller?.play(); + setState(() { + _isPlaying = true; + }); + } + }, + child: Container( + width: 54, + height: 54, + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.3), + shape: BoxShape.circle, + ), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 250), + transitionBuilder: (Widget child, Animation animation) { + return ScaleTransition(scale: animation, child: child); + }, + switchInCurve: Curves.easeInOutQuart, + switchOutCurve: Curves.easeInOutQuart, + child: _isPlaying + ? const Icon( + Icons.pause, + size: 32, + key: ValueKey("pause"), + ) + : const Icon( + Icons.play_arrow, + size: 36, + key: ValueKey("play"), + ), + ), + ), + ); + } + + PlaybackStatus? get _playbackStatus => + widget.controller?.playbackInfo?.status; +} diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart new file mode 100644 index 0000000000..84b5ddf1e2 --- /dev/null +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -0,0 +1,151 @@ +import "dart:async"; + +import "package:flutter/material.dart"; +import "package:native_video_player/native_video_player.dart"; + +class SeekBar extends StatefulWidget { + final NativeVideoPlayerController controller; + final int? duration; + const SeekBar(this.controller, this.duration, {super.key}); + + @override + State createState() => _SeekBarState(); +} + +class _SeekBarState extends State with SingleTickerProviderStateMixin { + late final AnimationController _animationController; + double _prevPositionFraction = 0.0; + + @override + void initState() { + super.initState(); + + _animationController = AnimationController( + vsync: this, + value: 0, + ); + + widget.controller.onPlaybackStatusChanged.addListener( + _onPlaybackStatusChanged, + ); + widget.controller.onPlaybackPositionChanged.addListener( + _onPlaybackPositionChanged, + ); + + _startMovingSeekbar(); + } + + @override + void dispose() { + _animationController.dispose(); + widget.controller.onPlaybackStatusChanged.removeListener( + _onPlaybackStatusChanged, + ); + widget.controller.onPlaybackPositionChanged.removeListener( + _onPlaybackPositionChanged, + ); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _animationController, + builder: (_, __) { + return SliderTheme( + data: SliderTheme.of(context).copyWith( + trackHeight: 2.0, + thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8.0), + overlayShape: const RoundSliderOverlayShape(overlayRadius: 14.0), + activeTrackColor: Colors.red, + inactiveTrackColor: Colors.grey, + thumbColor: Colors.red, + overlayColor: Colors.red.withOpacity(0.4), + ), + child: Slider( + min: 0.0, + max: 1.0, + value: _animationController.value, + onChanged: (value) {}, + divisions: 4500, + onChangeEnd: (value) { + widget.controller.seekTo((value * widget.duration!).round()); + _animationController.animateTo( + value, + duration: const Duration(microseconds: 0), + ); + }, + allowedInteraction: SliderInteraction.tapAndSlide, + ), + ); + }, + ); + } + + void _startMovingSeekbar() { + //Video starts playing after a slight delay. This delay is to ensure that + //the seek bar animation starts after the video starts playing. + Future.delayed(const Duration(milliseconds: 700), () { + if (widget.duration != null) { + unawaited( + _animationController.animateTo( + (1 / widget.duration!), + duration: const Duration(seconds: 1), + ), + ); + } else { + unawaited( + _animationController.animateTo( + 0, + duration: const Duration(seconds: 1), + ), + ); + } + }); + } + + void _onPlaybackStatusChanged() { + if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { + _animationController.stop(); + } + } + + void _onPlaybackPositionChanged() async { + if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { + return; + } + final target = widget.controller.playbackInfo?.positionFraction ?? 0; + + //To immediately set the position to 0 when the ends when playing in loop + if (_prevPositionFraction == 1.0 && target == 0.0) { + unawaited( + _animationController.animateTo(0, duration: const Duration(seconds: 0)), + ); + } + + //There is a slight delay (around 350 ms) for the event being listened to + //by this listener on the next target (target that comes after 0). Adding + //this buffer to keep the seek bar animation smooth. + if (target == 0) { + await Future.delayed(const Duration(milliseconds: 450)); + } + + if (widget.duration != null) { + unawaited( + _animationController.animateTo( + target + (1 / widget.duration!), + duration: const Duration(seconds: 1), + ), + ); + } else { + unawaited( + _animationController.animateTo( + target, + duration: const Duration(seconds: 1), + ), + ); + } + + _prevPositionFraction = target; + } +} diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index cfbc75452d..646cafba59 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -14,6 +14,8 @@ import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/services/files_service.dart"; import "package:photos/ui/actions/file/file_actions.dart"; +import "package:photos/ui/viewer/file/native_video_player_controls/play_pause_button.dart"; +import "package:photos/ui/viewer/file/native_video_player_controls/seek_bar.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/exif_util.dart"; @@ -177,7 +179,7 @@ class _VideoWidgetNativeState extends State child: ValueListenableBuilder( builder: (BuildContext context, bool value, _) { return value - ? _SeekBar(_controller!, duration) + ? SeekBar(_controller!, duration) : const SizedBox(); }, valueListenable: _isControllerInitialized, @@ -346,212 +348,3 @@ class _VideoWidgetNativeState extends State } } } - -class PlayPauseButton extends StatefulWidget { - final NativeVideoPlayerController? controller; - const PlayPauseButton(this.controller, {super.key}); - - @override - State createState() => _PlayPauseButtonState(); -} - -class _PlayPauseButtonState extends State { - bool _isPlaying = true; - @override - Widget build(BuildContext context) { - return GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (_playbackStatus == PlaybackStatus.playing) { - widget.controller?.pause(); - setState(() { - _isPlaying = false; - }); - } else { - widget.controller?.play(); - setState(() { - _isPlaying = true; - }); - } - }, - child: Container( - width: 54, - height: 54, - decoration: BoxDecoration( - color: Colors.black.withOpacity(0.3), - shape: BoxShape.circle, - ), - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - transitionBuilder: (Widget child, Animation animation) { - return ScaleTransition(scale: animation, child: child); - }, - switchInCurve: Curves.easeInOutQuart, - switchOutCurve: Curves.easeInOutQuart, - child: _isPlaying - ? const Icon( - Icons.pause, - size: 32, - key: ValueKey("pause"), - ) - : const Icon( - Icons.play_arrow, - size: 36, - key: ValueKey("play"), - ), - ), - ), - ); - } - - PlaybackStatus? get _playbackStatus => - widget.controller?.playbackInfo?.status; -} - -class _SeekBar extends StatefulWidget { - final NativeVideoPlayerController controller; - final int? duration; - const _SeekBar(this.controller, this.duration); - - @override - State<_SeekBar> createState() => _SeekBarState(); -} - -class _SeekBarState extends State<_SeekBar> - with SingleTickerProviderStateMixin { - late final AnimationController _animationController; - double _prevPositionFraction = 0.0; - - @override - void initState() { - super.initState(); - - _animationController = AnimationController( - vsync: this, - value: 0, - ); - - widget.controller.onPlaybackStatusChanged.addListener( - _onPlaybackStatusChanged, - ); - widget.controller.onPlaybackPositionChanged.addListener( - _onPlaybackPositionChanged, - ); - - _startMovingSeekbar(); - } - - @override - void dispose() { - _animationController.dispose(); - widget.controller.onPlaybackStatusChanged.removeListener( - _onPlaybackStatusChanged, - ); - widget.controller.onPlaybackPositionChanged.removeListener( - _onPlaybackPositionChanged, - ); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _animationController, - builder: (_, __) { - return SliderTheme( - data: SliderTheme.of(context).copyWith( - trackHeight: 2.0, - thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8.0), - overlayShape: const RoundSliderOverlayShape(overlayRadius: 14.0), - activeTrackColor: Colors.red, - inactiveTrackColor: Colors.grey, - thumbColor: Colors.red, - overlayColor: Colors.red.withOpacity(0.4), - ), - child: Slider( - min: 0.0, - max: 1.0, - value: _animationController.value, - onChanged: (value) {}, - divisions: 4500, - onChangeEnd: (value) { - widget.controller.seekTo((value * widget.duration!).round()); - _animationController.animateTo( - value, - duration: const Duration(microseconds: 0), - ); - }, - allowedInteraction: SliderInteraction.tapAndSlide, - ), - ); - }, - ); - } - - void _startMovingSeekbar() { - //Video starts playing after a slight delay. This delay is to ensure that - //the seek bar animation starts after the video starts playing. - Future.delayed(const Duration(milliseconds: 700), () { - if (widget.duration != null) { - unawaited( - _animationController.animateTo( - (1 / widget.duration!), - duration: const Duration(seconds: 1), - ), - ); - } else { - unawaited( - _animationController.animateTo( - 0, - duration: const Duration(seconds: 1), - ), - ); - } - }); - } - - void _onPlaybackStatusChanged() { - if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { - _animationController.stop(); - } - } - - void _onPlaybackPositionChanged() async { - if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { - return; - } - final target = widget.controller.playbackInfo?.positionFraction ?? 0; - - //To immediately set the position to 0 when the ends when playing in loop - if (_prevPositionFraction == 1.0 && target == 0.0) { - unawaited( - _animationController.animateTo(0, duration: const Duration(seconds: 0)), - ); - } - - //There is a slight delay (around 350 ms) for the event being listened to - //by this listener on the next target (target that comes after 0). Adding - //this buffer to keep the seek bar animation smooth. - if (target == 0) { - await Future.delayed(const Duration(milliseconds: 450)); - } - - if (widget.duration != null) { - unawaited( - _animationController.animateTo( - target + (1 / widget.duration!), - duration: const Duration(seconds: 1), - ), - ); - } else { - unawaited( - _animationController.animateTo( - target, - duration: const Duration(seconds: 1), - ), - ); - } - - _prevPositionFraction = target; - } -} From af758d4e8516b83015515a87adbef413bb7fbdbe Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 15:39:09 +0530 Subject: [PATCH 0180/1179] [mob][photos] Make dragging of seek bar interactive, both in the seek bar widget and in the video --- .../seek_bar.dart | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 84b5ddf1e2..de21ea4308 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -2,6 +2,7 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/utils/debouncer.dart"; class SeekBar extends StatefulWidget { final NativeVideoPlayerController controller; @@ -15,7 +16,10 @@ class SeekBar extends StatefulWidget { class _SeekBarState extends State with SingleTickerProviderStateMixin { late final AnimationController _animationController; double _prevPositionFraction = 0.0; - + final _debouncer = Debouncer( + const Duration(milliseconds: 100), + executionInterval: const Duration(milliseconds: 325), + ); @override void initState() { super.initState(); @@ -66,14 +70,18 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { min: 0.0, max: 1.0, value: _animationController.value, - onChanged: (value) {}, + onChanged: (value) { + setState(() { + _animationController.value = value; + }); + _seekTo(value); + }, divisions: 4500, onChangeEnd: (value) { - widget.controller.seekTo((value * widget.duration!).round()); - _animationController.animateTo( - value, - duration: const Duration(microseconds: 0), - ); + setState(() { + _animationController.value = value; + }); + _seekTo(value); }, allowedInteraction: SliderInteraction.tapAndSlide, ), @@ -82,6 +90,14 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { ); } + void _seekTo(double value) { + _debouncer.run(() async { + unawaited( + widget.controller.seekTo((value * widget.duration!).round()), + ); + }); + } + void _startMovingSeekbar() { //Video starts playing after a slight delay. This delay is to ensure that //the seek bar animation starts after the video starts playing. @@ -119,7 +135,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { //To immediately set the position to 0 when the ends when playing in loop if (_prevPositionFraction == 1.0 && target == 0.0) { unawaited( - _animationController.animateTo(0, duration: const Duration(seconds: 0)), + _animationController.animateTo(0, duration: Duration.zero), ); } From 551c151f1e32e3798094f293efd5944e86d7049b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 15:47:50 +0530 Subject: [PATCH 0181/1179] [mob][photos] Seek bar minor improvement --- .../viewer/file/native_video_player_controls/seek_bar.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index de21ea4308..6471925d79 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -134,9 +134,9 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { //To immediately set the position to 0 when the ends when playing in loop if (_prevPositionFraction == 1.0 && target == 0.0) { - unawaited( - _animationController.animateTo(0, duration: Duration.zero), - ); + setState(() { + _animationController.value = 0; + }); } //There is a slight delay (around 350 ms) for the event being listened to From 7910d92d340fea364ae56aa4f848c9644eb873b3 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 16:00:13 +0530 Subject: [PATCH 0182/1179] [mob][photos] Theme changes to seek bar --- .../file/native_video_player_controls/seek_bar.dart | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 6471925d79..b4076c85ef 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -2,6 +2,8 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/theme/colors.dart"; +import "package:photos/theme/ente_theme.dart"; import "package:photos/utils/debouncer.dart"; class SeekBar extends StatefulWidget { @@ -53,17 +55,18 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); return AnimatedBuilder( animation: _animationController, builder: (_, __) { return SliderTheme( data: SliderTheme.of(context).copyWith( - trackHeight: 2.0, + trackHeight: 1.0, thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8.0), overlayShape: const RoundSliderOverlayShape(overlayRadius: 14.0), - activeTrackColor: Colors.red, - inactiveTrackColor: Colors.grey, - thumbColor: Colors.red, + activeTrackColor: colorScheme.primary300, + inactiveTrackColor: fillMutedDark, + thumbColor: backgroundElevatedLight, overlayColor: Colors.red.withOpacity(0.4), ), child: Slider( From a4c0c8b999be8afcfb79121e90f547b2b6028d1b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 17:44:19 +0530 Subject: [PATCH 0183/1179] [mob][photos] Show duration and current position in duration in the native video player --- .../ui/viewer/file/video_widget_native.dart | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 646cafba59..e130a7edab 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -13,6 +13,8 @@ import "package:photos/generated/l10n.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/services/files_service.dart"; +import "package:photos/theme/colors.dart"; +import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/file/file_actions.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/play_pause_button.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/seek_bar.dart"; @@ -54,8 +56,7 @@ class _VideoWidgetNativeState extends State NativeVideoPlayerController? _controller; String? _filePath; - ///Duration in seconds - int? duration; + String? duration; double? aspectRatio; final _isControllerInitialized = ValueNotifier(false); @@ -179,7 +180,59 @@ class _VideoWidgetNativeState extends State child: ValueListenableBuilder( builder: (BuildContext context, bool value, _) { return value - ? SeekBar(_controller!, duration) + ? Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8), + child: Container( + padding: + const EdgeInsets.fromLTRB(16, 4, 16, 4), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.3), + borderRadius: const BorderRadius.all( + Radius.circular(8), + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: const Duration(seconds: 5), + child: ValueListenableBuilder( + valueListenable: _controller! + .onPlaybackPositionChanged, + builder: ( + BuildContext context, + int value, + _, + ) { + return Text( + secondsToDuration(value), + style: getEnteTextTheme(context) + .mini + .copyWith( + color: textBaseDark, + ), + ); + }, + ), + ), + Expanded( + child: SeekBar( + _controller!, + _durationToSeconds(duration), + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme(context) + .mini + .copyWith( + color: textBaseDark, + ), + ), + ], + ), + ), + ) : const SizedBox(); }, valueListenable: _isControllerInitialized, @@ -191,6 +244,18 @@ class _VideoWidgetNativeState extends State ); } + String secondsToDuration(int totalSeconds) { + final hours = totalSeconds ~/ 3600; + final minutes = (totalSeconds % 3600) ~/ 60; + final seconds = totalSeconds % 60; + + if (hours > 0) { + return '${hours.toString().padLeft(1, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } else { + return '${minutes.toString().padLeft(1, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + } + int? _durationToSeconds(String? duration) { if (duration == null) { _logger.warning("Duration is null"); @@ -329,7 +394,7 @@ class _VideoWidgetNativeState extends State Future _setAspectRatioFromVideoProps() async { final videoProps = await getVideoPropsAsync(File(_filePath!)); if (videoProps != null) { - duration = _durationToSeconds(videoProps.propData?["duration"]); + duration = videoProps.propData?["duration"]; if (videoProps.width != null && videoProps.height != null) { if (videoProps.width != null && videoProps.height != 0) { From 553e62dfae42104f430f28905aa53fde698f2e80 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 17:55:55 +0530 Subject: [PATCH 0184/1179] [mob][photos] Minor UI enhancements on native video player controls --- .../native_video_player_controls/play_pause_button.dart | 5 +++++ .../viewer/file/native_video_player_controls/seek_bar.dart | 2 +- mobile/lib/ui/viewer/file/video_widget_native.dart | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 9ad34fc4e8..2b79ddba0d 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -1,5 +1,6 @@ import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/theme/ente_theme.dart"; class PlayPauseButton extends StatefulWidget { final NativeVideoPlayerController? controller; @@ -34,6 +35,10 @@ class _PlayPauseButtonState extends State { decoration: BoxDecoration( color: Colors.black.withOpacity(0.3), shape: BoxShape.circle, + border: Border.all( + color: getEnteColorScheme(context).strokeFaint, + width: 1, + ), ), child: AnimatedSwitcher( duration: const Duration(milliseconds: 250), diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index b4076c85ef..886156b899 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -67,7 +67,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { activeTrackColor: colorScheme.primary300, inactiveTrackColor: fillMutedDark, thumbColor: backgroundElevatedLight, - overlayColor: Colors.red.withOpacity(0.4), + overlayColor: fillMutedDark, ), child: Slider( min: 0.0, diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index e130a7edab..61e4cac8ea 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -191,11 +191,17 @@ class _VideoWidgetNativeState extends State borderRadius: const BorderRadius.all( Radius.circular(8), ), + border: Border.all( + color: getEnteColorScheme(context) + .strokeFaint, + width: 1, + ), ), child: Row( children: [ AnimatedSize( duration: const Duration(seconds: 5), + curve: Curves.easeInOut, child: ValueListenableBuilder( valueListenable: _controller! .onPlaybackPositionChanged, From 3652430b593a99a618fc1eb5233e0d3f3b17887b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 7 Aug 2024 18:57:27 +0530 Subject: [PATCH 0185/1179] [mob][photos] Set volume to full in native video player --- mobile/lib/ui/viewer/file/video_widget_native.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 61e4cac8ea..072f6560f1 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -298,6 +298,7 @@ class _VideoWidgetNativeState extends State type: VideoSourceType.file, ); await controller.loadVideoSource(videoSource); + unawaited(controller.setVolume(1)); await controller.play(); _isControllerInitialized.value = true; } From b4500ef4d70ed1afc1b828906c853dd6cba17cde Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 8 Aug 2024 15:26:14 +0530 Subject: [PATCH 0186/1179] [mob][photos] Workaround for android 10 free up space issue Workaround for deletedIDs being empty on android 10 --- mobile/lib/utils/delete_file_util.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mobile/lib/utils/delete_file_util.dart b/mobile/lib/utils/delete_file_util.dart index 545ea9c27a..2121a748b9 100644 --- a/mobile/lib/utils/delete_file_util.dart +++ b/mobile/lib/utils/delete_file_util.dart @@ -373,8 +373,14 @@ Future deleteLocalFiles( ); return true; } else { - showToast(context, S.of(context).couldNotFreeUpSpace); - return false; + //On android 10, even if files were deleted, deletedIDs is empty. + //This is a workaround so that users are not shown an error message on + //android 10 + if (!await isAndroidSDKVersionLowerThan(android11SDKINT)) { + showToast(context, S.of(context).couldNotFreeUpSpace); + return false; + } + return true; } } From c8a8cbee60acf82b0ce05cf21a3763553252373c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:54:16 +0530 Subject: [PATCH 0187/1179] refactor --- .../services/filedata/filedata_service.dart | 37 +++++------- .../services/filedata/model/file_data.dart | 57 +++++++++++++------ .../services/machine_learning/ml_service.dart | 48 +++++++++------- 3 files changed, 82 insertions(+), 60 deletions(-) diff --git a/mobile/lib/services/filedata/filedata_service.dart b/mobile/lib/services/filedata/filedata_service.dart index cae1ad66a8..ec4c27fb17 100644 --- a/mobile/lib/services/filedata/filedata_service.dart +++ b/mobile/lib/services/filedata/filedata_service.dart @@ -15,28 +15,18 @@ import "package:shared_preferences/shared_preferences.dart"; class FileDataService { FileDataService._privateConstructor(); - static const String _derivedDataType = "derivedMeta"; static final Computer _computer = Computer.shared(); - static final FileDataService instance = FileDataService._privateConstructor(); - final _logger = Logger("FileDataService"); final _dio = NetworkClient.instance.enteDio; void init(SharedPreferences prefs) {} - Future putDerivedMetaData( - EnteFile file, - FileDataEntity fileML, { - RemoteClipEmbedding? clipEmbedding, - RemoteFaceEmbedding? faceEmbedding, - }) async { - fileML.putClipIfNotNull(clipEmbedding); - fileML.putFaceIfNotNull(faceEmbedding); - fileML.putSanityCheck(); + Future putFileData(EnteFile file, FileDataEntity data) async { + data.validate(); final ChaChaEncryptionResult encryptionResult = await gzipAndEncryptJson( - fileML.remoteRawData, + data.remoteRawData, getFileKey(file), ); @@ -45,7 +35,7 @@ class FileDataService { "/files/data/", data: { "fileID": file.uploadedFileID!, - "type": _derivedDataType, + "type": data.type.toJson(), "encryptedData": encryptionResult.encData, "decryptionHeader": encryptionResult.header, }, @@ -57,14 +47,15 @@ class FileDataService { } Future getFilesData( - Set fileIds, - ) async { + Set fileIds, { + DataType type = DataType.derivedMeta, + }) async { try { final res = await _dio.post( "/files/fetch-data/", data: { "fileIDs": fileIds.toList(), - "type": _derivedDataType, + "type": type.toJson(), }, ); final remoteEntries = res.data['data'] as List; @@ -75,7 +66,6 @@ class FileDataService { for (var entry in remoteEntries) { encFileData.add(EncryptedFileData.fromMap(entry)); } - final fileIdToDataMap = await decryptRemoteFileData(encFileData); return FileDataResponse( fileIdToDataMap, @@ -99,17 +89,17 @@ class FileDataService { final inputs = <_DecoderInput>[]; final fileMap = await FilesDB.instance .getFilesFromIDs(remoteData.map((e) => e.fileID).toList()); - for (final embedding in remoteData) { - final file = fileMap[embedding.fileID]; + for (final data in remoteData) { + final file = fileMap[data.fileID]; if (file == null) { continue; } final fileKey = getFileKey(file); - final input = _DecoderInput(embedding, fileKey); + final input = _DecoderInput(data, fileKey); inputs.add(input); } return _computer.compute, Map>( - _decryptFileMLComputer, + _decryptFileDataComputer, param: { "inputs": inputs, }, @@ -117,7 +107,7 @@ class FileDataService { } } -Future> _decryptFileMLComputer( +Future> _decryptFileDataComputer( Map args, ) async { final result = {}; @@ -130,6 +120,7 @@ Future> _decryptFileMLComputer( ); result[input.data.fileID] = FileDataEntity.fromRemote( input.data.fileID, + input.data.type, decodedJson, ); } diff --git a/mobile/lib/services/filedata/model/file_data.dart b/mobile/lib/services/filedata/model/file_data.dart index bb4fd774f4..f6f501e47b 100644 --- a/mobile/lib/services/filedata/model/file_data.dart +++ b/mobile/lib/services/filedata/model/file_data.dart @@ -3,49 +3,74 @@ import "package:photos/face/model/face.dart"; const _faceKey = 'face'; const _clipKey = 'clip'; +enum DataType { + derivedMeta('derivedMeta'); + + final String value; + const DataType(this.value); + + static DataType fromString(String type) { + return DataType.values.firstWhere( + (e) => e.value == type, + orElse: () { + throw Exception('Unknown type: $type'); + }, + ); + } + + String toJson() => value; + static DataType fromJson(String json) => DataType.fromString(json); +} + class FileDataEntity { final int fileID; final Map remoteRawData; + final DataType type; FileDataEntity( this.fileID, this.remoteRawData, + this.type, ); - void putSanityCheck() { - if (remoteRawData[_faceKey] == null) { - throw Exception('Face embedding is null'); - } - if (remoteRawData[_clipKey] == null) { - throw Exception('Clip embedding is null'); + void validate() { + if (type == DataType.derivedMeta) { + if (remoteRawData[_faceKey] == null) { + throw Exception('Face embedding is null'); + } + if (remoteRawData[_clipKey] == null) { + throw Exception('Clip embedding is null'); + } + } else { + throw Exception('Invalid type ${type.value}'); } } factory FileDataEntity.fromRemote( int fileID, + String type, Map json, ) { return FileDataEntity( fileID, json, + DataType.fromString(type), ); } - static FileDataEntity empty(int i) { + static FileDataEntity empty(int fileID, DataType type) { final Map json = {}; - return FileDataEntity(i, json); + return FileDataEntity(fileID, json, type); } - void putFaceIfNotNull(RemoteFaceEmbedding? faceEmbedding) { - if (faceEmbedding != null) { - remoteRawData[_faceKey] = faceEmbedding.toJson(); - } + void putFace(RemoteFaceEmbedding faceEmbedding) { + assert(type == DataType.derivedMeta, 'Invalid type ${type.value}'); + remoteRawData[_faceKey] = faceEmbedding.toJson(); } - void putClipIfNotNull(RemoteClipEmbedding? clipEmbedding) { - if (clipEmbedding != null) { - remoteRawData[_clipKey] = clipEmbedding.toJson(); - } + void putClip(RemoteClipEmbedding clipEmbedding) { + assert(type == DataType.derivedMeta, 'Invalid type ${type.value}'); + remoteRawData[_clipKey] = clipEmbedding.toJson(); } RemoteFaceEmbedding? get faceEmbedding => remoteRawData[_faceKey] != null diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 1d95a3eb44..7db1ea13a4 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -450,28 +450,34 @@ class MLService { } _logger.info("inserting ${faces.length} faces for ${result.fileId}"); if (!result.errorOccured) { - await FileDataService.instance.putDerivedMetaData( + final FileDataEntity dataEntity = instruction.existingRemoteFileML ?? + FileDataEntity.empty( + instruction.file.uploadedFileID!, + DataType.derivedMeta, + ); + if (result.facesRan) { + dataEntity.putFace( + RemoteFaceEmbedding( + faces, + result.mlVersion, + client: client, + height: result.decodedImageSize.height, + width: result.decodedImageSize.width, + ), + ); + } + if (result.clipRan) { + dataEntity.putClip( + RemoteClipEmbedding( + result.clip!.embedding, + version: result.mlVersion, + client: client, + ), + ); + } + await FileDataService.instance.putFileData( instruction.file, - instruction.existingRemoteFileML ?? - FileDataEntity.empty( - instruction.file.uploadedFileID!, - ), - faceEmbedding: result.facesRan - ? RemoteFaceEmbedding( - faces, - result.mlVersion, - client: client, - height: result.decodedImageSize.height, - width: result.decodedImageSize.width, - ) - : null, - clipEmbedding: result.clipRan - ? RemoteClipEmbedding( - result.clip!.embedding, - version: result.mlVersion, - client: client, - ) - : null, + dataEntity, ); } else { _logger.warning( From c4770e8645e5f28792363340c84995105faa5563 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 18:19:08 +0530 Subject: [PATCH 0188/1179] [mob][photos] Refactoring --- .../ui/viewer/file/video_widget_native.dart | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 072f6560f1..65d54d9848 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -58,7 +58,7 @@ class _VideoWidgetNativeState extends State String? duration; double? aspectRatio; - final _isControllerInitialized = ValueNotifier(false); + final _isPlaybackReady = ValueNotifier(false); @override void initState() { @@ -129,6 +129,8 @@ class _VideoWidgetNativeState extends State // player.dispose(); _controller?.onPlaybackEnded.removeListener(_onPlaybackEnded); + _controller?.onPlaybackReady.removeListener(_onPlaybackReady); + _isPlaybackReady.dispose(); super.dispose(); } @@ -169,7 +171,7 @@ class _VideoWidgetNativeState extends State ? PlayPauseButton(_controller) : const SizedBox(); }, - valueListenable: _isControllerInitialized, + valueListenable: _isPlaybackReady, ), ), ), @@ -241,7 +243,7 @@ class _VideoWidgetNativeState extends State ) : const SizedBox(); }, - valueListenable: _isControllerInitialized, + valueListenable: _isPlaybackReady, ), ), ], @@ -289,18 +291,28 @@ class _VideoWidgetNativeState extends State Future _initializeController( NativeVideoPlayerController controller, ) async { + _logger.info("initializing native video player controller"); _controller = controller; controller.onPlaybackEnded.addListener(_onPlaybackEnded); + controller.onPlaybackReady.addListener(_onPlaybackReady); + final videoSource = await VideoSource.init( path: _filePath!, + + //Check when to set this to VideoSourceType.asset type: VideoSourceType.file, ); await controller.loadVideoSource(videoSource); - unawaited(controller.setVolume(1)); - await controller.play(); - _isControllerInitialized.value = true; + } + + Future _onPlaybackReady() async { + await _controller!.play(); + Future.delayed(const Duration(seconds: 2), () { + _controller!.setVolume(1); + }); + _isPlaybackReady.value = true; } void _onPlaybackEnded() { From 6b8473a958aecfeb921e31a2e228a1983dbb5e33 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 18:58:29 +0530 Subject: [PATCH 0189/1179] [mob][photos] UI fix for play pause button --- .../file/native_video_player_controls/play_pause_button.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 2b79ddba0d..676cfb4a32 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -52,11 +52,13 @@ class _PlayPauseButtonState extends State { Icons.pause, size: 32, key: ValueKey("pause"), + color: Colors.white, ) : const Icon( Icons.play_arrow, size: 36, key: ValueKey("play"), + color: Colors.white, ), ), ), From 1e7c1396e0a5539d42ba1d3177b617b6c3e572a4 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 19:03:03 +0530 Subject: [PATCH 0190/1179] [mob][photos] Delete cache only on iOS --- .../lib/ui/viewer/file/video_widget_native.dart | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 65d54d9848..a0757e6e26 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -41,7 +41,7 @@ class VideoWidgetNative extends StatefulWidget { class _VideoWidgetNativeState extends State with WidgetsBindingObserver { - final Logger _logger = Logger("VideoWidgetNew"); + final Logger _logger = Logger("VideoWidgetNative"); static const verticalMargin = 72.0; // late final player = Player(); // VideoController? controller; @@ -59,6 +59,7 @@ class _VideoWidgetNativeState extends State String? duration; double? aspectRatio; final _isPlaybackReady = ValueNotifier(false); + bool _shouldClearCache = false; @override void initState() { @@ -87,7 +88,9 @@ class _VideoWidgetNativeState extends State // ignore: unawaited_futures getFile(widget.file, isOrigin: true).then((file) { _setFilePathForNativePlayer(file!.path); - file.delete(); + if (Platform.isIOS) { + _shouldClearCache = true; + } }); } }); @@ -120,6 +123,15 @@ class _VideoWidgetNativeState extends State @override void dispose() { + //https://github.com/fluttercandies/flutter_photo_manager/blob/8afba2745ebaac6af8af75de9cbded9157bc2690/README.md#clear-caches + if (_shouldClearCache) { + _logger.info("Clearing cache"); + File(_filePath!).delete().then( + (value) { + _logger.info("Cache cleared"); + }, + ); + } _fileSwipeLockEventSubscription.cancel(); // pauseVideoSubscription.cancel(); removeCallBack(widget.file); From 03f0db92ada5fdde7727475682ed5728cb416182 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 19:08:59 +0530 Subject: [PATCH 0191/1179] [mob][photos] Remove unnecessary delay --- mobile/lib/ui/viewer/file/video_widget_native.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index a0757e6e26..1daa8c2adc 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -321,9 +321,7 @@ class _VideoWidgetNativeState extends State Future _onPlaybackReady() async { await _controller!.play(); - Future.delayed(const Duration(seconds: 2), () { - _controller!.setVolume(1); - }); + unawaited(_controller!.setVolume(1)); _isPlaybackReady.value = true; } From 09c3d9e025fb38020fbed782fd2c995d00716ab3 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 19:15:19 +0530 Subject: [PATCH 0192/1179] [mob][photos] UI fixes on native video player --- .../file/native_video_player_controls/play_pause_button.dart | 4 ++-- mobile/lib/ui/viewer/file/video_widget_native.dart | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 676cfb4a32..3cc2cdad2d 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -1,6 +1,6 @@ import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; -import "package:photos/theme/ente_theme.dart"; +import "package:photos/theme/colors.dart"; class PlayPauseButton extends StatefulWidget { final NativeVideoPlayerController? controller; @@ -36,7 +36,7 @@ class _PlayPauseButtonState extends State { color: Colors.black.withOpacity(0.3), shape: BoxShape.circle, border: Border.all( - color: getEnteColorScheme(context).strokeFaint, + color: strokeFaintDark, width: 1, ), ), diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 1daa8c2adc..5ea40abee0 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -206,8 +206,7 @@ class _VideoWidgetNativeState extends State Radius.circular(8), ), border: Border.all( - color: getEnteColorScheme(context) - .strokeFaint, + color: strokeFaintDark, width: 1, ), ), From 41a304a18cb1dae066df1753ec4aedbd572b677c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 19:30:07 +0530 Subject: [PATCH 0193/1179] [mob][photos] log errors from native video player if any --- mobile/lib/ui/viewer/file/video_widget_native.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 5ea40abee0..b9bcb664c5 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -142,6 +142,7 @@ class _VideoWidgetNativeState extends State _controller?.onPlaybackEnded.removeListener(_onPlaybackEnded); _controller?.onPlaybackReady.removeListener(_onPlaybackReady); + _controller?.onError.removeListener(_onError); _isPlaybackReady.dispose(); super.dispose(); } @@ -304,6 +305,7 @@ class _VideoWidgetNativeState extends State ) async { _logger.info("initializing native video player controller"); _controller = controller; + _controller!.onError.addListener(_onError); controller.onPlaybackEnded.addListener(_onPlaybackEnded); @@ -318,6 +320,12 @@ class _VideoWidgetNativeState extends State await controller.loadVideoSource(videoSource); } + void _onError() { + //This doesn't work all the time + _logger.severe("Error in native video player controller"); + _logger.severe(_controller!.onError.value); + } + Future _onPlaybackReady() async { await _controller!.play(); unawaited(_controller!.setVolume(1)); From e0fbc64f086f15ce9c2d9044c5307f7865d6f9b4 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 19:36:59 +0530 Subject: [PATCH 0194/1179] [mob][photos] Handle errors --- .../ui/viewer/file/video_widget_native.dart | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index b9bcb664c5..350027b891 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -303,21 +303,23 @@ class _VideoWidgetNativeState extends State Future _initializeController( NativeVideoPlayerController controller, ) async { - _logger.info("initializing native video player controller"); - _controller = controller; - _controller!.onError.addListener(_onError); + try { + _logger.info("Initializing native video player controller"); + _controller = controller; + _controller!.onError.addListener(_onError); - controller.onPlaybackEnded.addListener(_onPlaybackEnded); + controller.onPlaybackEnded.addListener(_onPlaybackEnded); - controller.onPlaybackReady.addListener(_onPlaybackReady); + controller.onPlaybackReady.addListener(_onPlaybackReady); - final videoSource = await VideoSource.init( - path: _filePath!, - - //Check when to set this to VideoSourceType.asset - type: VideoSourceType.file, - ); - await controller.loadVideoSource(videoSource); + final videoSource = await VideoSource.init( + path: _filePath!, + type: VideoSourceType.file, + ); + await controller.loadVideoSource(videoSource); + } catch (e) { + _logger.severe("Error initializing native video player controller", e); + } } void _onError() { From ac27a22ddb3e8c42035b9997222217f0b0967cc6 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 20:28:19 +0530 Subject: [PATCH 0195/1179] [mob][photos] UX improvements in native video player --- .../play_pause_button.dart | 22 +++++++++++ .../ui/viewer/file/video_widget_native.dart | 38 +++++++++++-------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 3cc2cdad2d..9e0f388bb4 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -1,5 +1,9 @@ +import "dart:async"; + import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/pause_video_event.dart"; import "package:photos/theme/colors.dart"; class PlayPauseButton extends StatefulWidget { @@ -11,7 +15,25 @@ class PlayPauseButton extends StatefulWidget { } class _PlayPauseButtonState extends State { + late StreamSubscription pauseVideoSubscription; bool _isPlaying = true; + + @override + void initState() { + super.initState(); + pauseVideoSubscription = Bus.instance.on().listen((event) { + setState(() { + _isPlaying = false; + }); + }); + } + + @override + void dispose() { + pauseVideoSubscription.cancel(); + super.dispose(); + } + @override Widget build(BuildContext context) { return GestureDetector( diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 350027b891..29286bfa21 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -8,6 +8,7 @@ import "package:native_video_player/native_video_player.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/file_swipe_lock_event.dart"; +import "package:photos/events/pause_video_event.dart"; // import "package:photos/events/pause_video_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/extensions/file_props.dart"; @@ -43,12 +44,9 @@ class _VideoWidgetNativeState extends State with WidgetsBindingObserver { final Logger _logger = Logger("VideoWidgetNative"); static const verticalMargin = 72.0; - // late final player = Player(); - // VideoController? controller; final _progressNotifier = ValueNotifier(null); - // late StreamSubscription playingStreamSubscription; bool _isAppInFG = true; - // late StreamSubscription pauseVideoSubscription; + late StreamSubscription pauseVideoSubscription; bool _isFileSwipeLocked = false; late final StreamSubscription _fileSwipeLockEventSubscription; @@ -95,15 +93,10 @@ class _VideoWidgetNativeState extends State } }); } - // playingStreamSubscription = player.stream.playing.listen((event) { - // if (widget.playbackCallback != null && mounted) { - // widget.playbackCallback!(event); - // } - // }); - // pauseVideoSubscription = Bus.instance.on().listen((event) { - // player.pause(); - // }); + pauseVideoSubscription = Bus.instance.on().listen((event) { + _controller?.pause(); + }); _fileSwipeLockEventSubscription = Bus.instance.on().listen((event) { setState(() { @@ -133,16 +126,17 @@ class _VideoWidgetNativeState extends State ); } _fileSwipeLockEventSubscription.cancel(); - // pauseVideoSubscription.cancel(); + pauseVideoSubscription.cancel(); removeCallBack(widget.file); _progressNotifier.dispose(); WidgetsBinding.instance.removeObserver(this); - // playingStreamSubscription.cancel(); // player.dispose(); _controller?.onPlaybackEnded.removeListener(_onPlaybackEnded); _controller?.onPlaybackReady.removeListener(_onPlaybackReady); _controller?.onError.removeListener(_onError); + _controller?.onPlaybackStatusChanged + .removeListener(_onPlaybackStatusChanged); _isPlaybackReady.dispose(); super.dispose(); } @@ -306,11 +300,11 @@ class _VideoWidgetNativeState extends State try { _logger.info("Initializing native video player controller"); _controller = controller; - _controller!.onError.addListener(_onError); + controller.onError.addListener(_onError); controller.onPlaybackEnded.addListener(_onPlaybackEnded); - controller.onPlaybackReady.addListener(_onPlaybackReady); + controller.onPlaybackStatusChanged.addListener(_onPlaybackStatusChanged); final videoSource = await VideoSource.init( path: _filePath!, @@ -322,6 +316,18 @@ class _VideoWidgetNativeState extends State } } + void _onPlaybackStatusChanged() { + if (_controller!.playbackInfo?.status == PlaybackStatus.playing) { + if (widget.playbackCallback != null && mounted) { + widget.playbackCallback!(true); + } + } else { + if (widget.playbackCallback != null && mounted) { + widget.playbackCallback!(false); + } + } + } + void _onError() { //This doesn't work all the time _logger.severe("Error in native video player controller"); From 73c4fd3488c4a6b19da8915504f9e1cb72677d61 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 20:59:28 +0530 Subject: [PATCH 0196/1179] [mob][photos] Only initialize native video player and load video when the file is completely visible Without this, if two high res potrait videos are loaded, one of them goes blank --- .../ui/viewer/file/video_widget_native.dart | 244 ++++++++++-------- 1 file changed, 137 insertions(+), 107 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 29286bfa21..df5377dd4c 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -24,6 +24,7 @@ import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/exif_util.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/toast_util.dart"; +import "package:visibility_detector/visibility_detector.dart"; class VideoWidgetNative extends StatefulWidget { final EnteFile file; @@ -58,6 +59,7 @@ class _VideoWidgetNativeState extends State double? aspectRatio; final _isPlaybackReady = ValueNotifier(false); bool _shouldClearCache = false; + bool _isCompletelyVisible = false; @override void initState() { @@ -145,115 +147,142 @@ class _VideoWidgetNativeState extends State Widget build(BuildContext context) { return Hero( tag: widget.tagPrefix! + widget.file.tag, - child: GestureDetector( - onVerticalDragUpdate: _isFileSwipeLocked - ? null - : (d) => { - if (d.delta.dy > dragSensitivity) - { - Navigator.of(context).pop(), - } - else if (d.delta.dy < (dragSensitivity * -1)) - { - showDetailsSheet(context, widget.file), - }, - }, - child: _filePath == null - ? _getLoadingWidget() - : Stack( - children: [ - Center( - child: AspectRatio( - aspectRatio: aspectRatio ?? 1, - child: NativeVideoPlayerView( - onViewReady: _initializeController, - ), - ), - ), - Positioned.fill( - child: Center( - child: ValueListenableBuilder( - builder: (BuildContext context, bool value, _) { - return value - ? PlayPauseButton(_controller) - : const SizedBox(); - }, - valueListenable: _isPlaybackReady, - ), - ), - ), - Positioned( - bottom: verticalMargin, - right: 0, - left: 0, - child: ValueListenableBuilder( - builder: (BuildContext context, bool value, _) { - return value - ? Padding( - padding: - const EdgeInsets.symmetric(horizontal: 8), - child: Container( - padding: - const EdgeInsets.fromLTRB(16, 4, 16, 4), - decoration: BoxDecoration( - color: Colors.black.withOpacity(0.3), - borderRadius: const BorderRadius.all( - Radius.circular(8), - ), - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - ), - child: Row( - children: [ - AnimatedSize( - duration: const Duration(seconds: 5), - curve: Curves.easeInOut, - child: ValueListenableBuilder( - valueListenable: _controller! - .onPlaybackPositionChanged, - builder: ( - BuildContext context, - int value, - _, - ) { - return Text( - secondsToDuration(value), - style: getEnteTextTheme(context) - .mini - .copyWith( - color: textBaseDark, - ), - ); - }, - ), - ), - Expanded( - child: SeekBar( - _controller!, - _durationToSeconds(duration), - ), - ), - Text( - duration ?? "0:00", - style: getEnteTextTheme(context) - .mini - .copyWith( - color: textBaseDark, - ), - ), - ], - ), - ), - ) - : const SizedBox(); + child: VisibilityDetector( + key: Key(widget.file.generatedID.toString()), + onVisibilityChanged: (info) { + if (info.visibleFraction == 1) { + setState(() { + _isCompletelyVisible = true; + }); + } else { + setState(() { + _isCompletelyVisible = false; + }); + } + }, + child: GestureDetector( + onVerticalDragUpdate: _isFileSwipeLocked + ? null + : (d) => { + if (d.delta.dy > dragSensitivity) + { + Navigator.of(context).pop(), + } + else if (d.delta.dy < (dragSensitivity * -1)) + { + showDetailsSheet(context, widget.file), }, - valueListenable: _isPlaybackReady, - ), + }, + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 750), + switchOutCurve: Curves.easeOutExpo, + switchInCurve: Curves.easeInExpo, + child: !_isCompletelyVisible || _filePath == null + ? _getLoadingWidget() + : Stack( + key: const ValueKey("video_ready"), + children: [ + Center( + child: AspectRatio( + aspectRatio: aspectRatio ?? 1, + child: NativeVideoPlayerView( + onViewReady: _initializeController, + ), + ), + ), + Positioned.fill( + child: Center( + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? PlayPauseButton(_controller) + : const SizedBox(); + }, + valueListenable: _isPlaybackReady, + ), + ), + ), + Positioned( + bottom: verticalMargin, + right: 0, + left: 0, + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), + child: Container( + padding: const EdgeInsets.fromLTRB( + 16, + 4, + 16, + 4, + ), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.3), + borderRadius: const BorderRadius.all( + Radius.circular(8), + ), + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: + const Duration(seconds: 5), + curve: Curves.easeInOut, + child: ValueListenableBuilder( + valueListenable: _controller! + .onPlaybackPositionChanged, + builder: ( + BuildContext context, + int value, + _, + ) { + return Text( + secondsToDuration(value), + style: + getEnteTextTheme(context) + .mini + .copyWith( + color: textBaseDark, + ), + ); + }, + ), + ), + Expanded( + child: SeekBar( + _controller!, + _durationToSeconds(duration), + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme(context) + .mini + .copyWith( + color: textBaseDark, + ), + ), + ], + ), + ), + ) + : const SizedBox(); + }, + valueListenable: _isPlaybackReady, + ), + ), + ], ), - ], - ), + ), + ), ), ); } @@ -382,6 +411,7 @@ class _VideoWidgetNativeState extends State Widget _getLoadingWidget() { return Stack( + key: const ValueKey("video_loading"), children: [ _getThumbnail(), Container( From 5e7febd8f2782cb19488894873db20fe1baadb07 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 21:04:56 +0530 Subject: [PATCH 0197/1179] [mob][photos] Added comment --- mobile/lib/ui/viewer/file/video_widget_native.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index df5377dd4c..79049af597 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -177,6 +177,8 @@ class _VideoWidgetNativeState extends State duration: const Duration(milliseconds: 750), switchOutCurve: Curves.easeOutExpo, switchInCurve: Curves.easeInExpo, + //Loading two high-res potrait videos together causes one to + //go blank. So only loading video when it is completely visible. child: !_isCompletelyVisible || _filePath == null ? _getLoadingWidget() : Stack( From 4cb0a5306aff108c059b27022806c3061b7d4bd8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 9 Aug 2024 22:25:53 +0530 Subject: [PATCH 0198/1179] [mob][photos] Hide/show controls when necessary in native video player --- .../ui/viewer/file/video_widget_native.dart | 184 ++++++++++++------ 1 file changed, 122 insertions(+), 62 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 79049af597..5bf39c762c 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -3,6 +3,7 @@ import "dart:io"; import "package:flutter/cupertino.dart"; import "package:flutter/material.dart"; +import "package:flutter/widgets.dart"; import "package:logging/logging.dart"; import "package:native_video_player/native_video_player.dart"; import "package:photos/core/constants.dart"; @@ -60,6 +61,7 @@ class _VideoWidgetNativeState extends State final _isPlaybackReady = ValueNotifier(false); bool _shouldClearCache = false; bool _isCompletelyVisible = false; + final _showControls = ValueNotifier(true); @override void initState() { @@ -140,6 +142,7 @@ class _VideoWidgetNativeState extends State _controller?.onPlaybackStatusChanged .removeListener(_onPlaybackStatusChanged); _isPlaybackReady.dispose(); + _showControls.dispose(); super.dispose(); } @@ -192,12 +195,38 @@ class _VideoWidgetNativeState extends State ), ), ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + _showControls.value = !_showControls.value; + if (Platform.isIOS) { + widget.playbackCallback!(!_showControls.value); + } + }, + child: Container( + constraints: const BoxConstraints.expand(), + ), + ), Positioned.fill( child: Center( child: ValueListenableBuilder( builder: (BuildContext context, bool value, _) { return value - ? PlayPauseButton(_controller) + ? ValueListenableBuilder( + builder: (context, bool value, _) { + return AnimatedOpacity( + duration: + const Duration(milliseconds: 200), + opacity: value ? 1 : 0, + curve: Curves.easeInOutQuad, + child: IgnorePointer( + ignoring: !value, + child: PlayPauseButton(_controller), + ), + ); + }, + valueListenable: _showControls, + ) : const SizedBox(); }, valueListenable: _isPlaybackReady, @@ -211,70 +240,96 @@ class _VideoWidgetNativeState extends State child: ValueListenableBuilder( builder: (BuildContext context, bool value, _) { return value - ? Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8, - ), - child: Container( - padding: const EdgeInsets.fromLTRB( - 16, - 4, - 16, - 4, - ), - decoration: BoxDecoration( - color: Colors.black.withOpacity(0.3), - borderRadius: const BorderRadius.all( - Radius.circular(8), + ? ValueListenableBuilder( + valueListenable: _showControls, + builder: + (BuildContext context, bool value, _) { + return AnimatedOpacity( + duration: const Duration( + milliseconds: 200, ), - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - ), - child: Row( - children: [ - AnimatedSize( - duration: - const Duration(seconds: 5), - curve: Curves.easeInOut, - child: ValueListenableBuilder( - valueListenable: _controller! - .onPlaybackPositionChanged, - builder: ( - BuildContext context, - int value, - _, - ) { - return Text( - secondsToDuration(value), - style: - getEnteTextTheme(context) - .mini - .copyWith( - color: textBaseDark, - ), - ); - }, + curve: Curves.easeInQuad, + opacity: value ? 1 : 0, + child: IgnorePointer( + ignoring: !value, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, ), - ), - Expanded( - child: SeekBar( - _controller!, - _durationToSeconds(duration), - ), - ), - Text( - duration ?? "0:00", - style: getEnteTextTheme(context) - .mini - .copyWith( - color: textBaseDark, + child: Container( + padding: + const EdgeInsets.fromLTRB( + 16, + 4, + 16, + 4, + ), + decoration: BoxDecoration( + color: Colors.black + .withOpacity(0.3), + borderRadius: + const BorderRadius.all( + Radius.circular(8), ), + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: const Duration( + seconds: 5, + ), + curve: Curves.easeInOut, + child: + ValueListenableBuilder( + valueListenable: _controller! + .onPlaybackPositionChanged, + builder: ( + BuildContext context, + int value, + _, + ) { + return Text( + secondsToDuration( + value, + ), + style: + getEnteTextTheme( + context, + ).mini.copyWith( + color: + textBaseDark, + ), + ); + }, + ), + ), + Expanded( + child: SeekBar( + _controller!, + _durationToSeconds( + duration, + ), + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme( + context, + ).mini.copyWith( + color: textBaseDark, + ), + ), + ], + ), + ), ), - ], - ), - ), + ), + ); + }, ) : const SizedBox(); }, @@ -350,7 +405,12 @@ class _VideoWidgetNativeState extends State void _onPlaybackStatusChanged() { if (_controller!.playbackInfo?.status == PlaybackStatus.playing) { if (widget.playbackCallback != null && mounted) { - widget.playbackCallback!(true); + Future.delayed(const Duration(milliseconds: 1500), () { + if (mounted) { + _showControls.value = false; + widget.playbackCallback!(true); + } + }); } } else { if (widget.playbackCallback != null && mounted) { From fb867bd351bd4a7464f087976417e3b30756da3b Mon Sep 17 00:00:00 2001 From: Jaspal Suri <44656000+JaspalSuri@users.noreply.github.com> Date: Sat, 10 Aug 2024 00:06:10 -0700 Subject: [PATCH 0199/1179] Update Google Photos Takeout Instructions Simplify instructions Remove note Expand step 9 to incorporate note --- docs/docs/photos/migration/from-google-photos/index.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/docs/photos/migration/from-google-photos/index.md b/docs/docs/photos/migration/from-google-photos/index.md index 772908576e..861b589b52 100644 --- a/docs/docs/photos/migration/from-google-photos/index.md +++ b/docs/docs/photos/migration/from-google-photos/index.md @@ -39,7 +39,7 @@ it with Ente. 8. Wait for Google to send you your data. 9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload", - select "Google takeout" and pick the ZIP file you just downloaded. + select "Google takeout" and pick the ZIP file you just downloaded. If you were provided with multiple ZIP files, you must extract **all** of the files, *including the JSON files*, into one folder and select "Folder" instead. ![Importing Google Takeout into Ente](google-takeout.png){width=400px} @@ -54,10 +54,3 @@ will ignore already backed up files and upload just the rest. If you run into any issues during this migration, please reach out to [support@ente.io](mailto:support@ente.io) and we will be happy to help you! - -> Note: When importing a Google takeout, Ente will parse the metadata in the -> JSON files and stich them together with corresponding files. However, one case -> this will not work is when Google has split the export into multiple parts, -> and did not put the JSON file associated with an image in the same exported -> zip. So the best move is to unzip all of the items into a single folder, and -> to drop that folder into our desktop app. From f7345102a2ea607bcbe8f34d13673118f490f60f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 15:31:30 +0530 Subject: [PATCH 0200/1179] [mob][photos] Do not hide controls when seeking + Hide controls after seeking + do not surface controls when video starts over when playing in loop: --- .../seek_bar.dart | 7 ++++++- .../ui/viewer/file/video_widget_native.dart | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 886156b899..48f1dc6be6 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -9,7 +9,8 @@ import "package:photos/utils/debouncer.dart"; class SeekBar extends StatefulWidget { final NativeVideoPlayerController controller; final int? duration; - const SeekBar(this.controller, this.duration, {super.key}); + final ValueNotifier isSeeking; + const SeekBar(this.controller, this.duration, this.isSeeking, {super.key}); @override State createState() => _SeekBarState(); @@ -73,6 +74,9 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { min: 0.0, max: 1.0, value: _animationController.value, + onChangeStart: (value) { + widget.isSeeking.value = true; + }, onChanged: (value) { setState(() { _animationController.value = value; @@ -85,6 +89,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { _animationController.value = value; }); _seekTo(value); + widget.isSeeking.value = false; }, allowedInteraction: SliderInteraction.tapAndSlide, ), diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 5bf39c762c..1b53e5c3a8 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -62,6 +62,7 @@ class _VideoWidgetNativeState extends State bool _shouldClearCache = false; bool _isCompletelyVisible = false; final _showControls = ValueNotifier(true); + final _isSeeking = ValueNotifier(false); @override void initState() { @@ -143,6 +144,8 @@ class _VideoWidgetNativeState extends State .removeListener(_onPlaybackStatusChanged); _isPlaybackReady.dispose(); _showControls.dispose(); + _isSeeking.removeListener(_isSeekingListener); + _isSeeking.dispose(); super.dispose(); } @@ -313,6 +316,7 @@ class _VideoWidgetNativeState extends State _durationToSeconds( duration, ), + _isSeeking, ), ), Text( @@ -391,6 +395,7 @@ class _VideoWidgetNativeState extends State controller.onPlaybackEnded.addListener(_onPlaybackEnded); controller.onPlaybackReady.addListener(_onPlaybackReady); controller.onPlaybackStatusChanged.addListener(_onPlaybackStatusChanged); + _isSeeking.addListener(_isSeekingListener); final videoSource = await VideoSource.init( path: _filePath!, @@ -402,7 +407,23 @@ class _VideoWidgetNativeState extends State } } + void _isSeekingListener() { + if (!_isSeeking.value && + _controller?.playbackInfo?.status == PlaybackStatus.playing) { + Future.delayed(const Duration(milliseconds: 1500), () { + if (mounted) { + _showControls.value = false; + } + }); + } + } + + ///Need to not execute this if the status change is coming from a video getting + ///played in loop. void _onPlaybackStatusChanged() { + if (_isSeeking.value || _controller?.playbackInfo?.positionFraction == 1) { + return; + } if (_controller!.playbackInfo?.status == PlaybackStatus.playing) { if (widget.playbackCallback != null && mounted) { Future.delayed(const Duration(milliseconds: 1500), () { From 9abd9e126ca0b76d5f27481c2a38925d8f59e611 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 15:49:33 +0530 Subject: [PATCH 0201/1179] [mob][photos] Fix seeking UX issue when video just started playing --- mobile/lib/ui/viewer/file/video_widget_native.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 1b53e5c3a8..dfe95a4e5b 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -412,6 +412,7 @@ class _VideoWidgetNativeState extends State _controller?.playbackInfo?.status == PlaybackStatus.playing) { Future.delayed(const Duration(milliseconds: 1500), () { if (mounted) { + if (_isSeeking.value) return; _showControls.value = false; } }); @@ -428,6 +429,7 @@ class _VideoWidgetNativeState extends State if (widget.playbackCallback != null && mounted) { Future.delayed(const Duration(milliseconds: 1500), () { if (mounted) { + if (_isSeeking.value) return; _showControls.value = false; widget.playbackCallback!(true); } From c079ed12ca7adb427f9f3f1c299e2ea5f2d416aa Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 16:12:22 +0530 Subject: [PATCH 0202/1179] [mob][photos] UX improvements on native video player --- mobile/lib/ui/viewer/file/video_widget_native.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index dfe95a4e5b..f0552e128a 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -410,10 +410,13 @@ class _VideoWidgetNativeState extends State void _isSeekingListener() { if (!_isSeeking.value && _controller?.playbackInfo?.status == PlaybackStatus.playing) { - Future.delayed(const Duration(milliseconds: 1500), () { + Future.delayed(const Duration(milliseconds: 2000), () { if (mounted) { if (_isSeeking.value) return; _showControls.value = false; + if (Platform.isIOS) { + widget.playbackCallback!(true); + } } }); } @@ -427,7 +430,7 @@ class _VideoWidgetNativeState extends State } if (_controller!.playbackInfo?.status == PlaybackStatus.playing) { if (widget.playbackCallback != null && mounted) { - Future.delayed(const Duration(milliseconds: 1500), () { + Future.delayed(const Duration(milliseconds: 2000), () { if (mounted) { if (_isSeeking.value) return; _showControls.value = false; From c27017e77ecbdac34f8539b21ce63922a12f3306 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 16:41:01 +0530 Subject: [PATCH 0203/1179] [mob][photos] UX improvements on native video player --- .../ui/viewer/file/video_widget_native.dart | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index f0552e128a..f3ef3cb2c3 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -21,6 +21,7 @@ import "package:photos/ui/actions/file/file_actions.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/play_pause_button.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/seek_bar.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; +import "package:photos/utils/debouncer.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/exif_util.dart"; import "package:photos/utils/file_util.dart"; @@ -63,6 +64,7 @@ class _VideoWidgetNativeState extends State bool _isCompletelyVisible = false; final _showControls = ValueNotifier(true); final _isSeeking = ValueNotifier(false); + final _debouncer = Debouncer(const Duration(milliseconds: 2000)); @override void initState() { @@ -144,8 +146,9 @@ class _VideoWidgetNativeState extends State .removeListener(_onPlaybackStatusChanged); _isPlaybackReady.dispose(); _showControls.dispose(); - _isSeeking.removeListener(_isSeekingListener); + _isSeeking.removeListener(_seekListener); _isSeeking.dispose(); + _debouncer.cancelDebounce(); super.dispose(); } @@ -395,7 +398,7 @@ class _VideoWidgetNativeState extends State controller.onPlaybackEnded.addListener(_onPlaybackEnded); controller.onPlaybackReady.addListener(_onPlaybackReady); controller.onPlaybackStatusChanged.addListener(_onPlaybackStatusChanged); - _isSeeking.addListener(_isSeekingListener); + _isSeeking.addListener(_seekListener); final videoSource = await VideoSource.init( path: _filePath!, @@ -407,12 +410,15 @@ class _VideoWidgetNativeState extends State } } - void _isSeekingListener() { + void _seekListener() { if (!_isSeeking.value && _controller?.playbackInfo?.status == PlaybackStatus.playing) { - Future.delayed(const Duration(milliseconds: 2000), () { + _debouncer.run(() async { if (mounted) { - if (_isSeeking.value) return; + if (_isSeeking.value || + _controller?.playbackInfo?.status != PlaybackStatus.playing) { + return; + } _showControls.value = false; if (Platform.isIOS) { widget.playbackCallback!(true); @@ -430,9 +436,12 @@ class _VideoWidgetNativeState extends State } if (_controller!.playbackInfo?.status == PlaybackStatus.playing) { if (widget.playbackCallback != null && mounted) { - Future.delayed(const Duration(milliseconds: 2000), () { + _debouncer.run(() async { if (mounted) { - if (_isSeeking.value) return; + if (_isSeeking.value || + _controller!.playbackInfo?.status != PlaybackStatus.playing) { + return; + } _showControls.value = false; widget.playbackCallback!(true); } From 1aa38253a39c01faa27e5b2ac3f0d4798a130300 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 16:42:54 +0530 Subject: [PATCH 0204/1179] [mob][photos] Chore --- .../lib/states/all_sections_examples_state.dart | 2 +- mobile/lib/states/location_state.dart | 2 +- .../device/device_folders_grid_view.dart | 2 +- .../device_folders_vertical_grid_view.dart | 2 +- .../ui/components/buttons/button_widget.dart | 4 ++-- .../menu_item_widget/menu_item_widget.dart | 4 ++-- mobile/lib/ui/components/text_input_widget.dart | 4 ++-- .../lib/ui/components/toggle_switch_widget.dart | 4 ++-- mobile/lib/ui/tabs/shared_collections_tab.dart | 2 +- mobile/lib/ui/tabs/user_collections_tab.dart | 2 +- mobile/lib/ui/viewer/file/file_widget.dart | 17 +++++++---------- .../lib/ui/viewer/file/video_widget_native.dart | 2 +- mobile/lib/ui/viewer/gallery/gallery.dart | 2 +- mobile/lib/ui/viewer/search/search_widget.dart | 2 +- mobile/lib/utils/debouncer.dart | 4 +++- 15 files changed, 27 insertions(+), 28 deletions(-) diff --git a/mobile/lib/states/all_sections_examples_state.dart b/mobile/lib/states/all_sections_examples_state.dart index 716de8db56..9feb3d96bd 100644 --- a/mobile/lib/states/all_sections_examples_state.dart +++ b/mobile/lib/states/all_sections_examples_state.dart @@ -109,7 +109,7 @@ class _AllSectionsExamplesProviderState _onPeopleChangedEvent.cancel(); _filesUpdatedEvent.cancel(); _tabChangeEvent.cancel(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/states/location_state.dart b/mobile/lib/states/location_state.dart index 3fc773b99a..8ab32e55e8 100644 --- a/mobile/lib/states/location_state.dart +++ b/mobile/lib/states/location_state.dart @@ -86,7 +86,7 @@ class _LocationTagStateProviderState extends State { } void _updateSelectedRadius(double radius) { - _selectedRadiusDebouncer.cancelDebounce(); + _selectedRadiusDebouncer.cancelDebounceTimer(); _selectedRadiusDebouncer.run(() async { if (mounted) { setState(() { diff --git a/mobile/lib/ui/collections/device/device_folders_grid_view.dart b/mobile/lib/ui/collections/device/device_folders_grid_view.dart index cd3ee47dc6..b9c2588613 100644 --- a/mobile/lib/ui/collections/device/device_folders_grid_view.dart +++ b/mobile/lib/ui/collections/device/device_folders_grid_view.dart @@ -102,7 +102,7 @@ class _DeviceFoldersGridViewState extends State { void dispose() { _backupFoldersUpdatedEvent?.cancel(); _localFilesSubscription?.cancel(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } } diff --git a/mobile/lib/ui/collections/device/device_folders_vertical_grid_view.dart b/mobile/lib/ui/collections/device/device_folders_vertical_grid_view.dart index 7b417c3d63..f465878ff5 100644 --- a/mobile/lib/ui/collections/device/device_folders_vertical_grid_view.dart +++ b/mobile/lib/ui/collections/device/device_folders_vertical_grid_view.dart @@ -158,7 +158,7 @@ class _DeviceFolderVerticalGridViewBodyState void dispose() { _backupFoldersUpdatedEvent?.cancel(); _localFilesSubscription?.cancel(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } } diff --git a/mobile/lib/ui/components/buttons/button_widget.dart b/mobile/lib/ui/components/buttons/button_widget.dart index 2e4d2d1dc2..7590735b10 100644 --- a/mobile/lib/ui/components/buttons/button_widget.dart +++ b/mobile/lib/ui/components/buttons/button_widget.dart @@ -416,13 +416,13 @@ class _ButtonChildWidgetState extends State { onError: (error, stackTrace) { executionState = ExecutionState.error; _exception = error as Exception; - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); }, ); widget.shouldShowSuccessConfirmation && _debouncer.isActive() ? executionState = ExecutionState.successful : null; - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); if (executionState == ExecutionState.successful) { setState(() {}); } diff --git a/mobile/lib/ui/components/menu_item_widget/menu_item_widget.dart b/mobile/lib/ui/components/menu_item_widget/menu_item_widget.dart index 21e88eb403..cb18f9b26f 100644 --- a/mobile/lib/ui/components/menu_item_widget/menu_item_widget.dart +++ b/mobile/lib/ui/components/menu_item_widget/menu_item_widget.dart @@ -227,9 +227,9 @@ class _MenuItemWidgetState extends State { ? executionStateNotifier.value = ExecutionState.successful : null; }, - onError: (error, stackTrace) => _debouncer.cancelDebounce(), + onError: (error, stackTrace) => _debouncer.cancelDebounceTimer(), ); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); if (widget.alwaysShowSuccessState) { Future.delayed(const Duration(seconds: 2), () { executionStateNotifier.value = ExecutionState.idle; diff --git a/mobile/lib/ui/components/text_input_widget.dart b/mobile/lib/ui/components/text_input_widget.dart index 0d4fd7aeca..900a402df9 100644 --- a/mobile/lib/ui/components/text_input_widget.dart +++ b/mobile/lib/ui/components/text_input_widget.dart @@ -275,7 +275,7 @@ class _TextInputWidgetState extends State { await widget.onSubmit!.call(_textController.text); } catch (e) { executionState = ExecutionState.error; - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); _exception = e as Exception; if (e.toString().contains("Incorrect password")) { _logger.warning("Incorrect password"); @@ -288,7 +288,7 @@ class _TextInputWidgetState extends State { widget.alwaysShowSuccessState && _debouncer.isActive() ? executionState = ExecutionState.successful : null; - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); if (executionState == ExecutionState.successful) { setState(() {}); } diff --git a/mobile/lib/ui/components/toggle_switch_widget.dart b/mobile/lib/ui/components/toggle_switch_widget.dart index de6507c1f5..fb132cedf0 100644 --- a/mobile/lib/ui/components/toggle_switch_widget.dart +++ b/mobile/lib/ui/components/toggle_switch_widget.dart @@ -121,12 +121,12 @@ class _ToggleSwitchWidgetState extends State { }); final Stopwatch stopwatch = Stopwatch()..start(); await widget.onChanged.call().onError( - (error, stackTrace) => _debouncer.cancelDebounce(), + (error, stackTrace) => _debouncer.cancelDebounceTimer(), ); //for toggle feedback on short unsuccessful onChanged await _feedbackOnUnsuccessfulToggle(stopwatch); //debouncer gets canceled if onChanged takes less than debounce time - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); final newValue = widget.value.call(); setState(() { diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index 2994a293c2..8f4b61b38a 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -330,7 +330,7 @@ class _SharedCollectionsTabState extends State _localFilesSubscription.cancel(); _collectionUpdatesSubscription.cancel(); _loggedOutEvent.cancel(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/ui/tabs/user_collections_tab.dart b/mobile/lib/ui/tabs/user_collections_tab.dart index 20a012d0c2..333241f20e 100644 --- a/mobile/lib/ui/tabs/user_collections_tab.dart +++ b/mobile/lib/ui/tabs/user_collections_tab.dart @@ -298,7 +298,7 @@ class _UserCollectionsTabState extends State _loggedOutEvent.cancel(); _favoritesServiceInitCompleteEvent.cancel(); _scrollController.dispose(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/ui/viewer/file/file_widget.dart b/mobile/lib/ui/viewer/file/file_widget.dart index 92c7a1523f..7f91efa8a5 100644 --- a/mobile/lib/ui/viewer/file/file_widget.dart +++ b/mobile/lib/ui/viewer/file/file_widget.dart @@ -1,11 +1,8 @@ -import "dart:io"; - import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; -import "package:photos/ui/viewer/file/video_widget.dart"; import "package:photos/ui/viewer/file/video_widget_native.dart"; import "package:photos/ui/viewer/file/zoomable_live_image_new.dart"; @@ -44,13 +41,13 @@ class FileWidget extends StatelessWidget { } else if (file.fileType == FileType.video) { // use old video widget on iOS simulator as the new one crashes while // playing certain videos on iOS simulator - if (kDebugMode && Platform.isIOS) { - return VideoWidget( - file, - tagPrefix: tagPrefix, - playbackCallback: playbackCallback, - ); - } + // if (kDebugMode && Platform.isIOS) { + // return VideoWidget( + // file, + // tagPrefix: tagPrefix, + // playbackCallback: playbackCallback, + // ); + // } return VideoWidgetNative( file, tagPrefix: tagPrefix, diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index f3ef3cb2c3..671477aa0c 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -148,7 +148,7 @@ class _VideoWidgetNativeState extends State _showControls.dispose(); _isSeeking.removeListener(_seekListener); _isSeeking.dispose(); - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/ui/viewer/gallery/gallery.dart b/mobile/lib/ui/viewer/gallery/gallery.dart index 3155617060..be41f11ff2 100644 --- a/mobile/lib/ui/viewer/gallery/gallery.dart +++ b/mobile/lib/ui/viewer/gallery/gallery.dart @@ -243,7 +243,7 @@ class GalleryState extends State { for (final subscription in _forceReloadEventSubscriptions) { subscription.cancel(); } - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/ui/viewer/search/search_widget.dart b/mobile/lib/ui/viewer/search/search_widget.dart index 89002b1e14..1983c5cb69 100644 --- a/mobile/lib/ui/viewer/search/search_widget.dart +++ b/mobile/lib/ui/viewer/search/search_widget.dart @@ -96,7 +96,7 @@ class SearchWidgetState extends State { @override void dispose() { - _debouncer.cancelDebounce(); + _debouncer.cancelDebounceTimer(); focusNode.dispose(); _tabDoubleTapEvent?.cancel(); textController.removeListener(textControllerListener); diff --git a/mobile/lib/utils/debouncer.dart b/mobile/lib/utils/debouncer.dart index 99b9ce9a89..31e9709521 100644 --- a/mobile/lib/utils/debouncer.dart +++ b/mobile/lib/utils/debouncer.dart @@ -3,6 +3,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import "package:photos/models/typedefs.dart"; +///Do not forget to cancel the debounce's timer using [cancelDebounceTimer] +///when the debouncer is no longer needed class Debouncer { final Duration _duration; @@ -43,7 +45,7 @@ class Debouncer { _debounceActiveNotifier.value = true; } - void cancelDebounce() { + void cancelDebounceTimer() { if (_debounceTimer != null) { _debounceTimer!.cancel(); } From de1f287c1c32057e26f6530bfe494c5ec4404b36 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 17:37:29 +0530 Subject: [PATCH 0205/1179] [mob][photos] Keep video playing until the currently playing video completely off the screen --- mobile/lib/ui/viewer/file/video_widget_native.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 671477aa0c..9644ea2dd2 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -163,10 +163,6 @@ class _VideoWidgetNativeState extends State setState(() { _isCompletelyVisible = true; }); - } else { - setState(() { - _isCompletelyVisible = false; - }); } }, child: GestureDetector( From cbdf6ea0e31d166ede1c18bc08675c9fa3796f00 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 17:58:01 +0530 Subject: [PATCH 0206/1179] [mob][photos] Fix UI for native video player on memories --- .../ui/home/memories/full_screen_memory.dart | 1 + mobile/lib/ui/viewer/file/detail_page.dart | 1 + mobile/lib/ui/viewer/file/file_widget.dart | 2 + .../ui/viewer/file/video_widget_native.dart | 188 ++++++++++-------- 4 files changed, 104 insertions(+), 88 deletions(-) diff --git a/mobile/lib/ui/home/memories/full_screen_memory.dart b/mobile/lib/ui/home/memories/full_screen_memory.dart index c8e69b58d8..a46d542606 100644 --- a/mobile/lib/ui/home/memories/full_screen_memory.dart +++ b/mobile/lib/ui/home/memories/full_screen_memory.dart @@ -268,6 +268,7 @@ class _FullScreenMemoryState extends State { backgroundDecoration: const BoxDecoration( color: Colors.transparent, ), + isFromMemories: true, ), ); }, diff --git a/mobile/lib/ui/viewer/file/detail_page.dart b/mobile/lib/ui/viewer/file/detail_page.dart index 521a12ea69..90ad061238 100644 --- a/mobile/lib/ui/viewer/file/detail_page.dart +++ b/mobile/lib/ui/viewer/file/detail_page.dart @@ -215,6 +215,7 @@ class _DetailPageState extends State { }); }, backgroundDecoration: const BoxDecoration(color: Colors.black), + isFromMemories: false, ); return GestureDetector( onTap: () { diff --git a/mobile/lib/ui/viewer/file/file_widget.dart b/mobile/lib/ui/viewer/file/file_widget.dart index 7f91efa8a5..40dea9342d 100644 --- a/mobile/lib/ui/viewer/file/file_widget.dart +++ b/mobile/lib/ui/viewer/file/file_widget.dart @@ -13,6 +13,7 @@ class FileWidget extends StatelessWidget { final Function(bool)? playbackCallback; final BoxDecoration? backgroundDecoration; final bool? autoPlay; + final bool isFromMemories; const FileWidget( this.file, { @@ -21,6 +22,7 @@ class FileWidget extends StatelessWidget { this.playbackCallback, this.tagPrefix, this.backgroundDecoration, + required this.isFromMemories, Key? key, }) : super(key: key); diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 9644ea2dd2..9fe20b1b6d 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -32,10 +32,12 @@ class VideoWidgetNative extends StatefulWidget { final EnteFile file; final String? tagPrefix; final Function(bool)? playbackCallback; + final bool isFromMemories; const VideoWidgetNative( this.file, { this.tagPrefix, this.playbackCallback, + this.isFromMemories = false, super.key, }); @@ -239,104 +241,114 @@ class _VideoWidgetNativeState extends State bottom: verticalMargin, right: 0, left: 0, - child: ValueListenableBuilder( - builder: (BuildContext context, bool value, _) { - return value - ? ValueListenableBuilder( - valueListenable: _showControls, - builder: - (BuildContext context, bool value, _) { - return AnimatedOpacity( - duration: const Duration( - milliseconds: 200, - ), - curve: Curves.easeInQuad, - opacity: value ? 1 : 0, - child: IgnorePointer( - ignoring: !value, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8, - ), - child: Container( + child: Padding( + padding: EdgeInsets.only( + bottom: widget.isFromMemories ? 0 : 32, + ), + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? ValueListenableBuilder( + valueListenable: _showControls, + builder: ( + BuildContext context, + bool value, + _, + ) { + return AnimatedOpacity( + duration: const Duration( + milliseconds: 200, + ), + curve: Curves.easeInQuad, + opacity: value ? 1 : 0, + child: IgnorePointer( + ignoring: !value, + child: Padding( padding: - const EdgeInsets.fromLTRB( - 16, - 4, - 16, - 4, + const EdgeInsets.symmetric( + horizontal: 8, ), - decoration: BoxDecoration( - color: Colors.black - .withOpacity(0.3), - borderRadius: - const BorderRadius.all( - Radius.circular(8), + child: Container( + padding: + const EdgeInsets.fromLTRB( + 16, + 4, + 16, + 4, ), - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - ), - child: Row( - children: [ - AnimatedSize( - duration: const Duration( - seconds: 5, - ), - curve: Curves.easeInOut, - child: - ValueListenableBuilder( - valueListenable: _controller! - .onPlaybackPositionChanged, - builder: ( - BuildContext context, - int value, - _, - ) { - return Text( - secondsToDuration( - value, - ), - style: - getEnteTextTheme( - context, - ).mini.copyWith( - color: - textBaseDark, - ), - ); - }, - ), + decoration: BoxDecoration( + color: Colors.black + .withOpacity(0.3), + borderRadius: + const BorderRadius.all( + Radius.circular(8), ), - Expanded( - child: SeekBar( - _controller!, - _durationToSeconds( - duration, + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: const Duration( + seconds: 5, + ), + curve: Curves.easeInOut, + child: + ValueListenableBuilder( + valueListenable: + _controller! + .onPlaybackPositionChanged, + builder: ( + BuildContext context, + int value, + _, + ) { + return Text( + secondsToDuration( + value, + ), + style: + getEnteTextTheme( + context, + ).mini.copyWith( + color: + textBaseDark, + ), + ); + }, ), - _isSeeking, ), - ), - Text( - duration ?? "0:00", - style: getEnteTextTheme( - context, - ).mini.copyWith( - color: textBaseDark, + Expanded( + child: SeekBar( + _controller!, + _durationToSeconds( + duration, ), - ), - ], + _isSeeking, + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme( + context, + ).mini.copyWith( + color: textBaseDark, + ), + ), + ], + ), ), ), ), - ), - ); - }, - ) - : const SizedBox(); - }, - valueListenable: _isPlaybackReady, + ); + }, + ) + : const SizedBox(); + }, + valueListenable: _isPlaybackReady, + ), ), ), ], From df234660a05ed049e766438a8c87b5fc0d337ec8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 18:19:40 +0530 Subject: [PATCH 0207/1179] [mob][photos] chore --- .../ui/viewer/file/video_widget_native.dart | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 9fe20b1b6d..1cdc1dd674 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -3,12 +3,11 @@ import "dart:io"; import "package:flutter/cupertino.dart"; import "package:flutter/material.dart"; -import "package:flutter/widgets.dart"; import "package:logging/logging.dart"; import "package:native_video_player/native_video_player.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; -import "package:photos/events/file_swipe_lock_event.dart"; +import "package:photos/events/guest_view_event.dart"; import "package:photos/events/pause_video_event.dart"; // import "package:photos/events/pause_video_event.dart"; import "package:photos/generated/l10n.dart"; @@ -50,11 +49,9 @@ class _VideoWidgetNativeState extends State final Logger _logger = Logger("VideoWidgetNative"); static const verticalMargin = 72.0; final _progressNotifier = ValueNotifier(null); - bool _isAppInFG = true; late StreamSubscription pauseVideoSubscription; - bool _isFileSwipeLocked = false; - late final StreamSubscription - _fileSwipeLockEventSubscription; + bool _isGuestView = false; + late final StreamSubscription _guestViewEventSubscription; NativeVideoPlayerController? _controller; String? _filePath; @@ -106,23 +103,14 @@ class _VideoWidgetNativeState extends State pauseVideoSubscription = Bus.instance.on().listen((event) { _controller?.pause(); }); - _fileSwipeLockEventSubscription = - Bus.instance.on().listen((event) { + _guestViewEventSubscription = + Bus.instance.on().listen((event) { setState(() { - _isFileSwipeLocked = event.shouldSwipeLock; + _isGuestView = event.isGuestView; }); }); } - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - if (state == AppLifecycleState.resumed) { - _isAppInFG = true; - } else { - _isAppInFG = false; - } - } - @override void dispose() { //https://github.com/fluttercandies/flutter_photo_manager/blob/8afba2745ebaac6af8af75de9cbded9157bc2690/README.md#clear-caches @@ -134,7 +122,7 @@ class _VideoWidgetNativeState extends State }, ); } - _fileSwipeLockEventSubscription.cancel(); + _guestViewEventSubscription.cancel(); pauseVideoSubscription.cancel(); removeCallBack(widget.file); _progressNotifier.dispose(); @@ -168,7 +156,7 @@ class _VideoWidgetNativeState extends State } }, child: GestureDetector( - onVerticalDragUpdate: _isFileSwipeLocked + onVerticalDragUpdate: _isGuestView ? null : (d) => { if (d.delta.dy > dragSensitivity) From 7bbf926986b0b808ddaca4377f3d94939a5162f8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Sat, 10 Aug 2024 18:23:46 +0530 Subject: [PATCH 0208/1179] [mob][photos] Bump up version to 0.9.17 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b336cf7623..1891602d9d 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.16+916 +version: 0.9.17+917 publish_to: none environment: From ac5da3ac1e199b4c9d37d1645a7f8eb804c8a09f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 12 Aug 2024 13:01:39 +0530 Subject: [PATCH 0209/1179] [mob][photos] commit pubspec.lock and Podfile.lock changes --- mobile/ios/Podfile.lock | 36 ++++++++++++++++++++++++------------ mobile/pubspec.lock | 36 ++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 3fee5e8c6e..2ee64030ba 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -3,13 +3,13 @@ PODS: - Flutter - battery_info (0.0.1): - Flutter + - blurhash_ffi (0.0.1): + - Flutter - connectivity_plus (0.0.1): - Flutter - FlutterMacOS - dart_ui_isolate (0.0.1): - Flutter - - dchs_motion_sensors (0.0.1): - - Flutter - device_info_plus (0.0.1): - Flutter - ffmpeg-kit-ios-min (6.0) @@ -148,6 +148,8 @@ PODS: - Flutter - media_kit_video (0.0.1): - Flutter + - motion_sensors (0.0.1): + - Flutter - motionphoto (0.0.1): - Flutter - move_to_background (0.0.1): @@ -157,6 +159,8 @@ PODS: - nanopb/encode (= 2.30910.0) - nanopb/decode (2.30910.0) - nanopb/encode (2.30910.0) + - native_video_player (1.0.0): + - Flutter - onnxruntime (0.0.1): - Flutter - onnxruntime-objc (= 1.18.0) @@ -178,6 +182,8 @@ PODS: - photo_manager (2.0.0): - Flutter - FlutterMacOS + - privacy_screen (0.0.1): + - Flutter - PromisesObjC (2.4.0) - receive_sharing_intent (1.6.8): - Flutter @@ -201,8 +207,6 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - smart_auth (0.0.1): - - Flutter - sqflite (0.0.3): - Flutter - FlutterMacOS @@ -240,9 +244,9 @@ PODS: DEPENDENCIES: - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - battery_info (from `.symlinks/plugins/battery_info/ios`) + - blurhash_ffi (from `.symlinks/plugins/blurhash_ffi/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`) - - dchs_motion_sensors (from `.symlinks/plugins/dchs_motion_sensors/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - ffmpeg_kit_flutter_min (from `.symlinks/plugins/ffmpeg_kit_flutter_min/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`) @@ -269,20 +273,22 @@ DEPENDENCIES: - media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`) - media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`) - media_kit_video (from `.symlinks/plugins/media_kit_video/ios`) + - motion_sensors (from `.symlinks/plugins/motion_sensors/ios`) - motionphoto (from `.symlinks/plugins/motionphoto/ios`) - move_to_background (from `.symlinks/plugins/move_to_background/ios`) + - native_video_player (from `.symlinks/plugins/native_video_player/ios`) - onnxruntime (from `.symlinks/plugins/onnxruntime/ios`) - open_mail_app (from `.symlinks/plugins/open_mail_app/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`) + - privacy_screen (from `.symlinks/plugins/privacy_screen/ios`) - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) - screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`) - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - smart_auth (from `.symlinks/plugins/smart_auth/ios`) - sqflite (from `.symlinks/plugins/sqflite/darwin`) - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) - uni_links (from `.symlinks/plugins/uni_links/ios`) @@ -321,12 +327,12 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/background_fetch/ios" battery_info: :path: ".symlinks/plugins/battery_info/ios" + blurhash_ffi: + :path: ".symlinks/plugins/blurhash_ffi/ios" connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/darwin" dart_ui_isolate: :path: ".symlinks/plugins/dart_ui_isolate/ios" - dchs_motion_sensors: - :path: ".symlinks/plugins/dchs_motion_sensors/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" ffmpeg_kit_flutter_min: @@ -379,10 +385,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/media_kit_native_event_loop/ios" media_kit_video: :path: ".symlinks/plugins/media_kit_video/ios" + motion_sensors: + :path: ".symlinks/plugins/motion_sensors/ios" motionphoto: :path: ".symlinks/plugins/motionphoto/ios" move_to_background: :path: ".symlinks/plugins/move_to_background/ios" + native_video_player: + :path: ".symlinks/plugins/native_video_player/ios" onnxruntime: :path: ".symlinks/plugins/onnxruntime/ios" open_mail_app: @@ -395,6 +405,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" photo_manager: :path: ".symlinks/plugins/photo_manager/ios" + privacy_screen: + :path: ".symlinks/plugins/privacy_screen/ios" receive_sharing_intent: :path: ".symlinks/plugins/receive_sharing_intent/ios" screen_brightness_ios: @@ -405,8 +417,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - smart_auth: - :path: ".symlinks/plugins/smart_auth/ios" sqflite: :path: ".symlinks/plugins/sqflite/darwin" sqlite3_flutter_libs: @@ -427,9 +437,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: background_fetch: 2319bf7e18237b4b269430b7f14d177c0df09c5a battery_info: 09f5c9ee65394f2291c8c6227bedff345b8a730c + blurhash_ffi: 4831b96320d4273876c9a2fd3f7d50b8a3a53509 connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14 - dchs_motion_sensors: 9cef816635a39345cda9f0c4943e061f6429f453 device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 ffmpeg-kit-ios-min: 4e9a088f4ee9629435960b9d68e54848975f1931 ffmpeg_kit_flutter_min: 5eff47f4965bf9d1150e98961eb6129f5ae3f28c @@ -466,9 +476,11 @@ SPEC CHECKSUMS: media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1 media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e + motion_sensors: 03f55b7c637a7e365a0b5f9697a449f9059d5d91 motionphoto: d4a432b8c8f22fb3ad966258597c0103c9c5ff16 move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d nanopb: 438bc412db1928dac798aa6fd75726007be04262 + native_video_player: d12af78a1a4a8cf09775a5177d5b392def6fd23c onnxruntime: e7c2ae44385191eaad5ae64c935a72debaddc997 onnxruntime-c: a909204639a1f035f575127ac406f781ac797c9c onnxruntime-objc: b6fab0f1787aa6f7190c2013f03037df4718bd8b @@ -478,6 +490,7 @@ SPEC CHECKSUMS: path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a + privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437 screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 @@ -488,7 +501,6 @@ SPEC CHECKSUMS: SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 02d1f07eaaa01f80a1c16b4b31dfcbb3345ee01a sqlite3_flutter_libs: af0e8fe9bce48abddd1ffdbbf839db0302d72d80 diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index b9de856f3b..a035571541 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1304,18 +1304,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -1440,10 +1440,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" media_extension: dependency: "direct main" description: @@ -1528,10 +1528,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mgrs_dart: dependency: transitive description: @@ -1885,10 +1885,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: @@ -2394,26 +2394,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.0" timezone: dependency: transitive description: @@ -2692,10 +2692,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.1" volume_controller: dependency: transitive description: From 9c48cf4dc3e6593d0ad75e986964f65d40f13271 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 12 Aug 2024 13:09:37 +0530 Subject: [PATCH 0210/1179] [mob][photos] Fix minor UI issue --- mobile/lib/ui/viewer/file/video_widget_native.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 1cdc1dd674..1bdc845e56 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -231,7 +231,7 @@ class _VideoWidgetNativeState extends State left: 0, child: Padding( padding: EdgeInsets.only( - bottom: widget.isFromMemories ? 0 : 32, + bottom: widget.isFromMemories ? 32 : 0, ), child: ValueListenableBuilder( builder: (BuildContext context, bool value, _) { From fd0925f59e87386be14f90408bbffd3422f620c8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 12 Aug 2024 13:33:58 +0530 Subject: [PATCH 0211/1179] [mob][photos] Improve video loading UI --- mobile/lib/ui/common/loading_widget.dart | 1 + .../lib/ui/viewer/file/thumbnail_widget.dart | 4 ++- .../ui/viewer/file/video_widget_native.dart | 26 +++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/mobile/lib/ui/common/loading_widget.dart b/mobile/lib/ui/common/loading_widget.dart index 57401b6f4f..ad97a07caf 100644 --- a/mobile/lib/ui/common/loading_widget.dart +++ b/mobile/lib/ui/common/loading_widget.dart @@ -25,6 +25,7 @@ class EnteLoadingWidget extends StatelessWidget { child: CircularProgressIndicator( strokeWidth: 2, color: color ?? getEnteColorScheme(context).strokeBase, + strokeCap: StrokeCap.round, ), ), ), diff --git a/mobile/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/lib/ui/viewer/file/thumbnail_widget.dart index e380058304..86e6cd1c41 100644 --- a/mobile/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/lib/ui/viewer/file/thumbnail_widget.dart @@ -43,6 +43,7 @@ class ThumbnailWidget extends StatefulWidget { ///On video thumbnails, shows the video duration if true. If false, ///shows a centered play icon. final bool shouldShowVideoDuration; + final bool shouldShowVideoOverlayIcon; ThumbnailWidget( this.file, { @@ -60,6 +61,7 @@ class ThumbnailWidget extends StatefulWidget { this.thumbnailSize = thumbnailSmallSize, this.shouldShowFavoriteIcon = true, this.shouldShowVideoDuration = false, + this.shouldShowVideoOverlayIcon = true, }) : super(key: key ?? Key(file.tag)); @override @@ -157,7 +159,7 @@ class _ThumbnailWidgetState extends State { if (widget.shouldShowVideoDuration) { contentChildren .add(VideoOverlayDuration(duration: widget.file.duration!)); - } else { + } else if (widget.shouldShowVideoOverlayIcon) { contentChildren.add(const VideoOverlayIcon()); } } else if (widget.shouldShowLivePhotoOverlay && diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 1bdc845e56..8a6d024dac 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -17,6 +17,7 @@ import "package:photos/services/files_service.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/file/file_actions.dart"; +import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/play_pause_button.dart"; import "package:photos/ui/viewer/file/native_video_player_controls/seek_bar.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; @@ -512,21 +513,35 @@ class _VideoWidgetNativeState extends State constraints: const BoxConstraints.expand(), ), Center( - child: SizedBox.fromSize( - size: const Size.square(20), + child: Container( + width: 48, + height: 48, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + color: Colors.black.withOpacity(0.3), + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), child: ValueListenableBuilder( valueListenable: _progressNotifier, builder: (BuildContext context, double? progress, _) { return progress == null || progress == 1 - ? const CupertinoActivityIndicator( - color: Colors.white, + ? const EnteLoadingWidget( + size: 32, + color: fillBaseDark, + padding: 0, ) : CircularProgressIndicator( - backgroundColor: Colors.black, + backgroundColor: Colors.transparent, value: progress, valueColor: const AlwaysStoppedAnimation( Color.fromRGBO(45, 194, 98, 1.0), ), + strokeWidth: 2, + strokeCap: StrokeCap.round, ); }, ), @@ -543,6 +558,7 @@ class _VideoWidgetNativeState extends State child: ThumbnailWidget( widget.file, fit: BoxFit.contain, + shouldShowVideoOverlayIcon: false, ), ); } From a61d62d86247836a75267457e9af44128c3596fa Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Mon, 12 Aug 2024 18:01:32 +0530 Subject: [PATCH 0212/1179] Minor update --- docs/docs/photos/migration/from-google-photos/index.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/docs/photos/migration/from-google-photos/index.md b/docs/docs/photos/migration/from-google-photos/index.md index 861b589b52..80973e9268 100644 --- a/docs/docs/photos/migration/from-google-photos/index.md +++ b/docs/docs/photos/migration/from-google-photos/index.md @@ -39,9 +39,12 @@ it with Ente. 8. Wait for Google to send you your data. 9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload", - select "Google takeout" and pick the ZIP file you just downloaded. If you were provided with multiple ZIP files, you must extract **all** of the files, *including the JSON files*, into one folder and select "Folder" instead. + select "Google takeout" and pick the ZIP file you just downloaded. + +> If you were provided with multiple ZIP files, please extract **all** the +> files into one folder and select that folder instead. - ![Importing Google Takeout into Ente](google-takeout.png){width=400px} +![Importing Google Takeout into Ente](google-takeout.png){width=400px} 10. Wait for the uploads to complete as Ente parses the metadata generated by Google, and preserves them along with the corresponding files, end-to-end From 0d82f6ec65b16d5d267eeeec6ecd3575df00a57e Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 12 Aug 2024 19:58:39 +0530 Subject: [PATCH 0213/1179] [mob][photos] Update android target SDK --- mobile/android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index b5225db8ef..671dbe5c4a 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { applicationId "io.ente.photos" minSdkVersion 26 - targetSdkVersion 33 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From d3e73035d118155027273a4c61e34e9d86852084 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:37:44 +0530 Subject: [PATCH 0214/1179] [mob] Update as per new API spec --- mobile/lib/services/filedata/filedata_service.dart | 4 ++-- mobile/lib/services/filedata/model/file_data.dart | 8 ++++---- mobile/lib/services/machine_learning/ml_service.dart | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/filedata/filedata_service.dart b/mobile/lib/services/filedata/filedata_service.dart index ec4c27fb17..1d7d184050 100644 --- a/mobile/lib/services/filedata/filedata_service.dart +++ b/mobile/lib/services/filedata/filedata_service.dart @@ -48,11 +48,11 @@ class FileDataService { Future getFilesData( Set fileIds, { - DataType type = DataType.derivedMeta, + DataType type = DataType.mlData, }) async { try { final res = await _dio.post( - "/files/fetch-data/", + "/files/data/fetch", data: { "fileIDs": fileIds.toList(), "type": type.toJson(), diff --git a/mobile/lib/services/filedata/model/file_data.dart b/mobile/lib/services/filedata/model/file_data.dart index f6f501e47b..2c06cf601c 100644 --- a/mobile/lib/services/filedata/model/file_data.dart +++ b/mobile/lib/services/filedata/model/file_data.dart @@ -4,7 +4,7 @@ const _faceKey = 'face'; const _clipKey = 'clip'; enum DataType { - derivedMeta('derivedMeta'); + mlData('mldata'); final String value; const DataType(this.value); @@ -34,7 +34,7 @@ class FileDataEntity { ); void validate() { - if (type == DataType.derivedMeta) { + if (type == DataType.mlData) { if (remoteRawData[_faceKey] == null) { throw Exception('Face embedding is null'); } @@ -64,12 +64,12 @@ class FileDataEntity { } void putFace(RemoteFaceEmbedding faceEmbedding) { - assert(type == DataType.derivedMeta, 'Invalid type ${type.value}'); + assert(type == DataType.mlData, 'Invalid type ${type.value}'); remoteRawData[_faceKey] = faceEmbedding.toJson(); } void putClip(RemoteClipEmbedding clipEmbedding) { - assert(type == DataType.derivedMeta, 'Invalid type ${type.value}'); + assert(type == DataType.mlData, 'Invalid type ${type.value}'); remoteRawData[_clipKey] = clipEmbedding.toJson(); } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 7db1ea13a4..7bf0e2dfd5 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -453,7 +453,7 @@ class MLService { final FileDataEntity dataEntity = instruction.existingRemoteFileML ?? FileDataEntity.empty( instruction.file.uploadedFileID!, - DataType.derivedMeta, + DataType.mlData, ); if (result.facesRan) { dataEntity.putFace( From bd53c4a2f34cf7720270133f84e5528be3d8b1e0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:43:16 +0530 Subject: [PATCH 0215/1179] Switch to mobileclip --- .../semantic_search/clip/clip_image_encoder.dart | 4 ++-- .../semantic_search/clip/clip_text_encoder.dart | 2 +- mobile/lib/utils/image_ml_util.dart | 13 +++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index ae00eea239..adce139ef5 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -10,7 +10,7 @@ import "package:photos/utils/image_ml_util.dart"; import "package:photos/utils/ml_util.dart"; class ClipImageEncoder extends MlModel { - static const kRemoteBucketModelPath = "clip-image-vit-32-float32.onnx"; + static const kRemoteBucketModelPath = "mobileclip_s2_image.onnx"; static const _modelName = "ClipImageEncoder"; @override @@ -47,7 +47,7 @@ class ClipImageEncoder extends MlModel { ) { final w = EnteWatch("ClipImageEncoder._runFFIBasedPredict")..start(); final inputOrt = - OrtValueTensor.createTensorWithDataList(inputList, [1, 3, 224, 224]); + OrtValueTensor.createTensorWithDataList(inputList, [1, 3, 256, 256]); final inputs = {'input': inputOrt}; final session = OrtSession.fromAddress(sessionAddress); final runOptions = OrtRunOptions(); diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index c033f6caf5..35bff3d1cf 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -9,7 +9,7 @@ import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { // static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; // Unquantized model static const _kRemoteBucketModelPath = - "clip-text-vit-32-uint8.onnx"; // Quantized model + "mobileclip_s2_text_int32.onnx"; // Quantized model static const _kVocabRemotePath = "bpe_simple_vocab_16e6.txt"; // static const kRemoteBucketModelPath = "clip-text-vit-32-uint8.onnx"; diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index bb41645cef..e566a9d536 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -179,12 +179,9 @@ Future preprocessImageClip( Image image, ByteData imgByteData, ) async { - const int requiredWidth = 224; - const int requiredHeight = 224; + const int requiredWidth = 256; + const int requiredHeight = 256; const int requiredSize = 3 * requiredWidth * requiredHeight; - const mean = [0.48145466, 0.4578275, 0.40821073]; - const std = [0.26862954, 0.26130258, 0.27577711]; - final scale = max(requiredWidth / image.width, requiredHeight / image.height); final scaledWidth = (image.width * scale).round(); final scaledHeight = (image.height * scale).round(); @@ -204,9 +201,9 @@ Future preprocessImageClip( image, imgByteData, ); - buffer[pixelIndex] = ((pixel.red / 255) - mean[0]) / std[0]; - buffer[pixelIndex + greenOff] = ((pixel.green / 255) - mean[1]) / std[1]; - buffer[pixelIndex + blueOff] = ((pixel.blue / 255) - mean[2]) / std[2]; + buffer[pixelIndex] = pixel.red / 255; + buffer[pixelIndex + greenOff] = pixel.green / 255; + buffer[pixelIndex + blueOff] = pixel.blue / 255; pixelIndex++; } } From 1b314687a9b51abe24d5211466820a6632c3da01 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 13 Aug 2024 16:50:01 +0530 Subject: [PATCH 0216/1179] Add dependency on nano_id pkg --- mobile/pubspec.lock | 8 ++++++++ mobile/pubspec.yaml | 1 + 2 files changed, 9 insertions(+) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 8372373efb..aa1f0fb41f 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1608,6 +1608,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.2+6" + nanoid: + dependency: "direct main" + description: + name: nanoid + sha256: be3f8752d9046c825df2f3914195151eb876f3ad64b9d833dd0b799b77b8759e + url: "https://pub.dev" + source: hosted + version: "1.0.0" nested: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index ad2dfc6912..af24aea503 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -123,6 +123,7 @@ dependencies: motionphoto: git: "https://github.com/ente-io/motionphoto.git" move_to_background: ^1.0.2 + nanoid: ^1.0.0 onnx_dart: path: plugins/onnx_dart onnxruntime: From f1d6382b399c6d0aa9fa2086f554cb6678a4437d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 13 Aug 2024 16:57:18 +0530 Subject: [PATCH 0217/1179] Add cluster nanoID --- mobile/lib/models/nanoids/cluster_id.dart | 59 +++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 mobile/lib/models/nanoids/cluster_id.dart diff --git a/mobile/lib/models/nanoids/cluster_id.dart b/mobile/lib/models/nanoids/cluster_id.dart new file mode 100644 index 0000000000..2376c7a014 --- /dev/null +++ b/mobile/lib/models/nanoids/cluster_id.dart @@ -0,0 +1,59 @@ +import "package:flutter/foundation.dart"; +import 'package:nanoid/nanoid.dart'; + +const alphaphet = + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; +const clusterIDLength = 22; + +class ClusterID { + final String value; + + // Private constructor + ClusterID._internal(this.value); + + // Factory constructor with validation + factory ClusterID(String value) { + if (!_isValidClusterID(value)) { + throw const FormatException('Invalid NanoID format'); + } + return ClusterID._internal(value); + } + + // Static method to generate a new NanoID + static ClusterID generate() { + return ClusterID("cluster_${customAlphabet(urlAlphabet, clusterIDLength)}"); + } + + // Validation method + static bool _isValidClusterID(String value) { + if (value.length != (clusterIDLength + 8)) { + debugPrint("ClusterID length is not ${clusterIDLength + 8}: $value"); + return false; + } + if (value.startsWith("cluster_")) { + debugPrint("ClusterID doesn't start with _cluster: $value"); + return false; + } + return true; + } + + // Override == operator + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + return other is ClusterID && other.value == value; + } + + // Override hashCode + @override + int get hashCode => value.hashCode; + + @override + String toString() => value; + + String toJson() => value; + + static ClusterID fromJson(String value) { + return ClusterID(value); + } +} From c10eb9751144e33c01a1d4fe2127b6031cd4c023 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 13 Aug 2024 17:48:36 +0530 Subject: [PATCH 0218/1179] [mob][photos] Fix screen snapping when toggling to full screen when viewing items + imporve full screen UX on the new native video player --- mobile/lib/ui/viewer/file/detail_page.dart | 34 ++- .../lib/ui/viewer/file/file_bottom_bar.dart | 88 ++++---- .../ui/viewer/file/video_widget_native.dart | 209 +++++++++--------- 3 files changed, 171 insertions(+), 160 deletions(-) diff --git a/mobile/lib/ui/viewer/file/detail_page.dart b/mobile/lib/ui/viewer/file/detail_page.dart index 387ccd7de3..96d56f3a58 100644 --- a/mobile/lib/ui/viewer/file/detail_page.dart +++ b/mobile/lib/ui/viewer/file/detail_page.dart @@ -117,11 +117,19 @@ class _DetailPageState extends State { _pageController.dispose(); _enableFullScreenNotifier.dispose(); _selectedIndexNotifier.dispose(); - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.manual, - overlays: SystemUiOverlay.values, - ); super.dispose(); + + SystemChrome.setSystemUIOverlayStyle( + const SystemUiOverlayStyle( + systemNavigationBarColor: Color(0x00010000), + ), + ); + + unawaited( + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.edgeToEdge, + ), + ); } @override @@ -324,14 +332,20 @@ class _DetailPageState extends State { if (_enableFullScreenNotifier.value == shouldEnable) return; } _enableFullScreenNotifier.value = !_enableFullScreenNotifier.value; - - Future.delayed(const Duration(milliseconds: 125), () { + if (_enableFullScreenNotifier.value) { + Future.delayed(const Duration(milliseconds: 200), () { + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, + overlays: [], + ); + }); + } else { SystemChrome.setEnabledSystemUIMode( - //to hide status bar? - SystemUiMode.manual, - overlays: _enableFullScreenNotifier.value ? [] : SystemUiOverlay.values, + SystemUiMode.edgeToEdge, + overlays: SystemUiOverlay.values, ); - }); + } + // }); } Future _preloadEntries() async { diff --git a/mobile/lib/ui/viewer/file/file_bottom_bar.dart b/mobile/lib/ui/viewer/file/file_bottom_bar.dart index 3d04fee809..e7b6d0654b 100644 --- a/mobile/lib/ui/viewer/file/file_bottom_bar.dart +++ b/mobile/lib/ui/viewer/file/file_bottom_bar.dart @@ -76,7 +76,7 @@ class FileBottomBarState extends State { } } } - return _getBottomBar(); + return SafeArea(child: _getBottomBar()); } void safeRefresh() { @@ -95,7 +95,7 @@ class FileBottomBarState extends State { Tooltip( message: "Info", child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( icon: Icon( Platform.isAndroid ? Icons.info_outline : CupertinoIcons.info, @@ -125,7 +125,7 @@ class FileBottomBarState extends State { Tooltip( message: "Edit", child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( icon: const Icon( Icons.tune_outlined, @@ -144,7 +144,7 @@ class FileBottomBarState extends State { Tooltip( message: S.of(context).delete, child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( icon: Icon( Platform.isAndroid @@ -165,7 +165,7 @@ class FileBottomBarState extends State { Tooltip( message: S.of(context).share, child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( key: shareButtonKey, icon: Icon( @@ -182,7 +182,6 @@ class FileBottomBarState extends State { ), ); } - final safeAreaBottomPadding = MediaQuery.of(context).padding.bottom * .5; return ValueListenableBuilder( valueListenable: widget.enableFullScreenNotifier, builder: (BuildContext context, bool isFullScreen, _) { @@ -207,45 +206,42 @@ class FileBottomBarState extends State { stops: const [0, 0.8, 1], ), ), - child: Padding( - padding: EdgeInsets.only(bottom: safeAreaBottomPadding), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - widget.file.caption?.isNotEmpty ?? false - ? Padding( - padding: const EdgeInsets.fromLTRB( - 16, - 12, - 16, - 0, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + widget.file.caption?.isNotEmpty ?? false + ? Padding( + padding: const EdgeInsets.fromLTRB( + 16, + 12, + 16, + 0, + ), + child: GestureDetector( + onTap: () async { + await _displayDetails(widget.file); + await Future.delayed( + const Duration(milliseconds: 500), + ); //Waiting for some time till the caption gets updated in db if the user closes the bottom sheet without pressing 'done' + safeRefresh(); + }, + child: Text( + widget.file.caption!, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: getEnteTextTheme(context) + .mini + .copyWith(color: textBaseDark), + textAlign: TextAlign.center, ), - child: GestureDetector( - onTap: () async { - await _displayDetails(widget.file); - await Future.delayed( - const Duration(milliseconds: 500), - ); //Waiting for some time till the caption gets updated in db if the user closes the bottom sheet without pressing 'done' - safeRefresh(); - }, - child: Text( - widget.file.caption!, - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: getEnteTextTheme(context) - .mini - .copyWith(color: textBaseDark), - textAlign: TextAlign.center, - ), - ), - ) - : const SizedBox.shrink(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: children, - ), - ], - ), + ), + ) + : const SizedBox.shrink(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: children, + ), + ], ), ), ), @@ -268,7 +264,7 @@ class FileBottomBarState extends State { Tooltip( message: S.of(context).restore, child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( icon: const Icon( Icons.restore_outlined, @@ -292,7 +288,7 @@ class FileBottomBarState extends State { Tooltip( message: S.of(context).delete, child: Padding( - padding: const EdgeInsets.only(top: 12, bottom: 12), + padding: const EdgeInsets.only(top: 12), child: IconButton( icon: const Icon( Icons.delete_forever_outlined, diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 8a6d024dac..4a95465bc9 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -48,7 +48,7 @@ class VideoWidgetNative extends StatefulWidget { class _VideoWidgetNativeState extends State with WidgetsBindingObserver { final Logger _logger = Logger("VideoWidgetNative"); - static const verticalMargin = 72.0; + static const verticalMargin = 64.0; final _progressNotifier = ValueNotifier(null); late StreamSubscription pauseVideoSubscription; bool _isGuestView = false; @@ -192,9 +192,7 @@ class _VideoWidgetNativeState extends State behavior: HitTestBehavior.opaque, onTap: () { _showControls.value = !_showControls.value; - if (Platform.isIOS) { - widget.playbackCallback!(!_showControls.value); - } + widget.playbackCallback!(!_showControls.value); }, child: Container( constraints: const BoxConstraints.expand(), @@ -230,113 +228,118 @@ class _VideoWidgetNativeState extends State bottom: verticalMargin, right: 0, left: 0, - child: Padding( - padding: EdgeInsets.only( - bottom: widget.isFromMemories ? 32 : 0, - ), - child: ValueListenableBuilder( - builder: (BuildContext context, bool value, _) { - return value - ? ValueListenableBuilder( - valueListenable: _showControls, - builder: ( - BuildContext context, - bool value, - _, - ) { - return AnimatedOpacity( - duration: const Duration( - milliseconds: 200, - ), - curve: Curves.easeInQuad, - opacity: value ? 1 : 0, - child: IgnorePointer( - ignoring: !value, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 8, - ), - child: Container( + child: SafeArea( + child: Padding( + padding: EdgeInsets.only( + bottom: widget.isFromMemories ? 32 : 0, + ), + child: ValueListenableBuilder( + builder: (BuildContext context, bool value, _) { + return value + ? ValueListenableBuilder( + valueListenable: _showControls, + builder: ( + BuildContext context, + bool value, + _, + ) { + return AnimatedOpacity( + duration: const Duration( + milliseconds: 200, + ), + curve: Curves.easeInQuad, + opacity: value ? 1 : 0, + child: IgnorePointer( + ignoring: !value, + child: Padding( padding: - const EdgeInsets.fromLTRB( - 16, - 4, - 16, - 4, + const EdgeInsets.symmetric( + horizontal: 8, ), - decoration: BoxDecoration( - color: Colors.black - .withOpacity(0.3), - borderRadius: - const BorderRadius.all( - Radius.circular(8), + child: Container( + padding: + const EdgeInsets.fromLTRB( + 16, + 4, + 16, + 4, ), - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - ), - child: Row( - children: [ - AnimatedSize( - duration: const Duration( - seconds: 5, - ), - curve: Curves.easeInOut, - child: - ValueListenableBuilder( - valueListenable: - _controller! - .onPlaybackPositionChanged, - builder: ( - BuildContext context, - int value, - _, - ) { - return Text( - secondsToDuration( - value, - ), - style: - getEnteTextTheme( - context, - ).mini.copyWith( - color: - textBaseDark, - ), - ); - }, - ), + decoration: BoxDecoration( + color: Colors.black + .withOpacity(0.3), + borderRadius: + const BorderRadius.all( + Radius.circular(8), ), - Expanded( - child: SeekBar( - _controller!, - _durationToSeconds( - duration, + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: + const Duration( + seconds: 5, + ), + curve: Curves.easeInOut, + child: + ValueListenableBuilder( + valueListenable: + _controller! + .onPlaybackPositionChanged, + builder: ( + BuildContext + context, + int value, + _, + ) { + return Text( + secondsToDuration( + value, + ), + style: + getEnteTextTheme( + context, + ).mini.copyWith( + color: + textBaseDark, + ), + ); + }, ), - _isSeeking, ), - ), - Text( - duration ?? "0:00", - style: getEnteTextTheme( - context, - ).mini.copyWith( - color: textBaseDark, + Expanded( + child: SeekBar( + _controller!, + _durationToSeconds( + duration, ), - ), - ], + _isSeeking, + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme( + context, + ).mini.copyWith( + color: + textBaseDark, + ), + ), + ], + ), ), ), ), - ), - ); - }, - ) - : const SizedBox(); - }, - valueListenable: _isPlaybackReady, + ); + }, + ) + : const SizedBox(); + }, + valueListenable: _isPlaybackReady, + ), ), ), ), @@ -417,9 +420,7 @@ class _VideoWidgetNativeState extends State return; } _showControls.value = false; - if (Platform.isIOS) { - widget.playbackCallback!(true); - } + widget.playbackCallback!(true); } }); } From ffd9e2e06cd8399615a94d5b20b20d52c735d06f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:25:13 +0530 Subject: [PATCH 0219/1179] Switch to nano_id for clusterIDs --- mobile/lib/face/db.dart | 134 ++++++++--------- mobile/lib/face/db_fields.dart | 8 +- mobile/lib/face/model/person.dart | 4 +- mobile/lib/models/nanoids/cluster_id.dart | 40 +---- .../face_clustering_service.dart | 64 ++++---- .../face_db_info_for_clustering.dart | 2 +- .../face_ml/feedback/cluster_feedback.dart | 138 +++++++++--------- .../face_ml/person/person_service.dart | 15 +- .../services/machine_learning/ml_service.dart | 2 +- mobile/lib/services/search_service.dart | 10 +- .../bottom_action_bar_widget.dart | 2 +- .../file_selection_actions_widget.dart | 2 +- .../actions/file_selection_overlay_bar.dart | 2 +- .../ui/viewer/file_details/face_widget.dart | 5 +- .../file_details/faces_item_widget.dart | 7 +- .../people/add_person_action_sheet.dart | 6 +- .../lib/ui/viewer/people/cluster_app_bar.dart | 14 +- .../viewer/people/cluster_breakup_page.dart | 6 +- mobile/lib/ui/viewer/people/cluster_page.dart | 2 +- .../people/person_cluster_suggestion.dart | 14 +- .../viewer/people/person_clusters_page.dart | 20 ++- .../search/result/person_face_widget.dart | 2 +- .../ui/viewer/search_tab/people_section.dart | 2 +- 23 files changed, 239 insertions(+), 262 deletions(-) diff --git a/mobile/lib/face/db.dart b/mobile/lib/face/db.dart index 81c896e164..cdc014f86e 100644 --- a/mobile/lib/face/db.dart +++ b/mobile/lib/face/db.dart @@ -28,7 +28,7 @@ import 'package:sqlite_async/sqlite_async.dart'; class FaceMLDataDB { static final Logger _logger = Logger("FaceMLDataDB"); - static const _databaseName = "ente.face_ml_db.db"; + static const _databaseName = "ente.face_ml_db_v2.db"; // static const _databaseVersion = 1; FaceMLDataDB._privateConstructor(); @@ -136,7 +136,7 @@ class FaceMLDataDB { } Future updateFaceIdToClusterId( - Map faceIDToClusterID, + Map faceIDToClusterID, ) async { final db = await instance.asyncDB; const batchSize = 500; @@ -185,43 +185,43 @@ class FaceMLDataDB { return maps.first['count'] as int; } - Future> clusterIdToFaceCount() async { + Future> clusterIdToFaceCount() async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $fcClusterID, COUNT(*) as count FROM $faceClustersTable where $fcClusterID IS NOT NULL GROUP BY $fcClusterID ', ); - final Map result = {}; + final Map result = {}; for (final map in maps) { - result[map[fcClusterID] as int] = map['count'] as int; + result[map[fcClusterID] as String] = map['count'] as int; } return result; } - Future> getPersonIgnoredClusters(String personID) async { + Future> getPersonIgnoredClusters(String personID) async { final db = await instance.asyncDB; // find out clusterIds that are assigned to other persons using the clusters table final List> otherPersonMaps = await db.getAll( 'SELECT $clusterIDColumn FROM $clusterPersonTable WHERE $personIdColumn != ? AND $personIdColumn IS NOT NULL', [personID], ); - final Set ignoredClusterIDs = - otherPersonMaps.map((e) => e[clusterIDColumn] as int).toSet(); + final Set ignoredClusterIDs = + otherPersonMaps.map((e) => e[clusterIDColumn] as String).toSet(); final List> rejectMaps = await db.getAll( 'SELECT $clusterIDColumn FROM $notPersonFeedback WHERE $personIdColumn = ?', [personID], ); - final Set rejectClusterIDs = - rejectMaps.map((e) => e[clusterIDColumn] as int).toSet(); + final Set rejectClusterIDs = + rejectMaps.map((e) => e[clusterIDColumn] as String).toSet(); return ignoredClusterIDs.union(rejectClusterIDs); } - Future> getPersonClusterIDs(String personID) async { + Future> getPersonClusterIDs(String personID) async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $clusterIDColumn FROM $clusterPersonTable WHERE $personIdColumn = ?', [personID], ); - return maps.map((e) => e[clusterIDColumn] as int).toSet(); + return maps.map((e) => e[clusterIDColumn] as String).toSet(); } Future clearTable() async { @@ -235,7 +235,7 @@ class FaceMLDataDB { } Future> getFaceEmbeddingsForCluster( - int clusterID, { + String clusterID, { int? limit, }) async { final db = await instance.asyncDB; @@ -246,12 +246,12 @@ class FaceMLDataDB { return maps.map((e) => e[faceEmbeddingBlob] as Uint8List); } - Future>> getFaceEmbeddingsForClusters( - Iterable clusterIDs, { + Future>> getFaceEmbeddingsForClusters( + Iterable clusterIDs, { int? limit, }) async { final db = await instance.asyncDB; - final Map> result = {}; + final Map> result = {}; final selectQuery = ''' SELECT fc.$fcClusterID, fe.$faceEmbeddingBlob @@ -264,7 +264,7 @@ class FaceMLDataDB { final List> maps = await db.getAll(selectQuery); for (final map in maps) { - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceEmbedding = map[faceEmbeddingBlob] as Uint8List; result.putIfAbsent(clusterID, () => []).add(faceEmbedding); } @@ -276,7 +276,7 @@ class FaceMLDataDB { required int recentFileID, String? personID, String? avatarFaceId, - int? clusterID, + String? clusterID, }) async { // read person from db final db = await instance.asyncDB; @@ -299,7 +299,7 @@ class FaceMLDataDB { [personID], ); final clusterIDs = - clusterRows.map((e) => e[clusterIDColumn] as int).toList(); + clusterRows.map((e) => e[clusterIDColumn] as String).toList(); final List> faceMaps = await db.getAll( 'SELECT * FROM $facesTable where ' '$faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID IN (${clusterIDs.join(",")}))' @@ -359,23 +359,23 @@ class FaceMLDataDB { return maps.map((e) => mapRowToFace(e)).toList(); } - Future>> getClusterToFaceIDs( - Set clusterIDs, + Future>> getClusterToFaceIDs( + Set clusterIDs, ) async { final db = await instance.asyncDB; - final Map> result = {}; + final Map> result = {}; final List> maps = await db.getAll( 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable WHERE $fcClusterID IN (${clusterIDs.join(",")})', ); for (final map in maps) { - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; result.putIfAbsent(clusterID, () => []).add(faceID); } return result; } - Future getClusterIDForFaceID(String faceID) async { + Future getClusterIDForFaceID(String faceID) async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $fcClusterID FROM $faceClustersTable WHERE $fcFaceId = ?', @@ -384,24 +384,24 @@ class FaceMLDataDB { if (maps.isEmpty) { return null; } - return maps.first[fcClusterID] as int; + return maps.first[fcClusterID] as String; } - Future>> getAllClusterIdToFaceIDs() async { + Future>> getAllClusterIdToFaceIDs() async { final db = await instance.asyncDB; - final Map> result = {}; + final Map> result = {}; final List> maps = await db.getAll( 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable', ); for (final map in maps) { - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; result.putIfAbsent(clusterID, () => []).add(faceID); } return result; } - Future> getFaceIDsForCluster(int clusterID) async { + Future> getFaceIDsForCluster(String clusterID) async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $fcFaceId FROM $faceClustersTable ' @@ -412,17 +412,17 @@ class FaceMLDataDB { } // Get Map of personID to Map of clusterID to faceIDs - Future>>> + Future>>> getPersonToClusterIdToFaceIds() async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $personIdColumn, $faceClustersTable.$fcClusterID, $fcFaceId FROM $clusterPersonTable ' 'LEFT JOIN $faceClustersTable ON $clusterPersonTable.$clusterIDColumn = $faceClustersTable.$fcClusterID', ); - final Map>> result = {}; + final Map>> result = {}; for (final map in maps) { final personID = map[personIdColumn] as String; - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; result .putIfAbsent(personID, () => {}) @@ -443,7 +443,7 @@ class FaceMLDataDB { return faceIdsResult.map((e) => e[fcFaceId] as String).toSet(); } - Future> getBlurValuesForCluster(int clusterID) async { + Future> getBlurValuesForCluster(String clusterID) async { final db = await instance.asyncDB; const String query = ''' SELECT $facesTable.$faceBlur @@ -463,29 +463,29 @@ class FaceMLDataDB { return maps.map((e) => e[faceBlur] as double).toSet(); } - Future> getFaceIdsToClusterIds( + Future> getFaceIdsToClusterIds( Iterable faceIds, ) async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $fcFaceId, $fcClusterID FROM $faceClustersTable where $fcFaceId IN (${faceIds.map((id) => "'$id'").join(",")})', ); - final Map result = {}; + final Map result = {}; for (final map in maps) { - result[map[fcFaceId] as String] = map[fcClusterID] as int?; + result[map[fcFaceId] as String] = map[fcClusterID] as String?; } return result; } - Future>> getFileIdToClusterIds() async { - final Map> result = {}; + Future>> getFileIdToClusterIds() async { + final Map> result = {}; final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable', ); for (final map in maps) { - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); @@ -494,7 +494,7 @@ class FaceMLDataDB { } Future forceUpdateClusterIds( - Map faceIDToClusterID, + Map faceIDToClusterID, ) async { final db = await instance.asyncDB; @@ -681,7 +681,7 @@ class FaceMLDataDB { Future assignClusterToPerson({ required String personID, - required int clusterID, + required String clusterID, }) async { final db = await instance.asyncDB; @@ -692,7 +692,7 @@ class FaceMLDataDB { } Future bulkAssignClusterToPersonID( - Map clusterToPersonID, + Map clusterToPersonID, ) async { final db = await instance.asyncDB; @@ -706,7 +706,7 @@ class FaceMLDataDB { Future captureNotPersonFeedback({ required String personID, - required int clusterID, + required String clusterID, }) async { final db = await instance.asyncDB; @@ -717,7 +717,7 @@ class FaceMLDataDB { } Future bulkCaptureNotPersonFeedback( - Map clusterToPersonID, + Map clusterToPersonID, ) async { final db = await instance.asyncDB; @@ -732,7 +732,7 @@ class FaceMLDataDB { Future removeNotPersonFeedback({ required String personID, - required int clusterID, + required String clusterID, }) async { final db = await instance.asyncDB; @@ -744,7 +744,7 @@ class FaceMLDataDB { Future removeClusterToPerson({ required String personID, - required int clusterID, + required String clusterID, }) async { final db = await instance.asyncDB; @@ -755,7 +755,7 @@ class FaceMLDataDB { } // for a given personID, return a map of clusterID to fileIDs using join query - Future>> getFileIdToClusterIDSet(String personID) { + Future>> getFileIdToClusterIDSet(String personID) { final db = instance.asyncDB; return db.then((db) async { final List> maps = await db.getAll( @@ -765,9 +765,9 @@ class FaceMLDataDB { 'WHERE $clusterPersonTable.$personIdColumn = ?', [personID], ); - final Map> result = {}; + final Map> result = {}; for (final map in maps) { - final clusterID = map[clusterIDColumn] as int; + final clusterID = map[clusterIDColumn] as String; final String faceID = map[fcFaceId] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); @@ -776,8 +776,8 @@ class FaceMLDataDB { }); } - Future>> getFileIdToClusterIDSetForCluster( - Set clusterIDs, + Future>> getFileIdToClusterIDSetForCluster( + Set clusterIDs, ) { final db = instance.asyncDB; return db.then((db) async { @@ -785,9 +785,9 @@ class FaceMLDataDB { 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable ' 'WHERE $fcClusterID IN (${clusterIDs.join(",")})', ); - final Map> result = {}; + final Map> result = {}; for (final map in maps) { - final clusterID = map[fcClusterID] as int; + final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); @@ -796,7 +796,9 @@ class FaceMLDataDB { }); } - Future clusterSummaryUpdate(Map summary) async { + Future clusterSummaryUpdate( + Map summary, + ) async { final db = await instance.asyncDB; const String sql = ''' @@ -810,7 +812,7 @@ class FaceMLDataDB { batchCounter = 0; parameterSets.clear(); } - final int clusterID = entry.key; + final String clusterID = entry.key; final int count = entry.value.$2; final Uint8List avg = entry.value.$1; parameterSets.add([clusterID, avg, count]); @@ -819,7 +821,7 @@ class FaceMLDataDB { await db.executeBatch(sql, parameterSets); } - Future deleteClusterSummary(int clusterID) async { + Future deleteClusterSummary(String clusterID) async { final db = await instance.asyncDB; const String sqlDelete = 'DELETE FROM $clusterSummaryTable WHERE $clusterIDColumn = ?'; @@ -827,16 +829,16 @@ class FaceMLDataDB { } /// Returns a map of clusterID to (avg embedding, count) - Future> getAllClusterSummary([ + Future> getAllClusterSummary([ int? minClusterSize, ]) async { final db = await instance.asyncDB; - final Map result = {}; + final Map result = {}; final rows = await db.getAll( 'SELECT * FROM $clusterSummaryTable${minClusterSize != null ? ' WHERE $countColumn >= $minClusterSize' : ''}', ); for (final r in rows) { - final id = r[clusterIDColumn] as int; + final id = r[clusterIDColumn] as String; final avg = r[avgColumn] as Uint8List; final count = r[countColumn] as int; result[id] = (avg, count); @@ -844,16 +846,16 @@ class FaceMLDataDB { return result; } - Future> getClusterToClusterSummary( - Iterable clusterIDs, + Future> getClusterToClusterSummary( + Iterable clusterIDs, ) async { final db = await instance.asyncDB; - final Map result = {}; + final Map result = {}; final rows = await db.getAll( 'SELECT * FROM $clusterSummaryTable WHERE $clusterIDColumn IN (${clusterIDs.join(",")})', ); for (final r in rows) { - final id = r[clusterIDColumn] as int; + final id = r[clusterIDColumn] as String; final avg = r[avgColumn] as Uint8List; final count = r[countColumn] as int; result[id] = (avg, count); @@ -861,14 +863,14 @@ class FaceMLDataDB { return result; } - Future> getClusterIDToPersonID() async { + Future> getClusterIDToPersonID() async { final db = await instance.asyncDB; final List> maps = await db.getAll( 'SELECT $personIdColumn, $clusterIDColumn FROM $clusterPersonTable', ); - final Map result = {}; + final Map result = {}; for (final map in maps) { - result[map[clusterIDColumn] as int] = map[personIdColumn] as String; + result[map[clusterIDColumn] as String] = map[personIdColumn] as String; } return result; } diff --git a/mobile/lib/face/db_fields.dart b/mobile/lib/face/db_fields.dart index 8ad14ae282..c1de4780bc 100644 --- a/mobile/lib/face/db_fields.dart +++ b/mobile/lib/face/db_fields.dart @@ -41,7 +41,7 @@ const fcFaceId = 'face_id'; const createFaceClustersTable = ''' CREATE TABLE IF NOT EXISTS $faceClustersTable ( $fcFaceId TEXT NOT NULL, - $fcClusterID INTEGER NOT NULL, + $fcClusterID TEXT NOT NULL, PRIMARY KEY($fcFaceId) ); '''; @@ -59,7 +59,7 @@ const clusterIDColumn = 'cluster_id'; const createClusterPersonTable = ''' CREATE TABLE IF NOT EXISTS $clusterPersonTable ( $personIdColumn TEXT NOT NULL, - $clusterIDColumn INTEGER NOT NULL, + $clusterIDColumn TEXT NOT NULL, PRIMARY KEY($personIdColumn, $clusterIDColumn) ); '''; @@ -72,7 +72,7 @@ const avgColumn = 'avg'; const countColumn = 'count'; const createClusterSummaryTable = ''' CREATE TABLE IF NOT EXISTS $clusterSummaryTable ( - $clusterIDColumn INTEGER NOT NULL, + $clusterIDColumn TEXT NOT NULL, $avgColumn BLOB NOT NULL, $countColumn INTEGER NOT NULL, PRIMARY KEY($clusterIDColumn) @@ -89,7 +89,7 @@ const notPersonFeedback = 'not_person_feedback'; const createNotPersonFeedbackTable = ''' CREATE TABLE IF NOT EXISTS $notPersonFeedback ( $personIdColumn TEXT NOT NULL, - $clusterIDColumn INTEGER NOT NULL, + $clusterIDColumn TEXT NOT NULL, PRIMARY KEY($personIdColumn, $clusterIDColumn) ); '''; diff --git a/mobile/lib/face/model/person.dart b/mobile/lib/face/model/person.dart index cedec7a0dc..7536d3b0a6 100644 --- a/mobile/lib/face/model/person.dart +++ b/mobile/lib/face/model/person.dart @@ -24,7 +24,7 @@ class PersonEntity { } class ClusterInfo { - final int id; + final String id; final Set faces; ClusterInfo({ required this.id, @@ -40,7 +40,7 @@ class ClusterInfo { // from Json factory ClusterInfo.fromJson(Map json) { return ClusterInfo( - id: json['id'] as int, + id: json['id'] as String, faces: (json['faces'] as List).map((e) => e as String).toSet(), ); } diff --git a/mobile/lib/models/nanoids/cluster_id.dart b/mobile/lib/models/nanoids/cluster_id.dart index 2376c7a014..278e0bb1a2 100644 --- a/mobile/lib/models/nanoids/cluster_id.dart +++ b/mobile/lib/models/nanoids/cluster_id.dart @@ -6,26 +6,12 @@ const alphaphet = const clusterIDLength = 22; class ClusterID { - final String value; - - // Private constructor - ClusterID._internal(this.value); - - // Factory constructor with validation - factory ClusterID(String value) { - if (!_isValidClusterID(value)) { - throw const FormatException('Invalid NanoID format'); - } - return ClusterID._internal(value); - } - - // Static method to generate a new NanoID - static ClusterID generate() { - return ClusterID("cluster_${customAlphabet(urlAlphabet, clusterIDLength)}"); + static String generate() { + return "cluster_${customAlphabet(urlAlphabet, clusterIDLength)}"; } // Validation method - static bool _isValidClusterID(String value) { + static bool isValidClusterID(String value) { if (value.length != (clusterIDLength + 8)) { debugPrint("ClusterID length is not ${clusterIDLength + 8}: $value"); return false; @@ -36,24 +22,4 @@ class ClusterID { } return true; } - - // Override == operator - @override - bool operator ==(Object other) { - if (identical(this, other)) return true; - return other is ClusterID && other.value == value; - } - - // Override hashCode - @override - int get hashCode => value.hashCode; - - @override - String toString() => value; - - String toJson() => value; - - static ClusterID fromJson(String value) { - return ClusterID(value); - } } diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index 69b8fc06b8..d33b69c97a 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -1,7 +1,6 @@ import "dart:async"; import "dart:developer"; import "dart:isolate"; -import "dart:math" show max; import "dart:typed_data" show Uint8List; import "package:computer/computer.dart"; @@ -10,6 +9,7 @@ import "package:logging/logging.dart"; import "package:ml_linalg/dtype.dart"; import "package:ml_linalg/vector.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; +import "package:photos/models/nanoids/cluster_id.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/ml_result.dart"; @@ -21,7 +21,7 @@ class FaceInfo { final double? blurValue; final bool? badFace; final Vector? vEmbedding; - int? clusterId; + String? clusterId; String? closestFaceId; int? closestDist; int? fileCreationTime; @@ -39,9 +39,9 @@ class FaceInfo { enum ClusterOperation { linearIncrementalClustering } class ClusteringResult { - final Map newFaceIdToCluster; - final Map> newClusterIdToFaceIds; - final Map newClusterSummaries; + final Map newFaceIdToCluster; + final Map> newClusterIdToFaceIds; + final Map newClusterSummaries; bool get isEmpty => newFaceIdToCluster.isEmpty; @@ -210,7 +210,7 @@ class FaceClusteringService { double conservativeDistanceThreshold = kConservativeDistanceThreshold, bool useDynamicThreshold = true, int? offset, - required Map oldClusterSummaries, + required Map oldClusterSummaries, }) async { if (input.isEmpty) { _logger.warning( @@ -417,7 +417,7 @@ ClusteringResult _runLinearClustering(Map args) { final useDynamicThreshold = args['useDynamicThreshold'] as bool; final offset = args['offset'] as int?; final oldClusterSummaries = - args['oldClusterSummaries'] as Map?; + args['oldClusterSummaries'] as Map?; log( "[ClusterIsolate] ${DateTime.now()} Copied to isolate ${input.length} faces", @@ -491,17 +491,17 @@ ClusteringResult _runLinearClustering(Map args) { "[ClusterIsolate] ${DateTime.now()} Processing $totalFaces faces in total in this round ${offset != null ? "on top of ${offset + facesWithClusterID.length} earlier processed faces" : ""}", ); // set current epoch time as clusterID - int clusterID = DateTime.now().microsecondsSinceEpoch; + String clusterID = ClusterID.generate(); if (facesWithClusterID.isEmpty) { // assign a clusterID to the first face sortedFaceInfos[0].clusterId = clusterID; - clusterID++; + clusterID = ClusterID.generate(); } final stopwatchClustering = Stopwatch()..start(); for (int i = 1; i < totalFaces; i++) { // Incremental clustering, so we can skip faces that already have a clusterId if (sortedFaceInfos[i].clusterId != null) { - clusterID = max(clusterID, sortedFaceInfos[i].clusterId!); + // clusterID = max(clusterID, sortedFaceInfos[i].clusterId!); continue; } @@ -539,25 +539,25 @@ ClusteringResult _runLinearClustering(Map args) { log( " [ClusterIsolate] [WARNING] ${DateTime.now()} Found new cluster $clusterID", ); - clusterID++; + clusterID = ClusterID.generate(); sortedFaceInfos[closestIdx].clusterId = clusterID; } sortedFaceInfos[i].clusterId = sortedFaceInfos[closestIdx].clusterId; } else { - clusterID++; + clusterID = ClusterID.generate(); sortedFaceInfos[i].clusterId = clusterID; } } // Finally, assign the new clusterId to the faces - final Map newFaceIdToCluster = {}; + final Map newFaceIdToCluster = {}; final newClusteredFaceInfos = sortedFaceInfos.sublist(alreadyClusteredCount); for (final faceInfo in newClusteredFaceInfos) { newFaceIdToCluster[faceInfo.faceID] = faceInfo.clusterId!; } // Create a map of clusterId to faceIds - final Map> clusterIdToFaceIds = {}; + final Map> clusterIdToFaceIds = {}; for (final entry in newFaceIdToCluster.entries) { final clusterID = entry.value; if (clusterIdToFaceIds.containsKey(clusterID)) { @@ -599,7 +599,7 @@ ClusteringResult _runCompleteClustering(Map args) { final distanceThreshold = args['distanceThreshold'] as double; final mergeThreshold = args['mergeThreshold'] as double; final oldClusterSummaries = - args['oldClusterSummaries'] as Map?; + args['oldClusterSummaries'] as Map?; log( "[CompleteClustering] ${DateTime.now()} Copied to isolate ${input.length} faces for clustering", @@ -634,11 +634,10 @@ ClusteringResult _runCompleteClustering(Map args) { "[CompleteClustering] ${DateTime.now()} Processing $totalFaces faces in one single round of complete clustering", ); - // set current epoch time as clusterID - int clusterID = DateTime.now().microsecondsSinceEpoch; + String clusterID = ClusterID.generate(); // Start actual clustering - final Map newFaceIdToCluster = {}; + final Map newFaceIdToCluster = {}; final stopwatchClustering = Stopwatch()..start(); for (int i = 0; i < totalFaces; i++) { if ((i + 1) % 250 == 0) { @@ -659,18 +658,18 @@ ClusteringResult _runCompleteClustering(Map args) { if (closestDistance < distanceThreshold) { if (faceInfos[closestIdx].clusterId == null) { - clusterID++; + clusterID = ClusterID.generate(); faceInfos[closestIdx].clusterId = clusterID; } faceInfos[i].clusterId = faceInfos[closestIdx].clusterId!; } else { - clusterID++; + clusterID = ClusterID.generate(); faceInfos[i].clusterId = clusterID; } } // Now calculate the mean of the embeddings for each cluster - final Map> clusterIdToFaceInfos = {}; + final Map> clusterIdToFaceInfos = {}; for (final faceInfo in faceInfos) { if (clusterIdToFaceInfos.containsKey(faceInfo.clusterId)) { clusterIdToFaceInfos[faceInfo.clusterId]!.add(faceInfo); @@ -678,7 +677,7 @@ ClusteringResult _runCompleteClustering(Map args) { clusterIdToFaceInfos[faceInfo.clusterId!] = [faceInfo]; } } - final Map clusterIdToMeanEmbeddingAndWeight = {}; + final Map clusterIdToMeanEmbeddingAndWeight = {}; for (final clusterId in clusterIdToFaceInfos.keys) { final List embeddings = clusterIdToFaceInfos[clusterId]! .map((faceInfo) => faceInfo.vEmbedding!) @@ -691,13 +690,14 @@ ClusteringResult _runCompleteClustering(Map args) { } // Now merge the clusters that are close to each other, based on mean embedding - final List<(int, int)> mergedClustersList = []; - final List clusterIds = clusterIdToMeanEmbeddingAndWeight.keys.toList(); + final List<(String, String)> mergedClustersList = []; + final List clusterIds = + clusterIdToMeanEmbeddingAndWeight.keys.toList(); log(' [CompleteClustering] ${DateTime.now()} ${clusterIds.length} clusters found, now checking for merges'); while (true) { if (clusterIds.length < 2) break; double distance = double.infinity; - (int, int) clusterIDsToMerge = (-1, -1); + (String, String) clusterIDsToMerge = ('', ''); for (int i = 0; i < clusterIds.length; i++) { for (int j = 0; j < clusterIds.length; j++) { if (i == j) continue; @@ -749,7 +749,7 @@ ClusteringResult _runCompleteClustering(Map args) { newFaceIdToCluster[faceInfo.faceID] = faceInfo.clusterId!; } - final Map> clusterIdToFaceIds = {}; + final Map> clusterIdToFaceIds = {}; for (final entry in newFaceIdToCluster.entries) { final clusterID = entry.value; if (clusterIdToFaceIds.containsKey(clusterID)) { @@ -794,12 +794,12 @@ void _sortFaceInfosOnCreationTime( }); } -Map _updateClusterSummaries({ +Map _updateClusterSummaries({ required List newFaceInfos, - Map? oldSummary, + Map? oldSummary, }) { final calcSummariesStart = DateTime.now(); - final Map> newClusterIdToFaceInfos = {}; + final Map> newClusterIdToFaceInfos = {}; for (final faceInfo in newFaceInfos) { if (newClusterIdToFaceInfos.containsKey(faceInfo.clusterId!)) { newClusterIdToFaceInfos[faceInfo.clusterId!]!.add(faceInfo); @@ -808,7 +808,7 @@ Map _updateClusterSummaries({ } } - final Map newClusterSummaries = {}; + final Map newClusterSummaries = {}; for (final clusterId in newClusterIdToFaceInfos.keys) { final List newEmbeddings = newClusterIdToFaceInfos[clusterId]! .map((faceInfo) => faceInfo.vEmbedding!) @@ -849,13 +849,13 @@ void _analyzeClusterResults(List sortedFaceInfos) { if (!kDebugMode) return; final stopwatch = Stopwatch()..start(); - final Map faceIdToCluster = {}; + final Map faceIdToCluster = {}; for (final faceInfo in sortedFaceInfos) { faceIdToCluster[faceInfo.faceID] = faceInfo.clusterId!; } // Find faceIDs that are part of a cluster which is larger than 5 and are new faceIDs - final Map clusterIdToSize = {}; + final Map clusterIdToSize = {}; faceIdToCluster.forEach((key, value) { if (clusterIdToSize.containsKey(value)) { clusterIdToSize[value] = clusterIdToSize[value]! + 1; diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart index 12754301bb..1822d3fb55 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart @@ -2,7 +2,7 @@ import "dart:typed_data" show Uint8List; class FaceDbInfoForClustering { final String faceID; - int? clusterId; + String? clusterId; final Uint8List embeddingBytes; final double faceScore; final double blurValue; diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index 9da4f1ce2f..85fb95af75 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -20,7 +20,7 @@ import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/search_service.dart"; class ClusterSuggestion { - final int clusterIDToMerge; + final String clusterIDToMerge; final double distancePersonToCluster; final bool usedOnlyMeanForSuggestion; final List filesInCluster; @@ -43,13 +43,13 @@ class ClusterFeedbackService { static final ClusterFeedbackService instance = ClusterFeedbackService._privateConstructor(); - static int lastViewedClusterID = -1; - static setLastViewedClusterID(int clusterID) { + static String lastViewedClusterID = ''; + static setLastViewedClusterID(String clusterID) { lastViewedClusterID = clusterID; } static resetLastViewedClusterID() { - lastViewedClusterID = -1; + lastViewedClusterID = ''; } /// Returns a list of cluster suggestions for a person. Each suggestion is a tuple of the following elements: @@ -68,7 +68,7 @@ class ClusterFeedbackService { try { // Get the suggestions for the person using centroids and median final startTime = DateTime.now(); - final List<(int, double, bool)> foundSuggestions = + final List<(String, double, bool)> foundSuggestions = await _getSuggestions(person); final findSuggestionsTime = DateTime.now(); _logger.info( @@ -77,13 +77,13 @@ class ClusterFeedbackService { // Get the files for the suggestions final suggestionClusterIDs = foundSuggestions.map((e) => e.$1).toSet(); - final Map> fileIdToClusterID = + final Map> fileIdToClusterID = await FaceMLDataDB.instance.getFileIdToClusterIDSetForCluster( suggestionClusterIDs, ); final clusterIdToFaceIDs = await FaceMLDataDB.instance.getClusterToFaceIDs(suggestionClusterIDs); - final Map> clusterIDToFiles = {}; + final Map> clusterIDToFiles = {}; final allFiles = await SearchService.instance.getAllFiles(); for (final f in allFiles) { if (!fileIdToClusterID.containsKey(f.uploadedFileID ?? -1)) { @@ -180,7 +180,7 @@ class ClusterFeedbackService { .clusterSummaryUpdate(clusterResult.newClusterSummaries); // Make sure the deleted faces don't get suggested in the future - final notClusterIdToPersonId = {}; + final notClusterIdToPersonId = {}; for (final clusterId in newFaceIdToClusterID.values.toSet()) { notClusterIdToPersonId[clusterId] = p.remoteID; } @@ -202,7 +202,7 @@ class ClusterFeedbackService { Future removeFilesFromCluster( List files, - int clusterID, + String clusterID, ) async { _logger.info('removeFilesFromCluster called'); try { @@ -260,8 +260,8 @@ class ClusterFeedbackService { } } - Future addFacesToCluster(List faceIDs, int clusterID) async { - final faceIDToClusterID = {}; + Future addFacesToCluster(List faceIDs, String clusterID) async { + final faceIDToClusterID = {}; for (final faceID in faceIDs) { faceIDToClusterID[faceID] = clusterID; } @@ -272,7 +272,7 @@ class ClusterFeedbackService { Future checkAndDoAutomaticMerges( PersonEntity p, { - required int personClusterID, + required String personClusterID, }) async { final faceMlDb = FaceMLDataDB.instance; final faceIDs = await faceMlDb.getFaceIDsForCluster(personClusterID); @@ -293,7 +293,7 @@ class ClusterFeedbackService { // Get and update the cluster summary to get the avg (centroid) and count final EnteWatch watch = EnteWatch("ClusterFeedbackService")..start(); - final Map clusterAvg = await _getUpdateClusterAvg( + final Map clusterAvg = await _getUpdateClusterAvg( allClusterIdsToCountMap, ignoredClusters, minClusterSize: kMinimumClusterSizeSearchResult, @@ -301,7 +301,8 @@ class ClusterFeedbackService { watch.log('computed avg for ${clusterAvg.length} clusters'); // Find the actual closest clusters for the person - final List<(int, double)> suggestions = await calcSuggestionsMeanInComputer( + final List<(String, double)> suggestions = + await calcSuggestionsMeanInComputer( clusterAvg, {personClusterID}, ignoredClusters, @@ -333,16 +334,16 @@ class ClusterFeedbackService { return true; } - Future ignoreCluster(int clusterID) async { + Future ignoreCluster(String clusterID) async { await PersonService.instance.addPerson('', clusterID); Bus.instance.fire(PeopleChangedEvent()); return; } - Future> checkForMixedClusters() async { + Future> checkForMixedClusters() async { final faceMlDb = FaceMLDataDB.instance; final allClusterToFaceCount = await faceMlDb.clusterIdToFaceCount(); - final clustersToInspect = []; + final clustersToInspect = []; for (final clusterID in allClusterToFaceCount.keys) { if (allClusterToFaceCount[clusterID]! > 20 && allClusterToFaceCount[clusterID]! < 500) { @@ -353,7 +354,7 @@ class ClusterFeedbackService { final fileIDToCreationTime = await FilesDB.instance.getFileIDToCreationTime(); - final susClusters = <(int, int)>[]; + final susClusters = <(String, int)>[]; final inspectionStart = DateTime.now(); for (final clusterID in clustersToInspect) { @@ -387,15 +388,15 @@ class ClusterFeedbackService { ); // Now find the sizes of the biggest and second biggest cluster - final int biggestClusterID = newClusterIdToCount.keys.reduce((a, b) { + final String biggestClusterID = newClusterIdToCount.keys.reduce((a, b) { return newClusterIdToCount[a]! > newClusterIdToCount[b]! ? a : b; }); final int biggestSize = newClusterIdToCount[biggestClusterID]!; final biggestRatio = biggestSize / originalClusterSize; if (newClusterIdToCount.length > 1) { - final List clusterIDs = newClusterIdToCount.keys.toList(); + final List clusterIDs = newClusterIdToCount.keys.toList(); clusterIDs.remove(biggestClusterID); - final int secondBiggestClusterID = clusterIDs.reduce((a, b) { + final String secondBiggestClusterID = clusterIDs.reduce((a, b) { return newClusterIdToCount[a]! > newClusterIdToCount[b]! ? a : b; }); final int secondBiggestSize = @@ -432,7 +433,7 @@ class ClusterFeedbackService { } Future breakUpCluster( - int clusterID, { + String clusterID, { bool useDbscan = false, }) async { _logger.info( @@ -491,7 +492,7 @@ class ClusterFeedbackService { /// 1. clusterID: the ID of the cluster /// 2. distance: the distance between the person's cluster and the suggestion /// 3. usedMean: whether the suggestion was found using the mean (true) or the median (false) - Future> _getSuggestions( + Future> _getSuggestions( PersonEntity p, { int sampleSize = 50, double maxMedianDistance = 0.62, @@ -520,8 +521,8 @@ class ClusterFeedbackService { .map((clusterID) => allClusterIdsToCountMap[clusterID] ?? 0) .reduce((value, element) => min(value, element)); final checkSizes = [100, 20, kMinimumClusterSizeSearchResult, 10, 5, 1]; - Map clusterAvgBigClusters = {}; - final List<(int, double)> suggestionsMean = []; + Map clusterAvgBigClusters = {}; + final List<(String, double)> suggestionsMean = []; for (final minimumSize in checkSizes.toSet()) { if (smallestPersonClusterSize >= min(minimumSize, kMinimumClusterSizeSearchResult)) { @@ -533,7 +534,7 @@ class ClusterFeedbackService { w?.log( 'Calculate avg for ${clusterAvgBigClusters.length} clusters of min size $minimumSize', ); - final List<(int, double)> suggestionsMeanBigClusters = + final List<(String, double)> suggestionsMeanBigClusters = await calcSuggestionsMeanInComputer( clusterAvgBigClusters, personClusters, @@ -570,7 +571,7 @@ class ClusterFeedbackService { // Find the other cluster candidates based on the median final clusterAvg = clusterAvgBigClusters; - final List<(int, double)> moreSuggestionsMean = + final List<(String, double)> moreSuggestionsMean = await calcSuggestionsMeanInComputer( clusterAvg, personClusters, @@ -616,8 +617,8 @@ class ClusterFeedbackService { .toList(growable: false); // Find the actual closest clusters for the person using median - final List<(int, double)> suggestionsMedian = []; - final List<(int, double)> greatSuggestionsMedian = []; + final List<(String, double)> suggestionsMedian = []; + final List<(String, double)> greatSuggestionsMedian = []; double minMedianDistance = maxMedianDistance; for (final otherClusterId in otherClusterIdsCandidates) { final Iterable otherEmbeddingsProto = @@ -663,11 +664,12 @@ class ClusterFeedbackService { _logger.info("Found suggestions using median: $suggestionsMedian"); } - final List<(int, double, bool)> finalSuggestionsMedian = suggestionsMedian - .map(((e) => (e.$1, e.$2, false))) - .toList(growable: false) - .reversed - .toList(growable: false); + final List<(String, double, bool)> finalSuggestionsMedian = + suggestionsMedian + .map(((e) => (e.$1, e.$2, false))) + .toList(growable: false) + .reversed + .toList(growable: false); if (greatSuggestionsMedian.isNotEmpty) { _logger.info( @@ -687,9 +689,9 @@ class ClusterFeedbackService { return finalSuggestionsMedian; } - Future> _getUpdateClusterAvg( - Map allClusterIdsToCountMap, - Set ignoredClusters, { + Future> _getUpdateClusterAvg( + Map allClusterIdsToCountMap, + Set ignoredClusters, { int minClusterSize = 1, int maxClusterInCurrentRun = 500, int maxEmbeddingToRead = 10000, @@ -701,9 +703,9 @@ class ClusterFeedbackService { 'start getUpdateClusterAvg for ${allClusterIdsToCountMap.length} clusters, minClusterSize $minClusterSize, maxClusterInCurrentRun $maxClusterInCurrentRun', ); - final Map clusterToSummary = + final Map clusterToSummary = await faceMlDb.getAllClusterSummary(minClusterSize); - final Map updatesForClusterSummary = {}; + final Map updatesForClusterSummary = {}; w?.log( 'getUpdateClusterAvg database call for getAllClusterSummary', @@ -717,7 +719,7 @@ class ClusterFeedbackService { 'ignoredClusters': ignoredClusters, 'clusterToSummary': clusterToSummary, }, - ) as (Map, Set, int, int, int); + ) as (Map, Set, int, int, int); final clusterAvg = serializationEmbeddings.$1; final allClusterIds = serializationEmbeddings.$2; final ignoredClustersCnt = serializationEmbeddings.$3; @@ -753,7 +755,7 @@ class ClusterFeedbackService { w?.reset(); int currentPendingRead = 0; - final List clusterIdsToRead = []; + final List clusterIdsToRead = []; for (final clusterID in sortedClusterIDs) { if (maxClusterInCurrentRun-- <= 0) { break; @@ -772,9 +774,9 @@ class ClusterFeedbackService { } } - final Map> clusterEmbeddings = await FaceMLDataDB - .instance - .getFaceEmbeddingsForClusters(clusterIdsToRead); + final Map> clusterEmbeddings = + await FaceMLDataDB.instance + .getFaceEmbeddingsForClusters(clusterIdsToRead); w?.logAndReset( 'read $currentPendingRead embeddings for ${clusterEmbeddings.length} clusters', @@ -817,10 +819,10 @@ class ClusterFeedbackService { return clusterAvg; } - Future> calcSuggestionsMeanInComputer( - Map clusterAvg, - Set personClusters, - Set ignoredClusters, + Future> calcSuggestionsMeanInComputer( + Map clusterAvg, + Set personClusters, + Set ignoredClusters, double maxClusterDistance, ) async { return await _computer.compute( @@ -889,7 +891,7 @@ class ClusterFeedbackService { // Get the cluster averages for the person's clusters and the suggestions' clusters final personClusters = await faceMlDb.getPersonClusterIDs(person.remoteID); - final Map personClusterToSummary = + final Map personClusterToSummary = await faceMlDb.getClusterToClusterSummary(personClusters); final clusterSummaryCallTime = DateTime.now(); @@ -975,7 +977,7 @@ class ClusterFeedbackService { } Future debugLogClusterBlurValues( - int clusterID, { + String clusterID, { int? clusterSize, bool logClusterSummary = false, bool logBlurValues = false, @@ -986,7 +988,8 @@ class ClusterFeedbackService { _logger.info( "Debug logging for cluster $clusterID${clusterSize != null ? ' with $clusterSize photos' : ''}", ); - const int biggestClusterID = 1715061228725148; + // todo:(laurens) remove to review + const String biggestClusterID = 'some random id'; // Logging the cluster summary for the cluster if (logClusterSummary) { @@ -1117,21 +1120,22 @@ class ClusterFeedbackService { } /// Returns a map of person's clusterID to map of closest clusterID to with disstance -List<(int, double)> _calcSuggestionsMean(Map args) { +List<(String, double)> _calcSuggestionsMean(Map args) { // Fill in args - final Map clusterAvg = args['clusterAvg']; - final Set personClusters = args['personClusters']; - final Set ignoredClusters = args['ignoredClusters']; + final Map clusterAvg = args['clusterAvg']; + final Set personClusters = args['personClusters']; + final Set ignoredClusters = args['ignoredClusters']; final double maxClusterDistance = args['maxClusterDistance']; - final Map> suggestions = {}; + final Map> suggestions = {}; const suggestionMax = 2000; int suggestionCount = 0; int comparisons = 0; final w = (kDebugMode ? EnteWatch('getSuggestions') : null)?..start(); // ignore the clusters that belong to the person or is ignored - Set otherClusters = clusterAvg.keys.toSet().difference(personClusters); + Set otherClusters = + clusterAvg.keys.toSet().difference(personClusters); otherClusters = otherClusters.difference(ignoredClusters); for (final otherClusterID in otherClusters) { @@ -1140,7 +1144,7 @@ List<(int, double)> _calcSuggestionsMean(Map args) { dev.log('[WARNING] no avg for othercluster $otherClusterID'); continue; } - int? nearestPersonCluster; + String? nearestPersonCluster; double? minDistance; for (final personCluster in personClusters) { if (clusterAvg[personCluster] == null) { @@ -1172,8 +1176,8 @@ List<(int, double)> _calcSuggestionsMean(Map args) { ); if (suggestions.isNotEmpty) { - final List<(int, double)> suggestClusterIds = []; - for (final List<(int, double)> suggestion in suggestions.values) { + final List<(String, double)> suggestClusterIds = []; + for (final List<(String, double)> suggestion in suggestions.values) { suggestClusterIds.addAll(suggestion); } suggestClusterIds.sort( @@ -1186,20 +1190,22 @@ List<(int, double)> _calcSuggestionsMean(Map args) { return suggestClusterIds.sublist(0, min(suggestClusterIds.length, 20)); } else { dev.log("No suggestions found using mean"); - return <(int, double)>[]; + return <(String, double)>[]; } } -Future<(Map, Set, int, int, int)> +Future<(Map, Set, int, int, int)> checkAndSerializeCurrentClusterMeans( Map args, ) async { - final Map allClusterIdsToCountMap = args['allClusterIdsToCountMap']; + final Map allClusterIdsToCountMap = + args['allClusterIdsToCountMap']; final int minClusterSize = args['minClusterSize'] ?? 1; - final Set ignoredClusters = args['ignoredClusters'] ?? {}; - final Map clusterToSummary = args['clusterToSummary']; + final Set ignoredClusters = args['ignoredClusters'] ?? {}; + final Map clusterToSummary = + args['clusterToSummary']; - final Map clusterAvg = {}; + final Map clusterAvg = {}; final allClusterIds = allClusterIdsToCountMap.keys.toSet(); int ignoredClustersCnt = 0, alreadyUpdatedClustersCnt = 0; diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 4931bb0eb7..187e51faf6 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -82,7 +82,7 @@ class PersonService { continue; } final personData = person.data; - final Map> dbPersonCluster = + final Map> dbPersonCluster = dbPersonClusterInfo[personID]!; if (_shouldUpdateRemotePerson(personData, dbPersonCluster)) { final personData = person.data; @@ -109,7 +109,7 @@ class PersonService { bool _shouldUpdateRemotePerson( PersonData personData, - Map> dbPersonCluster, + Map> dbPersonCluster, ) { bool result = false; if ((personData.assigned?.length ?? 0) != dbPersonCluster.length) { @@ -152,7 +152,7 @@ class PersonService { Future addPerson( String name, - int clusterID, { + String clusterID, { bool isHidden = false, }) async { final faceIds = await faceMLDataDB.getFaceIDsForCluster(clusterID); @@ -179,7 +179,7 @@ class PersonService { Future removeClusterToPerson({ required String personID, - required int clusterID, + required String clusterID, }) async { final person = (await getPerson(personID))!; final personData = person.data; @@ -201,7 +201,7 @@ class PersonService { required Set faceIDs, }) async { final personData = person.data; - final List emptiedClusters = []; + final List emptiedClusters = []; for (final cluster in personData.assigned!) { cluster.faces.removeWhere((faceID) => faceIDs.contains(faceID)); if (cluster.faces.isEmpty) { @@ -219,7 +219,6 @@ class PersonService { ); } - await entityService.addOrUpdate( EntityType.person, json.encode(personData.toJson()), @@ -256,8 +255,8 @@ class PersonService { await entityService.syncEntities(); final entities = await entityService.getEntities(EntityType.person); entities.sort((a, b) => a.updatedAt.compareTo(b.updatedAt)); - final Map faceIdToClusterID = {}; - final Map clusterToPersonID = {}; + final Map faceIdToClusterID = {}; + final Map clusterToPersonID = {}; for (var e in entities) { final personData = PersonData.fromJson(json.decode(e.data)); int faceCount = 0; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 7bf0e2dfd5..1ed24f0d46 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -250,7 +250,7 @@ class MLService { ); // Get the current cluster statistics - final Map oldClusterSummaries = + final Map oldClusterSummaries = await FaceMLDataDB.instance.getAllClusterSummary(); if (clusterInBuckets) { diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index b9b6736e3c..9329a79081 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -736,14 +736,14 @@ class SearchService { return searchResults; } - Future>> getClusterFilesForPersonID( + Future>> getClusterFilesForPersonID( String personID, ) async { _logger.info('getClusterFilesForPersonID $personID'); - final Map> fileIdToClusterID = + final Map> fileIdToClusterID = await FaceMLDataDB.instance.getFileIdToClusterIDSet(personID); _logger.info('faceDbDone getClusterFilesForPersonID $personID'); - final Map> clusterIDToFiles = {}; + final Map> clusterIDToFiles = {}; final allFiles = await getAllFiles(); for (final f in allFiles) { if (!fileIdToClusterID.containsKey(f.uploadedFileID ?? -1)) { @@ -765,7 +765,7 @@ class SearchService { Future> getAllFace(int? limit) async { try { debugPrint("getting faces"); - final Map> fileIdToClusterID = + final Map> fileIdToClusterID = await FaceMLDataDB.instance.getFileIdToClusterIds(); final Map personIdToPerson = await PersonService.instance.getPersonsMap(); @@ -773,7 +773,7 @@ class SearchService { await FaceMLDataDB.instance.getClusterIDToPersonID(); final List facesResult = []; - final Map> clusterIdToFiles = {}; + final Map> clusterIdToFiles = {}; final Map> personIdToFiles = {}; final allFiles = await getAllFiles(); for (final f in allFiles) { diff --git a/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart b/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart index a0c50be21d..d295d85e1c 100644 --- a/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart +++ b/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart @@ -13,7 +13,7 @@ class BottomActionBarWidget extends StatelessWidget { final GalleryType galleryType; final Collection? collection; final PersonEntity? person; - final int? clusterID; + final String? clusterID; final SelectedFiles selectedFiles; final VoidCallback? onCancel; final Color? backgroundColor; diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index 9e75474d40..cf90489c6d 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -53,7 +53,7 @@ class FileSelectionActionsWidget extends StatefulWidget { final DeviceCollection? deviceCollection; final SelectedFiles selectedFiles; final PersonEntity? person; - final int? clusterID; + final String? clusterID; const FileSelectionActionsWidget( this.type, diff --git a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart index 9ba5adf3fb..bb9825f649 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart @@ -14,7 +14,7 @@ class FileSelectionOverlayBar extends StatefulWidget { final Collection? collection; final Color? backgroundColor; final PersonEntity? person; - final int? clusterID; + final String? clusterID; const FileSelectionOverlayBar( this.galleryType, diff --git a/mobile/lib/ui/viewer/file_details/face_widget.dart b/mobile/lib/ui/viewer/file_details/face_widget.dart index 9c0d7decdb..7465f7c8c0 100644 --- a/mobile/lib/ui/viewer/file_details/face_widget.dart +++ b/mobile/lib/ui/viewer/file_details/face_widget.dart @@ -9,6 +9,7 @@ import "package:photos/face/db.dart"; import "package:photos/face/model/face.dart"; import "package:photos/face/model/person.dart"; import 'package:photos/models/file/file.dart'; +import "package:photos/models/nanoids/cluster_id.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/search_service.dart"; @@ -24,7 +25,7 @@ class FaceWidget extends StatefulWidget { final Face face; final Future?>? faceCrops; final PersonEntity? person; - final int? clusterID; + final String? clusterID; final bool highlight; final bool editMode; @@ -98,7 +99,7 @@ class _FaceWidgetState extends State { } // Create new clusterID for the faceID and update DB to assign the faceID to the new clusterID - final int newClusterID = DateTime.now().microsecondsSinceEpoch; + final String newClusterID = ClusterID.generate(); await FaceMLDataDB.instance.updateFaceIdToClusterId( {widget.face.faceID: newClusterID}, ); diff --git a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart index cb22e53b82..304beba5a4 100644 --- a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart +++ b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart @@ -146,7 +146,7 @@ class _FacesItemWidgetState extends State { final faceCrops = getRelevantFaceCrops(faces); for (final Face face in faces) { - final int? clusterID = faceIdsToClusterIds[face.faceID]; + final String? clusterID = faceIdsToClusterIds[face.faceID]; final PersonEntity? person = clusterIDToPerson[clusterID] != null ? persons[clusterIDToPerson[clusterID]!] : null; @@ -175,8 +175,7 @@ class _FacesItemWidgetState extends State { Future?> getRelevantFaceCrops( Iterable faces, { int fetchAttempt = 1, - } - ) async { + }) async { try { final faceIdToCrop = {}; final facesWithoutCrops = {}; @@ -226,7 +225,7 @@ class _FacesItemWidgetState extends State { stackTrace: s, ); resetPool(fullFile: true); - if(fetchAttempt <= retryLimit) { + if (fetchAttempt <= retryLimit) { return getRelevantFaceCrops(faces, fetchAttempt: fetchAttempt + 1); } return null; diff --git a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart index eb5b3e4b32..c868e60e71 100644 --- a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart +++ b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart @@ -47,7 +47,7 @@ String _actionName( Future showAssignPersonAction( BuildContext context, { - required int clusterID, + required String clusterID, PersonActionType actionType = PersonActionType.assignPerson, bool showOptionToAddNewPerson = true, }) { @@ -75,7 +75,7 @@ Future showAssignPersonAction( class PersonActionSheet extends StatefulWidget { final PersonActionType actionType; - final int cluserID; + final String cluserID; final bool showOptionToCreateNewPerson; const PersonActionSheet({ required this.actionType, @@ -276,7 +276,7 @@ class _PersonActionSheetState extends State { Future addNewPerson( BuildContext context, { String initValue = '', - required int clusterID, + required String clusterID, }) async { final result = await showTextInputDialog( context, diff --git a/mobile/lib/ui/viewer/people/cluster_app_bar.dart b/mobile/lib/ui/viewer/people/cluster_app_bar.dart index fbfade9013..25b16aab34 100644 --- a/mobile/lib/ui/viewer/people/cluster_app_bar.dart +++ b/mobile/lib/ui/viewer/people/cluster_app_bar.dart @@ -26,7 +26,7 @@ class ClusterAppBar extends StatefulWidget { final GalleryType type; final String? title; final SelectedFiles selectedFiles; - final int clusterID; + final String clusterID; final PersonEntity? person; const ClusterAppBar( @@ -179,7 +179,7 @@ class _AppBarWidgetState extends State { Future _breakUpCluster(BuildContext context) async { bool userConfirmed = false; List biggestClusterFiles = []; - int biggestClusterID = -1; + String biggestClusterID = ''; await showChoiceDialog( context, title: "Does this grouping contain multiple people?", @@ -190,9 +190,9 @@ class _AppBarWidgetState extends State { try { final breakupResult = await ClusterFeedbackService.instance .breakUpCluster(widget.clusterID); - final Map> newClusterIDToFaceIDs = + final Map> newClusterIDToFaceIDs = breakupResult.newClusterIdToFaceIds; - final Map newFaceIdToClusterID = + final Map newFaceIdToClusterID = breakupResult.newFaceIdToCluster; // Update to delete the old clusters and save the new clusters @@ -203,9 +203,9 @@ class _AppBarWidgetState extends State { .updateFaceIdToClusterId(newFaceIdToClusterID); // Find the biggest cluster - biggestClusterID = -1; + biggestClusterID = ''; int biggestClusterSize = 0; - for (final MapEntry> clusterToFaces + for (final MapEntry> clusterToFaces in newClusterIDToFaceIDs.entries) { if (clusterToFaces.value.length > biggestClusterSize) { biggestClusterSize = clusterToFaces.value.length; @@ -253,7 +253,7 @@ class _AppBarWidgetState extends State { final breakupResult = await ClusterFeedbackService.instance.breakUpCluster(widget.clusterID); - final Map> newClusterIDToFaceIDs = + final Map> newClusterIDToFaceIDs = breakupResult.newClusterIdToFaceIds; final allFileIDs = newClusterIDToFaceIDs.values diff --git a/mobile/lib/ui/viewer/people/cluster_breakup_page.dart b/mobile/lib/ui/viewer/people/cluster_breakup_page.dart index 5644258325..c1bec40466 100644 --- a/mobile/lib/ui/viewer/people/cluster_breakup_page.dart +++ b/mobile/lib/ui/viewer/people/cluster_breakup_page.dart @@ -6,7 +6,7 @@ import "package:photos/ui/viewer/people/cluster_page.dart"; import "package:photos/ui/viewer/search/result/person_face_widget.dart"; class ClusterBreakupPage extends StatefulWidget { - final Map> newClusterIDsToFiles; + final Map> newClusterIDsToFiles; final String title; const ClusterBreakupPage( @@ -32,7 +32,7 @@ class _ClusterBreakupPageState extends State { body: ListView.builder( itemCount: widget.newClusterIDsToFiles.keys.length, itemBuilder: (context, index) { - final int clusterID = keys[index]; + final String clusterID = keys[index]; final List files = clusterIDsToFiles[keys[index]]!; return InkWell( onTap: () { @@ -40,7 +40,7 @@ class _ClusterBreakupPageState extends State { MaterialPageRoute( builder: (context) => ClusterPage( files, - clusterID: index, + clusterID: clusterID, appendTitle: "(Analysis)", ), ), diff --git a/mobile/lib/ui/viewer/people/cluster_page.dart b/mobile/lib/ui/viewer/people/cluster_page.dart index efca41ecab..05b89d8247 100644 --- a/mobile/lib/ui/viewer/people/cluster_page.dart +++ b/mobile/lib/ui/viewer/people/cluster_page.dart @@ -29,7 +29,7 @@ class ClusterPage extends StatefulWidget { final List searchResult; final bool enableGrouping; final String tagPrefix; - final int clusterID; + final String clusterID; final PersonEntity? personID; final String appendTitle; final bool showNamingBanner; diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index c3e788ffff..db1141fa9e 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -109,7 +109,7 @@ class _PersonClustersState extends State { allSuggestions = snapshot.data!; final numberOfDifferentSuggestions = allSuggestions.length; final currentSuggestion = allSuggestions[currentSuggestionIndex]; - final int clusterID = currentSuggestion.clusterIDToMerge; + final String clusterID = currentSuggestion.clusterIDToMerge; final double distance = currentSuggestion.distancePersonToCluster; final bool usingMean = currentSuggestion.usedOnlyMeanForSuggestion; final List files = currentSuggestion.filesInCluster; @@ -182,7 +182,7 @@ class _PersonClustersState extends State { } Future _handleUserClusterChoice( - int clusterID, + String clusterID, bool yesOrNo, int numberOfSuggestions, ) async { @@ -229,7 +229,7 @@ class _PersonClustersState extends State { } Future _rejectSuggestion( - int clusterID, + String clusterID, int numberOfSuggestions, ) async { canGiveFeedback = false; @@ -254,7 +254,7 @@ class _PersonClustersState extends State { } Widget _buildSuggestionView( - int clusterID, + String clusterID, double distance, bool usingMean, List files, @@ -379,7 +379,7 @@ class _PersonClustersState extends State { Widget _buildThumbnailWidget( List files, - int clusterID, + String clusterID, Future> generateFaceThumbnails, ) { return SizedBox( @@ -433,7 +433,7 @@ class _PersonClustersState extends State { List _buildThumbnailWidgetsRow( List files, - int cluserId, + String cluserId, Map faceThumbnails, { int start = 0, }) { @@ -460,7 +460,7 @@ class _PersonClustersState extends State { Future> _generateFaceThumbnails( List files, - int clusterID, + String clusterID, ) async { final futures = >[]; for (final file in files) { diff --git a/mobile/lib/ui/viewer/people/person_clusters_page.dart b/mobile/lib/ui/viewer/people/person_clusters_page.dart index 16d1131682..810fcbc779 100644 --- a/mobile/lib/ui/viewer/people/person_clusters_page.dart +++ b/mobile/lib/ui/viewer/people/person_clusters_page.dart @@ -32,12 +32,13 @@ class _PersonClustersPageState extends State { appBar: AppBar( title: Text(widget.person.data.name), ), - body: FutureBuilder>>( - future: SearchService.instance.getClusterFilesForPersonID(widget.person.remoteID), + body: FutureBuilder>>( + future: SearchService.instance + .getClusterFilesForPersonID(widget.person.remoteID), builder: (context, snapshot) { if (snapshot.hasData) { final clusters = snapshot.data!; - final List keys = clusters.keys.toList(); + final List keys = clusters.keys.toList(); // Sort the clusters by the number of files in each cluster, largest first keys.sort( (b, a) => clusters[a]!.length.compareTo(clusters[b]!.length), @@ -45,7 +46,7 @@ class _PersonClustersPageState extends State { return ListView.builder( itemCount: keys.length, itemBuilder: (context, index) { - final int clusterID = keys[index]; + final String clusterID = keys[index]; final List files = clusters[clusterID]!; return InkWell( onTap: () { @@ -54,7 +55,7 @@ class _PersonClustersPageState extends State { builder: (context) => ClusterPage( files, personID: widget.person, - clusterID: index, + clusterID: clusterID, showNamingBanner: false, ), ), @@ -91,7 +92,8 @@ class _PersonClustersPageState extends State { ), // Add some spacing between the thumbnail and the text Expanded( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), + padding: + const EdgeInsets.symmetric(horizontal: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -103,14 +105,16 @@ class _PersonClustersPageState extends State { ? GestureDetector( onTap: () async { try { - await PersonService.instance.removeClusterToPerson( + await PersonService.instance + .removeClusterToPerson( personID: widget.person.remoteID, clusterID: clusterID, ); _logger.info( "Removed cluster $clusterID from person ${widget.person.remoteID}", ); - Bus.instance.fire(PeopleChangedEvent()); + Bus.instance + .fire(PeopleChangedEvent()); setState(() {}); } catch (e) { _logger.severe( diff --git a/mobile/lib/ui/viewer/search/result/person_face_widget.dart b/mobile/lib/ui/viewer/search/result/person_face_widget.dart index c63a8cd890..dda445b862 100644 --- a/mobile/lib/ui/viewer/search/result/person_face_widget.dart +++ b/mobile/lib/ui/viewer/search/result/person_face_widget.dart @@ -17,7 +17,7 @@ import "package:pool/pool.dart"; class PersonFaceWidget extends StatelessWidget { final EnteFile file; final String? personId; - final int? clusterID; + final String? clusterID; final bool useFullFile; final bool thumbnailFallback; final Uint8List? faceCrop; diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 13e2f8a813..b3ce01045f 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -273,7 +273,7 @@ class SearchExample extends StatelessWidget { onTap: () async { final result = await showAssignPersonAction( context, - clusterID: int.parse(searchResult.name()), + clusterID: searchResult.name(), ); if (result != null && result is (PersonEntity, EnteFile)) { From 8d0e3e972f7ffbe9f4d34c77cb3bc9242cb89ea5 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 13 Aug 2024 19:49:41 +0530 Subject: [PATCH 0220/1179] [mob][photos] Fix or make UI and layout better of the system navigation bar, home bottom navigation bar and the search widget --- mobile/lib/main.dart | 12 ++ mobile/lib/ui/home/home_bottom_nav_bar.dart | 187 +++++++++--------- .../lib/ui/viewer/search/search_widget.dart | 3 + 3 files changed, 109 insertions(+), 93 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index f8b3f0796d..2d964ebc71 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -8,6 +8,7 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import "package:flutter/rendering.dart"; +import "package:flutter/services.dart"; import "package:flutter_displaymode/flutter_displaymode.dart"; import 'package:logging/logging.dart'; import "package:media_kit/media_kit.dart"; @@ -78,6 +79,17 @@ void main() async { await _runInForeground(savedThemeMode); unawaited(BackgroundFetch.registerHeadlessTask(_headlessTaskHandler)); if (Platform.isAndroid) FlutterDisplayMode.setHighRefreshRate().ignore(); + SystemChrome.setSystemUIOverlayStyle( + const SystemUiOverlayStyle( + systemNavigationBarColor: Color(0x00010000), + ), + ); + + unawaited( + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.edgeToEdge, + ), + ); } Future _runInForeground(AdaptiveThemeMode? savedThemeMode) async { diff --git a/mobile/lib/ui/home/home_bottom_nav_bar.dart b/mobile/lib/ui/home/home_bottom_nav_bar.dart index e4867a08b4..2de0bb8f69 100644 --- a/mobile/lib/ui/home/home_bottom_nav_bar.dart +++ b/mobile/lib/ui/home/home_bottom_nav_bar.dart @@ -31,6 +31,7 @@ class _HomeBottomNavigationBarState extends State { void initState() { super.initState(); currentTabIndex = widget.selectedTabIndex; + //Todo: Remove this listener on dispose widget.selectedFiles.addListener(() { setState(() {}); }); @@ -72,102 +73,102 @@ class _HomeBottomNavigationBarState extends State { @override Widget build(BuildContext context) { - final isBottomInsetPresent = MediaQuery.of(context).viewPadding.bottom != 0; - final bottomPadding = isBottomInsetPresent ? 32.0 : 8.0; final bool filesAreSelected = widget.selectedFiles.files.isNotEmpty; final enteColorScheme = getEnteColorScheme(context); - return RepaintBoundary( - child: AnimatedContainer( - duration: const Duration(milliseconds: 300), - curve: Curves.easeInOut, - height: filesAreSelected ? 0 : (56 + bottomPadding), - child: IgnorePointer( - ignoring: filesAreSelected, - child: ListView( - physics: const NeverScrollableScrollPhysics(), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GNav( - curve: Curves.easeOutExpo, - backgroundColor: - getEnteColorScheme(context).backgroundElevated2, - mainAxisAlignment: MainAxisAlignment.center, - iconSize: 24, - padding: const EdgeInsets.fromLTRB(16, 6, 16, 6), - duration: const Duration(milliseconds: 200), - gap: 0, - tabBorderRadius: 32, - tabBackgroundColor: - Theme.of(context).brightness == Brightness.light - ? strokeFainterLight - : strokeSolidFaintLight, - haptic: false, - tabs: [ - GButton( - margin: const EdgeInsets.fromLTRB(8, 6, 10, 6), - icon: Icons.home_rounded, - iconColor: enteColorScheme.tabIcon, - iconActiveColor: strokeBaseLight, - text: '', - onPressed: () { - _onTabChange( - 0, - mode: "OnPressed", - ); // To take care of occasional missing events - }, - ), - GButton( - margin: const EdgeInsets.fromLTRB(10, 6, 10, 6), - icon: Icons.collections_rounded, - iconColor: enteColorScheme.tabIcon, - iconActiveColor: strokeBaseLight, - text: '', - onPressed: () { - _onTabChange( - 1, - mode: "OnPressed", - ); // To take care of occasional missing - // events - }, - ), - GButton( - margin: const EdgeInsets.fromLTRB(10, 6, 8, 6), - icon: Icons.people_outlined, - iconColor: enteColorScheme.tabIcon, - iconActiveColor: strokeBaseLight, - text: '', - onPressed: () { - _onTabChange( - 2, - mode: "OnPressed", - ); // To take care - // of occasional missing events - }, - ), - GButton( - margin: const EdgeInsets.fromLTRB(10, 6, 8, 6), - icon: Icons.search_outlined, - iconColor: enteColorScheme.tabIcon, - iconActiveColor: strokeBaseLight, - text: '', - onPressed: () { - _onTabChange( - 3, - mode: "OnPressed", - ); // To take care - // of occasional missing events - }, - ), - ], - selectedIndex: currentTabIndex, - onTabChange: _onTabChange, - ), - ], - ), - ], + return SafeArea( + child: RepaintBoundary( + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + height: filesAreSelected ? 0 : 56, + child: IgnorePointer( + ignoring: filesAreSelected, + child: ListView( + physics: const NeverScrollableScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GNav( + curve: Curves.easeOutExpo, + backgroundColor: + getEnteColorScheme(context).backgroundElevated2, + mainAxisAlignment: MainAxisAlignment.center, + iconSize: 24, + padding: const EdgeInsets.fromLTRB(16, 6, 16, 6), + duration: const Duration(milliseconds: 200), + gap: 0, + tabBorderRadius: 32, + tabBackgroundColor: + Theme.of(context).brightness == Brightness.light + ? strokeFainterLight + : strokeSolidFaintLight, + haptic: false, + tabs: [ + GButton( + margin: const EdgeInsets.fromLTRB(8, 6, 10, 6), + icon: Icons.home_rounded, + iconColor: enteColorScheme.tabIcon, + iconActiveColor: strokeBaseLight, + text: '', + onPressed: () { + _onTabChange( + 0, + mode: "OnPressed", + ); // To take care of occasional missing events + }, + ), + GButton( + margin: const EdgeInsets.fromLTRB(10, 6, 10, 6), + icon: Icons.collections_rounded, + iconColor: enteColorScheme.tabIcon, + iconActiveColor: strokeBaseLight, + text: '', + onPressed: () { + _onTabChange( + 1, + mode: "OnPressed", + ); // To take care of occasional missing + // events + }, + ), + GButton( + margin: const EdgeInsets.fromLTRB(10, 6, 8, 6), + icon: Icons.people_outlined, + iconColor: enteColorScheme.tabIcon, + iconActiveColor: strokeBaseLight, + text: '', + onPressed: () { + _onTabChange( + 2, + mode: "OnPressed", + ); // To take care + // of occasional missing events + }, + ), + GButton( + margin: const EdgeInsets.fromLTRB(10, 6, 8, 6), + icon: Icons.search_outlined, + iconColor: enteColorScheme.tabIcon, + iconActiveColor: strokeBaseLight, + text: '', + onPressed: () { + _onTabChange( + 3, + mode: "OnPressed", + ); // To take care + // of occasional missing events + }, + ), + ], + selectedIndex: currentTabIndex, + onTabChange: _onTabChange, + ), + ], + ), + ], + ), ), ), ), diff --git a/mobile/lib/ui/viewer/search/search_widget.dart b/mobile/lib/ui/viewer/search/search_widget.dart index 1983c5cb69..525f1e5114 100644 --- a/mobile/lib/ui/viewer/search/search_widget.dart +++ b/mobile/lib/ui/viewer/search/search_widget.dart @@ -87,10 +87,13 @@ class SearchWidgetState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); + //https://api.flutter.dev/flutter/dart-ui/FlutterView-class.html _bottomPadding = (MediaQuery.viewInsetsOf(context).bottom - _distanceOfWidgetFromBottom); if (_bottomPadding < 0) { _bottomPadding = 0; + } else if (_bottomPadding != 0) { + _bottomPadding += MediaQuery.viewPaddingOf(context).bottom; } } From e74aac002325821de4699d777bc30d3266ef4c2d Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 13 Aug 2024 19:59:40 +0530 Subject: [PATCH 0221/1179] [mob][photos] Remove listener --- mobile/lib/ui/home/home_bottom_nav_bar.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/home/home_bottom_nav_bar.dart b/mobile/lib/ui/home/home_bottom_nav_bar.dart index 2de0bb8f69..4fb19df170 100644 --- a/mobile/lib/ui/home/home_bottom_nav_bar.dart +++ b/mobile/lib/ui/home/home_bottom_nav_bar.dart @@ -32,9 +32,7 @@ class _HomeBottomNavigationBarState extends State { super.initState(); currentTabIndex = widget.selectedTabIndex; //Todo: Remove this listener on dispose - widget.selectedFiles.addListener(() { - setState(() {}); - }); + widget.selectedFiles.addListener(_selectedFilesListener); _tabChangedEventSubscription = Bus.instance.on().listen((event) { if (event.source != TabChangedEventSource.tabBar) { @@ -58,9 +56,16 @@ class _HomeBottomNavigationBarState extends State { @override void dispose() { _tabChangedEventSubscription.cancel(); + widget.selectedFiles.removeListener(_selectedFilesListener); super.dispose(); } + void _selectedFilesListener() { + if (mounted) { + setState(() {}); + } + } + void _onTabChange(int index, {String mode = 'tabChanged'}) { debugPrint("_TabChanged called via method $mode"); Bus.instance.fire( From 0c097b38f46576915f9b32c03d3109899be97bc0 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 13 Aug 2024 20:19:10 +0530 Subject: [PATCH 0222/1179] [mob][photos] chore --- mobile/lib/ui/viewer/file/detail_page.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/detail_page.dart b/mobile/lib/ui/viewer/file/detail_page.dart index 96d56f3a58..24dd9c0499 100644 --- a/mobile/lib/ui/viewer/file/detail_page.dart +++ b/mobile/lib/ui/viewer/file/detail_page.dart @@ -345,7 +345,6 @@ class _DetailPageState extends State { overlays: SystemUiOverlay.values, ); } - // }); } Future _preloadEntries() async { From 2376327e5224a0d4a4799973c6312cc8ceb9af04 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 14:18:43 +0530 Subject: [PATCH 0223/1179] zt --- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/user-entity.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index acb74639f7..356c9885d5 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -17,7 +17,7 @@ export interface FaceCluster { /** * An unordered set of ids of the faces that belong to the cluster. * - * For ergonomics of transportation and persistence this is an array but it + * For ergonomics of transportation and persistence this is an array, but it * should conceptually be thought of as a set. */ faceIDs: string[]; diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 6be7c699be..700c8ca976 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,6 +1,7 @@ import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; +import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; /** @@ -131,6 +132,19 @@ export const personDiff = async (entityKeyB64: string) => { const entities = await userEntityDiff("person", 0, entityKeyB64); return entities.map(({ data }) => { if (!data) return undefined; - return JSON.parse(new TextDecoder().decode(data)) as unknown; + return RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); }); }; + +/** + * Zod schema for the "person" entity + */ +const RemotePerson = z.object({ + name: z.string().nullish().transform(nullToUndefined), + assigned: z.array( + z.object({ + id: z.number(), // TODO z.string person_v2 + faces: z.string().array(), + }), + ), +}); From ef7b978cd586547ed17a39801a57b249aed567c8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 14:34:11 +0530 Subject: [PATCH 0224/1179] Outline --- .../new/photos/services/ml/cluster-new.ts | 37 ++++++++++++------- .../new/photos/services/user-entity.ts | 3 +- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 356c9885d5..79252ac206 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -8,6 +8,10 @@ import { dotProduct } from "./math"; * A face cluster is an set of faces. * * Each cluster has an id so that a Person (a set of clusters) can refer to it. + * + * The cluster is not directly synced to remote. But it can indirectly get + * synced if it gets attached to a person (which can be thought of as a named + * cluster). */ export interface FaceCluster { /** @@ -15,7 +19,7 @@ export interface FaceCluster { */ id: string; /** - * An unordered set of ids of the faces that belong to the cluster. + * An unordered set of ids of the faces that belong to this cluster. * * For ergonomics of transportation and persistence this is an array, but it * should conceptually be thought of as a set. @@ -24,16 +28,13 @@ export interface FaceCluster { } /** - * A Person is a set of clusters, with some attached metadata. + * A Person is a set of clusters and some attached metadata. * - * The person is the user visible concept. It consists of a set of clusters, - * each of which itself is a set of faces. - * - * For ease of transportation, the Person entity on remote looks like + * For ease of transportation, the Person entity on remote is something like * * { name, clusters: [{ clusterID, faceIDs }] } * - * That is, it has the clusters embedded within itself. + * That is, the Person has the clusters embedded within itself. */ export interface Person { /** @@ -43,11 +44,11 @@ export interface Person { /** * An optional name assigned by the user to this person. */ - name: string | undefined; + name: string; /** * An unordered set of ids of the clusters that belong to this person. * - * For ergonomics of transportation and persistence this is an array but it + * For ergonomics of transportation and persistence this is an array, but it * should conceptually be thought of as a set. */ clusterIDs: string[]; @@ -58,20 +59,28 @@ export interface Person { * * [Note: Face clustering algorithm] * + * A person consists of clusters, each of which itself is a set of faces. + * + * The clusters are generated using locally by clients using this algorithm: + * * 1. clusters = [] + * * 2. For each face, find its nearest neighbour in the embedding space from * amongst the faces that have already been clustered. + * * 3. If no such neighbour is found within our threshold, create a new cluster. + * * 4. Otherwise assign this face to the same cluster as its nearest neighbour. * - * [Note: Face clustering feedback] + * This user can then tweak the output of the algorithm by performing the + * following actions to the list of clusters that they can see: * - * This user can tweak the output of the algorithm by providing feedback. They - * can perform the following actions: + * - They can provide a name for a cluster. This upgrades a cluster into a + * "Person", which then gets synced via remote to all their devices. * - * 1. Move a cluster from one person to another. - * 2. Break a cluster. + * - They can attach more clusters to a person. * + * - They can remove a cluster from a person. */ export const clusterFaces = (faceIndexes: FaceIndex[]) => { const t = Date.now(); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 700c8ca976..61dc93d464 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,7 +1,6 @@ import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; -import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; /** @@ -140,7 +139,7 @@ export const personDiff = async (entityKeyB64: string) => { * Zod schema for the "person" entity */ const RemotePerson = z.object({ - name: z.string().nullish().transform(nullToUndefined), + name: z.string(), assigned: z.array( z.object({ id: z.number(), // TODO z.string person_v2 From 5081dc904b4553d2f04e7135dc5f32736d3c8a6d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 14:54:07 +0530 Subject: [PATCH 0225/1179] Enhance --- .../new/photos/services/user-entity.ts | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 61dc93d464..63b8fda9a5 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -124,19 +124,7 @@ export const userEntityDiff = async ( }; /** - * Fetch all Person entities that have been created or updated since the last - * time we checked. - */ -export const personDiff = async (entityKeyB64: string) => { - const entities = await userEntityDiff("person", 0, entityKeyB64); - return entities.map(({ data }) => { - if (!data) return undefined; - return RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); - }); -}; - -/** - * Zod schema for the "person" entity + * Zod schema for the "person" entity (the {@link RemotePerson} type). */ const RemotePerson = z.object({ name: z.string(), @@ -147,3 +135,33 @@ const RemotePerson = z.object({ }), ), }); + +/** + * A "person" entity as synced via remote. + */ +export type RemotePerson = z.infer; + +/** + * Fetch all Person entities that have been created or updated since the last + * time we checked. + */ +export const personDiff = async ( + entityKeyB64: string, +): Promise => { + const sinceTime = 0; + const entities = await userEntityDiff("person", 0, entityKeyB64); + const latestUpdatedAt = entities.reduce( + (max, e) => Math.max(max, e.updatedAt), + sinceTime, + ); + const people = entities + .map(({ data }) => + data + ? RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))) + : undefined, + ) + .filter((p) => !!p); + // TODO-Cluster + console.log({ latestUpdatedAt, people }); + return people; +}; From 614c3128763b0bd797092da71d0e38f422937083 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 15:19:02 +0530 Subject: [PATCH 0226/1179] Tentative DB schema --- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/db.ts | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 79252ac206..c412c43f9a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -42,7 +42,7 @@ export interface Person { */ id: string; /** - * An optional name assigned by the user to this person. + * A name assigned by the user to this person. */ name: string; /** diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 3fe18d0731..4ee9539bd6 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -3,6 +3,7 @@ import log from "@/base/log"; import localForage from "@ente/shared/storage/localForage"; import { deleteDB, openDB, type DBSchema } from "idb"; import type { LocalCLIPIndex } from "./clip"; +import type { FaceCluster, Person } from "./cluster-new"; import type { LocalFaceIndex } from "./face"; /** @@ -43,6 +44,14 @@ interface MLDBSchema extends DBSchema { key: number; value: LocalCLIPIndex; }; + "face-cluster": { + key: string; + value: FaceCluster; + }; + person: { + key: string; + value: Person; + }; } interface FileStatus { @@ -98,6 +107,17 @@ const openMLDB = async () => { if (oldVersion < 2) { db.createObjectStore("clip-index", { keyPath: "fileID" }); } + // TODO-Cluster + if (oldVersion < 3) { + if ( + newVersion && + newVersion > 10 && + process.env.NEXT_PUBLIC_ENTE_WIP_CL + ) { + db.createObjectStore("face-cluster", { keyPath: "id" }); + db.createObjectStore("person", { keyPath: "id" }); + } + } }, blocking() { log.info( @@ -393,3 +413,19 @@ export const markIndexingFailed = async (fileID: number) => { fileStatus.failureCount = fileStatus.failureCount + 1; await Promise.all([tx.store.put(fileStatus), tx.done]); }; + +/** + * Return all face clusters present locally. + */ +export const faceClusters = async () => { + const db = await mlDB(); + return await db.getAll("face-cluster"); +}; + +/** + * Return all people present locally. + */ +export const people = async () => { + const db = await mlDB(); + return await db.getAll("person"); +}; From 7f9391f89f3deedfd0f9281d403db16124cf23d4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 18:50:14 +0530 Subject: [PATCH 0227/1179] Parse --- web/packages/new/photos/services/ml/index.ts | 2 +- web/packages/new/photos/services/user-entity.ts | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index ebee2fb790..e3e23d616f 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -330,7 +330,7 @@ export const wipCluster = async () => { if (last) return last; - const clusters = clusterFaces(await faceIndexes()); + const clusters = await clusterFaces(await faceIndexes()); const localFiles = await getAllLocalFiles(); const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 63b8fda9a5..b78f246120 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -130,7 +130,8 @@ const RemotePerson = z.object({ name: z.string(), assigned: z.array( z.object({ - id: z.number(), // TODO z.string person_v2 + // TODO-Cluster temporary modify + id: z.number().transform((n) => n.toString()), // TODO z.string person_v2 faces: z.string().array(), }), ), @@ -154,12 +155,10 @@ export const personDiff = async ( (max, e) => Math.max(max, e.updatedAt), sinceTime, ); + const parse = (data: Uint8Array) => + RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); const people = entities - .map(({ data }) => - data - ? RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))) - : undefined, - ) + .map(({ data }) => (data ? parse(data) : undefined)) .filter((p) => !!p); // TODO-Cluster console.log({ latestUpdatedAt, people }); From 5e4f0d4caf57c3c915be3c523ace6864ca0700af Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 19:14:25 +0530 Subject: [PATCH 0228/1179] A2 --- .../new/photos/services/ml/cluster-new.ts | 96 ++++++++++++++----- 1 file changed, 74 insertions(+), 22 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index c412c43f9a..0e4919d517 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -1,6 +1,7 @@ import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; +import { faceClusters } from "./db"; import type { FaceIndex } from "./face"; import { dotProduct } from "./math"; @@ -63,7 +64,7 @@ export interface Person { * * The clusters are generated using locally by clients using this algorithm: * - * 1. clusters = [] + * 1. clusters = [] initially, or fetched from remote. * * 2. For each face, find its nearest neighbour in the embedding space from * amongst the faces that have already been clustered. @@ -82,18 +83,45 @@ export interface Person { * * - They can remove a cluster from a person. */ -export const clusterFaces = (faceIndexes: FaceIndex[]) => { +export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); + // The face data that we need (face ID and its embedding). const faces = [...faceIDAndEmbeddings(faceIndexes)]; - let clusters: FaceCluster[] = []; - const clusterIndexByFaceID = new Map(); + // Start with the clusters we already have (either from a previous indexing, + // or fetched from remote). + const clusters = await faceClusters(); + + // For fast reverse lookup - map from cluster ids to the index in the + // clusters array. + const clusterIndexForClusterID = new Map(clusters.map((c, i) => [c.id, i])); + + // For fast reverse lookup - map from face ids to the id of the cluster to + // which they belong. + const clusterIDForFaceID = new Map( + clusters.flatMap((c) => + c.faceIDs.map((faceID) => [faceID, c.id] as const), + ), + ); + + // Generate a new cluster ID + const newClusterID = () => newNonSecureID("cluster_"); + + // For each face for (const [i, { faceID, embedding }] of faces.entries()) { - // Find the nearest neighbour from among the faces we have already seen. + // If the face is already part of a cluster, then skip it. + if (clusterIDForFaceID.get(faceID)) continue; + + // Find the nearest neighbour from among all the other faces. let nnIndex: number | undefined; let nnCosineSimilarity = 0; - for (let j = 0; j < i; j++) { + for (let j = 0; j < faces.length; j++) { + // ! This is an O(n^2) loop, be careful when adding more code here. + + // Skip itself + if (i == j) continue; + // Can't find a way of avoiding the null assertion. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const n = faces[j]!; @@ -106,36 +134,60 @@ export const clusterFaces = (faceIndexes: FaceIndex[]) => { nnCosineSimilarity = csim; } } - if (nnIndex === undefined) { - // We didn't find a neighbour. Create a new cluster with this face. - const cluster = { - id: newNonSecureID("cluster_"), - faceIDs: [faceID], - }; + if (nnIndex === undefined) { + // We didn't find a neighbour within the threshold. Create a new + // cluster with this face. + + const cluster = { id: newClusterID(), faceIDs: [faceID] }; clusters.push(cluster); - clusterIndexByFaceID.set(faceID, clusters.length); + clusterIndexForClusterID.set(cluster.id, clusters.length); + clusterIDForFaceID.set(faceID, cluster.id); } else { - // Found a neighbour near enough. Add this face to the neighbour's - // cluster. + // Found a neighbour near enough. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const nn = faces[nnIndex]!; - const nnClusterIndex = ensure(clusterIndexByFaceID.get(nn.faceID)); - clusters[nnClusterIndex]?.faceIDs.push(faceID); - clusterIndexByFaceID.set(faceID, nnClusterIndex); + + // Find the cluster the nearest neighbour belongs to, if any. + const nnClusterID = clusterIDForFaceID.get(nn.faceID); + + if (nnClusterID) { + // If the neighbour is already part of a cluster, also add + // ourselves to that cluster. + + const nnClusterIndex = ensure( + clusterIndexForClusterID.get(nnClusterID), + ); + clusters[nnClusterIndex]?.faceIDs.push(faceID); + clusterIDForFaceID.set(faceID, nnClusterID); + } else { + // Create a new cluster with us and our nearest neighbour. + + const cluster = { + id: newClusterID(), + faceIDs: [faceID, nn.faceID], + }; + clusters.push(cluster); + clusterIndexForClusterID.set(cluster.id, clusters.length); + clusterIDForFaceID.set(faceID, cluster.id); + clusterIDForFaceID.set(nn.faceID, cluster.id); + } } } - clusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); + const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - log.debug(() => ["ml/cluster", { faces, clusters, clusterIndexByFaceID }]); + log.debug(() => [ + "ml/cluster", + { faces, validClusters, clusterIndexForClusterID, clusterIDForFaceID }, + ]); log.debug( () => - `Clustered ${faces.length} faces into ${clusters.length} clusters (${Date.now() - t} ms)`, + `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return clusters; + return validClusters; }; /** From 1c9a14cfdc7874b6539e43d7aa3350138c32b5f0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 19:26:32 +0530 Subject: [PATCH 0229/1179] Tweak --- .../new/photos/services/ml/cluster-new.ts | 39 ++++++++++--------- web/packages/new/photos/services/ml/db.ts | 2 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 0e4919d517..55b3510825 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -40,6 +40,9 @@ export interface FaceCluster { export interface Person { /** * A nanoid for this person. + * + * This is the ID of the Person user entity, it is not contained as part of + * the Person entity payload. */ id: string; /** @@ -105,24 +108,24 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { ), ); - // Generate a new cluster ID + // New cluster ID generator function. const newClusterID = () => newNonSecureID("cluster_"); - // For each face + // For each face, for (const [i, { faceID, embedding }] of faces.entries()) { // If the face is already part of a cluster, then skip it. if (clusterIDForFaceID.get(faceID)) continue; // Find the nearest neighbour from among all the other faces. - let nnIndex: number | undefined; + let nn: (typeof faces)[number] | undefined; let nnCosineSimilarity = 0; for (let j = 0; j < faces.length; j++) { // ! This is an O(n^2) loop, be careful when adding more code here. - // Skip itself + // Skip ourselves. if (i == j) continue; - // Can't find a way of avoiding the null assertion. + // Can't find a way of avoiding the null assertion here. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const n = faces[j]!; @@ -130,25 +133,14 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // dot product as their cosine similarity. const csim = dotProduct(embedding, n.embedding); if (csim > 0.76 && csim > nnCosineSimilarity) { - nnIndex = j; + nn = n; nnCosineSimilarity = csim; } } - if (nnIndex === undefined) { - // We didn't find a neighbour within the threshold. Create a new - // cluster with this face. - - const cluster = { id: newClusterID(), faceIDs: [faceID] }; - clusters.push(cluster); - clusterIndexForClusterID.set(cluster.id, clusters.length); - clusterIDForFaceID.set(faceID, cluster.id); - } else { + if (nn) { // Found a neighbour near enough. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const nn = faces[nnIndex]!; - // Find the cluster the nearest neighbour belongs to, if any. const nnClusterID = clusterIDForFaceID.get(nn.faceID); @@ -162,7 +154,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { clusters[nnClusterIndex]?.faceIDs.push(faceID); clusterIDForFaceID.set(faceID, nnClusterID); } else { - // Create a new cluster with us and our nearest neighbour. + // Otherwise create a new cluster with us and our nearest + // neighbour. const cluster = { id: newClusterID(), @@ -173,6 +166,14 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { clusterIDForFaceID.set(faceID, cluster.id); clusterIDForFaceID.set(nn.faceID, cluster.id); } + } else { + // We didn't find a neighbour within the threshold. Create a new + // cluster with only this face. + + const cluster = { id: newClusterID(), faceIDs: [faceID] }; + clusters.push(cluster); + clusterIndexForClusterID.set(cluster.id, clusters.length); + clusterIDForFaceID.set(faceID, cluster.id); } } diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 4ee9539bd6..f33271188a 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -425,7 +425,7 @@ export const faceClusters = async () => { /** * Return all people present locally. */ -export const people = async () => { +export const persons = async () => { const db = await mlDB(); return await db.getAll("person"); }; From 207f9c50cf9da95af81820ef4ce67b2df584c1d3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 19:39:43 +0530 Subject: [PATCH 0230/1179] Clean --- web/packages/new/photos/services/ml/people.ts | 43 +------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index a85cc2f20a..6420794e1d 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -37,14 +37,6 @@ export const syncPeopleIndex = async () => { } - // TODO: have faces addresable through fileId + faceId - // to avoid index based addressing, which is prone to wrong results - // one way could be to match nearest face within threshold in the file - - const allFacesMap = - syncContext.allSyncedFacesMap ?? - (syncContext.allSyncedFacesMap = await mlIDbStorage.getAllFacesMap()); - // await this.init(); @@ -86,30 +78,13 @@ export const syncPeopleIndex = async () => { : best, ); -export async function getLocalFile(fileId: number) { - const localFiles = await getLocalFiles(); - return localFiles.find((f) => f.id === fileId); -} - - if (personFace && !personFace.crop?.cacheKey) { - const file = await getLocalFile(personFace.fileId); - const imageBitmap = await fetchImageBitmap(file); - await saveFaceCrop(imageBitmap, personFace); - } - - - const person: Person = { - id: index, - files: faces.map((f) => f.fileId), - displayFaceId: personFace?.id, - }; await mlIDbStorage.putPerson(person); faces.forEach((face) => { face.personId = person.id; }); - // log.info("Creating person: ", person, faces); + } await mlIDbStorage.updateFaces(allFacesMap); @@ -117,20 +92,4 @@ export async function getLocalFile(fileId: number) { // await mlIDbStorage.setIndexVersion("people", filesVersion); }; - public async regenerateFaceCrop(token: string, faceID: string) { - await downloadManager.init(APPS.PHOTOS, { token }); - return mlService.regenerateFaceCrop(faceID); - } - -export const regenerateFaceCrop = async (faceID: string) => { - const fileID = Number(faceID.split("-")[0]); - const personFace = await mlIDbStorage.getFace(fileID, faceID); - if (!personFace) { - throw Error("Face not found"); - } - - const file = await getLocalFile(personFace.fileId); - const imageBitmap = await fetchImageBitmap(file); - return await saveFaceCrop(imageBitmap, personFace); -}; */ From 3097810f2c281fc5ef7e72b4b174ecc6f233c73a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 20:14:30 +0530 Subject: [PATCH 0231/1179] Top scorer --- .../new/photos/services/ml/cluster-new.ts | 49 ++++++++++++++++--- web/packages/new/photos/services/ml/index.ts | 3 +- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 55b3510825..202d656ec0 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -1,8 +1,8 @@ import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; -import { faceClusters } from "./db"; -import type { FaceIndex } from "./face"; +import { faceClusters, persons } from "./db"; +import type { Face, FaceIndex } from "./face"; import { dotProduct } from "./math"; /** @@ -56,6 +56,11 @@ export interface Person { * should conceptually be thought of as a set. */ clusterIDs: string[]; + /** + * The ID of the face that should be used as the display face, to represent + * this person in the UI. + */ + avatarFaceID: string; } /** @@ -89,8 +94,8 @@ export interface Person { export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); - // The face data that we need (face ID and its embedding). - const faces = [...faceIDAndEmbeddings(faceIndexes)]; + // A flattened array of faces. + const faces = [...enumerateFaces(faceIndexes)]; // Start with the clusters we already have (either from a previous indexing, // or fetched from remote). @@ -117,7 +122,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { if (clusterIDForFaceID.get(faceID)) continue; // Find the nearest neighbour from among all the other faces. - let nn: (typeof faces)[number] | undefined; + let nn: Face | undefined; let nnCosineSimilarity = 0; for (let j = 0; j < faces.length; j++) { // ! This is an O(n^2) loop, be careful when adding more code here. @@ -177,11 +182,39 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { } } + // Prune too small clusters. const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); + // For each person, use the highest scoring face in any of its clusters as + // its display face. + + const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); + const people = await persons(); + + for (const person of people) { + person.avatarFaceID = person.clusterIDs + .map((clusterID) => clusterIndexForClusterID.get(clusterID)) + .map((clusterIndex) => + clusterIndex ? clusters[clusterIndex] : undefined, + ) + .filter((cluster) => !!cluster) + .flatMap((cluster) => cluster.faceIDs) + .map((id) => faceForFaceID.get(id)) + .filter((face) => !!face) + .reduce((topFace, face) => + topFace.score > face.score ? topFace : face, + ).faceID; + } + log.debug(() => [ "ml/cluster", - { faces, validClusters, clusterIndexForClusterID, clusterIDForFaceID }, + { + faces, + validClusters, + clusterIndexForClusterID, + clusterIDForFaceID, + people, + }, ]); log.debug( () => @@ -195,10 +228,10 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { * A generator function that returns a stream of {faceID, embedding} values, * flattening all the all the faces present in the given {@link faceIndices}. */ -function* faceIDAndEmbeddings(faceIndices: FaceIndex[]) { +function* enumerateFaces(faceIndices: FaceIndex[]) { for (const fi of faceIndices) { for (const f of fi.faces) { - yield { faceID: f.faceID, embedding: f.embedding }; + yield f; } } } diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index e3e23d616f..76ce68da36 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -510,7 +510,8 @@ export const unidentifiedFaceIDs = async ( }; /** - * Extract the ID of the {@link EnteFile} to which a face belongs from its ID. + * Extract the fileID of the {@link EnteFile} to which the face belongs from its + * faceID. */ const fileIDFromFaceID = (faceID: string) => { const fileID = parseInt(faceID.split("_")[0] ?? ""); From 113bd9744eab08b3b8be953bf839fdaa2cd917ff Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 20:23:04 +0530 Subject: [PATCH 0232/1179] Update all --- web/packages/new/photos/services/ml/db.ts | 34 +++++++++++++++++-- web/packages/new/photos/services/ml/people.ts | 7 ---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index f33271188a..be35790591 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -419,13 +419,41 @@ export const markIndexingFailed = async (fileID: number) => { */ export const faceClusters = async () => { const db = await mlDB(); - return await db.getAll("face-cluster"); + return db.getAll("face-cluster"); }; /** - * Return all people present locally. + * Return all person entries (aka "people") present locally. */ export const persons = async () => { const db = await mlDB(); - return await db.getAll("person"); + return db.getAll("person"); +}; + +/** + * Replace the face clusters stored locally with the given ones. + * + * This function deletes all entries from the person object store, and then + * inserts the given {@link clusters} into it. + */ +export const setFaceClusters = async (clusters: FaceCluster[]) => { + const db = await mlDB(); + const tx = db.transaction("face-cluster", "readwrite"); + await tx.store.clear(); + await Promise.all(clusters.map((cluster) => tx.store.put(cluster))); + return tx.done; +}; + +/** + * Replace the persons stored locally with the given ones. + * + * This function deletes all entries from the person object store, and then + * inserts the given {@link persons} into it. + */ +export const setPersons = async (persons: Person[]) => { + const db = await mlDB(); + const tx = db.transaction("person", "readwrite"); + await tx.store.clear(); + await Promise.all(persons.map((person) => tx.store.put(person))); + return tx.done; }; diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts index 6420794e1d..d2d9c884a3 100644 --- a/web/packages/new/photos/services/ml/people.ts +++ b/web/packages/new/photos/services/ml/people.ts @@ -71,13 +71,6 @@ export const syncPeopleIndex = async () => { for (const [index, cluster] of clusters.entries()) { const faces = cluster.map((f) => allFaces[f]).filter((f) => f); - // TODO: take default display face from last leaves of hdbscan clusters - const personFace = faces.reduce((best, face) => - face.detection.probability > best.detection.probability - ? face - : best, - ); - await mlIDbStorage.putPerson(person); From 565546755a75c6e61b9bc7d7865d984c19432af9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 20:35:30 +0530 Subject: [PATCH 0233/1179] Split the type --- .../Search/SearchBar/searchInput/index.tsx | 4 +- web/apps/photos/src/services/searchService.ts | 6 +- web/apps/photos/src/types/search/index.ts | 6 +- .../new/photos/components/PeopleList.tsx | 8 +- web/packages/new/photos/services/ml/index.ts | 7 +- web/packages/new/photos/services/ml/people.ts | 88 ------------------- web/packages/new/photos/services/search.ts | 13 +++ 7 files changed, 29 insertions(+), 103 deletions(-) delete mode 100644 web/packages/new/photos/services/ml/people.ts create mode 100644 web/packages/new/photos/services/search.ts diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx index 9f493ba9c7..80a863b62e 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx @@ -1,6 +1,5 @@ import { FileType } from "@/media/file-type"; import { isMLEnabled } from "@/new/photos/services/ml"; -import type { Person } from "@/new/photos/services/ml/people"; import { EnteFile } from "@/new/photos/types/file"; import CloseIcon from "@mui/icons-material/Close"; import { IconButton } from "@mui/material"; @@ -19,6 +18,7 @@ import { } from "services/searchService"; import { Collection } from "types/collection"; import { LocationTagData } from "types/entity"; +import type { SearchPerson } from "@/new/photos/services/search"; import { ClipSearchScores, DateValue, @@ -146,7 +146,7 @@ export default function SearchInput(props: Iprops) { search = { files: selectedOption.value as number[] }; break; case SuggestionType.PERSON: - search = { person: selectedOption.value as Person }; + search = { person: selectedOption.value as SearchPerson }; break; case SuggestionType.FILE_TYPE: search = { fileType: selectedOption.value as FileType }; diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index c469c4eec5..f9507bd675 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -9,7 +9,7 @@ import { wipCluster, wipClusterEnable, } from "@/new/photos/services/ml"; -import type { Person } from "@/new/photos/services/ml/people"; +import type { SearchPerson } from "@/new/photos/services/search"; import { personDiff } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; import * as chrono from "chrono-node"; @@ -406,7 +406,7 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { return { files: option.value as number[] }; case SuggestionType.PERSON: - return { person: option.value as Person }; + return { person: option.value as SearchPerson }; case SuggestionType.FILE_TYPE: return { fileType: option.value as FileType }; @@ -429,7 +429,7 @@ async function getAllPeople(limit: number = undefined) { return []; } - let people: Array = []; // await mlIDbStorage.getAllPeople(); + let people: Array = []; // await mlIDbStorage.getAllPeople(); people = await wipCluster(); // await mlPeopleStore.iterate((person) => { // people.push(person); diff --git a/web/apps/photos/src/types/search/index.ts b/web/apps/photos/src/types/search/index.ts index fdb054f7f5..5c9158958a 100644 --- a/web/apps/photos/src/types/search/index.ts +++ b/web/apps/photos/src/types/search/index.ts @@ -1,6 +1,6 @@ import { FileType } from "@/media/file-type"; import type { MLStatus } from "@/new/photos/services/ml"; -import type { Person } from "@/new/photos/services/ml/people"; +import type { SearchPerson } from "@/new/photos/services/search"; import { EnteFile } from "@/new/photos/types/file"; import { City } from "services/locationSearchService"; import { LocationTagData } from "types/entity"; @@ -30,7 +30,7 @@ export interface Suggestion { value: | DateValue | number[] - | Person + | SearchPerson | MLStatus | LocationTagData | City @@ -45,7 +45,7 @@ export type Search = { city?: City; collection?: number; files?: number[]; - person?: Person; + person?: SearchPerson; fileType?: FileType; clip?: ClipSearchScores; }; diff --git a/web/packages/new/photos/components/PeopleList.tsx b/web/packages/new/photos/components/PeopleList.tsx index adc53dbaf2..d3d6fe0c9c 100644 --- a/web/packages/new/photos/components/PeopleList.tsx +++ b/web/packages/new/photos/components/PeopleList.tsx @@ -1,14 +1,14 @@ import { faceCrop, unidentifiedFaceIDs } from "@/new/photos/services/ml"; -import type { Person } from "@/new/photos/services/ml/people"; import type { EnteFile } from "@/new/photos/types/file"; import { Skeleton, Typography, styled } from "@mui/material"; import { t } from "i18next"; import React, { useEffect, useState } from "react"; +import type { SearchPerson } from "../services/search"; export interface PeopleListProps { - people: Person[]; + people: SearchPerson[]; maxRows: number; - onSelect?: (person: Person, index: number) => void; + onSelect?: (person: SearchPerson, index: number) => void; } export const PeopleList: React.FC = ({ @@ -60,7 +60,7 @@ const FaceChip = styled("div")<{ clickable?: boolean }>` export interface PhotoPeopleListProps { file: EnteFile; - onSelect?: (person: Person, index: number) => void; + onSelect?: (person: SearchPerson, index: number) => void; } export function PhotoPeopleList() { diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 76ce68da36..5ca2bbe950 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -27,9 +27,9 @@ import { faceIndexes, indexableAndIndexedCounts, } from "./db"; -import type { Person } from "./people"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; +import type { SearchPerson } from "../search"; /** * Internal state of the ML subsystem. @@ -314,7 +314,8 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { void worker().then((w) => w.onUpload(enteFile, uploadItem)); }; -let last: Person[] | undefined; +// TODO-Cluster temporary import here +let last: SearchPerson[] | undefined; /** * WIP! Don't enable, dragon eggs are hatching here. @@ -335,7 +336,7 @@ export const wipCluster = async () => { const localFiles = await getAllLocalFiles(); const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); - const people: Person[] = []; // await mlIDbStorage.getAllPeople(); + const people: SearchPerson[] = []; // await mlIDbStorage.getAllPeople(); for (const cluster of clusters) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const dfID = cluster.faceIDs[0]!; diff --git a/web/packages/new/photos/services/ml/people.ts b/web/packages/new/photos/services/ml/people.ts deleted file mode 100644 index d2d9c884a3..0000000000 --- a/web/packages/new/photos/services/ml/people.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { EnteFile } from "../../types/file"; - -export interface Person { - id: number; - name?: string; - files: number[]; - displayFaceID: string; - displayFaceFile: EnteFile; -} - -// Forced disable clustering. It doesn't currently work. -// -// > Error: Failed to execute 'transferToImageBitmap' on -// > 'OffscreenCanvas': ImageBitmap construction failed - -/* -export const syncPeopleIndex = async () => { - - if ( - syncContext.outOfSyncFiles.length <= 0 || - (syncContext.nSyncedFiles === batchSize && Math.random() < 0) - ) { - await this.syncIndex(syncContext); - } - - public async syncIndex(syncContext: MLSyncContext) { - await this.getMLLibraryData(syncContext); - - await syncPeopleIndex(syncContext); - - await this.persistMLLibraryData(syncContext); - } - - const filesVersion = await mlIDbStorage.getIndexVersion("files"); - if (filesVersion <= (await mlIDbStorage.getIndexVersion("people"))) { - return; - } - - - - // await this.init(); - - const allFacesMap = await mlIDbStorage.getAllFacesMap(); - const allFaces = [...allFacesMap.values()].flat(); - - if (!allFaces || allFaces.length < 50) { - log.info( - `Skipping clustering since number of faces (${allFaces.length}) is less than the clustering threshold (50)`, - ); - return; - } - - log.info("Running clustering allFaces: ", allFaces.length); - const faceClusteringResults = await clusterFaces( - allFaces.map((f) => Array.from(f.embedding)), - ); - log.info( - "[MLService] Got face clustering results: ", - JSON.stringify(faceClusteringResults), - ); - - const clusters = faceClusteringResults?.clusters; - if (!clusters || clusters.length < 1) { - return; - } - - for (const face of allFaces) { - face.personId = undefined; - } - await mlIDbStorage.clearAllPeople(); - for (const [index, cluster] of clusters.entries()) { - const faces = cluster.map((f) => allFaces[f]).filter((f) => f); - - - await mlIDbStorage.putPerson(person); - - faces.forEach((face) => { - face.personId = person.id; - }); - - } - - await mlIDbStorage.updateFaces(allFacesMap); - - // await mlIDbStorage.setIndexVersion("people", filesVersion); -}; - -*/ diff --git a/web/packages/new/photos/services/search.ts b/web/packages/new/photos/services/search.ts new file mode 100644 index 0000000000..300fad5c24 --- /dev/null +++ b/web/packages/new/photos/services/search.ts @@ -0,0 +1,13 @@ +import type { EnteFile } from "@/new/photos/types/file"; + +/** + * A massaged version of {@link Person} suitable for being shown in search + * results. + */ +export interface SearchPerson { + id: number; + name?: string; + files: number[]; + displayFaceID: string; + displayFaceFile: EnteFile; +} From f802e87215986a8d23fc73ba445fdfeb9867ae89 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 13 Aug 2024 20:47:13 +0530 Subject: [PATCH 0234/1179] To search person --- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/index.ts | 43 +++++++++++-------- web/packages/new/photos/services/search.ts | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 202d656ec0..9bf342bab9 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -221,7 +221,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return validClusters; + return { clusters: validClusters, people }; }; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 5ca2bbe950..1981df4394 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -18,6 +18,7 @@ import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; +import type { SearchPerson } from "../search"; import type { UploadItem } from "../upload/types"; import { clusterFaces } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; @@ -29,7 +30,6 @@ import { } from "./db"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; -import type { SearchPerson } from "../search"; /** * Internal state of the ML subsystem. @@ -331,32 +331,39 @@ export const wipCluster = async () => { if (last) return last; - const clusters = await clusterFaces(await faceIndexes()); + const { clusters, people } = await clusterFaces(await faceIndexes()); + const clusterByID = new Map( + clusters.map((cluster) => [cluster.id, cluster]), + ); const localFiles = await getAllLocalFiles(); const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); - const people: SearchPerson[] = []; // await mlIDbStorage.getAllPeople(); - for (const cluster of clusters) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const dfID = cluster.faceIDs[0]!; - const dfFile = localFilesByID.get(fileIDFromFaceID(dfID) ?? 0); - if (!dfFile) { - assertionFailed(`Face ID ${dfID} without local file`); + const result: SearchPerson[] = []; + for (const person of people) { + const avatarFaceID = person.avatarFaceID; + const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); + const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); + if (!avatarFaceFileID || !avatarFaceFile) { + assertionFailed(`Face ID ${avatarFaceID} without local file`); continue; } - people.push({ - id: Math.random(), //cluster.id, - name: "test", - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - files: cluster.faceIDs.map((s) => parseInt(s.split("_")[0]!)), - displayFaceID: dfID, - displayFaceFile: dfFile, + const files = person.clusterIDs + .map((id) => clusterByID.get(id)) + .flatMap((cluster) => cluster?.faceIDs ?? []) + .map((faceID) => fileIDFromFaceID(faceID)) + .filter((fileID) => fileID !== undefined); + result.push({ + id: person.id, + name: person.name, + files, + displayFaceID: avatarFaceID, + displayFaceFile: avatarFaceFile, }); } - last = people; - return people; + last = result; + return result; }; export type MLStatus = diff --git a/web/packages/new/photos/services/search.ts b/web/packages/new/photos/services/search.ts index 300fad5c24..de11843164 100644 --- a/web/packages/new/photos/services/search.ts +++ b/web/packages/new/photos/services/search.ts @@ -5,7 +5,7 @@ import type { EnteFile } from "@/new/photos/types/file"; * results. */ export interface SearchPerson { - id: number; + id: string; name?: string; files: number[]; displayFaceID: string; From df46eeab10d53128c3d9d0d82ca94c9d7bf7e0e7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 13 Aug 2024 23:12:29 +0530 Subject: [PATCH 0235/1179] refactor --- mobile/lib/services/entity_service.dart | 9 ++++----- mobile/lib/services/location_service.dart | 4 ++-- .../face_ml/person/person_service.dart | 16 ++++++---------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/mobile/lib/services/entity_service.dart b/mobile/lib/services/entity_service.dart index 6ffe87358b..3f00d264fd 100644 --- a/mobile/lib/services/entity_service.dart +++ b/mobile/lib/services/entity_service.dart @@ -56,14 +56,13 @@ class EntityService { Future addOrUpdate( EntityType type, - String plainText, { + Map jsonMap, { String? id, }) async { + final String plainText = jsonEncode(jsonMap); final key = await getOrCreateEntityKey(type); - final encryptedKeyData = await CryptoUtil.encryptChaCha( - utf8.encode(plainText), - key, - ); + final encryptedKeyData = + await CryptoUtil.encryptChaCha(utf8.encode(plainText), key); final String encryptedData = CryptoUtil.bin2base64(encryptedKeyData.encryptedData!); final String header = CryptoUtil.bin2base64(encryptedKeyData.header!); diff --git a/mobile/lib/services/location_service.dart b/mobile/lib/services/location_service.dart index f31a2803f6..f929dca525 100644 --- a/mobile/lib/services/location_service.dart +++ b/mobile/lib/services/location_service.dart @@ -90,7 +90,7 @@ class LocationService { centerPoint: centerPoint, ); await EntityService.instance - .addOrUpdate(EntityType.location, json.encode(locationTag.toJson())); + .addOrUpdate(EntityType.location, locationTag.toJson()); Bus.instance.fire(LocationTagUpdatedEvent(LocTagEventType.add)); } catch (e, s) { _logger.severe("Failed to add location tag", e, s); @@ -179,7 +179,7 @@ class LocationService { await EntityService.instance.addOrUpdate( EntityType.location, - json.encode(updatedLoationTag.toJson()), + updatedLoationTag.toJson(), id: locationTagEntity.id, ); Bus.instance.fire( diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 187e51faf6..9a94b28160 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -95,11 +95,7 @@ class PersonService { ) .toList(); entityService - .addOrUpdate( - EntityType.person, - json.encode(personData.toJson()), - id: personID, - ) + .addOrUpdate(EntityType.person, personData.toJson(), id: personID) .ignore(); personData.logStats(); } @@ -168,7 +164,7 @@ class PersonService { ); final result = await entityService.addOrUpdate( EntityType.person, - json.encode(data.toJson()), + data.toJson(), ); await faceMLDataDB.assignClusterToPerson( personID: result.id, @@ -186,7 +182,7 @@ class PersonService { personData.assigned!.removeWhere((element) => element.id != clusterID); await entityService.addOrUpdate( EntityType.person, - json.encode(personData.toJson()), + personData.toJson(), id: personID, ); await faceMLDataDB.removeClusterToPerson( @@ -221,7 +217,7 @@ class PersonService { await entityService.addOrUpdate( EntityType.person, - json.encode(personData.toJson()), + personData.toJson(), id: person.remoteID, ); personData.logStats(); @@ -237,7 +233,7 @@ class PersonService { PersonEntity(personID, PersonData(name: entity.data.name)); await entityService.addOrUpdate( EntityType.person, - json.encode(justName.data.toJson()), + justName.data.toJson(), id: personID, ); await faceMLDataDB.removePerson(personID); @@ -312,7 +308,7 @@ class PersonService { Future _updatePerson(PersonEntity updatePerson) async { await entityService.addOrUpdate( EntityType.person, - json.encode(updatePerson.data.toJson()), + updatePerson.data.toJson(), id: updatePerson.remoteID, ); updatePerson.data.logStats(); From 82b8658268271ebff2a518f206548f293c3f950e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 08:45:00 +0530 Subject: [PATCH 0236/1179] lint-fix --- .../src/components/Search/SearchBar/searchInput/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx index 80a863b62e..1317464b49 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx @@ -1,5 +1,6 @@ import { FileType } from "@/media/file-type"; import { isMLEnabled } from "@/new/photos/services/ml"; +import type { SearchPerson } from "@/new/photos/services/search"; import { EnteFile } from "@/new/photos/types/file"; import CloseIcon from "@mui/icons-material/Close"; import { IconButton } from "@mui/material"; @@ -18,7 +19,6 @@ import { } from "services/searchService"; import { Collection } from "types/collection"; import { LocationTagData } from "types/entity"; -import type { SearchPerson } from "@/new/photos/services/search"; import { ClipSearchScores, DateValue, From d5d0e98197e9728ed7234f4b95302c3495358307 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 09:11:56 +0530 Subject: [PATCH 0237/1179] Person --- .../new/photos/services/user-entity.ts | 86 +++++++++++++------ 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index b78f246120..c695be5b93 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,5 +1,6 @@ import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; +import { getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; import { z } from "zod"; @@ -51,6 +52,10 @@ const defaultDiffLimit = 500; * expected to be associated with this entity type. */ interface UserEntity { + /** + * A UUID or nanoid for the entity. + */ + id: string; /** * Arbitrary data associated with the entity. The format of this data is * specific to each entity type. @@ -65,6 +70,7 @@ interface UserEntity { } const RemoteUserEntity = z.object({ + id: z.string(), /** Base64 string containing the encrypted contents of the entity. */ encryptedData: z.string(), /** Base64 string containing the decryption header. */ @@ -74,8 +80,8 @@ const RemoteUserEntity = z.object({ }); /** - * Fetch all user entities of the given type that have been created or updated - * since the given time. + * Fetch the next batch of user entities of the given type that have been + * created or updated since the given time. * * @param type The type of the entities to fetch. * @@ -113,7 +119,8 @@ export const userEntityDiff = async ( .parse(await res.json()).diff; return Promise.all( entities.map( - async ({ encryptedData, header, isDeleted, updatedAt }) => ({ + async ({ id, encryptedData, header, isDeleted, updatedAt }) => ({ + id, data: isDeleted ? undefined : await decrypt(encryptedData, header), @@ -123,6 +130,43 @@ export const userEntityDiff = async ( ); }; +/** + * Sync the {@link Person} entities that we have locally with remote. + * + * This fetches all the user entities corresponding to the "person_v2" entity + * type from remote that have been created, updated or deleted since the last + * time we checked. This diff is then applied to the data we have persisted + * locally. + */ +export const personDiff = async ( + entityKeyB64: string, +): Promise => { + const sinceTime = 0; + + const parse = (data: Uint8Array) => + RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); + + const result: RemotePerson[] = []; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition + while (true) { + const entities = await userEntityDiff("person", 0, entityKeyB64); + if (entities.length == 0) break; + + const latestUpdatedAt = entities.reduce( + (max, e) => Math.max(max, e.updatedAt), + sinceTime, + ); + + const people = entities + .map(({ data }) => (data ? parse(data) : undefined)) + .filter((p) => !!p); + // TODO-Cluster + console.log({ latestUpdatedAt, people }); + return people; + } + return result; +}; + /** * Zod schema for the "person" entity (the {@link RemotePerson} type). */ @@ -140,27 +184,21 @@ const RemotePerson = z.object({ /** * A "person" entity as synced via remote. */ -export type RemotePerson = z.infer; +type RemotePerson = z.infer; + +const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; /** - * Fetch all Person entities that have been created or updated since the last - * time we checked. + * Return the locally persisted value for the latest `updatedAt` time for the + * given entity type. + * + * This is used to checkpoint diffs, so that we can resume fetching from the + * last time we did a fetch. */ -export const personDiff = async ( - entityKeyB64: string, -): Promise => { - const sinceTime = 0; - const entities = await userEntityDiff("person", 0, entityKeyB64); - const latestUpdatedAt = entities.reduce( - (max, e) => Math.max(max, e.updatedAt), - sinceTime, - ); - const parse = (data: Uint8Array) => - RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); - const people = entities - .map(({ data }) => (data ? parse(data) : undefined)) - .filter((p) => !!p); - // TODO-Cluster - console.log({ latestUpdatedAt, people }); - return people; -}; +const latestUpdatedAt = (type: EntityType) => getKVN(latestUpdatedAtKey(type)); + +/** + * Setter for {@link latestUpdatedAt}. + */ +const setLatestUpdatedAt = (type: EntityType, value: number) => + setKV(latestUpdatedAtKey(type), value); From 1314b8ccbb3d298975a7d21792940dd79dcbbc5e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 09:48:08 +0530 Subject: [PATCH 0238/1179] sync 2 --- web/apps/photos/src/services/searchService.ts | 4 +- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/db.ts | 43 +++++++++++++++++++ .../new/photos/services/user-entity.ts | 43 +++++++++++-------- 4 files changed, 70 insertions(+), 22 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index f9507bd675..4ece8ab439 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -10,7 +10,7 @@ import { wipClusterEnable, } from "@/new/photos/services/ml"; import type { SearchPerson } from "@/new/photos/services/search"; -import { personDiff } from "@/new/photos/services/user-entity"; +import { syncPersons } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; import * as chrono from "chrono-node"; import { t } from "i18next"; @@ -421,7 +421,7 @@ async function getAllPeople(limit: number = undefined) { if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { const entityKey = await getEntityKey("person" as EntityType); - const peopleR = await personDiff(entityKey.data); + const peopleR = await syncPersons(entityKey.data); const r = peopleR.length; log.debug(() => ["people", peopleR]); diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 9bf342bab9..9953e474b8 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -60,7 +60,7 @@ export interface Person { * The ID of the face that should be used as the display face, to represent * this person in the UI. */ - avatarFaceID: string; + avatarFaceID: string | undefined; } /** diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index be35790591..4b8d621370 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -444,12 +444,55 @@ export const setFaceClusters = async (clusters: FaceCluster[]) => { return tx.done; }; +/** + * Update the person store to reflect the given changes, in order. + * + * @param changes A list of changes to apply. Each entry is either + * + * - A string, in which case the person with the given string as their ID + * should be deleted from the store, or + * + * - A person, in which case it should add or overwrite the entry for the + * corresponding person (as identified by their {@link id}). + */ +export const applyPersonDiff = async (changes: (string | Person)[]) => { + const db = await mlDB(); + const tx = db.transaction("person", "readwrite"); + // We want to do the changes in order, so we shouldn't use Promise.all. + for (const change of changes) { + await (typeof change == "string" + ? tx.store.delete(change) + : tx.store.put(change)); + } + return tx.done; +}; + +/** + * Add or overwrite the entry for the given {@link person}, as identified by + * their {@link id}. + */ +export const savePerson = async (person: Person) => { + const db = await mlDB(); + const tx = db.transaction("person", "readwrite"); + await Promise.all([tx.store.put(person), tx.done]); +}; + +/** + * Delete the entry for the persons with the given {@link id}, if any. + */ +export const deletePerson = async (id: string) => { + const db = await mlDB(); + const tx = db.transaction("person", "readwrite"); + await Promise.all([tx.store.delete(id), tx.done]); +}; + /** * Replace the persons stored locally with the given ones. * * This function deletes all entries from the person object store, and then * inserts the given {@link persons} into it. */ +// TODO-Cluster: Remove me export const setPersons = async (persons: Person[]) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index c695be5b93..c952c61f40 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -3,6 +3,8 @@ import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; import { z } from "zod"; +import type { Person } from "./ml/cluster-new"; +import { applyPersonDiff } from "./ml/db"; /** * User entities are predefined lists of otherwise arbitrary data that the user @@ -135,36 +137,39 @@ export const userEntityDiff = async ( * * This fetches all the user entities corresponding to the "person_v2" entity * type from remote that have been created, updated or deleted since the last - * time we checked. This diff is then applied to the data we have persisted - * locally. + * time we checked. + * + * This diff is then applied to the data we have persisted locally. */ -export const personDiff = async ( - entityKeyB64: string, -): Promise => { - const sinceTime = 0; +export const syncPersons = async (entityKeyB64: string) => { + const type: EntityType = "person"; - const parse = (data: Uint8Array) => - RemotePerson.parse(JSON.parse(new TextDecoder().decode(data))); + const parse = ({ id, data }: UserEntity): Person => { + const rp = RemotePerson.parse( + JSON.parse(new TextDecoder().decode(data)), + ); + return { + id, + name: rp.name, + clusterIDs: rp.assigned.map(({ id }) => id), + avatarFaceID: undefined, + }; + }; - const result: RemotePerson[] = []; + let sinceTime = (await latestUpdatedAt(type)) ?? 0; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition while (true) { - const entities = await userEntityDiff("person", 0, entityKeyB64); + const entities = await userEntityDiff(type, sinceTime, entityKeyB64); if (entities.length == 0) break; - const latestUpdatedAt = entities.reduce( + await applyPersonDiff(entities.map((e) => (e.data ? parse(e) : e.id))); + + sinceTime = entities.reduce( (max, e) => Math.max(max, e.updatedAt), sinceTime, ); - - const people = entities - .map(({ data }) => (data ? parse(data) : undefined)) - .filter((p) => !!p); - // TODO-Cluster - console.log({ latestUpdatedAt, people }); - return people; + await setLatestUpdatedAt(type, sinceTime); } - return result; }; /** From 9d48fa4a507f211d64543c9769f995c4272a417f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:22:57 +0530 Subject: [PATCH 0239/1179] [server] Send 5xx if query to validate token fails --- server/pkg/middleware/auth.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/pkg/middleware/auth.go b/server/pkg/middleware/auth.go index 9c4bb22808..5adeaf0567 100644 --- a/server/pkg/middleware/auth.go +++ b/server/pkg/middleware/auth.go @@ -1,7 +1,10 @@ package middleware import ( + "database/sql" + "errors" "fmt" + "github.com/sirupsen/logrus" "net/http" "strconv" @@ -48,6 +51,11 @@ func (m *AuthMiddleware) TokenAuthMiddleware(jwtClaimScope *jwt.ClaimScope) gin. userID, err = m.UserController.ValidateJWTToken(token, *jwtClaimScope) } else { userID, err = m.UserAuthRepo.GetUserIDWithToken(token, app) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + logrus.Errorf("Failed to validate token: %s", err) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "failed to validate token"}) + return + } } if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"}) From 04343b2a6c948f08621aa14f1f47d91e6c485468 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:43:18 +0530 Subject: [PATCH 0240/1179] [server] Add auth key validation --- server/ente/errors.go | 2 ++ .../controller/authenticator/controller.go | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/server/ente/errors.go b/server/ente/errors.go index 528a92317b..effeaee252 100644 --- a/server/ente/errors.go +++ b/server/ente/errors.go @@ -178,6 +178,8 @@ const ( FileNotFoundInAlbum ErrorCode = "FILE_NOT_FOUND_IN_ALBUM" + AuthKeyNotCreated ErrorCode = "AUTH_KEY_NOT_CREATED" + // PublicCollectDisabled error code indicates that the user has not enabled public collect PublicCollectDisabled ErrorCode = "PUBLIC_COLLECT_DISABLED" diff --git a/server/pkg/controller/authenticator/controller.go b/server/pkg/controller/authenticator/controller.go index a89b5047f0..f42d2deafd 100644 --- a/server/pkg/controller/authenticator/controller.go +++ b/server/pkg/controller/authenticator/controller.go @@ -1,11 +1,14 @@ package authenticaor import ( + "errors" + "github.com/ente-io/museum/ente" model "github.com/ente-io/museum/ente/authenticator" "github.com/ente-io/museum/pkg/repo/authenticator" "github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/stacktrace" "github.com/google/uuid" + "net/http" "github.com/gin-gonic/gin" ) @@ -33,6 +36,9 @@ func (c *Controller) GetKey(ctx *gin.Context) (*model.Key, error) { // CreateEntity... func (c *Controller) CreateEntity(ctx *gin.Context, req model.CreateEntityRequest) (*model.Entity, error) { + if err := c.validateKey(ctx); err != nil { + return nil, stacktrace.Propagate(err, "failed to validateKey") + } userID := auth.GetUserID(ctx.Request.Header) id, err := c.Repo.Create(ctx, userID, req) if err != nil { @@ -47,10 +53,27 @@ func (c *Controller) CreateEntity(ctx *gin.Context, req model.CreateEntityReques // UpdateEntity... func (c *Controller) UpdateEntity(ctx *gin.Context, req model.UpdateEntityRequest) error { + if err := c.validateKey(ctx); err != nil { + return stacktrace.Propagate(err, "failed to validateKey") + } userID := auth.GetUserID(ctx.Request.Header) + return c.Repo.Update(ctx, userID, req) } +func (c *Controller) validateKey(ctx *gin.Context) error { + userID := auth.GetUserID(ctx.Request.Header) + _, err := c.Repo.GetKey(ctx, userID) + if err != nil && errors.Is(err, &ente.ErrNotFoundError) { + return stacktrace.Propagate(&ente.ApiError{ + Code: ente.AuthKeyNotCreated, + Message: "AuthKey is not created", + HttpStatusCode: http.StatusBadRequest, + }, "") + } + return err +} + // Delete... func (c *Controller) Delete(ctx *gin.Context, entityID uuid.UUID) (bool, error) { userID := auth.GetUserID(ctx.Request.Header) @@ -59,6 +82,9 @@ func (c *Controller) Delete(ctx *gin.Context, entityID uuid.UUID) (bool, error) // GetDiff... func (c *Controller) GetDiff(ctx *gin.Context, req model.GetEntityDiffRequest) ([]model.Entity, error) { + if err := c.validateKey(ctx); err != nil { + return nil, stacktrace.Propagate(err, "failed to validateKey") + } userID := auth.GetUserID(ctx.Request.Header) return c.Repo.GetDiff(ctx, userID, *req.SinceTime, req.Limit) } From bc43d3b461da1ff661f5abe383891f79f15de4e8 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:52:51 +0530 Subject: [PATCH 0241/1179] Update avatar faceID key --- mobile/lib/face/model/person.dart | 12 ++++++------ .../ui/viewer/search/result/person_face_widget.dart | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mobile/lib/face/model/person.dart b/mobile/lib/face/model/person.dart index 7536d3b0a6..49754be925 100644 --- a/mobile/lib/face/model/person.dart +++ b/mobile/lib/face/model/person.dart @@ -49,12 +49,12 @@ class ClusterInfo { class PersonData { final String name; final bool isHidden; - String? avatarFaceId; + String? avatarFaceID; List? assigned = List.empty(); List? rejected = List.empty(); final String? birthDate; - bool hasAvatar() => avatarFaceId != null; + bool hasAvatar() => avatarFaceID != null; bool get isIgnored => (name.isEmpty || name == '(hidden)' || name == '(ignored)'); @@ -63,7 +63,7 @@ class PersonData { required this.name, this.assigned, this.rejected, - this.avatarFaceId, + this.avatarFaceID, this.isHidden = false, this.birthDate, }); @@ -79,7 +79,7 @@ class PersonData { return PersonData( name: name ?? this.name, assigned: assigned ?? this.assigned, - avatarFaceId: avatarFaceId ?? this.avatarFaceId, + avatarFaceID: avatarFaceId ?? this.avatarFaceID, isHidden: isHidden ?? this.isHidden, birthDate: birthDate ?? this.birthDate, ); @@ -109,7 +109,7 @@ class PersonData { 'name': name, 'assigned': assigned?.map((e) => e.toJson()).toList(), 'rejected': rejected?.map((e) => e.toJson()).toList(), - 'avatarFaceId': avatarFaceId, + 'avatarFaceID': avatarFaceID, 'isHidden': isHidden, 'birthDate': birthDate, }; @@ -131,7 +131,7 @@ class PersonData { name: json['name'] as String, assigned: assigned, rejected: rejected, - avatarFaceId: json['avatarFaceId'] as String?, + avatarFaceID: json['avatarFaceId'] as String?, isHidden: json['isHidden'] as bool? ?? false, birthDate: json['birthDate'] as String?, ); diff --git a/mobile/lib/ui/viewer/search/result/person_face_widget.dart b/mobile/lib/ui/viewer/search/result/person_face_widget.dart index dda445b862..eea17134b2 100644 --- a/mobile/lib/ui/viewer/search/result/person_face_widget.dart +++ b/mobile/lib/ui/viewer/search/result/person_face_widget.dart @@ -83,7 +83,7 @@ class PersonFaceWidget extends StatelessWidget { final PersonEntity? personEntity = await PersonService.instance.getPerson(personId!); if (personEntity != null) { - personAvatarFaceID = personEntity.data.avatarFaceId; + personAvatarFaceID = personEntity.data.avatarFaceID; } } return await FaceMLDataDB.instance.getCoverFaceForPerson( From 1eea5ffab1a08733fb678d83353d40e6e5d0cb97 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:09:03 +0530 Subject: [PATCH 0242/1179] [mob] Switch to 20MB for multipart upload --- mobile/lib/core/constants.dart | 1 - mobile/lib/module/upload/service/multipart.dart | 3 --- 2 files changed, 4 deletions(-) diff --git a/mobile/lib/core/constants.dart b/mobile/lib/core/constants.dart index 3918541b5a..9060f2329a 100644 --- a/mobile/lib/core/constants.dart +++ b/mobile/lib/core/constants.dart @@ -43,7 +43,6 @@ const supportEmail = 'support@ente.io'; // this is the chunk size of the un-encrypted file which is read and encrypted before uploading it as a single part. const multipartPartSize = 20 * 1024 * 1024; -const multipartPartSizeInternal = 8 * 1024 * 1024; const kDefaultProductionEndpoint = 'https://api.ente.io'; diff --git a/mobile/lib/module/upload/service/multipart.dart b/mobile/lib/module/upload/service/multipart.dart index ad0d19703a..a293eeb772 100644 --- a/mobile/lib/module/upload/service/multipart.dart +++ b/mobile/lib/module/upload/service/multipart.dart @@ -51,9 +51,6 @@ class MultiPartUploader { } int get multipartPartSizeForUpload { - if (_featureFlagService.internalUser) { - return multipartPartSizeInternal; - } return multipartPartSize; } From 7ba4aebf8620382a84b3f30634409a8a9045445d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:09:43 +0530 Subject: [PATCH 0243/1179] [mob] Add toggle button to enable multipart upload --- mobile/ios/Podfile.lock | 6 +++++ mobile/ios/Runner.xcodeproj/project.pbxproj | 2 ++ mobile/lib/generated/intl/messages_de.dart | 4 ++-- mobile/lib/generated/intl/messages_en.dart | 2 ++ mobile/lib/generated/intl/messages_pl.dart | 6 ++--- mobile/lib/generated/intl/messages_pt.dart | 8 +++---- mobile/lib/generated/l10n.dart | 10 +++++++++ mobile/lib/l10n/intl_en.arb | 1 + .../ui/settings/advanced_settings_screen.dart | 22 +++++++++++++++++++ mobile/lib/utils/local_settings.dart | 9 ++++++++ 10 files changed, 61 insertions(+), 9 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index ad83ed9c70..01dabef813 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -140,6 +140,8 @@ PODS: - Mantle (2.2.0): - Mantle/extobjc (= 2.2.0) - Mantle/extobjc (2.2.0) + - maps_launcher (0.0.1): + - Flutter - media_extension (0.0.1): - Flutter - media_kit_libs_ios_video (1.0.4): @@ -267,6 +269,7 @@ DEPENDENCIES: - integration_test (from `.symlinks/plugins/integration_test/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) + - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) - media_extension (from `.symlinks/plugins/media_extension/ios`) - media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`) - media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`) @@ -374,6 +377,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/local_auth_darwin/darwin" local_auth_ios: :path: ".symlinks/plugins/local_auth_ios/ios" + maps_launcher: + :path: ".symlinks/plugins/maps_launcher/ios" media_extension: :path: ".symlinks/plugins/media_extension/ios" media_kit_libs_ios_video: @@ -467,6 +472,7 @@ SPEC CHECKSUMS: local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d + maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203 media_extension: 6d30dc1431ebaa63f43c397c37917b1a0a597a4c media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1 media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 1414f8d947..462c4f3582 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -314,6 +314,7 @@ "${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework", "${BUILT_PRODUCTS_DIR}/local_auth_darwin/local_auth_darwin.framework", "${BUILT_PRODUCTS_DIR}/local_auth_ios/local_auth_ios.framework", + "${BUILT_PRODUCTS_DIR}/maps_launcher/maps_launcher.framework", "${BUILT_PRODUCTS_DIR}/media_extension/media_extension.framework", "${BUILT_PRODUCTS_DIR}/media_kit_libs_ios_video/media_kit_libs_ios_video.framework", "${BUILT_PRODUCTS_DIR}/media_kit_native_event_loop/media_kit_native_event_loop.framework", @@ -408,6 +409,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_darwin.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth_ios.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/maps_launcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_extension.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_kit_libs_ios_video.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/media_kit_native_event_loop.framework", diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index feed2c27a5..d86cc2800f 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -825,9 +825,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zugriff gewähren"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Fotos in der Nähe gruppieren"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Gastansicht"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index d22cdd7ecc..e99a8045eb 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -659,6 +659,8 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Enable Maps"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "This will show your photos on a world map.\n\nThis map is hosted by Open Street Map, and the exact locations of your photos are never shared.\n\nYou can disable this feature anytime from Settings."), + "enableMultiPartUpload": + MessageLookupByLibrary.simpleMessage("Enable multi-part upload"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Encrypting backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Encryption"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 46bebdd3d6..54b76e07cd 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -752,7 +752,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToRenew": MessageLookupByLibrary.simpleMessage("Nie udało się odnowić"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( - "Nie udało się zweryfikować statusu płatności"), + "Nie udało się zweryfikować stanu płatności"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( "Dodaj 5 członków rodziny do istniejącego planu bez dodatkowego płacenia.\n\nKażdy członek otrzymuje własną przestrzeń prywatną i nie widzi wzajemnie swoich plików, chyba że są one udostępnione.\n\nPlany rodzinne są dostępne dla klientów, którzy mają płatną subskrypcję Ente.\n\nSubskrybuj teraz, aby rozpocząć!"), "familyPlanPortalTitle": @@ -818,9 +818,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Przyznaj uprawnienie"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Grupuj pobliskie zdjęcia"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Widok gościa"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index a628a8637b..9c5b8d3f92 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -673,7 +673,7 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Esvaziar"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), - "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar mapa"), + "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), "encryptingBackup": @@ -817,9 +817,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conceder permissão"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Agrupar fotos próximas"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Visão de convidado"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1221,7 +1221,7 @@ class MessageLookup extends MessageLookupByLibrary { "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Indique amigos e 2x seu plano"), "referralStep1": MessageLookupByLibrary.simpleMessage( - "Envie esse código aos seus amigos"), + "1. Dê este código aos seus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscrevem em um plano pago"), "referralStep3": m44, diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 7cb3716b4d..b1cf410bc0 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -7965,6 +7965,16 @@ class S { ); } + /// `Enable multi-part upload` + String get enableMultiPartUpload { + return Intl.message( + 'Enable multi-part upload', + name: 'enableMultiPartUpload', + desc: '', + args: [], + ); + } + /// `Add to hidden album` String get addToHiddenAlbum { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index f7f842f493..8d43340f72 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1143,6 +1143,7 @@ "successfullyHid": "Successfully hid", "successfullyUnhid": "Successfully unhid", "crashReporting": "Crash reporting", + "enableMultiPartUpload": "Enable multi-part upload", "addToHiddenAlbum": "Add to hidden album", "moveToHiddenAlbum": "Move to hidden album", "fileTypes": "File types", diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index 2a8733bc00..049d17f576 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -195,6 +195,28 @@ class _AdvancedSettingsScreenState extends State { const SizedBox( height: 24, ), + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).enableMultiPartUpload, + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + trailingWidget: ToggleSwitchWidget( + value: () => LocalSettings + .instance.userEnabledMultiplePart, + onChanged: () async { + await LocalSettings.instance + .setUserEnabledMultiplePart( + !LocalSettings + .instance.userEnabledMultiplePart, + ); + }, + ), + ), + const SizedBox( + height: 24, + ), MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).crashReporting, diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index 6b81e76971..3607a6ea65 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -17,6 +17,7 @@ class LocalSettings { static const kEnableFaceIndexing = "enable_face_indexing"; static const kEnableFaceClustering = "enable_face_clustering"; static const kRateUsShownCount = "rate_us_shown_count"; + static const kEnableMultiplePart = "ls.enable_multiple_part"; static const kRateUsPromptThreshold = 2; late SharedPreferences _prefs; @@ -75,6 +76,14 @@ class LocalSettings { bool get isFaceIndexingEnabled => _prefs.getBool(kEnableFaceIndexing) ?? false; + bool get userEnabledMultiplePart => + _prefs.getBool(kEnableMultiplePart) ?? false; + + Future setUserEnabledMultiplePart(bool value) async { + await _prefs.setBool(kEnableMultiplePart, value); + return value; + } + bool get isFaceClusteringEnabled => _prefs.getBool(kEnableFaceIndexing) ?? false; From 050bbfbbb351509b96bf289819ebb97c2d7bee73 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 10:56:17 +0530 Subject: [PATCH 0244/1179] Discussion --- .../new/photos/services/ml/cluster-new.ts | 61 ++++++++++++++++--- .../new/photos/services/user-entity.ts | 23 ++++++- 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 9953e474b8..93d87e3fed 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -8,11 +8,11 @@ import { dotProduct } from "./math"; /** * A face cluster is an set of faces. * - * Each cluster has an id so that a Person (a set of clusters) can refer to it. + * Each cluster has an id so that a {@link Person} can refer to it. * - * The cluster is not directly synced to remote. But it can indirectly get - * synced if it gets attached to a person (which can be thought of as a named - * cluster). + * The cluster is not directly synced to remote. But it does indirectly get + * synced if it gets promoted or attached to a person (which can be thought of + * as a named or hidden clusters). */ export interface FaceCluster { /** @@ -29,13 +29,26 @@ export interface FaceCluster { } /** - * A Person is a set of clusters and some attached metadata. + * A Person is a set of clusters with some attached metadata. * - * For ease of transportation, the Person entity on remote is something like + * More precisely, a person is a a single cluster or a set of clusters that the + * user has interacted with. + * + * The most frequent interaction is naming a {@link FaceCluster}, which promotes + * it to a become a {@link Person}. The promotion comes with the ability to be + * synced with remote (as a "person_v2" user entity). + * + * There after, the user may attach more clusters to the same {@link Person}. + * + * The other form of interaction is hiding. The user may hide a single (unnamed) + * cluster, or they may hide a person. + * + * The Person entity on remote has clusters embedded within itself * * { name, clusters: [{ clusterID, faceIDs }] } * - * That is, the Person has the clusters embedded within itself. + * Since clusters don't get independently synced, one way to think about a + * Person is that it is an interaction with a cluster that we want to sync. */ export interface Person { /** @@ -47,8 +60,21 @@ export interface Person { id: string; /** * A name assigned by the user to this person. + * + * This can be missing or an empty string for an unnamed cluster that was + * hidden. */ - name: string; + name: string | undefined; + /** + * True if this person should be hidden. + * + * This can also be true for unnamed hidden clusters. When the user hides a + * single cluster that was offered as a suggestion to them on a client, then + * the client will create a new person entity without a name, and set its + * hidden flag to sync it with remote (so that other clients can also stop + * showing this cluster). + */ + isHidden: boolean; /** * An unordered set of ids of the clusters that belong to this person. * @@ -57,10 +83,15 @@ export interface Person { */ clusterIDs: string[]; /** - * The ID of the face that should be used as the display face, to represent - * this person in the UI. + * The ID of the face that should be used as the cover photo for this person + * (if the user has set one). */ avatarFaceID: string | undefined; + /** + * Locally determined ID of the "best" face that should be used as the + * display face, to represent this person in the UI. + */ + displayFaceID: string | undefined; } /** @@ -90,6 +121,16 @@ export interface Person { * - They can attach more clusters to a person. * * - They can remove a cluster from a person. + * + * After clustering, we also do some routine cleanup. Faces belonging to files + * that have been deleted (including those in Trash) should be pruned off. + * + * We should not make strict assumptions about the clusters we get from remote. + * In particular, the same face ID can be in different clusters. In such cases + * we should assign it arbitrarily assign it to the last cluster we find it in. + * Such leeway is intentionally provided to allow clients some slack in how they + * implement the sync without making an blocking API request for every user + * interaction. */ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index c952c61f40..6fc1fcb0ee 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -2,6 +2,7 @@ import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; +import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import type { Person } from "./ml/cluster-new"; import { applyPersonDiff } from "./ml/db"; @@ -93,6 +94,24 @@ const RemoteUserEntity = z.object({ * * @param entityKeyB64 The base64 encoded key to use for decrypting the * encrypted contents of the user entity. + * + * [Note: Diff contents] + * + * Unlike git diffs which track all changes, the diffs we get from remote are + * guaranteed to contain only one entry (upsert or delete) for particular Ente + * object. This holds true irrespective of the diff limit. + * + * For example, in the user entity diff response, it is guaranteed that there + * will only be at max one entry for a particular entity id. The entry will have + * no data to indicate that the corresponding entity was deleted. Otherwise, + * when the data is present, it is taken as the creation of a new entity or the + * updation of an existing one. + * + * This behaviour comes from how remote stores the underlying, e.g., entities. A + * diff returns just entities whose updation times greater than the provided + * since time (limited to the given diff limit). So there will be at most one + * row for a particular entity id. And if that entity has been deleted, then the + * row will be a tombstone so data will be not be present. */ export const userEntityDiff = async ( type: EntityType, @@ -176,7 +195,7 @@ export const syncPersons = async (entityKeyB64: string) => { * Zod schema for the "person" entity (the {@link RemotePerson} type). */ const RemotePerson = z.object({ - name: z.string(), + name: z.string().nullish().transform(nullToUndefined), assigned: z.array( z.object({ // TODO-Cluster temporary modify @@ -184,6 +203,8 @@ const RemotePerson = z.object({ faces: z.string().array(), }), ), + isHidden: z.boolean(), + avatarFaceID: z.string().nullish().transform(nullToUndefined), }); /** From ad156bc33af83b8f580224e03fa8dd15094ee321 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 11:16:26 +0530 Subject: [PATCH 0245/1179] Diff --- web/packages/new/photos/services/ml/db.ts | 18 ++++++++++-------- .../new/photos/services/user-entity.ts | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 4b8d621370..14bd0a58f9 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -447,7 +447,7 @@ export const setFaceClusters = async (clusters: FaceCluster[]) => { /** * Update the person store to reflect the given changes, in order. * - * @param changes A list of changes to apply. Each entry is either + * @param diff A list of changes to apply. Each entry is either * * - A string, in which case the person with the given string as their ID * should be deleted from the store, or @@ -455,15 +455,15 @@ export const setFaceClusters = async (clusters: FaceCluster[]) => { * - A person, in which case it should add or overwrite the entry for the * corresponding person (as identified by their {@link id}). */ -export const applyPersonDiff = async (changes: (string | Person)[]) => { +export const applyPersonDiff = async (diff: (string | Person)[]) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); - // We want to do the changes in order, so we shouldn't use Promise.all. - for (const change of changes) { - await (typeof change == "string" - ? tx.store.delete(change) - : tx.store.put(change)); - } + // See: [Note: Diff response will have at most one entry for an id] + await Promise.all( + diff.map((d) => + typeof d == "string" ? tx.store.delete(d) : tx.store.put(d), + ), + ); return tx.done; }; @@ -471,6 +471,7 @@ export const applyPersonDiff = async (changes: (string | Person)[]) => { * Add or overwrite the entry for the given {@link person}, as identified by * their {@link id}. */ +// TODO-Cluster: Remove me export const savePerson = async (person: Person) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); @@ -480,6 +481,7 @@ export const savePerson = async (person: Person) => { /** * Delete the entry for the persons with the given {@link id}, if any. */ +// TODO-Cluster: Remove me export const deletePerson = async (id: string) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 6fc1fcb0ee..f4e171559d 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -95,7 +95,7 @@ const RemoteUserEntity = z.object({ * @param entityKeyB64 The base64 encoded key to use for decrypting the * encrypted contents of the user entity. * - * [Note: Diff contents] + * [Note: Diff response will have at most one entry for an id] * * Unlike git diffs which track all changes, the diffs we get from remote are * guaranteed to contain only one entry (upsert or delete) for particular Ente From 7b402e46bd23160f62c582c19de92ccf60de7197 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:20:30 +0530 Subject: [PATCH 0246/1179] [mob] Control the enable multipart option via feature flag --- mobile/lib/module/upload/service/multipart.dart | 7 ++++--- mobile/lib/ui/settings/advanced_settings_screen.dart | 9 ++++++--- mobile/plugins/ente_feature_flag/lib/src/model.dart | 6 ++++++ mobile/plugins/ente_feature_flag/lib/src/service.dart | 2 ++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mobile/lib/module/upload/service/multipart.dart b/mobile/lib/module/upload/service/multipart.dart index a293eeb772..4c8eb6f70b 100644 --- a/mobile/lib/module/upload/service/multipart.dart +++ b/mobile/lib/module/upload/service/multipart.dart @@ -11,6 +11,7 @@ import "package:photos/module/upload/model/multipart.dart"; import "package:photos/module/upload/model/xml.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/utils/crypto_util.dart"; +import "package:photos/utils/local_settings.dart"; class MultiPartUploader { final Dio _enteDio; @@ -55,9 +56,9 @@ class MultiPartUploader { } Future calculatePartCount(int fileSize) async { - // Multipart upload is only enabled for internal users - // and debug builds till it's battle tested. - if (!_featureFlagService.internalUser) return 1; + // If the feature flag is disabled, return 1 + if (!_featureFlagService.enableMobMultiPart) return 1; + if (!LocalSettings.instance.userEnabledMultiplePart) return 1; final partCount = (fileSize / multipartPartSizeForUpload).ceil(); return partCount; diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index 049d17f576..f53efd8232 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -3,6 +3,7 @@ import "dart:async"; import 'package:flutter/material.dart'; import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/memories_service.dart"; import "package:photos/services/user_remote_flag_service.dart"; import 'package:photos/theme/ente_theme.dart'; @@ -192,9 +193,11 @@ class _AdvancedSettingsScreenState extends State { }, ), ), - const SizedBox( - height: 24, - ), + if (flagService.enableMobMultiPart) + const SizedBox( + height: 24, + ), + if (flagService.enableMobMultiPart) MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).enableMultiPartUpload, diff --git a/mobile/plugins/ente_feature_flag/lib/src/model.dart b/mobile/plugins/ente_feature_flag/lib/src/model.dart index 49b2921489..f3637728e5 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/model.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/model.dart @@ -12,6 +12,7 @@ class RemoteFlags { final bool recoveryKeyVerified; final bool internalUser; final bool betaUser; + final bool enableMobMultiPart; RemoteFlags({ required this.enableStripe, @@ -22,6 +23,7 @@ class RemoteFlags { required this.recoveryKeyVerified, required this.internalUser, required this.betaUser, + required this.enableMobMultiPart, }); static RemoteFlags defaultValue = RemoteFlags( @@ -33,6 +35,7 @@ class RemoteFlags { recoveryKeyVerified: false, internalUser: kDebugMode, betaUser: kDebugMode, + enableMobMultiPart: false, ); String toJson() => json.encode(toMap()); @@ -46,6 +49,7 @@ class RemoteFlags { 'recoveryKeyVerified': recoveryKeyVerified, 'internalUser': internalUser, 'betaUser': betaUser, + 'enableMobMultiPart': enableMobMultiPart, }; } @@ -61,6 +65,8 @@ class RemoteFlags { map['recoveryKeyVerified'] ?? defaultValue.recoveryKeyVerified, internalUser: map['internalUser'] ?? defaultValue.internalUser, betaUser: map['betaUser'] ?? defaultValue.betaUser, + enableMobMultiPart: + map['enableMobMultiPart'] ?? defaultValue.enableMobMultiPart, ); } } diff --git a/mobile/plugins/ente_feature_flag/lib/src/service.dart b/mobile/plugins/ente_feature_flag/lib/src/service.dart index ce90352030..4177b9debf 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/service.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/service.dart @@ -72,4 +72,6 @@ class FlagService { bool get passKeyEnabled => flags.passKeyEnabled || internalOrBetaUser; bool get recoveryKeyVerified => flags.recoveryKeyVerified; + + bool get enableMobMultiPart => flags.enableMobMultiPart || internalUser; } From 81885d6814b87f9dfdeaf6d232ab089f40b079b0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 11:21:04 +0530 Subject: [PATCH 0247/1179] Tweak --- web/packages/new/photos/services/ml/cluster-new.ts | 14 +++++++------- web/packages/new/photos/services/user-entity.ts | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 93d87e3fed..a483d6f0ec 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -65,6 +65,13 @@ export interface Person { * hidden. */ name: string | undefined; + /** + * An unordered set of ids of the clusters that belong to this person. + * + * For ergonomics of transportation and persistence this is an array, but it + * should conceptually be thought of as a set. + */ + clusterIDs: string[]; /** * True if this person should be hidden. * @@ -75,13 +82,6 @@ export interface Person { * showing this cluster). */ isHidden: boolean; - /** - * An unordered set of ids of the clusters that belong to this person. - * - * For ergonomics of transportation and persistence this is an array, but it - * should conceptually be thought of as a set. - */ - clusterIDs: string[]; /** * The ID of the face that should be used as the cover photo for this person * (if the user has set one). diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index f4e171559d..e469c72663 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -16,8 +16,8 @@ import { applyPersonDiff } from "./ml/db"; export type EntityType = | "person" /** - * A new version of the Person entity where the data is gzipped before - * encryption. + * The latest iteration of the Person entity format, where the data is + * gzipped before encryption. */ | "person_v2"; @@ -171,7 +171,9 @@ export const syncPersons = async (entityKeyB64: string) => { id, name: rp.name, clusterIDs: rp.assigned.map(({ id }) => id), - avatarFaceID: undefined, + isHidden: rp.isHidden, + avatarFaceID: rp.avatarFaceID, + displayFaceID: undefined, }; }; @@ -191,9 +193,7 @@ export const syncPersons = async (entityKeyB64: string) => { } }; -/** - * Zod schema for the "person" entity (the {@link RemotePerson} type). - */ +/** Zod schema for the {@link RemotePerson} type. */ const RemotePerson = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array( @@ -208,7 +208,7 @@ const RemotePerson = z.object({ }); /** - * A "person" entity as synced via remote. + * A "person_v2" entity as synced via remote. */ type RemotePerson = z.infer; From c164b0710a964c3a16af6fb5645ecdac36e8c829 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 11:24:29 +0530 Subject: [PATCH 0248/1179] key --- .../new/photos/services/user-entity.ts | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index e469c72663..e1d74504b3 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,6 +1,6 @@ import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; -import { getKVN, setKV } from "@/base/kv"; +import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; @@ -151,6 +151,37 @@ export const userEntityDiff = async ( ); }; +const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; + +/** + * Return the locally persisted value for the latest `updatedAt` time for the + * given entity {@link type}. + * + * This is used to checkpoint diffs, so that we can resume fetching from the + * last time we did a fetch. + */ +const latestUpdatedAt = (type: EntityType) => getKVN(latestUpdatedAtKey(type)); + +/** + * Setter for {@link latestUpdatedAt}. + */ +const setLatestUpdatedAt = (type: EntityType, value: number) => + setKV(latestUpdatedAtKey(type), value); + +const entityKeyKey = (type: EntityType) => `entityKey/${type}`; + +/** + * Return the locally persisted value for the entity key to use for decrypting + * the contents of entities of the given {@link type}. + */ +const entityKey = (type: EntityType) => getKV(entityKeyKey(type)); + +/** + * Setter for {@link entityKey}. + */ +const setEntityKey = (type: EntityType, value: string) => + setKV(entityKeyKey(type), value); + /** * Sync the {@link Person} entities that we have locally with remote. * @@ -211,20 +242,3 @@ const RemotePerson = z.object({ * A "person_v2" entity as synced via remote. */ type RemotePerson = z.infer; - -const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; - -/** - * Return the locally persisted value for the latest `updatedAt` time for the - * given entity type. - * - * This is used to checkpoint diffs, so that we can resume fetching from the - * last time we did a fetch. - */ -const latestUpdatedAt = (type: EntityType) => getKVN(latestUpdatedAtKey(type)); - -/** - * Setter for {@link latestUpdatedAt}. - */ -const setLatestUpdatedAt = (type: EntityType, value: number) => - setKV(latestUpdatedAtKey(type), value); From 4ea6f1cbfc6beaae63d933e01e13a7573bfbc931 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 11:30:32 +0530 Subject: [PATCH 0249/1179] [server] Fix lint failures on CI --- .github/workflows/server-lint.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/server-lint.yml b/.github/workflows/server-lint.yml index c051d02901..3b0cbc855f 100644 --- a/.github/workflows/server-lint.yml +++ b/.github/workflows/server-lint.yml @@ -21,7 +21,8 @@ jobs: - name: Setup go uses: actions/setup-go@v5 with: - go-version-file: "server/go.mod" + go-version-file: server/go.mod + cache-dependency-path: server/go.sum cache: true - name: Install dependencies From 7e36ad357b34a858d379e7903f08463b9bf7e824 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 11:47:48 +0530 Subject: [PATCH 0250/1179] [mob][photos] Chore --- mobile/lib/ui/home/home_bottom_nav_bar.dart | 1 - .../seek_bar.dart | 1 + .../ui/viewer/file/video_widget_native.dart | 21 +++++++++++-------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/mobile/lib/ui/home/home_bottom_nav_bar.dart b/mobile/lib/ui/home/home_bottom_nav_bar.dart index 4fb19df170..aa1e0e1d9b 100644 --- a/mobile/lib/ui/home/home_bottom_nav_bar.dart +++ b/mobile/lib/ui/home/home_bottom_nav_bar.dart @@ -31,7 +31,6 @@ class _HomeBottomNavigationBarState extends State { void initState() { super.initState(); currentTabIndex = widget.selectedTabIndex; - //Todo: Remove this listener on dispose widget.selectedFiles.addListener(_selectedFilesListener); _tabChangedEventSubscription = Bus.instance.on().listen((event) { diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 48f1dc6be6..015e6eb5ef 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -51,6 +51,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { widget.controller.onPlaybackPositionChanged.removeListener( _onPlaybackPositionChanged, ); + _debouncer.cancelDebounceTimer(); super.dispose(); } diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 4a95465bc9..217cff7ffd 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -128,8 +128,6 @@ class _VideoWidgetNativeState extends State removeCallBack(widget.file); _progressNotifier.dispose(); WidgetsBinding.instance.removeObserver(this); - // player.dispose(); - _controller?.onPlaybackEnded.removeListener(_onPlaybackEnded); _controller?.onPlaybackReady.removeListener(_onPlaybackReady); _controller?.onError.removeListener(_onError); @@ -296,7 +294,7 @@ class _VideoWidgetNativeState extends State _, ) { return Text( - secondsToDuration( + _secondsToDuration( value, ), style: @@ -351,7 +349,7 @@ class _VideoWidgetNativeState extends State ); } - String secondsToDuration(int totalSeconds) { + String _secondsToDuration(int totalSeconds) { final hours = totalSeconds ~/ 3600; final minutes = (totalSeconds % 3600) ~/ 60; final seconds = totalSeconds % 60; @@ -391,7 +389,9 @@ class _VideoWidgetNativeState extends State NativeVideoPlayerController controller, ) async { try { - _logger.info("Initializing native video player controller"); + _logger.info( + "Initializing native video player controller for file gen id: ${widget.file.generatedID}", + ); _controller = controller; controller.onError.addListener(_onError); @@ -406,7 +406,10 @@ class _VideoWidgetNativeState extends State ); await controller.loadVideoSource(videoSource); } catch (e) { - _logger.severe("Error initializing native video player controller", e); + _logger.severe( + "Error initializing native video player controller for file gen id: ${widget.file.generatedID}", + e, + ); } } @@ -426,8 +429,6 @@ class _VideoWidgetNativeState extends State } } - ///Need to not execute this if the status change is coming from a video getting - ///played in loop. void _onPlaybackStatusChanged() { if (_isSeeking.value || _controller?.playbackInfo?.positionFraction == 1) { return; @@ -454,7 +455,9 @@ class _VideoWidgetNativeState extends State void _onError() { //This doesn't work all the time - _logger.severe("Error in native video player controller"); + _logger.severe( + "Error in native video player controller for file gen id: ${widget.file.generatedID}", + ); _logger.severe(_controller!.onError.value); } From b99e835d79e38d9419b6f196b776c82f09d06450 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 12:21:35 +0530 Subject: [PATCH 0251/1179] [mob][photos] Refactoring --- .../ui/viewer/file/video_widget_native.dart | 286 +++++++++--------- 1 file changed, 149 insertions(+), 137 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 217cff7ffd..7b3502a5eb 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -1,7 +1,6 @@ import "dart:async"; import "dart:io"; -import "package:flutter/cupertino.dart"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:native_video_player/native_video_player.dart"; @@ -232,111 +231,17 @@ class _VideoWidgetNativeState extends State bottom: widget.isFromMemories ? 32 : 0, ), child: ValueListenableBuilder( + valueListenable: _isPlaybackReady, builder: (BuildContext context, bool value, _) { return value - ? ValueListenableBuilder( - valueListenable: _showControls, - builder: ( - BuildContext context, - bool value, - _, - ) { - return AnimatedOpacity( - duration: const Duration( - milliseconds: 200, - ), - curve: Curves.easeInQuad, - opacity: value ? 1 : 0, - child: IgnorePointer( - ignoring: !value, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 8, - ), - child: Container( - padding: - const EdgeInsets.fromLTRB( - 16, - 4, - 16, - 4, - ), - decoration: BoxDecoration( - color: Colors.black - .withOpacity(0.3), - borderRadius: - const BorderRadius.all( - Radius.circular(8), - ), - border: Border.all( - color: strokeFaintDark, - width: 1, - ), - ), - child: Row( - children: [ - AnimatedSize( - duration: - const Duration( - seconds: 5, - ), - curve: Curves.easeInOut, - child: - ValueListenableBuilder( - valueListenable: - _controller! - .onPlaybackPositionChanged, - builder: ( - BuildContext - context, - int value, - _, - ) { - return Text( - _secondsToDuration( - value, - ), - style: - getEnteTextTheme( - context, - ).mini.copyWith( - color: - textBaseDark, - ), - ); - }, - ), - ), - Expanded( - child: SeekBar( - _controller!, - _durationToSeconds( - duration, - ), - _isSeeking, - ), - ), - Text( - duration ?? "0:00", - style: getEnteTextTheme( - context, - ).mini.copyWith( - color: - textBaseDark, - ), - ), - ], - ), - ), - ), - ), - ); - }, + ? _SeekBarAndDuration( + controller: _controller, + duration: duration, + showControls: _showControls, + isSeeking: _isSeeking, ) : const SizedBox(); }, - valueListenable: _isPlaybackReady, ), ), ), @@ -349,42 +254,6 @@ class _VideoWidgetNativeState extends State ); } - String _secondsToDuration(int totalSeconds) { - final hours = totalSeconds ~/ 3600; - final minutes = (totalSeconds % 3600) ~/ 60; - final seconds = totalSeconds % 60; - - if (hours > 0) { - return '${hours.toString().padLeft(1, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; - } else { - return '${minutes.toString().padLeft(1, '0')}:${seconds.toString().padLeft(2, '0')}'; - } - } - - int? _durationToSeconds(String? duration) { - if (duration == null) { - _logger.warning("Duration is null"); - return null; - } - final parts = duration.split(':'); - int seconds = 0; - - if (parts.length == 3) { - // Format: "h:mm:ss" - seconds += int.parse(parts[0]) * 3600; // Hours to seconds - seconds += int.parse(parts[1]) * 60; // Minutes to seconds - seconds += int.parse(parts[2]); // Seconds - } else if (parts.length == 2) { - // Format: "m:ss" - seconds += int.parse(parts[0]) * 60; // Minutes to seconds - seconds += int.parse(parts[1]); // Seconds - } else { - throw FormatException('Invalid duration format: $duration'); - } - - return seconds; - } - Future _initializeController( NativeVideoPlayerController controller, ) async { @@ -600,3 +469,146 @@ class _VideoWidgetNativeState extends State } } } + +class _SeekBarAndDuration extends StatelessWidget { + final NativeVideoPlayerController? controller; + final String? duration; + final ValueNotifier showControls; + final ValueNotifier isSeeking; + + const _SeekBarAndDuration({ + required this.controller, + required this.duration, + required this.showControls, + required this.isSeeking, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: showControls, + builder: ( + BuildContext context, + bool value, + _, + ) { + return AnimatedOpacity( + duration: const Duration( + milliseconds: 200, + ), + curve: Curves.easeInQuad, + opacity: value ? 1 : 0, + child: IgnorePointer( + ignoring: !value, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), + child: Container( + padding: const EdgeInsets.fromLTRB( + 16, + 4, + 16, + 4, + ), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.3), + borderRadius: const BorderRadius.all( + Radius.circular(8), + ), + border: Border.all( + color: strokeFaintDark, + width: 1, + ), + ), + child: Row( + children: [ + AnimatedSize( + duration: const Duration( + seconds: 5, + ), + curve: Curves.easeInOut, + child: ValueListenableBuilder( + valueListenable: controller!.onPlaybackPositionChanged, + builder: ( + BuildContext context, + int value, + _, + ) { + return Text( + _secondsToDuration( + value, + ), + style: getEnteTextTheme( + context, + ).mini.copyWith( + color: textBaseDark, + ), + ); + }, + ), + ), + Expanded( + child: SeekBar( + controller!, + _durationToSeconds( + duration, + ), + isSeeking, + ), + ), + Text( + duration ?? "0:00", + style: getEnteTextTheme( + context, + ).mini.copyWith( + color: textBaseDark, + ), + ), + ], + ), + ), + ), + ), + ); + }, + ); + } + + /// Returns the duration in the format "h:mm:ss" or "m:ss". + String _secondsToDuration(int totalSeconds) { + final hours = totalSeconds ~/ 3600; + final minutes = (totalSeconds % 3600) ~/ 60; + final seconds = totalSeconds % 60; + + if (hours > 0) { + return '${hours.toString().padLeft(1, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } else { + return '${minutes.toString().padLeft(1, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + } + + /// Returns the duration in seconds from the format "h:mm:ss" or "m:ss". + int? _durationToSeconds(String? duration) { + if (duration == null) { + return null; + } + final parts = duration.split(':'); + int seconds = 0; + + if (parts.length == 3) { + // Format: "h:mm:ss" + seconds += int.parse(parts[0]) * 3600; // Hours to seconds + seconds += int.parse(parts[1]) * 60; // Minutes to seconds + seconds += int.parse(parts[2]); // Seconds + } else if (parts.length == 2) { + // Format: "m:ss" + seconds += int.parse(parts[0]) * 60; // Minutes to seconds + seconds += int.parse(parts[1]); // Seconds + } else { + throw FormatException('Invalid duration format: $duration'); + } + + return seconds; + } +} From 9e22cfa9724421d2dae3f3676f2d14a1ce09a152 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:25:21 +0530 Subject: [PATCH 0252/1179] Add method to async decrypt json data --- mobile/lib/utils/gzip.dart | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/mobile/lib/utils/gzip.dart b/mobile/lib/utils/gzip.dart index d1680d43e7..2cc86848ee 100644 --- a/mobile/lib/utils/gzip.dart +++ b/mobile/lib/utils/gzip.dart @@ -28,6 +28,25 @@ Uint8List _gzipUInt8List(Uint8List data) { return Uint8List.fromList(compressedData); } +Future> decryptAndUnzipJson( + Uint8List key, { + required String encryptedData, + required String header, +}) async { + final Computer computer = Computer.shared(); + final response = + await computer.compute, Map>( + _decryptAndUnzipJsonSync, + param: { + "key": key, + "encryptedData": encryptedData, + "header": header, + }, + taskName: "decryptAndUnzipJson", + ); + return response; +} + Map decryptAndUnzipJsonSync( Uint8List key, { required String encryptedData, @@ -82,3 +101,10 @@ ChaChaEncryptionResult _gzipAndEncryptJsonSync( ) { return gzipAndEncryptJsonSync(args["jsonData"], args["key"]); } + +Map _decryptAndUnzipJsonSync( + Map args, +) { + return decryptAndUnzipJsonSync(args["key"], + encryptedData: args["encryptedData"], header: args["header"]); +} From 9d9b4f00ed7f42fd4edf08160d184ad62b87e348 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:25:36 +0530 Subject: [PATCH 0253/1179] Fix nano id alphabets --- mobile/lib/models/nanoids/cluster_id.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/models/nanoids/cluster_id.dart b/mobile/lib/models/nanoids/cluster_id.dart index 278e0bb1a2..ee2d14013e 100644 --- a/mobile/lib/models/nanoids/cluster_id.dart +++ b/mobile/lib/models/nanoids/cluster_id.dart @@ -1,13 +1,13 @@ import "package:flutter/foundation.dart"; import 'package:nanoid/nanoid.dart'; -const alphaphet = +const enteWhiteListedAlphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; const clusterIDLength = 22; class ClusterID { static String generate() { - return "cluster_${customAlphabet(urlAlphabet, clusterIDLength)}"; + return "cluster_${customAlphabet(enteWhiteListedAlphabet, clusterIDLength)}"; } // Validation method From d7ffb3c7e0a8bf64f7fb0eee212f26ccb95879f4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:25:54 +0530 Subject: [PATCH 0254/1179] Update endpoint --- mobile/lib/services/filedata/filedata_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/filedata/filedata_service.dart b/mobile/lib/services/filedata/filedata_service.dart index 1d7d184050..e0e2d6c2db 100644 --- a/mobile/lib/services/filedata/filedata_service.dart +++ b/mobile/lib/services/filedata/filedata_service.dart @@ -32,7 +32,7 @@ class FileDataService { try { final _ = await _dio.put( - "/files/data/", + "/files/data", data: { "fileID": file.uploadedFileID!, "type": data.type.toJson(), From da4ba85c7c836bcdcede30e1921011207aa09d76 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 12:26:11 +0530 Subject: [PATCH 0255/1179] wip ek --- .../new/photos/services/user-entity.ts | 70 +++++++++++++++---- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index e1d74504b3..0c4764d6c3 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -151,6 +151,62 @@ export const userEntityDiff = async ( ); }; +/** + * Return the entity key that can be used to decrypt the encrypted contents of + * user entities of the given {@link type}. + * + * 1. We'll see if we have the (encrypted) entity key present locally. If so, + * we'll decrypt it using the user's master key and return it. + * + * 2. Otherwise we'll fetch the entity key for that type from remote. If found, + * we'll decrypte it using the user's master key and return it, also saving + * it locally for future use. + * + * 3. Otherwise we'll create a new one, save it locally and put it to remote. + */ +const entityKey = (type: EntityType) => { + + +}; + +const savedRemoteUserEntityKeyKey = (type: EntityType) => `entityKey/${type}`; + +/** + * Return the locally persisted value for the entity key to use for decrypting + * the contents of entities of the given {@link type}. + */ +const savedRemoteUserEntityKey = (type: EntityType) => + getKV(savedRemoteUserEntityKeyKey(type)); + +/** + * Setter for {@link entityKey}. + */ +const setSavedRemoteUserEntityKey = (type: EntityType, value: string) => + setKV(savedRemoteUserEntityKeyKey(type), value); + +/** + * Fetch the latest encryption key for the given user entity {@link} type from + * remote. + */ +const getUserEntityKey = async ( + type: EntityType, +): Promise => { + const params = new URLSearchParams({ type }); + const url = await apiURL("/user-entity/key"); + const res = await fetch(`${url}?${params.toString()}`, { + headers: await authenticatedRequestHeaders(), + }); + ensureOk(res); + return RemoteUserEntityKey.parse(await res.json()); +}; + +const RemoteUserEntityKey = z.object({ + encryptedKey: z.string(), + header: z.string(), +}); + +type RemoteUserEntityKey = z.infer; + const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; /** @@ -168,20 +224,6 @@ const latestUpdatedAt = (type: EntityType) => getKVN(latestUpdatedAtKey(type)); const setLatestUpdatedAt = (type: EntityType, value: number) => setKV(latestUpdatedAtKey(type), value); -const entityKeyKey = (type: EntityType) => `entityKey/${type}`; - -/** - * Return the locally persisted value for the entity key to use for decrypting - * the contents of entities of the given {@link type}. - */ -const entityKey = (type: EntityType) => getKV(entityKeyKey(type)); - -/** - * Setter for {@link entityKey}. - */ -const setEntityKey = (type: EntityType, value: string) => - setKV(entityKeyKey(type), value); - /** * Sync the {@link Person} entities that we have locally with remote. * From 9f96ef8d83df66dad64c53d8a04e65a5708291b0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:27:36 +0530 Subject: [PATCH 0256/1179] [mob] Switch to person_v2 where data is gzipped --- mobile/lib/models/api/entity/type.dart | 12 ++++++ mobile/lib/services/entity_service.dart | 42 +++++++++++++------ .../face_ml/person/person_service.dart | 20 ++++----- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/mobile/lib/models/api/entity/type.dart b/mobile/lib/models/api/entity/type.dart index 88e60d62f3..431ea4e57b 100644 --- a/mobile/lib/models/api/entity/type.dart +++ b/mobile/lib/models/api/entity/type.dart @@ -3,6 +3,7 @@ import "package:flutter/foundation.dart"; enum EntityType { location, person, + personV2, unknown, } @@ -12,18 +13,29 @@ EntityType typeFromString(String type) { return EntityType.location; case "person": return EntityType.location; + case "person_v2": + return EntityType.personV2; } debugPrint("unexpected collection type $type"); return EntityType.unknown; } extension EntityTypeExtn on EntityType { + bool isZipped() { + if (this == EntityType.location || this == EntityType.person) { + return false; + } + return true; + } + String typeToString() { switch (this) { case EntityType.location: return "location"; case EntityType.person: return "person"; + case EntityType.personV2: + return "person_v2"; case EntityType.unknown: return "unknown"; } diff --git a/mobile/lib/services/entity_service.dart b/mobile/lib/services/entity_service.dart index 3f00d264fd..e979d4fd9e 100644 --- a/mobile/lib/services/entity_service.dart +++ b/mobile/lib/services/entity_service.dart @@ -14,6 +14,7 @@ import "package:photos/models/api/entity/key.dart"; import "package:photos/models/api/entity/type.dart"; import "package:photos/models/local_entity_data.dart"; import "package:photos/utils/crypto_util.dart"; +import "package:photos/utils/gzip.dart"; import 'package:shared_preferences/shared_preferences.dart'; class EntityService { @@ -61,11 +62,18 @@ class EntityService { }) async { final String plainText = jsonEncode(jsonMap); final key = await getOrCreateEntityKey(type); - final encryptedKeyData = - await CryptoUtil.encryptChaCha(utf8.encode(plainText), key); - final String encryptedData = - CryptoUtil.bin2base64(encryptedKeyData.encryptedData!); - final String header = CryptoUtil.bin2base64(encryptedKeyData.header!); + late String encryptedData, header; + if (type.isZipped()) { + final ChaChaEncryptionResult result = + await gzipAndEncryptJson(jsonMap, key); + encryptedData = result.encData; + header = result.header; + } else { + final encryptedKeyData = + await CryptoUtil.encryptChaCha(utf8.encode(plainText), key); + encryptedData = CryptoUtil.bin2base64(encryptedKeyData.encryptedData!); + header = CryptoUtil.bin2base64(encryptedKeyData.header!); + } debugPrint( " ${id == null ? 'Adding' : 'Updating'} entity of type: " + type.typeToString(), @@ -93,7 +101,7 @@ class EntityService { Future syncEntities() async { try { await _remoteToLocalSync(EntityType.location); - await _remoteToLocalSync(EntityType.person); + await _remoteToLocalSync(EntityType.personV2); } catch (e) { _logger.severe("Failed to sync entities", e); } @@ -126,12 +134,22 @@ class EntityService { final List entities = []; for (EntityData e in result) { try { - final decryptedValue = await CryptoUtil.decryptChaCha( - CryptoUtil.base642bin(e.encryptedData!), - entityKey, - CryptoUtil.base642bin(e.header!), - ); - final String plainText = utf8.decode(decryptedValue); + late String plainText; + if (type.isZipped()) { + final jsonMap = await decryptAndUnzipJson( + entityKey, + encryptedData: e.encryptedData!, + header: e.header!, + ); + plainText = jsonEncode(jsonMap); + } else { + final Uint8List decryptedValue = await CryptoUtil.decryptChaCha( + CryptoUtil.base642bin(e.encryptedData!), + entityKey, + CryptoUtil.base642bin(e.header!), + ); + plainText = utf8.decode(decryptedValue); + } entities.add( LocalEntityData( id: e.id, diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 9a94b28160..5a5f4b23a6 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -37,7 +37,7 @@ class PersonService { } Future> getPersons() async { - final entities = await entityService.getEntities(EntityType.person); + final entities = await entityService.getEntities(EntityType.personV2); return entities .map( (e) => PersonEntity(e.id, PersonData.fromJson(json.decode(e.data))), @@ -46,7 +46,7 @@ class PersonService { } Future getPerson(String id) { - return entityService.getEntity(EntityType.person, id).then((e) { + return entityService.getEntity(EntityType.personV2, id).then((e) { if (e == null) { return null; } @@ -55,7 +55,7 @@ class PersonService { } Future> getPersonsMap() async { - final entities = await entityService.getEntities(EntityType.person); + final entities = await entityService.getEntities(EntityType.personV2); final Map map = {}; for (var e in entities) { final person = @@ -95,7 +95,7 @@ class PersonService { ) .toList(); entityService - .addOrUpdate(EntityType.person, personData.toJson(), id: personID) + .addOrUpdate(EntityType.personV2, personData.toJson(), id: personID) .ignore(); personData.logStats(); } @@ -163,7 +163,7 @@ class PersonService { isHidden: isHidden, ); final result = await entityService.addOrUpdate( - EntityType.person, + EntityType.personV2, data.toJson(), ); await faceMLDataDB.assignClusterToPerson( @@ -181,7 +181,7 @@ class PersonService { final personData = person.data; personData.assigned!.removeWhere((element) => element.id != clusterID); await entityService.addOrUpdate( - EntityType.person, + EntityType.personV2, personData.toJson(), id: personID, ); @@ -216,7 +216,7 @@ class PersonService { } await entityService.addOrUpdate( - EntityType.person, + EntityType.personV2, personData.toJson(), id: person.remoteID, ); @@ -232,7 +232,7 @@ class PersonService { final PersonEntity justName = PersonEntity(personID, PersonData(name: entity.data.name)); await entityService.addOrUpdate( - EntityType.person, + EntityType.personV2, justName.data.toJson(), id: personID, ); @@ -249,7 +249,7 @@ class PersonService { Future fetchRemoteClusterFeedback() async { await entityService.syncEntities(); - final entities = await entityService.getEntities(EntityType.person); + final entities = await entityService.getEntities(EntityType.personV2); entities.sort((a, b) => a.updatedAt.compareTo(b.updatedAt)); final Map faceIdToClusterID = {}; final Map clusterToPersonID = {}; @@ -307,7 +307,7 @@ class PersonService { Future _updatePerson(PersonEntity updatePerson) async { await entityService.addOrUpdate( - EntityType.person, + EntityType.personV2, updatePerson.data.toJson(), id: updatePerson.remoteID, ); From dffe364c51ccc653012f09a9bc3c1c1fea79094c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 12:49:21 +0530 Subject: [PATCH 0257/1179] Read ss --- web/packages/base/session-store.ts | 31 +++++++++++++++++++ .../new/photos/services/user-entity.ts | 8 ++--- 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 web/packages/base/session-store.ts diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts new file mode 100644 index 0000000000..81b162d3ba --- /dev/null +++ b/web/packages/base/session-store.ts @@ -0,0 +1,31 @@ +import { sharedCryptoWorker } from "@/base/crypto"; +import { z } from "zod"; + +/** + * Return the user's encryption key from session storage. + * + * Precondition: The user should be logged in. + */ +export const userEncryptionKey = async () => { + // TODO: Same value as the deprecated SESSION_KEYS.ENCRYPTION_KEY. + const value = sessionStorage.getItem("encryptionKey"); + if (!value) { + throw new Error( + "The user's encryption key was not found in session storage. Likely they are not logged in.", + ); + } + + const { encryptedData, key, nonce } = EncryptionKeyAttributes.parse( + JSON.parse(value), + ); + + const cryptoWorker = await sharedCryptoWorker(); + return cryptoWorker.decryptB64(encryptedData, nonce, key); +}; + +// TODO: Same as B64EncryptionResult. Revisit. +const EncryptionKeyAttributes = z.object({ + encryptedData: z.string(), + key: z.string(), + nonce: z.string(), +}); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 0c4764d6c3..8b1734f096 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -165,24 +165,24 @@ export const userEntityDiff = async ( * 3. Otherwise we'll create a new one, save it locally and put it to remote. */ const entityKey = (type: EntityType) => { - + const masterKey = await getActualKey(); }; -const savedRemoteUserEntityKeyKey = (type: EntityType) => `entityKey/${type}`; +const savedRemoteEntityKeyKey = (type: EntityType) => `entityKey/${type}`; /** * Return the locally persisted value for the entity key to use for decrypting * the contents of entities of the given {@link type}. */ const savedRemoteUserEntityKey = (type: EntityType) => - getKV(savedRemoteUserEntityKeyKey(type)); + getKV(savedRemoteEntityKeyKey(type)); /** * Setter for {@link entityKey}. */ const setSavedRemoteUserEntityKey = (type: EntityType, value: string) => - setKV(savedRemoteUserEntityKeyKey(type), value); + setKV(savedRemoteEntityKeyKey(type), value); /** * Fetch the latest encryption key for the given user entity {@link} type from From 3a85e9dcaeb1a79fee75052d9679acfc39463179 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 13:04:08 +0530 Subject: [PATCH 0258/1179] ek type --- web/packages/base/session-store.ts | 2 +- .../new/photos/services/user-entity.ts | 48 +++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts index 81b162d3ba..87a044fa56 100644 --- a/web/packages/base/session-store.ts +++ b/web/packages/base/session-store.ts @@ -6,7 +6,7 @@ import { z } from "zod"; * * Precondition: The user should be logged in. */ -export const userEncryptionKey = async () => { +export const usersEncryptionKey = async () => { // TODO: Same value as the deprecated SESSION_KEYS.ENCRYPTION_KEY. const value = sessionStorage.getItem("encryptionKey"); if (!value) { diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 8b1734f096..d3468f317a 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,7 +1,9 @@ +import { sharedCryptoWorker } from "@/base/crypto"; import { decryptAssociatedB64Data } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; +import { usersEncryptionKey } from "@/base/session-store"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import type { Person } from "./ml/cluster-new"; @@ -164,25 +166,40 @@ export const userEntityDiff = async ( * * 3. Otherwise we'll create a new one, save it locally and put it to remote. */ -const entityKey = (type: EntityType) => { - const masterKey = await getActualKey(); - +const entityKey = async (type: EntityType) => { + const encryptionKey = await usersEncryptionKey(); + const worker = await sharedCryptoWorker(); + const saved = await savedRemoteUserEntityKey(type); + if (saved) { + return worker.decryptB64( + saved.encryptedKey, + saved.header, + encryptionKey, + ); + } + return undefined; }; -const savedRemoteEntityKeyKey = (type: EntityType) => `entityKey/${type}`; +const entityKeyKey = (type: EntityType) => `entityKey/${type}`; /** - * Return the locally persisted value for the entity key to use for decrypting - * the contents of entities of the given {@link type}. + * Return the locally persisted {@link RemoteUserEntityKey}, if any, + * corresponding the given {@link type}. */ -const savedRemoteUserEntityKey = (type: EntityType) => - getKV(savedRemoteEntityKeyKey(type)); +const savedRemoteUserEntityKey = ( + type: EntityType, +): Promise => + getKV(entityKeyKey(type)).then((s) => + s ? RemoteUserEntityKey.parse(JSON.parse(s)) : undefined, + ); /** * Setter for {@link entityKey}. */ -const setSavedRemoteUserEntityKey = (type: EntityType, value: string) => - setKV(savedRemoteEntityKeyKey(type), value); +const saveRemoteUserEntityKey = ( + type: EntityType, + entityKey: RemoteUserEntityKey, +) => setKV(entityKeyKey(type), JSON.stringify(entityKey)); /** * Fetch the latest encryption key for the given user entity {@link} type from @@ -216,12 +233,13 @@ const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; * This is used to checkpoint diffs, so that we can resume fetching from the * last time we did a fetch. */ -const latestUpdatedAt = (type: EntityType) => getKVN(latestUpdatedAtKey(type)); +const savedLatestUpdatedAt = (type: EntityType) => + getKVN(latestUpdatedAtKey(type)); /** - * Setter for {@link latestUpdatedAt}. + * Setter for {@link savedLatestUpdatedAt}. */ -const setLatestUpdatedAt = (type: EntityType, value: number) => +const saveLatestUpdatedAt = (type: EntityType, value: number) => setKV(latestUpdatedAtKey(type), value); /** @@ -250,7 +268,7 @@ export const syncPersons = async (entityKeyB64: string) => { }; }; - let sinceTime = (await latestUpdatedAt(type)) ?? 0; + let sinceTime = (await savedLatestUpdatedAt(type)) ?? 0; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition while (true) { const entities = await userEntityDiff(type, sinceTime, entityKeyB64); @@ -262,7 +280,7 @@ export const syncPersons = async (entityKeyB64: string) => { (max, e) => Math.max(max, e.updatedAt), sinceTime, ); - await setLatestUpdatedAt(type, sinceTime); + await saveLatestUpdatedAt(type, sinceTime); } }; From 3a1025a2b9d59c4dbcba814226bbbb3c012c6f9f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:07:01 +0530 Subject: [PATCH 0259/1179] Lint fix --- mobile/lib/utils/gzip.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/lib/utils/gzip.dart b/mobile/lib/utils/gzip.dart index 2cc86848ee..8de71f49df 100644 --- a/mobile/lib/utils/gzip.dart +++ b/mobile/lib/utils/gzip.dart @@ -105,6 +105,9 @@ ChaChaEncryptionResult _gzipAndEncryptJsonSync( Map _decryptAndUnzipJsonSync( Map args, ) { - return decryptAndUnzipJsonSync(args["key"], - encryptedData: args["encryptedData"], header: args["header"]); + return decryptAndUnzipJsonSync( + args["key"], + encryptedData: args["encryptedData"], + header: args["header"], + ); } From 5625071fe86f3a595c019de13d446ac7a104b5f3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:24:39 +0530 Subject: [PATCH 0260/1179] Rearrange --- mobile/lib/{face => db/ml}/db.dart | 0 mobile/lib/{face => db/ml}/db_fields.dart | 0 mobile/lib/{face => db/ml}/db_model_mappers.dart | 0 mobile/lib/db/{ => ml}/embeddings_db.dart | 0 mobile/lib/models/{embedding.dart => ml/clip.dart} | 0 mobile/lib/{face/model => models/ml/face}/box.dart | 0 mobile/lib/{face/model => models/ml/face}/detection.dart | 0 mobile/lib/{face/model => models/ml/face}/dimension.dart | 0 mobile/lib/{face/model => models/ml/face}/face.dart | 0 mobile/lib/{face/model => models/ml/face}/landmark.dart | 0 mobile/lib/{face/model => models/ml/face}/person.dart | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename mobile/lib/{face => db/ml}/db.dart (100%) rename mobile/lib/{face => db/ml}/db_fields.dart (100%) rename mobile/lib/{face => db/ml}/db_model_mappers.dart (100%) rename mobile/lib/db/{ => ml}/embeddings_db.dart (100%) rename mobile/lib/models/{embedding.dart => ml/clip.dart} (100%) rename mobile/lib/{face/model => models/ml/face}/box.dart (100%) rename mobile/lib/{face/model => models/ml/face}/detection.dart (100%) rename mobile/lib/{face/model => models/ml/face}/dimension.dart (100%) rename mobile/lib/{face/model => models/ml/face}/face.dart (100%) rename mobile/lib/{face/model => models/ml/face}/landmark.dart (100%) rename mobile/lib/{face/model => models/ml/face}/person.dart (100%) diff --git a/mobile/lib/face/db.dart b/mobile/lib/db/ml/db.dart similarity index 100% rename from mobile/lib/face/db.dart rename to mobile/lib/db/ml/db.dart diff --git a/mobile/lib/face/db_fields.dart b/mobile/lib/db/ml/db_fields.dart similarity index 100% rename from mobile/lib/face/db_fields.dart rename to mobile/lib/db/ml/db_fields.dart diff --git a/mobile/lib/face/db_model_mappers.dart b/mobile/lib/db/ml/db_model_mappers.dart similarity index 100% rename from mobile/lib/face/db_model_mappers.dart rename to mobile/lib/db/ml/db_model_mappers.dart diff --git a/mobile/lib/db/embeddings_db.dart b/mobile/lib/db/ml/embeddings_db.dart similarity index 100% rename from mobile/lib/db/embeddings_db.dart rename to mobile/lib/db/ml/embeddings_db.dart diff --git a/mobile/lib/models/embedding.dart b/mobile/lib/models/ml/clip.dart similarity index 100% rename from mobile/lib/models/embedding.dart rename to mobile/lib/models/ml/clip.dart diff --git a/mobile/lib/face/model/box.dart b/mobile/lib/models/ml/face/box.dart similarity index 100% rename from mobile/lib/face/model/box.dart rename to mobile/lib/models/ml/face/box.dart diff --git a/mobile/lib/face/model/detection.dart b/mobile/lib/models/ml/face/detection.dart similarity index 100% rename from mobile/lib/face/model/detection.dart rename to mobile/lib/models/ml/face/detection.dart diff --git a/mobile/lib/face/model/dimension.dart b/mobile/lib/models/ml/face/dimension.dart similarity index 100% rename from mobile/lib/face/model/dimension.dart rename to mobile/lib/models/ml/face/dimension.dart diff --git a/mobile/lib/face/model/face.dart b/mobile/lib/models/ml/face/face.dart similarity index 100% rename from mobile/lib/face/model/face.dart rename to mobile/lib/models/ml/face/face.dart diff --git a/mobile/lib/face/model/landmark.dart b/mobile/lib/models/ml/face/landmark.dart similarity index 100% rename from mobile/lib/face/model/landmark.dart rename to mobile/lib/models/ml/face/landmark.dart diff --git a/mobile/lib/face/model/person.dart b/mobile/lib/models/ml/face/person.dart similarity index 100% rename from mobile/lib/face/model/person.dart rename to mobile/lib/models/ml/face/person.dart From ee5acf6a2e86b44524b7ed2a7fd83c0107e37cb2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 13:46:27 +0530 Subject: [PATCH 0261/1179] Sketch --- web/packages/base/session-store.ts | 4 +- .../new/photos/services/user-entity.ts | 83 +++++++++++++++---- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts index 87a044fa56..6e37bac534 100644 --- a/web/packages/base/session-store.ts +++ b/web/packages/base/session-store.ts @@ -2,11 +2,11 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { z } from "zod"; /** - * Return the user's encryption key from session storage. + * Return the base64 encoded user's encryption key from session storage. * * Precondition: The user should be logged in. */ -export const usersEncryptionKey = async () => { +export const usersEncryptionKeyB64 = async () => { // TODO: Same value as the deprecated SESSION_KEYS.ENCRYPTION_KEY. const value = sessionStorage.getItem("encryptionKey"); if (!value) { diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index d3468f317a..8aa12b1810 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,9 +1,9 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { decryptAssociatedB64Data } from "@/base/crypto/ente"; -import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; +import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; -import { usersEncryptionKey } from "@/base/session-store"; +import { usersEncryptionKeyB64 } from "@/base/session-store"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import type { Person } from "./ml/cluster-new"; @@ -165,19 +165,42 @@ export const userEntityDiff = async ( * it locally for future use. * * 3. Otherwise we'll create a new one, save it locally and put it to remote. + * + * See also, [Note: User entity keys]. */ const entityKey = async (type: EntityType) => { - const encryptionKey = await usersEncryptionKey(); + const encryptionKeyB64 = await usersEncryptionKeyB64(); const worker = await sharedCryptoWorker(); + + const decrypt = async ({ encryptedKey, header }: RemoteUserEntityKey) => { + return worker.decryptB64(encryptedKey, header, encryptionKeyB64); + }; + + // See if we already have it locally. const saved = await savedRemoteUserEntityKey(type); - if (saved) { - return worker.decryptB64( - saved.encryptedKey, - saved.header, - encryptionKey, - ); + if (saved) return decrypt(saved); + + // See if remote already has it. + const existing = await getUserEntityKey(type); + if (existing) { + // Only save it if we can decrypt it to avoid corrupting our local state + // in unforeseen circumstances. + const result = decrypt(existing); + await saveRemoteUserEntityKey(type, existing); + return result; } - return undefined; + + // Nada. Create a new one, put it to remote, save it locally, and return. + // TODO-Cluster Keep this read only, only add the writeable bits after other + // stuff has been tested. + throw new Error("Not implemented"); + // const generatedKeyB64 = await worker.generateEncryptionKey(); + // const encryptedNewKey = await worker.encryptToB64( + // generatedKeyB64, + // encryptionKeyB64, + // ); + // await postUserEntityKey(type, newKey); + // return decrypt(newKey); }; const entityKeyKey = (type: EntityType) => `entityKey/${type}`; @@ -202,19 +225,30 @@ const saveRemoteUserEntityKey = ( ) => setKV(entityKeyKey(type), JSON.stringify(entityKey)); /** - * Fetch the latest encryption key for the given user entity {@link} type from - * remote. + * Fetch the encryption key for the given user entity {@link type} from remote. + * + * [Note: User entity keys] + * + * There is one encryption key (itself encrypted with the user's encryption key) + * for each user entity type. If the key doesn't exist on remote, then the + * client is expected to create one on the user's behalf. Remote will disallow + * attempts to multiple keys for the same user entity type. */ const getUserEntityKey = async ( type: EntityType, -): Promise => { +): Promise => { const params = new URLSearchParams({ type }); const url = await apiURL("/user-entity/key"); const res = await fetch(`${url}?${params.toString()}`, { headers: await authenticatedRequestHeaders(), }); - ensureOk(res); - return RemoteUserEntityKey.parse(await res.json()); + if (!res.ok) { + // Remote says HTTP 404 Not Found if there is no key yet for the user. + if (res.status == 404) return undefined; + throw new HTTPError(res); + } else { + return RemoteUserEntityKey.parse(await res.json()); + } }; const RemoteUserEntityKey = z.object({ @@ -224,6 +258,25 @@ const RemoteUserEntityKey = z.object({ type RemoteUserEntityKey = z.infer; +/** + * Create a new encryption key for the given user entity {@link type} on remote. + * + * See: [Note: User entity keys] + */ +// TODO-Cluster remove export +export const postUserEntityKey = async ( + type: EntityType, + entityKey: RemoteUserEntityKey, +) => { + const url = await apiURL("/user-entity/key"); + const res = await fetch(url, { + method: "POST", + headers: await authenticatedRequestHeaders(), + body: JSON.stringify({ type, ...entityKey }), + }); + ensureOk(res); +}; + const latestUpdatedAtKey = (type: EntityType) => `latestUpdatedAt/${type}`; /** From fd1f3c6710b60dc4f3ea4accf29cdc53474bfde0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 13:51:43 +0530 Subject: [PATCH 0262/1179] Sync 1 --- web/packages/new/photos/services/user-entity.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 8aa12b1810..ba04f3082a 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -168,7 +168,7 @@ export const userEntityDiff = async ( * * See also, [Note: User entity keys]. */ -const entityKey = async (type: EntityType) => { +const getOrCreateEntityKeyB64 = async (type: EntityType) => { const encryptionKeyB64 = await usersEncryptionKeyB64(); const worker = await sharedCryptoWorker(); @@ -304,9 +304,11 @@ const saveLatestUpdatedAt = (type: EntityType, value: number) => * * This diff is then applied to the data we have persisted locally. */ -export const syncPersons = async (entityKeyB64: string) => { +export const syncPersons = async () => { const type: EntityType = "person"; + const entityKeyB64 = await getOrCreateEntityKeyB64(type); + const parse = ({ id, data }: UserEntity): Person => { const rp = RemotePerson.parse( JSON.parse(new TextDecoder().decode(data)), @@ -327,10 +329,12 @@ export const syncPersons = async (entityKeyB64: string) => { const entities = await userEntityDiff(type, sinceTime, entityKeyB64); if (entities.length == 0) break; - await applyPersonDiff(entities.map((e) => (e.data ? parse(e) : e.id))); + await applyPersonDiff( + entities.map((entity) => (entity.data ? parse(entity) : entity.id)), + ); sinceTime = entities.reduce( - (max, e) => Math.max(max, e.updatedAt), + (max, entity) => Math.max(max, entity.updatedAt), sinceTime, ); await saveLatestUpdatedAt(type, sinceTime); From 4e1d80380c74ffa206254de6dda1d8128b03e838 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 13:56:19 +0530 Subject: [PATCH 0263/1179] pv2 --- web/apps/photos/src/services/searchService.ts | 11 +++++----- .../new/photos/services/user-entity.ts | 21 ++++++++++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 4ece8ab439..19719f351a 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -9,6 +9,7 @@ import { wipCluster, wipClusterEnable, } from "@/new/photos/services/ml"; +import { persons } from "@/new/photos/services/ml/db"; import type { SearchPerson } from "@/new/photos/services/search"; import { syncPersons } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; @@ -27,7 +28,7 @@ import { import ComlinkSearchWorker from "utils/comlink/ComlinkSearchWorker"; import { getUniqueFiles } from "utils/file"; import { getFormattedDate } from "utils/search"; -import { getEntityKey, getLatestEntities } from "./entityService"; +import { getLatestEntities } from "./entityService"; import locationSearchService, { City } from "./locationSearchService"; const DIGITS = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); @@ -420,12 +421,10 @@ async function getAllPeople(limit: number = undefined) { if (!(await wipClusterEnable())) return []; if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { - const entityKey = await getEntityKey("person" as EntityType); - const peopleR = await syncPersons(entityKey.data); - const r = peopleR.length; - log.debug(() => ["people", peopleR]); + await syncPersons(); + const people = await persons(); + log.debug(() => ["people", { people }]); - if (r) return []; return []; } diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index ba04f3082a..db276a7054 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -6,6 +6,7 @@ import { apiURL } from "@/base/origins"; import { usersEncryptionKeyB64 } from "@/base/session-store"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; +import { gunzip } from "./gzip"; import type { Person } from "./ml/cluster-new"; import { applyPersonDiff } from "./ml/db"; @@ -16,12 +17,11 @@ import { applyPersonDiff } from "./ml/db"; * e.g. location tags, people in their photos. */ export type EntityType = - | "person" /** * The latest iteration of the Person entity format, where the data is * gzipped before encryption. */ - | "person_v2"; + "person_v2"; /** * The maximum number of items to fetch in a single diff @@ -305,14 +305,12 @@ const saveLatestUpdatedAt = (type: EntityType, value: number) => * This diff is then applied to the data we have persisted locally. */ export const syncPersons = async () => { - const type: EntityType = "person"; + const type: EntityType = "person_v2"; const entityKeyB64 = await getOrCreateEntityKeyB64(type); - const parse = ({ id, data }: UserEntity): Person => { - const rp = RemotePerson.parse( - JSON.parse(new TextDecoder().decode(data)), - ); + const parse = async (id: string, data: Uint8Array): Promise => { + const rp = RemotePerson.parse(JSON.parse(await gunzip(data))); return { id, name: rp.name, @@ -330,7 +328,11 @@ export const syncPersons = async () => { if (entities.length == 0) break; await applyPersonDiff( - entities.map((entity) => (entity.data ? parse(entity) : entity.id)), + await Promise.all( + entities.map(async ({ id, data }) => + data ? await parse(id, data) : id, + ), + ), ); sinceTime = entities.reduce( @@ -346,8 +348,7 @@ const RemotePerson = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array( z.object({ - // TODO-Cluster temporary modify - id: z.number().transform((n) => n.toString()), // TODO z.string person_v2 + id: z.string(), faces: z.string().array(), }), ), From bb56fddd45dd8cebb5b33a8333d4c3259a79f19b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 14:20:23 +0530 Subject: [PATCH 0264/1179] lf --- web/apps/photos/src/services/searchService.ts | 2 -- web/packages/new/photos/services/ml/index.ts | 11 ++++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 19719f351a..adc33fa40d 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -424,8 +424,6 @@ async function getAllPeople(limit: number = undefined) { await syncPersons(); const people = await persons(); log.debug(() => ["people", { people }]); - - return []; } let people: Array = []; // await mlIDbStorage.getAllPeople(); diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 1981df4394..1ee85c37e6 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -341,7 +341,16 @@ export const wipCluster = async () => { const result: SearchPerson[] = []; for (const person of people) { - const avatarFaceID = person.avatarFaceID; + let avatarFaceID = person.avatarFaceID; + // TODO-Cluster + // Temp + if (!avatarFaceID) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + avatarFaceID = person.clusterIDs + .map((id) => clusterByID.get(id)) + .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; + } + person.clusterIDs; const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); if (!avatarFaceFileID || !avatarFaceFile) { From 810cf6f8853d63656008775ecb06dd9eb66fb89d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:21:52 +0530 Subject: [PATCH 0265/1179] [mob] Use single db for ml data --- mobile/lib/core/configuration.dart | 7 +- mobile/lib/db/ml/db.dart | 61 +++++++--- mobile/lib/db/ml/db_fields.dart | 18 ++- mobile/lib/db/ml/db_model_mappers.dart | 10 +- mobile/lib/db/ml/embeddings_db.dart | 114 ++++-------------- mobile/lib/main.dart | 2 +- mobile/lib/models/ml/face/detection.dart | 4 +- mobile/lib/models/ml/face/face.dart | 2 +- .../services/filedata/model/file_data.dart | 2 +- .../face_ml/face_detection/detection.dart | 2 +- .../face_detection_service.dart | 2 +- .../face_ml/face_recognition_service.dart | 10 +- .../face_ml/feedback/cluster_feedback.dart | 6 +- .../face_ml/person/person_service.dart | 4 +- .../machine_learning/ml_computer.dart | 2 +- .../services/machine_learning/ml_result.dart | 2 +- .../services/machine_learning/ml_service.dart | 10 +- mobile/lib/services/search_service.dart | 4 +- .../bottom_action_bar_widget.dart | 2 +- .../debug/ml_debug_section_widget.dart | 4 +- .../file_selection_actions_widget.dart | 2 +- .../actions/file_selection_overlay_bar.dart | 2 +- .../ui/viewer/file_details/face_widget.dart | 6 +- .../file_details/faces_item_widget.dart | 8 +- .../people/add_person_action_sheet.dart | 4 +- .../lib/ui/viewer/people/cluster_app_bar.dart | 4 +- mobile/lib/ui/viewer/people/cluster_page.dart | 2 +- .../lib/ui/viewer/people/people_app_bar.dart | 23 ++-- mobile/lib/ui/viewer/people/people_page.dart | 2 +- .../people/person_cluster_suggestion.dart | 4 +- .../viewer/people/person_clusters_page.dart | 2 +- .../lib/ui/viewer/people/person_row_item.dart | 2 +- .../search/result/person_face_widget.dart | 6 +- .../ui/viewer/search_tab/people_section.dart | 2 +- mobile/lib/utils/face/face_box_crop.dart | 2 +- mobile/lib/utils/face/face_util.dart | 2 +- mobile/lib/utils/image_ml_util.dart | 4 +- mobile/lib/utils/ml_util.dart | 10 +- 38 files changed, 166 insertions(+), 189 deletions(-) diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index a1f7d51daf..9fe284c583 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -11,15 +11,14 @@ import 'package:photos/core/constants.dart'; import 'package:photos/core/error-reporting/super_logging.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/collections_db.dart'; -import "package:photos/db/embeddings_db.dart"; import 'package:photos/db/files_db.dart'; import 'package:photos/db/memories_db.dart'; +import "package:photos/db/ml/db.dart"; import 'package:photos/db/trash_db.dart'; import 'package:photos/db/upload_locks_db.dart'; import "package:photos/events/endpoint_updated_event.dart"; import 'package:photos/events/signed_in_event.dart'; import 'package:photos/events/user_logged_out_event.dart'; -import "package:photos/face/db.dart"; import 'package:photos/models/key_attributes.dart'; import 'package:photos/models/key_gen_result.dart'; import 'package:photos/models/private_key_attributes.dart'; @@ -28,7 +27,6 @@ import 'package:photos/services/collections_service.dart'; import 'package:photos/services/favorites_service.dart'; import "package:photos/services/home_widget_service.dart"; import 'package:photos/services/ignored_files_service.dart'; -import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import 'package:photos/services/memories_service.dart'; import 'package:photos/services/search_service.dart'; import 'package:photos/services/sync_service.dart'; @@ -205,9 +203,6 @@ class Configuration { _cachedToken = null; _secretKey = null; await FilesDB.instance.clearTable(); - SemanticSearchService.instance.hasInitialized - ? await EmbeddingsDB.instance.clearTable() - : null; await CollectionsDB.instance.clearTable(); await MemoriesDB.instance.clearTable(); await FaceMLDataDB.instance.clearTable(); diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index cdc014f86e..11c9cf26d4 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -6,10 +6,10 @@ import "package:flutter/foundation.dart"; import 'package:logging/logging.dart'; import 'package:path/path.dart' show join; import 'package:path_provider/path_provider.dart'; +import 'package:photos/db/ml/db_fields.dart'; +import "package:photos/db/ml/db_model_mappers.dart"; import "package:photos/extensions/stop_watch.dart"; -import 'package:photos/face/db_fields.dart'; -import "package:photos/face/db_model_mappers.dart"; -import "package:photos/face/model/face.dart"; +import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; @@ -28,7 +28,7 @@ import 'package:sqlite_async/sqlite_async.dart'; class FaceMLDataDB { static final Logger _logger = Logger("FaceMLDataDB"); - static const _databaseName = "ente.face_ml_db_v2.db"; + static const _databaseName = "ente.face_ml_db_v3.db"; // static const _databaseVersion = 1; FaceMLDataDB._privateConstructor(); @@ -42,6 +42,7 @@ class FaceMLDataDB { createClusterSummaryTable, createNotPersonFeedbackTable, fcClusterIDIndex, + createClipEmbeddingsTable, ]; // only have a single app-wide reference to the database @@ -111,9 +112,9 @@ class FaceMLDataDB { const String sql = ''' INSERT INTO $facesTable ( - $fileIDColumn, $faceIDColumn, $faceDetectionColumn, $faceEmbeddingBlob, $faceScore, $faceBlur, $isSideways, $imageHeight, $imageWidth, $mlVersionColumn + $fileIDColumn, $faceIDColumn, $faceDetectionColumn, $embeddingColumn, $faceScore, $faceBlur, $isSideways, $imageHeight, $imageWidth, $mlVersionColumn ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - ON CONFLICT($fileIDColumn, $faceIDColumn) DO UPDATE SET $faceIDColumn = excluded.$faceIDColumn, $faceDetectionColumn = excluded.$faceDetectionColumn, $faceEmbeddingBlob = excluded.$faceEmbeddingBlob, $faceScore = excluded.$faceScore, $faceBlur = excluded.$faceBlur, $isSideways = excluded.$isSideways, $imageHeight = excluded.$imageHeight, $imageWidth = excluded.$imageWidth, $mlVersionColumn = excluded.$mlVersionColumn + ON CONFLICT($fileIDColumn, $faceIDColumn) DO UPDATE SET $faceIDColumn = excluded.$faceIDColumn, $faceDetectionColumn = excluded.$faceDetectionColumn, $embeddingColumn = excluded.$embeddingColumn, $faceScore = excluded.$faceScore, $faceBlur = excluded.$faceBlur, $isSideways = excluded.$isSideways, $imageHeight = excluded.$imageHeight, $imageWidth = excluded.$imageWidth, $mlVersionColumn = excluded.$mlVersionColumn '''; final parameterSets = batch.map((face) { final map = mapRemoteToFaceDB(face); @@ -121,7 +122,7 @@ class FaceMLDataDB { map[fileIDColumn], map[faceIDColumn], map[faceDetectionColumn], - map[faceEmbeddingBlob], + map[embeddingColumn], map[faceScore], map[faceBlur], map[isSideways], @@ -232,6 +233,7 @@ class FaceMLDataDB { await db.execute(deleteClusterPersonTable); await db.execute(deleteClusterSummaryTable); await db.execute(deleteNotPersonFeedbackTable); + await db.execute(deleteClipEmbeddingsTable); } Future> getFaceEmbeddingsForCluster( @@ -240,10 +242,10 @@ class FaceMLDataDB { }) async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $faceEmbeddingBlob FROM $facesTable WHERE $faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID = ?) ${limit != null ? 'LIMIT $limit' : ''}', + 'SELECT $embeddingColumn FROM $facesTable WHERE $faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID = ?) ${limit != null ? 'LIMIT $limit' : ''}', [clusterID], ); - return maps.map((e) => e[faceEmbeddingBlob] as Uint8List); + return maps.map((e) => e[embeddingColumn] as Uint8List); } Future>> getFaceEmbeddingsForClusters( @@ -254,7 +256,7 @@ class FaceMLDataDB { final Map> result = {}; final selectQuery = ''' - SELECT fc.$fcClusterID, fe.$faceEmbeddingBlob + SELECT fc.$fcClusterID, fe.$embeddingColumn FROM $faceClustersTable fc INNER JOIN $facesTable fe ON fc.$fcFaceId = fe.$faceIDColumn WHERE fc.$fcClusterID IN (${clusterIDs.join(',')}) @@ -265,7 +267,7 @@ class FaceMLDataDB { for (final map in maps) { final clusterID = map[fcClusterID] as String; - final faceEmbedding = map[faceEmbeddingBlob] as Uint8List; + final faceEmbedding = map[embeddingColumn] as Uint8List; result.putIfAbsent(clusterID, () => []).add(faceEmbedding); } @@ -300,10 +302,25 @@ class FaceMLDataDB { ); final clusterIDs = clusterRows.map((e) => e[clusterIDColumn] as String).toList(); + // final List> faceMaps = await db.getAll( + // 'SELECT * FROM $facesTable where ' + // '$faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID IN (${clusterIDs.join(",")}))' + // 'AND $fileIDColumn in (${fileId.join(",")}) AND $faceScore > $kMinimumQualityFaceScore ORDER BY $faceScore DESC', + // ); + final List> faceMaps = await db.getAll( - 'SELECT * FROM $facesTable where ' - '$faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID IN (${clusterIDs.join(",")}))' - 'AND $fileIDColumn in (${fileId.join(",")}) AND $faceScore > $kMinimumQualityFaceScore ORDER BY $faceScore DESC', + ''' + SELECT * FROM $facesTable + WHERE $faceIDColumn IN ( + SELECT $fcFaceId + FROM $faceClustersTable + WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + ) + AND $fileIDColumn IN (${List.filled(fileId.length, '?').join(',')}) + AND $faceScore > ? + ORDER BY $faceScore DESC + ''', + [...clusterIDs, ...fileId, kMinimumQualityFaceScore], ); if (faceMaps.isNotEmpty) { if (avatarFileId != null) { @@ -367,6 +384,14 @@ class FaceMLDataDB { final List> maps = await db.getAll( 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable WHERE $fcClusterID IN (${clusterIDs.join(",")})', ); + final List> maps = await db.query( + faceClustersTable, + columns: [fcClusterID, fcFaceId], + where: + '$fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')})', + whereArgs: clusterIDs, + ); + for (final map in maps) { final clusterID = map[fcClusterID] as String; final faceID = map[fcFaceId] as String; @@ -541,7 +566,7 @@ class FaceMLDataDB { while (true) { // Query a batch of rows final List> maps = await db.getAll( - 'SELECT $faceIDColumn, $faceEmbeddingBlob, $faceScore, $faceBlur, $isSideways FROM $facesTable' + 'SELECT $faceIDColumn, $embeddingColumn, $faceScore, $faceBlur, $isSideways FROM $facesTable' ' WHERE $faceScore > $minScore AND $faceBlur > $minClarity' ' ORDER BY $faceIDColumn' ' DESC LIMIT $batchSize OFFSET $offset', @@ -560,7 +585,7 @@ class FaceMLDataDB { final faceInfo = FaceDbInfoForClustering( faceID: faceID, clusterId: faceIdToClusterId[faceID], - embeddingBytes: map[faceEmbeddingBlob] as Uint8List, + embeddingBytes: map[embeddingColumn] as Uint8List, faceScore: map[faceScore] as double, blurValue: map[faceBlur] as double, isSideways: (map[isSideways] as int) == 1, @@ -594,7 +619,7 @@ class FaceMLDataDB { while (true) { // Query a batch of rows final String query = ''' - SELECT $faceIDColumn, $faceEmbeddingBlob + SELECT $faceIDColumn, $embeddingColumn FROM $facesTable WHERE $faceIDColumn IN (${faceIDs.map((id) => "'$id'").join(",")}) ORDER BY $faceIDColumn DESC @@ -607,7 +632,7 @@ class FaceMLDataDB { } for (final map in maps) { final faceID = map[faceIDColumn] as String; - result[faceID] = map[faceEmbeddingBlob] as Uint8List; + result[faceID] = map[embeddingColumn] as Uint8List; } if (result.length > 10000) { break; diff --git a/mobile/lib/db/ml/db_fields.dart b/mobile/lib/db/ml/db_fields.dart index c1de4780bc..f05953855e 100644 --- a/mobile/lib/db/ml/db_fields.dart +++ b/mobile/lib/db/ml/db_fields.dart @@ -5,7 +5,7 @@ const facesTable = 'faces'; const fileIDColumn = 'file_id'; const faceIDColumn = 'face_id'; const faceDetectionColumn = 'detection'; -const faceEmbeddingBlob = 'eBlob'; +const embeddingColumn = 'embedding'; const faceScore = 'score'; const faceBlur = 'blur'; const isSideways = 'is_sideways'; @@ -18,7 +18,7 @@ const createFacesTable = '''CREATE TABLE IF NOT EXISTS $facesTable ( $fileIDColumn INTEGER NOT NULL, $faceIDColumn TEXT NOT NULL UNIQUE, $faceDetectionColumn TEXT NOT NULL, - $faceEmbeddingBlob BLOB NOT NULL, + $embeddingColumn BLOB NOT NULL, $faceScore REAL NOT NULL, $faceBlur REAL NOT NULL DEFAULT $kLapacianDefault, $isSideways INTEGER NOT NULL DEFAULT 0, @@ -95,3 +95,17 @@ CREATE TABLE IF NOT EXISTS $notPersonFeedback ( '''; const deleteNotPersonFeedbackTable = 'DELETE FROM $notPersonFeedback'; // End Clusters Table Fields & Schema Queries + +// ## CLIP EMBEDDINGS TABLE +const clipTable = 'clip'; + +const createClipEmbeddingsTable = ''' +CREATE TABLE IF NOT EXISTS $clipTable ( + $fileIDColumn INTEGER NOT NULL, + $embeddingColumn BLOB NOT NULL, + $mlVersionColumn INTEGER NOT NULL, + PRIMARY KEY ($fileIDColumn) + ); +'''; + +const deleteClipEmbeddingsTable = 'DELETE FROM $clipTable'; diff --git a/mobile/lib/db/ml/db_model_mappers.dart b/mobile/lib/db/ml/db_model_mappers.dart index 85f7d3ce17..7e84f1ced8 100644 --- a/mobile/lib/db/ml/db_model_mappers.dart +++ b/mobile/lib/db/ml/db_model_mappers.dart @@ -1,9 +1,9 @@ import "dart:convert"; -import 'package:photos/face/db_fields.dart'; -import "package:photos/face/model/detection.dart"; -import "package:photos/face/model/face.dart"; +import 'package:photos/db/ml/db_fields.dart'; import "package:photos/generated/protos/ente/common/vector.pb.dart"; +import "package:photos/models/ml/face/detection.dart"; +import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/ml_versions.dart"; Map mapRemoteToFaceDB(Face face) { @@ -11,7 +11,7 @@ Map mapRemoteToFaceDB(Face face) { faceIDColumn: face.faceID, fileIDColumn: face.fileID, faceDetectionColumn: json.encode(face.detection.toJson()), - faceEmbeddingBlob: EVector( + embeddingColumn: EVector( values: face.embedding, ).writeToBuffer(), faceScore: face.score, @@ -27,7 +27,7 @@ Face mapRowToFace(Map row) { return Face( row[faceIDColumn] as String, row[fileIDColumn] as int, - EVector.fromBuffer(row[faceEmbeddingBlob] as List).values, + EVector.fromBuffer(row[embeddingColumn] as List).values, row[faceScore] as double, Detection.fromJson(json.decode(row[faceDetectionColumn] as String)), row[faceBlur] as double, diff --git a/mobile/lib/db/ml/embeddings_db.dart b/mobile/lib/db/ml/embeddings_db.dart index 1cdd331c30..be537e3c67 100644 --- a/mobile/lib/db/ml/embeddings_db.dart +++ b/mobile/lib/db/ml/embeddings_db.dart @@ -1,135 +1,71 @@ import "dart:io"; import "dart:typed_data"; -import "package:path/path.dart"; -import 'package:path_provider/path_provider.dart'; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/db.dart"; +import "package:photos/db/ml/db_fields.dart"; import "package:photos/events/embedding_updated_event.dart"; -import "package:photos/models/embedding.dart"; -import "package:sqlite_async/sqlite_async.dart"; - -class EmbeddingsDB { - EmbeddingsDB._privateConstructor(); - - static final EmbeddingsDB instance = EmbeddingsDB._privateConstructor(); +import "package:photos/models/ml/clip.dart"; +extension EmbeddingsDB on FaceMLDataDB { static const databaseName = "ente.embeddings.db"; - static const tableName = "clip_embedding"; - static const oldTableName = "embeddings"; - static const columnFileID = "file_id"; - static const columnEmbedding = "embedding"; - static const columnVersion = "version"; - - @Deprecated("") - static const columnUpdationTime = "updation_time"; - - static Future? _dbFuture; - - Future get _database async { - _dbFuture ??= _initDatabase(); - return _dbFuture!; - } - - Future init() async { - final dir = await getApplicationDocumentsDirectory(); - await _clearDeprecatedStores(dir); - } - - Future _initDatabase() async { - final Directory documentsDirectory = - await getApplicationDocumentsDirectory(); - final String path = join(documentsDirectory.path, databaseName); - final migrations = SqliteMigrations() - ..add( - SqliteMigration( - 1, - (tx) async { - // Avoid creating the old table - // await tx.execute( - // 'CREATE TABLE $oldTableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnUpdationTime INTEGER, UNIQUE ($columnFileID))', - // ); - }, - ), - ) - ..add( - SqliteMigration( - 2, - (tx) async { - // delete old table - await tx.execute('DROP TABLE IF EXISTS $oldTableName'); - await tx.execute( - 'CREATE TABLE $tableName ($columnFileID INTEGER NOT NULL, $columnEmbedding BLOB NOT NULL, $columnVersion INTEGER, UNIQUE ($columnFileID))', - ); - }, - ), - ); - final database = SqliteDatabase(path: path); - await migrations.migrate(database); - return database; - } - - Future clearTable() async { - final db = await _database; - await db.execute('DELETE FROM $tableName'); - } Future> getAll() async { - final db = await _database; - final results = await db.getAll('SELECT * FROM $tableName'); + final db = await FaceMLDataDB.instance.asyncDB; + final results = await db.getAll('SELECT * FROM $clipTable'); return _convertToEmbeddings(results); } // Get indexed FileIDs - Future> getIndexedFileIds() async { - final db = await _database; + Future> clipIndexedFileWithVersion() async { + final db = await FaceMLDataDB.instance.asyncDB; final maps = await db - .getAll('SELECT $columnFileID , $columnVersion FROM $tableName'); + .getAll('SELECT $fileIDColumn , $mlVersionColumn FROM $clipTable'); final Map result = {}; for (final map in maps) { - result[map[columnFileID] as int] = map[columnVersion] as int; + result[map[mlVersionColumn] as int] = map[mlVersionColumn] as int; } return result; } - // TODO: Add actual colomn for version and use here, similar to faces - Future getIndexedFileCount() async { - final db = await _database; + Future getClipIndexedFileCount() async { + final db = await FaceMLDataDB.instance.asyncDB; const String query = - 'SELECT COUNT(DISTINCT $columnFileID) as count FROM $tableName'; + 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable'; final List> maps = await db.getAll(query); return maps.first['count'] as int; } Future put(ClipEmbedding embedding) async { - final db = await _database; + final db = await FaceMLDataDB.instance.asyncDB; await db.execute( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnVersion) VALUES (?, ?, ?)', + 'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) VALUES (?, ?, ?)', _getRowFromEmbedding(embedding), ); Bus.instance.fire(EmbeddingUpdatedEvent()); } Future putMany(List embeddings) async { - final db = await _database; + final db = await FaceMLDataDB.instance.asyncDB; final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList(); await db.executeBatch( - 'INSERT OR REPLACE INTO $tableName ($columnFileID, $columnEmbedding, $columnVersion) values(?, ?, ?)', + 'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) values(?, ?, ?)', inputs, ); Bus.instance.fire(EmbeddingUpdatedEvent()); } Future deleteEmbeddings(List fileIDs) async { - final db = await _database; + final db = await FaceMLDataDB.instance.asyncDB; await db.execute( - 'DELETE FROM $tableName WHERE $columnFileID IN (${fileIDs.join(", ")})', + 'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})', ); Bus.instance.fire(EmbeddingUpdatedEvent()); } - Future deleteAll() async { - final db = await _database; - await db.execute('DELETE FROM $tableName'); + Future deleteClipIndexes() async { + final db = await FaceMLDataDB.instance.asyncDB; + await db.execute('DELETE FROM $clipTable'); Bus.instance.fire(EmbeddingUpdatedEvent()); } @@ -144,9 +80,9 @@ class EmbeddingsDB { } ClipEmbedding _getEmbeddingFromRow(Map row) { - final fileID = row[columnFileID]; - final bytes = row[columnEmbedding] as Uint8List; - final version = row[columnVersion] as int; + final fileID = row[fileIDColumn] as int; + final bytes = row[embeddingColumn] as Uint8List; + final version = row[mlVersionColumn] as int; final list = Float32List.view(bytes.buffer); return ClipEmbedding(fileID: fileID, embedding: list, version: version); } diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index cfbb4a8367..1864fbbbac 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -18,9 +18,9 @@ import 'package:photos/core/constants.dart'; import 'package:photos/core/error-reporting/super_logging.dart'; import 'package:photos/core/errors.dart'; import 'package:photos/core/network/network.dart'; +import "package:photos/db/ml/db.dart"; import 'package:photos/db/upload_locks_db.dart'; import 'package:photos/ente_theme_data.dart'; -import "package:photos/face/db.dart"; import "package:photos/l10n/l10n.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/app_lifecycle_service.dart'; diff --git a/mobile/lib/models/ml/face/detection.dart b/mobile/lib/models/ml/face/detection.dart index f77fd61b8a..766e326fae 100644 --- a/mobile/lib/models/ml/face/detection.dart +++ b/mobile/lib/models/ml/face/detection.dart @@ -1,7 +1,7 @@ import "dart:math" show min, max; -import "package:photos/face/model/box.dart"; -import "package:photos/face/model/landmark.dart"; +import "package:photos/models/ml/face/box.dart"; +import "package:photos/models/ml/face/landmark.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; /// Stores the face detection data, notably the bounding box and landmarks. diff --git a/mobile/lib/models/ml/face/face.dart b/mobile/lib/models/ml/face/face.dart index 99f07cb2dc..0ff5b86eb1 100644 --- a/mobile/lib/models/ml/face/face.dart +++ b/mobile/lib/models/ml/face/face.dart @@ -1,4 +1,4 @@ -import "package:photos/face/model/detection.dart"; +import "package:photos/models/ml/face/detection.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/ml_result.dart"; diff --git a/mobile/lib/services/filedata/model/file_data.dart b/mobile/lib/services/filedata/model/file_data.dart index 2c06cf601c..d73ee1d2f8 100644 --- a/mobile/lib/services/filedata/model/file_data.dart +++ b/mobile/lib/services/filedata/model/file_data.dart @@ -1,4 +1,4 @@ -import "package:photos/face/model/face.dart"; +import "package:photos/models/ml/face/face.dart"; const _faceKey = 'face'; const _clipKey = 'clip'; diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/detection.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/detection.dart index 6dbb209dcd..de544314ef 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/detection.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/detection.dart @@ -1,6 +1,6 @@ import 'dart:math' show max, min; -import "package:photos/face/model/dimension.dart"; +import "package:photos/models/ml/face/dimension.dart"; enum FaceDirection { left, right, straight } diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index 2aeb68d604..afe1a3cfae 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -6,7 +6,7 @@ import 'dart:ui' as ui show Image; import 'package:logging/logging.dart'; import "package:onnx_dart/onnx_dart.dart"; import 'package:onnxruntime/onnxruntime.dart'; -import "package:photos/face/model/dimension.dart"; +import "package:photos/models/ml/face/dimension.dart"; import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_postprocessing.dart"; import "package:photos/services/machine_learning/ml_model.dart"; diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 8ac8091f31..e51931e254 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -5,13 +5,13 @@ import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; -import "package:photos/db/embeddings_db.dart"; +import "package:photos/db/ml/db.dart"; +import "package:photos/db/ml/embeddings_db.dart"; import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/list.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/face.dart"; -import "package:photos/models/embedding.dart"; +import "package:photos/models/ml/clip.dart"; +import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/filedata/filedata_service.dart"; @@ -144,7 +144,7 @@ class FaceRecognitionService { } } await FaceMLDataDB.instance.bulkInsertFaces(faces); - await EmbeddingsDB.instance.putMany(clipEmbeddings); + await FaceMLDataDB.instance.putMany(clipEmbeddings); } // Yield any remaining instructions if (batchToYield.isNotEmpty) { diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index 85fb95af75..f02110baca 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -7,12 +7,12 @@ import "package:logging/logging.dart"; import "package:ml_linalg/linalg.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/stop_watch.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; @@ -249,7 +249,7 @@ class ClusterFeedbackService { PeopleChangedEvent( relevantFiles: files, type: PeopleEventType.removedFilesFromCluster, - source: "$clusterID", + source: clusterID, ), ); _logger.info('removeFilesFromCluster done'); diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 5a5f4b23a6..fd676b8980 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -4,11 +4,11 @@ import "dart:developer"; import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/stop_watch.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/api/entity/type.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/services/entity_service.dart"; import "package:shared_preferences/shared_preferences.dart"; diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 753725abc0..ed9cc719d4 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -5,7 +5,7 @@ import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:logging/logging.dart"; -import "package:photos/face/model/box.dart"; +import "package:photos/models/ml/face/box.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_tokenizer.dart"; diff --git a/mobile/lib/services/machine_learning/ml_result.dart b/mobile/lib/services/machine_learning/ml_result.dart index 254564cfc6..9385639ee8 100644 --- a/mobile/lib/services/machine_learning/ml_result.dart +++ b/mobile/lib/services/machine_learning/ml_result.dart @@ -1,6 +1,6 @@ import "dart:convert" show jsonEncode, jsonDecode; -import "package:photos/face/model/dimension.dart"; +import "package:photos/models/ml/face/dimension.dart"; import 'package:photos/models/ml/ml_typedefs.dart'; import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/face_ml/face_alignment/alignment_result.dart'; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 1ed24f0d46..a2ef72b3f3 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -8,13 +8,13 @@ import "package:logging/logging.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/box.dart"; -import "package:photos/face/model/detection.dart" as face_detection; -import "package:photos/face/model/face.dart"; -import "package:photos/face/model/landmark.dart"; +import "package:photos/models/ml/face/box.dart"; +import "package:photos/models/ml/face/detection.dart" as face_detection; +import "package:photos/models/ml/face/face.dart"; +import "package:photos/models/ml/face/landmark.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/filedata/filedata_service.dart"; import "package:photos/services/filedata/model/file_data.dart"; diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index 9329a79081..0949f4f0fd 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -9,10 +9,9 @@ import 'package:photos/data/holidays.dart'; import 'package:photos/data/months.dart'; import 'package:photos/data/years.dart'; import 'package:photos/db/files_db.dart'; +import "package:photos/db/ml/db.dart"; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/extensions/string_ext.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/api/collection/user.dart"; import 'package:photos/models/collection/collection.dart'; import 'package:photos/models/collection/collection_items.dart'; @@ -22,6 +21,7 @@ import 'package:photos/models/file/file_type.dart'; import "package:photos/models/local_entity_data.dart"; import "package:photos/models/location/location.dart"; import "package:photos/models/location_tag/location_tag.dart"; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/search/album_search_result.dart'; import 'package:photos/models/search/generic_search_result.dart'; import "package:photos/models/search/search_constants.dart"; diff --git a/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart b/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart index d295d85e1c..0f31986598 100644 --- a/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart +++ b/mobile/lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:photos/core/constants.dart'; -import "package:photos/face/model/person.dart"; import 'package:photos/models/collection/collection.dart'; import "package:photos/models/gallery_type.dart"; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/bottom_action_bar/action_bar_widget.dart'; diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 5eed505b86..08bef662ed 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -3,9 +3,9 @@ import "dart:async"; import 'package:flutter/material.dart'; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index cf90489c6d..4508300aab 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -11,7 +11,6 @@ import 'package:photos/core/configuration.dart'; import "package:photos/core/event_bus.dart"; import "package:photos/events/guest_view_event.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/models/collection/collection.dart'; import 'package:photos/models/device_collection.dart'; @@ -20,6 +19,7 @@ import 'package:photos/models/file/file_type.dart'; import 'package:photos/models/files_split.dart'; import 'package:photos/models/gallery_type.dart'; import "package:photos/models/metadata/common_keys.dart"; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/hidden_service.dart'; diff --git a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart index bb9825f649..fbc998110a 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_overlay_bar.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import "package:photos/face/model/person.dart"; import 'package:photos/models/collection/collection.dart'; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/theme/effects.dart"; import "package:photos/theme/ente_theme.dart"; diff --git a/mobile/lib/ui/viewer/file_details/face_widget.dart b/mobile/lib/ui/viewer/file_details/face_widget.dart index 7465f7c8c0..3ab4dac6ca 100644 --- a/mobile/lib/ui/viewer/file_details/face_widget.dart +++ b/mobile/lib/ui/viewer/file_details/face_widget.dart @@ -4,11 +4,11 @@ import "dart:typed_data"; import "package:flutter/cupertino.dart"; import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/material.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/extensions/stop_watch.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/face.dart"; -import "package:photos/face/model/person.dart"; import 'package:photos/models/file/file.dart'; +import "package:photos/models/ml/face/face.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/models/nanoids/cluster_id.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; diff --git a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart index 304beba5a4..8b12547b26 100644 --- a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart +++ b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart @@ -3,11 +3,11 @@ import "dart:developer" as dev show log; import "package:flutter/foundation.dart" show Uint8List, kDebugMode; import "package:flutter/material.dart"; import "package:logging/logging.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/box.dart"; -import "package:photos/face/model/face.dart"; -import "package:photos/face/model/person.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/box.dart"; +import "package:photos/models/ml/face/face.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/ui/components/buttons/chip_button_widget.dart"; diff --git a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart index c868e60e71..cb8dfe797a 100644 --- a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart +++ b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart @@ -7,11 +7,11 @@ import 'package:flutter/material.dart'; import "package:logging/logging.dart"; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/search_service.dart"; diff --git a/mobile/lib/ui/viewer/people/cluster_app_bar.dart b/mobile/lib/ui/viewer/people/cluster_app_bar.dart index 25b16aab34..05df78c390 100644 --- a/mobile/lib/ui/viewer/people/cluster_app_bar.dart +++ b/mobile/lib/ui/viewer/people/cluster_app_bar.dart @@ -6,12 +6,12 @@ import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import 'package:photos/events/subscription_purchased_event.dart'; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; diff --git a/mobile/lib/ui/viewer/people/cluster_page.dart b/mobile/lib/ui/viewer/people/cluster_page.dart index 05b89d8247..af41a200be 100644 --- a/mobile/lib/ui/viewer/people/cluster_page.dart +++ b/mobile/lib/ui/viewer/people/cluster_page.dart @@ -6,11 +6,11 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; diff --git a/mobile/lib/ui/viewer/people/people_app_bar.dart b/mobile/lib/ui/viewer/people/people_app_bar.dart index 828dff6bfd..12f80fbfdf 100644 --- a/mobile/lib/ui/viewer/people/people_app_bar.dart +++ b/mobile/lib/ui/viewer/people/people_app_bar.dart @@ -7,10 +7,10 @@ import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import "package:photos/events/people_changed_event.dart"; import 'package:photos/events/subscription_purchased_event.dart'; -import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; @@ -67,7 +67,8 @@ class _AppBarWidgetState extends State { }; collectionActions = CollectionActions(CollectionsService.instance); widget.selectedFiles.addListener(_selectedFilesListener); - _userAuthEventSubscription = Bus.instance.on().listen((event) { + _userAuthEventSubscription = + Bus.instance.on().listen((event) { setState(() {}); }); _appBarTitle = widget.title; @@ -88,7 +89,8 @@ class _AppBarWidgetState extends State { centerTitle: false, title: Text( _appBarTitle!, - style: Theme.of(context).textTheme.headlineSmall!.copyWith(fontSize: 16), + style: + Theme.of(context).textTheme.headlineSmall!.copyWith(fontSize: 16), maxLines: 2, overflow: TextOverflow.ellipsis, ), @@ -112,7 +114,8 @@ class _AppBarWidgetState extends State { } try { - await PersonService.instance.updateAttributes(widget.person.remoteID, name: text); + await PersonService.instance + .updateAttributes(widget.person.remoteID, name: text); if (mounted) { _appBarTitle = text; setState(() {}); @@ -132,7 +135,8 @@ class _AppBarWidgetState extends State { List _getDefaultActions(BuildContext context) { final List actions = []; // If the user has selected files, don't show any actions - if (widget.selectedFiles.files.isNotEmpty || !Configuration.instance.hasConfiguredAccount()) { + if (widget.selectedFiles.files.isNotEmpty || + !Configuration.instance.hasConfiguredAccount()) { return actions; } @@ -223,7 +227,8 @@ class _AppBarWidgetState extends State { unawaited( Navigator.of(context).push( MaterialPageRoute( - builder: (context) => PersonReviewClusterSuggestion(widget.person), + builder: (context) => + PersonReviewClusterSuggestion(widget.person), ), ), ); @@ -266,11 +271,13 @@ class _AppBarWidgetState extends State { bool assignName = false; await showChoiceDialog( context, - title: "Are you sure you want to show this person in people section again?", + title: + "Are you sure you want to show this person in people section again?", firstButtonLabel: "Yes, show person", firstButtonOnTap: () async { try { - await PersonService.instance.deletePerson(widget.person.remoteID, onlyMapping: false); + await PersonService.instance + .deletePerson(widget.person.remoteID, onlyMapping: false); Bus.instance.fire(PeopleChangedEvent()); assignName = true; } catch (e, s) { diff --git a/mobile/lib/ui/viewer/people/people_page.dart b/mobile/lib/ui/viewer/people/people_page.dart index f857943ea3..74a7e7f6bb 100644 --- a/mobile/lib/ui/viewer/people/people_page.dart +++ b/mobile/lib/ui/viewer/people/people_page.dart @@ -7,10 +7,10 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/model/person.dart"; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index db1141fa9e..0c5a4ccbf1 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -6,11 +6,11 @@ import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/l10n/l10n.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/theme/ente_theme.dart"; diff --git a/mobile/lib/ui/viewer/people/person_clusters_page.dart b/mobile/lib/ui/viewer/people/person_clusters_page.dart index 810fcbc779..935ddbff87 100644 --- a/mobile/lib/ui/viewer/people/person_clusters_page.dart +++ b/mobile/lib/ui/viewer/people/person_clusters_page.dart @@ -3,8 +3,8 @@ import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/search_service.dart"; import "package:photos/theme/ente_theme.dart"; diff --git a/mobile/lib/ui/viewer/people/person_row_item.dart b/mobile/lib/ui/viewer/people/person_row_item.dart index ed1fc9fa27..95e2453eaa 100644 --- a/mobile/lib/ui/viewer/people/person_row_item.dart +++ b/mobile/lib/ui/viewer/people/person_row_item.dart @@ -1,6 +1,6 @@ import "package:flutter/material.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/ui/viewer/search/result/person_face_widget.dart"; class PersonRowItem extends StatelessWidget { diff --git a/mobile/lib/ui/viewer/search/result/person_face_widget.dart b/mobile/lib/ui/viewer/search/result/person_face_widget.dart index eea17134b2..1b812dd36a 100644 --- a/mobile/lib/ui/viewer/search/result/person_face_widget.dart +++ b/mobile/lib/ui/viewer/search/result/person_face_widget.dart @@ -3,10 +3,10 @@ import "dart:typed_data"; import 'package:flutter/widgets.dart'; import "package:photos/db/files_db.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/face.dart"; -import "package:photos/face/model/person.dart"; +import "package:photos/db/ml/db.dart"; import 'package:photos/models/file/file.dart'; +import "package:photos/models/ml/face/face.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index b3ce01045f..3e1d7599e5 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -4,8 +4,8 @@ import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:photos/core/constants.dart"; import "package:photos/events/event.dart"; -import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/face/person.dart"; import "package:photos/models/search/album_search_result.dart"; import "package:photos/models/search/generic_search_result.dart"; import "package:photos/models/search/recent_searches.dart"; diff --git a/mobile/lib/utils/face/face_box_crop.dart b/mobile/lib/utils/face/face_box_crop.dart index 197aa31f38..a9b5567a9f 100644 --- a/mobile/lib/utils/face/face_box_crop.dart +++ b/mobile/lib/utils/face/face_box_crop.dart @@ -2,9 +2,9 @@ import "dart:io" show File; import "package:flutter/foundation.dart"; import "package:photos/core/cache/lru_map.dart"; -import "package:photos/face/model/box.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; +import "package:photos/models/ml/face/box.dart"; import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/thumbnail_util.dart"; diff --git a/mobile/lib/utils/face/face_util.dart b/mobile/lib/utils/face/face_util.dart index 56dc8f3bf0..cb5b186b04 100644 --- a/mobile/lib/utils/face/face_util.dart +++ b/mobile/lib/utils/face/face_util.dart @@ -5,7 +5,7 @@ import "package:computer/computer.dart"; import "package:flutter_image_compress/flutter_image_compress.dart"; import "package:image/image.dart" as img; import "package:logging/logging.dart"; -import "package:photos/face/model/box.dart"; +import "package:photos/models/ml/face/box.dart"; /// Bounding box of a face. /// diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index e566a9d536..b0badaede3 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -6,8 +6,8 @@ import "dart:ui"; import 'package:flutter/painting.dart' as paint show decodeImageFromList; import 'package:ml_linalg/linalg.dart'; -import "package:photos/face/model/box.dart"; -import "package:photos/face/model/dimension.dart"; +import "package:photos/models/ml/face/box.dart"; +import "package:photos/models/ml/face/dimension.dart"; import 'package:photos/services/machine_learning/face_ml/face_alignment/alignment_result.dart'; import 'package:photos/services/machine_learning/face_ml/face_alignment/similarity_transform.dart'; import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index bc0cb6c737..5b68b9c819 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -5,13 +5,13 @@ import "dart:typed_data" show ByteData; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; -import "package:photos/db/embeddings_db.dart"; import "package:photos/db/files_db.dart"; -import "package:photos/face/db.dart"; -import "package:photos/face/model/dimension.dart"; +import "package:photos/db/ml/db.dart"; +import "package:photos/db/ml/embeddings_db.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; +import "package:photos/models/ml/face/dimension.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; @@ -54,7 +54,7 @@ Future getIndexStatus() async { final int facesIndexedFiles = await FaceMLDataDB.instance.getIndexedFileCount(); final int clipIndexedFiles = - await EmbeddingsDB.instance.getIndexedFileCount(); + await FaceMLDataDB.instance.getClipIndexedFileCount(); final int indexedFiles = math.min(facesIndexedFiles, clipIndexedFiles); final showIndexedFiles = math.min(indexedFiles, indexableFiles); @@ -73,7 +73,7 @@ Future> getFilesForMlIndexing() async { final Map faceIndexedFileIDs = await FaceMLDataDB.instance.getIndexedFileIds(); final Map clipIndexedFileIDs = - await EmbeddingsDB.instance.getIndexedFileIds(); + await FaceMLDataDB.instance.clipIndexedFileWithVersion(); // Get all regular files and all hidden files final enteFiles = await SearchService.instance.getAllFiles(); From bfec2ff2be52917f2ac9dfc2ac498db7c49f003b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:22:02 +0530 Subject: [PATCH 0266/1179] [mob] Use single db for ml data --- mobile/lib/models/api/entity/type.dart | 2 ++ .../semantic_search_service.dart | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/mobile/lib/models/api/entity/type.dart b/mobile/lib/models/api/entity/type.dart index 431ea4e57b..05de5c7826 100644 --- a/mobile/lib/models/api/entity/type.dart +++ b/mobile/lib/models/api/entity/type.dart @@ -15,6 +15,8 @@ EntityType typeFromString(String type) { return EntityType.location; case "person_v2": return EntityType.personV2; + case "personV2": + return EntityType.personV2; } debugPrint("unexpected collection type $type"); return EntityType.unknown; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 1c196314b0..ec68264142 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -1,18 +1,19 @@ import "dart:async" show unawaited; import "dart:developer" as dev show log; import "dart:math" show min; -import "dart:typed_data" show ByteData; import "dart:ui" show Image; import "package:computer/computer.dart"; +import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:photos/core/cache/lru_map.dart"; import "package:photos/core/event_bus.dart"; -import "package:photos/db/embeddings_db.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/db.dart"; +import "package:photos/db/ml/embeddings_db.dart"; import 'package:photos/events/embedding_updated_event.dart'; -import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/ml/clip.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/collections_service.dart"; @@ -57,7 +58,7 @@ class SemanticSearchService { return; } _hasInitialized = true; - await EmbeddingsDB.instance.init(); + await _loadImageEmbeddings(); Bus.instance.on().listen((event) { if (!_hasInitialized) return; @@ -112,7 +113,7 @@ class SemanticSearchService { } Future clearIndexes() async { - await EmbeddingsDB.instance.deleteAll(); + await FaceMLDataDB.instance.deleteClipIndexes(); final preferences = await SharedPreferences.getInstance(); await preferences.remove("sync_time_embeddings_v3"); _logger.info("Indexes cleared"); @@ -121,7 +122,7 @@ class SemanticSearchService { Future _loadImageEmbeddings() async { _logger.info("Pulling cached embeddings"); final startTime = DateTime.now(); - _cachedImageEmbeddings = await EmbeddingsDB.instance.getAll(); + _cachedImageEmbeddings = await FaceMLDataDB.instance.getAll(); final endTime = DateTime.now(); _logger.info( "Loading ${_cachedImageEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", @@ -133,7 +134,7 @@ class SemanticSearchService { Future> _getFileIDsToBeIndexed() async { final uploadedFileIDs = await getIndexableFileIDs(); - final embeddedFileIDs = await EmbeddingsDB.instance.getIndexedFileIds(); + final embeddedFileIDs = await FaceMLDataDB.instance.getIndexedFileIds(); embeddedFileIDs.removeWhere((key, value) => value < clipMlVersion); return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); @@ -178,7 +179,7 @@ class SemanticSearchService { _logger.info(results.length.toString() + " results"); if (deletedEntries.isNotEmpty) { - unawaited(EmbeddingsDB.instance.deleteEmbeddings(deletedEntries)); + unawaited(FaceMLDataDB.instance.deleteEmbeddings(deletedEntries)); } return results; @@ -221,7 +222,7 @@ class SemanticSearchService { _logger.info(results.length.toString() + " results"); if (deletedEntries.isNotEmpty) { - unawaited(EmbeddingsDB.instance.deleteEmbeddings(deletedEntries)); + unawaited(FaceMLDataDB.instance.deleteEmbeddings(deletedEntries)); } final matchingFileIDs = []; @@ -253,12 +254,12 @@ class SemanticSearchService { embedding: clipResult.embedding, version: clipMlVersion, ); - await EmbeddingsDB.instance.put(embedding); + await FaceMLDataDB.instance.put(embedding); } static Future storeEmptyClipImageResult(EnteFile entefile) async { final embedding = ClipEmbedding.empty(entefile.uploadedFileID!); - await EmbeddingsDB.instance.put(embedding); + await FaceMLDataDB.instance.put(embedding); } Future> _getTextEmbedding(String query) async { @@ -320,6 +321,7 @@ List computeBulkSimilarities(Map args) { final textEmbedding = args["textEmbedding"] as List; final minimumSimilarity = args["minimumSimilarity"] ?? SemanticSearchService.kMinimumSimilarityThreshold; + double bestScore = 0.0; for (final imageEmbedding in imageEmbeddings) { final score = computeCosineSimilarity( imageEmbedding.embedding, @@ -328,6 +330,12 @@ List computeBulkSimilarities(Map args) { if (score >= minimumSimilarity) { queryResults.add(QueryResult(imageEmbedding.fileID, score)); } + if (score > bestScore) { + bestScore = score; + } + } + if (kDebugMode && queryResults.isEmpty) { + dev.log("No results found for query with best score: $bestScore"); } queryResults.sort((first, second) => second.score.compareTo(first.score)); From 6a8fe7100031c502e85c37da8e0e104638fc6eac Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 14:38:33 +0530 Subject: [PATCH 0267/1179] Extra --- web/apps/photos/src/services/searchService.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index adc33fa40d..0c203b1189 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -417,9 +417,12 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { } } +let done = false; async function getAllPeople(limit: number = undefined) { if (!(await wipClusterEnable())) return []; + if (done) return []; + done = true; if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { await syncPersons(); const people = await persons(); From a90cb4e45fe07475bbc40e10b4d73df6975a63e7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:41:11 +0530 Subject: [PATCH 0268/1179] [mob] Fix queries --- mobile/lib/db/ml/db.dart | 49 +++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 11c9cf26d4..7d1a8b1700 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -29,6 +29,7 @@ class FaceMLDataDB { static final Logger _logger = Logger("FaceMLDataDB"); static const _databaseName = "ente.face_ml_db_v3.db"; + // static const _databaseVersion = 1; FaceMLDataDB._privateConstructor(); @@ -256,14 +257,20 @@ class FaceMLDataDB { final Map> result = {}; final selectQuery = ''' - SELECT fc.$fcClusterID, fe.$embeddingColumn - FROM $faceClustersTable fc - INNER JOIN $facesTable fe ON fc.$fcFaceId = fe.$faceIDColumn - WHERE fc.$fcClusterID IN (${clusterIDs.join(',')}) - ${limit != null ? 'LIMIT $limit' : ''} - '''; + SELECT fc.$fcClusterID, fe.$embeddingColumn + FROM $faceClustersTable fc + INNER JOIN $facesTable fe ON fc.$fcFaceId = fe.$faceIDColumn + WHERE fc.$fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + ${limit != null ? 'LIMIT ?' : ''} +'''; - final List> maps = await db.getAll(selectQuery); + final List selectQueryParams = [...clusterIDs]; + if (limit != null) { + selectQueryParams.add(limit); + } + + final List> maps = + await db.getAll(selectQuery, selectQueryParams); for (final map in maps) { final clusterID = map[fcClusterID] as String; @@ -381,15 +388,14 @@ class FaceMLDataDB { ) async { final db = await instance.asyncDB; final Map> result = {}; + final List> maps = await db.getAll( - 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable WHERE $fcClusterID IN (${clusterIDs.join(",")})', - ); - final List> maps = await db.query( - faceClustersTable, - columns: [fcClusterID, fcFaceId], - where: - '$fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')})', - whereArgs: clusterIDs, + ''' + SELECT $fcClusterID, $fcFaceId + FROM $faceClustersTable + WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + ''', + [...clusterIDs], ); for (final map in maps) { @@ -807,8 +813,12 @@ class FaceMLDataDB { final db = instance.asyncDB; return db.then((db) async { final List> maps = await db.getAll( - 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable ' - 'WHERE $fcClusterID IN (${clusterIDs.join(",")})', + ''' + SELECT $fcClusterID, $fcFaceId + FROM $faceClustersTable + WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + ''', + [...clusterIDs], ); final Map> result = {}; for (final map in maps) { @@ -876,9 +886,12 @@ class FaceMLDataDB { ) async { final db = await instance.asyncDB; final Map result = {}; + final rows = await db.getAll( - 'SELECT * FROM $clusterSummaryTable WHERE $clusterIDColumn IN (${clusterIDs.join(",")})', + 'SELECT * FROM $clusterSummaryTable WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')})', + [...clusterIDs], ); + for (final r in rows) { final id = r[clusterIDColumn] as String; final avg = r[avgColumn] as Uint8List; From 367a715aa8c8aacfa5d7bf6f1ff12cd53e94e97f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 15:19:10 +0530 Subject: [PATCH 0269/1179] Reduce CLIP threshold to 0.175 --- web/packages/new/photos/services/ml/clip.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/clip.ts b/web/packages/new/photos/services/ml/clip.ts index b226ef10cb..e81036ae56 100644 --- a/web/packages/new/photos/services/ml/clip.ts +++ b/web/packages/new/photos/services/ml/clip.ts @@ -186,5 +186,8 @@ export const clipMatches = async ( // This code is on the hot path, so these optimizations help. [fileID, dotProduct(embedding, textEmbedding)] as const, ); - return new Map(items.filter(([, score]) => score >= 0.2)); + // This score threshold was obtain heuristically. 0.2 generally gives solid + // results, and around 0.15 we start getting many false positives (all this + // is query dependent too). + return new Map(items.filter(([, score]) => score >= 0.175)); }; From b6b87c196fcddff01916a9857d9131584457ab2e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 15:20:05 +0530 Subject: [PATCH 0270/1179] Update comment --- web/packages/new/photos/services/ml/cluster-new.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index a483d6f0ec..60a9a1e9fb 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -52,7 +52,7 @@ export interface FaceCluster { */ export interface Person { /** - * A nanoid for this person. + * A UUID or nanoid for this person. * * This is the ID of the Person user entity, it is not contained as part of * the Person entity payload. From e946749b2e4f1978d61f82bbcf02e223c32a0122 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 15:29:28 +0530 Subject: [PATCH 0271/1179] Fixes for person v2 --- web/packages/new/photos/services/ml/db.ts | 6 +----- web/packages/new/photos/services/user-entity.ts | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 14bd0a58f9..6ae98519c3 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -109,11 +109,7 @@ const openMLDB = async () => { } // TODO-Cluster if (oldVersion < 3) { - if ( - newVersion && - newVersion > 10 && - process.env.NEXT_PUBLIC_ENTE_WIP_CL - ) { + if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { db.createObjectStore("face-cluster", { keyPath: "id" }); db.createObjectStore("person", { keyPath: "id" }); } diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index db276a7054..fb8330beb2 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -76,10 +76,18 @@ interface UserEntity { const RemoteUserEntity = z.object({ id: z.string(), - /** Base64 string containing the encrypted contents of the entity. */ - encryptedData: z.string(), - /** Base64 string containing the decryption header. */ - header: z.string(), + /** + * Base64 string containing the encrypted contents of the entity. + * + * Will be `null` when isDeleted is true. + */ + encryptedData: z.string().nullable(), + /** + * Base64 string containing the decryption header. + * + * Will be `null` when isDeleted is true. + */ + header: z.string().nullable(), isDeleted: z.boolean(), updatedAt: z.number(), }); From b7acd3033d52aac5b725559db9ae253ed53b18d5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 15:32:31 +0530 Subject: [PATCH 0272/1179] [mob] Fix typo --- mobile/lib/db/ml/embeddings_db.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/db/ml/embeddings_db.dart b/mobile/lib/db/ml/embeddings_db.dart index be537e3c67..8d59e8504b 100644 --- a/mobile/lib/db/ml/embeddings_db.dart +++ b/mobile/lib/db/ml/embeddings_db.dart @@ -23,7 +23,7 @@ extension EmbeddingsDB on FaceMLDataDB { .getAll('SELECT $fileIDColumn , $mlVersionColumn FROM $clipTable'); final Map result = {}; for (final map in maps) { - result[map[mlVersionColumn] as int] = map[mlVersionColumn] as int; + result[map[fileIDColumn] as int] = map[mlVersionColumn] as int; } return result; } From 0753b59e4a9314eb88a21d6e3760a1d3e0c6c540 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 15:34:14 +0530 Subject: [PATCH 0273/1179] [mob][photos] Pause new video player if app is not in fg --- mobile/lib/ui/viewer/file/video_widget_native.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 7b3502a5eb..17e48d4dc8 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -52,10 +52,8 @@ class _VideoWidgetNativeState extends State late StreamSubscription pauseVideoSubscription; bool _isGuestView = false; late final StreamSubscription _guestViewEventSubscription; - NativeVideoPlayerController? _controller; String? _filePath; - String? duration; double? aspectRatio; final _isPlaybackReady = ValueNotifier(false); @@ -111,6 +109,15 @@ class _VideoWidgetNativeState extends State }); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state != AppLifecycleState.resumed) { + if (_controller?.playbackInfo?.status == PlaybackStatus.playing) { + _controller?.pause(); + } + } + } + @override void dispose() { //https://github.com/fluttercandies/flutter_photo_manager/blob/8afba2745ebaac6af8af75de9cbded9157bc2690/README.md#clear-caches From 0c20be98d73c40207976fd7872097b3000a4df14 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 15:37:29 +0530 Subject: [PATCH 0274/1179] [mob] Allow injecting score threshold in query --- .../semantic_search/semantic_search_service.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index ec68264142..b01d9d82c2 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -144,6 +144,14 @@ class SemanticSearchService { String query, { double? scoreThreshold, }) async { + // if the query starts with 0.xxx, the split the query to get score threshold and actual query + if (query.startsWith(RegExp(r"0\.\d+"))) { + final parts = query.split(" "); + if (parts.length > 1) { + scoreThreshold = double.parse(parts[0]); + query = parts.sublist(1).join(" "); + } + } final textEmbedding = await _getTextEmbedding(query); final queryResults = await _getSimilarities( From e21a4b4f9e7a9635136d968d31dfee0984ac3c86 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 14 Aug 2024 15:39:04 +0530 Subject: [PATCH 0275/1179] Handle deleted better --- .../new/photos/services/user-entity.ts | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index fb8330beb2..260317341a 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -74,6 +74,7 @@ interface UserEntity { updatedAt: number; } +/** Zod schema for {@link RemoteUserEntity} */ const RemoteUserEntity = z.object({ id: z.string(), /** @@ -92,6 +93,9 @@ const RemoteUserEntity = z.object({ updatedAt: z.number(), }); +/** An item in the user entity diff response we get from remote. */ +type RemoteUserEntity = z.infer; + /** * Fetch the next batch of user entities of the given type that have been * created or updated since the given time. @@ -128,6 +132,21 @@ export const userEntityDiff = async ( sinceTime: number, entityKeyB64: string, ): Promise => { + const parse = async ({ + id, + encryptedData, + header, + isDeleted, + updatedAt, + }: RemoteUserEntity) => ({ + id, + data: + encryptedData && header && !isDeleted + ? await decrypt(encryptedData, header) + : undefined, + updatedAt, + }); + const decrypt = (encryptedDataB64: string, decryptionHeaderB64: string) => decryptAssociatedB64Data({ encryptedDataB64, @@ -148,17 +167,7 @@ export const userEntityDiff = async ( const entities = z .object({ diff: z.array(RemoteUserEntity) }) .parse(await res.json()).diff; - return Promise.all( - entities.map( - async ({ id, encryptedData, header, isDeleted, updatedAt }) => ({ - id, - data: isDeleted - ? undefined - : await decrypt(encryptedData, header), - updatedAt, - }), - ), - ); + return Promise.all(entities.map(parse)); }; /** From 1e3a726eaac80b4468d0250895ad1c1b03647a60 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 15:52:34 +0530 Subject: [PATCH 0276/1179] [mob] Fix 'skip' button being under navigation bar --- .../backup/backup_folder_selection_page.dart | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/mobile/lib/ui/settings/backup/backup_folder_selection_page.dart b/mobile/lib/ui/settings/backup/backup_folder_selection_page.dart index fda3f93431..783a509c12 100644 --- a/mobile/lib/ui/settings/backup/backup_folder_selection_page.dart +++ b/mobile/lib/ui/settings/backup/backup_folder_selection_page.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'dart:ui'; import 'package:animated_list_plus/animated_list_plus.dart'; @@ -14,6 +13,7 @@ import 'package:photos/generated/l10n.dart'; import 'package:photos/models/device_collection.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/services/remote_sync_service.dart'; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/common/loading_widget.dart'; import 'package:photos/ui/viewer/file/thumbnail_widget.dart'; import 'package:photos/utils/dialog_util.dart'; @@ -148,61 +148,61 @@ class _BackupFolderSelectionPageState extends State { }, ), Expanded(child: _getFolders()), - Column( - children: [ - Container( - width: double.infinity, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Theme.of(context).colorScheme.background, - blurRadius: 24, - offset: const Offset(0, -8), - spreadRadius: 4, - ), - ], - ), - padding: widget.isOnboarding - ? const EdgeInsets.only(left: 20, right: 20) - : EdgeInsets.only( - top: 16, - left: 20, - right: 20, - bottom: Platform.isIOS ? 60 : 32, - ), - child: OutlinedButton( - onPressed: - widget.isOnboarding && _selectedDevicePathIDs.isEmpty - ? null - : () async { - await updateFolderSettings(); - }, - child: Text(widget.buttonText), - ), - ), - widget.isOnboarding - ? GestureDetector( - key: const ValueKey("skipBackupButton"), - behavior: HitTestBehavior.opaque, - onTap: () { - Navigator.of(context).pop(); - }, - child: Padding( - padding: EdgeInsets.only( - top: 16, - bottom: Platform.isIOS ? 48 : 32, + SafeArea( + child: Padding( + padding: const EdgeInsets.only(bottom: 12), + child: Column( + children: [ + Container( + width: double.infinity, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: getEnteColorScheme(context).backgroundBase, + blurRadius: 24, + offset: const Offset(0, -8), + spreadRadius: 4, ), - child: Text( - S.of(context).skip, - style: - Theme.of(context).textTheme.bodySmall!.copyWith( + ], + ), + padding: const EdgeInsets.only(left: 20, right: 20), + child: OutlinedButton( + onPressed: + widget.isOnboarding && _selectedDevicePathIDs.isEmpty + ? null + : () async { + await updateFolderSettings(); + }, + child: Text(widget.buttonText), + ), + ), + widget.isOnboarding + ? const SizedBox(height: 20) + : const SizedBox.shrink(), + widget.isOnboarding + ? GestureDetector( + key: const ValueKey("skipBackupButton"), + behavior: HitTestBehavior.opaque, + onTap: () { + Navigator.of(context).pop(); + }, + child: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Text( + S.of(context).skip, + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( decoration: TextDecoration.underline, ), - ), - ), - ) - : const SizedBox.shrink(), - ], + ), + ), + ) + : const SizedBox.shrink(), + ], + ), + ), ), ], ), From 359572f4b2d8713edd38c009acb04d87e600984f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 16:05:22 +0530 Subject: [PATCH 0277/1179] Remove keyValidation from diff --- server/pkg/controller/authenticator/controller.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/server/pkg/controller/authenticator/controller.go b/server/pkg/controller/authenticator/controller.go index f42d2deafd..10b59210cc 100644 --- a/server/pkg/controller/authenticator/controller.go +++ b/server/pkg/controller/authenticator/controller.go @@ -82,9 +82,6 @@ func (c *Controller) Delete(ctx *gin.Context, entityID uuid.UUID) (bool, error) // GetDiff... func (c *Controller) GetDiff(ctx *gin.Context, req model.GetEntityDiffRequest) ([]model.Entity, error) { - if err := c.validateKey(ctx); err != nil { - return nil, stacktrace.Propagate(err, "failed to validateKey") - } userID := auth.GetUserID(ctx.Request.Header) return c.Repo.GetDiff(ctx, userID, *req.SinceTime, req.Limit) } From f40f39984a6e35db1eeef2e7963bb7297f574d57 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 16:53:22 +0530 Subject: [PATCH 0278/1179] [mob][photos] Fix safearea issues --- mobile/lib/ui/map/map_pull_up_gallery.dart | 14 +++++++++----- mobile/lib/ui/tabs/shared_collections_tab.dart | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mobile/lib/ui/map/map_pull_up_gallery.dart b/mobile/lib/ui/map/map_pull_up_gallery.dart index f52439759e..22f1071888 100644 --- a/mobile/lib/ui/map/map_pull_up_gallery.dart +++ b/mobile/lib/ui/map/map_pull_up_gallery.dart @@ -71,11 +71,15 @@ class _MapPullUpGalleryState extends State { }, ), DeferPointer( - child: FileSelectionOverlayBar( - GalleryType.searchResults, - _selectedFiles, - backgroundColor: - getEnteColorScheme(context).backgroundElevated2, + //This is to make the FileSelectionOverlayBar respect SafeArea + child: MediaQuery( + data: MediaQueryData.fromView(View.of(context)), + child: FileSelectionOverlayBar( + GalleryType.searchResults, + _selectedFiles, + backgroundColor: + getEnteColorScheme(context).backgroundElevated2, + ), ), ), ], diff --git a/mobile/lib/ui/tabs/shared_collections_tab.dart b/mobile/lib/ui/tabs/shared_collections_tab.dart index 8f4b61b38a..92c044c9fe 100644 --- a/mobile/lib/ui/tabs/shared_collections_tab.dart +++ b/mobile/lib/ui/tabs/shared_collections_tab.dart @@ -84,7 +84,7 @@ class _SharedCollectionsTabState extends State (snapshot.data?.outgoing.length ?? 0) == 0) { return const Center(child: SharedEmptyStateWidget()); } - return _getSharedCollectionsGallery(snapshot.data!); + return SafeArea(child: _getSharedCollectionsGallery(snapshot.data!)); } else if (snapshot.hasError) { _logger.severe( "critical: failed to load share gallery", From ab17ae71d0279f6773241bf6b489a9b79c0f345c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 17:10:58 +0530 Subject: [PATCH 0279/1179] [cli] Continue export on bad timestamp marshal error --- cli/pkg/model/errors.go | 4 ++++ cli/pkg/remote_to_disk_file.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/cli/pkg/model/errors.go b/cli/pkg/model/errors.go index a18df3751a..46a1d15f2b 100644 --- a/cli/pkg/model/errors.go +++ b/cli/pkg/model/errors.go @@ -12,3 +12,7 @@ func ShouldRetrySync(err error) bool { return strings.Contains(err.Error(), "read tcp") || strings.Contains(err.Error(), "dial tcp") } + +func IsBadTimeStampError(err error) bool { + return strings.Contains(err.Error(), "year outside of range ") +} diff --git a/cli/pkg/remote_to_disk_file.go b/cli/pkg/remote_to_disk_file.go index 87f5362c6b..f4abf3df50 100644 --- a/cli/pkg/remote_to_disk_file.go +++ b/cli/pkg/remote_to_disk_file.go @@ -89,6 +89,10 @@ func (c *ClICtrl) syncFiles(ctx context.Context, account model.Account) error { continue } else if existingEntry.IsLivePhoto() && errors.Is(err, model.ErrLiveZip) { continue + } else if model.IsBadTimeStampError(err) { + log.Printf("Skipping file due to error %s (%d)", existingEntry.GetTitle(), existingEntry.ID) + log.Printf("CreationTime %v, ModidicationTime %v", existingEntry.GetCreationTime(), existingEntry.GetModificationTime()) + continue } else { return err } From 5bd7170755a4de983d45eeff89e8d2db3c526a4c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 17:11:13 +0530 Subject: [PATCH 0280/1179] [cli] Fix error log --- cli/pkg/model/remote.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/pkg/model/remote.go b/cli/pkg/model/remote.go index 0f8db91fa5..494f36ef3d 100644 --- a/cli/pkg/model/remote.go +++ b/cli/pkg/model/remote.go @@ -151,7 +151,7 @@ func (r *RemoteFile) GetCreationTime() time.Time { func (r *RemoteFile) GetModificationTime() time.Time { value, ok := r.Metadata["modificationTime"] if !ok { - panic("creationTime not found in metadata") + panic("modificationTime not found in metadata") } return time.UnixMicro(int64(value.(float64))) } From ae98af9f8caba861f969bda58d10a75bc7449fe3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 17:12:49 +0530 Subject: [PATCH 0281/1179] bump cli version --- cli/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/main.go b/cli/main.go index 5b65929aea..b2f6ecb659 100644 --- a/cli/main.go +++ b/cli/main.go @@ -15,7 +15,7 @@ import ( "strings" ) -var AppVersion = "0.1.17" +var AppVersion = "0.1.18" func main() { cliDBPath, err := GetCLIConfigPath() From 39e505a3ec400eeac9eaf4844f33bf3d8f2456cc Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Aug 2024 17:14:35 +0530 Subject: [PATCH 0282/1179] update docs --- cli/docs/generated/ente.md | 2 +- cli/docs/generated/ente_account.md | 2 +- cli/docs/generated/ente_account_add.md | 2 +- cli/docs/generated/ente_account_get-token.md | 2 +- cli/docs/generated/ente_account_list.md | 2 +- cli/docs/generated/ente_account_update.md | 2 +- cli/docs/generated/ente_admin.md | 2 +- cli/docs/generated/ente_admin_delete-user.md | 2 +- cli/docs/generated/ente_admin_disable-2fa.md | 2 +- cli/docs/generated/ente_admin_disable-passkey.md | 2 +- cli/docs/generated/ente_admin_get-user-id.md | 2 +- cli/docs/generated/ente_admin_list-users.md | 2 +- cli/docs/generated/ente_admin_update-subscription.md | 2 +- cli/docs/generated/ente_auth.md | 2 +- cli/docs/generated/ente_auth_decrypt.md | 2 +- cli/docs/generated/ente_export.md | 8 ++++++-- cli/docs/generated/ente_version.md | 2 +- 17 files changed, 22 insertions(+), 18 deletions(-) diff --git a/cli/docs/generated/ente.md b/cli/docs/generated/ente.md index c3f4a11338..211bcb844b 100644 --- a/cli/docs/generated/ente.md +++ b/cli/docs/generated/ente.md @@ -25,4 +25,4 @@ ente [flags] * [ente export](ente_export.md) - Starts the export process * [ente version](ente_version.md) - Prints the current version -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_account.md b/cli/docs/generated/ente_account.md index d254b29685..8a3636aab0 100644 --- a/cli/docs/generated/ente_account.md +++ b/cli/docs/generated/ente_account.md @@ -16,4 +16,4 @@ Manage account settings * [ente account list](ente_account_list.md) - list configured accounts * [ente account update](ente_account_update.md) - Update an existing account's export directory -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_account_add.md b/cli/docs/generated/ente_account_add.md index 26a314a9e3..1fe05b025c 100644 --- a/cli/docs/generated/ente_account_add.md +++ b/cli/docs/generated/ente_account_add.md @@ -20,4 +20,4 @@ ente account add [flags] * [ente account](ente_account.md) - Manage account settings -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_account_get-token.md b/cli/docs/generated/ente_account_get-token.md index 40a21f1439..a0eaf76d94 100644 --- a/cli/docs/generated/ente_account_get-token.md +++ b/cli/docs/generated/ente_account_get-token.md @@ -18,4 +18,4 @@ ente account get-token [flags] * [ente account](ente_account.md) - Manage account settings -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_account_list.md b/cli/docs/generated/ente_account_list.md index 3c9ded6737..3712caab04 100644 --- a/cli/docs/generated/ente_account_list.md +++ b/cli/docs/generated/ente_account_list.md @@ -16,4 +16,4 @@ ente account list [flags] * [ente account](ente_account.md) - Manage account settings -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_account_update.md b/cli/docs/generated/ente_account_update.md index a1837529c3..83376dd47a 100644 --- a/cli/docs/generated/ente_account_update.md +++ b/cli/docs/generated/ente_account_update.md @@ -19,4 +19,4 @@ ente account update [flags] * [ente account](ente_account.md) - Manage account settings -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin.md b/cli/docs/generated/ente_admin.md index 29f136f75b..b48958be88 100644 --- a/cli/docs/generated/ente_admin.md +++ b/cli/docs/generated/ente_admin.md @@ -22,4 +22,4 @@ Commands for admin actions like disable or enabling 2fa, bumping up the storage * [ente admin list-users](ente_admin_list-users.md) - List all users * [ente admin update-subscription](ente_admin_update-subscription.md) - Update subscription for user -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_delete-user.md b/cli/docs/generated/ente_admin_delete-user.md index 901430ff09..1ab0764bf2 100644 --- a/cli/docs/generated/ente_admin_delete-user.md +++ b/cli/docs/generated/ente_admin_delete-user.md @@ -18,4 +18,4 @@ ente admin delete-user [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_disable-2fa.md b/cli/docs/generated/ente_admin_disable-2fa.md index 40aedd38da..5e10ea3bb2 100644 --- a/cli/docs/generated/ente_admin_disable-2fa.md +++ b/cli/docs/generated/ente_admin_disable-2fa.md @@ -18,4 +18,4 @@ ente admin disable-2fa [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_disable-passkey.md b/cli/docs/generated/ente_admin_disable-passkey.md index c315aeae04..4e7dd5fe3c 100644 --- a/cli/docs/generated/ente_admin_disable-passkey.md +++ b/cli/docs/generated/ente_admin_disable-passkey.md @@ -18,4 +18,4 @@ ente admin disable-passkey [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_get-user-id.md b/cli/docs/generated/ente_admin_get-user-id.md index 3cbe42f2d7..0d9783c822 100644 --- a/cli/docs/generated/ente_admin_get-user-id.md +++ b/cli/docs/generated/ente_admin_get-user-id.md @@ -18,4 +18,4 @@ ente admin get-user-id [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_list-users.md b/cli/docs/generated/ente_admin_list-users.md index 519dcaccd2..36ebc5b167 100644 --- a/cli/docs/generated/ente_admin_list-users.md +++ b/cli/docs/generated/ente_admin_list-users.md @@ -17,4 +17,4 @@ ente admin list-users [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_admin_update-subscription.md b/cli/docs/generated/ente_admin_update-subscription.md index 341ccf5fe5..7ae7b10357 100644 --- a/cli/docs/generated/ente_admin_update-subscription.md +++ b/cli/docs/generated/ente_admin_update-subscription.md @@ -23,4 +23,4 @@ ente admin update-subscription [flags] * [ente admin](ente_admin.md) - Commands for admin actions -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_auth.md b/cli/docs/generated/ente_auth.md index 2fd67cb0f1..868bf852da 100644 --- a/cli/docs/generated/ente_auth.md +++ b/cli/docs/generated/ente_auth.md @@ -13,4 +13,4 @@ Authenticator commands * [ente](ente.md) - CLI tool for exporting your photos from ente.io * [ente auth decrypt](ente_auth_decrypt.md) - Decrypt authenticator export -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_auth_decrypt.md b/cli/docs/generated/ente_auth_decrypt.md index 682ba1560e..112bb75b53 100644 --- a/cli/docs/generated/ente_auth_decrypt.md +++ b/cli/docs/generated/ente_auth_decrypt.md @@ -16,4 +16,4 @@ ente auth decrypt [input] [output] [flags] * [ente auth](ente_auth.md) - Authenticator commands -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_export.md b/cli/docs/generated/ente_export.md index e3f07bb3c3..b521bcf445 100644 --- a/cli/docs/generated/ente_export.md +++ b/cli/docs/generated/ente_export.md @@ -9,11 +9,15 @@ ente export [flags] ### Options ``` - -h, --help help for export + --albums strings Comma-separated list of album names to export + --emails strings Comma-separated list of emails to export files shared with + -h, --help help for export + --hidden to exclude hidden albums, pass --hidden=false (default true) + --shared to exclude shared albums, pass --shared=false (default true) ``` ### SEE ALSO * [ente](ente.md) - CLI tool for exporting your photos from ente.io -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 diff --git a/cli/docs/generated/ente_version.md b/cli/docs/generated/ente_version.md index e1a3d8163b..bb3c37c817 100644 --- a/cli/docs/generated/ente_version.md +++ b/cli/docs/generated/ente_version.md @@ -16,4 +16,4 @@ ente version [flags] * [ente](ente.md) - CLI tool for exporting your photos from ente.io -###### Auto generated by spf13/cobra on 22-Jun-2024 +###### Auto generated by spf13/cobra on 14-Aug-2024 From ecbd2b4480dda34b1979801c2ae9a54f722e5c3c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 17:21:23 +0530 Subject: [PATCH 0283/1179] [mob][photos] Fix safearea issues --- .../ui/components/action_sheet_widget.dart | 80 ++++++++++--------- .../payment/subscription_common_widgets.dart | 4 +- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/mobile/lib/ui/components/action_sheet_widget.dart b/mobile/lib/ui/components/action_sheet_widget.dart index aa4662792b..4e23e91b4f 100644 --- a/mobile/lib/ui/components/action_sheet_widget.dart +++ b/mobile/lib/ui/components/action_sheet_widget.dart @@ -73,46 +73,48 @@ class ActionSheetWidget extends StatelessWidget { title == null && bodyWidget == null && body == null; final extraWidth = MediaQuery.of(context).size.width - restrictedMaxWidth; final double? horizontalPadding = extraWidth > 0 ? extraWidth / 2 : null; - return Padding( - padding: EdgeInsets.fromLTRB( - horizontalPadding ?? 12, - 12, - horizontalPadding ?? 12, - 32, - ), - child: Container( - decoration: BoxDecoration(boxShadow: shadowMenuLight), - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(8)), - child: Container( - color: backgroundElevated2Dark, - child: Padding( - padding: EdgeInsets.fromLTRB( - 24, - 24, - 24, - isTitleAndBodyNull ? 24 : 28, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - isTitleAndBodyNull - ? const SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only(bottom: 36), - child: ContentContainerWidget( - title: title, - bodyWidget: bodyWidget, - body: body, - bodyHighlight: bodyHighlight, - actionSheetType: actionSheetType, - isCheckIconGreen: isCheckIconGreen, + return SafeArea( + child: Padding( + padding: EdgeInsets.fromLTRB( + horizontalPadding ?? 12, + 12, + horizontalPadding ?? 12, + 32, + ), + child: Container( + decoration: BoxDecoration(boxShadow: shadowMenuLight), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: Container( + color: backgroundElevated2Dark, + child: Padding( + padding: EdgeInsets.fromLTRB( + 24, + 24, + 24, + isTitleAndBodyNull ? 24 : 28, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + isTitleAndBodyNull + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only(bottom: 36), + child: ContentContainerWidget( + title: title, + bodyWidget: bodyWidget, + body: body, + bodyHighlight: bodyHighlight, + actionSheetType: actionSheetType, + isCheckIconGreen: isCheckIconGreen, + ), ), - ), - ActionButtons( - actionButtons, - ), - ], + ActionButtons( + actionButtons, + ), + ], + ), ), ), ), diff --git a/mobile/lib/ui/payment/subscription_common_widgets.dart b/mobile/lib/ui/payment/subscription_common_widgets.dart index 5a1c95c563..cc75495011 100644 --- a/mobile/lib/ui/payment/subscription_common_widgets.dart +++ b/mobile/lib/ui/payment/subscription_common_widgets.dart @@ -175,7 +175,9 @@ class SubFaqWidget extends StatelessWidget { barrierColor: Colors.black87, context: context, builder: (context) { - return const BillingQuestionsWidget(); + return const SafeArea( + child: BillingQuestionsWidget(), + ); }, ); }, From d2536241f75eb8b8178e4b886bbf6909b0becbc8 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 14 Aug 2024 17:32:26 +0530 Subject: [PATCH 0284/1179] [mob][photos] chore --- mobile/ios/Podfile.lock | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 2ee64030ba..47f378bd59 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -140,6 +140,8 @@ PODS: - Mantle (2.2.0): - Mantle/extobjc (= 2.2.0) - Mantle/extobjc (2.2.0) + - maps_launcher (0.0.1): + - Flutter - media_extension (0.0.1): - Flutter - media_kit_libs_ios_video (1.0.4): @@ -269,6 +271,7 @@ DEPENDENCIES: - integration_test (from `.symlinks/plugins/integration_test/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`) + - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) - media_extension (from `.symlinks/plugins/media_extension/ios`) - media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`) - media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`) @@ -377,6 +380,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/local_auth_darwin/darwin" local_auth_ios: :path: ".symlinks/plugins/local_auth_ios/ios" + maps_launcher: + :path: ".symlinks/plugins/maps_launcher/ios" media_extension: :path: ".symlinks/plugins/media_extension/ios" media_kit_libs_ios_video: @@ -472,6 +477,7 @@ SPEC CHECKSUMS: local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d + maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203 media_extension: 6d30dc1431ebaa63f43c397c37917b1a0a597a4c media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1 media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a From d0e77e167376924be3a2dbc5caa6cb986a58ba07 Mon Sep 17 00:00:00 2001 From: Brogio Date: Wed, 14 Aug 2024 17:29:20 +0200 Subject: [PATCH 0285/1179] Update README.md Removed free trial --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d4c6bc6a24..a0aabb8116 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ platform. Private sharing. Collaborative albums. Family plans. Easy import, easier export. Background uploads. The list goes on. And of course, all of this, while being fully end-to-end encrypted. -Ente Photos is a paid service, but we offer a free trial. You can also clone -this repository and choose to self host. +Ente Photos is a paid service, but we offer 5GB of free storage. +You can also clone this repository and choose to self-host.
From ea18da295e4eedefef2dbaa29b6ecb3497497979 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Thu, 15 Aug 2024 17:26:09 +0530 Subject: [PATCH 0286/1179] [mob] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index ffda4a1474..f29ec3d8b2 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.17+917 +version: 0.9.18+918 publish_to: none environment: From 3418e69b956ed39fd8e86c493d60dec2c119f623 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 15 Aug 2024 17:34:36 +0530 Subject: [PATCH 0287/1179] [docs] Minor update --- docs/docs/photos/faq/subscription.md | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/docs/docs/photos/faq/subscription.md b/docs/docs/photos/faq/subscription.md index 814249cbf2..5d6265780c 100644 --- a/docs/docs/photos/faq/subscription.md +++ b/docs/docs/photos/faq/subscription.md @@ -77,8 +77,8 @@ We accept the following crypto currencies: - Dogecoin To purchase a subscription with any of the above mentioned currencies, please -write to crypto@ente.io from your registered email address, citing the -[storage plan](https://ente.io#pricing) of your choice. +write to crypto@ente.io from your registered email address, citing the [storage +plan](https://ente.io#pricing) of your choice. In case you have any further questions or need support, please reach out to [support@ente.io](mailto:support@ente.io), and we'll be happy to help! @@ -96,8 +96,9 @@ Ente does not store any of your sensitive payment related information. We use [Stripe](https://stripe.com) to handle our card payments, and all of your payment information is sent directly to Stripe's PCI DSS validated servers. -Stripe has been audited by a PCI-certified auditor and is certified to -[PCI Service Provider Level 1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe). +Stripe has been audited by a PCI-certified auditor and is certified to [PCI +Service Provider Level +1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe). This is the most stringent level of certification available in the payments industry. @@ -126,13 +127,13 @@ Your new plan will go into effect immediately, and you only have to pay the difference. We will adjust your remaining pro-rated balance on the old plan when invoicing you for the new plan. -For example, if you are half way through the year on the 100 GB yearly plan, and -upgrade to the 500 GB yearly plan, then +For example, if you are half way through the year on the 50 GB yearly plan, and +upgrade to the 200 GB yearly plan, then -- The new 500 GB yearly plan will go into effect immediately. +- The new 200 GB yearly plan will go into effect immediately. - But we will reduce the charges for the first year by subtracting the - remaining half year balance of the 100 GB yearly plan that you'd already + remaining half year balance of the 50 GB yearly plan that you'd already paid. The same applies to monthly plans. @@ -153,9 +154,3 @@ you can gain more value out of a single subscription. ## Is there a forever-free plan? Yes, we offer 5 GB of storage for free. - -## Will I need to pay for Ente Auth after my Ente Photos free plan expires? - -No, you will not need to pay for Ente Auth after your Ente Photos free plan -expires. Ente Auth is completely free to use, and the expiration of your Ente -Photos free plan will not impact your ability to access or use Ente Auth. From ddcc93c69231edb89479608dd9c89c980b1c002b Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 15 Aug 2024 18:52:25 +0530 Subject: [PATCH 0288/1179] Update icon for Panorama view --- mobile/lib/ui/viewer/file/panorama_viewer_screen.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/panorama_viewer_screen.dart b/mobile/lib/ui/viewer/file/panorama_viewer_screen.dart index 27dedfcc60..f91684befe 100644 --- a/mobile/lib/ui/viewer/file/panorama_viewer_screen.dart +++ b/mobile/lib/ui/viewer/file/panorama_viewer_screen.dart @@ -172,10 +172,10 @@ class _PanoramaViewerScreenState extends State { fixedSize: const Size(44, 44), ), icon: Icon( - Icons.explore, - color: control != SensorControl.none - ? Colors.white - : Colors.white.withOpacity(0.4), + control == SensorControl.none + ? Icons.explore_outlined + : Icons.explore_off_outlined, + color: Colors.white, size: 26, ), onPressed: () async { From 1fd238a89a93d4fec448e3416abf844390d122ba Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 09:19:26 +0530 Subject: [PATCH 0289/1179] [cli] Fix temp file deletion on windows --- cli/internal/promt.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cli/internal/promt.go b/cli/internal/promt.go index 14dccc64d0..5fb3b07db7 100644 --- a/cli/internal/promt.go +++ b/cli/internal/promt.go @@ -214,10 +214,11 @@ func ValidateDirForWrite(dir string) (bool, error) { return false, fmt.Errorf("write permission denied: %v", err) } - // Delete temp file - defer os.Remove(tempFile.Name()) - if err != nil { - return false, err + if tempErr := tempFile.Close(); tempErr != nil { + return false, fmt.Errorf("failed to close temp file: %v", tempErr) + } + if tempErr := os.Remove(tempFile.Name()); tempErr != nil { + return false, fmt.Errorf("failed to remove temp file: %v", tempErr) } return true, nil From a999eddbfe93bac31208922f9278939ef7640f30 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 16 Aug 2024 09:36:12 +0530 Subject: [PATCH 0290/1179] [mob][photos] Add more logs on deleting local files --- mobile/lib/utils/delete_file_util.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/utils/delete_file_util.dart b/mobile/lib/utils/delete_file_util.dart index 545ea9c27a..e519db77c0 100644 --- a/mobile/lib/utils/delete_file_util.dart +++ b/mobile/lib/utils/delete_file_util.dart @@ -342,8 +342,10 @@ Future deleteLocalFiles( final bool shouldDeleteInBatches = await isAndroidSDKVersionLowerThan(android11SDKINT); if (shouldDeleteInBatches) { + _logger.info("Deleting in batches"); deletedIDs.addAll(await deleteLocalFilesInBatches(context, localAssetIDs)); } else { + _logger.info("Deleting in one shot"); deletedIDs.addAll(await _deleteLocalFilesInOneShot(context, localAssetIDs)); } // In IOS, the library returns no error and fail to delete any file is @@ -426,6 +428,7 @@ Future> deleteLocalFilesInBatches( max(minimumBatchSize, (localIDs.length / minimumParts).round()), maximumBatchSize, ); + _logger.info("Batch size: $batchSize"); final List deletedIDs = []; for (int index = 0; index < localIDs.length; index += batchSize) { if (dialogKey.currentState != null) { From eff5b4fef41add0c9be0c37ada6dafb423b26e91 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 09:39:36 +0530 Subject: [PATCH 0291/1179] Mention in FAQ https://github.com/ente-io/ente/issues/2657#issuecomment-2283088810 --- docs/docs/auth/faq/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/docs/auth/faq/index.md b/docs/docs/auth/faq/index.md index 6386be0afe..a62e1e9ebb 100644 --- a/docs/docs/auth/faq/index.md +++ b/docs/docs/auth/faq/index.md @@ -32,6 +32,13 @@ You can enable FaceID lock under Settings → Security → Lockscreen. Please verify that the time on both your mobile and desktop is same. +The codes depend on time. If the time is the same on both browser and mobile, +the codes you see will be the same. + +Usually this discrepancy occurs because the time in your browser might be +incorrect. In particular, multiple users who have reported that Firefox provides +incorrect time when various privacy settings are enabled. + ### Does ente Authenticator require an account? Answer: No, ente Authenticator does not require an account. You can choose to From 53a292f97d5c001503f77e4b9f761e3ecac68ce9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 09:40:46 +0530 Subject: [PATCH 0292/1179] yarn pretty --- docs/docs/photos/faq/subscription.md | 9 ++++----- docs/docs/photos/features/machine-learning.md | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs/photos/faq/subscription.md b/docs/docs/photos/faq/subscription.md index 5d6265780c..56724fe3eb 100644 --- a/docs/docs/photos/faq/subscription.md +++ b/docs/docs/photos/faq/subscription.md @@ -77,8 +77,8 @@ We accept the following crypto currencies: - Dogecoin To purchase a subscription with any of the above mentioned currencies, please -write to crypto@ente.io from your registered email address, citing the [storage -plan](https://ente.io#pricing) of your choice. +write to crypto@ente.io from your registered email address, citing the +[storage plan](https://ente.io#pricing) of your choice. In case you have any further questions or need support, please reach out to [support@ente.io](mailto:support@ente.io), and we'll be happy to help! @@ -96,9 +96,8 @@ Ente does not store any of your sensitive payment related information. We use [Stripe](https://stripe.com) to handle our card payments, and all of your payment information is sent directly to Stripe's PCI DSS validated servers. -Stripe has been audited by a PCI-certified auditor and is certified to [PCI -Service Provider Level -1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe). +Stripe has been audited by a PCI-certified auditor and is certified to +[PCI Service Provider Level 1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe). This is the most stringent level of certification available in the payments industry. diff --git a/docs/docs/photos/features/machine-learning.md b/docs/docs/photos/features/machine-learning.md index 6227e1e544..1b4355592f 100644 --- a/docs/docs/photos/features/machine-learning.md +++ b/docs/docs/photos/features/machine-learning.md @@ -1,7 +1,8 @@ --- title: Machine learning description: - Ente supports on-device machine learning for face and natural language search + Ente supports on-device machine learning for face and natural language + search --- # Machine learning From c599ca2d80c898cfc5a2f12ed4f607e2c978b7a2 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 16 Aug 2024 09:44:50 +0530 Subject: [PATCH 0293/1179] [mob][photos] Remove feature flag from panorama viewer feature --- mobile/lib/ui/actions/file/file_actions.dart | 5 +---- mobile/lib/ui/tools/debug/app_storage_viewer.dart | 2 +- mobile/lib/ui/viewer/file/file_bottom_bar.dart | 12 +++++------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/mobile/lib/ui/actions/file/file_actions.dart b/mobile/lib/ui/actions/file/file_actions.dart index 6a7305a019..24df5409cd 100644 --- a/mobile/lib/ui/actions/file/file_actions.dart +++ b/mobile/lib/ui/actions/file/file_actions.dart @@ -5,7 +5,6 @@ import "package:modal_bottom_sheet/modal_bottom_sheet.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; -import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/action_sheet_widget.dart"; @@ -137,9 +136,7 @@ Future showSingleFileDeleteSheet( } Future showDetailsSheet(BuildContext context, EnteFile file) async { - if (flagService.internalUser) { - guardedCheckPanorama(file).ignore(); - } + guardedCheckPanorama(file).ignore(); final colorScheme = getEnteColorScheme(context); return showBarModalBottomSheet( topControl: const SizedBox.shrink(), diff --git a/mobile/lib/ui/tools/debug/app_storage_viewer.dart b/mobile/lib/ui/tools/debug/app_storage_viewer.dart index 50ec16c256..5ac484684d 100644 --- a/mobile/lib/ui/tools/debug/app_storage_viewer.dart +++ b/mobile/lib/ui/tools/debug/app_storage_viewer.dart @@ -34,9 +34,9 @@ class _AppStorageViewerState extends State { @override void initState() { + super.initState(); internalUser = flagService.internalUser; addPath(); - super.initState(); } void addPath() async { diff --git a/mobile/lib/ui/viewer/file/file_bottom_bar.dart b/mobile/lib/ui/viewer/file/file_bottom_bar.dart index e7b6d0654b..78d1836e9b 100644 --- a/mobile/lib/ui/viewer/file/file_bottom_bar.dart +++ b/mobile/lib/ui/viewer/file/file_bottom_bar.dart @@ -12,7 +12,6 @@ import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; import 'package:photos/models/file/trash_file.dart'; import 'package:photos/models/selected_files.dart'; -import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/actions/file/file_actions.dart"; @@ -68,14 +67,13 @@ class FileBottomBarState extends State { @override Widget build(BuildContext context) { - if (flagService.internalUser) { - if (widget.file.canBePanorama()) { - lastFileGenID = widget.file.generatedID; - if (lastFileGenID != widget.file.generatedID) { - guardedCheckPanorama(widget.file).ignore(); - } + if (widget.file.canBePanorama()) { + lastFileGenID = widget.file.generatedID; + if (lastFileGenID != widget.file.generatedID) { + guardedCheckPanorama(widget.file).ignore(); } } + return SafeArea(child: _getBottomBar()); } From 9f043eba2425f8f2af2beef91710e77c0eeecac4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 10:30:18 +0530 Subject: [PATCH 0294/1179] [server] Change entity_data.id from uuid to string --- server/ente/userentity/entity.go | 8 ++------ server/migrations/90_use_string_id_entity.down.sql | 9 +++++++++ server/migrations/90_use_string_id_entity.up.sql | 9 +++++++++ server/pkg/api/userentity.go | 9 ++------- server/pkg/controller/userentity/controller.go | 4 +--- server/pkg/repo/userentity/data.go | 10 +++++----- 6 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 server/migrations/90_use_string_id_entity.down.sql create mode 100644 server/migrations/90_use_string_id_entity.up.sql diff --git a/server/ente/userentity/entity.go b/server/ente/userentity/entity.go index fc39c0f474..965938b63d 100644 --- a/server/ente/userentity/entity.go +++ b/server/ente/userentity/entity.go @@ -1,9 +1,5 @@ package userentity -import ( - "github.com/google/uuid" -) - type EntityType string const ( @@ -23,7 +19,7 @@ type EntityKey struct { // EntityData represents a single UserEntity type EntityData struct { - ID uuid.UUID `json:"id" binding:"required"` + ID string `json:"id" binding:"required"` UserID int64 `json:"userID" binding:"required"` Type EntityType `json:"type" binding:"required"` EncryptedData *string `json:"encryptedData" binding:"required"` @@ -54,7 +50,7 @@ type EntityDataRequest struct { // UpdateEntityDataRequest updates the current entity type UpdateEntityDataRequest struct { - ID uuid.UUID `json:"id" binding:"required"` + ID string `json:"id" binding:"required"` Type EntityType `json:"type" binding:"required"` EncryptedData string `json:"encryptedData" binding:"required"` Header string `json:"header" binding:"required"` diff --git a/server/migrations/90_use_string_id_entity.down.sql b/server/migrations/90_use_string_id_entity.down.sql new file mode 100644 index 0000000000..7ea155d388 --- /dev/null +++ b/server/migrations/90_use_string_id_entity.down.sql @@ -0,0 +1,9 @@ +BEGIN; +ALTER TABLE entity_data ADD COLUMN id_uuid UUID; +UPDATE entity_data SET id_uuid = id::UUID; +ALTER TABLE entity_data ALTER COLUMN id_uuid SET NOT NULL; +ALTER TABLE entity_data DROP CONSTRAINT entity_data_pkey; +ALTER TABLE entity_data DROP COLUMN IF EXISTS id; +ALTER TABLE entity_data RENAME COLUMN id_uuid TO id; +ALTER TABLE entity_data ADD PRIMARY KEY (id); +COMMIT; diff --git a/server/migrations/90_use_string_id_entity.up.sql b/server/migrations/90_use_string_id_entity.up.sql new file mode 100644 index 0000000000..8477eb0de1 --- /dev/null +++ b/server/migrations/90_use_string_id_entity.up.sql @@ -0,0 +1,9 @@ +BEGIN; +ALTER TABLE entity_data ADD COLUMN id_text TEXT; +UPDATE entity_data SET id_text = id::TEXT; +ALTER TABLE entity_data ALTER COLUMN id_text SET NOT NULL; +ALTER TABLE entity_data DROP CONSTRAINT entity_data_pkey; +ALTER TABLE entity_data DROP COLUMN IF EXISTS id; +ALTER TABLE entity_data RENAME COLUMN id_text TO id; +ALTER TABLE entity_data ADD PRIMARY KEY (id); +END; diff --git a/server/pkg/api/userentity.go b/server/pkg/api/userentity.go index 1d10b3464a..004eda6137 100644 --- a/server/pkg/api/userentity.go +++ b/server/pkg/api/userentity.go @@ -10,7 +10,6 @@ import ( "github.com/ente-io/museum/pkg/utils/handler" "github.com/ente-io/stacktrace" "github.com/gin-gonic/gin" - "github.com/google/uuid" ) // UserEntityHandler expose request handlers for various operations on user entity @@ -84,12 +83,8 @@ func (h *UserEntityHandler) UpdateEntity(c *gin.Context) { // DeleteEntity... func (h *UserEntityHandler) DeleteEntity(c *gin.Context) { - id, err := uuid.Parse(c.Query("id")) - if err != nil { - handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "failed to find id")) - return - } - _, err = h.Controller.Delete(c, id) + id := c.Query("id") + _, err := h.Controller.Delete(c, id) if err != nil { handler.Error(c, stacktrace.Propagate(err, "Failed to delete DeleteEntity")) return diff --git a/server/pkg/controller/userentity/controller.go b/server/pkg/controller/userentity/controller.go index 827d8708ac..f4fb1c8b9b 100644 --- a/server/pkg/controller/userentity/controller.go +++ b/server/pkg/controller/userentity/controller.go @@ -5,8 +5,6 @@ import ( "github.com/ente-io/museum/pkg/repo/userentity" "github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/stacktrace" - "github.com/google/uuid" - "github.com/gin-gonic/gin" ) @@ -52,7 +50,7 @@ func (c *Controller) UpdateEntity(ctx *gin.Context, req model.UpdateEntityDataRe } // Delete... -func (c *Controller) Delete(ctx *gin.Context, entityID uuid.UUID) (bool, error) { +func (c *Controller) Delete(ctx *gin.Context, entityID string) (bool, error) { userID := auth.GetUserID(ctx.Request.Header) return c.Repo.Delete(ctx, userID, entityID) } diff --git a/server/pkg/repo/userentity/data.go b/server/pkg/repo/userentity/data.go index 86263ff240..25b0e5a52a 100644 --- a/server/pkg/repo/userentity/data.go +++ b/server/pkg/repo/userentity/data.go @@ -13,7 +13,7 @@ import ( ) // Create inserts a new entry -func (r *Repository) Create(ctx context.Context, userID int64, entry model.EntityDataRequest) (uuid.UUID, error) { +func (r *Repository) Create(ctx context.Context, userID int64, entry model.EntityDataRequest) (string, error) { id := uuid.New() err := r.DB.QueryRow(`INSERT into entity_data( id, @@ -28,12 +28,12 @@ func (r *Repository) Create(ctx context.Context, userID int64, entry model.Entit entry.Header). // $5 header Scan(&id) if err != nil { - return id, stacktrace.Propagate(err, "failed to create enity data") + return id.String(), stacktrace.Propagate(err, "failed to create enity data") } - return id, nil + return id.String(), nil } -func (r *Repository) Get(ctx context.Context, userID int64, id uuid.UUID) (*model.EntityData, error) { +func (r *Repository) Get(ctx context.Context, userID int64, id string) (*model.EntityData, error) { res := model.EntityData{} row := r.DB.QueryRowContext(ctx, `SELECT id, user_id, type, encrypted_data, header, is_deleted, created_at, updated_at @@ -50,7 +50,7 @@ func (r *Repository) Get(ctx context.Context, userID int64, id uuid.UUID) (*mode return &res, nil } -func (r *Repository) Delete(ctx context.Context, userID int64, id uuid.UUID) (bool, error) { +func (r *Repository) Delete(ctx context.Context, userID int64, id string) (bool, error) { _, err := r.DB.ExecContext(ctx, `UPDATE entity_data SET is_deleted = true, encrypted_data = NULL, header = NULL where id=$1 and user_id = $2`, id, userID) From 05df5962ef229a5e39a21c3ecf070a48c71bde6c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:10:19 +0530 Subject: [PATCH 0295/1179] Use nanoId for entity_data.id --- server/ente/base/id.go | 30 ++++++++++++++++++++++++++++++ server/ente/userentity/entity.go | 10 ++++++++-- server/go.mod | 2 +- server/go.sum | 2 ++ server/pkg/repo/userentity/data.go | 13 ++++++++----- 5 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 server/ente/base/id.go diff --git a/server/ente/base/id.go b/server/ente/base/id.go new file mode 100644 index 0000000000..f6579a05c6 --- /dev/null +++ b/server/ente/base/id.go @@ -0,0 +1,30 @@ +package base + +import ( + "errors" + "fmt" + "github.com/matoous/go-nanoid/v2" +) + +// Ref https://github.com/ente-io/ente/blob/main/web/packages/base/id.ts#L4 +const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + +// NewID generates a new random identifier with the given prefix. +func NewID(prefix string) (*string, error) { + if len(prefix) < 2 { + return nil, errors.New("prefix must be at least 2 characters long") + } + // check that prefix only contains alphabet characters + for _, c := range prefix { + if !(c >= 'a' && c <= 'z') { + return nil, errors.New("prefix must only contain lower case alphabet characters") + } + } + // Generate a nanoid with a custom alphabet and length of 22 + id, err := gonanoid.Generate(alphabet, 22) + if err != nil { + return nil, err + } + result := fmt.Sprintf("%s_%s", prefix, id) + return &result, nil +} diff --git a/server/ente/userentity/entity.go b/server/ente/userentity/entity.go index 965938b63d..4d75a04c77 100644 --- a/server/ente/userentity/entity.go +++ b/server/ente/userentity/entity.go @@ -1,14 +1,20 @@ package userentity +import "github.com/ente-io/museum/ente/base" + type EntityType string const ( Location EntityType = "location" Person EntityType = "person" - // PersonV2 is a new version of Person entity, where the data is gzipped before encryption - PersonV2 EntityType = "person_v2" + // Profile is a new version of Person entity, where the data is gzipped before encryption + Profile EntityType = "profile" ) +func (et EntityType) GetNewID() (*string, error) { + return base.NewID(string(et)) +} + type EntityKey struct { UserID int64 `json:"userID" binding:"required"` Type EntityType `json:"type" binding:"required"` diff --git a/server/go.mod b/server/go.mod index 60a0e7ea65..9ca4a93871 100644 --- a/server/go.mod +++ b/server/go.mod @@ -2,7 +2,6 @@ module github.com/ente-io/museum go 1.21 - require ( firebase.google.com/go v3.13.0+incompatible github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb @@ -24,6 +23,7 @@ require ( github.com/kong/go-srp v0.0.0-20191210190804-cde1efa3c083 github.com/lib/pq v1.8.0 github.com/lithammer/shortuuid/v3 v3.0.4 + github.com/matoous/go-nanoid/v2 v2.1.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pquerna/otp v1.3.0 github.com/prometheus/client_golang v1.11.1 diff --git a/server/go.sum b/server/go.sum index 544b2b032c..ed9338a487 100644 --- a/server/go.sum +++ b/server/go.sum @@ -435,6 +435,8 @@ github.com/lithammer/shortuuid/v3 v3.0.4/go.mod h1:RviRjexKqIzx/7r1peoAITm6m7gni github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= +github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= diff --git a/server/pkg/repo/userentity/data.go b/server/pkg/repo/userentity/data.go index 25b0e5a52a..88ce4181fd 100644 --- a/server/pkg/repo/userentity/data.go +++ b/server/pkg/repo/userentity/data.go @@ -8,14 +8,17 @@ import ( model "github.com/ente-io/museum/ente/userentity" "github.com/ente-io/stacktrace" - "github.com/google/uuid" "github.com/sirupsen/logrus" ) // Create inserts a new entry func (r *Repository) Create(ctx context.Context, userID int64, entry model.EntityDataRequest) (string, error) { - id := uuid.New() - err := r.DB.QueryRow(`INSERT into entity_data( + idPrt, err := entry.Type.GetNewID() + if err != nil { + return "", stacktrace.Propagate(err, "failed to generate new id") + } + id := *idPrt + err = r.DB.QueryRow(`INSERT into entity_data( id, user_id, type, @@ -28,9 +31,9 @@ func (r *Repository) Create(ctx context.Context, userID int64, entry model.Entit entry.Header). // $5 header Scan(&id) if err != nil { - return id.String(), stacktrace.Propagate(err, "failed to create enity data") + return id, stacktrace.Propagate(err, "failed to create enity data") } - return id.String(), nil + return id, nil } func (r *Repository) Get(ctx context.Context, userID int64, id string) (*model.EntityData, error) { From c759d37fd388c2e16ef6ef4bf770e46d117c59ea Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:40:31 +0530 Subject: [PATCH 0296/1179] Add entity type validation --- server/ente/userentity/entity.go | 15 ++++++++++++++- server/pkg/api/userentity.go | 8 ++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/server/ente/userentity/entity.go b/server/ente/userentity/entity.go index 4d75a04c77..fed275238f 100644 --- a/server/ente/userentity/entity.go +++ b/server/ente/userentity/entity.go @@ -1,6 +1,10 @@ package userentity -import "github.com/ente-io/museum/ente/base" +import ( + "fmt" + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/ente/base" +) type EntityType string @@ -11,6 +15,15 @@ const ( Profile EntityType = "profile" ) +func (et EntityType) IsValid() error { + + switch et { + case Location, Person, Profile: + return nil + } + return ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid EntityType: %s", et)) +} + func (et EntityType) GetNewID() (*string, error) { return base.NewID(string(et)) } diff --git a/server/pkg/api/userentity.go b/server/pkg/api/userentity.go index 004eda6137..492e9c3bd9 100644 --- a/server/pkg/api/userentity.go +++ b/server/pkg/api/userentity.go @@ -25,6 +25,10 @@ func (h *UserEntityHandler) CreateKey(c *gin.Context) { stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) return } + if err := request.Type.IsValid(); err != nil { + handler.Error(c, stacktrace.Propagate(err, "Invalid EntityType")) + return + } err := h.Controller.CreateKey(c, request) if err != nil { handler.Error(c, stacktrace.Propagate(err, "Failed to create CreateKey")) @@ -57,6 +61,10 @@ func (h *UserEntityHandler) CreateEntity(c *gin.Context) { stacktrace.Propagate(ente.ErrBadRequest, fmt.Sprintf("Request binding failed %s", err))) return } + if err := request.Type.IsValid(); err != nil { + handler.Error(c, stacktrace.Propagate(err, "Invalid EntityType")) + return + } resp, err := h.Controller.CreateEntity(c, request) if err != nil { handler.Error(c, stacktrace.Propagate(err, "Failed to create CreateEntity")) From 175fe103e5a217520bab9eaba603c185b0e84157 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 11:56:41 +0530 Subject: [PATCH 0297/1179] rename --- server/ente/userentity/entity.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/ente/userentity/entity.go b/server/ente/userentity/entity.go index fed275238f..09f0ddfd46 100644 --- a/server/ente/userentity/entity.go +++ b/server/ente/userentity/entity.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente/base" + "strings" ) type EntityType string @@ -11,21 +12,20 @@ type EntityType string const ( Location EntityType = "location" Person EntityType = "person" - // Profile is a new version of Person entity, where the data is gzipped before encryption - Profile EntityType = "profile" + // CGroup is a new version of Person entity, where the data is gzipped before encryption + CGroup EntityType = "cgroup" ) func (et EntityType) IsValid() error { - switch et { - case Location, Person, Profile: + case Location, Person, CGroup: return nil } return ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid EntityType: %s", et)) } func (et EntityType) GetNewID() (*string, error) { - return base.NewID(string(et)) + return base.NewID(strings.ToLower(string(et))) } type EntityKey struct { From 1ca1967ec297cdf10989eb8c7b4ac959e18097c2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:13:56 +0530 Subject: [PATCH 0298/1179] Rename person_v2 as cgroup --- mobile/lib/models/api/entity/type.dart | 14 ++++++------- mobile/lib/services/entity_service.dart | 2 +- .../face_ml/person/person_service.dart | 20 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/mobile/lib/models/api/entity/type.dart b/mobile/lib/models/api/entity/type.dart index 05de5c7826..2114dc2c5b 100644 --- a/mobile/lib/models/api/entity/type.dart +++ b/mobile/lib/models/api/entity/type.dart @@ -3,7 +3,7 @@ import "package:flutter/foundation.dart"; enum EntityType { location, person, - personV2, + cgroup, unknown, } @@ -13,12 +13,10 @@ EntityType typeFromString(String type) { return EntityType.location; case "person": return EntityType.location; - case "person_v2": - return EntityType.personV2; - case "personV2": - return EntityType.personV2; + case "cgroup": + return EntityType.cgroup; } - debugPrint("unexpected collection type $type"); + debugPrint("unexpected entity type $type"); return EntityType.unknown; } @@ -36,8 +34,8 @@ extension EntityTypeExtn on EntityType { return "location"; case EntityType.person: return "person"; - case EntityType.personV2: - return "person_v2"; + case EntityType.cgroup: + return "cgroup"; case EntityType.unknown: return "unknown"; } diff --git a/mobile/lib/services/entity_service.dart b/mobile/lib/services/entity_service.dart index e979d4fd9e..22089e7737 100644 --- a/mobile/lib/services/entity_service.dart +++ b/mobile/lib/services/entity_service.dart @@ -101,7 +101,7 @@ class EntityService { Future syncEntities() async { try { await _remoteToLocalSync(EntityType.location); - await _remoteToLocalSync(EntityType.personV2); + await _remoteToLocalSync(EntityType.cgroup); } catch (e) { _logger.severe("Failed to sync entities", e); } diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index fd676b8980..e8a0b78fc6 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -37,7 +37,7 @@ class PersonService { } Future> getPersons() async { - final entities = await entityService.getEntities(EntityType.personV2); + final entities = await entityService.getEntities(EntityType.cgroup); return entities .map( (e) => PersonEntity(e.id, PersonData.fromJson(json.decode(e.data))), @@ -46,7 +46,7 @@ class PersonService { } Future getPerson(String id) { - return entityService.getEntity(EntityType.personV2, id).then((e) { + return entityService.getEntity(EntityType.cgroup, id).then((e) { if (e == null) { return null; } @@ -55,7 +55,7 @@ class PersonService { } Future> getPersonsMap() async { - final entities = await entityService.getEntities(EntityType.personV2); + final entities = await entityService.getEntities(EntityType.cgroup); final Map map = {}; for (var e in entities) { final person = @@ -95,7 +95,7 @@ class PersonService { ) .toList(); entityService - .addOrUpdate(EntityType.personV2, personData.toJson(), id: personID) + .addOrUpdate(EntityType.cgroup, personData.toJson(), id: personID) .ignore(); personData.logStats(); } @@ -163,7 +163,7 @@ class PersonService { isHidden: isHidden, ); final result = await entityService.addOrUpdate( - EntityType.personV2, + EntityType.cgroup, data.toJson(), ); await faceMLDataDB.assignClusterToPerson( @@ -181,7 +181,7 @@ class PersonService { final personData = person.data; personData.assigned!.removeWhere((element) => element.id != clusterID); await entityService.addOrUpdate( - EntityType.personV2, + EntityType.cgroup, personData.toJson(), id: personID, ); @@ -216,7 +216,7 @@ class PersonService { } await entityService.addOrUpdate( - EntityType.personV2, + EntityType.cgroup, personData.toJson(), id: person.remoteID, ); @@ -232,7 +232,7 @@ class PersonService { final PersonEntity justName = PersonEntity(personID, PersonData(name: entity.data.name)); await entityService.addOrUpdate( - EntityType.personV2, + EntityType.cgroup, justName.data.toJson(), id: personID, ); @@ -249,7 +249,7 @@ class PersonService { Future fetchRemoteClusterFeedback() async { await entityService.syncEntities(); - final entities = await entityService.getEntities(EntityType.personV2); + final entities = await entityService.getEntities(EntityType.cgroup); entities.sort((a, b) => a.updatedAt.compareTo(b.updatedAt)); final Map faceIdToClusterID = {}; final Map clusterToPersonID = {}; @@ -307,7 +307,7 @@ class PersonService { Future _updatePerson(PersonEntity updatePerson) async { await entityService.addOrUpdate( - EntityType.personV2, + EntityType.cgroup, updatePerson.data.toJson(), id: updatePerson.remoteID, ); From 29b81a468c9926e738af9849a6dc3e9e032e65e5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 12:16:16 +0530 Subject: [PATCH 0299/1179] [docs] Add note about avoiding NAS --- docs/docs/photos/troubleshooting/nas.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/docs/photos/troubleshooting/nas.md diff --git a/docs/docs/photos/troubleshooting/nas.md b/docs/docs/photos/troubleshooting/nas.md new file mode 100644 index 0000000000..262d4c758d --- /dev/null +++ b/docs/docs/photos/troubleshooting/nas.md @@ -0,0 +1,22 @@ +--- +title: Avoiding NAS +description: Ente Photos and NAS (network drives) +--- + +# Network drives + +The Ente Photos desktop app currently does not support NAS (network drives). + +The app will actually work, and in some cases it will work fine too, but in +practice we have found that network storage products sometimes have flaky file +system emulation that causes bad performance during uploads, or when trying to +directly stream chunks of Google Takeout zips that are stored on network drives. + +In particular, the folder watch functionality suffers a lot since the app needs +access to file system events to detect changes to the users files so that they +can be uploaded whenever there are changes. + +Since are high chances of the user having a subpar experience, we request +customers to avoid using the desktop app directly with network attached storage +and instead temporarily copy the files to their local storage for uploads, and +avoid watching folders that live on a network drive. From 6627faed8c4ff4803b2b6c1834426e97742def58 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 12:18:58 +0530 Subject: [PATCH 0300/1179] Add sidebar entry --- docs/docs/.vitepress/sidebar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index a4cb857ef0..06286ff034 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -143,6 +143,10 @@ export const sidebar = [ text: "Missing thumbnails", link: "/photos/troubleshooting/thumbnails", }, + { + text: "Network drives", + link: "/photos/troubleshooting/nas", + }, { text: "Sharing debug logs", link: "/photos/troubleshooting/sharing-logs", From 741107e950681d52fc3c1aa879aa8c7a4f92ff0e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:26:42 +0530 Subject: [PATCH 0301/1179] [server] Enable multi-part upload flag for mobile --- server/ente/remotestore.go | 1 + server/pkg/controller/remotestore/controller.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/server/ente/remotestore.go b/server/ente/remotestore.go index 8f518f2a14..22e22d9b2c 100644 --- a/server/ente/remotestore.go +++ b/server/ente/remotestore.go @@ -30,6 +30,7 @@ type FeatureFlagResponse struct { RecoveryKeyVerified bool `json:"recoveryKeyVerified"` InternalUser bool `json:"internalUser"` BetaUser bool `json:"betaUser"` + EnableMobMultiPart bool `json:"enableMobMultiPart"` } type FlagKey string diff --git a/server/pkg/controller/remotestore/controller.go b/server/pkg/controller/remotestore/controller.go index bf8e4acfcc..d6df724b42 100644 --- a/server/pkg/controller/remotestore/controller.go +++ b/server/pkg/controller/remotestore/controller.go @@ -55,6 +55,10 @@ func (c *Controller) GetFeatureFlags(ctx *gin.Context) (*ente.FeatureFlagRespons response := &ente.FeatureFlagResponse{ EnableStripe: true, // enable stripe for all DisableCFWorker: false, + // When true, users will see an option to enable multiple part upload in the app + // Changing it to false will hide the option and disable multi part upload for everyone + // except internal user.rt + EnableMobMultiPart: true, } for key, value := range values { flag := ente.FlagKey(key) From 32fa1b1466155fc0d27d6aebee88ffa4f226b883 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:05:51 +0530 Subject: [PATCH 0302/1179] [mob]Bypass map permission dialog if already given --- mobile/lib/services/user_remote_flag_service.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/user_remote_flag_service.dart b/mobile/lib/services/user_remote_flag_service.dart index 6164800a0b..846f061b43 100644 --- a/mobile/lib/services/user_remote_flag_service.dart +++ b/mobile/lib/services/user_remote_flag_service.dart @@ -6,6 +6,7 @@ import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/core/network/network.dart'; import 'package:photos/events/notification_event.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/user_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -44,7 +45,11 @@ class UserRemoteFlagService { } bool getCachedBoolValue(String key) { - return _prefs.getBool(key) ?? false; + bool defaultValue = false; + if (key == mapEnabled) { + defaultValue = flagService.mapEnabled; + } + return _prefs.getBool(key) ?? defaultValue; } Future getBoolValue(String key) async { From c69280a3d764d6640d09811cf83c50717a69e223 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:06:02 +0530 Subject: [PATCH 0303/1179] [mob] ios build change --- mobile/ios/Runner.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index 462c4f3582..e3688f71ab 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -323,6 +323,7 @@ "${BUILT_PRODUCTS_DIR}/motionphoto/motionphoto.framework", "${BUILT_PRODUCTS_DIR}/move_to_background/move_to_background.framework", "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/native_video_player/native_video_player.framework", "${BUILT_PRODUCTS_DIR}/open_mail_app/open_mail_app.framework", "${BUILT_PRODUCTS_DIR}/package_info_plus/package_info_plus.framework", "${BUILT_PRODUCTS_DIR}/path_provider_foundation/path_provider_foundation.framework", @@ -418,6 +419,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/motionphoto.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/move_to_background.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/native_video_player.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/open_mail_app.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_foundation.framework", From a31a761933b7e93873acf8921cc9f2487cc6e940 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 13:07:51 +0530 Subject: [PATCH 0304/1179] [web] Log during logout Helps in tracing event sequences in logs --- web/apps/photos/src/services/logout.ts | 2 ++ web/packages/accounts/services/logout.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/web/apps/photos/src/services/logout.ts b/web/apps/photos/src/services/logout.ts index ab4b1aa6c5..8ebf30aec9 100644 --- a/web/apps/photos/src/services/logout.ts +++ b/web/apps/photos/src/services/logout.ts @@ -33,6 +33,8 @@ export const photosLogout = async () => { // - Photos specific logout + log.info("logout (photos)"); + try { clearFeatureFlagSessionState(); } catch (e) { diff --git a/web/packages/accounts/services/logout.ts b/web/packages/accounts/services/logout.ts index eef4fca6ee..af3ac42053 100644 --- a/web/packages/accounts/services/logout.ts +++ b/web/packages/accounts/services/logout.ts @@ -21,6 +21,8 @@ export const accountLogout = async () => { const ignoreError = (label: string, e: unknown) => log.error(`Ignoring error during logout (${label})`, e); + log.info("logout (account)"); + try { await remoteLogout(); } catch (e) { From 811aba2baf23f8e9d01d2d56ed9b2a70579decd6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:14:24 +0530 Subject: [PATCH 0305/1179] [mob] Remove unused field --- mobile/plugins/ente_feature_flag/lib/src/model.dart | 5 ----- mobile/plugins/ente_feature_flag/lib/src/service.dart | 2 -- 2 files changed, 7 deletions(-) diff --git a/mobile/plugins/ente_feature_flag/lib/src/model.dart b/mobile/plugins/ente_feature_flag/lib/src/model.dart index f3637728e5..fa6557f22e 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/model.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/model.dart @@ -8,7 +8,6 @@ class RemoteFlags { final bool disableCFWorker; final bool mapEnabled; final bool faceSearchEnabled; - final bool passKeyEnabled; final bool recoveryKeyVerified; final bool internalUser; final bool betaUser; @@ -19,7 +18,6 @@ class RemoteFlags { required this.disableCFWorker, required this.mapEnabled, required this.faceSearchEnabled, - required this.passKeyEnabled, required this.recoveryKeyVerified, required this.internalUser, required this.betaUser, @@ -31,7 +29,6 @@ class RemoteFlags { disableCFWorker: false, mapEnabled: false, faceSearchEnabled: false, - passKeyEnabled: false, recoveryKeyVerified: false, internalUser: kDebugMode, betaUser: kDebugMode, @@ -45,7 +42,6 @@ class RemoteFlags { 'disableCFWorker': disableCFWorker, 'mapEnabled': mapEnabled, 'faceSearchEnabled': faceSearchEnabled, - 'passKeyEnabled': passKeyEnabled, 'recoveryKeyVerified': recoveryKeyVerified, 'internalUser': internalUser, 'betaUser': betaUser, @@ -60,7 +56,6 @@ class RemoteFlags { mapEnabled: map['mapEnabled'] ?? defaultValue.mapEnabled, faceSearchEnabled: map['faceSearchEnabled'] ?? defaultValue.faceSearchEnabled, - passKeyEnabled: map['passKeyEnabled'] ?? defaultValue.passKeyEnabled, recoveryKeyVerified: map['recoveryKeyVerified'] ?? defaultValue.recoveryKeyVerified, internalUser: map['internalUser'] ?? defaultValue.internalUser, diff --git a/mobile/plugins/ente_feature_flag/lib/src/service.dart b/mobile/plugins/ente_feature_flag/lib/src/service.dart index 4177b9debf..e7df0f34d1 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/service.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/service.dart @@ -69,8 +69,6 @@ class FlagService { bool get faceSearchEnabled => internalUser || flags.betaUser; - bool get passKeyEnabled => flags.passKeyEnabled || internalOrBetaUser; - bool get recoveryKeyVerified => flags.recoveryKeyVerified; bool get enableMobMultiPart => flags.enableMobMultiPart || internalUser; From b04831d4dfcc2ffa8b04b70823dfacfcffb0ccc8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 13:34:19 +0530 Subject: [PATCH 0306/1179] Split ML status sync --- web/packages/new/photos/services/ml/index.ts | 36 +++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 1ee85c37e6..6cb54d397a 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -270,22 +270,40 @@ const updateIsMLEnabledRemote = (enabled: boolean) => updateRemoteFlag(mlRemoteKey, enabled); /** - * Trigger a "sync", whatever that means for the ML subsystem. + * Sync the ML status with remote. * - * This is called during the global sync sequence. + * This is called an at early point in the global sync sequence, without waiting + * for the potentially long file information sync to complete. * - * * It checks with remote if the ML flag is set, and updates our local flag to - * reflect that value. + * It checks with remote if the ML flag is set, and updates our local flag to + * reflect that value. * - * * If ML is enabled, it pulls any missing embeddings from remote and starts - * indexing to backfill any missing values. + * To trigger the actual ML sync, use {@link triggerMLSync}. + */ +export const triggerMLStatusSync = () => void mlStatusSync(); + +const mlStatusSync = async () => { + _state.isMLEnabled = await getIsMLEnabledRemote(); + setIsMLEnabledLocal(_state.isMLEnabled); + triggerStatusUpdate(); +}; + +/** + * Trigger a ML sync. + * + * This is called during the global sync sequence, after files information have + * been synced with remote. + * + * If ML is enabled, it pulls any missing embeddings from remote and starts + * indexing to backfill any missing values. + * + * This will only have an effect if {@link triggerMLSync} has been called at + * least once prior to calling this in the sync sequence. */ export const triggerMLSync = () => void mlSync(); const mlSync = async () => { - _state.isMLEnabled = await getIsMLEnabledRemote(); - setIsMLEnabledLocal(_state.isMLEnabled); - triggerStatusUpdate(); + await mlStatusSync(); if (_state.isMLEnabled) void worker().then((w) => w.sync()); }; From fd00b4ffae1fbda9c118983014d083bb7b63bf36 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 13:59:10 +0530 Subject: [PATCH 0307/1179] refactor --- mobile/lib/db/ml/db.dart | 112 ++++++++++----------- mobile/lib/db/ml/db_fields.dart | 16 ++- mobile/lib/generated/intl/messages_de.dart | 5 +- mobile/lib/generated/intl/messages_pl.dart | 6 +- mobile/lib/generated/intl/messages_pt.dart | 8 +- 5 files changed, 73 insertions(+), 74 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 7d1a8b1700..89cab01b81 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -149,9 +149,9 @@ class FaceMLDataDB { final batch = faceIDToClusterID.entries.toList().sublist(start, end); const String sql = ''' - INSERT INTO $faceClustersTable ($fcFaceId, $fcClusterID) + INSERT INTO $faceClustersTable ($faceIDColumn, $clusterIDColumn) VALUES (?, ?) - ON CONFLICT($fcFaceId) DO UPDATE SET $fcClusterID = excluded.$fcClusterID + ON CONFLICT($faceIDColumn) DO UPDATE SET $clusterIDColumn = excluded.$clusterIDColumn '''; final parameterSets = batch.map((e) => [e.key, e.value]).toList(); @@ -190,11 +190,11 @@ class FaceMLDataDB { Future> clusterIdToFaceCount() async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $fcClusterID, COUNT(*) as count FROM $faceClustersTable where $fcClusterID IS NOT NULL GROUP BY $fcClusterID ', + 'SELECT $clusterIDColumn, COUNT(*) as count FROM $faceClustersTable where $clusterIDColumn IS NOT NULL GROUP BY $clusterIDColumn ', ); final Map result = {}; for (final map in maps) { - result[map[fcClusterID] as String] = map['count'] as int; + result[map[clusterIDColumn] as String] = map['count'] as int; } return result; } @@ -243,7 +243,7 @@ class FaceMLDataDB { }) async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $embeddingColumn FROM $facesTable WHERE $faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID = ?) ${limit != null ? 'LIMIT $limit' : ''}', + 'SELECT $embeddingColumn FROM $facesTable WHERE $faceIDColumn in (SELECT $faceIDColumn from $faceClustersTable where $clusterIDColumn = ?) ${limit != null ? 'LIMIT $limit' : ''}', [clusterID], ); return maps.map((e) => e[embeddingColumn] as Uint8List); @@ -257,10 +257,10 @@ class FaceMLDataDB { final Map> result = {}; final selectQuery = ''' - SELECT fc.$fcClusterID, fe.$embeddingColumn + SELECT fc.$clusterIDColumn, fe.$embeddingColumn FROM $faceClustersTable fc - INNER JOIN $facesTable fe ON fc.$fcFaceId = fe.$faceIDColumn - WHERE fc.$fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + INNER JOIN $facesTable fe ON fc.$faceIDColumn = fe.$faceIDColumn + WHERE fc.$clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')}) ${limit != null ? 'LIMIT ?' : ''} '''; @@ -273,7 +273,7 @@ class FaceMLDataDB { await db.getAll(selectQuery, selectQueryParams); for (final map in maps) { - final clusterID = map[fcClusterID] as String; + final clusterID = map[clusterIDColumn] as String; final faceEmbedding = map[embeddingColumn] as Uint8List; result.putIfAbsent(clusterID, () => []).add(faceEmbedding); } @@ -311,7 +311,7 @@ class FaceMLDataDB { clusterRows.map((e) => e[clusterIDColumn] as String).toList(); // final List> faceMaps = await db.getAll( // 'SELECT * FROM $facesTable where ' - // '$faceIDColumn in (SELECT $fcFaceId from $faceClustersTable where $fcClusterID IN (${clusterIDs.join(",")}))' + // '$faceIDColumn in (SELECT $faceIDColumn from $faceClustersTable where $clusterIDColumn IN (${clusterIDs.join(",")}))' // 'AND $fileIDColumn in (${fileId.join(",")}) AND $faceScore > $kMinimumQualityFaceScore ORDER BY $faceScore DESC', // ); @@ -319,9 +319,9 @@ class FaceMLDataDB { ''' SELECT * FROM $facesTable WHERE $faceIDColumn IN ( - SELECT $fcFaceId + SELECT $faceIDColumn FROM $faceClustersTable - WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')}) ) AND $fileIDColumn IN (${List.filled(fileId.length, '?').join(',')}) AND $faceScore > ? @@ -343,9 +343,9 @@ class FaceMLDataDB { } if (clusterID != null) { const String queryFaceID = ''' - SELECT $fcFaceId + SELECT $faceIDColumn FROM $faceClustersTable - WHERE $fcClusterID = ? + WHERE $clusterIDColumn = ? '''; final List> faceMaps = await db.getAll( queryFaceID, @@ -354,8 +354,8 @@ class FaceMLDataDB { final List? faces = await getFacesForGivenFileID(recentFileID); if (faces != null) { for (final face in faces) { - if (faceMaps - .any((element) => (element[fcFaceId] as String) == face.faceID)) { + if (faceMaps.any( + (element) => (element[faceIDColumn] as String) == face.faceID,)) { return face; } } @@ -391,16 +391,16 @@ class FaceMLDataDB { final List> maps = await db.getAll( ''' - SELECT $fcClusterID, $fcFaceId + SELECT $clusterIDColumn, $faceIDColumn FROM $faceClustersTable - WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')}) ''', [...clusterIDs], ); for (final map in maps) { - final clusterID = map[fcClusterID] as String; - final faceID = map[fcFaceId] as String; + final clusterID = map[clusterIDColumn] as String; + final faceID = map[faceIDColumn] as String; result.putIfAbsent(clusterID, () => []).add(faceID); } return result; @@ -409,24 +409,24 @@ class FaceMLDataDB { Future getClusterIDForFaceID(String faceID) async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $fcClusterID FROM $faceClustersTable WHERE $fcFaceId = ?', + 'SELECT $clusterIDColumn FROM $faceClustersTable WHERE $faceIDColumn = ?', [faceID], ); if (maps.isEmpty) { return null; } - return maps.first[fcClusterID] as String; + return maps.first[clusterIDColumn] as String; } Future>> getAllClusterIdToFaceIDs() async { final db = await instance.asyncDB; final Map> result = {}; final List> maps = await db.getAll( - 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable', + 'SELECT $clusterIDColumn, $faceIDColumn FROM $faceClustersTable', ); for (final map in maps) { - final clusterID = map[fcClusterID] as String; - final faceID = map[fcFaceId] as String; + final clusterID = map[clusterIDColumn] as String; + final faceID = map[faceIDColumn] as String; result.putIfAbsent(clusterID, () => []).add(faceID); } return result; @@ -435,11 +435,11 @@ class FaceMLDataDB { Future> getFaceIDsForCluster(String clusterID) async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $fcFaceId FROM $faceClustersTable ' - 'WHERE $faceClustersTable.$fcClusterID = ?', + 'SELECT $faceIDColumn FROM $faceClustersTable ' + 'WHERE $faceClustersTable.$clusterIDColumn = ?', [clusterID], ); - return maps.map((e) => e[fcFaceId] as String).toSet(); + return maps.map((e) => e[faceIDColumn] as String).toSet(); } // Get Map of personID to Map of clusterID to faceIDs @@ -447,14 +447,14 @@ class FaceMLDataDB { getPersonToClusterIdToFaceIds() async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $personIdColumn, $faceClustersTable.$fcClusterID, $fcFaceId FROM $clusterPersonTable ' - 'LEFT JOIN $faceClustersTable ON $clusterPersonTable.$clusterIDColumn = $faceClustersTable.$fcClusterID', + 'SELECT $personIdColumn, $faceClustersTable.$clusterIDColumn, $faceIDColumn FROM $clusterPersonTable ' + 'LEFT JOIN $faceClustersTable ON $clusterPersonTable.$clusterIDColumn = $faceClustersTable.$clusterIDColumn', ); final Map>> result = {}; for (final map in maps) { final personID = map[personIdColumn] as String; - final clusterID = map[fcClusterID] as String; - final faceID = map[fcFaceId] as String; + final clusterID = map[clusterIDColumn] as String; + final faceID = map[faceIDColumn] as String; result .putIfAbsent(personID, () => {}) .putIfAbsent(clusterID, () => {}) @@ -466,12 +466,12 @@ class FaceMLDataDB { Future> getFaceIDsForPerson(String personID) async { final db = await instance.asyncDB; final faceIdsResult = await db.getAll( - 'SELECT $fcFaceId FROM $faceClustersTable LEFT JOIN $clusterPersonTable ' - 'ON $faceClustersTable.$fcClusterID = $clusterPersonTable.$clusterIDColumn ' + 'SELECT $faceIDColumn FROM $faceClustersTable LEFT JOIN $clusterPersonTable ' + 'ON $faceClustersTable.$clusterIDColumn = $clusterPersonTable.$clusterIDColumn ' 'WHERE $clusterPersonTable.$personIdColumn = ?', [personID], ); - return faceIdsResult.map((e) => e[fcFaceId] as String).toSet(); + return faceIdsResult.map((e) => e[faceIDColumn] as String).toSet(); } Future> getBlurValuesForCluster(String clusterID) async { @@ -479,13 +479,13 @@ class FaceMLDataDB { const String query = ''' SELECT $facesTable.$faceBlur FROM $facesTable - JOIN $faceClustersTable ON $facesTable.$faceIDColumn = $faceClustersTable.$fcFaceId - WHERE $faceClustersTable.$fcClusterID = ? + JOIN $faceClustersTable ON $facesTable.$faceIDColumn = $faceClustersTable.$faceIDColumn + WHERE $faceClustersTable.$clusterIDColumn = ? '''; // const String query2 = ''' // SELECT $faceBlur // FROM $facesTable - // WHERE $faceIDColumn IN (SELECT $fcFaceId FROM $faceClustersTable WHERE $fcClusterID = ?) + // WHERE $faceIDColumn IN (SELECT $faceIDColumn FROM $faceClustersTable WHERE $clusterIDColumn = ?) // '''; final List> maps = await db.getAll( query, @@ -499,11 +499,11 @@ class FaceMLDataDB { ) async { final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $fcFaceId, $fcClusterID FROM $faceClustersTable where $fcFaceId IN (${faceIds.map((id) => "'$id'").join(",")})', + 'SELECT $faceIDColumn, $clusterIDColumn FROM $faceClustersTable where $faceIDColumn IN (${faceIds.map((id) => "'$id'").join(",")})', ); final Map result = {}; for (final map in maps) { - result[map[fcFaceId] as String] = map[fcClusterID] as String?; + result[map[faceIDColumn] as String] = map[clusterIDColumn] as String?; } return result; } @@ -512,12 +512,12 @@ class FaceMLDataDB { final Map> result = {}; final db = await instance.asyncDB; final List> maps = await db.getAll( - 'SELECT $fcClusterID, $fcFaceId FROM $faceClustersTable', + 'SELECT $clusterIDColumn, $faceIDColumn FROM $faceClustersTable', ); for (final map in maps) { - final clusterID = map[fcClusterID] as String; - final faceID = map[fcFaceId] as String; + final clusterID = map[clusterIDColumn] as String; + final faceID = map[faceIDColumn] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); } @@ -530,9 +530,9 @@ class FaceMLDataDB { final db = await instance.asyncDB; const String sql = ''' - INSERT INTO $faceClustersTable ($fcFaceId, $fcClusterID) + INSERT INTO $faceClustersTable ($faceIDColumn, $clusterIDColumn) VALUES (?, ?) - ON CONFLICT($fcFaceId) DO UPDATE SET $fcClusterID = excluded.$fcClusterID + ON CONFLICT($faceIDColumn) DO UPDATE SET $clusterIDColumn = excluded.$clusterIDColumn '''; final parameterSets = faceIDToClusterID.entries.map((e) => [e.key, e.value]).toList(); @@ -662,11 +662,11 @@ class FaceMLDataDB { Future getClusteredOrFacelessFileCount() async { final db = await instance.asyncDB; final List> clustered = await db.getAll( - 'SELECT $fcFaceId FROM $faceClustersTable', + 'SELECT $faceIDColumn FROM $faceClustersTable', ); final Set clusteredFileIDs = {}; for (final map in clustered) { - final int fileID = getFileIdFromFaceId(map[fcFaceId] as String); + final int fileID = getFileIdFromFaceId(map[faceIDColumn] as String); clusteredFileIDs.add(fileID); } @@ -701,10 +701,10 @@ class FaceMLDataDB { const String query = ''' SELECT f.$faceIDColumn FROM $facesTable f - LEFT JOIN $faceClustersTable fc ON f.$faceIDColumn = fc.$fcFaceId + LEFT JOIN $faceClustersTable fc ON f.$faceIDColumn = fc.$faceIDColumn WHERE f.$faceScore > $kMinimumQualityFaceScore AND f.$faceBlur > $kLaplacianHardThreshold - AND fc.$fcFaceId IS NULL + AND fc.$faceIDColumn IS NULL '''; final List> maps = await db.getAll(query); return maps.length; @@ -790,16 +790,16 @@ class FaceMLDataDB { final db = instance.asyncDB; return db.then((db) async { final List> maps = await db.getAll( - 'SELECT $faceClustersTable.$fcClusterID, $fcFaceId FROM $faceClustersTable ' + 'SELECT $faceClustersTable.$clusterIDColumn, $faceIDColumn FROM $faceClustersTable ' 'INNER JOIN $clusterPersonTable ' - 'ON $faceClustersTable.$fcClusterID = $clusterPersonTable.$clusterIDColumn ' + 'ON $faceClustersTable.$clusterIDColumn = $clusterPersonTable.$clusterIDColumn ' 'WHERE $clusterPersonTable.$personIdColumn = ?', [personID], ); final Map> result = {}; for (final map in maps) { final clusterID = map[clusterIDColumn] as String; - final String faceID = map[fcFaceId] as String; + final String faceID = map[faceIDColumn] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); } @@ -814,16 +814,16 @@ class FaceMLDataDB { return db.then((db) async { final List> maps = await db.getAll( ''' - SELECT $fcClusterID, $fcFaceId + SELECT $clusterIDColumn, $faceIDColumn FROM $faceClustersTable - WHERE $fcClusterID IN (${List.filled(clusterIDs.length, '?').join(',')}) + WHERE $clusterIDColumn IN (${List.filled(clusterIDs.length, '?').join(',')}) ''', [...clusterIDs], ); final Map> result = {}; for (final map in maps) { - final clusterID = map[fcClusterID] as String; - final faceID = map[fcFaceId] as String; + final clusterID = map[clusterIDColumn] as String; + final faceID = map[faceIDColumn] as String; final fileID = getFileIdFromFaceId(faceID); result[fileID] = (result[fileID] ?? {})..add(clusterID); } diff --git a/mobile/lib/db/ml/db_fields.dart b/mobile/lib/db/ml/db_fields.dart index f05953855e..c6fde65d2f 100644 --- a/mobile/lib/db/ml/db_fields.dart +++ b/mobile/lib/db/ml/db_fields.dart @@ -11,9 +11,11 @@ const faceBlur = 'blur'; const isSideways = 'is_sideways'; const imageWidth = 'width'; const imageHeight = 'height'; -const faceClusterId = 'cluster_id'; const mlVersionColumn = 'ml_version'; +const personIdColumn = 'person_id'; +const clusterIDColumn = 'cluster_id'; + const createFacesTable = '''CREATE TABLE IF NOT EXISTS $facesTable ( $fileIDColumn INTEGER NOT NULL, $faceIDColumn TEXT NOT NULL UNIQUE, @@ -34,27 +36,23 @@ const deleteFacesTable = 'DELETE FROM $facesTable'; //##region Face Clusters Table Fields & Schema Queries const faceClustersTable = 'face_clusters'; -const fcClusterID = 'cluster_id'; -const fcFaceId = 'face_id'; // fcClusterId & fcFaceId are the primary keys and fcClusterId is a foreign key to faces table const createFaceClustersTable = ''' CREATE TABLE IF NOT EXISTS $faceClustersTable ( - $fcFaceId TEXT NOT NULL, - $fcClusterID TEXT NOT NULL, - PRIMARY KEY($fcFaceId) + $faceIDColumn TEXT NOT NULL, + $clusterIDColumn TEXT NOT NULL, + PRIMARY KEY($faceIDColumn) ); '''; // -- Creating a non-unique index on clusterID for query optimization const fcClusterIDIndex = - '''CREATE INDEX IF NOT EXISTS idx_fcClusterID ON $faceClustersTable($fcClusterID);'''; + '''CREATE INDEX IF NOT EXISTS idx_fcClusterID ON $faceClustersTable($clusterIDColumn);'''; const deleteFaceClustersTable = 'DELETE FROM $faceClustersTable'; //##endregion // Clusters Table Fields & Schema Queries const clusterPersonTable = 'cluster_person'; -const personIdColumn = 'person_id'; -const clusterIDColumn = 'cluster_id'; const createClusterPersonTable = ''' CREATE TABLE IF NOT EXISTS $clusterPersonTable ( diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index feed2c27a5..595d34ca43 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -825,9 +825,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zugriff gewähren"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Fotos in der Nähe gruppieren"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Gastansicht"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1002,6 +1002,7 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Bitte beachte, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 46bebdd3d6..54b76e07cd 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -752,7 +752,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToRenew": MessageLookupByLibrary.simpleMessage("Nie udało się odnowić"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( - "Nie udało się zweryfikować statusu płatności"), + "Nie udało się zweryfikować stanu płatności"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( "Dodaj 5 członków rodziny do istniejącego planu bez dodatkowego płacenia.\n\nKażdy członek otrzymuje własną przestrzeń prywatną i nie widzi wzajemnie swoich plików, chyba że są one udostępnione.\n\nPlany rodzinne są dostępne dla klientów, którzy mają płatną subskrypcję Ente.\n\nSubskrybuj teraz, aby rozpocząć!"), "familyPlanPortalTitle": @@ -818,9 +818,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Przyznaj uprawnienie"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Grupuj pobliskie zdjęcia"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Widok gościa"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index a727b37fc8..773b78fbf0 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -673,7 +673,7 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Esvaziar"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), - "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar mapa"), + "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), "encryptingBackup": @@ -817,9 +817,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conceder permissão"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Agrupar fotos próximas"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Visão de convidado"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1222,7 +1222,7 @@ class MessageLookup extends MessageLookupByLibrary { "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Indique amigos e 2x seu plano"), "referralStep1": MessageLookupByLibrary.simpleMessage( - "Envie esse código aos seus amigos"), + "1. Dê este código aos seus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscrevem em um plano pago"), "referralStep3": m44, From e3d7b144425117dfffd50bb2dbd83c8fb0d437d5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 13:57:47 +0530 Subject: [PATCH 0308/1179] Use --- web/apps/photos/src/pages/gallery/index.tsx | 3 ++- web/apps/photos/src/services/sync.ts | 28 +++++++++++++++----- web/packages/new/photos/services/ml/index.ts | 4 +-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/web/apps/photos/src/pages/gallery/index.tsx b/web/apps/photos/src/pages/gallery/index.tsx index 1c72be1727..9bd21abecd 100644 --- a/web/apps/photos/src/pages/gallery/index.tsx +++ b/web/apps/photos/src/pages/gallery/index.tsx @@ -94,7 +94,7 @@ import { } from "services/collectionService"; import { syncFiles } from "services/fileService"; import locationSearchService from "services/locationSearchService"; -import { sync } from "services/sync"; +import { sync, triggerPreFileInfoSync } from "services/sync"; import { syncTrash } from "services/trashService"; import uploadManager from "services/upload/uploadManager"; import { isTokenValid } from "services/userService"; @@ -704,6 +704,7 @@ export default function Gallery() { throw new Error(CustomError.SESSION_EXPIRED); } !silent && startLoading(); + triggerPreFileInfoSync(); const collections = await getAllLatestCollections(); const { normalCollections, hiddenCollections } = await splitNormalAndHiddenCollections(collections); diff --git a/web/apps/photos/src/services/sync.ts b/web/apps/photos/src/services/sync.ts index 5ebc5b43b0..c96e239526 100644 --- a/web/apps/photos/src/services/sync.ts +++ b/web/apps/photos/src/services/sync.ts @@ -1,20 +1,36 @@ import { fetchAndSaveFeatureFlagsIfNeeded } from "@/new/photos/services/feature-flags"; -import { isMLSupported, triggerMLSync } from "@/new/photos/services/ml"; +import { + isMLSupported, + triggerMLStatusSync, + triggerMLSync, +} from "@/new/photos/services/ml"; import { syncEntities } from "services/entityService"; import { syncMapEnabled } from "services/userService"; +/** + * Part 1 of {@link sync}. See TODO below for why this is split. + */ +export const triggerPreFileInfoSync = () => { + fetchAndSaveFeatureFlagsIfNeeded(); + if (isMLSupported) triggerMLStatusSync(); +}; + /** * Perform a soft "refresh" by making various API calls to fetch state from * remote, using it to update our local state, and triggering periodic jobs that * depend on the local state. + * + * TODO: This is called after we've synced the local files DBs with remote. That + * code belongs here, but currently that state is persisted in the top level + * gallery React component. + * + * So meanwhile we've split this sync into this method, which is called after + * the file info has been synced (which can take a few minutes for large + * libraries after initial login), and the `preFileInfoSync`, which is called + * before doing the file sync and thus should run immediately after login. */ export const sync = async () => { - // TODO: This is called after we've synced the local files DBs with remote. - // That code belongs here, but currently that state is persisted in the top - // level gallery React component. - await syncEntities(); await syncMapEnabled(); - fetchAndSaveFeatureFlagsIfNeeded(); if (isMLSupported) triggerMLSync(); }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 6cb54d397a..65a36c5981 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -303,9 +303,7 @@ const mlStatusSync = async () => { export const triggerMLSync = () => void mlSync(); const mlSync = async () => { - await mlStatusSync(); - - if (_state.isMLEnabled) void worker().then((w) => w.sync()); + if (_state.isMLEnabled) await worker().then((w) => w.sync()); }; /** From 4f0145e6d3ac848d2b1e1c928803950cfef4a53b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 14:32:29 +0530 Subject: [PATCH 0309/1179] Remove unused --- web/packages/new/photos/services/ml/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 3f211421c0..7e6825ad9b 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -78,7 +78,7 @@ interface IndexableItem { export class MLWorker { private electron: ElectronMLWorker | undefined; private delegate: MLWorkerDelegate | undefined; - private state: "idle" | "tick" | "pull" | "indexing" = "idle"; + private state: "idle" | "tick" | "indexing" = "idle"; private liveQ: IndexableItem[] = []; private idleTimeout: ReturnType | undefined; private idleDuration = idleDurationStart; /* unit: seconds */ From 78fc2aec88122fdd329531caa9f24a47d6b5c7eb Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:05:02 +0530 Subject: [PATCH 0310/1179] [mob] Fix model path for progress --- .../semantic_search/clip/clip_text_encoder.dart | 4 ++-- mobile/lib/ui/settings/machine_learning_settings_page.dart | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index 35bff3d1cf..cdf3fdf47c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -8,7 +8,7 @@ import "package:photos/utils/ml_util.dart"; class ClipTextEncoder extends MlModel { // static const _kRemoteBucketModelPath = "clip-text-vit-32-float32-int32.onnx"; // Unquantized model - static const _kRemoteBucketModelPath = + static const kRemoteBucketModelPath = "mobileclip_s2_text_int32.onnx"; // Quantized model static const _kVocabRemotePath = "bpe_simple_vocab_16e6.txt"; @@ -16,7 +16,7 @@ class ClipTextEncoder extends MlModel { static const _modelName = "ClipTextEncoder"; @override - String get modelRemotePath => kModelBucketEndpoint + _kRemoteBucketModelPath; + String get modelRemotePath => kModelBucketEndpoint + kRemoteBucketModelPath; String get vocabRemotePath => kModelBucketEndpoint + _kVocabRemotePath; @override diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 78f8c14b3f..f75fd00b36 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -6,6 +6,8 @@ import "package:photos/generated/l10n.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/machine_learning_controller.dart"; import "package:photos/services/machine_learning/ml_service.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; +import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import "package:photos/services/remote_assets_service.dart"; import "package:photos/theme/ente_theme.dart"; @@ -164,9 +166,9 @@ class _ModelLoadingStateState extends State { RemoteAssetsService.instance.progressStream.listen((event) { final String url = event.$1; String title = ""; - if (url.contains("clip-image")) { + if (url.contains(ClipImageEncoder.kRemoteBucketModelPath)) { title = "Image Model"; - } else if (url.contains("clip-text")) { + } else if (url.contains(ClipTextEncoder.kRemoteBucketModelPath)) { title = "Text Model"; } else if (url.contains("yolov5s_face")) { title = "Face Detection Model"; From f5738f8460fb30fdc12e9b511421c04a210442cc Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 14:59:43 +0530 Subject: [PATCH 0311/1179] CGroup --- .../new/photos/services/ml/cluster-new.ts | 87 +++++++++++-------- web/packages/new/photos/services/ml/db.ts | 10 +-- .../new/photos/services/user-entity.ts | 6 +- 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 60a9a1e9fb..887237e66a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -8,11 +8,10 @@ import { dotProduct } from "./math"; /** * A face cluster is an set of faces. * - * Each cluster has an id so that a {@link Person} can refer to it. + * Each cluster has an id so that a {@link CGroup} can refer to it. * - * The cluster is not directly synced to remote. But it does indirectly get - * synced if it gets promoted or attached to a person (which can be thought of - * as a named or hidden clusters). + * The cluster is not directly synced to remote. Only clusters that the user + * interacts with get synced to remote, as part of a {@link CGroup}. */ export interface FaceCluster { /** @@ -29,67 +28,77 @@ export interface FaceCluster { } /** - * A Person is a set of clusters with some attached metadata. + * A cgroup ("cluster group") is a group of clusters (possibly containing a + * single cluster) that the user has interacted with. * - * More precisely, a person is a a single cluster or a set of clusters that the - * user has interacted with. + * Interactions include hiding, merging and giving a name and/or a cover photo. * * The most frequent interaction is naming a {@link FaceCluster}, which promotes - * it to a become a {@link Person}. The promotion comes with the ability to be - * synced with remote (as a "person_v2" user entity). + * it to a become a {@link CGroup}. The promotion comes with the ability to be + * synced with remote (as a "cgroup" user entity). * - * There after, the user may attach more clusters to the same {@link Person}. + * There after, the user may attach more clusters to the same {@link CGroup}. + * + * > A named cluster group can be thought of as a "person", though this is not + * > necessarily an accurate characterization. e.g. there can be a named cluster + * > group that contains face clusters of pets. * * The other form of interaction is hiding. The user may hide a single (unnamed) - * cluster, or they may hide a person. + * cluster, or they may hide an named {@link CGroup}. In both cases, we promote + * the cluster to a CGroup if needed so that their request to hide gets synced. * - * The Person entity on remote has clusters embedded within itself + * While in our local representation we separately maintain clusters and link to + * them from within CGroups by their clusterID, in the remote representation + * clusters themselves don't get synced. Instead, the "cgroup" entities synced + * with remote contain the clusters within themselves. So a group that gets + * synced with remote looks something like: * - * { name, clusters: [{ clusterID, faceIDs }] } + * { id, name, clusters: [{ clusterID, faceIDs }] } * - * Since clusters don't get independently synced, one way to think about a - * Person is that it is an interaction with a cluster that we want to sync. */ -export interface Person { +export interface CGroup { /** - * A UUID or nanoid for this person. + * A nanoid for this cluster group. * - * This is the ID of the Person user entity, it is not contained as part of - * the Person entity payload. + * This is the ID of the "cgroup" user entity, it is not contained as part + * of the group entity payload itself. */ id: string; /** - * A name assigned by the user to this person. + * A name assigned by the user to this cluster group. * - * This can be missing or an empty string for an unnamed cluster that was + * This should be set to an empty string for an unnamed cluster that was * hidden. */ name: string | undefined; /** - * An unordered set of ids of the clusters that belong to this person. + * An unordered set of ids of the clusters that belong to this group. * * For ergonomics of transportation and persistence this is an array, but it * should conceptually be thought of as a set. */ clusterIDs: string[]; /** - * True if this person should be hidden. + * True if this cluster group should be hidden. * - * This can also be true for unnamed hidden clusters. When the user hides a - * single cluster that was offered as a suggestion to them on a client, then - * the client will create a new person entity without a name, and set its - * hidden flag to sync it with remote (so that other clients can also stop - * showing this cluster). + * The user can hide both named cluster groups and single unnamed clusters. + * If the user hides a single cluster that was offered as a suggestion to + * them on a client, the client will create a new unnamed cgroup containing + * it, and set its hidden flag to sync it with remote (so that other clients + * can also stop showing this cluster). */ isHidden: boolean; /** - * The ID of the face that should be used as the cover photo for this person - * (if the user has set one). + * The ID of the face that should be used as the cover photo for this + * cluster group (if the user has set one). + * + * {@link avatarFaceID} is the user selected face. {@link displayFaceID} is + * the automatic placeholder. */ avatarFaceID: string | undefined; /** * Locally determined ID of the "best" face that should be used as the - * display face, to represent this person in the UI. + * display face, to represent this cluster group in the UI. */ displayFaceID: string | undefined; } @@ -99,9 +108,11 @@ export interface Person { * * [Note: Face clustering algorithm] * - * A person consists of clusters, each of which itself is a set of faces. + * A (cluster) group consists of clusters, each of which itself is a set of + * faces. * - * The clusters are generated using locally by clients using this algorithm: + * The clusters are generated using locally by clients using the following + * (pseudo-) algorithm: * * 1. clusters = [] initially, or fetched from remote. * @@ -116,11 +127,11 @@ export interface Person { * following actions to the list of clusters that they can see: * * - They can provide a name for a cluster. This upgrades a cluster into a - * "Person", which then gets synced via remote to all their devices. + * "cgroup", which then gets synced via remote to all their devices. * - * - They can attach more clusters to a person. + * - They can attach more clusters to a cgroup. * - * - They can remove a cluster from a person. + * - They can remove a cluster from a cgroup. * * After clustering, we also do some routine cleanup. Faces belonging to files * that have been deleted (including those in Trash) should be pruned off. @@ -226,8 +237,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // Prune too small clusters. const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - // For each person, use the highest scoring face in any of its clusters as - // its display face. + // For each cluster group, use the highest scoring face in any of its + // clusters as its display face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); const people = await persons(); diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 6ae98519c3..294203142b 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -3,7 +3,7 @@ import log from "@/base/log"; import localForage from "@ente/shared/storage/localForage"; import { deleteDB, openDB, type DBSchema } from "idb"; import type { LocalCLIPIndex } from "./clip"; -import type { FaceCluster, Person } from "./cluster-new"; +import type { CGroup, FaceCluster } from "./cluster-new"; import type { LocalFaceIndex } from "./face"; /** @@ -50,7 +50,7 @@ interface MLDBSchema extends DBSchema { }; person: { key: string; - value: Person; + value: CGroup; }; } @@ -451,7 +451,7 @@ export const setFaceClusters = async (clusters: FaceCluster[]) => { * - A person, in which case it should add or overwrite the entry for the * corresponding person (as identified by their {@link id}). */ -export const applyPersonDiff = async (diff: (string | Person)[]) => { +export const applyPersonDiff = async (diff: (string | CGroup)[]) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); // See: [Note: Diff response will have at most one entry for an id] @@ -468,7 +468,7 @@ export const applyPersonDiff = async (diff: (string | Person)[]) => { * their {@link id}. */ // TODO-Cluster: Remove me -export const savePerson = async (person: Person) => { +export const savePerson = async (person: CGroup) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); await Promise.all([tx.store.put(person), tx.done]); @@ -491,7 +491,7 @@ export const deletePerson = async (id: string) => { * inserts the given {@link persons} into it. */ // TODO-Cluster: Remove me -export const setPersons = async (persons: Person[]) => { +export const setPersons = async (persons: CGroup[]) => { const db = await mlDB(); const tx = db.transaction("person", "readwrite"); await tx.store.clear(); diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 260317341a..5d12f975a3 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -7,7 +7,7 @@ import { usersEncryptionKeyB64 } from "@/base/session-store"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip } from "./gzip"; -import type { Person } from "./ml/cluster-new"; +import type { CGroup } from "./ml/cluster-new"; import { applyPersonDiff } from "./ml/db"; /** @@ -313,7 +313,7 @@ const saveLatestUpdatedAt = (type: EntityType, value: number) => setKV(latestUpdatedAtKey(type), value); /** - * Sync the {@link Person} entities that we have locally with remote. + * Sync the {@link CGroup} entities that we have locally with remote. * * This fetches all the user entities corresponding to the "person_v2" entity * type from remote that have been created, updated or deleted since the last @@ -326,7 +326,7 @@ export const syncPersons = async () => { const entityKeyB64 = await getOrCreateEntityKeyB64(type); - const parse = async (id: string, data: Uint8Array): Promise => { + const parse = async (id: string, data: Uint8Array): Promise => { const rp = RemotePerson.parse(JSON.parse(await gunzip(data))); return { id, From 1731aeb87dceefac6d838972ed9743cfdcfeae11 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:13:01 +0530 Subject: [PATCH 0312/1179] [mob] Fix state refresh when model is being downloaded --- .../lib/ui/settings/machine_learning_settings_page.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index f75fd00b36..910f4da683 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -35,12 +35,20 @@ class MachineLearningSettingsPage extends StatefulWidget { class _MachineLearningSettingsPageState extends State { final EnteWakeLock _wakeLock = EnteWakeLock(); + Timer? _timer; @override void initState() { super.initState(); _wakeLock.enable(); MachineLearningController.instance.forceOverrideML(turnOn: true); + if (!MLService.instance.areModelsDownloaded) { + _timer = Timer.periodic(const Duration(seconds: 10), (timer) { + if (mounted) { + setState(() {}); + } + }); + } } @override @@ -48,6 +56,7 @@ class _MachineLearningSettingsPageState super.dispose(); _wakeLock.disable(); MachineLearningController.instance.forceOverrideML(turnOn: false); + _timer?.cancel(); } @override From 3f20f572d205d77a4cd850a8c306e6f59cd0340d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 15:16:58 +0530 Subject: [PATCH 0313/1179] Propagate --- web/apps/photos/src/services/searchService.ts | 4 +- .../new/photos/services/ml/cluster-new.ts | 4 +- web/packages/new/photos/services/ml/db.ts | 78 +++++++++---------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 0c203b1189..a2e6eee825 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -9,7 +9,7 @@ import { wipCluster, wipClusterEnable, } from "@/new/photos/services/ml"; -import { persons } from "@/new/photos/services/ml/db"; +import { clusterGroups } from "@/new/photos/services/ml/db"; import type { SearchPerson } from "@/new/photos/services/search"; import { syncPersons } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; @@ -425,7 +425,7 @@ async function getAllPeople(limit: number = undefined) { done = true; if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { await syncPersons(); - const people = await persons(); + const people = await clusterGroups(); log.debug(() => ["people", { people }]); } diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 887237e66a..69e8de6f26 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -1,7 +1,7 @@ import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; -import { faceClusters, persons } from "./db"; +import { clusterGroups, faceClusters } from "./db"; import type { Face, FaceIndex } from "./face"; import { dotProduct } from "./math"; @@ -241,7 +241,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // clusters as its display face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); - const people = await persons(); + const people = await clusterGroups(); for (const person of people) { person.avatarFaceID = person.clusterIDs diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 294203142b..53a081910c 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -9,26 +9,41 @@ import type { LocalFaceIndex } from "./face"; /** * ML DB schema. * - * The "ML" database is made of three object stores: + * The "ML" database is made of the lower level "index" object stores, and + * higher level "cluster" object stores. * - * - "file-status": Contains {@link FileStatus} objects, one for each - * {@link EnteFile} that the ML subsystem knows about. Periodically (and when - * required), this is synced with the list of files that the current client - * knows about locally. + * The index related object stores are the following: * - * - "face-index": Contains {@link LocalFaceIndex} objects, either indexed - * locally or fetched from remote. + * - "file-status": Contains {@link FileStatus} objects, one for each + * {@link EnteFile} that the ML subsystem knows about. Periodically (and + * when required), this is synced with the list of files that the current + * client knows about locally. * - * - "clip-index": Contains {@link LocalCLIPIndex} objects, either indexed - * locally or fetched from remote. + * - "face-index": Contains {@link LocalFaceIndex} objects, either indexed + * locally or fetched from remote. * - * All the stores are keyed by {@link fileID}. The "file-status" contains + * - "clip-index": Contains {@link LocalCLIPIndex} objects, either indexed + * locally or fetched from remote. + * + * These three stores are keyed by {@link fileID}. The "file-status" contains * book-keeping about the indexing process (whether or not a file needs * indexing, or if there were errors doing so), while the other stores contain * the actual indexing results. * - * In tandem, these serve as the underlying storage for the functions exposed by - * the ML database. + * In tandem, these serve as the underlying storage for the indexes maintained + * in the ML database. + * + * The cluster related object stores are the following: + * + * - "face-cluster": Contains {@link FaceCluster} objects, one for each + * cluster of faces that either the clustering algorithm produced locally or + * were synced from remote. It is indexed by the (cluster) ID. + * + * - "cluster-group": Contains {@link CGroup} objects, one for each group of + * clusters that were synced from remote. The client can also locally + * generate cluster groups on certain user interactions, but these too will + * eventually get synced with remote. This object store is indexed by the + * (cgroup) ID. */ interface MLDBSchema extends DBSchema { "file-status": { @@ -48,7 +63,7 @@ interface MLDBSchema extends DBSchema { key: string; value: FaceCluster; }; - person: { + "cluster-group": { key: string; value: CGroup; }; @@ -111,7 +126,7 @@ const openMLDB = async () => { if (oldVersion < 3) { if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { db.createObjectStore("face-cluster", { keyPath: "id" }); - db.createObjectStore("person", { keyPath: "id" }); + db.createObjectStore("cluster-group", { keyPath: "id" }); } } }, @@ -419,11 +434,11 @@ export const faceClusters = async () => { }; /** - * Return all person entries (aka "people") present locally. + * Return all cluster group entries (aka "cgroups") present locally. */ -export const persons = async () => { +export const clusterGroups = async () => { const db = await mlDB(); - return db.getAll("person"); + return db.getAll("cluster-group"); }; /** @@ -464,37 +479,22 @@ export const applyPersonDiff = async (diff: (string | CGroup)[]) => { }; /** - * Add or overwrite the entry for the given {@link person}, as identified by + * Add or overwrite the entry for the given {@link cgroup}, as identified by * their {@link id}. */ // TODO-Cluster: Remove me -export const savePerson = async (person: CGroup) => { +export const saveClusterGroup = async (cgroup: CGroup) => { const db = await mlDB(); - const tx = db.transaction("person", "readwrite"); - await Promise.all([tx.store.put(person), tx.done]); + const tx = db.transaction("cluster-group", "readwrite"); + await Promise.all([tx.store.put(cgroup), tx.done]); }; /** - * Delete the entry for the persons with the given {@link id}, if any. + * Delete the entry (if any) for the cluster group with the given {@link id}. */ // TODO-Cluster: Remove me -export const deletePerson = async (id: string) => { +export const deleteClusterGroup = async (id: string) => { const db = await mlDB(); - const tx = db.transaction("person", "readwrite"); + const tx = db.transaction("cluster-group", "readwrite"); await Promise.all([tx.store.delete(id), tx.done]); }; - -/** - * Replace the persons stored locally with the given ones. - * - * This function deletes all entries from the person object store, and then - * inserts the given {@link persons} into it. - */ -// TODO-Cluster: Remove me -export const setPersons = async (persons: CGroup[]) => { - const db = await mlDB(); - const tx = db.transaction("person", "readwrite"); - await tx.store.clear(); - await Promise.all(persons.map((person) => tx.store.put(person))); - return tx.done; -}; From 2ae98148ae374d28a7de8c57a79fd0df23c97b29 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 15:19:43 +0530 Subject: [PATCH 0314/1179] Fin db --- web/packages/new/photos/services/ml/db.ts | 18 +++++++++--------- .../new/photos/services/user-entity.ts | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 53a081910c..7252483845 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -444,8 +444,8 @@ export const clusterGroups = async () => { /** * Replace the face clusters stored locally with the given ones. * - * This function deletes all entries from the person object store, and then - * inserts the given {@link clusters} into it. + * This function deletes all entries from the face cluster object store, and + * then inserts the given {@link clusters} into it. */ export const setFaceClusters = async (clusters: FaceCluster[]) => { const db = await mlDB(); @@ -456,19 +456,19 @@ export const setFaceClusters = async (clusters: FaceCluster[]) => { }; /** - * Update the person store to reflect the given changes, in order. + * Update the cluster group store to reflect the given changes. * * @param diff A list of changes to apply. Each entry is either * - * - A string, in which case the person with the given string as their ID - * should be deleted from the store, or + * - A string, in which case the cluster group with the given string as their + * ID should be deleted from the store, or * - * - A person, in which case it should add or overwrite the entry for the - * corresponding person (as identified by their {@link id}). + * - A cgroup, in which case it should add or overwrite the entry for the + * corresponding cluster group (as identified by its {@link id}). */ -export const applyPersonDiff = async (diff: (string | CGroup)[]) => { +export const applyCGroupDiff = async (diff: (string | CGroup)[]) => { const db = await mlDB(); - const tx = db.transaction("person", "readwrite"); + const tx = db.transaction("cluster-group", "readwrite"); // See: [Note: Diff response will have at most one entry for an id] await Promise.all( diff.map((d) => diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 5d12f975a3..81b451503e 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -8,7 +8,7 @@ import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip } from "./gzip"; import type { CGroup } from "./ml/cluster-new"; -import { applyPersonDiff } from "./ml/db"; +import { applyCGroupDiff } from "./ml/db"; /** * User entities are predefined lists of otherwise arbitrary data that the user @@ -344,7 +344,7 @@ export const syncPersons = async () => { const entities = await userEntityDiff(type, sinceTime, entityKeyB64); if (entities.length == 0) break; - await applyPersonDiff( + await applyCGroupDiff( await Promise.all( entities.map(async ({ id, data }) => data ? await parse(id, data) : id, From 3bc41f253b25c7bdb51bd9388b8592a0014d11c1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 15:22:02 +0530 Subject: [PATCH 0315/1179] Propagate --- .../new/photos/services/ml/cluster-new.ts | 10 +++++----- web/packages/new/photos/services/ml/index.ts | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 69e8de6f26..ff28b75260 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -241,10 +241,10 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // clusters as its display face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); - const people = await clusterGroups(); + const cgroups = await clusterGroups(); - for (const person of people) { - person.avatarFaceID = person.clusterIDs + for (const cgroup of cgroups) { + cgroup.avatarFaceID = cgroup.clusterIDs .map((clusterID) => clusterIndexForClusterID.get(clusterID)) .map((clusterIndex) => clusterIndex ? clusters[clusterIndex] : undefined, @@ -265,7 +265,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { validClusters, clusterIndexForClusterID, clusterIDForFaceID, - people, + cgroups, }, ]); log.debug( @@ -273,7 +273,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return { clusters: validClusters, people }; + return { clusters: validClusters, cgroups }; }; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 65a36c5981..670bc5cc58 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -347,7 +347,7 @@ export const wipCluster = async () => { if (last) return last; - const { clusters, people } = await clusterFaces(await faceIndexes()); + const { clusters, cgroups } = await clusterFaces(await faceIndexes()); const clusterByID = new Map( clusters.map((cluster) => [cluster.id, cluster]), ); @@ -356,31 +356,31 @@ export const wipCluster = async () => { const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); const result: SearchPerson[] = []; - for (const person of people) { - let avatarFaceID = person.avatarFaceID; + for (const cgroup of cgroups) { + let avatarFaceID = cgroup.avatarFaceID; // TODO-Cluster // Temp if (!avatarFaceID) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - avatarFaceID = person.clusterIDs + avatarFaceID = cgroup.clusterIDs .map((id) => clusterByID.get(id)) .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; } - person.clusterIDs; + cgroup.clusterIDs; const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); if (!avatarFaceFileID || !avatarFaceFile) { assertionFailed(`Face ID ${avatarFaceID} without local file`); continue; } - const files = person.clusterIDs + const files = cgroup.clusterIDs .map((id) => clusterByID.get(id)) .flatMap((cluster) => cluster?.faceIDs ?? []) .map((faceID) => fileIDFromFaceID(faceID)) .filter((fileID) => fileID !== undefined); result.push({ - id: person.id, - name: person.name, + id: cgroup.id, + name: cgroup.name, files, displayFaceID: avatarFaceID, displayFaceFile: avatarFaceFile, From ddf530f236817996ac554c642b1a0b237874eaf1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 15:27:52 +0530 Subject: [PATCH 0316/1179] sync --- web/apps/photos/src/services/searchService.ts | 4 +-- web/packages/new/photos/services/search.ts | 2 +- .../new/photos/services/user-entity.ts | 30 ++++++++++--------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index a2e6eee825..987a4cdacb 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -11,7 +11,7 @@ import { } from "@/new/photos/services/ml"; import { clusterGroups } from "@/new/photos/services/ml/db"; import type { SearchPerson } from "@/new/photos/services/search"; -import { syncPersons } from "@/new/photos/services/user-entity"; +import { syncCGroups } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; import * as chrono from "chrono-node"; import { t } from "i18next"; @@ -424,7 +424,7 @@ async function getAllPeople(limit: number = undefined) { done = true; if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { - await syncPersons(); + await syncCGroups(); const people = await clusterGroups(); log.debug(() => ["people", { people }]); } diff --git a/web/packages/new/photos/services/search.ts b/web/packages/new/photos/services/search.ts index de11843164..587485d571 100644 --- a/web/packages/new/photos/services/search.ts +++ b/web/packages/new/photos/services/search.ts @@ -1,7 +1,7 @@ import type { EnteFile } from "@/new/photos/types/file"; /** - * A massaged version of {@link Person} suitable for being shown in search + * A massaged version of {@link CGroup} suitable for being shown in search * results. */ export interface SearchPerson { diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 81b451503e..ee3e5edd8c 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -14,14 +14,16 @@ import { applyCGroupDiff } from "./ml/db"; * User entities are predefined lists of otherwise arbitrary data that the user * can store for their account. * - * e.g. location tags, people in their photos. + * e.g. location tags, cluster groups. */ export type EntityType = /** - * The latest iteration of the Person entity format, where the data is - * gzipped before encryption. + * A cluster group. + * + * Format: An encrypted string containing a gzipped JSON string representing + * the cgroup data. */ - "person_v2"; + "cgroup"; /** * The maximum number of items to fetch in a single diff @@ -315,19 +317,19 @@ const saveLatestUpdatedAt = (type: EntityType, value: number) => /** * Sync the {@link CGroup} entities that we have locally with remote. * - * This fetches all the user entities corresponding to the "person_v2" entity - * type from remote that have been created, updated or deleted since the last - * time we checked. + * This fetches all the user entities corresponding to the "cgroup" entity type + * from remote that have been created, updated or deleted since the last time we + * checked. * * This diff is then applied to the data we have persisted locally. */ -export const syncPersons = async () => { - const type: EntityType = "person_v2"; +export const syncCGroups = async () => { + const type: EntityType = "cgroup"; const entityKeyB64 = await getOrCreateEntityKeyB64(type); const parse = async (id: string, data: Uint8Array): Promise => { - const rp = RemotePerson.parse(JSON.parse(await gunzip(data))); + const rp = RemoteCGroup.parse(JSON.parse(await gunzip(data))); return { id, name: rp.name, @@ -360,8 +362,8 @@ export const syncPersons = async () => { } }; -/** Zod schema for the {@link RemotePerson} type. */ -const RemotePerson = z.object({ +/** Zod schema for the {@link RemoteCGroup} type. */ +const RemoteCGroup = z.object({ name: z.string().nullish().transform(nullToUndefined), assigned: z.array( z.object({ @@ -374,6 +376,6 @@ const RemotePerson = z.object({ }); /** - * A "person_v2" entity as synced via remote. + * Contents of a "cgroup" user entity, as synced via remote. */ -type RemotePerson = z.infer; +type RemoteCGroup = z.infer; From 5e67bf90c518ba129b47422740264addc657c03f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 10:20:19 +0530 Subject: [PATCH 0317/1179] Outline --- web/packages/base/crypto/libsodium.ts | 67 ++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index f8be7c147c..935374208d 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -114,7 +114,72 @@ export async function fromHex(input: string) { } /** - * Encrypt the given data using the given (base64 encoded) key. + * Encrypt the given data using the provided base64 encoded key. + * + * [Note: 3 forms of encryption] + * + * libsodium provides two "high level" encryption patterns: + * + * 1. Authenticated encryption ("secretbox") + * https://doc.libsodium.org/secret-key_cryptography/secretbox + * + * 2. Encrypted streams and file encryption ("secretstream") + * https://doc.libsodium.org/secret-key_cryptography/secretstream + * + * In terms of the underlying algorithm, they are essentially the same. + * + * 1. The secretbox APIs use XSalsa20 with Poly1305 (where XSalsa20 is the + * stream cipher used for encryption, which Poly1305 is the MAC used for + * authentication). + * + * 2. The secretstream APIs use XChaCha20 with Poly1305. + * + * XSalsa20 is a minor variant (predecessor in fact) of XChaCha20. I am not + * aware why libsodium uses both the variants, but they seem to have similar + * characteristics. + * + * These two sets of APIs map functionally map to two different use cases. + * + * 1. If there is a single independent bit of data to encrypt, the secretbox + * APIs fit the bill. + * + * 2. If there is a set of related data to encrypt, e.g. the contents of a file + * where the file is too big to fit into a single message, then the + * secretstream APIs are more appropriate. + * + * However, in our code we have evolved two different use cases for the 2nd + * option. + * + * Say we have an Ente object, specifically an {@link EnteFile}. This holds the + * encryption keys for encrypting the contents of the file that a user wishes to + * upload. The secretstream APIs are the obvious fit, and indeed that's what we + * use, chunking the file if the contents are bigger than some threshold. But if + * the file is small enough, there is no need to chunk, so we also expose a + * function that does streaming encryption, but in "one-shot" mode. + * + * Later on, say we have to encrypt the public magic metadata associated with + * the {@link EnteFile}. Instead of using the secretbox APIs, we just us the + * same streaming encryption that the rest of the file uses, but since such + * metadata is well below the threshold for chunking, it invariably uses the + * "one-shot" mode. + * + * Thus, we have three scenarios: + * + * 1. Box: Using secretbox APIs to encrypt some independent blob of data. + * + * 2. File: Using secretstream APIs in one-shot mode. This is used to encrypt + * data associated to an Ente object (file, collection, entity, etc), when + * the data is small-ish (less than a few MBs). + * + * 3. Stream/Chunks: Using secretstream APIs for encrypting chunks. This is + * used to encrypt the actual content of the files associated with an + * EnteFile object. + * + * "File" is not a term of art, it is just something we use to abbreviate + * "streaming encryption in one-shot mode". + */ +/** + * Encrypt the given file data using the given (base64 encoded) key. * * Use {@link decryptChaChaOneShot} to decrypt the result. * From 1a6ae93a7ac03db1c70d979d941a5e1e29530bc5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 10:34:15 +0530 Subject: [PATCH 0318/1179] More --- web/packages/base/crypto/libsodium.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 935374208d..95e05f66a5 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -177,7 +177,29 @@ export async function fromHex(input: string) { * * "File" is not a term of art, it is just something we use to abbreviate * "streaming encryption in one-shot mode". + * + * The distinction between Box and File is also handy since not only does the + * underlying algorithm differ, but also the terminology that libsodium use for + * the nonce. + * + * 1. When using the secretbox APIs, the nonce is called the "nonce", and needs + * to be provided by us (the caller). + * + * 2. When using the secretstream APIs, the nonce is internally generated by + * libsodium and provided by libsodium to us (the caller) as a "header". + * + * However, even for case 1, the functions we expose from libsodium.ts generate + * the nonce for the caller. So for higher level functions, the difference + * between Box and File encryption is: + * + * 1. Box uses Salsa, File uses ChaCha. + * + * 2. While both are one-shot, File should generally be used for data + * associated with an Ente object, and Box for the other cases. + * + * 3. Box returns a "nonce", while File returns a "header". */ + /** * Encrypt the given file data using the given (base64 encoded) key. * From f37220bf2087c19213a9af35f7ee617438db0374 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 10:49:44 +0530 Subject: [PATCH 0319/1179] Terminology --- web/packages/base/crypto/types.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index edd2db3241..245755c29d 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -14,6 +14,8 @@ export interface EncryptBytes { /** * An encryption request with the plaintext data as a JSON value. + * + * This is a variant of {@link EncryptBytes}. */ export interface EncryptJSON { /** @@ -35,8 +37,10 @@ export interface EncryptJSON { * The encrypted data (bytes) and decryption header pair (base64 encoded * string). Both these values are needed to decrypt the data. The header does * not need to be secret. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ -export interface EncryptedBytes { +export interface EncryptedBlobBytes { /** * A {@link Uint8Array} containing the encrypted data. */ @@ -53,8 +57,10 @@ export interface EncryptedBytes { /** * The result of encryption using the stream APIs used in one-shot mode, with * the encrypted data encoded as a base64 string. + * + * This is a variant of {@link EncryptedBlobBytes}. */ -export interface EncryptedB64 { +export interface EncryptedBlobB64 { /** * A base64 string containing the encrypted data. */ @@ -69,9 +75,12 @@ export interface EncryptedB64 { } /** - * A decryption request with the encrypted data as bytes. + * A decryption request with the encrypted Blob's data as bytes. + * + * This is a request to decrypt data that was encrypted using the stream APIs in + * one-shot mode. See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ -export interface DecryptBytes { +export interface DecryptBlobBytes { /** * A {@link Uint8Array} containing the bytes to decrypt. */ @@ -91,9 +100,12 @@ export interface DecryptBytes { } /** - * A decryption request with the encrypted data as a base64 encoded string. + * A decryption request with the encrypted Blob's data as a base64 encoded + * string. + * + * This is a variant of {@link DecryptBlobBytes}. */ -export interface DecryptB64 { +export interface DecryptBlobB64 { /** * A base64 string containing the data to decrypt. */ From 7e03462891b9fe269f0037628310ec8e27637254 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:12:21 +0530 Subject: [PATCH 0320/1179] Terminology --- web/packages/base/crypto/ente-impl.ts | 20 +++++------ web/packages/base/crypto/ente.ts | 16 ++++----- web/packages/base/crypto/libsodium.ts | 52 +++++++++------------------ 3 files changed, 34 insertions(+), 54 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 6339a306ae..2b65831fb9 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,27 +1,27 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; import type { - DecryptB64, + DecryptBlobB64, EncryptBytes, - EncryptedB64, - EncryptedBytes, + EncryptedBlobB64, + EncryptedBlobBytes, EncryptJSON, } from "./types"; -const EncryptedBytesToB64 = async ({ +const EncryptedBlobBytesToB64 = async ({ encryptedData, decryptionHeaderB64, -}: EncryptedBytes): Promise => ({ +}: EncryptedBlobBytes): Promise => ({ encryptedDataB64: await libsodium.toB64(encryptedData), decryptionHeaderB64, }); -export const _encryptAssociatedData = libsodium.encryptChaChaOneShot; +export const _encryptAssociatedData = libsodium.encryptBlob; export const _encryptThumbnail = _encryptAssociatedData; export const _encryptAssociatedB64Data = (r: EncryptBytes) => - _encryptAssociatedData(r).then(EncryptedBytesToB64); + _encryptAssociatedData(r).then(EncryptedBlobBytesToB64); export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => _encryptAssociatedB64Data({ @@ -29,7 +29,7 @@ export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => keyB64, }); -export const _decryptAssociatedData = libsodium.decryptChaChaOneShot; +export const _decryptAssociatedData = libsodium.decryptBlob; export const _decryptThumbnail = _decryptAssociatedData; @@ -37,14 +37,14 @@ export const _decryptAssociatedB64Data = async ({ encryptedDataB64, decryptionHeaderB64, keyB64, -}: DecryptB64) => +}: DecryptBlobB64) => await _decryptAssociatedData({ encryptedData: await libsodium.fromB64(encryptedDataB64), decryptionHeaderB64, keyB64, }); -export const _decryptMetadataJSON = async (r: DecryptB64) => +export const _decryptMetadataJSON = async (r: DecryptBlobB64) => JSON.parse( new TextDecoder().decode(await _decryptAssociatedB64Data(r)), ) as unknown; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index b5e7fa0c1e..18035ed85f 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -52,8 +52,8 @@ import { assertionFailed } from "../assert"; import { inWorker } from "../env"; import * as ei from "./ente-impl"; import type { - DecryptB64, - DecryptBytes, + DecryptBlobB64, + DecryptBlobBytes, EncryptBytes, EncryptJSON, } from "./types"; @@ -77,7 +77,7 @@ const assertInWorker = (x: T): T => { * * Use {@link decryptAssociatedData} to decrypt the result. * - * See {@link encryptChaChaOneShot} for the implementation details. + * See {@link encryptBlob} for the implementation details. */ export const encryptAssociatedData = (r: EncryptBytes) => assertInWorker(ei._encryptAssociatedData(r)); @@ -127,9 +127,9 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => * * This is the sibling of {@link encryptAssociatedData}. * - * See {@link decryptChaChaOneShot} for the implementation details. + * See {@link decryptBlob} for the implementation details. */ -export const decryptAssociatedData = (r: DecryptBytes) => +export const decryptAssociatedData = (r: DecryptBlobBytes) => assertInWorker(ei._decryptAssociatedData(r)); /** @@ -137,7 +137,7 @@ export const decryptAssociatedData = (r: DecryptBytes) => * * This is the sibling of {@link encryptThumbnail}. */ -export const decryptThumbnail = (r: DecryptBytes) => +export const decryptThumbnail = (r: DecryptBlobBytes) => assertInWorker(ei._decryptThumbnail(r)); /** @@ -146,7 +146,7 @@ export const decryptThumbnail = (r: DecryptBytes) => * * This is the sibling of {@link decryptAssociatedB64Data}. */ -export const decryptAssociatedB64Data = (r: DecryptB64) => +export const decryptAssociatedB64Data = (r: DecryptBlobB64) => inWorker() ? ei._decryptAssociatedB64Data(r) : sharedCryptoWorker().then((w) => w.decryptAssociatedB64Data(r)); @@ -158,7 +158,7 @@ export const decryptAssociatedB64Data = (r: DecryptB64) => * @returns The decrypted JSON value. Since TypeScript does not have a native * JSON type, we need to return it as an `unknown`. */ -export const decryptMetadataJSON = (r: DecryptB64) => +export const decryptMetadataJSON = (r: DecryptBlobB64) => inWorker() ? ei._decryptMetadataJSON(r) : sharedCryptoWorker().then((w) => w.decryptMetadataJSON(r)); diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 95e05f66a5..2c8403a2ec 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -11,7 +11,11 @@ import { mergeUint8Arrays } from "@/utils/array"; import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; -import type { DecryptBytes, EncryptBytes, EncryptedBytes } from "./types"; +import type { + DecryptBlobBytes, + EncryptBytes, + EncryptedBlobBytes, +} from "./types"; /** * Convert bytes ({@link Uint8Array}) to a base64 string. @@ -116,7 +120,7 @@ export async function fromHex(input: string) { /** * Encrypt the given data using the provided base64 encoded key. * - * [Note: 3 forms of encryption] + * [Note: 3 forms of encryption (Box | Blob | Stream)] * * libsodium provides two "high level" encryption patterns: * @@ -201,38 +205,14 @@ export async function fromHex(input: string) { */ /** - * Encrypt the given file data using the given (base64 encoded) key. + * Encrypt the given data using stream APIs in one-shot mode, using the given + * base64 encoded key. * - * Use {@link decryptChaChaOneShot} to decrypt the result. + * Use {@link decryptBlob} to decrypt the result. * - * [Note: Salsa and ChaCha] + * - See: [Note: 3 forms of encryption (Box | Blob | Stream)]. * - * This uses the same stream encryption algorithm (XChaCha20 stream cipher with - * Poly1305 MAC authentication) that we use for encrypting other streams, in - * particular the actual file's contents. - * - * The difference here is that this function does a one shot instead of a - * streaming encryption. This is only meant to be used for relatively small - * amounts of data (few MBs). - * - * See: https://doc.libsodium.org/secret-key_cryptography/secretstream - * - * Libsodium also provides the `crypto_secretbox_easy` APIs for one shot - * encryption, which we do use in other places where we need to one shot - * encryption of independent bits of data. - * - * These secretbox APIs use XSalsa20 with Poly1305. XSalsa20 is a minor variant - * (predecessor in fact) of XChaCha20. - * - * See: https://doc.libsodium.org/secret-key_cryptography/secretbox - * - * The difference to those is that this function is meant to used for data - * associated with a file (or some other Ente object, like a collection or an - * entity). There is no technical reason to do it that way, just this way all - * data associated with a file, including its actual contents, use the same - * underlying (streaming) libsodium APIs. In other cases, where we have free - * standing independent data, we continue using the secretbox APIs for one shot - * encryption and decryption. + * - See: https://doc.libsodium.org/secret-key_cryptography/secretstream * * @param data A {@link Uint8Array} containing the bytes that we want to * encrypt. @@ -243,10 +223,10 @@ export async function fromHex(input: string) { * encoded string). Both these values are needed to decrypt the data. The header * does not need to be secret. */ -export const encryptChaChaOneShot = async ({ +export const encryptBlob = async ({ data, keyB64, -}: EncryptBytes): Promise => { +}: EncryptBytes): Promise => { await sodium.ready; const uintkey: Uint8Array = await fromB64(keyB64); @@ -341,13 +321,13 @@ export async function encryptFileChunk( } /** - * Decrypt the result of {@link encryptChaChaOneShot}. + * Decrypt the result of {@link encryptBlob}. */ -export const decryptChaChaOneShot = async ({ +export const decryptBlob = async ({ encryptedData, decryptionHeaderB64, keyB64, -}: DecryptBytes): Promise => { +}: DecryptBlobBytes): Promise => { await sodium.ready; const pullState = sodium.crypto_secretstream_xchacha20poly1305_init_pull( await fromB64(decryptionHeaderB64), From cbb36214a37059fd043a2dafd699458aa3c907cd Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:15:07 +0530 Subject: [PATCH 0321/1179] New terms --- web/packages/base/crypto/libsodium.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 2c8403a2ec..fce8a0e182 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -341,6 +341,7 @@ export const decryptBlob = async ({ return pullResult.message; }; +/** Decrypt Stream, but merge the results. */ export const decryptChaCha = async ( data: Uint8Array, header: Uint8Array, @@ -418,7 +419,7 @@ export interface B64EncryptionResult { export async function encryptToB64(data: string, key: string) { await sodium.ready; - const encrypted = await encrypt(await fromB64(data), await fromB64(key)); + const encrypted = await encryptBox(await fromB64(data), await fromB64(key)); return { encryptedData: await toB64(encrypted.encryptedData), @@ -440,7 +441,7 @@ export async function encryptUTF8(data: string, key: string) { export async function decryptB64(data: string, nonce: string, key: string) { await sodium.ready; - const decrypted = await decrypt( + const decrypted = await decryptBox( await fromB64(data), await fromB64(nonce), await fromB64(key), @@ -451,7 +452,7 @@ export async function decryptB64(data: string, nonce: string, key: string) { export async function decryptToUTF8(data: string, nonce: string, key: string) { await sodium.ready; - const decrypted = await decrypt( + const decrypted = await decryptBox( await fromB64(data), await fromB64(nonce), await fromB64(key), @@ -460,7 +461,7 @@ export async function decryptToUTF8(data: string, nonce: string, key: string) { return sodium.to_string(decrypted); } -async function encrypt(data: Uint8Array, key: Uint8Array) { +async function encryptBox(data: Uint8Array, key: Uint8Array) { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy(data, nonce, key); @@ -471,7 +472,11 @@ async function encrypt(data: Uint8Array, key: Uint8Array) { }; } -async function decrypt(data: Uint8Array, nonce: Uint8Array, key: Uint8Array) { +async function decryptBox( + data: Uint8Array, + nonce: Uint8Array, + key: Uint8Array, +) { await sodium.ready; return sodium.crypto_secretbox_open_easy(data, nonce, key); } From 4fda7c3c86b4e91fbaa6e09f82379b1767afcf3b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:15:25 +0530 Subject: [PATCH 0322/1179] Move --- web/packages/base/crypto/libsodium.ts | 39 +++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index fce8a0e182..774d684056 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -203,6 +203,25 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while File returns a "header". */ +async function encryptBox(data: Uint8Array, key: Uint8Array) { + await sodium.ready; + const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); + const encryptedData = sodium.crypto_secretbox_easy(data, nonce, key); + return { + encryptedData, + key, + nonce, + }; +} + +async function decryptBox( + data: Uint8Array, + nonce: Uint8Array, + key: Uint8Array, +) { + await sodium.ready; + return sodium.crypto_secretbox_open_easy(data, nonce, key); +} /** * Encrypt the given data using stream APIs in one-shot mode, using the given @@ -461,26 +480,6 @@ export async function decryptToUTF8(data: string, nonce: string, key: string) { return sodium.to_string(decrypted); } -async function encryptBox(data: Uint8Array, key: Uint8Array) { - await sodium.ready; - const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); - const encryptedData = sodium.crypto_secretbox_easy(data, nonce, key); - return { - encryptedData, - key, - nonce, - }; -} - -async function decryptBox( - data: Uint8Array, - nonce: Uint8Array, - key: Uint8Array, -) { - await sodium.ready; - return sodium.crypto_secretbox_open_easy(data, nonce, key); -} - export async function initChunkHashing() { await sodium.ready; const hashState = sodium.crypto_generichash_init( From ed6dc3ca6cf57c558cee4af6515a89348a3c3b44 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:16:51 +0530 Subject: [PATCH 0323/1179] Tweak --- web/packages/base/crypto/libsodium.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 774d684056..80242a7e7c 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -203,7 +203,7 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while File returns a "header". */ -async function encryptBox(data: Uint8Array, key: Uint8Array) { +const encryptBox = async (data: Uint8Array, key: Uint8Array) => { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy(data, nonce, key); @@ -212,16 +212,7 @@ async function encryptBox(data: Uint8Array, key: Uint8Array) { key, nonce, }; -} - -async function decryptBox( - data: Uint8Array, - nonce: Uint8Array, - key: Uint8Array, -) { - await sodium.ready; - return sodium.crypto_secretbox_open_easy(data, nonce, key); -} +}; /** * Encrypt the given data using stream APIs in one-shot mode, using the given @@ -339,6 +330,18 @@ export async function encryptFileChunk( return pushResult; } +/** + * Decrypt the result of {@link encryptBox}. + */ +const decryptBox = async ( + data: Uint8Array, + nonce: Uint8Array, + key: Uint8Array, +) => { + await sodium.ready; + return sodium.crypto_secretbox_open_easy(data, nonce, key); +}; + /** * Decrypt the result of {@link encryptBlob}. */ From 797dcc4a1eb7c66a10edd4262244a3dd81904fea Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:43:15 +0530 Subject: [PATCH 0324/1179] Streamline --- web/packages/base/crypto/libsodium.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 80242a7e7c..a8fb1df1d9 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -203,13 +203,16 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while File returns a "header". */ -const encryptBox = async (data: Uint8Array, key: Uint8Array) => { +const encryptBox = async (data: Uint8Array, keyB64: string) => { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); - const encryptedData = sodium.crypto_secretbox_easy(data, nonce, key); + const encryptedData = sodium.crypto_secretbox_easy( + data, + nonce, + await fromB64(keyB64), + ); return { encryptedData, - key, nonce, }; }; @@ -439,13 +442,13 @@ export interface B64EncryptionResult { nonce: string; } -export async function encryptToB64(data: string, key: string) { +export async function encryptToB64(data: string, keyB64: string) { await sodium.ready; - const encrypted = await encryptBox(await fromB64(data), await fromB64(key)); + const encrypted = await encryptBox(await fromB64(data), keyB64); return { encryptedData: await toB64(encrypted.encryptedData), - key: await toB64(encrypted.key), + key: keyB64, nonce: await toB64(encrypted.nonce), } as B64EncryptionResult; } From 54efdd10728b18dbf80bbb4d33adb195b3170823 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 11:45:41 +0530 Subject: [PATCH 0325/1179] Use existing primitive --- web/packages/base/crypto/libsodium.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index a8fb1df1d9..fb896c822f 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -203,7 +203,7 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while File returns a "header". */ -const encryptBox = async (data: Uint8Array, keyB64: string) => { +const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy( @@ -444,7 +444,7 @@ export interface B64EncryptionResult { export async function encryptToB64(data: string, keyB64: string) { await sodium.ready; - const encrypted = await encryptBox(await fromB64(data), keyB64); + const encrypted = await encryptBox({ data: await fromB64(data), keyB64 }); return { encryptedData: await toB64(encrypted.encryptedData), From 94a40838a382f2d5c10721cfa02198b13c4377d7 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 13:24:32 +0530 Subject: [PATCH 0326/1179] Box variant --- web/packages/base/crypto/libsodium.ts | 4 +-- web/packages/base/crypto/types.ts | 37 ++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index fb896c822f..d7145370a1 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -218,8 +218,8 @@ const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { }; /** - * Encrypt the given data using stream APIs in one-shot mode, using the given - * base64 encoded key. + * Encrypt the given data using secretstream APIs in one-shot mode, using the + * given base64 encoded key. * * Use {@link decryptBlob} to decrypt the result. * diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 245755c29d..bafff0165a 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -32,11 +32,34 @@ export interface EncryptJSON { } /** - * The result of encryption using the stream APIs used in one-shot mode. + * The result of encryption using the secretbox APIs. * - * The encrypted data (bytes) and decryption header pair (base64 encoded - * string). Both these values are needed to decrypt the data. The header does - * not need to be secret. + * It contains the encrypted data (bytes) and nonce (base64 encoded string) + * pair. Both these values are needed to decrypt the data. The nonce does not + * need to be secret. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + */ +export interface EncryptedBoxBytes { + /** + * A {@link Uint8Array} containing the encrypted data. + */ + encryptedData: Uint8Array; + /** + * A base64 string containing the nonce used during encryption. + * + * A randomly generated nonce for this encryption. It does not need to be + * confidential, but it will be required to decrypt the data. + */ + nonceB64: string; +} + +/** + * The result of encryption using the secretstream APIs used in one-shot mode. + * + * It contains the encrypted data (bytes) and decryption header (base64 encoded + * string) pair. Both these values are needed to decrypt the data. The header + * does not need to be secret. * * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ @@ -55,8 +78,8 @@ export interface EncryptedBlobBytes { } /** - * The result of encryption using the stream APIs used in one-shot mode, with - * the encrypted data encoded as a base64 string. + * The result of encryption using the secretstream APIs used in one-shot mode, + * with the encrypted data encoded as a base64 string. * * This is a variant of {@link EncryptedBlobBytes}. */ @@ -77,7 +100,7 @@ export interface EncryptedBlobB64 { /** * A decryption request with the encrypted Blob's data as bytes. * - * This is a request to decrypt data that was encrypted using the stream APIs in + * This is a request to decrypt data encrypted using the secretstream APIs in * one-shot mode. See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ export interface DecryptBlobBytes { From fcad2157bc0c5c3cc97e347d7456d5ee58f85f24 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 15:53:16 +0530 Subject: [PATCH 0327/1179] Update --- web/packages/base/crypto/libsodium.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index d7145370a1..6dd492ce5b 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -171,7 +171,7 @@ export async function fromHex(input: string) { * * 1. Box: Using secretbox APIs to encrypt some independent blob of data. * - * 2. File: Using secretstream APIs in one-shot mode. This is used to encrypt + * 2. Blob: Using secretstream APIs in one-shot mode. This is used to encrypt * data associated to an Ente object (file, collection, entity, etc), when * the data is small-ish (less than a few MBs). * @@ -179,10 +179,10 @@ export async function fromHex(input: string) { * used to encrypt the actual content of the files associated with an * EnteFile object. * - * "File" is not a term of art, it is just something we use to abbreviate - * "streaming encryption in one-shot mode". + * "Blob" is not a prior term of art in this context, it is just something we + * use to abbreviate "data encrypted using secretstream APIs in one-shot mode". * - * The distinction between Box and File is also handy since not only does the + * The distinction between Box and Blob is also handy since not only does the * underlying algorithm differ, but also the terminology that libsodium use for * the nonce. * @@ -194,14 +194,14 @@ export async function fromHex(input: string) { * * However, even for case 1, the functions we expose from libsodium.ts generate * the nonce for the caller. So for higher level functions, the difference - * between Box and File encryption is: + * between Box and Blob encryption is: * - * 1. Box uses Salsa, File uses ChaCha. + * 1. Box uses secretbox APIs (Salsa), Blob uses secretstream APIs (ChaCha). * - * 2. While both are one-shot, File should generally be used for data + * 2. While both are one-shot, Blob should generally be used for data * associated with an Ente object, and Box for the other cases. * - * 3. Box returns a "nonce", while File returns a "header". + * 3. Box returns a "nonce", while Blob returns a "header". */ const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { await sodium.ready; From 0de05fdc36a134076142cd8bdf48a6de3e01b5f2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:00:04 +0530 Subject: [PATCH 0328/1179] Remove duplication --- web/packages/base/crypto/libsodium.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 6dd492ce5b..033d017914 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -223,18 +223,9 @@ const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { * * Use {@link decryptBlob} to decrypt the result. * - * - See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. * - * - See: https://doc.libsodium.org/secret-key_cryptography/secretstream - * - * @param data A {@link Uint8Array} containing the bytes that we want to - * encrypt. - * - * @param keyB64 A base64 string containing the encryption key. - * - * @returns The encrypted data (bytes) and decryption header pair (base64 - * encoded string). Both these values are needed to decrypt the data. The header - * does not need to be secret. + * See: https://doc.libsodium.org/secret-key_cryptography/secretstream */ export const encryptBlob = async ({ data, From 2e0ad673cf9a335500f6fd9e98bff83f4d34d311 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:03:13 +0530 Subject: [PATCH 0329/1179] B64 variant --- web/packages/base/crypto/types.ts | 34 +++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index bafff0165a..d6d46fb8d6 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -54,6 +54,24 @@ export interface EncryptedBoxBytes { nonceB64: string; } +/** + * A variant of {@link EncryptedBoxBytes} with the encrypted data encoded as a + * base64 string. + */ +export interface EncryptedBox64 { + /** + * A base64 string containing the encrypted data. + */ + encryptedDataB64: string; + /** + * A base64 string containing the nonce used during encryption. + * + * A randomly generated nonce for this encryption. It does not need to be + * confidential, but it will be required to decrypt the data. + */ + nonceB64: string; +} + /** * The result of encryption using the secretstream APIs used in one-shot mode. * @@ -78,10 +96,8 @@ export interface EncryptedBlobBytes { } /** - * The result of encryption using the secretstream APIs used in one-shot mode, - * with the encrypted data encoded as a base64 string. - * - * This is a variant of {@link EncryptedBlobBytes}. + * A variant of {@link EncryptedBlobBytes} with the encrypted data encoded as a + * base64 string. */ export interface EncryptedBlobB64 { /** @@ -101,7 +117,9 @@ export interface EncryptedBlobB64 { * A decryption request with the encrypted Blob's data as bytes. * * This is a request to decrypt data encrypted using the secretstream APIs in - * one-shot mode. See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + * one-shot mode. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ export interface DecryptBlobBytes { /** @@ -123,10 +141,8 @@ export interface DecryptBlobBytes { } /** - * A decryption request with the encrypted Blob's data as a base64 encoded - * string. - * - * This is a variant of {@link DecryptBlobBytes}. + * A variant of {@link DecryptBlobBytes} with the encrypted Blob's data as a + * base64 encoded string. */ export interface DecryptBlobB64 { /** From 3b0ec7ce714284abb73c626f1e3bc4a500e58e97 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:06:15 +0530 Subject: [PATCH 0330/1179] Use --- web/packages/base/crypto/libsodium.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 033d017914..b5c1a1a63f 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -15,6 +15,7 @@ import type { DecryptBlobBytes, EncryptBytes, EncryptedBlobBytes, + EncryptedBoxBytes, } from "./types"; /** @@ -203,7 +204,10 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while Blob returns a "header". */ -const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { +const encryptBox = async ({ + data, + keyB64, +}: EncryptBytes): Promise => { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy( @@ -211,10 +215,7 @@ const encryptBox = async ({ data, keyB64 }: EncryptBytes) => { nonce, await fromB64(keyB64), ); - return { - encryptedData, - nonce, - }; + return { encryptedData, nonceB64: await toB64(nonce) }; }; /** @@ -440,7 +441,7 @@ export async function encryptToB64(data: string, keyB64: string) { return { encryptedData: await toB64(encrypted.encryptedData), key: keyB64, - nonce: await toB64(encrypted.nonce), + nonce: encrypted.nonceB64, } as B64EncryptionResult; } From 38d39c123dea11d333b583534f8530c4abe40c24 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:21:48 +0530 Subject: [PATCH 0331/1179] Dec types --- web/packages/base/crypto/types.ts | 50 +++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index d6d46fb8d6..5f579fe262 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -114,10 +114,54 @@ export interface EncryptedBlobB64 { } /** - * A decryption request with the encrypted Blob's data as bytes. + * A decryption request to decrypt data encrypted using the secretbox APIs. The + * encrypted Box's data is provided as bytes. * - * This is a request to decrypt data encrypted using the secretstream APIs in - * one-shot mode. + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + */ +export interface DecryptBoxBytes { + /** + * A {@link Uint8Array} containing the bytes to decrypt. + */ + encryptedData: Uint8Array; + /** + * A base64 string containing the nonce that was used during encryption. + * + * The nonce is required to decrypt the data, but it does not need to be + * kept secret. + */ + nonceB64: string; + /** + * A base64 string containing the encryption key. + */ + keyB64: string; +} + +/** + * A variant of {@link DecryptBoxBytes} with the encrypted Blob's data as a + * base64 encoded string. + */ +export interface DecryptBoxB64 { + /** + * A base64 string containing the data to decrypt. + */ + encryptedDataB64: string; + /** + * A base64 string containing the nonce that was used during encryption. + * + * The nonce is required to decrypt the data, but it does not need to be + * kept secret. + */ + nonceB64: string; + /** + * A base64 string containing the encryption key. + */ + keyB64: string; +} + +/** + * A decryption request to decrypt data encrypted using the secretstream APIs in + * one-shot mode. The encrypted Blob's data is provided as bytes. * * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ From 763d9727e632afdcc474d94874b5f71132370ff3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:26:44 +0530 Subject: [PATCH 0332/1179] Dec --- web/packages/base/crypto/libsodium.ts | 51 +++++++++++++++++---------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index b5c1a1a63f..84d68d5747 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -13,6 +13,7 @@ import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { DecryptBlobBytes, + DecryptBoxBytes, EncryptBytes, EncryptedBlobBytes, EncryptedBoxBytes, @@ -328,13 +329,17 @@ export async function encryptFileChunk( /** * Decrypt the result of {@link encryptBox}. */ -const decryptBox = async ( - data: Uint8Array, - nonce: Uint8Array, - key: Uint8Array, -) => { +const decryptBox = async ({ + encryptedData, + nonceB64, + keyB64, +}: DecryptBoxBytes): Promise => { await sodium.ready; - return sodium.crypto_secretbox_open_easy(data, nonce, key); + return sodium.crypto_secretbox_open_easy( + encryptedData, + await fromB64(nonceB64), + await fromB64(keyB64), + ); }; /** @@ -456,24 +461,34 @@ export async function encryptUTF8(data: string, key: string) { return await encryptToB64(b64Data, key); } -export async function decryptB64(data: string, nonce: string, key: string) { +/** Deprecated */ +export async function decryptB64( + data: string, + nonceB64: string, + keyB64: string, +) { await sodium.ready; - const decrypted = await decryptBox( - await fromB64(data), - await fromB64(nonce), - await fromB64(key), - ); + const decrypted = await decryptBox({ + encryptedData: await fromB64(data), + nonceB64, + keyB64, + }); return await toB64(decrypted); } -export async function decryptToUTF8(data: string, nonce: string, key: string) { +/** Deprecated */ +export async function decryptToUTF8( + data: string, + nonceB64: string, + keyB64: string, +) { await sodium.ready; - const decrypted = await decryptBox( - await fromB64(data), - await fromB64(nonce), - await fromB64(key), - ); + const decrypted = await decryptBox({ + encryptedData: await fromB64(data), + nonceB64, + keyB64, + }); return sodium.to_string(decrypted); } From 44bdb016a8ab6bc2f828cdb04a1b8fb4819d7a89 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:33:27 +0530 Subject: [PATCH 0333/1179] Swap --- web/packages/base/crypto/ente-impl.ts | 8 ++++---- web/packages/base/crypto/ente.ts | 14 +++++++------- web/packages/base/crypto/worker.ts | 2 +- web/packages/new/photos/services/file-data.ts | 4 ++-- web/packages/new/photos/services/ml/ml-data.ts | 4 ++-- web/packages/new/photos/services/user-entity.ts | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 2b65831fb9..1c6e07e962 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -20,11 +20,11 @@ export const _encryptAssociatedData = libsodium.encryptBlob; export const _encryptThumbnail = _encryptAssociatedData; -export const _encryptAssociatedB64Data = (r: EncryptBytes) => +export const _encryptAssociatedDataB64 = (r: EncryptBytes) => _encryptAssociatedData(r).then(EncryptedBlobBytesToB64); export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => - _encryptAssociatedB64Data({ + _encryptAssociatedDataB64({ data: new TextEncoder().encode(JSON.stringify(jsonValue)), keyB64, }); @@ -33,7 +33,7 @@ export const _decryptAssociatedData = libsodium.decryptBlob; export const _decryptThumbnail = _decryptAssociatedData; -export const _decryptAssociatedB64Data = async ({ +export const _decryptAssociatedDataB64 = async ({ encryptedDataB64, decryptionHeaderB64, keyB64, @@ -46,5 +46,5 @@ export const _decryptAssociatedB64Data = async ({ export const _decryptMetadataJSON = async (r: DecryptBlobB64) => JSON.parse( - new TextDecoder().decode(await _decryptAssociatedB64Data(r)), + new TextDecoder().decode(await _decryptAssociatedDataB64(r)), ) as unknown; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 18035ed85f..8fe3aaad08 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -96,10 +96,10 @@ export const encryptThumbnail = (r: EncryptBytes) => * A variant of {@link encryptAssociatedData} that returns the encrypted data as * a base64 string instead of returning its bytes. * - * Use {@link decryptAssociatedB64Data} to decrypt the result. + * Use {@link decryptAssociatedDataB64} to decrypt the result. */ -export const encryptAssociatedB64Data = (r: EncryptBytes) => - assertInWorker(ei._encryptAssociatedB64Data(r)); +export const encryptAssociatedDataB64 = (r: EncryptBytes) => + assertInWorker(ei._encryptAssociatedDataB64(r)); /** * Encrypt the JSON metadata associated with an Ente object (file, collection or @@ -144,12 +144,12 @@ export const decryptThumbnail = (r: DecryptBlobBytes) => * A variant of {@link decryptAssociatedData} that expects the encrypted data as * a base64 encoded string. * - * This is the sibling of {@link decryptAssociatedB64Data}. + * This is the sibling of {@link encryptAssociatedDataB64}. */ -export const decryptAssociatedB64Data = (r: DecryptBlobB64) => +export const decryptAssociatedDataB64 = (r: DecryptBlobB64) => inWorker() - ? ei._decryptAssociatedB64Data(r) - : sharedCryptoWorker().then((w) => w.decryptAssociatedB64Data(r)); + ? ei._decryptAssociatedDataB64(r) + : sharedCryptoWorker().then((w) => w.decryptAssociatedDataB64(r)); /** * Decrypt the metadata JSON associated with an Ente object. * diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index c4a1dc1b62..c6aae70a2b 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -15,7 +15,7 @@ export class CryptoWorker { encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; decryptThumbnail = ei._decryptThumbnail; - decryptAssociatedB64Data = ei._decryptAssociatedB64Data; + decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; decryptMetadataJSON = ei._decryptMetadataJSON; // TODO: -- AUDIT BELOW -- diff --git a/web/packages/new/photos/services/file-data.ts b/web/packages/new/photos/services/file-data.ts index 8fd35da830..0b3f1ef0b8 100644 --- a/web/packages/new/photos/services/file-data.ts +++ b/web/packages/new/photos/services/file-data.ts @@ -1,4 +1,4 @@ -import { encryptAssociatedB64Data } from "@/base/crypto/ente"; +import { encryptAssociatedDataB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import type { EnteFile } from "@/new/photos/types/file"; @@ -95,7 +95,7 @@ export const putFileData = async ( data: Uint8Array, ) => { const { encryptedDataB64, decryptionHeaderB64 } = - await encryptAssociatedB64Data({ data: data, keyB64: enteFile.key }); + await encryptAssociatedDataB64({ data: data, keyB64: enteFile.key }); const res = await fetch(await apiURL("/files/data"), { method: "PUT", diff --git a/web/packages/new/photos/services/ml/ml-data.ts b/web/packages/new/photos/services/ml/ml-data.ts index 2d99f215d5..4c82ef426f 100644 --- a/web/packages/new/photos/services/ml/ml-data.ts +++ b/web/packages/new/photos/services/ml/ml-data.ts @@ -1,4 +1,4 @@ -import { decryptAssociatedB64Data } from "@/base/crypto/ente"; +import { decryptAssociatedDataB64 } from "@/base/crypto/ente"; import log from "@/base/log"; import type { EnteFile } from "@/new/photos/types/file"; import { nullToUndefined } from "@/utils/transform"; @@ -172,7 +172,7 @@ export const fetchMLData = async ( } try { - const decryptedBytes = await decryptAssociatedB64Data({ + const decryptedBytes = await decryptAssociatedDataB64({ encryptedDataB64: remoteFileData.encryptedData, decryptionHeaderB64: remoteFileData.decryptionHeader, keyB64: file.key, diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index ee3e5edd8c..67f92c77a8 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,5 +1,5 @@ import { sharedCryptoWorker } from "@/base/crypto"; -import { decryptAssociatedB64Data } from "@/base/crypto/ente"; +import { decryptAssociatedDataB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; @@ -150,7 +150,7 @@ export const userEntityDiff = async ( }); const decrypt = (encryptedDataB64: string, decryptionHeaderB64: string) => - decryptAssociatedB64Data({ + decryptAssociatedDataB64({ encryptedDataB64, decryptionHeaderB64, keyB64: entityKeyB64, From 5d59b7d43d85cfcfb19dd68ceb029eaa925e304a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:44:16 +0530 Subject: [PATCH 0334/1179] [mob] Show percentage for ML model download --- mobile/lib/ui/settings/machine_learning_settings_page.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 910f4da683..4a7f8fbd02 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -20,7 +20,6 @@ import "package:photos/ui/components/menu_section_title.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; -import "package:photos/utils/data_util.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/wakelock_util.dart"; @@ -224,9 +223,7 @@ class _ModelLoadingStateState extends State { title: entry.key, ), trailingWidget: Text( - entry.value.$1 == entry.value.$2 - ? "Done" - : "${formatBytes(entry.value.$1)} / ${formatBytes(entry.value.$2)}", + '${(entry.value.$1 * 100) ~/ entry.value.$2}%', style: Theme.of(context).textTheme.bodySmall, ), singleBorderRadius: 8, From 1430c12de414afeb224eb4be5b999788e50f5c4f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:44:58 +0530 Subject: [PATCH 0335/1179] [mob] Show model download progress --- .../machine_learning_settings_page.dart | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 4a7f8fbd02..f4ea8a76d2 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -215,22 +215,21 @@ class _ModelLoadingStateState extends State { isGestureDetectorDisabled: true, ), // show the progress map if in debug mode - if (flagService.internalUser) - ..._progressMap.entries.map((entry) { - return MenuItemWidget( - key: ValueKey(entry.value), - captionedTextWidget: CaptionedTextWidget( - title: entry.key, - ), - trailingWidget: Text( - '${(entry.value.$1 * 100) ~/ entry.value.$2}%', - style: Theme.of(context).textTheme.bodySmall, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - ); - }), + ..._progressMap.entries.map((entry) { + return MenuItemWidget( + key: ValueKey(entry.value), + captionedTextWidget: CaptionedTextWidget( + title: entry.key, + ), + trailingWidget: Text( + '${(entry.value.$1 * 100) ~/ entry.value.$2}%', + style: Theme.of(context).textTheme.bodySmall, + ), + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + isGestureDetectorDisabled: true, + ); + }), ], ); } From 371fda4e974e441f03da14fba90db6731bed93dd Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 16:51:38 +0530 Subject: [PATCH 0336/1179] B64 --- web/packages/base/crypto/ente-impl.ts | 12 ++++++++++++ web/packages/base/crypto/ente.ts | 18 ++++++++++++++++++ web/packages/base/crypto/libsodium.ts | 2 +- web/packages/base/crypto/types.ts | 20 ++++++++++++++++---- web/packages/base/crypto/worker.ts | 1 + 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 1c6e07e962..ad14f93d2f 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -2,12 +2,21 @@ import * as libsodium from "./libsodium"; import type { DecryptBlobB64, + EncryptB64, EncryptBytes, EncryptedBlobB64, EncryptedBlobBytes, EncryptJSON, } from "./types"; +const EncryptB64ToBytes = async ({ + dataB64, + keyB64, +}: EncryptB64): Promise => ({ + data: await libsodium.fromB64(dataB64), + keyB64, +}); + const EncryptedBlobBytesToB64 = async ({ encryptedData, decryptionHeaderB64, @@ -16,6 +25,9 @@ const EncryptedBlobBytesToB64 = async ({ decryptionHeaderB64, }); +export const _encryptBoxB64 = (r: EncryptB64) => + EncryptB64ToBytes(r).then((rb) => libsodium.encryptBox(rb)); + export const _encryptAssociatedData = libsodium.encryptBlob; export const _encryptThumbnail = _encryptAssociatedData; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 8fe3aaad08..494656763f 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -54,6 +54,7 @@ import * as ei from "./ente-impl"; import type { DecryptBlobB64, DecryptBlobBytes, + EncryptB64, EncryptBytes, EncryptJSON, } from "./types"; @@ -71,6 +72,23 @@ const assertInWorker = (x: T): T => { return x; }; +/** + * Encrypt arbitrary data using the given key and a randomly generated nonce. + * + * Use {@link decryptBoxB64} to decrypt the result. + * + * ee {@link encryptBox} for the implementation details. + * + * > The suffix "Box" comes from the fact that it uses the so called secretbox + * > APIs provided by libsodium under the hood. + * > + * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] + */ +export const encryptBoxB64 = (r: EncryptB64) => + inWorker() + ? ei._encryptBoxB64(r) + : sharedCryptoWorker().then((w) => w.encryptBoxB64(r)); + /** * Encrypt arbitrary data associated with an Ente object (file, collection, * entity) using the object's key. diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 84d68d5747..6d3c0f5d7d 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -205,7 +205,7 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while Blob returns a "header". */ -const encryptBox = async ({ +export const encryptBox = async ({ data, keyB64, }: EncryptBytes): Promise => { diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 5f579fe262..1166c00bc3 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -1,5 +1,5 @@ /** - * An encryption request with the plaintext data as bytes. + * An encryption request with the data to encrypt provided as bytes. */ export interface EncryptBytes { /** @@ -13,9 +13,21 @@ export interface EncryptBytes { } /** - * An encryption request with the plaintext data as a JSON value. - * - * This is a variant of {@link EncryptBytes}. + * A variant of {@link EncryptBytes} with the data as base64 encoded string. + */ +export interface EncryptB64 { + /** + * A base64 string containing the data to encrypt. + */ + dataB64: string; + /** + * A base64 string containing the encryption key. + */ + keyB64: string; +} + +/** + * A variant of {@link EncryptBytes} with the data as a JSON value. */ export interface EncryptJSON { /** diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index c6aae70a2b..d7c8a68503 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -12,6 +12,7 @@ import * as libsodium from "./libsodium"; * Note: Keep these methods logic free. They are meant to be trivial proxies. */ export class CryptoWorker { + encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; decryptThumbnail = ei._decryptThumbnail; From 2d5faa39640ca699ff73a49ef4322683e098a02c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 17:05:29 +0530 Subject: [PATCH 0337/1179] Dec --- web/packages/base/crypto/ente-impl.ts | 15 +++++++++++++++ web/packages/base/crypto/ente.ts | 14 ++++++++++++++ web/packages/base/crypto/libsodium.ts | 2 +- web/packages/base/crypto/worker.ts | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index ad14f93d2f..bb7c6d77a2 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -2,6 +2,8 @@ import * as libsodium from "./libsodium"; import type { DecryptBlobB64, + DecryptBoxB64, + DecryptBoxBytes, EncryptB64, EncryptBytes, EncryptedBlobB64, @@ -41,6 +43,19 @@ export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => keyB64, }); +const DecryptBoxB64ToBytes = async ({ + encryptedDataB64, + nonceB64, + keyB64, +}: DecryptBoxB64): Promise => ({ + encryptedData: await libsodium.fromB64(encryptedDataB64), + nonceB64, + keyB64, +}); + +export const _decryptBoxB64 = (r: DecryptBoxB64) => + DecryptBoxB64ToBytes(r).then((rb) => libsodium.decryptBox(rb)); + export const _decryptAssociatedData = libsodium.decryptBlob; export const _decryptThumbnail = _decryptAssociatedData; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 494656763f..dce6dc1050 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -54,6 +54,7 @@ import * as ei from "./ente-impl"; import type { DecryptBlobB64, DecryptBlobBytes, + DecryptBoxB64, EncryptB64, EncryptBytes, EncryptJSON, @@ -139,6 +140,19 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => ? ei._encryptMetadataJSON(r) : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); +/** + * Decrypt arbitrary data, provided as a base64 string, using the given key and + * the provided nonce. + * + * This is the sibling of {@link encryptBoxB64}. + * + * See {@link decryptBox} for the implementation details. + */ +export const decryptBoxB64 = (r: DecryptBoxB64) => + inWorker() + ? ei._decryptBoxB64(r) + : sharedCryptoWorker().then((w) => w.decryptBoxB64(r)); + /** * Decrypt arbitrary data associated with an Ente object (file, collection or * entity) using the object's key. diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 6d3c0f5d7d..5f57c459b8 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -329,7 +329,7 @@ export async function encryptFileChunk( /** * Decrypt the result of {@link encryptBox}. */ -const decryptBox = async ({ +export const decryptBox = async ({ encryptedData, nonceB64, keyB64, diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index d7c8a68503..72ae1fb332 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -15,6 +15,7 @@ export class CryptoWorker { encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; + decryptBoxB64 = ei._decryptBoxB64; decryptThumbnail = ei._decryptThumbnail; decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; decryptMetadataJSON = ei._decryptMetadataJSON; From 2cf8bd14f9d7e492ed0170be049e61d4ac8b4ca0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:12:00 +0530 Subject: [PATCH 0338/1179] rename --- mobile/lib/core/configuration.dart | 2 +- mobile/lib/db/ml/db.dart | 17 +++--- mobile/lib/db/ml/embeddings_db.dart | 16 ++--- mobile/lib/main.dart | 2 +- .../face_ml/face_recognition_service.dart | 4 +- .../face_ml/feedback/cluster_feedback.dart | 60 +++++++++---------- .../face_ml/person/person_service.dart | 4 +- .../services/machine_learning/ml_service.dart | 22 +++---- .../semantic_search_service.dart | 14 ++--- mobile/lib/services/search_service.dart | 6 +- .../debug/ml_debug_section_widget.dart | 10 ++-- .../ui/viewer/file_details/face_widget.dart | 8 +-- .../file_details/faces_item_widget.dart | 8 +-- .../people/add_person_action_sheet.dart | 2 +- .../lib/ui/viewer/people/cluster_app_bar.dart | 6 +- .../people/person_cluster_suggestion.dart | 6 +- .../search/result/person_face_widget.dart | 4 +- mobile/lib/utils/ml_util.dart | 8 +-- 18 files changed, 99 insertions(+), 100 deletions(-) diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index 9fe284c583..16a65d497f 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -205,7 +205,7 @@ class Configuration { await FilesDB.instance.clearTable(); await CollectionsDB.instance.clearTable(); await MemoriesDB.instance.clearTable(); - await FaceMLDataDB.instance.clearTable(); + await MLDataDB.instance.clearTable(); await UploadLocksDB.instance.clearTable(); await IgnoredFilesService.instance.reset(); diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 89cab01b81..8276ec0a25 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -17,7 +17,7 @@ import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/ml_util.dart"; import 'package:sqlite_async/sqlite_async.dart'; -/// Stores all data for the FacesML-related features. The database can be accessed by `FaceMLDataDB.instance.database`. +/// Stores all data for the FacesML-related features. The database can be accessed by `MLDataDB.instance.database`. /// /// This includes: /// [facesTable] - Stores all the detected faces and its embeddings in the images. @@ -25,16 +25,16 @@ import 'package:sqlite_async/sqlite_async.dart'; /// [clusterPersonTable] - Stores all the clusters that are mapped to a certain person. /// [clusterSummaryTable] - Stores a summary of each cluster, containg the mean embedding and the number of faces in the cluster. /// [notPersonFeedback] - Stores the clusters that are confirmed not to belong to a certain person by the user -class FaceMLDataDB { - static final Logger _logger = Logger("FaceMLDataDB"); +class MLDataDB { + static final Logger _logger = Logger("MLDataDB"); static const _databaseName = "ente.face_ml_db_v3.db"; // static const _databaseVersion = 1; - FaceMLDataDB._privateConstructor(); + MLDataDB._privateConstructor(); - static final FaceMLDataDB instance = FaceMLDataDB._privateConstructor(); + static final MLDataDB instance = MLDataDB._privateConstructor(); static final _migrationScripts = [ createFacesTable, @@ -62,10 +62,10 @@ class FaceMLDataDB { final asyncDBConnection = SqliteDatabase(path: databaseDirectory, maxReaders: 2); final stopwatch = Stopwatch()..start(); - _logger.info("FaceMLDataDB: Starting migration"); + _logger.info("MLDataDB: Starting migration"); await _migrate(asyncDBConnection); _logger.info( - "FaceMLDataDB Migration took ${stopwatch.elapsedMilliseconds} ms", + "MLDataDB Migration took ${stopwatch.elapsedMilliseconds} ms", ); stopwatch.stop(); @@ -355,7 +355,8 @@ class FaceMLDataDB { if (faces != null) { for (final face in faces) { if (faceMaps.any( - (element) => (element[faceIDColumn] as String) == face.faceID,)) { + (element) => (element[faceIDColumn] as String) == face.faceID, + )) { return face; } } diff --git a/mobile/lib/db/ml/embeddings_db.dart b/mobile/lib/db/ml/embeddings_db.dart index 8d59e8504b..9c362b3d66 100644 --- a/mobile/lib/db/ml/embeddings_db.dart +++ b/mobile/lib/db/ml/embeddings_db.dart @@ -7,18 +7,18 @@ import "package:photos/db/ml/db_fields.dart"; import "package:photos/events/embedding_updated_event.dart"; import "package:photos/models/ml/clip.dart"; -extension EmbeddingsDB on FaceMLDataDB { +extension EmbeddingsDB on MLDataDB { static const databaseName = "ente.embeddings.db"; Future> getAll() async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; final results = await db.getAll('SELECT * FROM $clipTable'); return _convertToEmbeddings(results); } // Get indexed FileIDs Future> clipIndexedFileWithVersion() async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; final maps = await db .getAll('SELECT $fileIDColumn , $mlVersionColumn FROM $clipTable'); final Map result = {}; @@ -29,7 +29,7 @@ extension EmbeddingsDB on FaceMLDataDB { } Future getClipIndexedFileCount() async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; const String query = 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable'; final List> maps = await db.getAll(query); @@ -37,7 +37,7 @@ extension EmbeddingsDB on FaceMLDataDB { } Future put(ClipEmbedding embedding) async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; await db.execute( 'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) VALUES (?, ?, ?)', _getRowFromEmbedding(embedding), @@ -46,7 +46,7 @@ extension EmbeddingsDB on FaceMLDataDB { } Future putMany(List embeddings) async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList(); await db.executeBatch( 'INSERT OR REPLACE INTO $clipTable ($fileIDColumn, $embeddingColumn, $mlVersionColumn) values(?, ?, ?)', @@ -56,7 +56,7 @@ extension EmbeddingsDB on FaceMLDataDB { } Future deleteEmbeddings(List fileIDs) async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; await db.execute( 'DELETE FROM $clipTable WHERE $fileIDColumn IN (${fileIDs.join(", ")})', ); @@ -64,7 +64,7 @@ extension EmbeddingsDB on FaceMLDataDB { } Future deleteClipIndexes() async { - final db = await FaceMLDataDB.instance.asyncDB; + final db = await MLDataDB.instance.asyncDB; await db.execute('DELETE FROM $clipTable'); Bus.instance.fire(EmbeddingUpdatedEvent()); } diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 0c2fe17436..896505b298 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -311,7 +311,7 @@ Future _init(bool isBackground, {String via = ''}) async { } PersonService.init( EntityService.instance, - FaceMLDataDB.instance, + MLDataDB.instance, preferences, ); diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index e51931e254..f2a6f03e31 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -143,8 +143,8 @@ class FaceRecognitionService { } } } - await FaceMLDataDB.instance.bulkInsertFaces(faces); - await FaceMLDataDB.instance.putMany(clipEmbeddings); + await MLDataDB.instance.bulkInsertFaces(faces); + await MLDataDB.instance.putMany(clipEmbeddings); } // Yield any remaining instructions if (batchToYield.isNotEmpty) { diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index f02110baca..a144fc5fcc 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -78,11 +78,11 @@ class ClusterFeedbackService { // Get the files for the suggestions final suggestionClusterIDs = foundSuggestions.map((e) => e.$1).toSet(); final Map> fileIdToClusterID = - await FaceMLDataDB.instance.getFileIdToClusterIDSetForCluster( + await MLDataDB.instance.getFileIdToClusterIDSetForCluster( suggestionClusterIDs, ); final clusterIdToFaceIDs = - await FaceMLDataDB.instance.getClusterToFaceIDs(suggestionClusterIDs); + await MLDataDB.instance.getClusterToFaceIDs(suggestionClusterIDs); final Map> clusterIDToFiles = {}; final allFiles = await SearchService.instance.getAllFiles(); for (final f in allFiles) { @@ -141,7 +141,7 @@ class ClusterFeedbackService { try { _logger.info('removeFilesFromPerson called'); // Get the relevant faces to be removed - final faceIDs = await FaceMLDataDB.instance + final faceIDs = await MLDataDB.instance .getFaceIDsForPerson(p.remoteID) .then((iterable) => iterable.toList()); faceIDs.retainWhere((faceID) { @@ -149,7 +149,7 @@ class ClusterFeedbackService { return files.any((file) => file.uploadedFileID == fileID); }); final embeddings = - await FaceMLDataDB.instance.getFaceEmbeddingMapForFaces(faceIDs); + await MLDataDB.instance.getFaceEmbeddingMapForFaces(faceIDs); if (faceIDs.isEmpty || embeddings.isEmpty) { _logger.severe( @@ -175,8 +175,8 @@ class ClusterFeedbackService { final newFaceIdToClusterID = clusterResult.newFaceIdToCluster; // Update the deleted faces - await FaceMLDataDB.instance.forceUpdateClusterIds(newFaceIdToClusterID); - await FaceMLDataDB.instance + await MLDataDB.instance.forceUpdateClusterIds(newFaceIdToClusterID); + await MLDataDB.instance .clusterSummaryUpdate(clusterResult.newClusterSummaries); // Make sure the deleted faces don't get suggested in the future @@ -184,7 +184,7 @@ class ClusterFeedbackService { for (final clusterId in newFaceIdToClusterID.values.toSet()) { notClusterIdToPersonId[clusterId] = p.remoteID; } - await FaceMLDataDB.instance + await MLDataDB.instance .bulkCaptureNotPersonFeedback(notClusterIdToPersonId); // Update remote so new sync does not undo this change @@ -207,7 +207,7 @@ class ClusterFeedbackService { _logger.info('removeFilesFromCluster called'); try { // Get the relevant faces to be removed - final faceIDs = await FaceMLDataDB.instance + final faceIDs = await MLDataDB.instance .getFaceIDsForCluster(clusterID) .then((iterable) => iterable.toList()); faceIDs.retainWhere((faceID) { @@ -215,7 +215,7 @@ class ClusterFeedbackService { return files.any((file) => file.uploadedFileID == fileID); }); final embeddings = - await FaceMLDataDB.instance.getFaceEmbeddingMapForFaces(faceIDs); + await MLDataDB.instance.getFaceEmbeddingMapForFaces(faceIDs); if (faceIDs.isEmpty || embeddings.isEmpty) { _logger.severe( @@ -241,8 +241,8 @@ class ClusterFeedbackService { final newFaceIdToClusterID = clusterResult.newFaceIdToCluster; // Update the deleted faces - await FaceMLDataDB.instance.forceUpdateClusterIds(newFaceIdToClusterID); - await FaceMLDataDB.instance + await MLDataDB.instance.forceUpdateClusterIds(newFaceIdToClusterID); + await MLDataDB.instance .clusterSummaryUpdate(clusterResult.newClusterSummaries); Bus.instance.fire( @@ -265,7 +265,7 @@ class ClusterFeedbackService { for (final faceID in faceIDs) { faceIDToClusterID[faceID] = clusterID; } - await FaceMLDataDB.instance.forceUpdateClusterIds(faceIDToClusterID); + await MLDataDB.instance.forceUpdateClusterIds(faceIDToClusterID); Bus.instance.fire(PeopleChangedEvent()); return; } @@ -274,7 +274,7 @@ class ClusterFeedbackService { PersonEntity p, { required String personClusterID, }) async { - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; final faceIDs = await faceMlDb.getFaceIDsForCluster(personClusterID); final ignoredClusters = await faceMlDb.getPersonIgnoredClusters(p.remoteID); if (faceIDs.length < 2 * kMinimumClusterSizeSearchResult) { @@ -323,7 +323,7 @@ class ClusterFeedbackService { for (final suggestion in suggestions) { final clusterID = suggestion.$1; - await FaceMLDataDB.instance.assignClusterToPerson( + await MLDataDB.instance.assignClusterToPerson( personID: p.remoteID, clusterID: clusterID, ); @@ -341,7 +341,7 @@ class ClusterFeedbackService { } Future> checkForMixedClusters() async { - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; final allClusterToFaceCount = await faceMlDb.clusterIdToFaceCount(); final clustersToInspect = []; for (final clusterID in allClusterToFaceCount.keys) { @@ -439,7 +439,7 @@ class ClusterFeedbackService { _logger.info( 'breakUpCluster called for cluster $clusterID with dbscan $useDbscan', ); - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; final faceIDs = await faceMlDb.getFaceIDsForCluster(clusterID); final originalFaceIDsSet = faceIDs.toSet(); @@ -502,18 +502,18 @@ class ClusterFeedbackService { }) async { final w = (kDebugMode ? EnteWatch('getSuggestions') : null)?..start(); // Get all the cluster data - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; final allClusterIdsToCountMap = await faceMlDb.clusterIdToFaceCount(); final ignoredClusters = await faceMlDb.getPersonIgnoredClusters(p.remoteID); final personClusters = await faceMlDb.getPersonClusterIDs(p.remoteID); final personFaceIDs = - await FaceMLDataDB.instance.getFaceIDsForPerson(p.remoteID); + await MLDataDB.instance.getFaceIDsForPerson(p.remoteID); final personFileIDs = personFaceIDs.map(getFileIdFromFaceId).toSet(); w?.log( '${p.data.name} has ${personClusters.length} existing clusters, getting all database data done', ); final allClusterIdToFaceIDs = - await FaceMLDataDB.instance.getAllClusterIdToFaceIDs(); + await MLDataDB.instance.getAllClusterIdToFaceIDs(); w?.log('getAllClusterIdToFaceIDs done'); // First only do a simple check on the big clusters, if the person does not have small clusters yet @@ -552,7 +552,7 @@ class ClusterFeedbackService { final overlap = personFileIDs.intersection(suggestionSet); if (overlap.isNotEmpty && ((overlap.length / suggestionSet.length) > 0.5)) { - await FaceMLDataDB.instance.captureNotPersonFeedback( + await MLDataDB.instance.captureNotPersonFeedback( personID: p.remoteID, clusterID: suggestion.$1, ); @@ -599,7 +599,7 @@ class ClusterFeedbackService { final List personEmbeddingsProto = []; for (final clusterID in personClusters) { final Iterable embeddings = - await FaceMLDataDB.instance.getFaceEmbeddingsForCluster(clusterID); + await MLDataDB.instance.getFaceEmbeddingsForCluster(clusterID); personEmbeddingsProto.addAll(embeddings); } final List sampledEmbeddingsProto = @@ -622,7 +622,7 @@ class ClusterFeedbackService { double minMedianDistance = maxMedianDistance; for (final otherClusterId in otherClusterIdsCandidates) { final Iterable otherEmbeddingsProto = - await FaceMLDataDB.instance.getFaceEmbeddingsForCluster( + await MLDataDB.instance.getFaceEmbeddingsForCluster( otherClusterId, ); final sampledOtherEmbeddingsProto = _randomSampleWithoutReplacement( @@ -698,7 +698,7 @@ class ClusterFeedbackService { }) async { final w = (kDebugMode ? EnteWatch('_getUpdateClusterAvg') : null)?..start(); final startTime = DateTime.now(); - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; _logger.info( 'start getUpdateClusterAvg for ${allClusterIdsToCountMap.length} clusters, minClusterSize $minClusterSize, maxClusterInCurrentRun $maxClusterInCurrentRun', ); @@ -775,8 +775,7 @@ class ClusterFeedbackService { } final Map> clusterEmbeddings = - await FaceMLDataDB.instance - .getFaceEmbeddingsForClusters(clusterIdsToRead); + await MLDataDB.instance.getFaceEmbeddingsForClusters(clusterIdsToRead); w?.logAndReset( 'read $currentPendingRead embeddings for ${clusterEmbeddings.length} clusters', @@ -887,7 +886,7 @@ class ClusterFeedbackService { } } final startTime = DateTime.now(); - final faceMlDb = FaceMLDataDB.instance; + final faceMlDb = MLDataDB.instance; // Get the cluster averages for the person's clusters and the suggestions' clusters final personClusters = await faceMlDb.getPersonClusterIDs(person.remoteID); @@ -993,7 +992,7 @@ class ClusterFeedbackService { // Logging the cluster summary for the cluster if (logClusterSummary) { - final summaryMap = await FaceMLDataDB.instance.getClusterToClusterSummary( + final summaryMap = await MLDataDB.instance.getClusterToClusterSummary( [clusterID, biggestClusterID], ); final summary = summaryMap[clusterID]; @@ -1039,8 +1038,7 @@ class ClusterFeedbackService { // Median distance const sampleSize = 100; - final Iterable biggestEmbeddings = await FaceMLDataDB - .instance + final Iterable biggestEmbeddings = await MLDataDB.instance .getFaceEmbeddingsForCluster(biggestClusterID); final List biggestSampledEmbeddingsProto = _randomSampleWithoutReplacement( @@ -1058,7 +1056,7 @@ class ClusterFeedbackService { .toList(growable: false); final Iterable currentEmbeddings = - await FaceMLDataDB.instance.getFaceEmbeddingsForCluster(clusterID); + await MLDataDB.instance.getFaceEmbeddingsForCluster(clusterID); final List currentSampledEmbeddingsProto = _randomSampleWithoutReplacement( currentEmbeddings, @@ -1104,7 +1102,7 @@ class ClusterFeedbackService { // Logging the blur values for the cluster if (logBlurValues) { - final List blurValues = await FaceMLDataDB.instance + final List blurValues = await MLDataDB.instance .getBlurValuesForCluster(clusterID) .then((value) => value.toList()); final blurValuesIntegers = diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index e8a0b78fc6..a841d16b3e 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -14,7 +14,7 @@ import "package:shared_preferences/shared_preferences.dart"; class PersonService { final EntityService entityService; - final FaceMLDataDB faceMLDataDB; + final MLDataDB faceMLDataDB; final SharedPreferences prefs; PersonService(this.entityService, this.faceMLDataDB, this.prefs); // instance @@ -30,7 +30,7 @@ class PersonService { static init( EntityService entityService, - FaceMLDataDB faceMLDataDB, + MLDataDB faceMLDataDB, SharedPreferences prefs, ) { _instance = PersonService(entityService, faceMLDataDB, prefs); diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index a2ef72b3f3..48a5d64ea5 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -125,7 +125,7 @@ class MLService { await sync(); final int unclusteredFacesCount = - await FaceMLDataDB.instance.getUnclusteredFaceCount(); + await MLDataDB.instance.getUnclusteredFaceCount(); if (unclusteredFacesCount > _kForceClusteringFaceCount) { _logger.info( "There are $unclusteredFacesCount unclustered faces, doing clustering first", @@ -220,13 +220,13 @@ class MLService { _showClusteringIsHappening = true; // Get a sense of the total number of faces in the database - final int totalFaces = await FaceMLDataDB.instance - .getTotalFaceCount(minFaceScore: minFaceScore); + final int totalFaces = + await MLDataDB.instance.getTotalFaceCount(minFaceScore: minFaceScore); final fileIDToCreationTime = await FilesDB.instance.getFileIDToCreationTime(); final startEmbeddingFetch = DateTime.now(); // read all embeddings - final result = await FaceMLDataDB.instance.getFaceInfoForClustering( + final result = await MLDataDB.instance.getFaceInfoForClustering( minScore: minFaceScore, maxFaces: totalFaces, ); @@ -251,7 +251,7 @@ class MLService { // Get the current cluster statistics final Map oldClusterSummaries = - await FaceMLDataDB.instance.getAllClusterSummary(); + await MLDataDB.instance.getAllClusterSummary(); if (clusterInBuckets) { const int bucketSize = 10000; @@ -310,9 +310,9 @@ class MLService { return; } - await FaceMLDataDB.instance + await MLDataDB.instance .updateFaceIdToClusterId(clusteringResult.newFaceIdToCluster); - await FaceMLDataDB.instance + await MLDataDB.instance .clusterSummaryUpdate(clusteringResult.newClusterSummaries); Bus.instance.fire(PeopleChangedEvent()); for (final faceInfo in faceInfoForClustering) { @@ -355,9 +355,9 @@ class MLService { _logger.info( 'Updating ${clusteringResult.newFaceIdToCluster.length} FaceIDs with clusterIDs in the DB', ); - await FaceMLDataDB.instance + await MLDataDB.instance .updateFaceIdToClusterId(clusteringResult.newFaceIdToCluster); - await FaceMLDataDB.instance + await MLDataDB.instance .clusterSummaryUpdate(clusteringResult.newClusterSummaries); Bus.instance.fire(PeopleChangedEvent()); _logger.info('Done updating FaceIDs with clusterIDs in the DB, in ' @@ -484,7 +484,7 @@ class MLService { 'Skipped putting embedding because of error ${result.toJsonString()}', ); } - await FaceMLDataDB.instance.bulkInsertFaces(faces); + await MLDataDB.instance.bulkInsertFaces(faces); } if (result.clipRan) { @@ -500,7 +500,7 @@ class MLService { e, s, ); - await FaceMLDataDB.instance.bulkInsertFaces( + await MLDataDB.instance.bulkInsertFaces( [Face.empty(instruction.file.uploadedFileID!, error: true)], ); await SemanticSearchService.storeEmptyClipImageResult( diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index b01d9d82c2..3efa3f410a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -113,7 +113,7 @@ class SemanticSearchService { } Future clearIndexes() async { - await FaceMLDataDB.instance.deleteClipIndexes(); + await MLDataDB.instance.deleteClipIndexes(); final preferences = await SharedPreferences.getInstance(); await preferences.remove("sync_time_embeddings_v3"); _logger.info("Indexes cleared"); @@ -122,7 +122,7 @@ class SemanticSearchService { Future _loadImageEmbeddings() async { _logger.info("Pulling cached embeddings"); final startTime = DateTime.now(); - _cachedImageEmbeddings = await FaceMLDataDB.instance.getAll(); + _cachedImageEmbeddings = await MLDataDB.instance.getAll(); final endTime = DateTime.now(); _logger.info( "Loading ${_cachedImageEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", @@ -134,7 +134,7 @@ class SemanticSearchService { Future> _getFileIDsToBeIndexed() async { final uploadedFileIDs = await getIndexableFileIDs(); - final embeddedFileIDs = await FaceMLDataDB.instance.getIndexedFileIds(); + final embeddedFileIDs = await MLDataDB.instance.getIndexedFileIds(); embeddedFileIDs.removeWhere((key, value) => value < clipMlVersion); return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); @@ -187,7 +187,7 @@ class SemanticSearchService { _logger.info(results.length.toString() + " results"); if (deletedEntries.isNotEmpty) { - unawaited(FaceMLDataDB.instance.deleteEmbeddings(deletedEntries)); + unawaited(MLDataDB.instance.deleteEmbeddings(deletedEntries)); } return results; @@ -230,7 +230,7 @@ class SemanticSearchService { _logger.info(results.length.toString() + " results"); if (deletedEntries.isNotEmpty) { - unawaited(FaceMLDataDB.instance.deleteEmbeddings(deletedEntries)); + unawaited(MLDataDB.instance.deleteEmbeddings(deletedEntries)); } final matchingFileIDs = []; @@ -262,12 +262,12 @@ class SemanticSearchService { embedding: clipResult.embedding, version: clipMlVersion, ); - await FaceMLDataDB.instance.put(embedding); + await MLDataDB.instance.put(embedding); } static Future storeEmptyClipImageResult(EnteFile entefile) async { final embedding = ClipEmbedding.empty(entefile.uploadedFileID!); - await FaceMLDataDB.instance.put(embedding); + await MLDataDB.instance.put(embedding); } Future> _getTextEmbedding(String query) async { diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index 0949f4f0fd..86f4b7c52b 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -741,7 +741,7 @@ class SearchService { ) async { _logger.info('getClusterFilesForPersonID $personID'); final Map> fileIdToClusterID = - await FaceMLDataDB.instance.getFileIdToClusterIDSet(personID); + await MLDataDB.instance.getFileIdToClusterIDSet(personID); _logger.info('faceDbDone getClusterFilesForPersonID $personID'); final Map> clusterIDToFiles = {}; final allFiles = await getAllFiles(); @@ -766,11 +766,11 @@ class SearchService { try { debugPrint("getting faces"); final Map> fileIdToClusterID = - await FaceMLDataDB.instance.getFileIdToClusterIds(); + await MLDataDB.instance.getFileIdToClusterIds(); final Map personIdToPerson = await PersonService.instance.getPersonsMap(); final clusterIDToPersonID = - await FaceMLDataDB.instance.getClusterIDToPersonID(); + await MLDataDB.instance.getClusterIDToPersonID(); final List facesResult = []; final Map> clusterIdToFiles = {}; diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 08bef662ed..fa936b0818 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -59,7 +59,7 @@ class _MLDebugSectionWidgetState extends State { children: [ MenuItemWidget( captionedTextWidget: FutureBuilder( - future: FaceMLDataDB.instance.getIndexedFileCount(), + future: MLDataDB.instance.getIndexedFileCount(), builder: (context, snapshot) { if (snapshot.hasData) { return CaptionedTextWidget( @@ -176,7 +176,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: FutureBuilder( - future: FaceMLDataDB.instance.getClusteredToIndexableFilesRatio(), + future: MLDataDB.instance.getClusteredToIndexableFilesRatio(), builder: (context, snapshot) { if (snapshot.hasData) { return CaptionedTextWidget( @@ -266,7 +266,7 @@ class _MLDebugSectionWidgetState extends State { firstButtonLabel: "Yes, confirm", firstButtonOnTap: () async { try { - await FaceMLDataDB.instance.dropFeedbackTables(); + await MLDataDB.instance.dropFeedbackTables(); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { @@ -299,7 +299,7 @@ class _MLDebugSectionWidgetState extends State { for (final PersonEntity p in persons) { await PersonService.instance.deletePerson(p.remoteID); } - await FaceMLDataDB.instance.dropClustersAndPersonTable(); + await MLDataDB.instance.dropClustersAndPersonTable(); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { @@ -327,7 +327,7 @@ class _MLDebugSectionWidgetState extends State { firstButtonLabel: "Yes, confirm", firstButtonOnTap: () async { try { - await FaceMLDataDB.instance + await MLDataDB.instance .dropClustersAndPersonTable(faces: true); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); diff --git a/mobile/lib/ui/viewer/file_details/face_widget.dart b/mobile/lib/ui/viewer/file_details/face_widget.dart index 3ab4dac6ca..04572588c2 100644 --- a/mobile/lib/ui/viewer/file_details/face_widget.dart +++ b/mobile/lib/ui/viewer/file_details/face_widget.dart @@ -73,12 +73,12 @@ class _FaceWidgetState extends State { // Get faceID and double check that it doesn't belong to an existing clusterID. If it does, push that cluster page final w = (kDebugMode ? EnteWatch('FaceWidget') : null) ?..start(); - final existingClusterID = await FaceMLDataDB.instance + final existingClusterID = await MLDataDB.instance .getClusterIDForFaceID(widget.face.faceID); w?.log('getting existing clusterID for faceID'); if (existingClusterID != null) { final fileIdsToClusterIds = - await FaceMLDataDB.instance.getFileIdToClusterIds(); + await MLDataDB.instance.getFileIdToClusterIds(); final files = await SearchService.instance.getAllFiles(); final clusterFiles = files .where( @@ -100,7 +100,7 @@ class _FaceWidgetState extends State { // Create new clusterID for the faceID and update DB to assign the faceID to the new clusterID final String newClusterID = ClusterID.generate(); - await FaceMLDataDB.instance.updateFaceIdToClusterId( + await MLDataDB.instance.updateFaceIdToClusterId( {widget.face.faceID: newClusterID}, ); @@ -124,7 +124,7 @@ class _FaceWidgetState extends State { ); } else if (widget.clusterID != null) { final fileIdsToClusterIds = - await FaceMLDataDB.instance.getFileIdToClusterIds(); + await MLDataDB.instance.getFileIdToClusterIds(); final files = await SearchService.instance.getAllFiles(); final clusterFiles = files .where( diff --git a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart index 8b12547b26..d2c0735ef0 100644 --- a/mobile/lib/ui/viewer/file_details/faces_item_widget.dart +++ b/mobile/lib/ui/viewer/file_details/faces_item_widget.dart @@ -66,8 +66,8 @@ class _FacesItemWidgetState extends State { ]; } - final List? faces = await FaceMLDataDB.instance - .getFacesForGivenFileID(file.uploadedFileID!); + final List? faces = + await MLDataDB.instance.getFacesForGivenFileID(file.uploadedFileID!); if (faces == null) { return [ const ChipButtonWidget( @@ -93,12 +93,12 @@ class _FacesItemWidgetState extends State { ]; } - final faceIdsToClusterIds = await FaceMLDataDB.instance + final faceIdsToClusterIds = await MLDataDB.instance .getFaceIdsToClusterIds(faces.map((face) => face.faceID)); final Map persons = await PersonService.instance.getPersonsMap(); final clusterIDToPerson = - await FaceMLDataDB.instance.getClusterIDToPersonID(); + await MLDataDB.instance.getClusterIDToPersonID(); // Sort faces by name and score final faceIdToPersonID = {}; diff --git a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart index cb8dfe797a..2098a886b0 100644 --- a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart +++ b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart @@ -248,7 +248,7 @@ class _PersonActionSheetState extends State { return; } userAlreadyAssigned = true; - await FaceMLDataDB.instance.assignClusterToPerson( + await MLDataDB.instance.assignClusterToPerson( personID: person.$1.remoteID, clusterID: widget.cluserID, ); diff --git a/mobile/lib/ui/viewer/people/cluster_app_bar.dart b/mobile/lib/ui/viewer/people/cluster_app_bar.dart index 05df78c390..a5e6ef7815 100644 --- a/mobile/lib/ui/viewer/people/cluster_app_bar.dart +++ b/mobile/lib/ui/viewer/people/cluster_app_bar.dart @@ -196,10 +196,10 @@ class _AppBarWidgetState extends State { breakupResult.newFaceIdToCluster; // Update to delete the old clusters and save the new clusters - await FaceMLDataDB.instance.deleteClusterSummary(widget.clusterID); - await FaceMLDataDB.instance + await MLDataDB.instance.deleteClusterSummary(widget.clusterID); + await MLDataDB.instance .clusterSummaryUpdate(breakupResult.newClusterSummaries); - await FaceMLDataDB.instance + await MLDataDB.instance .updateFaceIdToClusterId(newFaceIdToClusterID); // Find the biggest cluster diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index 0c5a4ccbf1..54ff9975e8 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -199,7 +199,7 @@ class _PersonClustersState extends State { ); if (yesOrNo) { canGiveFeedback = false; - await FaceMLDataDB.instance.assignClusterToPerson( + await MLDataDB.instance.assignClusterToPerson( personID: widget.person.remoteID, clusterID: clusterID, ); @@ -233,7 +233,7 @@ class _PersonClustersState extends State { int numberOfSuggestions, ) async { canGiveFeedback = false; - await FaceMLDataDB.instance.captureNotPersonFeedback( + await MLDataDB.instance.captureNotPersonFeedback( personID: widget.person.remoteID, clusterID: clusterID, ); @@ -489,7 +489,7 @@ class _PersonClustersState extends State { clusterID: lastFeedback.suggestion.clusterIDToMerge, ); } else { - await FaceMLDataDB.instance.removeNotPersonFeedback( + await MLDataDB.instance.removeNotPersonFeedback( personID: widget.person.remoteID, clusterID: lastFeedback.suggestion.clusterIDToMerge, ); diff --git a/mobile/lib/ui/viewer/search/result/person_face_widget.dart b/mobile/lib/ui/viewer/search/result/person_face_widget.dart index 1b812dd36a..b5e9882833 100644 --- a/mobile/lib/ui/viewer/search/result/person_face_widget.dart +++ b/mobile/lib/ui/viewer/search/result/person_face_widget.dart @@ -86,7 +86,7 @@ class PersonFaceWidget extends StatelessWidget { personAvatarFaceID = personEntity.data.avatarFaceID; } } - return await FaceMLDataDB.instance.getCoverFaceForPerson( + return await MLDataDB.instance.getCoverFaceForPerson( recentFileID: file.uploadedFileID!, avatarFaceId: personAvatarFaceID, personID: personId, @@ -174,7 +174,7 @@ class PersonFaceWidget extends StatelessWidget { required bool useFullFile, }) async { try { - final Face? face = await FaceMLDataDB.instance.getCoverFaceForPerson( + final Face? face = await MLDataDB.instance.getCoverFaceForPerson( recentFileID: file.uploadedFileID!, clusterID: clusterID, ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 5b68b9c819..dffca632bd 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -52,9 +52,9 @@ Future getIndexStatus() async { try { final int indexableFiles = (await getIndexableFileIDs()).length; final int facesIndexedFiles = - await FaceMLDataDB.instance.getIndexedFileCount(); + await MLDataDB.instance.getIndexedFileCount(); final int clipIndexedFiles = - await FaceMLDataDB.instance.getClipIndexedFileCount(); + await MLDataDB.instance.getClipIndexedFileCount(); final int indexedFiles = math.min(facesIndexedFiles, clipIndexedFiles); final showIndexedFiles = math.min(indexedFiles, indexableFiles); @@ -71,9 +71,9 @@ Future> getFilesForMlIndexing() async { final time = DateTime.now(); // Get indexed fileIDs for each ML service final Map faceIndexedFileIDs = - await FaceMLDataDB.instance.getIndexedFileIds(); + await MLDataDB.instance.getIndexedFileIds(); final Map clipIndexedFileIDs = - await FaceMLDataDB.instance.clipIndexedFileWithVersion(); + await MLDataDB.instance.clipIndexedFileWithVersion(); // Get all regular files and all hidden files final enteFiles = await SearchService.instance.getAllFiles(); From b6d5ebc5b432761b9f1f8afbf52d8b51bc95c6a6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:23:38 +0530 Subject: [PATCH 0339/1179] rename --- mobile/lib/db/ml/{embeddings_db.dart => clip_db.dart} | 11 +++++++---- .../face_ml/face_recognition_service.dart | 2 +- .../semantic_search/semantic_search_service.dart | 2 +- mobile/lib/utils/ml_util.dart | 5 ++--- 4 files changed, 11 insertions(+), 9 deletions(-) rename mobile/lib/db/ml/{embeddings_db.dart => clip_db.dart} (93%) diff --git a/mobile/lib/db/ml/embeddings_db.dart b/mobile/lib/db/ml/clip_db.dart similarity index 93% rename from mobile/lib/db/ml/embeddings_db.dart rename to mobile/lib/db/ml/clip_db.dart index 9c362b3d66..846fdef512 100644 --- a/mobile/lib/db/ml/embeddings_db.dart +++ b/mobile/lib/db/ml/clip_db.dart @@ -6,8 +6,9 @@ import "package:photos/db/ml/db.dart"; import "package:photos/db/ml/db_fields.dart"; import "package:photos/events/embedding_updated_event.dart"; import "package:photos/models/ml/clip.dart"; +import "package:photos/models/ml/ml_versions.dart"; -extension EmbeddingsDB on MLDataDB { +extension ClipDB on MLDataDB { static const databaseName = "ente.embeddings.db"; Future> getAll() async { @@ -28,10 +29,12 @@ extension EmbeddingsDB on MLDataDB { return result; } - Future getClipIndexedFileCount() async { + Future getClipIndexedFileCount({ + int minimumMlVersion = clipMlVersion, + }) async { final db = await MLDataDB.instance.asyncDB; - const String query = - 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable'; + final String query = + 'SELECT COUNT(DISTINCT $fileIDColumn) as count FROM $clipTable WHERE $mlVersionColumn >= $minimumMlVersion'; final List> maps = await db.getAll(query); return maps.first['count'] as int; } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index f2a6f03e31..1db2dfed18 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -5,8 +5,8 @@ import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/clip_db.dart"; import "package:photos/db/ml/db.dart"; -import "package:photos/db/ml/embeddings_db.dart"; import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/list.dart"; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 3efa3f410a..af345aefb0 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -9,8 +9,8 @@ import "package:logging/logging.dart"; import "package:photos/core/cache/lru_map.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/clip_db.dart"; import "package:photos/db/ml/db.dart"; -import "package:photos/db/ml/embeddings_db.dart"; import 'package:photos/events/embedding_updated_event.dart'; import "package:photos/models/file/file.dart"; import "package:photos/models/ml/clip.dart"; diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index dffca632bd..d50555d38a 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -6,8 +6,8 @@ import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/ml/clip_db.dart"; import "package:photos/db/ml/db.dart"; -import "package:photos/db/ml/embeddings_db.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; @@ -51,8 +51,7 @@ class FileMLInstruction { Future getIndexStatus() async { try { final int indexableFiles = (await getIndexableFileIDs()).length; - final int facesIndexedFiles = - await MLDataDB.instance.getIndexedFileCount(); + final int facesIndexedFiles = await MLDataDB.instance.getIndexedFileCount(); final int clipIndexedFiles = await MLDataDB.instance.getClipIndexedFileCount(); final int indexedFiles = math.min(facesIndexedFiles, clipIndexedFiles); From c5ee50b3a20d559814b895608b3469f098316fac Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 17:41:13 +0530 Subject: [PATCH 0340/1179] [desktop] Improve robustness of cluster disabling condition Otherwise the code reaches the isInternalUser on logout, triggered by the search service, and at a point when it does not have the auth token anymore. Doesn't impact production builds, but doesn't hurt to make the check more robust say for people who're trying dev builds. --- web/packages/new/photos/services/ml/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 670bc5cc58..f6e0be04e6 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -337,8 +337,8 @@ let last: SearchPerson[] | undefined; * WIP! Don't enable, dragon eggs are hatching here. */ export const wipClusterEnable = async () => { - if (!isDevBuild || !(await isInternalUser())) return false; if (!process.env.NEXT_PUBLIC_ENTE_WIP_CL) return false; + if (!isDevBuild || !(await isInternalUser())) return false; return true; }; From b03b5806dbed4875996849907e72c6cb1850acda Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:50:44 +0530 Subject: [PATCH 0341/1179] refactor --- mobile/lib/db/ml/db_fields.dart | 1 - mobile/lib/models/base/id.dart | 9 +++++++ mobile/lib/models/nanoids/cluster_id.dart | 25 ------------------- .../face_clustering_service.dart | 17 +++++++------ .../ui/viewer/file_details/face_widget.dart | 8 +++--- mobile/pubspec.yaml | 2 +- 6 files changed, 23 insertions(+), 39 deletions(-) create mode 100644 mobile/lib/models/base/id.dart delete mode 100644 mobile/lib/models/nanoids/cluster_id.dart diff --git a/mobile/lib/db/ml/db_fields.dart b/mobile/lib/db/ml/db_fields.dart index c6fde65d2f..7a3a9d7631 100644 --- a/mobile/lib/db/ml/db_fields.dart +++ b/mobile/lib/db/ml/db_fields.dart @@ -12,7 +12,6 @@ const isSideways = 'is_sideways'; const imageWidth = 'width'; const imageHeight = 'height'; const mlVersionColumn = 'ml_version'; - const personIdColumn = 'person_id'; const clusterIDColumn = 'cluster_id'; diff --git a/mobile/lib/models/base/id.dart b/mobile/lib/models/base/id.dart new file mode 100644 index 0000000000..9f226eb90f --- /dev/null +++ b/mobile/lib/models/base/id.dart @@ -0,0 +1,9 @@ +import 'package:nanoid/nanoid.dart'; + +const enteWhiteListedAlphabet = + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; +const clusterIDLength = 22; + +String newClusterID() { + return "cluster_${customAlphabet(enteWhiteListedAlphabet, clusterIDLength)}"; +} diff --git a/mobile/lib/models/nanoids/cluster_id.dart b/mobile/lib/models/nanoids/cluster_id.dart deleted file mode 100644 index ee2d14013e..0000000000 --- a/mobile/lib/models/nanoids/cluster_id.dart +++ /dev/null @@ -1,25 +0,0 @@ -import "package:flutter/foundation.dart"; -import 'package:nanoid/nanoid.dart'; - -const enteWhiteListedAlphabet = - '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; -const clusterIDLength = 22; - -class ClusterID { - static String generate() { - return "cluster_${customAlphabet(enteWhiteListedAlphabet, clusterIDLength)}"; - } - - // Validation method - static bool isValidClusterID(String value) { - if (value.length != (clusterIDLength + 8)) { - debugPrint("ClusterID length is not ${clusterIDLength + 8}: $value"); - return false; - } - if (value.startsWith("cluster_")) { - debugPrint("ClusterID doesn't start with _cluster: $value"); - return false; - } - return true; - } -} diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index d33b69c97a..1319c65409 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -9,7 +9,7 @@ import "package:logging/logging.dart"; import "package:ml_linalg/dtype.dart"; import "package:ml_linalg/vector.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; -import "package:photos/models/nanoids/cluster_id.dart"; +import "package:photos/models/base/id.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/ml_result.dart"; @@ -491,11 +491,11 @@ ClusteringResult _runLinearClustering(Map args) { "[ClusterIsolate] ${DateTime.now()} Processing $totalFaces faces in total in this round ${offset != null ? "on top of ${offset + facesWithClusterID.length} earlier processed faces" : ""}", ); // set current epoch time as clusterID - String clusterID = ClusterID.generate(); + String clusterID = newClusterID(); if (facesWithClusterID.isEmpty) { // assign a clusterID to the first face sortedFaceInfos[0].clusterId = clusterID; - clusterID = ClusterID.generate(); + clusterID = newClusterID(); } final stopwatchClustering = Stopwatch()..start(); for (int i = 1; i < totalFaces; i++) { @@ -539,12 +539,13 @@ ClusteringResult _runLinearClustering(Map args) { log( " [ClusterIsolate] [WARNING] ${DateTime.now()} Found new cluster $clusterID", ); - clusterID = ClusterID.generate(); + clusterID = newClusterID(); sortedFaceInfos[closestIdx].clusterId = clusterID; } sortedFaceInfos[i].clusterId = sortedFaceInfos[closestIdx].clusterId; } else { - clusterID = ClusterID.generate(); + clusterID = newClusterID(); + ; sortedFaceInfos[i].clusterId = clusterID; } } @@ -634,7 +635,7 @@ ClusteringResult _runCompleteClustering(Map args) { "[CompleteClustering] ${DateTime.now()} Processing $totalFaces faces in one single round of complete clustering", ); - String clusterID = ClusterID.generate(); + String clusterID = newClusterID(); // Start actual clustering final Map newFaceIdToCluster = {}; @@ -658,12 +659,12 @@ ClusteringResult _runCompleteClustering(Map args) { if (closestDistance < distanceThreshold) { if (faceInfos[closestIdx].clusterId == null) { - clusterID = ClusterID.generate(); + clusterID = newClusterID(); faceInfos[closestIdx].clusterId = clusterID; } faceInfos[i].clusterId = faceInfos[closestIdx].clusterId!; } else { - clusterID = ClusterID.generate(); + clusterID = newClusterID(); faceInfos[i].clusterId = clusterID; } } diff --git a/mobile/lib/ui/viewer/file_details/face_widget.dart b/mobile/lib/ui/viewer/file_details/face_widget.dart index 04572588c2..58c2338812 100644 --- a/mobile/lib/ui/viewer/file_details/face_widget.dart +++ b/mobile/lib/ui/viewer/file_details/face_widget.dart @@ -6,10 +6,10 @@ import "package:flutter/foundation.dart" show kDebugMode; import "package:flutter/material.dart"; import "package:photos/db/ml/db.dart"; import "package:photos/extensions/stop_watch.dart"; +import "package:photos/models/base/id.dart"; import 'package:photos/models/file/file.dart'; import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/face/person.dart"; -import "package:photos/models/nanoids/cluster_id.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; import "package:photos/services/search_service.dart"; @@ -99,9 +99,9 @@ class _FaceWidgetState extends State { } // Create new clusterID for the faceID and update DB to assign the faceID to the new clusterID - final String newClusterID = ClusterID.generate(); + final String clusterID = newClusterID(); await MLDataDB.instance.updateFaceIdToClusterId( - {widget.face.faceID: newClusterID}, + {widget.face.faceID: clusterID}, ); // Push page for the new cluster @@ -109,7 +109,7 @@ class _FaceWidgetState extends State { MaterialPageRoute( builder: (context) => ClusterPage( [widget.file], - clusterID: newClusterID, + clusterID: clusterID, ), ), ); diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 348021f105..a760869744 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -124,9 +124,9 @@ dependencies: git: "https://github.com/ente-io/motionphoto.git" move_to_background: ^1.0.2 nanoid: ^1.0.0 + native_video_player: ^1.3.1 onnx_dart: path: plugins/onnx_dart - native_video_player: ^1.3.1 onnxruntime: git: url: https://github.com/ente-io/onnxruntime.git From f89e3793ecaebde6ed0c99b045a36846da875f6f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 17:58:52 +0530 Subject: [PATCH 0342/1179] Hide People header until we start showing clusters --- .../Search/SearchBar/searchInput/MenuWithPeople.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx index 56dbd305fb..103dddaae8 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx @@ -2,7 +2,6 @@ import { PeopleList } from "@/new/photos/components/PeopleList"; import { isMLEnabled } from "@/new/photos/services/ml"; import { Row } from "@ente/shared/components/Container"; import { Box, styled } from "@mui/material"; -import { t } from "i18next"; import { components } from "react-select"; import { Suggestion, SuggestionType } from "types/search"; @@ -36,12 +35,13 @@ const MenuWithPeople = (props) => { return ( - {((isMLEnabled() && indexStatus) || + {/* TODO: Hide People header until we start showing cgroups + {((isMLEnabled() && indexStatus) || (people && people.length > 0)) && ( {t("PEOPLE")} - )} + )} */} {isMLEnabled() && indexStatus && ( {indexStatusSuggestion.label} From 4e7e506e4d593da8cc88050fd100d99ac03c0fa3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:00:05 +0530 Subject: [PATCH 0343/1179] [Fix] Avoid queueing same fileID again --- mobile/lib/utils/ml_util.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index d50555d38a..ddb885136b 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -73,6 +73,7 @@ Future> getFilesForMlIndexing() async { await MLDataDB.instance.getIndexedFileIds(); final Map clipIndexedFileIDs = await MLDataDB.instance.clipIndexedFileWithVersion(); + final Set queuedFiledIDs = {}; // Get all regular files and all hidden files final enteFiles = await SearchService.instance.getAllFiles(); @@ -86,6 +87,11 @@ Future> getFilesForMlIndexing() async { if (_skipAnalysisEnteFile(enteFile)) { continue; } + if (queuedFiledIDs.contains(enteFile.uploadedFileID)) { + continue; + } + queuedFiledIDs.add(enteFile.uploadedFileID!); + final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); final shouldRunClip = @@ -108,6 +114,10 @@ Future> getFilesForMlIndexing() async { if (_skipAnalysisEnteFile(enteFile)) { continue; } + if (queuedFiledIDs.contains(enteFile.uploadedFileID)) { + continue; + } + queuedFiledIDs.add(enteFile.uploadedFileID!); final shouldRunFaces = _shouldRunIndexing(enteFile, faceIndexedFileIDs, faceMlVersion); final shouldRunClip = From 0a5959730115bdbffc284468c064a8506c75f1f1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 18:07:22 +0530 Subject: [PATCH 0344/1179] Padding at the top --- .../SearchBar/searchInput/MenuWithPeople.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx index 103dddaae8..25aa944d8e 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx @@ -2,6 +2,7 @@ import { PeopleList } from "@/new/photos/components/PeopleList"; import { isMLEnabled } from "@/new/photos/services/ml"; import { Row } from "@ente/shared/components/Container"; import { Box, styled } from "@mui/material"; +import { t } from "i18next"; import { components } from "react-select"; import { Suggestion, SuggestionType } from "types/search"; @@ -35,13 +36,16 @@ const MenuWithPeople = (props) => { return ( - {/* TODO: Hide People header until we start showing cgroups - {((isMLEnabled() && indexStatus) || - (people && people.length > 0)) && ( - - {t("PEOPLE")} - - )} */} + {isMLEnabled() && + indexStatus && + (people && people.length > 0 ? ( + + {t("PEOPLE")} + + ) : ( + + ))} + {isMLEnabled() && indexStatus && ( {indexStatusSuggestion.label} From c34ea7848e9352794e1f9d1ccc96b68cc95994fd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:07:28 +0530 Subject: [PATCH 0345/1179] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index a760869744..e411353443 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.18+918 +version: 0.9.19+919 publish_to: none environment: From 329f320720634acdcf89d4a1b4a1dc8bfd4c1a53 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:21:28 +0530 Subject: [PATCH 0346/1179] Update min score for magic search --- .../semantic_search/semantic_search_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index af345aefb0..44c90964e2 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -34,7 +34,7 @@ class SemanticSearchService { static final Computer _computer = Computer.shared(); final LRUMap> _queryCache = LRUMap(20); - static const kMinimumSimilarityThreshold = 0.20; + static const kMinimumSimilarityThreshold = 0.175; final _reloadCacheDebouncer = Debouncer( const Duration(milliseconds: 4000), From eace1150f5dafda395ac8318251b8fe468cce708 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 17 Aug 2024 06:46:53 +0530 Subject: [PATCH 0347/1179] [auth] Improve error message for invalid recovery input --- auth/lib/core/configuration.dart | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/auth/lib/core/configuration.dart b/auth/lib/core/configuration.dart index 586a519b65..123b8f37c0 100644 --- a/auth/lib/core/configuration.dart +++ b/auth/lib/core/configuration.dart @@ -285,9 +285,20 @@ class Configuration { Future recover(String recoveryKey) async { // check if user has entered mnemonic code if (recoveryKey.contains(' ')) { - if (recoveryKey.split(' ').length != mnemonicKeyWordCount) { + final split = recoveryKey.split(' '); + if (split.length != mnemonicKeyWordCount) { + String wordThatIsFollowedByEmptySpaceInSplit = ''; + for (int i = 1; i < split.length; i++) { + String word = split[i]; + if (word.isEmpty) { + wordThatIsFollowedByEmptySpaceInSplit = + '\n\nExtra space after word "${split[i - 1]}"'; + break; + } + } throw AssertionError( - 'recovery code should have $mnemonicKeyWordCount words', + '\nRecovery code should have $mnemonicKeyWordCount words, ' + 'found ${split.length} words instead.$wordThatIsFollowedByEmptySpaceInSplit', ); } recoveryKey = bip39.mnemonicToEntropy(recoveryKey); From 9f234036045caa88bced48c8a9ccb39b57129443 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 17 Aug 2024 06:51:16 +0530 Subject: [PATCH 0348/1179] Use word position --- auth/lib/core/configuration.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth/lib/core/configuration.dart b/auth/lib/core/configuration.dart index 123b8f37c0..950ebd60b6 100644 --- a/auth/lib/core/configuration.dart +++ b/auth/lib/core/configuration.dart @@ -288,11 +288,11 @@ class Configuration { final split = recoveryKey.split(' '); if (split.length != mnemonicKeyWordCount) { String wordThatIsFollowedByEmptySpaceInSplit = ''; - for (int i = 1; i < split.length; i++) { + for (int i = 0; i < split.length; i++) { String word = split[i]; if (word.isEmpty) { wordThatIsFollowedByEmptySpaceInSplit = - '\n\nExtra space after word "${split[i - 1]}"'; + '\n\nExtra space after word at position $i'; break; } } From 3676151dde06f5f44fb38c63bce8260401fecc3d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 17 Aug 2024 06:52:04 +0530 Subject: [PATCH 0349/1179] [auth] Bump version 3.1.2 --- auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index ced182efb1..a607dbe12c 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 3.1.1+321 +version: 3.1.2+322 publish_to: none environment: From 462adf74292096e2c507b4f6de0d6f49ec312ca4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 20:25:37 +0530 Subject: [PATCH 0350/1179] Nomenclature --- .../new/photos/services/user-entity.ts | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 67f92c77a8..6ffe72a81b 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -52,32 +52,33 @@ export type EntityType = const defaultDiffLimit = 500; /** - * A generic user entity. + * An entry in the user entity diff. * - * This is an intermediate step, usually what we really want is a version - * of this with the {@link data} parsed to the specific type of JSON object - * expected to be associated with this entity type. + * Each change either contains the latest data associated with a particular user + * entity that has been created or updated, or indicates that the corresponding + * entity has been deleted. */ -interface UserEntity { +interface UserEntityChange { /** - * A UUID or nanoid for the entity. + * A UUID or nanoid of the entity. */ id: string; /** - * Arbitrary data associated with the entity. The format of this data is - * specific to each entity type. + * Arbitrary (decrypted) data associated with the entity. The format of this + * data is specific to each entity type. * * This will not be present for entities that have been deleted on remote. */ data: Uint8Array | undefined; /** - * Epoch microseconds denoting when this entity was created or last updated. + * Epoch microseconds denoting when this entity was last changed (created or + * updated or deleted). */ updatedAt: number; } -/** Zod schema for {@link RemoteUserEntity} */ -const RemoteUserEntity = z.object({ +/** Zod schema for {@link RemoteUserEntityChange} */ +const RemoteUserEntityChange = z.object({ id: z.string(), /** * Base64 string containing the encrypted contents of the entity. @@ -96,11 +97,11 @@ const RemoteUserEntity = z.object({ }); /** An item in the user entity diff response we get from remote. */ -type RemoteUserEntity = z.infer; +type RemoteUserEntity = z.infer; /** - * Fetch the next batch of user entities of the given type that have been - * created or updated since the given time. + * Fetch the next set of changes (upsert or deletion) to user entities of the + * given type since the given time. * * @param type The type of the entities to fetch. * @@ -114,26 +115,26 @@ type RemoteUserEntity = z.infer; * [Note: Diff response will have at most one entry for an id] * * Unlike git diffs which track all changes, the diffs we get from remote are - * guaranteed to contain only one entry (upsert or delete) for particular Ente + * guaranteed to contain only one entry (upsert or delete) for a particular Ente * object. This holds true irrespective of the diff limit. * - * For example, in the user entity diff response, it is guaranteed that there - * will only be at max one entry for a particular entity id. The entry will have - * no data to indicate that the corresponding entity was deleted. Otherwise, - * when the data is present, it is taken as the creation of a new entity or the - * updation of an existing one. + * For example, in a user entity diff, it is guaranteed that there will only be + * at max one entry for a particular entity id. The entry will have no data to + * indicate that the corresponding entity was deleted. Otherwise, when the data + * is present, it is taken as the creation of a new entity or the updation of an + * existing one. * - * This behaviour comes from how remote stores the underlying, e.g., entities. A + * This behaviour comes from how remote stores the underlying, say, entities. A * diff returns just entities whose updation times greater than the provided * since time (limited to the given diff limit). So there will be at most one * row for a particular entity id. And if that entity has been deleted, then the - * row will be a tombstone so data will be not be present. + * row will be a tombstone, so data be absent. */ -export const userEntityDiff = async ( +const userEntityDiff = async ( type: EntityType, sinceTime: number, entityKeyB64: string, -): Promise => { +): Promise => { const parse = async ({ id, encryptedData, @@ -166,10 +167,10 @@ export const userEntityDiff = async ( headers: await authenticatedRequestHeaders(), }); ensureOk(res); - const entities = z - .object({ diff: z.array(RemoteUserEntity) }) + const diff = z + .object({ diff: z.array(RemoteUserEntityChange) }) .parse(await res.json()).diff; - return Promise.all(entities.map(parse)); + return Promise.all(diff.map(parse)); }; /** From bc192e5b006acd1ee8099fd6032f14a2c8c73f77 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 20:28:51 +0530 Subject: [PATCH 0351/1179] Hold remote to the delete invariant --- .../new/photos/services/user-entity.ts | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 6ffe72a81b..312bd22f55 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -4,6 +4,7 @@ import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; import { usersEncryptionKeyB64 } from "@/base/session-store"; +import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip } from "./gzip"; @@ -77,7 +78,9 @@ interface UserEntityChange { updatedAt: number; } -/** Zod schema for {@link RemoteUserEntityChange} */ +/** + * Zod schema for a item in the user entity diff. + */ const RemoteUserEntityChange = z.object({ id: z.string(), /** @@ -96,9 +99,6 @@ const RemoteUserEntityChange = z.object({ updatedAt: z.number(), }); -/** An item in the user entity diff response we get from remote. */ -type RemoteUserEntity = z.infer; - /** * Fetch the next set of changes (upsert or deletion) to user entities of the * given type since the given time. @@ -135,21 +135,6 @@ const userEntityDiff = async ( sinceTime: number, entityKeyB64: string, ): Promise => { - const parse = async ({ - id, - encryptedData, - header, - isDeleted, - updatedAt, - }: RemoteUserEntity) => ({ - id, - data: - encryptedData && header && !isDeleted - ? await decrypt(encryptedData, header) - : undefined, - updatedAt, - }); - const decrypt = (encryptedDataB64: string, decryptionHeaderB64: string) => decryptAssociatedDataB64({ encryptedDataB64, @@ -170,7 +155,17 @@ const userEntityDiff = async ( const diff = z .object({ diff: z.array(RemoteUserEntityChange) }) .parse(await res.json()).diff; - return Promise.all(diff.map(parse)); + return Promise.all( + diff.map( + async ({ id, encryptedData, header, isDeleted, updatedAt }) => ({ + id, + data: !isDeleted + ? await decrypt(ensure(encryptedData), ensure(header)) + : undefined, + updatedAt, + }), + ), + ); }; /** From 3962f3a1332270d86e07976cc8c272691e65e27c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 21:28:14 +0530 Subject: [PATCH 0352/1179] Use same nomenclature as the architecture document --- web/packages/base/session-store.ts | 6 ++--- .../new/photos/services/user-entity.ts | 26 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts index 6e37bac534..f2a4ebd86c 100644 --- a/web/packages/base/session-store.ts +++ b/web/packages/base/session-store.ts @@ -2,16 +2,16 @@ import { sharedCryptoWorker } from "@/base/crypto"; import { z } from "zod"; /** - * Return the base64 encoded user's encryption key from session storage. + * Return the user's master key (as a base64 string) from session storage. * * Precondition: The user should be logged in. */ -export const usersEncryptionKeyB64 = async () => { +export const masterKeyB64FromSession = async () => { // TODO: Same value as the deprecated SESSION_KEYS.ENCRYPTION_KEY. const value = sessionStorage.getItem("encryptionKey"); if (!value) { throw new Error( - "The user's encryption key was not found in session storage. Likely they are not logged in.", + "The user's master key was not found in session storage. Likely they are not logged in.", ); } diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 312bd22f55..4c92364e72 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -3,7 +3,7 @@ import { decryptAssociatedDataB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; -import { usersEncryptionKeyB64 } from "@/base/session-store"; +import { masterKeyB64FromSession } from "@/base/session-store"; import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; @@ -172,19 +172,21 @@ const userEntityDiff = async ( * Return the entity key that can be used to decrypt the encrypted contents of * user entities of the given {@link type}. * - * 1. We'll see if we have the (encrypted) entity key present locally. If so, - * we'll decrypt it using the user's master key and return it. + * 1. See if we have the encrypted entity key present locally. If so, return + * the entity key by decrypting it using with the user's master key. * - * 2. Otherwise we'll fetch the entity key for that type from remote. If found, - * we'll decrypte it using the user's master key and return it, also saving - * it locally for future use. + * 2. Otherwise fetch the encrypted entity key for that type from remote. If we + * get one, obtain the entity key by decrypt the encrypted one using the + * user's master key, save it locally for future use, and return it. * - * 3. Otherwise we'll create a new one, save it locally and put it to remote. + * 3. Otherwise generate a new entity key, encrypt it using the user's master + * key, putting the encrypted one to remote and also saving it locally, and + * return it. * * See also, [Note: User entity keys]. */ const getOrCreateEntityKeyB64 = async (type: EntityType) => { - const encryptionKeyB64 = await usersEncryptionKeyB64(); + const encryptionKeyB64 = await masterKeyB64FromSession(); const worker = await sharedCryptoWorker(); const decrypt = async ({ encryptedKey, header }: RemoteUserEntityKey) => { @@ -244,10 +246,10 @@ const saveRemoteUserEntityKey = ( * * [Note: User entity keys] * - * There is one encryption key (itself encrypted with the user's encryption key) - * for each user entity type. If the key doesn't exist on remote, then the - * client is expected to create one on the user's behalf. Remote will disallow - * attempts to multiple keys for the same user entity type. + * There is one encryption key (itself encrypted with the user's master key) for + * each user entity type. If the key doesn't exist on remote, then the client is + * expected to create one on the user's behalf. Remote will disallow attempts to + * multiple keys for the same user entity type. */ const getUserEntityKey = async ( type: EntityType, From d91462773ad00f8627c9191b08ef8dcecc9323eb Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 16 Aug 2024 21:34:25 +0530 Subject: [PATCH 0353/1179] Use same nomenclature as the architecture document --- desktop/src/main/ipc.ts | 10 +++++----- desktop/src/main/services/store.ts | 6 +++--- desktop/src/preload.ts | 10 +++++----- web/apps/photos/src/pages/index.tsx | 4 ++-- web/packages/accounts/pages/credentials.tsx | 7 +++++-- web/packages/base/types/ipc.ts | 16 ++++++++++------ web/packages/shared/crypto/helpers.ts | 2 +- 7 files changed, 31 insertions(+), 24 deletions(-) diff --git a/desktop/src/main/ipc.ts b/desktop/src/main/ipc.ts index 6c4020d6ee..cca4f0a0ff 100644 --- a/desktop/src/main/ipc.ts +++ b/desktop/src/main/ipc.ts @@ -45,9 +45,9 @@ import { convertToJPEG, generateImageThumbnail } from "./services/image"; import { logout } from "./services/logout"; import { createMLWorker } from "./services/ml"; import { - encryptionKey, lastShownChangelogVersion, - saveEncryptionKey, + masterKeyB64, + saveMasterKeyB64, setLastShownChangelogVersion, } from "./services/store"; import { @@ -103,10 +103,10 @@ export const attachIPCHandlers = () => { ipcMain.handle("selectDirectory", () => selectDirectory()); - ipcMain.handle("encryptionKey", () => encryptionKey()); + ipcMain.handle("masterKeyB64", () => masterKeyB64()); - ipcMain.handle("saveEncryptionKey", (_, encryptionKey: string) => - saveEncryptionKey(encryptionKey), + ipcMain.handle("saveMasterKeyB64", (_, masterKeyB64: string) => + saveMasterKeyB64(masterKeyB64), ); ipcMain.handle("lastShownChangelogVersion", () => diff --git a/desktop/src/main/services/store.ts b/desktop/src/main/services/store.ts index 4663c2525f..8ebac1a276 100644 --- a/desktop/src/main/services/store.ts +++ b/desktop/src/main/services/store.ts @@ -24,13 +24,13 @@ export const clearStores = () => { * On macOS, `safeStorage` stores our data under a Keychain entry named * " Safe Storage". In our case, "ente Safe Storage". */ -export const saveEncryptionKey = (encryptionKey: string) => { - const encryptedKey = safeStorage.encryptString(encryptionKey); +export const saveMasterKeyB64 = (masterKeyB64: string) => { + const encryptedKey = safeStorage.encryptString(masterKeyB64); const b64EncryptedKey = Buffer.from(encryptedKey).toString("base64"); safeStorageStore.set("encryptionKey", b64EncryptedKey); }; -export const encryptionKey = (): string | undefined => { +export const masterKeyB64 = (): string | undefined => { const b64EncryptedKey = safeStorageStore.get("encryptionKey"); if (!b64EncryptedKey) return undefined; const keyBuffer = Buffer.from(b64EncryptedKey, "base64"); diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts index 8472e91ff0..0af7682eae 100644 --- a/desktop/src/preload.ts +++ b/desktop/src/preload.ts @@ -103,10 +103,10 @@ const logout = () => { return ipcRenderer.invoke("logout"); }; -const encryptionKey = () => ipcRenderer.invoke("encryptionKey"); +const masterKeyB64 = () => ipcRenderer.invoke("masterKeyB64"); -const saveEncryptionKey = (encryptionKey: string) => - ipcRenderer.invoke("saveEncryptionKey", encryptionKey); +const saveMasterKeyB64 = (masterKeyB64: string) => + ipcRenderer.invoke("saveMasterKeyB64", masterKeyB64); const lastShownChangelogVersion = () => ipcRenderer.invoke("lastShownChangelogVersion"); @@ -342,8 +342,8 @@ contextBridge.exposeInMainWorld("electron", { openLogDirectory, selectDirectory, logout, - encryptionKey, - saveEncryptionKey, + masterKeyB64, + saveMasterKeyB64, lastShownChangelogVersion, setLastShownChangelogVersion, onMainWindowFocus, diff --git a/web/apps/photos/src/pages/index.tsx b/web/apps/photos/src/pages/index.tsx index 1708b1c137..d2a3827efd 100644 --- a/web/apps/photos/src/pages/index.tsx +++ b/web/apps/photos/src/pages/index.tsx @@ -73,9 +73,9 @@ export default function LandingPage() { const electron = globalThis.electron; if (!key && electron) { try { - key = await electron.encryptionKey(); + key = await electron.masterKeyB64(); } catch (e) { - log.error("Failed to get encryption key from electron", e); + log.error("Failed to read master key from secure storage", e); } if (key) { await saveKeyInSessionStore( diff --git a/web/packages/accounts/pages/credentials.tsx b/web/packages/accounts/pages/credentials.tsx index 53ebb07590..769914b74e 100644 --- a/web/packages/accounts/pages/credentials.tsx +++ b/web/packages/accounts/pages/credentials.tsx @@ -125,9 +125,12 @@ const Page: React.FC = ({ appContext }) => { const electron = globalThis.electron; if (!key && electron) { try { - key = await electron.encryptionKey(); + key = await electron.masterKeyB64(); } catch (e) { - log.error("Failed to get encryption key from electron", e); + log.error( + "Failed to read master key from secure storage", + e, + ); } if (key) { await saveKeyInSessionStore( diff --git a/web/packages/base/types/ipc.ts b/web/packages/base/types/ipc.ts index c0644760c0..dd670e21ba 100644 --- a/web/packages/base/types/ipc.ts +++ b/web/packages/base/types/ipc.ts @@ -69,18 +69,22 @@ export interface Electron { logout: () => Promise; /** - * Return the previously saved encryption key from persistent safe storage. + * Return the previously saved user's master key from the persistent safe + * storage accessible to the desktop app. * - * If no such key is found, return `undefined`. + * The key is returned as a base64 encoded string. * - * See also: {@link saveEncryptionKey}. + * If the key is not found, return `undefined`. + * + * See also: {@link saveMasterKeyB64}. */ - encryptionKey: () => Promise; + masterKeyB64: () => Promise; /** - * Save the given {@link encryptionKey} into persistent safe storage. + * Save the given {@link masterKeyB64} (encoded as a base64 string) to the + * persistent safe storage accessible to the desktop app. */ - saveEncryptionKey: (encryptionKey: string) => Promise; + saveMasterKeyB64: (masterKeyB64: string) => Promise; /** * Set or clear the callback {@link cb} to invoke whenever the app comes diff --git a/web/packages/shared/crypto/helpers.ts b/web/packages/shared/crypto/helpers.ts index c7165713ff..d042a11a1c 100644 --- a/web/packages/shared/crypto/helpers.ts +++ b/web/packages/shared/crypto/helpers.ts @@ -108,7 +108,7 @@ export const saveKeyInSessionStore = async ( setKey(keyType, sessionKeyAttributes); const electron = globalThis.electron; if (electron && !fromDesktop && keyType === SESSION_KEYS.ENCRYPTION_KEY) { - electron.saveEncryptionKey(key); + electron.saveMasterKeyB64(key); } }; From 93d48f6d6f47f5e139e226506f7c4f8d4f9794b8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 11:14:02 +0530 Subject: [PATCH 0354/1179] Fix --- web/apps/photos/src/pages/index.tsx | 2 +- web/packages/accounts/pages/credentials.tsx | 5 +---- web/packages/new/photos/services/user-entity.ts | 6 +++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/web/apps/photos/src/pages/index.tsx b/web/apps/photos/src/pages/index.tsx index d2a3827efd..635685b7e3 100644 --- a/web/apps/photos/src/pages/index.tsx +++ b/web/apps/photos/src/pages/index.tsx @@ -75,7 +75,7 @@ export default function LandingPage() { try { key = await electron.masterKeyB64(); } catch (e) { - log.error("Failed to read master key from secure storage", e); + log.error("Failed to read master key from safe storage", e); } if (key) { await saveKeyInSessionStore( diff --git a/web/packages/accounts/pages/credentials.tsx b/web/packages/accounts/pages/credentials.tsx index 769914b74e..b29cb952c6 100644 --- a/web/packages/accounts/pages/credentials.tsx +++ b/web/packages/accounts/pages/credentials.tsx @@ -127,10 +127,7 @@ const Page: React.FC = ({ appContext }) => { try { key = await electron.masterKeyB64(); } catch (e) { - log.error( - "Failed to read master key from secure storage", - e, - ); + log.error("Failed to read master key from safe storage", e); } if (key) { await saveKeyInSessionStore( diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 4c92364e72..4a1945f293 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -186,11 +186,11 @@ const userEntityDiff = async ( * See also, [Note: User entity keys]. */ const getOrCreateEntityKeyB64 = async (type: EntityType) => { - const encryptionKeyB64 = await masterKeyB64FromSession(); + const masterKeyB64 = await masterKeyB64FromSession(); const worker = await sharedCryptoWorker(); const decrypt = async ({ encryptedKey, header }: RemoteUserEntityKey) => { - return worker.decryptB64(encryptedKey, header, encryptionKeyB64); + return worker.decryptB64(encryptedKey, header, masterKeyB64); }; // See if we already have it locally. @@ -202,7 +202,7 @@ const getOrCreateEntityKeyB64 = async (type: EntityType) => { if (existing) { // Only save it if we can decrypt it to avoid corrupting our local state // in unforeseen circumstances. - const result = decrypt(existing); + const result = await decrypt(existing); await saveRemoteUserEntityKey(type, existing); return result; } From dbe98acbd7abcc8c5490a4d3bf6925ebb25e51cf Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 16:38:51 +0530 Subject: [PATCH 0355/1179] Dec --- .../new/photos/services/user-entity.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 4a1945f293..07fe126dd2 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,5 +1,5 @@ import { sharedCryptoWorker } from "@/base/crypto"; -import { decryptAssociatedDataB64 } from "@/base/crypto/ente"; +import { decryptAssociatedDataB64, decryptBoxB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; @@ -186,23 +186,16 @@ const userEntityDiff = async ( * See also, [Note: User entity keys]. */ const getOrCreateEntityKeyB64 = async (type: EntityType) => { - const masterKeyB64 = await masterKeyB64FromSession(); - const worker = await sharedCryptoWorker(); - - const decrypt = async ({ encryptedKey, header }: RemoteUserEntityKey) => { - return worker.decryptB64(encryptedKey, header, masterKeyB64); - }; - // See if we already have it locally. const saved = await savedRemoteUserEntityKey(type); - if (saved) return decrypt(saved); + if (saved) return decryptEntityKey(saved); // See if remote already has it. const existing = await getUserEntityKey(type); if (existing) { // Only save it if we can decrypt it to avoid corrupting our local state // in unforeseen circumstances. - const result = await decrypt(existing); + const result = await decryptEntityKey(existing); await saveRemoteUserEntityKey(type, existing); return result; } @@ -241,6 +234,20 @@ const saveRemoteUserEntityKey = ( entityKey: RemoteUserEntityKey, ) => setKV(entityKeyKey(type), JSON.stringify(entityKey)); +/** + * Decrypt an encrypted entity key using the user's master key. + */ +const decryptEntityKey = async ({ + encryptedKey, + header, +}: RemoteUserEntityKey) => + decryptBoxB64({ + encryptedDataB64: encryptedKey, + // Remote calls it the header, but it really is the nonce. + nonceB64: header, + keyB64: await masterKeyB64FromSession(), + }); + /** * Fetch the encryption key for the given user entity {@link type} from remote. * From f0b86323c33e6286b5001cf110a41e28c9c00275 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 17:00:42 +0530 Subject: [PATCH 0356/1179] Attempt to curb the combinatorial explosion --- web/packages/base/crypto/ente.ts | 2 +- web/packages/base/crypto/libsodium.ts | 25 ++++++++++++++++++++++++ web/packages/base/crypto/types.ts | 28 +++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index dce6dc1050..11f1c41878 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -142,7 +142,7 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => /** * Decrypt arbitrary data, provided as a base64 string, using the given key and - * the provided nonce. + * the provided nonce, and return the base64 * * This is the sibling of {@link encryptBoxB64}. * diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 5f57c459b8..a21359b181 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -12,10 +12,12 @@ import { mergeUint8Arrays } from "@/utils/array"; import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { + BytesOrB64, DecryptBlobBytes, DecryptBoxBytes, EncryptBytes, EncryptedBlobBytes, + EncryptedBox2, EncryptedBoxBytes, } from "./types"; @@ -342,6 +344,29 @@ export const decryptBox = async ({ ); }; +/** + * If the provided {@link bob} ("Bytes or B64 string") is already a + * {@link Uint8Array}, return it unchanged, otherwise convert the base64 string + * into bytes and return those. + */ +const bytes = async (bob: BytesOrB64) => + typeof bob == "string" ? fromB64(bob) : bob; + +/** + * Decrypt the result of {@link encryptBox}. + */ +export const decryptBox2 = async ( + { encryptedData, nonce }: EncryptedBox2, + key: BytesOrB64, +): Promise => { + await sodium.ready; + return sodium.crypto_secretbox_open_easy( + await bytes(encryptedData), + await bytes(nonce), + await bytes(key), + ); +}; + /** * Decrypt the result of {@link encryptBlob}. */ diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 1166c00bc3..1e6144d059 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -149,6 +149,34 @@ export interface DecryptBoxBytes { keyB64: string; } +/** + * Data provided either as bytes ({@link Uint8Array}) or their base64 string representation. + */ +export type BytesOrB64 = Uint8Array | string; + +/** + * A decryption request to decrypt data encrypted using the secretbox APIs. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + */ +export interface EncryptedBox2 { + /** + * The data to decrypt. + */ + encryptedData: BytesOrB64; + /** + * The nonce that was used during encryption. + * + * The nonce is required to decrypt the data, but it does not need to be + * kept secret. + */ + nonce: BytesOrB64; + /** + * The encryption key. + */ + key: BytesOrB64; +} + /** * A variant of {@link DecryptBoxBytes} with the encrypted Blob's data as a * base64 encoded string. From f3e947f47e5f219077968f04fe36783d80999b06 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 17:10:06 +0530 Subject: [PATCH 0357/1179] Match the types --- web/packages/base/crypto/ente-impl.ts | 18 ++++--------- web/packages/base/crypto/ente.ts | 25 +++++++++++-------- web/packages/base/crypto/types.ts | 4 --- web/packages/base/crypto/worker.ts | 1 + .../new/photos/services/user-entity.ts | 15 +++++------ 5 files changed, 29 insertions(+), 34 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index bb7c6d77a2..156ee30094 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,13 +1,13 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; import type { + BytesOrB64, DecryptBlobB64, - DecryptBoxB64, - DecryptBoxBytes, EncryptB64, EncryptBytes, EncryptedBlobB64, EncryptedBlobBytes, + EncryptedBox2, EncryptJSON, } from "./types"; @@ -43,18 +43,10 @@ export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => keyB64, }); -const DecryptBoxB64ToBytes = async ({ - encryptedDataB64, - nonceB64, - keyB64, -}: DecryptBoxB64): Promise => ({ - encryptedData: await libsodium.fromB64(encryptedDataB64), - nonceB64, - keyB64, -}); +export const _decryptBox = libsodium.decryptBox2; -export const _decryptBoxB64 = (r: DecryptBoxB64) => - DecryptBoxB64ToBytes(r).then((rb) => libsodium.decryptBox(rb)); +export const _decryptBoxB64 = (b: EncryptedBox2, k: BytesOrB64) => + _decryptBox(b, k).then(libsodium.toB64); export const _decryptAssociatedData = libsodium.decryptBlob; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 11f1c41878..d2657bb19f 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -52,11 +52,12 @@ import { assertionFailed } from "../assert"; import { inWorker } from "../env"; import * as ei from "./ente-impl"; import type { + BytesOrB64, DecryptBlobB64, DecryptBlobBytes, - DecryptBoxB64, EncryptB64, EncryptBytes, + EncryptedBox2, EncryptJSON, } from "./types"; @@ -141,17 +142,21 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); /** - * Decrypt arbitrary data, provided as a base64 string, using the given key and - * the provided nonce, and return the base64 - * - * This is the sibling of {@link encryptBoxB64}. - * - * See {@link decryptBox} for the implementation details. + * Decrypt a box encrypted using {@link encryptBox}. */ -export const decryptBoxB64 = (r: DecryptBoxB64) => +export const decryptBox = (b: EncryptedBox2, k: BytesOrB64) => inWorker() - ? ei._decryptBoxB64(r) - : sharedCryptoWorker().then((w) => w.decryptBoxB64(r)); + ? ei._decryptBox(b, k) + : sharedCryptoWorker().then((w) => w.decryptBox(b, k)); + +/** + * Variant of {@link decryptBox} that returns the decrypted data as a base64 + * string. + */ +export const decryptBoxB64 = (b: EncryptedBox2, k: BytesOrB64) => + inWorker() + ? ei._decryptBoxB64(b, k) + : sharedCryptoWorker().then((w) => w.decryptBoxB64(b, k)); /** * Decrypt arbitrary data associated with an Ente object (file, collection or diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 1e6144d059..e7ed032acb 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -171,10 +171,6 @@ export interface EncryptedBox2 { * kept secret. */ nonce: BytesOrB64; - /** - * The encryption key. - */ - key: BytesOrB64; } /** diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 72ae1fb332..13e36c546d 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -15,6 +15,7 @@ export class CryptoWorker { encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; + decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; decryptThumbnail = ei._decryptThumbnail; decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 07fe126dd2..5902573088 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,4 +1,3 @@ -import { sharedCryptoWorker } from "@/base/crypto"; import { decryptAssociatedDataB64, decryptBoxB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; @@ -241,12 +240,14 @@ const decryptEntityKey = async ({ encryptedKey, header, }: RemoteUserEntityKey) => - decryptBoxB64({ - encryptedDataB64: encryptedKey, - // Remote calls it the header, but it really is the nonce. - nonceB64: header, - keyB64: await masterKeyB64FromSession(), - }); + decryptBoxB64( + { + encryptedData: encryptedKey, + // Remote calls it the header, but it really is the nonce. + nonce: header, + }, + await masterKeyB64FromSession(), + ); /** * Fetch the encryption key for the given user entity {@link type} from remote. From 153be4990adbb610aa6d41ab3f12a2d05f9ba569 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 17:13:16 +0530 Subject: [PATCH 0358/1179] Rearrange --- web/packages/base/crypto/types.ts | 52 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index e7ed032acb..9fde2fd388 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -1,3 +1,8 @@ +/** + * Data provided either as bytes ({@link Uint8Array}) or their base64 string representation. + */ +export type BytesOrB64 = Uint8Array | string; + /** * An encryption request with the data to encrypt provided as bytes. */ @@ -43,6 +48,29 @@ export interface EncryptJSON { keyB64: string; } +/** + * The result of encryption using the secretbox APIs. + * + * It contains an encrypted data and a randomly generated nonce that was used + * during encryption. Both these values are needed to decrypt the data. The + * nonce does not need to be secret. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + */ +export interface EncryptedBox2 { + /** + * The data to decrypt. + */ + encryptedData: BytesOrB64; + /** + * The nonce that was used during encryption. + * + * The nonce is required to decrypt the data, but it does not need to be + * kept secret. + */ + nonce: BytesOrB64; +} + /** * The result of encryption using the secretbox APIs. * @@ -149,30 +177,6 @@ export interface DecryptBoxBytes { keyB64: string; } -/** - * Data provided either as bytes ({@link Uint8Array}) or their base64 string representation. - */ -export type BytesOrB64 = Uint8Array | string; - -/** - * A decryption request to decrypt data encrypted using the secretbox APIs. - * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. - */ -export interface EncryptedBox2 { - /** - * The data to decrypt. - */ - encryptedData: BytesOrB64; - /** - * The nonce that was used during encryption. - * - * The nonce is required to decrypt the data, but it does not need to be - * kept secret. - */ - nonce: BytesOrB64; -} - /** * A variant of {@link DecryptBoxBytes} with the encrypted Blob's data as a * base64 encoded string. From cf6508be4ad5445ea5f53651b068367c22257436 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 17:33:22 +0530 Subject: [PATCH 0359/1179] Enc --- web/packages/base/crypto/ente-impl.ts | 12 +------- web/packages/base/crypto/ente.ts | 16 +++++----- web/packages/base/crypto/libsodium.ts | 43 +++++++++++++++++++++------ web/packages/base/crypto/types.ts | 28 +++++++++++++++++ 4 files changed, 71 insertions(+), 28 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 156ee30094..d6b395f758 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -3,7 +3,6 @@ import * as libsodium from "./libsodium"; import type { BytesOrB64, DecryptBlobB64, - EncryptB64, EncryptBytes, EncryptedBlobB64, EncryptedBlobBytes, @@ -11,14 +10,6 @@ import type { EncryptJSON, } from "./types"; -const EncryptB64ToBytes = async ({ - dataB64, - keyB64, -}: EncryptB64): Promise => ({ - data: await libsodium.fromB64(dataB64), - keyB64, -}); - const EncryptedBlobBytesToB64 = async ({ encryptedData, decryptionHeaderB64, @@ -27,8 +18,7 @@ const EncryptedBlobBytesToB64 = async ({ decryptionHeaderB64, }); -export const _encryptBoxB64 = (r: EncryptB64) => - EncryptB64ToBytes(r).then((rb) => libsodium.encryptBox(rb)); +export const _encryptBoxB64 = libsodium.encryptBoxB64; export const _encryptAssociatedData = libsodium.encryptBlob; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index d2657bb19f..db560d7bbd 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -55,7 +55,6 @@ import type { BytesOrB64, DecryptBlobB64, DecryptBlobBytes, - EncryptB64, EncryptBytes, EncryptedBox2, EncryptJSON, @@ -75,7 +74,8 @@ const assertInWorker = (x: T): T => { }; /** - * Encrypt arbitrary data using the given key and a randomly generated nonce. + * Encrypt the given data, returning a box containing encrypted data and a + * randomly generated nonce. * * Use {@link decryptBoxB64} to decrypt the result. * @@ -86,10 +86,10 @@ const assertInWorker = (x: T): T => { * > * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] */ -export const encryptBoxB64 = (r: EncryptB64) => +export const encryptBoxB64 = (data: BytesOrB64, key: BytesOrB64) => inWorker() - ? ei._encryptBoxB64(r) - : sharedCryptoWorker().then((w) => w.encryptBoxB64(r)); + ? ei._encryptBoxB64(data, key) + : sharedCryptoWorker().then((w) => w.encryptBoxB64(data, key)); /** * Encrypt arbitrary data associated with an Ente object (file, collection, @@ -153,10 +153,10 @@ export const decryptBox = (b: EncryptedBox2, k: BytesOrB64) => * Variant of {@link decryptBox} that returns the decrypted data as a base64 * string. */ -export const decryptBoxB64 = (b: EncryptedBox2, k: BytesOrB64) => +export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => inWorker() - ? ei._decryptBoxB64(b, k) - : sharedCryptoWorker().then((w) => w.decryptBoxB64(b, k)); + ? ei._decryptBoxB64(box, key) + : sharedCryptoWorker().then((w) => w.decryptBoxB64(box, key)); /** * Decrypt arbitrary data associated with an Ente object (file, collection or diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index a21359b181..5b7d6aa25e 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -18,6 +18,7 @@ import type { EncryptBytes, EncryptedBlobBytes, EncryptedBox2, + EncryptedBoxB64, EncryptedBoxBytes, } from "./types"; @@ -122,7 +123,22 @@ export async function fromHex(input: string) { } /** - * Encrypt the given data using the provided base64 encoded key. + * If the provided {@link bob} ("Bytes or B64 string") is already a + * {@link Uint8Array}, return it unchanged, otherwise convert the base64 string + * into bytes and return those. + */ +const bytes = async (bob: BytesOrB64) => + typeof bob == "string" ? fromB64(bob) : bob; + +/** + * Encrypt the given data using libsodium's secretbox APIs, using a randomly + * generated nonce. + * + * Use {@link decryptBox} to decrypt the result. + * + * @param data The data to encrypt. + * + * @param key The key to use for encryption. * * [Note: 3 forms of encryption (Box | Blob | Stream)] * @@ -207,6 +223,23 @@ export async function fromHex(input: string) { * * 3. Box returns a "nonce", while Blob returns a "header". */ +export const encryptBoxB64 = async ( + data: BytesOrB64, + key: BytesOrB64, +): Promise => { + await sodium.ready; + const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); + const encryptedData = sodium.crypto_secretbox_easy( + data, + nonce, + await bytes(key), + ); + return { + encryptedData: await toB64(encryptedData), + nonce: await toB64(nonce), + }; +}; + export const encryptBox = async ({ data, keyB64, @@ -344,14 +377,6 @@ export const decryptBox = async ({ ); }; -/** - * If the provided {@link bob} ("Bytes or B64 string") is already a - * {@link Uint8Array}, return it unchanged, otherwise convert the base64 string - * into bytes and return those. - */ -const bytes = async (bob: BytesOrB64) => - typeof bob == "string" ? fromB64(bob) : bob; - /** * Decrypt the result of {@link encryptBox}. */ diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 9fde2fd388..0824fa7286 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -3,6 +3,20 @@ */ export type BytesOrB64 = Uint8Array | string; +/** + * An encryption request + */ +export interface EncryptBytesOrB64 { + /** + * The data to encrypt. + */ + data: BytesOrB64; + /** + * The key to use for encryption. + */ + key: BytesOrB64; +} + /** * An encryption request with the data to encrypt provided as bytes. */ @@ -71,6 +85,20 @@ export interface EncryptedBox2 { nonce: BytesOrB64; } +export interface EncryptedBoxB64 { + /** + * The encrypted data as a base64 string. + */ + encryptedData: string; + /** + * The nonce that was used during encryption, as a base64 string. + * + * The nonce is required to decrypt the data, but it does not need to be + * kept secret. + */ + nonce: string; +} + /** * The result of encryption using the secretbox APIs. * From 25b9a36554c2a69727715903224a3f2ae83e969e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 18:30:37 +0530 Subject: [PATCH 0360/1179] Fix crypto_secretbox_easy takes a string, but that's a UTF-8 string, not the base64 one that we're looking for. --- web/packages/base/crypto/libsodium.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 5b7d6aa25e..f1b537e62e 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -230,8 +230,8 @@ export const encryptBoxB64 = async ( await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy( - data, - nonce, + await bytes(data), + await bytes(nonce), await bytes(key), ); return { From 890ed7dd4b9aeb756c8bb723d03785ce7c370866 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 18:43:31 +0530 Subject: [PATCH 0361/1179] Cleanup --- web/packages/base/crypto/ente-impl.ts | 7 +------ web/packages/base/crypto/ente.ts | 24 ++++++++---------------- web/packages/base/crypto/libsodium.ts | 9 +++++++-- web/packages/base/crypto/types.ts | 5 +++-- web/packages/base/crypto/worker.ts | 1 - 5 files changed, 19 insertions(+), 27 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index d6b395f758..71ecc88b7a 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,12 +1,10 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; import type { - BytesOrB64, DecryptBlobB64, EncryptBytes, EncryptedBlobB64, EncryptedBlobBytes, - EncryptedBox2, EncryptJSON, } from "./types"; @@ -33,10 +31,7 @@ export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => keyB64, }); -export const _decryptBox = libsodium.decryptBox2; - -export const _decryptBoxB64 = (b: EncryptedBox2, k: BytesOrB64) => - _decryptBox(b, k).then(libsodium.toB64); +export const _decryptBoxB64 = libsodium.decryptBoxB64; export const _decryptAssociatedData = libsodium.decryptBlob; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index db560d7bbd..afd7ceb606 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -64,9 +64,9 @@ import type { * Some of these functions have not yet been needed on the main thread, and for * these we don't have a corresponding sharedCryptoWorker method. * - * This assertion will let us know when we need to implement them (this'll + * This assertion will let us know when we need to implement them. This will * gracefully degrade in production: the functionality will work, just that the - * crypto will happen on the main thread itself). + * crypto operations will happen on the main thread itself. */ const assertInWorker = (x: T): T => { if (!inWorker()) assertionFailed("Currently only usable in a web worker"); @@ -74,13 +74,13 @@ const assertInWorker = (x: T): T => { }; /** - * Encrypt the given data, returning a box containing encrypted data and a - * randomly generated nonce. + * Encrypt the given data, returning a box containing the encrypted data and a + * randomly generated nonce that was used during encryption. + * + * Both the encrypted data and the nonce are returned as base64 strings. * * Use {@link decryptBoxB64} to decrypt the result. * - * ee {@link encryptBox} for the implementation details. - * * > The suffix "Box" comes from the fact that it uses the so called secretbox * > APIs provided by libsodium under the hood. * > @@ -142,16 +142,8 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); /** - * Decrypt a box encrypted using {@link encryptBox}. - */ -export const decryptBox = (b: EncryptedBox2, k: BytesOrB64) => - inWorker() - ? ei._decryptBox(b, k) - : sharedCryptoWorker().then((w) => w.decryptBox(b, k)); - -/** - * Variant of {@link decryptBox} that returns the decrypted data as a base64 - * string. + * Decrypt a box encrypted using {@link encryptBoxB64}, and return the result as + * a base64 string. */ export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => inWorker() diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index f1b537e62e..2937d1a7ba 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -378,9 +378,14 @@ export const decryptBox = async ({ }; /** - * Decrypt the result of {@link encryptBox}. + * Decrypt the result of {@link encryptBoxB64}. */ -export const decryptBox2 = async ( +export const decryptBoxB64 = ( + box: EncryptedBox2, + key: BytesOrB64, +): Promise => _decryptBox(box, key).then(toB64); + +export const _decryptBox = async ( { encryptedData, nonce }: EncryptedBox2, key: BytesOrB64, ): Promise => { diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 0824fa7286..8795267338 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -1,10 +1,11 @@ /** - * Data provided either as bytes ({@link Uint8Array}) or their base64 string representation. + * Data provided either as bytes ({@link Uint8Array}) or their base64 string + * representation. */ export type BytesOrB64 = Uint8Array | string; /** - * An encryption request + * An encryption request. */ export interface EncryptBytesOrB64 { /** diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 13e36c546d..72ae1fb332 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -15,7 +15,6 @@ export class CryptoWorker { encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; - decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; decryptThumbnail = ei._decryptThumbnail; decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; From d1b7177a53c9cb21a45b2d052d31e92f56c94f1d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 18:49:41 +0530 Subject: [PATCH 0362/1179] We need both --- web/packages/base/crypto/ente-impl.ts | 2 ++ web/packages/base/crypto/ente.ts | 11 +++++++++-- web/packages/base/crypto/libsodium.ts | 15 +++++++++------ web/packages/base/crypto/worker.ts | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 71ecc88b7a..305cee31e7 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -31,6 +31,8 @@ export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => keyB64, }); +export const _decryptBox = libsodium.decryptBox2; + export const _decryptBoxB64 = libsodium.decryptBoxB64; export const _decryptAssociatedData = libsodium.decryptBlob; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index afd7ceb606..01682c2ec5 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -142,8 +142,15 @@ export const encryptMetadataJSON = async (r: EncryptJSON) => : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); /** - * Decrypt a box encrypted using {@link encryptBoxB64}, and return the result as - * a base64 string. + * Decrypt a box encrypted using {@link encryptBoxB64}. + */ +export const decryptBox = (box: EncryptedBox2, key: BytesOrB64) => + inWorker() + ? ei._decryptBox(box, key) + : sharedCryptoWorker().then((w) => w.decryptBox(box, key)); + +/** + * Variant of {@link decryptBoxlink} that returns the result as a base64 string. */ export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => inWorker() diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 2937d1a7ba..bb19f53f6e 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -380,12 +380,7 @@ export const decryptBox = async ({ /** * Decrypt the result of {@link encryptBoxB64}. */ -export const decryptBoxB64 = ( - box: EncryptedBox2, - key: BytesOrB64, -): Promise => _decryptBox(box, key).then(toB64); - -export const _decryptBox = async ( +export const decryptBox2 = async ( { encryptedData, nonce }: EncryptedBox2, key: BytesOrB64, ): Promise => { @@ -397,6 +392,14 @@ export const _decryptBox = async ( ); }; +/** + * Variant of {@link decryptBox} that returns the data as a base64 string. + */ +export const decryptBoxB64 = ( + box: EncryptedBox2, + key: BytesOrB64, +): Promise => decryptBox2(box, key).then(toB64); + /** * Decrypt the result of {@link encryptBlob}. */ diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 72ae1fb332..13e36c546d 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -15,6 +15,7 @@ export class CryptoWorker { encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; encryptMetadataJSON = ei._encryptMetadataJSON; + decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; decryptThumbnail = ei._decryptThumbnail; decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; From 90ffb68b514d8495e0d2a3981e9beb33e2c9a9e0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 18:53:00 +0530 Subject: [PATCH 0363/1179] key variants too --- web/packages/base/session-store.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts index f2a4ebd86c..26782ce964 100644 --- a/web/packages/base/session-store.ts +++ b/web/packages/base/session-store.ts @@ -1,12 +1,13 @@ -import { sharedCryptoWorker } from "@/base/crypto"; import { z } from "zod"; +import { decryptBox } from "./crypto/ente"; +import { toB64 } from "./crypto/libsodium"; /** * Return the user's master key (as a base64 string) from session storage. * * Precondition: The user should be logged in. */ -export const masterKeyB64FromSession = async () => { +export const masterKeyFromSession = async () => { // TODO: Same value as the deprecated SESSION_KEYS.ENCRYPTION_KEY. const value = sessionStorage.getItem("encryptionKey"); if (!value) { @@ -19,10 +20,15 @@ export const masterKeyB64FromSession = async () => { JSON.parse(value), ); - const cryptoWorker = await sharedCryptoWorker(); - return cryptoWorker.decryptB64(encryptedData, nonce, key); + return decryptBox({ encryptedData, nonce }, key); }; +/** + * Variant of {@link masterKeyFromSession} that returns the master key as a + * base64 string. + */ +export const masterKeyB64FromSession = () => masterKeyFromSession().then(toB64); + // TODO: Same as B64EncryptionResult. Revisit. const EncryptionKeyAttributes = z.object({ encryptedData: z.string(), From 5c0935973861144aa3a21d3bb7139d2062db16da Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 18:54:50 +0530 Subject: [PATCH 0364/1179] Remove unnecessary conversion --- web/packages/new/photos/services/user-entity.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 5902573088..fc9865b6eb 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -2,7 +2,7 @@ import { decryptAssociatedDataB64, decryptBoxB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; -import { masterKeyB64FromSession } from "@/base/session-store"; +import { masterKeyFromSession } from "@/base/session-store"; import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; @@ -236,17 +236,14 @@ const saveRemoteUserEntityKey = ( /** * Decrypt an encrypted entity key using the user's master key. */ -const decryptEntityKey = async ({ - encryptedKey, - header, -}: RemoteUserEntityKey) => +const decryptEntityKey = async (remote: RemoteUserEntityKey) => decryptBoxB64( { - encryptedData: encryptedKey, + encryptedData: remote.encryptedKey, // Remote calls it the header, but it really is the nonce. - nonce: header, + nonce: remote.header, }, - await masterKeyB64FromSession(), + await masterKeyFromSession(), ); /** From fbc6137b3e5521fc345a82de7191458d2fccbb9e Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 17 Aug 2024 19:33:54 +0530 Subject: [PATCH 0365/1179] [mob][auth] Directly route to appLock in case of no systemLock found --- auth/lib/ui/settings/security_section_widget.dart | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/auth/lib/ui/settings/security_section_widget.dart b/auth/lib/ui/settings/security_section_widget.dart index 9ba4289a36..38fa19f4a4 100644 --- a/auth/lib/ui/settings/security_section_widget.dart +++ b/auth/lib/ui/settings/security_section_widget.dart @@ -144,11 +144,10 @@ class _SecuritySectionWidgetState extends State { trailingIcon: Icons.chevron_right_outlined, trailingIconIsMuted: true, onTap: () async { - if (await LocalAuthenticationService.instance - .isLocalAuthSupportedOnDevice()) { + if (await Configuration.instance.shouldShowLockScreen()) { final bool result = await requestAuthentication( context, - context.l10n.authToChangeLockscreenSetting, + context.l10n.about, ); if (result) { await Navigator.of(context).push( @@ -160,10 +159,12 @@ class _SecuritySectionWidgetState extends State { ); } } else { - await showErrorDialog( - context, - context.l10n.noSystemLockFound, - context.l10n.toEnableAppLockPleaseSetupDevicePasscodeOrScreen, + await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return const LockScreenOptions(); + }, + ), ); } }, From 3a4246b82d5d6e262c29a277318d53236cd2c4b8 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 17 Aug 2024 19:47:10 +0530 Subject: [PATCH 0366/1179] [mob][auth] Added key to check if appLock is set or not --- auth/lib/utils/lock_screen_settings.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/auth/lib/utils/lock_screen_settings.dart b/auth/lib/utils/lock_screen_settings.dart index 6b45bc09dc..1235c95e15 100644 --- a/auth/lib/utils/lock_screen_settings.dart +++ b/auth/lib/utils/lock_screen_settings.dart @@ -19,6 +19,7 @@ class LockScreenSettings { static const lastInvalidAttemptTime = "ls_last_invalid_attempt_time"; static const autoLockTime = "ls_auto_lock_time"; static const keyHideAppContent = "ls_hide_app_content"; + static const keyAppLockSet = "ls_is_app_lock_set"; final List autoLockDurations = const [ Duration(seconds: 0), Duration(seconds: 5), @@ -83,6 +84,14 @@ class LockScreenSettings { await _preferences.setInt(keyInvalidAttempts, count); } + Future isAppLockSet(bool value) async { + await _preferences.setBool(keyAppLockSet, value); + } + + bool getIsAppLockSet() { + return _preferences.getBool(keyAppLockSet) ?? false; + } + static Uint8List _generateSalt() { return sodium.randombytes.buf(sodium.crypto.pwhash.saltBytes); } From f338e408763562dc368384f3184faf3984137dfb Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 17 Aug 2024 19:48:06 +0530 Subject: [PATCH 0367/1179] [mob][auth] Option to add pin/passcode without a having a systemLock --- .../lock_screen/lock_screen_options.dart | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart index 2c600a0d1d..29965a3b6c 100644 --- a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart +++ b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart @@ -3,6 +3,7 @@ import "dart:io"; import "package:ente_auth/core/configuration.dart"; import "package:ente_auth/l10n/l10n.dart"; +import "package:ente_auth/services/local_authentication_service.dart"; import "package:ente_auth/theme/ente_theme.dart"; import "package:ente_auth/ui/components/captioned_text_widget.dart"; import "package:ente_auth/ui/components/divider_widget.dart"; @@ -14,6 +15,7 @@ import "package:ente_auth/ui/settings/lock_screen/lock_screen_auto_lock.dart"; import "package:ente_auth/ui/settings/lock_screen/lock_screen_password.dart"; import "package:ente_auth/ui/settings/lock_screen/lock_screen_pin.dart"; import "package:ente_auth/ui/tools/app_lock.dart"; +import "package:ente_auth/utils/dialog_util.dart"; import "package:ente_auth/utils/lock_screen_settings.dart"; import "package:ente_auth/utils/navigation_util.dart"; import "package:ente_auth/utils/platform_util.dart"; @@ -29,11 +31,12 @@ class LockScreenOptions extends StatefulWidget { class _LockScreenOptionsState extends State { final Configuration _configuration = Configuration.instance; final LockScreenSettings _lockscreenSetting = LockScreenSettings.instance; - late bool appLock; + late bool appLock = false; bool isPinEnabled = false; bool isPasswordEnabled = false; late int autoLockTimeInMilliseconds; late bool hideAppContent; + late bool isSystemLockEnabled = false; @override void initState() { @@ -41,9 +44,10 @@ class _LockScreenOptionsState extends State { hideAppContent = _lockscreenSetting.getShouldHideAppContent(); autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime(); _initializeSettings(); - appLock = isPinEnabled || + appLock = _lockscreenSetting.getIsAppLockSet() || + _configuration.shouldShowSystemLockScreen() || isPasswordEnabled || - _configuration.shouldShowSystemLockScreen(); + isPinEnabled; } Future _initializeSettings() async { @@ -51,15 +55,27 @@ class _LockScreenOptionsState extends State { final bool pinEnabled = await _lockscreenSetting.isPinSet(); final bool shouldHideAppContent = _lockscreenSetting.getShouldHideAppContent(); + final bool systemLockEnabled = _configuration.shouldShowSystemLockScreen(); setState(() { isPasswordEnabled = passwordEnabled; isPinEnabled = pinEnabled; hideAppContent = shouldHideAppContent; + isSystemLockEnabled = systemLockEnabled; }); } Future _deviceLock() async { - await _lockscreenSetting.removePinAndPassword(); + if (await LocalAuthenticationService.instance + .isLocalAuthSupportedOnDevice()) { + await _lockscreenSetting.removePinAndPassword(); + await _configuration.setSystemLockScreen(!isSystemLockEnabled); + } else { + await showErrorDialog( + context, + context.l10n.noSystemLockFound, + context.l10n.toEnableAppLockPleaseSetupDevicePasscodeOrScreen, + ); + } await _initializeSettings(); } @@ -71,12 +87,11 @@ class _LockScreenOptionsState extends State { }, ), ); + await _lockscreenSetting.isAppLockSet(result); + await _initializeSettings(); setState(() { - _initializeSettings(); if (result) { - appLock = isPinEnabled || - isPasswordEnabled || - _configuration.shouldShowSystemLockScreen(); + appLock = _lockscreenSetting.getIsAppLockSet(); } }); } @@ -89,27 +104,30 @@ class _LockScreenOptionsState extends State { }, ), ); + + await _lockscreenSetting.isAppLockSet(result); + await _initializeSettings(); setState(() { - _initializeSettings(); if (result) { - appLock = isPinEnabled || - isPasswordEnabled || - _configuration.shouldShowSystemLockScreen(); + appLock = _lockscreenSetting.getIsAppLockSet(); } }); } Future _onToggleSwitch() async { AppLock.of(context)!.setEnabled(!appLock); - await _configuration.setSystemLockScreen(!appLock); + await _configuration.setSystemLockScreen(false); await _lockscreenSetting.removePinAndPassword(); + await _lockscreenSetting.isAppLockSet(false); if (PlatformUtil.isMobile()) { await _lockscreenSetting.setHideAppContent(!appLock); + setState(() { + hideAppContent = _lockscreenSetting.getShouldHideAppContent(); + }); } + await _initializeSettings(); setState(() { - _initializeSettings(); appLock = !appLock; - hideAppContent = _lockscreenSetting.getShouldHideAppContent(); }); } @@ -224,10 +242,9 @@ class _LockScreenOptionsState extends State { isTopBorderRadiusRemoved: false, isBottomBorderRadiusRemoved: true, menuItemColor: colorTheme.fillFaint, - trailingIcon: - !(isPasswordEnabled || isPinEnabled) - ? Icons.check - : null, + trailingIcon: isSystemLockEnabled + ? Icons.check + : null, trailingIconColor: colorTheme.textBase, onTap: () => _deviceLock(), ), From 360113c3aca2a4f2d0f38acb1d22796077ebbafe Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:21:36 +0530 Subject: [PATCH 0368/1179] Use newer pattern in more places --- .../src/services/upload/uploadService.ts | 7 +-- web/packages/base/crypto/ente-impl.ts | 47 +++++++++--------- web/packages/base/crypto/ente.ts | 43 +++++++++------- web/packages/base/crypto/libsodium.ts | 49 ++++++++++++++----- web/packages/base/crypto/types.ts | 42 ++++++++++++++++ web/packages/new/photos/services/file-data.ts | 12 +++-- 6 files changed, 136 insertions(+), 64 deletions(-) diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index 42c2706105..fca23c01b0 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -1119,11 +1119,8 @@ const encryptFile = async ( const { encryptedData: thumbEncryptedData, - decryptionHeaderB64: thumbDecryptionHeader, - } = await worker.encryptThumbnail({ - data: file.thumbnail, - keyB64: fileKey, - }); + decryptionHeader: thumbDecryptionHeader, + } = await worker.encryptThumbnail(file.thumbnail, fileKey); const encryptedThumbnail = { encryptedData: thumbEncryptedData, decryptionHeader: thumbDecryptionHeader, diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 305cee31e7..d928d3a8e1 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,35 +1,36 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; -import type { - DecryptBlobB64, - EncryptBytes, - EncryptedBlobB64, - EncryptedBlobBytes, - EncryptJSON, -} from "./types"; - -const EncryptedBlobBytesToB64 = async ({ - encryptedData, - decryptionHeaderB64, -}: EncryptedBlobBytes): Promise => ({ - encryptedDataB64: await libsodium.toB64(encryptedData), - decryptionHeaderB64, -}); +import type { BytesOrB64, DecryptBlobB64, EncryptJSON } from "./types"; export const _encryptBoxB64 = libsodium.encryptBoxB64; -export const _encryptAssociatedData = libsodium.encryptBlob; +export const _encryptBlob = libsodium.encryptBlob; -export const _encryptThumbnail = _encryptAssociatedData; +export const _encryptBlobB64 = libsodium.encryptBlobB64; -export const _encryptAssociatedDataB64 = (r: EncryptBytes) => - _encryptAssociatedData(r).then(EncryptedBlobBytesToB64); +export const _encryptThumbnail = async (data: BytesOrB64, key: BytesOrB64) => { + const { encryptedData, decryptionHeader } = await _encryptBlob(data, key); + return { + encryptedData, + decryptionHeader: await libsodium.toB64(decryptionHeader), + }; +}; -export const _encryptMetadataJSON = ({ jsonValue, keyB64 }: EncryptJSON) => - _encryptAssociatedDataB64({ - data: new TextEncoder().encode(JSON.stringify(jsonValue)), +export const _encryptMetadataJSON_New = ({ jsonValue, keyB64 }: EncryptJSON) => + _encryptBlobB64( + new TextEncoder().encode(JSON.stringify(jsonValue)), keyB64, - }); + ); + +export const _encryptMetadataJSON = async (r: EncryptJSON) => { + // Deprecated. Keep the old API for now. + const { encryptedData, decryptionHeader } = + await _encryptMetadataJSON_New(r); + return { + encryptedDataB64: encryptedData, + decryptionHeaderB64: decryptionHeader, + }; +}; export const _decryptBox = libsodium.decryptBox2; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 01682c2ec5..9265f615a9 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -55,7 +55,6 @@ import type { BytesOrB64, DecryptBlobB64, DecryptBlobBytes, - EncryptBytes, EncryptedBox2, EncryptJSON, } from "./types"; @@ -92,34 +91,40 @@ export const encryptBoxB64 = (data: BytesOrB64, key: BytesOrB64) => : sharedCryptoWorker().then((w) => w.encryptBoxB64(data, key)); /** - * Encrypt arbitrary data associated with an Ente object (file, collection, - * entity) using the object's key. + * Encrypt the given data, returning a blob containing the encrypted data and a + * decryption header. * - * Use {@link decryptAssociatedData} to decrypt the result. + * This function is usually used to encrypt data associated with an Ente object + * (file, collection, entity) using the object's key. * - * See {@link encryptBlob} for the implementation details. + * Use {@link decryptBlobB64} to decrypt the result. + * + * > The suffix "Blob" comes from our convention of naming functions that use + * > the secretstream APIs in one-shot mode. + * > + * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] */ -export const encryptAssociatedData = (r: EncryptBytes) => - assertInWorker(ei._encryptAssociatedData(r)); +export const encryptBlob = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptBlob(data, key)); + +/** + * A variant of {@link encryptBlob} that returns the result components as base64 + * strings. + */ +export const encryptBlobB64 = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptBlobB64(data, key)); /** * Encrypt the thumbnail for a file. * - * This is just an alias for {@link encryptAssociatedData}. + * This is midway variant of {@link encryptBlob} and {@link encryptBlobB64} that + * returns the decryption header as a base64 string, but leaves the data + * unchanged. * * Use {@link decryptThumbnail} to decrypt the result. */ -export const encryptThumbnail = (r: EncryptBytes) => - assertInWorker(ei._encryptThumbnail(r)); - -/** - * A variant of {@link encryptAssociatedData} that returns the encrypted data as - * a base64 string instead of returning its bytes. - * - * Use {@link decryptAssociatedDataB64} to decrypt the result. - */ -export const encryptAssociatedDataB64 = (r: EncryptBytes) => - assertInWorker(ei._encryptAssociatedDataB64(r)); +export const encryptThumbnail = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptThumbnail(data, key)); /** * Encrypt the JSON metadata associated with an Ente object (file, collection or diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index bb19f53f6e..73e96a6078 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -16,7 +16,8 @@ import type { DecryptBlobBytes, DecryptBoxBytes, EncryptBytes, - EncryptedBlobBytes, + EncryptedBlob_2, + EncryptedBlobB64_2, EncryptedBox2, EncryptedBoxB64, EncryptedBoxBytes, @@ -140,6 +141,8 @@ const bytes = async (bob: BytesOrB64) => * * @param key The key to use for encryption. * + * @returns The encrypted data and the generated nonce, both as base64 strings. + * * [Note: 3 forms of encryption (Box | Blob | Stream)] * * libsodium provides two "high level" encryption patterns: @@ -240,7 +243,8 @@ export const encryptBoxB64 = async ( }; }; -export const encryptBox = async ({ +/** deprecated + needs rename */ +const encryptBox = async ({ data, keyB64, }: EncryptBytes): Promise => { @@ -255,22 +259,27 @@ export const encryptBox = async ({ }; /** - * Encrypt the given data using secretstream APIs in one-shot mode, using the - * given base64 encoded key. + * Encrypt the given data using libsodium's secretstream APIs in one-shot mode. * * Use {@link decryptBlob} to decrypt the result. * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + * @param data The data to encrypt. * - * See: https://doc.libsodium.org/secret-key_cryptography/secretstream + * @param key The key to use for encryption. + * + * @returns The encrypted data and the decryption header as {@link Uint8Array}s. + * + * - See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + * + * - See: https://doc.libsodium.org/secret-key_cryptography/secretstream */ -export const encryptBlob = async ({ - data, - keyB64, -}: EncryptBytes): Promise => { +export const encryptBlob = async ( + data: BytesOrB64, + key: BytesOrB64, +): Promise => { await sodium.ready; - const uintkey: Uint8Array = await fromB64(keyB64); + const uintkey = await bytes(key); const initPushResult = sodium.crypto_secretstream_xchacha20poly1305_init_push(uintkey); const [pushState, header] = [initPushResult.state, initPushResult.header]; @@ -283,10 +292,26 @@ export const encryptBlob = async ({ ); return { encryptedData: pushResult, - decryptionHeaderB64: await toB64(header), + decryptionHeader: header, }; }; +/** + * A variant of {@link encryptBlob} that returns the both the encrypted data and + * decryption header as base64 strings. + */ +export const encryptBlobB64 = async ( + data: BytesOrB64, + key: BytesOrB64, +): Promise => { + const { encryptedData, decryptionHeader} = await encryptBlob(data, key); + return { + encryptedData: await toB64(encryptedData), + decryptionHeader: await toB64(decryptionHeader), + }; +}; + + export const ENCRYPTION_CHUNK_SIZE = 4 * 1024 * 1024; export const encryptChaCha = async (data: Uint8Array) => { diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 8795267338..19e4e1e7eb 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -100,6 +100,48 @@ export interface EncryptedBoxB64 { nonce: string; } +/** + * The result of encryption using the secretstream APIs in one-shot mode. + * + * It contains an encrypted data and a header that should be provided during + * decryption. The header does not need to be secret. + * + * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + */ +export interface EncryptedBlob_2 { + /** + * The encrypted data. + */ + encryptedData: Uint8Array; + /** + * The decryption header. + * + * While the exact contents of the header are libsodium's internal details, + * it effectively contains a random nonce generated by libsodium. It does + * not need to be secret, but it is required to decrypt the data. + */ + decryptionHeader: Uint8Array; +} + +/** + * A variant of {@link EncryptedBlob_2} that has the encrypted data and header + * as base64 strings. + */ +export interface EncryptedBlobB64_2 { + /** + * The encrypted data as a base64 string. + */ + encryptedData: string; + /** + * A base64 string containing the decryption header. + * + * While the exact contents of the header are libsodium's internal details, + * it effectively contains a random nonce generated by libsodium. It does + * not need to be secret, but it is required to decrypt the data. + */ + decryptionHeader: string; +} + /** * The result of encryption using the secretbox APIs. * diff --git a/web/packages/new/photos/services/file-data.ts b/web/packages/new/photos/services/file-data.ts index 0b3f1ef0b8..df4ddbf9f4 100644 --- a/web/packages/new/photos/services/file-data.ts +++ b/web/packages/new/photos/services/file-data.ts @@ -1,4 +1,4 @@ -import { encryptAssociatedDataB64 } from "@/base/crypto/ente"; +import { encryptBlobB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import type { EnteFile } from "@/new/photos/types/file"; @@ -94,8 +94,10 @@ export const putFileData = async ( type: FileDataType, data: Uint8Array, ) => { - const { encryptedDataB64, decryptionHeaderB64 } = - await encryptAssociatedDataB64({ data: data, keyB64: enteFile.key }); + const { encryptedData, decryptionHeader } = await encryptBlobB64( + data, + enteFile.key, + ); const res = await fetch(await apiURL("/files/data"), { method: "PUT", @@ -103,8 +105,8 @@ export const putFileData = async ( body: JSON.stringify({ fileID: enteFile.id, type, - encryptedData: encryptedDataB64, - decryptionHeader: decryptionHeaderB64, + encryptedData, + decryptionHeader, }), }); ensureOk(res); From 2775917e44536b46fd855935d588b606ce8f4164 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:44:15 +0530 Subject: [PATCH 0369/1179] Parallel hierarchy --- web/packages/base/crypto/ente-impl.ts | 4 ++++ web/packages/base/crypto/ente.ts | 20 ++++++++++++++-- web/packages/base/crypto/libsodium.ts | 34 ++++++++++++++++++++++++--- web/packages/base/crypto/types.ts | 23 ++++++++++++++++++ web/packages/base/crypto/worker.ts | 1 + 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index d928d3a8e1..875510f0bf 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -36,6 +36,10 @@ export const _decryptBox = libsodium.decryptBox2; export const _decryptBoxB64 = libsodium.decryptBoxB64; +export const _decryptBlob = libsodium.decryptBlob2; + +export const _decryptBlobB64 = libsodium.decryptBlobB64; + export const _decryptAssociatedData = libsodium.decryptBlob; export const _decryptThumbnail = _decryptAssociatedData; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 9265f615a9..f568e6ed5e 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -55,6 +55,7 @@ import type { BytesOrB64, DecryptBlobB64, DecryptBlobBytes, + EncryptedBlob_2, EncryptedBox2, EncryptJSON, } from "./types"; @@ -97,7 +98,7 @@ export const encryptBoxB64 = (data: BytesOrB64, key: BytesOrB64) => * This function is usually used to encrypt data associated with an Ente object * (file, collection, entity) using the object's key. * - * Use {@link decryptBlobB64} to decrypt the result. + * Use {@link decryptBlob} to decrypt the result. * * > The suffix "Blob" comes from our convention of naming functions that use * > the secretstream APIs in one-shot mode. @@ -155,13 +156,28 @@ export const decryptBox = (box: EncryptedBox2, key: BytesOrB64) => : sharedCryptoWorker().then((w) => w.decryptBox(box, key)); /** - * Variant of {@link decryptBoxlink} that returns the result as a base64 string. + * Variant of {@link decryptBox} that returns the result as a base64 string. */ export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => inWorker() ? ei._decryptBoxB64(box, key) : sharedCryptoWorker().then((w) => w.decryptBoxB64(box, key)); +/** + * Decrypt a blob encrypted using either {@link encryptBlob} or + * {@link encryptBlobB64}. + */ +export const decryptBlob = (blob: EncryptedBlob_2, key: BytesOrB64) => + assertInWorker(ei._decryptBlob(blob, key)); + +/** + * A variant of {@link decryptBlob} that returns the result as a base64 string. + */ +export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => + inWorker() + ? ei._decryptBlobB64(blob, key) + : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); + /** * Decrypt arbitrary data associated with an Ente object (file, collection or * entity) using the object's key. diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 73e96a6078..f49ee4e2a1 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -18,6 +18,7 @@ import type { EncryptBytes, EncryptedBlob_2, EncryptedBlobB64_2, + EncryptedBlobBytes_2, EncryptedBox2, EncryptedBoxB64, EncryptedBoxBytes, @@ -276,7 +277,7 @@ const encryptBox = async ({ export const encryptBlob = async ( data: BytesOrB64, key: BytesOrB64, -): Promise => { +): Promise => { await sodium.ready; const uintkey = await bytes(key); @@ -304,14 +305,13 @@ export const encryptBlobB64 = async ( data: BytesOrB64, key: BytesOrB64, ): Promise => { - const { encryptedData, decryptionHeader} = await encryptBlob(data, key); + const { encryptedData, decryptionHeader } = await encryptBlob(data, key); return { encryptedData: await toB64(encryptedData), decryptionHeader: await toB64(decryptionHeader), }; }; - export const ENCRYPTION_CHUNK_SIZE = 4 * 1024 * 1024; export const encryptChaCha = async (data: Uint8Array) => { @@ -425,6 +425,34 @@ export const decryptBoxB64 = ( key: BytesOrB64, ): Promise => decryptBox2(box, key).then(toB64); +/** + * Decrypt the result of {@link encryptBlob} or {@link encryptBlobB64}. + */ +export const decryptBlob2 = async ( + { encryptedData, decryptionHeader }: EncryptedBlob_2, + key: BytesOrB64, +): Promise => { + await sodium.ready; + const pullState = sodium.crypto_secretstream_xchacha20poly1305_init_pull( + await bytes(decryptionHeader), + await bytes(key), + ); + const pullResult = sodium.crypto_secretstream_xchacha20poly1305_pull( + pullState, + await bytes(encryptedData), + null, + ); + return pullResult.message; +}; + +/** + * A variant of {@link decryptBlob2} that returns the result as a base64 string. + */ +export const decryptBlobB64 = ( + blob: EncryptedBlob_2, + key: BytesOrB64, +): Promise => decryptBlob2(blob, key).then(toB64); + /** * Decrypt the result of {@link encryptBlob}. */ diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 19e4e1e7eb..9dd2e30e37 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -107,8 +107,31 @@ export interface EncryptedBoxB64 { * decryption. The header does not need to be secret. * * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. + * + * This type is a combination of {@link EncryptedBlobBytes_2} and + * {@link EncryptedBlobB64_2} which allows the decryption routines to accept + * either the bytes or the base64 variants produced by the encryption routines. */ export interface EncryptedBlob_2 { + /** + * The encrypted data. + */ + encryptedData: BytesOrB64; + /** + * The decryption header. + * + * While the exact contents of the header are libsodium's internal details, + * it effectively contains a random nonce generated by libsodium. It does + * not need to be secret, but it is required to decrypt the data. + */ + decryptionHeader: BytesOrB64; +} + +/** + * A variant of {@link EncryptedBlob_2} that has the encrypted data and header + * as bytes ({@link Uint8Array}s). + */ +export interface EncryptedBlobBytes_2 { /** * The encrypted data. */ diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 13e36c546d..1e8b930d38 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -17,6 +17,7 @@ export class CryptoWorker { encryptMetadataJSON = ei._encryptMetadataJSON; decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; + decryptBlobB64 = ei._decryptBlobB64; decryptThumbnail = ei._decryptThumbnail; decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; decryptMetadataJSON = ei._decryptMetadataJSON; From 4fa3b177c6f486c2208858346c840fb50a943794 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:48:41 +0530 Subject: [PATCH 0370/1179] Use --- web/packages/base/crypto/ente.ts | 11 ----------- web/packages/new/photos/services/ml/ml-data.ts | 8 ++------ 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index f568e6ed5e..b943e886a0 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -178,17 +178,6 @@ export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => ? ei._decryptBlobB64(blob, key) : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); -/** - * Decrypt arbitrary data associated with an Ente object (file, collection or - * entity) using the object's key. - * - * This is the sibling of {@link encryptAssociatedData}. - * - * See {@link decryptBlob} for the implementation details. - */ -export const decryptAssociatedData = (r: DecryptBlobBytes) => - assertInWorker(ei._decryptAssociatedData(r)); - /** * Decrypt the thumbnail for a file. * diff --git a/web/packages/new/photos/services/ml/ml-data.ts b/web/packages/new/photos/services/ml/ml-data.ts index 4c82ef426f..d9ec5a8425 100644 --- a/web/packages/new/photos/services/ml/ml-data.ts +++ b/web/packages/new/photos/services/ml/ml-data.ts @@ -1,4 +1,4 @@ -import { decryptAssociatedDataB64 } from "@/base/crypto/ente"; +import { decryptBlob } from "@/base/crypto/ente"; import log from "@/base/log"; import type { EnteFile } from "@/new/photos/types/file"; import { nullToUndefined } from "@/utils/transform"; @@ -172,11 +172,7 @@ export const fetchMLData = async ( } try { - const decryptedBytes = await decryptAssociatedDataB64({ - encryptedDataB64: remoteFileData.encryptedData, - decryptionHeaderB64: remoteFileData.decryptionHeader, - keyB64: file.key, - }); + const decryptedBytes = await decryptBlob(remoteFileData, file.key); const jsonString = await gunzip(decryptedBytes); result.set(fileID, remoteMLDataFromJSONString(jsonString)); } catch (e) { From 0fcd21f61d1585c1200fb6af1fdd22c52a5a2181 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:52:24 +0530 Subject: [PATCH 0371/1179] Use --- web/packages/base/crypto/ente.ts | 10 ---------- web/packages/base/crypto/worker.ts | 1 - web/packages/new/photos/services/user-entity.ts | 10 +++------- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index b943e886a0..2ce57f3395 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -186,16 +186,6 @@ export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => export const decryptThumbnail = (r: DecryptBlobBytes) => assertInWorker(ei._decryptThumbnail(r)); -/** - * A variant of {@link decryptAssociatedData} that expects the encrypted data as - * a base64 encoded string. - * - * This is the sibling of {@link encryptAssociatedDataB64}. - */ -export const decryptAssociatedDataB64 = (r: DecryptBlobB64) => - inWorker() - ? ei._decryptAssociatedDataB64(r) - : sharedCryptoWorker().then((w) => w.decryptAssociatedDataB64(r)); /** * Decrypt the metadata JSON associated with an Ente object. * diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 1e8b930d38..547a458d8a 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -19,7 +19,6 @@ export class CryptoWorker { decryptBoxB64 = ei._decryptBoxB64; decryptBlobB64 = ei._decryptBlobB64; decryptThumbnail = ei._decryptThumbnail; - decryptAssociatedDataB64 = ei._decryptAssociatedDataB64; decryptMetadataJSON = ei._decryptMetadataJSON; // TODO: -- AUDIT BELOW -- diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index fc9865b6eb..7ea981df09 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,4 +1,4 @@ -import { decryptAssociatedDataB64, decryptBoxB64 } from "@/base/crypto/ente"; +import { decryptBlob, decryptBoxB64 } from "@/base/crypto/ente"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; @@ -134,12 +134,8 @@ const userEntityDiff = async ( sinceTime: number, entityKeyB64: string, ): Promise => { - const decrypt = (encryptedDataB64: string, decryptionHeaderB64: string) => - decryptAssociatedDataB64({ - encryptedDataB64, - decryptionHeaderB64, - keyB64: entityKeyB64, - }); + const decrypt = (encryptedData: string, decryptionHeader: string) => + decryptBlob({ encryptedData, decryptionHeader }, entityKeyB64); const params = new URLSearchParams({ type, From fdfaadfb1e683c1fd14741ab4784be1583af3877 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:56:05 +0530 Subject: [PATCH 0372/1179] Use --- web/packages/base/crypto/ente-impl.ts | 2 +- web/packages/base/crypto/ente.ts | 9 +++------ web/packages/new/photos/services/download.ts | 12 +++++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 875510f0bf..b1be404067 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -42,7 +42,7 @@ export const _decryptBlobB64 = libsodium.decryptBlobB64; export const _decryptAssociatedData = libsodium.decryptBlob; -export const _decryptThumbnail = _decryptAssociatedData; +export const _decryptThumbnail = _decryptBlob; export const _decryptAssociatedDataB64 = async ({ encryptedDataB64, diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 2ce57f3395..95d0ce5aed 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -54,7 +54,6 @@ import * as ei from "./ente-impl"; import type { BytesOrB64, DecryptBlobB64, - DecryptBlobBytes, EncryptedBlob_2, EncryptedBox2, EncryptJSON, @@ -179,12 +178,10 @@ export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); /** - * Decrypt the thumbnail for a file. - * - * This is the sibling of {@link encryptThumbnail}. + * Decrypt the thumbnail encrypted using {@link encryptThumbnail}. */ -export const decryptThumbnail = (r: DecryptBlobBytes) => - assertInWorker(ei._decryptThumbnail(r)); +export const decryptThumbnail = (blob: EncryptedBlob_2, key: BytesOrB64) => + assertInWorker(ei._decryptThumbnail(blob, key)); /** * Decrypt the metadata JSON associated with an Ente object. diff --git a/web/packages/new/photos/services/download.ts b/web/packages/new/photos/services/download.ts index a5b06c27cf..47a0dbfa58 100644 --- a/web/packages/new/photos/services/download.ts +++ b/web/packages/new/photos/services/download.ts @@ -124,11 +124,13 @@ class DownloadManagerImpl { const { downloadClient, cryptoWorker } = this.ensureInitialized(); const encrypted = await downloadClient.downloadThumbnail(file); - const decrypted = await cryptoWorker.decryptThumbnail({ - encryptedData: encrypted, - decryptionHeaderB64: file.thumbnail.decryptionHeader, - keyB64: file.key, - }); + const decrypted = await cryptoWorker.decryptThumbnail( + { + encryptedData: encrypted, + decryptionHeader: file.thumbnail.decryptionHeader, + }, + file.key, + ); return decrypted; }; From 68e5d842e5385c4d614e5fb06fccca326a5ebf22 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 20:57:20 +0530 Subject: [PATCH 0373/1179] Tweak --- web/packages/new/photos/services/download.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/web/packages/new/photos/services/download.ts b/web/packages/new/photos/services/download.ts index 47a0dbfa58..a3f52e73c2 100644 --- a/web/packages/new/photos/services/download.ts +++ b/web/packages/new/photos/services/download.ts @@ -123,15 +123,12 @@ class DownloadManagerImpl { private downloadThumb = async (file: EnteFile) => { const { downloadClient, cryptoWorker } = this.ensureInitialized(); - const encrypted = await downloadClient.downloadThumbnail(file); - const decrypted = await cryptoWorker.decryptThumbnail( - { - encryptedData: encrypted, - decryptionHeader: file.thumbnail.decryptionHeader, - }, + const encryptedData = await downloadClient.downloadThumbnail(file); + const decryptionHeader = file.thumbnail.decryptionHeader; + return cryptoWorker.decryptThumbnail( + { encryptedData, decryptionHeader }, file.key, ); - return decrypted; }; async getThumbnail(file: EnteFile, localOnly = false) { From 757ff5cd9a8e07ed35faa46868231708cfbfbd29 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:02:34 +0530 Subject: [PATCH 0374/1179] New --- web/packages/base/crypto/ente-impl.ts | 15 ++++++++++++++- web/packages/base/crypto/ente.ts | 16 ++++++++++++++++ web/packages/base/crypto/worker.ts | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index b1be404067..213df8b13c 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,6 +1,11 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; -import type { BytesOrB64, DecryptBlobB64, EncryptJSON } from "./types"; +import type { + BytesOrB64, + DecryptBlobB64, + EncryptedBlob_2, + EncryptJSON, +} from "./types"; export const _encryptBoxB64 = libsodium.encryptBoxB64; @@ -55,6 +60,14 @@ export const _decryptAssociatedDataB64 = async ({ keyB64, }); +export const _decryptMetadataJSON_New = async ( + blob: EncryptedBlob_2, + key: BytesOrB64, +) => + JSON.parse( + new TextDecoder().decode(await _decryptBlob(blob, key)), + ) as unknown; + export const _decryptMetadataJSON = async (r: DecryptBlobB64) => JSON.parse( new TextDecoder().decode(await _decryptAssociatedDataB64(r)), diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 95d0ce5aed..2ef5ef9a57 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -183,6 +183,22 @@ export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => export const decryptThumbnail = (blob: EncryptedBlob_2, key: BytesOrB64) => assertInWorker(ei._decryptThumbnail(blob, key)); +/** + * Decrypt the metadata JSON encrypted using {@link encryptMetadataJSON}. + * + * @returns The decrypted JSON value. Since TypeScript does not have a native + * JSON type, we need to return it as an `unknown`. + */ +export const decryptMetadataJSON_New = ( + blob: EncryptedBlob_2, + key: BytesOrB64, +) => + inWorker() + ? ei._decryptMetadataJSON_New(blob, key) + : sharedCryptoWorker().then((w) => + w.decryptMetadataJSON_New(blob, key), + ); + /** * Decrypt the metadata JSON associated with an Ente object. * diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 547a458d8a..c87ce36b42 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -19,6 +19,7 @@ export class CryptoWorker { decryptBoxB64 = ei._decryptBoxB64; decryptBlobB64 = ei._decryptBlobB64; decryptThumbnail = ei._decryptThumbnail; + decryptMetadataJSON_New = ei._decryptMetadataJSON_New; decryptMetadataJSON = ei._decryptMetadataJSON; // TODO: -- AUDIT BELOW -- From 788ce533884cecf73f513e9151c4e7a5b1bb223f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:04:02 +0530 Subject: [PATCH 0375/1179] Use --- web/packages/base/crypto/ente-impl.ts | 10 +++++++--- web/packages/base/crypto/ente.ts | 7 +------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 213df8b13c..60bf3a7d07 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -69,6 +69,10 @@ export const _decryptMetadataJSON_New = async ( ) as unknown; export const _decryptMetadataJSON = async (r: DecryptBlobB64) => - JSON.parse( - new TextDecoder().decode(await _decryptAssociatedDataB64(r)), - ) as unknown; + _decryptMetadataJSON_New( + { + encryptedData: r.encryptedDataB64, + decryptionHeader: r.decryptionHeaderB64, + }, + r.keyB64, + ); diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 2ef5ef9a57..854efcfaae 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -200,12 +200,7 @@ export const decryptMetadataJSON_New = ( ); /** - * Decrypt the metadata JSON associated with an Ente object. - * - * This is the sibling of {@link encryptMetadataJSON}. - * - * @returns The decrypted JSON value. Since TypeScript does not have a native - * JSON type, we need to return it as an `unknown`. + * Deprecated, retains the old API. */ export const decryptMetadataJSON = (r: DecryptBlobB64) => inWorker() From 25f1087685f815748eb451356d07fcd19dd02838 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:05:49 +0530 Subject: [PATCH 0376/1179] Unused --- web/packages/base/crypto/ente-impl.ts | 13 ------------- web/packages/base/crypto/libsodium.ts | 22 ---------------------- 2 files changed, 35 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 60bf3a7d07..8a0a01dacb 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -45,21 +45,8 @@ export const _decryptBlob = libsodium.decryptBlob2; export const _decryptBlobB64 = libsodium.decryptBlobB64; -export const _decryptAssociatedData = libsodium.decryptBlob; - export const _decryptThumbnail = _decryptBlob; -export const _decryptAssociatedDataB64 = async ({ - encryptedDataB64, - decryptionHeaderB64, - keyB64, -}: DecryptBlobB64) => - await _decryptAssociatedData({ - encryptedData: await libsodium.fromB64(encryptedDataB64), - decryptionHeaderB64, - keyB64, - }); - export const _decryptMetadataJSON_New = async ( blob: EncryptedBlob_2, key: BytesOrB64, diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index f49ee4e2a1..a7cce5710a 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -13,7 +13,6 @@ import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { BytesOrB64, - DecryptBlobBytes, DecryptBoxBytes, EncryptBytes, EncryptedBlob_2, @@ -453,27 +452,6 @@ export const decryptBlobB64 = ( key: BytesOrB64, ): Promise => decryptBlob2(blob, key).then(toB64); -/** - * Decrypt the result of {@link encryptBlob}. - */ -export const decryptBlob = async ({ - encryptedData, - decryptionHeaderB64, - keyB64, -}: DecryptBlobBytes): Promise => { - await sodium.ready; - const pullState = sodium.crypto_secretstream_xchacha20poly1305_init_pull( - await fromB64(decryptionHeaderB64), - await fromB64(keyB64), - ); - const pullResult = sodium.crypto_secretstream_xchacha20poly1305_pull( - pullState, - encryptedData, - null, - ); - return pullResult.message; -}; - /** Decrypt Stream, but merge the results. */ export const decryptChaCha = async ( data: Uint8Array, From 6488c4fa0e217bfe210fd5d5cad88f462debcb92 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:10:11 +0530 Subject: [PATCH 0377/1179] Sigh --- web/packages/new/photos/services/ml/ml-data.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/packages/new/photos/services/ml/ml-data.ts b/web/packages/new/photos/services/ml/ml-data.ts index d9ec5a8425..fb31bc9dcc 100644 --- a/web/packages/new/photos/services/ml/ml-data.ts +++ b/web/packages/new/photos/services/ml/ml-data.ts @@ -172,6 +172,11 @@ export const fetchMLData = async ( } try { + // TODO: This line is included in the photos app which currently + // doesn't have strict mode enabled, and where it causes a spurious + // error, so we unfortunately need to turn off typechecking. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error + // @ts-ignore const decryptedBytes = await decryptBlob(remoteFileData, file.key); const jsonString = await gunzip(decryptedBytes); result.set(fileID, remoteMLDataFromJSONString(jsonString)); From eafa662cc042cb304f61973c451a36350a861928 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:13:48 +0530 Subject: [PATCH 0378/1179] Prune --- web/packages/base/crypto/types.ts | 116 ++---------------------------- 1 file changed, 4 insertions(+), 112 deletions(-) diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 9dd2e30e37..64d01576f7 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -5,21 +5,7 @@ export type BytesOrB64 = Uint8Array | string; /** - * An encryption request. - */ -export interface EncryptBytesOrB64 { - /** - * The data to encrypt. - */ - data: BytesOrB64; - /** - * The key to use for encryption. - */ - key: BytesOrB64; -} - -/** - * An encryption request with the data to encrypt provided as bytes. + * Deprecated. */ export interface EncryptBytes { /** @@ -33,20 +19,8 @@ export interface EncryptBytes { } /** - * A variant of {@link EncryptBytes} with the data as base64 encoded string. - */ -export interface EncryptB64 { - /** - * A base64 string containing the data to encrypt. - */ - dataB64: string; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} - -/** + * Deprecated. + * * A variant of {@link EncryptBytes} with the data as a JSON value. */ export interface EncryptJSON { @@ -188,65 +162,6 @@ export interface EncryptedBoxBytes { nonceB64: string; } -/** - * A variant of {@link EncryptedBoxBytes} with the encrypted data encoded as a - * base64 string. - */ -export interface EncryptedBox64 { - /** - * A base64 string containing the encrypted data. - */ - encryptedDataB64: string; - /** - * A base64 string containing the nonce used during encryption. - * - * A randomly generated nonce for this encryption. It does not need to be - * confidential, but it will be required to decrypt the data. - */ - nonceB64: string; -} - -/** - * The result of encryption using the secretstream APIs used in one-shot mode. - * - * It contains the encrypted data (bytes) and decryption header (base64 encoded - * string) pair. Both these values are needed to decrypt the data. The header - * does not need to be secret. - * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. - */ -export interface EncryptedBlobBytes { - /** - * A {@link Uint8Array} containing the encrypted data. - */ - encryptedData: Uint8Array; - /** - * A base64 string containing the decryption header. - * - * The header contains a random nonce and other libsodium specific metadata. - * It does not need to be secret, but it is required to decrypt the data. - */ - decryptionHeaderB64: string; -} - -/** - * A variant of {@link EncryptedBlobBytes} with the encrypted data encoded as a - * base64 string. - */ -export interface EncryptedBlobB64 { - /** - * A base64 string containing the encrypted data. - */ - encryptedDataB64: string; - /** - * A base64 string containing the decryption header. - * - * The header contains a random nonce and other libsodium specific metadata. - * It does not need to be secret, but it is required to decrypt the data. - */ - decryptionHeaderB64: string; -} - /** * A decryption request to decrypt data encrypted using the secretbox APIs. The * encrypted Box's data is provided as bytes. @@ -294,31 +209,8 @@ export interface DecryptBoxB64 { } /** - * A decryption request to decrypt data encrypted using the secretstream APIs in - * one-shot mode. The encrypted Blob's data is provided as bytes. + * Deprecated. * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. - */ -export interface DecryptBlobBytes { - /** - * A {@link Uint8Array} containing the bytes to decrypt. - */ - encryptedData: Uint8Array; - /** - * A base64 string containing the decryption header that was produced during - * encryption. - * - * The header contains a random nonce and other libsodium metadata. It does - * not need to be kept secret. - */ - decryptionHeaderB64: string; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} - -/** * A variant of {@link DecryptBlobBytes} with the encrypted Blob's data as a * base64 encoded string. */ From 069cf82bbb143492fe5fb769247966b264f13876 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:21:09 +0530 Subject: [PATCH 0379/1179] Mig --- web/packages/base/crypto/libsodium.ts | 17 ++++++---- web/packages/base/crypto/types.ts | 46 --------------------------- 2 files changed, 10 insertions(+), 53 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index a7cce5710a..f1972de6be 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -13,7 +13,6 @@ import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { BytesOrB64, - DecryptBoxBytes, EncryptBytes, EncryptedBlob_2, EncryptedBlobB64_2, @@ -135,7 +134,7 @@ const bytes = async (bob: BytesOrB64) => * Encrypt the given data using libsodium's secretbox APIs, using a randomly * generated nonce. * - * Use {@link decryptBox} to decrypt the result. + * Use {@link decryptBox_Deprecated} to decrypt the result. * * @param data The data to encrypt. * @@ -388,11 +387,15 @@ export async function encryptFileChunk( /** * Decrypt the result of {@link encryptBox}. */ -export const decryptBox = async ({ +const decryptBox_Deprecated = async ({ encryptedData, nonceB64, keyB64, -}: DecryptBoxBytes): Promise => { +}: { + encryptedData: Uint8Array; + nonceB64: string; + keyB64: string; +}): Promise => { await sodium.ready; return sodium.crypto_secretbox_open_easy( encryptedData, @@ -417,7 +420,7 @@ export const decryptBox2 = async ( }; /** - * Variant of {@link decryptBox} that returns the data as a base64 string. + * Variant of {@link decryptBox_Deprecated} that returns the data as a base64 string. */ export const decryptBoxB64 = ( box: EncryptedBox2, @@ -557,7 +560,7 @@ export async function decryptB64( keyB64: string, ) { await sodium.ready; - const decrypted = await decryptBox({ + const decrypted = await decryptBox_Deprecated({ encryptedData: await fromB64(data), nonceB64, keyB64, @@ -573,7 +576,7 @@ export async function decryptToUTF8( keyB64: string, ) { await sodium.ready; - const decrypted = await decryptBox({ + const decrypted = await decryptBox_Deprecated({ encryptedData: await fromB64(data), nonceB64, keyB64, diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index 64d01576f7..ea35e23f49 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -162,52 +162,6 @@ export interface EncryptedBoxBytes { nonceB64: string; } -/** - * A decryption request to decrypt data encrypted using the secretbox APIs. The - * encrypted Box's data is provided as bytes. - * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. - */ -export interface DecryptBoxBytes { - /** - * A {@link Uint8Array} containing the bytes to decrypt. - */ - encryptedData: Uint8Array; - /** - * A base64 string containing the nonce that was used during encryption. - * - * The nonce is required to decrypt the data, but it does not need to be - * kept secret. - */ - nonceB64: string; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} - -/** - * A variant of {@link DecryptBoxBytes} with the encrypted Blob's data as a - * base64 encoded string. - */ -export interface DecryptBoxB64 { - /** - * A base64 string containing the data to decrypt. - */ - encryptedDataB64: string; - /** - * A base64 string containing the nonce that was used during encryption. - * - * The nonce is required to decrypt the data, but it does not need to be - * kept secret. - */ - nonceB64: string; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} - /** * Deprecated. * From de3943e69cbbe94b1b14d49b0f6e8a18b3aee2f9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:22:54 +0530 Subject: [PATCH 0380/1179] Prune --- web/packages/base/crypto/libsodium.ts | 19 +++++++++----- web/packages/base/crypto/types.ts | 36 --------------------------- 2 files changed, 13 insertions(+), 42 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index f1972de6be..6bcd0f2e87 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -13,13 +13,11 @@ import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { BytesOrB64, - EncryptBytes, EncryptedBlob_2, EncryptedBlobB64_2, EncryptedBlobBytes_2, EncryptedBox2, EncryptedBoxB64, - EncryptedBoxBytes, } from "./types"; /** @@ -243,10 +241,16 @@ export const encryptBoxB64 = async ( }; /** deprecated + needs rename */ -const encryptBox = async ({ +const encryptBox_Deprecated = async ({ data, keyB64, -}: EncryptBytes): Promise => { +}: { + data: Uint8Array; + keyB64: string; +}): Promise<{ + encryptedData: Uint8Array; + nonceB64: string; +}> => { await sodium.ready; const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy( @@ -385,7 +389,7 @@ export async function encryptFileChunk( } /** - * Decrypt the result of {@link encryptBox}. + * Decrypt the result of {@link encryptBox_Deprecated}. */ const decryptBox_Deprecated = async ({ encryptedData, @@ -533,7 +537,10 @@ export interface B64EncryptionResult { export async function encryptToB64(data: string, keyB64: string) { await sodium.ready; - const encrypted = await encryptBox({ data: await fromB64(data), keyB64 }); + const encrypted = await encryptBox_Deprecated({ + data: await fromB64(data), + keyB64, + }); return { encryptedData: await toB64(encrypted.encryptedData), diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index ea35e23f49..ba0c80c395 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -4,19 +4,6 @@ */ export type BytesOrB64 = Uint8Array | string; -/** - * Deprecated. - */ -export interface EncryptBytes { - /** - * A {@link Uint8Array} containing the bytes to encrypt. - */ - data: Uint8Array; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} /** * Deprecated. @@ -139,29 +126,6 @@ export interface EncryptedBlobB64_2 { decryptionHeader: string; } -/** - * The result of encryption using the secretbox APIs. - * - * It contains the encrypted data (bytes) and nonce (base64 encoded string) - * pair. Both these values are needed to decrypt the data. The nonce does not - * need to be secret. - * - * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. - */ -export interface EncryptedBoxBytes { - /** - * A {@link Uint8Array} containing the encrypted data. - */ - encryptedData: Uint8Array; - /** - * A base64 string containing the nonce used during encryption. - * - * A randomly generated nonce for this encryption. It does not need to be - * confidential, but it will be required to decrypt the data. - */ - nonceB64: string; -} - /** * Deprecated. * From b329085940fb00d2695c1f2581acf567ba547878 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:25:57 +0530 Subject: [PATCH 0381/1179] Mig --- web/packages/base/crypto/libsodium.ts | 34 ++++----------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 6bcd0f2e87..0773622479 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -132,7 +132,7 @@ const bytes = async (bob: BytesOrB64) => * Encrypt the given data using libsodium's secretbox APIs, using a randomly * generated nonce. * - * Use {@link decryptBox_Deprecated} to decrypt the result. + * Use {@link decryptBox} to decrypt the result. * * @param data The data to encrypt. * @@ -240,27 +240,6 @@ export const encryptBoxB64 = async ( }; }; -/** deprecated + needs rename */ -const encryptBox_Deprecated = async ({ - data, - keyB64, -}: { - data: Uint8Array; - keyB64: string; -}): Promise<{ - encryptedData: Uint8Array; - nonceB64: string; -}> => { - await sodium.ready; - const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); - const encryptedData = sodium.crypto_secretbox_easy( - data, - nonce, - await fromB64(keyB64), - ); - return { encryptedData, nonceB64: await toB64(nonce) }; -}; - /** * Encrypt the given data using libsodium's secretstream APIs in one-shot mode. * @@ -535,17 +514,14 @@ export interface B64EncryptionResult { nonce: string; } +/** Deprecated, use {@link encryptBoxB64} instead */ export async function encryptToB64(data: string, keyB64: string) { await sodium.ready; - const encrypted = await encryptBox_Deprecated({ - data: await fromB64(data), - keyB64, - }); - + const encrypted = await encryptBoxB64(data, keyB64); return { - encryptedData: await toB64(encrypted.encryptedData), + encryptedData: encrypted.encryptedData, key: keyB64, - nonce: encrypted.nonceB64, + nonce: encrypted.nonce, } as B64EncryptionResult; } From 0ee84db02f75a3c809c14bc1460cdc821242ff0d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:29:40 +0530 Subject: [PATCH 0382/1179] Mig --- web/packages/base/crypto/libsodium.ts | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 0773622479..6aee5ed70b 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -367,9 +367,6 @@ export async function encryptFileChunk( return pushResult; } -/** - * Decrypt the result of {@link encryptBox_Deprecated}. - */ const decryptBox_Deprecated = async ({ encryptedData, nonceB64, @@ -536,35 +533,25 @@ export async function encryptUTF8(data: string, key: string) { return await encryptToB64(b64Data, key); } -/** Deprecated */ +/** Deprecated, use {@link decryptBox2} instead. */ export async function decryptB64( - data: string, - nonceB64: string, + encryptedData: string, + nonce: string, keyB64: string, ) { await sodium.ready; - const decrypted = await decryptBox_Deprecated({ - encryptedData: await fromB64(data), - nonceB64, - keyB64, - }); - + const decrypted = await decryptBox2({ encryptedData, nonce }, keyB64); return await toB64(decrypted); } /** Deprecated */ export async function decryptToUTF8( - data: string, - nonceB64: string, + encryptedData: string, + nonce: string, keyB64: string, ) { await sodium.ready; - const decrypted = await decryptBox_Deprecated({ - encryptedData: await fromB64(data), - nonceB64, - keyB64, - }); - + const decrypted = await decryptBox2({ encryptedData, nonce }, keyB64); return sodium.to_string(decrypted); } From 9ae5006a4ae32a16c5b26d032ee42c74e2044fd4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:30:54 +0530 Subject: [PATCH 0383/1179] Mig --- web/packages/base/crypto/libsodium.ts | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 6aee5ed70b..5a1376fa79 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -367,23 +367,6 @@ export async function encryptFileChunk( return pushResult; } -const decryptBox_Deprecated = async ({ - encryptedData, - nonceB64, - keyB64, -}: { - encryptedData: Uint8Array; - nonceB64: string; - keyB64: string; -}): Promise => { - await sodium.ready; - return sodium.crypto_secretbox_open_easy( - encryptedData, - await fromB64(nonceB64), - await fromB64(keyB64), - ); -}; - /** * Decrypt the result of {@link encryptBoxB64}. */ @@ -400,7 +383,7 @@ export const decryptBox2 = async ( }; /** - * Variant of {@link decryptBox_Deprecated} that returns the data as a base64 string. + * Variant of {@link decryptBox} that returns the data as a base64 string. */ export const decryptBoxB64 = ( box: EncryptedBox2, @@ -533,15 +516,13 @@ export async function encryptUTF8(data: string, key: string) { return await encryptToB64(b64Data, key); } -/** Deprecated, use {@link decryptBox2} instead. */ +/** Deprecated, use {@link decryptBoxB64} instead. */ export async function decryptB64( encryptedData: string, nonce: string, keyB64: string, ) { - await sodium.ready; - const decrypted = await decryptBox2({ encryptedData, nonce }, keyB64); - return await toB64(decrypted); + return decryptBoxB64({ encryptedData, nonce }, keyB64); } /** Deprecated */ From 0240b37032f1ea66f5c41fc5e8177841817f1302 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:33:15 +0530 Subject: [PATCH 0384/1179] Denoise --- web/packages/base/crypto/ente-impl.ts | 13 ++++++------- web/packages/base/crypto/ente.ts | 7 +++++-- web/packages/base/crypto/types.ts | 26 -------------------------- 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 8a0a01dacb..1c28e3d124 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,11 +1,6 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; -import type { - BytesOrB64, - DecryptBlobB64, - EncryptedBlob_2, - EncryptJSON, -} from "./types"; +import type { BytesOrB64, EncryptedBlob_2, EncryptJSON } from "./types"; export const _encryptBoxB64 = libsodium.encryptBoxB64; @@ -55,7 +50,11 @@ export const _decryptMetadataJSON_New = async ( new TextDecoder().decode(await _decryptBlob(blob, key)), ) as unknown; -export const _decryptMetadataJSON = async (r: DecryptBlobB64) => +export const _decryptMetadataJSON = async (r: { + encryptedDataB64: string; + decryptionHeaderB64: string; + keyB64: string; +}) => _decryptMetadataJSON_New( { encryptedData: r.encryptedDataB64, diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 854efcfaae..8feb0ccdce 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -53,7 +53,6 @@ import { inWorker } from "../env"; import * as ei from "./ente-impl"; import type { BytesOrB64, - DecryptBlobB64, EncryptedBlob_2, EncryptedBox2, EncryptJSON, @@ -202,7 +201,11 @@ export const decryptMetadataJSON_New = ( /** * Deprecated, retains the old API. */ -export const decryptMetadataJSON = (r: DecryptBlobB64) => +export const decryptMetadataJSON = (r: { + encryptedDataB64: string; + decryptionHeaderB64: string; + keyB64: string; +}) => inWorker() ? ei._decryptMetadataJSON(r) : sharedCryptoWorker().then((w) => w.decryptMetadataJSON(r)); diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index ba0c80c395..fdc9542062 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -4,7 +4,6 @@ */ export type BytesOrB64 = Uint8Array | string; - /** * Deprecated. * @@ -125,28 +124,3 @@ export interface EncryptedBlobB64_2 { */ decryptionHeader: string; } - -/** - * Deprecated. - * - * A variant of {@link DecryptBlobBytes} with the encrypted Blob's data as a - * base64 encoded string. - */ -export interface DecryptBlobB64 { - /** - * A base64 string containing the data to decrypt. - */ - encryptedDataB64: string; - /** - * A base64 string containing the decryption header that was produced during - * encryption. - * - * The header contains a random nonce and other libsodium metadata. It does - * not need to be kept secret. - */ - decryptionHeaderB64: string; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} From 76da94cf7891d4468d48028b08d0252732295aab Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:41:07 +0530 Subject: [PATCH 0385/1179] Add the variant --- web/packages/base/crypto/ente-impl.ts | 22 ++++++++------- web/packages/base/crypto/ente.ts | 39 ++++++++++++++++++--------- web/packages/base/crypto/types.ts | 19 ------------- web/packages/base/crypto/worker.ts | 1 + 4 files changed, 39 insertions(+), 42 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 1c28e3d124..6e3115795b 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,6 +1,6 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; -import type { BytesOrB64, EncryptedBlob_2, EncryptJSON } from "./types"; +import type { BytesOrB64, EncryptedBlob_2 } from "./types"; export const _encryptBoxB64 = libsodium.encryptBoxB64; @@ -16,16 +16,18 @@ export const _encryptThumbnail = async (data: BytesOrB64, key: BytesOrB64) => { }; }; -export const _encryptMetadataJSON_New = ({ jsonValue, keyB64 }: EncryptJSON) => - _encryptBlobB64( - new TextEncoder().encode(JSON.stringify(jsonValue)), - keyB64, - ); +export const _encryptMetadataJSON_New = (jsonValue: unknown, key: BytesOrB64) => + _encryptBlobB64(new TextEncoder().encode(JSON.stringify(jsonValue)), key); -export const _encryptMetadataJSON = async (r: EncryptJSON) => { - // Deprecated. Keep the old API for now. - const { encryptedData, decryptionHeader } = - await _encryptMetadataJSON_New(r); +// Deprecated, translates to the old API for now. +export const _encryptMetadataJSON = async (r: { + jsonValue: unknown; + keyB64: string; +}) => { + const { encryptedData, decryptionHeader } = await _encryptMetadataJSON_New( + r.jsonValue, + r.keyB64, + ); return { encryptedDataB64: encryptedData, decryptionHeaderB64: decryptionHeader, diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 8feb0ccdce..7585f961bd 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -51,12 +51,7 @@ import { sharedCryptoWorker } from "."; import { assertionFailed } from "../assert"; import { inWorker } from "../env"; import * as ei from "./ente-impl"; -import type { - BytesOrB64, - EncryptedBlob_2, - EncryptedBox2, - EncryptJSON, -} from "./types"; +import type { BytesOrB64, EncryptedBlob_2, EncryptedBox2 } from "./types"; /** * Some of these functions have not yet been needed on the main thread, and for @@ -129,18 +124,36 @@ export const encryptThumbnail = (data: BytesOrB64, key: BytesOrB64) => * Encrypt the JSON metadata associated with an Ente object (file, collection or * entity) using the object's key. * - * This is a variant of {@link encryptAssociatedData} tailored for encrypting - * any arbitrary metadata associated with an Ente object. For example, it is - * used for encrypting the various metadata fields (See: [Note: Metadatum]) - * associated with a file, using that file's key. + * This is a variant of {@link encryptBlobB64} tailored for encrypting any + * arbitrary metadata associated with an Ente object. For example, it is used + * for encrypting the various metadata fields associated with a file, using that + * file's key. * * Instead of raw bytes, it takes as input an arbitrary JSON object which it - * encodes into a string, and encrypts that. And instead of returning the raw - * encrypted bytes, it returns their base64 string representation. + * encodes into a string, and encrypts that. * * Use {@link decryptMetadataJSON} to decrypt the result. + * + * @param jsonValue The JSON value to encrypt. This can be an arbitrary JSON + * value, but since TypeScript currently doesn't have a native JSON type, it is + * typed as {@link unknown}. + * + * @param key The encryption key. */ -export const encryptMetadataJSON = async (r: EncryptJSON) => +export const encryptMetadataJSON_New = (jsonValue: unknown, key: BytesOrB64) => + inWorker() + ? ei._encryptMetadataJSON_New(jsonValue, key) + : sharedCryptoWorker().then((w) => + w.encryptMetadataJSON_New(jsonValue, key), + ); + +/** + * Deprecated, use {@link encryptMetadataJSON_New} instead. + */ +export const encryptMetadataJSON = async (r: { + jsonValue: unknown; + keyB64: string; +}) => inWorker() ? ei._encryptMetadataJSON(r) : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index fdc9542062..d4c972e8c6 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -4,25 +4,6 @@ */ export type BytesOrB64 = Uint8Array | string; -/** - * Deprecated. - * - * A variant of {@link EncryptBytes} with the data as a JSON value. - */ -export interface EncryptJSON { - /** - * The JSON value to encrypt. - * - * This can be an arbitrary JSON value, but since TypeScript currently - * doesn't have a native JSON type, it is typed as {@link unknown}. - */ - jsonValue: unknown; - /** - * A base64 string containing the encryption key. - */ - keyB64: string; -} - /** * The result of encryption using the secretbox APIs. * diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index c87ce36b42..7ce5b56775 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -14,6 +14,7 @@ import * as libsodium from "./libsodium"; export class CryptoWorker { encryptBoxB64 = ei._encryptBoxB64; encryptThumbnail = ei._encryptThumbnail; + encryptMetadataJSON_New = ei._encryptMetadataJSON_New; encryptMetadataJSON = ei._encryptMetadataJSON; decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; From 08c3b172d974582e6bad3e7f186895df03f3237e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:49:39 +0530 Subject: [PATCH 0386/1179] Update types --- web/packages/base/crypto/ente-impl.ts | 4 ++-- web/packages/base/crypto/ente.ts | 14 +++++++------- web/packages/base/crypto/libsodium.ts | 20 ++++++++++---------- web/packages/base/crypto/types.ts | 16 ++++++++-------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index 6e3115795b..ebd6055b5c 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -1,6 +1,6 @@ /** Careful when adding add other imports! */ import * as libsodium from "./libsodium"; -import type { BytesOrB64, EncryptedBlob_2 } from "./types"; +import type { BytesOrB64, EncryptedBlob } from "./types"; export const _encryptBoxB64 = libsodium.encryptBoxB64; @@ -45,7 +45,7 @@ export const _decryptBlobB64 = libsodium.decryptBlobB64; export const _decryptThumbnail = _decryptBlob; export const _decryptMetadataJSON_New = async ( - blob: EncryptedBlob_2, + blob: EncryptedBlob, key: BytesOrB64, ) => JSON.parse( diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts index 7585f961bd..476e589505 100644 --- a/web/packages/base/crypto/ente.ts +++ b/web/packages/base/crypto/ente.ts @@ -51,7 +51,7 @@ import { sharedCryptoWorker } from "."; import { assertionFailed } from "../assert"; import { inWorker } from "../env"; import * as ei from "./ente-impl"; -import type { BytesOrB64, EncryptedBlob_2, EncryptedBox2 } from "./types"; +import type { BytesOrB64, EncryptedBlob, EncryptedBox } from "./types"; /** * Some of these functions have not yet been needed on the main thread, and for @@ -161,7 +161,7 @@ export const encryptMetadataJSON = async (r: { /** * Decrypt a box encrypted using {@link encryptBoxB64}. */ -export const decryptBox = (box: EncryptedBox2, key: BytesOrB64) => +export const decryptBox = (box: EncryptedBox, key: BytesOrB64) => inWorker() ? ei._decryptBox(box, key) : sharedCryptoWorker().then((w) => w.decryptBox(box, key)); @@ -169,7 +169,7 @@ export const decryptBox = (box: EncryptedBox2, key: BytesOrB64) => /** * Variant of {@link decryptBox} that returns the result as a base64 string. */ -export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => +export const decryptBoxB64 = (box: EncryptedBox, key: BytesOrB64) => inWorker() ? ei._decryptBoxB64(box, key) : sharedCryptoWorker().then((w) => w.decryptBoxB64(box, key)); @@ -178,13 +178,13 @@ export const decryptBoxB64 = (box: EncryptedBox2, key: BytesOrB64) => * Decrypt a blob encrypted using either {@link encryptBlob} or * {@link encryptBlobB64}. */ -export const decryptBlob = (blob: EncryptedBlob_2, key: BytesOrB64) => +export const decryptBlob = (blob: EncryptedBlob, key: BytesOrB64) => assertInWorker(ei._decryptBlob(blob, key)); /** * A variant of {@link decryptBlob} that returns the result as a base64 string. */ -export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => +export const decryptBlobB64 = (blob: EncryptedBlob, key: BytesOrB64) => inWorker() ? ei._decryptBlobB64(blob, key) : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); @@ -192,7 +192,7 @@ export const decryptBlobB64 = (blob: EncryptedBlob_2, key: BytesOrB64) => /** * Decrypt the thumbnail encrypted using {@link encryptThumbnail}. */ -export const decryptThumbnail = (blob: EncryptedBlob_2, key: BytesOrB64) => +export const decryptThumbnail = (blob: EncryptedBlob, key: BytesOrB64) => assertInWorker(ei._decryptThumbnail(blob, key)); /** @@ -202,7 +202,7 @@ export const decryptThumbnail = (blob: EncryptedBlob_2, key: BytesOrB64) => * JSON type, we need to return it as an `unknown`. */ export const decryptMetadataJSON_New = ( - blob: EncryptedBlob_2, + blob: EncryptedBlob, key: BytesOrB64, ) => inWorker() diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 5a1376fa79..29546d567f 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -13,10 +13,10 @@ import { CustomError } from "@ente/shared/error"; import sodium, { type StateAddress } from "libsodium-wrappers"; import type { BytesOrB64, - EncryptedBlob_2, - EncryptedBlobB64_2, - EncryptedBlobBytes_2, - EncryptedBox2, + EncryptedBlob, + EncryptedBlobB64, + EncryptedBlobBytes, + EncryptedBox, EncryptedBoxB64, } from "./types"; @@ -258,7 +258,7 @@ export const encryptBoxB64 = async ( export const encryptBlob = async ( data: BytesOrB64, key: BytesOrB64, -): Promise => { +): Promise => { await sodium.ready; const uintkey = await bytes(key); @@ -285,7 +285,7 @@ export const encryptBlob = async ( export const encryptBlobB64 = async ( data: BytesOrB64, key: BytesOrB64, -): Promise => { +): Promise => { const { encryptedData, decryptionHeader } = await encryptBlob(data, key); return { encryptedData: await toB64(encryptedData), @@ -371,7 +371,7 @@ export async function encryptFileChunk( * Decrypt the result of {@link encryptBoxB64}. */ export const decryptBox2 = async ( - { encryptedData, nonce }: EncryptedBox2, + { encryptedData, nonce }: EncryptedBox, key: BytesOrB64, ): Promise => { await sodium.ready; @@ -386,7 +386,7 @@ export const decryptBox2 = async ( * Variant of {@link decryptBox} that returns the data as a base64 string. */ export const decryptBoxB64 = ( - box: EncryptedBox2, + box: EncryptedBox, key: BytesOrB64, ): Promise => decryptBox2(box, key).then(toB64); @@ -394,7 +394,7 @@ export const decryptBoxB64 = ( * Decrypt the result of {@link encryptBlob} or {@link encryptBlobB64}. */ export const decryptBlob2 = async ( - { encryptedData, decryptionHeader }: EncryptedBlob_2, + { encryptedData, decryptionHeader }: EncryptedBlob, key: BytesOrB64, ): Promise => { await sodium.ready; @@ -414,7 +414,7 @@ export const decryptBlob2 = async ( * A variant of {@link decryptBlob2} that returns the result as a base64 string. */ export const decryptBlobB64 = ( - blob: EncryptedBlob_2, + blob: EncryptedBlob, key: BytesOrB64, ): Promise => decryptBlob2(blob, key).then(toB64); diff --git a/web/packages/base/crypto/types.ts b/web/packages/base/crypto/types.ts index d4c972e8c6..a70c5b3aa9 100644 --- a/web/packages/base/crypto/types.ts +++ b/web/packages/base/crypto/types.ts @@ -13,7 +13,7 @@ export type BytesOrB64 = Uint8Array | string; * * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. */ -export interface EncryptedBox2 { +export interface EncryptedBox { /** * The data to decrypt. */ @@ -49,11 +49,11 @@ export interface EncryptedBoxB64 { * * See: [Note: 3 forms of encryption (Box | Blob | Stream)]. * - * This type is a combination of {@link EncryptedBlobBytes_2} and - * {@link EncryptedBlobB64_2} which allows the decryption routines to accept + * This type is a combination of {@link EncryptedBlobBytes} and + * {@link EncryptedBlobB64} which allows the decryption routines to accept * either the bytes or the base64 variants produced by the encryption routines. */ -export interface EncryptedBlob_2 { +export interface EncryptedBlob { /** * The encrypted data. */ @@ -69,10 +69,10 @@ export interface EncryptedBlob_2 { } /** - * A variant of {@link EncryptedBlob_2} that has the encrypted data and header + * A variant of {@link EncryptedBlob} that has the encrypted data and header * as bytes ({@link Uint8Array}s). */ -export interface EncryptedBlobBytes_2 { +export interface EncryptedBlobBytes { /** * The encrypted data. */ @@ -88,10 +88,10 @@ export interface EncryptedBlobBytes_2 { } /** - * A variant of {@link EncryptedBlob_2} that has the encrypted data and header + * A variant of {@link EncryptedBlob} that has the encrypted data and header * as base64 strings. */ -export interface EncryptedBlobB64_2 { +export interface EncryptedBlobB64 { /** * The encrypted data as a base64 string. */ From 8601662ea1732c89b02ca430cfea58e05135400f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 21:51:50 +0530 Subject: [PATCH 0387/1179] Un2 --- web/packages/base/crypto/ente-impl.ts | 4 ++-- web/packages/base/crypto/libsodium.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/packages/base/crypto/ente-impl.ts b/web/packages/base/crypto/ente-impl.ts index ebd6055b5c..72e31e5b87 100644 --- a/web/packages/base/crypto/ente-impl.ts +++ b/web/packages/base/crypto/ente-impl.ts @@ -34,11 +34,11 @@ export const _encryptMetadataJSON = async (r: { }; }; -export const _decryptBox = libsodium.decryptBox2; +export const _decryptBox = libsodium.decryptBox; export const _decryptBoxB64 = libsodium.decryptBoxB64; -export const _decryptBlob = libsodium.decryptBlob2; +export const _decryptBlob = libsodium.decryptBlob; export const _decryptBlobB64 = libsodium.decryptBlobB64; diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 29546d567f..7463b4a62a 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -370,7 +370,7 @@ export async function encryptFileChunk( /** * Decrypt the result of {@link encryptBoxB64}. */ -export const decryptBox2 = async ( +export const decryptBox = async ( { encryptedData, nonce }: EncryptedBox, key: BytesOrB64, ): Promise => { @@ -388,12 +388,12 @@ export const decryptBox2 = async ( export const decryptBoxB64 = ( box: EncryptedBox, key: BytesOrB64, -): Promise => decryptBox2(box, key).then(toB64); +): Promise => decryptBox(box, key).then(toB64); /** * Decrypt the result of {@link encryptBlob} or {@link encryptBlobB64}. */ -export const decryptBlob2 = async ( +export const decryptBlob = async ( { encryptedData, decryptionHeader }: EncryptedBlob, key: BytesOrB64, ): Promise => { @@ -411,12 +411,12 @@ export const decryptBlob2 = async ( }; /** - * A variant of {@link decryptBlob2} that returns the result as a base64 string. + * A variant of {@link decryptBlob} that returns the result as a base64 string. */ export const decryptBlobB64 = ( blob: EncryptedBlob, key: BytesOrB64, -): Promise => decryptBlob2(blob, key).then(toB64); +): Promise => decryptBlob(blob, key).then(toB64); /** Decrypt Stream, but merge the results. */ export const decryptChaCha = async ( @@ -532,7 +532,7 @@ export async function decryptToUTF8( keyB64: string, ) { await sodium.ready; - const decrypted = await decryptBox2({ encryptedData, nonce }, keyB64); + const decrypted = await decryptBox({ encryptedData, nonce }, keyB64); return sodium.to_string(decrypted); } From 505dc7c20d18a4721067e698c74f7f4a951d12ca Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 17 Aug 2024 22:03:52 +0530 Subject: [PATCH 0388/1179] Fix --- web/packages/base/crypto/libsodium.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 7463b4a62a..31eb85141d 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -268,7 +268,7 @@ export const encryptBlob = async ( const pushResult = sodium.crypto_secretstream_xchacha20poly1305_push( pushState, - data, + await bytes(data), null, sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL, ); From 54c699b6d57ef5a773a6a79f63093c975defe5cd Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 17 Aug 2024 22:36:01 +0530 Subject: [PATCH 0389/1179] fix: use blur instead of blurhash in panorama --- mobile/pubspec.lock | 50 +++++++++++++++++++-------------------------- mobile/pubspec.yaml | 6 +++--- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 82cf7b2b2c..0bb93644b3 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -113,14 +113,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.6" - blurhash_ffi: - dependency: transitive - description: - name: blurhash_ffi - sha256: "941868602bb3bc34b0a7d630e4bf0e88e4c93af36090fe1cc0d63021c9a46cb3" - url: "https://pub.dev" - source: hosted - version: "1.2.6" boolean_selector: dependency: transitive description: @@ -1107,10 +1099,10 @@ packages: dependency: "direct main" description: name: image - sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" url: "https://pub.dev" source: hosted - version: "4.1.7" + version: "4.2.0" image_editor: dependency: "direct main" description: @@ -1304,18 +1296,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -1448,10 +1440,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" media_extension: dependency: "direct main" description: @@ -1536,10 +1528,10 @@ packages: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mgrs_dart: dependency: transitive description: @@ -1709,7 +1701,7 @@ packages: description: path: "." ref: blur - resolved-ref: "362f0295ba4ed42486577c9f9724c462107080f8" + resolved-ref: d7bf958d045ce5c06080aaa39074546f46f064d1 url: "https://github.com/ente-io/panorama_blur.git" source: git version: "0.4.1" @@ -1893,10 +1885,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -2402,26 +2394,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.25.2" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.4" timezone: dependency: transitive description: @@ -2700,10 +2692,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.4" volume_controller: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index f29ec3d8b2..20297b2b39 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -156,7 +156,7 @@ dependencies: scrollable_positioned_list: ^0.3.5 sentry: ^7.9.0 sentry_flutter: ^7.9.0 - share_plus: ^9.0.0 + share_plus: ^9.0.0 shared_preferences: ^2.0.5 simple_cluster: ^0.3.0 sqflite: ^2.3.0 @@ -173,8 +173,8 @@ dependencies: url_launcher: ^6.0.3 uuid: ^3.0.7 video_editor: - git: - url: https://github.com/prateekmedia/video_editor.git + git: + url: https://github.com/prateekmedia/video_editor.git video_player: git: url: https://github.com/ente-io/packages.git From 92e0d821231d7f946405b69900d4c42d45929c37 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sun, 18 Aug 2024 22:16:09 +0530 Subject: [PATCH 0390/1179] fix: fdroid icon background --- auth/fdroid_flutter_icons.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/auth/fdroid_flutter_icons.yaml b/auth/fdroid_flutter_icons.yaml index 0ef87effdd..4f753c8a78 100644 --- a/auth/fdroid_flutter_icons.yaml +++ b/auth/fdroid_flutter_icons.yaml @@ -2,5 +2,4 @@ flutter_icons: android: "launcher_icon" image_path: "assets/generation-icons/icon-light.png" adaptive_icon_foreground: "assets/generation-icons/icon-light-adaptive-fg.png" - adaptive_icon_background: "#ffffff" - + adaptive_icon_background: "assets/generation-icons/icon-light-adaptive-bg.png" From 4a19bfdcde01b576208453136e14babbff24305e Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 19 Aug 2024 00:31:56 +0000 Subject: [PATCH 0391/1179] New Crowdin translations by GitHub Action --- .../base/locales/fr-FR/translation.json | 8 ++--- .../base/locales/nl-NL/translation.json | 30 +++++++++---------- .../base/locales/pl-PL/translation.json | 8 ++--- .../base/locales/pt-BR/translation.json | 8 ++--- .../base/locales/zh-CN/translation.json | 12 ++++---- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 1aa7f5b52b..6f254423d3 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -488,10 +488,10 @@ "indexing_status_done": "", "ml_search_disable": "", "ml_search_disable_confirm": "", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_consent": "Activer l'apprentissage automatique", + "ml_consent_title": "Activer l'apprentissage automatique ?", + "ml_consent_description": "

Si vous activez l'apprentissage automatique, Ente extraira de vos photos des informations comme la géométrie des visages. Cela se fera sur votre appareil, avec un cryptage de bout-en-bout de toutes les données biométriques générées.

Veuillez cliquer ici pour accéder à notre politique de confidentialité, vous y trouverez plus de détails concernant cette fonction

", + "ml_consent_confirmation": "Je comprends, et souhaite activer l'apprentissage automatique", "labs": "Labo", "YOURS": "Le vôtre", "passphrase_strength_weak": "Sécurité du mot de passe : faible", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 3911ecc6bb..4a1c21ae6e 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -264,7 +264,7 @@ "SCAN_QR_CODE": "Scan QR-code in plaats daarvan", "ENABLE_TWO_FACTOR": "Tweestapsverificatie inschakelen", "enable": "Inschakelen", - "enabled": "", + "enabled": "Ingeschakeld", "LOST_DEVICE": "Tweestapsverificatie apparaat verloren", "INCORRECT_CODE": "Onjuiste code", "TWO_FACTOR_INFO": "Voeg een extra beveiligingslaag toe door meer dan uw e-mailadres en wachtwoord te vereisen om in te loggen op uw account", @@ -478,20 +478,20 @@ "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Je hebt een mix van bestanden en mappen gesleept en laten vallen.

Geef ofwel alleen bestanden aan, of alleen mappen bij het selecteren van de optie om afzonderlijke albums te maken

", "CHOSE_THEME": "Kies thema", "more_details": "Meer details", - "ml_search": "", - "ml_search_description": "", - "ml_search_footnote": "", - "indexing": "", - "processed": "", - "indexing_status_running": "", - "indexing_status_scheduled": "", - "indexing_status_done": "", - "ml_search_disable": "", - "ml_search_disable_confirm": "", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_search": "Machine Learning", + "ml_search_description": "Ente ondersteunt machine learning lokaal op het apparaat voor gezichtsherkenning, magische zoekopdrachten en andere geavanceerde zoekfuncties", + "ml_search_footnote": "De magische zoekfunctie maakt het mogelijk om foto's op hun inhoud te zoeken, bijvoorbeeld 'auto', 'rode auto', 'Ferrari'", + "indexing": "Indexeren", + "processed": "Verwerkt", + "indexing_status_running": "Bezig", + "indexing_status_scheduled": "Gepland", + "indexing_status_done": "Voltooid", + "ml_search_disable": "Schakel machine learning uit", + "ml_search_disable_confirm": "Wil je machine learning op al je apparaten uitschakelen?", + "ml_consent": "Schakel machine learning in", + "ml_consent_title": "Schakel machine learning in?", + "ml_consent_description": "

Als u machine learning inschakelt, analyseert Ente de gezichtsgeometrie uit uw foto's. Dit gebeurt op uw apparaat en alle gegenereerde biometrische gegevens worden end-to-end versleuteld en blijven privé.

Klik hier voor meer informatie over deze functie in ons privacybeleid

", + "ml_consent_confirmation": "Ik begrijp het en wil machine learning inschakelen", "labs": "Lab's", "YOURS": "jouw", "passphrase_strength_weak": "Wachtwoord sterkte: Zwak", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 0329f8f081..a2291c4d2f 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -488,10 +488,10 @@ "indexing_status_done": "Gotowe", "ml_search_disable": "Wyłącz uczenie maszynowe", "ml_search_disable_confirm": "Czy chcesz wyłączyć uczenie maszynowe na wszystkich Twoich urządzeniach?", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_consent": "Włącz uczenie maszynowe", + "ml_consent_title": "Włączyć uczenie maszynowe?", + "ml_consent_description": "

Jeśli włączysz uczenie maszynowe, Ente wyodrębni informacje takie jak geometria twarzy z Twoich zdjęć. Będzie to miało miejsce na Twoim urządzeniu, a wygenerowane informacje biometryczne będą szyfrowane end-to-end.

Kliknij tutaj, aby uzyskać więcej informacji na temat tej funkcji w naszej polityce prywatności

", + "ml_consent_confirmation": "Rozumiem i chcę włączyć uczenie maszynowe", "labs": "Laboratoria", "YOURS": "twoje", "passphrase_strength_weak": "Siła hasła: Słabe", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index b85e7f1865..3cd4706931 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -488,10 +488,10 @@ "indexing_status_done": "Concluído", "ml_search_disable": "Desativar aprendizado de máquina", "ml_search_disable_confirm": "Você deseja desativar o aprendizado de máquina em todos os seus dispositivos?", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_consent": "Habilitar aprendizado de máquina", + "ml_consent_title": "Habilitar aprendizado de máquina?", + "ml_consent_description": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos. Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", + "ml_consent_confirmation": "Eu entendo, e desejo habilitar o aprendizado de máquina", "labs": "Laboratórios", "YOURS": "seu", "passphrase_strength_weak": "Força da senha: fraca", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index b154f6f631..fcd9752e84 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -59,8 +59,8 @@ "UPLOAD_STAGE_MESSAGE": { "0": "正在准备上传", "1": "正在读取 Google 元数据文件", - "2": "文件元数据提取状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", - "3": "文件备份状态:已完成 {{uploadCounter.finished, number}} / 共 {{uploadCounter.total, number}}", + "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 个文件的元数据已提取", + "3": "已处理 {{uploadCounter.finished, number}} / {{uploadCounter.total, number}} 个文件", "4": "正在取消剩余的上传内容", "5": "备份完成" }, @@ -488,10 +488,10 @@ "indexing_status_done": "已完成", "ml_search_disable": "禁用机器学习", "ml_search_disable_confirm": "您想在所有设备上禁用机器学习吗?", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_consent": "启用机器学习", + "ml_consent_title": "要启用机器学习吗?", + "ml_consent_description": "

如果您启用机器学习,Ente 将从您的所有照片中提取面部几何形状等信息。这将在您的设备上进行,并且任何生成的生物特征信息都将被端到端加密。

请点击此处查看我们的隐私政策中有关此功能的更多详细信息

", + "ml_consent_confirmation": "我了解了,并希望启用机器学习", "labs": "实验室", "YOURS": "你的", "passphrase_strength_weak": "密码强度:较弱", From 21764a520f9828e0826d89db2e06413459427420 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 19 Aug 2024 01:04:15 +0000 Subject: [PATCH 0392/1179] New Crowdin translations by GitHub Action --- mobile/lib/l10n/intl_de.arb | 1 + mobile/lib/l10n/intl_pl.arb | 125 ++++++++++++++++++------------------ mobile/lib/l10n/intl_pt.arb | 1 + mobile/lib/l10n/intl_zh.arb | 14 ++-- 4 files changed, 72 insertions(+), 69 deletions(-) diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 0a16ed655e..d748193869 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1143,6 +1143,7 @@ "successfullyHid": "Erfolgreich versteckt", "successfullyUnhid": "Erfolgreich eingeblendet", "crashReporting": "Absturzbericht", + "enableMultiPartUpload": "Mehrteiliges Hochladen aktivieren", "addToHiddenAlbum": "Zum versteckten Album hinzufügen", "moveToHiddenAlbum": "Zu verstecktem Album verschieben", "fileTypes": "Dateitypen", diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index f00e9ee34d..2264fed9e6 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -6,11 +6,11 @@ "cancel": "Anuluj", "verify": "Zweryfikuj", "invalidEmailAddress": "Nieprawidłowy adres e-mail", - "enterValidEmail": "Podaj poprawny adres e-mail.", + "enterValidEmail": "Prosimy podać prawidłowy adres e-mail.", "deleteAccount": "Usuń konto", "askDeleteReason": "Jaka jest przyczyna usunięcia konta?", "deleteAccountFeedbackPrompt": "Przykro nam, że odchodzisz. Wyjaśnij nam, dlaczego nas opuszczasz, aby pomóc ulepszać nasze usługi.", - "feedback": "Informacja zwrotna", + "feedback": "Opinia", "kindlyHelpUsWithThisInformation": "Pomóż nam z tą informacją", "confirmDeletePrompt": "Tak, chcę trwale usunąć konto i wszystkie dane z nim powiązane.", "confirmAccountDeletion": "Potwierdź usunięcie konta", @@ -19,8 +19,8 @@ "selectReason": "Wybierz powód", "deleteReason1": "Brakuje kluczowej funkcji, której potrzebuję", "deleteReason2": "Aplikacja lub określona funkcja nie zachowuje się tak, jak sądzę, że powinna", - "deleteReason3": "Znalazłem inną, lepszą usługę", - "deleteReason4": "Inna, niewymieniona wyżej przyczyna", + "deleteReason3": "Znalazłem/am inną, lepszą usługę", + "deleteReason4": "Moja przyczyna nie jest wymieniona", "sendEmail": "Wyślij e-mail", "deleteRequestSLAText": "Twoje żądanie zostanie przetworzone w ciągu 72 godzin.", "deleteEmailRequest": "Wyślij wiadomość e-mail na account-deletion@ente.io z zarejestrowanego adresu e-mail.", @@ -73,7 +73,7 @@ "enterNewPasswordToEncrypt": "Wprowadź nowe hasło, którego możemy użyć do zaszyfrowania Twoich danych", "weakStrength": "Słabe", "strongStrength": "Silne", - "moderateStrength": "Umiarkowana", + "moderateStrength": "Umiarkowane", "passwordStrength": "Siła hasła: {passwordStrengthValue}", "@passwordStrength": { "description": "Text to indicate the password strength", @@ -88,14 +88,14 @@ }, "passwordChangedSuccessfully": "Hasło zostało pomyślnie zmienione", "generatingEncryptionKeys": "Generowanie kluczy szyfrujących...", - "pleaseWait": "Proszę czekać...", + "pleaseWait": "Prosimy czekać...", "continueLabel": "Kontynuuj", "insecureDevice": "Niezabezpieczone urządzenie", "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Przepraszamy, nie mogliśmy wygenerować bezpiecznych kluczy na tym urządzeniu.\n\nZarejestruj się z innego urządzenia.", "howItWorks": "Jak to działa", "encryption": "Szyfrowanie", "ackPasswordLostWarning": "Rozumiem, że jeśli utracę hasło, mogę utracić dane, ponieważ moje dane są całkowicie zaszyfrowane.", - "privacyPolicyTitle": "Polityka prywatności", + "privacyPolicyTitle": "Polityka Prywatności", "termsOfServicesTitle": "Regulamin", "signUpTerms": "Akceptuję warunki korzystania z usługi i politykę prywatności", "logInLabel": "Zaloguj się", @@ -135,7 +135,7 @@ "copypasteThisCodentoYourAuthenticatorApp": "Kopiuj, wklej ten kod\ndo swojej aplikacji uwierzytelniającej", "tapToCopy": "naciśnij aby skopiować", "scanThisBarcodeWithnyourAuthenticatorApp": "Zeskanuj ten kod kreskowy używając\nswojej aplikacji uwierzytelniającej", - "enterThe6digitCodeFromnyourAuthenticatorApp": "Wprowadź 6-cyfrowy kod z\ntwojej aplikacji uwierzytelniającej", + "enterThe6digitCodeFromnyourAuthenticatorApp": "Wprowadź 6-cyfrowy kod z\nTwojej aplikacji uwierzytelniającej", "confirm": "Potwierdź", "setupComplete": "Konfiguracja ukończona", "saveYourRecoveryKeyIfYouHaventAlready": "Zapisz swój klucz odzyskiwania, jeśli jeszcze tego nie zrobiłeś", @@ -152,23 +152,23 @@ "confirmRecoveryKey": "Potwierdź klucz odzyskiwania", "recoveryKeyVerifyReason": "Twój klucz odzyskiwania to jedyny sposób na odzyskanie zdjęć, jeśli zapomnisz hasła. Klucz odzyskiwania można znaleźć w menu Ustawienia > Bezpieczeństwo.\n\nProszę wprowadzić klucz odzyskiwania tutaj, aby sprawdzić, czy został on poprawnie zapisany.", "confirmYourRecoveryKey": "Potwierdź klucz odzyskiwania", - "addViewer": "Dodaj obserwatora", - "addCollaborator": "Dodaj kolaboratora", + "addViewer": "Dodaj widza", + "addCollaborator": "Dodaj współuczestnika", "addANewEmail": "Dodaj nowy adres e-mail", "orPickAnExistingOne": "Lub wybierz istniejący", - "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Kolaboranci mogą dodawać zdjęcia i wideo do udostępnionego albumu.", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Współuczestnicy mogą dodawać zdjęcia i wideo do udostępnionego albumu.", "enterEmail": "Wprowadź adres e-mail", "albumOwner": "Właściciel", "@albumOwner": { "description": "Role of the album owner" }, "you": "Ty", - "collaborator": "Kolaborator", + "collaborator": "Współuczestnik", "addMore": "Dodaj więcej", "@addMore": { "description": "Button text to add more collaborators/viewers" }, - "viewer": "Obserwator", + "viewer": "Widz", "remove": "Usuń", "removeParticipant": "Usuń użytkownika", "@removeParticipant": { @@ -177,8 +177,8 @@ "manage": "Zarządzaj", "addedAs": "Dodano jako", "changePermissions": "Zmień uprawnienia?", - "yesConvertToViewer": "Tak, konwertuj do oglądającego", - "cannotAddMorePhotosAfterBecomingViewer": "{user} nie będzie mógł dodać więcej zdjęć do tego albumu\n\nJednak nadal będzie mógł usunąć istniejące zdjęcia, które dodał", + "yesConvertToViewer": "Tak, konwertuj na widza", + "cannotAddMorePhotosAfterBecomingViewer": "{user} nie będzie mógł dodać więcej zdjęć do tego albumu\n\nJednak nadal będą mogli usunąć istniejące zdjęcia, które dodali", "allowAddingPhotos": "Pozwól na dodawanie zdjęć", "@allowAddingPhotos": { "description": "Switch button to enable uploading photos to a public link" @@ -226,11 +226,11 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Utwórz link, aby umożliwić innym dodawanie i przeglądanie zdjęć w udostępnionym albumie bez konieczności korzystania z aplikacji lub konta ente. Świetne rozwiązanie do gromadzenia zdjęć ze wspólnych wydarzeń.", + "collabLinkSectionDescription": "Utwórz link, aby umożliwić innym dodawanie i przeglądanie zdjęć w udostępnionym albumie bez konieczności korzystania z aplikacji lub konta Ente. Świetne rozwiązanie do gromadzenia zdjęć ze wspólnych wydarzeń.", "collectPhotos": "Zbierz zdjęcia", - "collaborativeLink": "Link do kolaboracji", + "collaborativeLink": "Link do współpracy", "shareWithNonenteUsers": "Udostępnij użytkownikom bez konta Ente", - "createPublicLink": "Utwórz link dostępny publicznie", + "createPublicLink": "Utwórz publiczny link", "sendLink": "Wyślij link", "copyLink": "Skopiuj link", "linkHasExpired": "Link wygasł", @@ -269,7 +269,7 @@ "done": "Gotowe", "applyCodeTitle": "Użyj kodu", "enterCodeDescription": "Wprowadź kod dostarczony przez znajomego, aby uzyskać bezpłatne miejsce dla was obojga", - "apply": "Użyj", + "apply": "Zastosuj", "failedToApplyCode": "Nie udało się zastosować kodu", "enterReferralCode": "Wprowadź kod polecenia", "codeAppliedPageTitle": "Kod został zastosowany", @@ -333,7 +333,7 @@ "creatingLink": "Tworzenie linku...", "removeWithQuestionMark": "Usunąć?", "removeParticipantBody": "{userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu", - "keepPhotos": "Zachowaj zdjęcia", + "keepPhotos": "Zachowaj Zdjęcia", "deletePhotos": "Usuń zdjęcia", "inviteToEnte": "Zaproś do Ente", "removePublicLink": "Usuń link publiczny", @@ -345,7 +345,7 @@ "importing": "Importowanie....", "failedToLoadAlbums": "Nie udało się załadować albumów", "hidden": "Ukryte", - "authToViewYourHiddenFiles": "Proszę uwierzytelnić się, aby wyświetlić ukryte pliki", + "authToViewYourHiddenFiles": "Prosimy uwierzytelnić się, aby wyświetlić ukryte pliki", "trash": "Kosz", "uncategorized": "Bez kategorii", "videoSmallCase": "wideo", @@ -353,7 +353,7 @@ "singleFileDeleteHighlight": "To zostanie usunięte ze wszystkich albumów.", "singleFileInBothLocalAndRemote": "Ten {fileType} jest zarówno w Ente, jak i na twoim urządzeniu.", "singleFileInRemoteOnly": "Ten {fileType} zostanie usunięty z Ente.", - "singleFileDeleteFromDevice": "Ten {fileType} zostanie usunięty z twojego urządzenia.", + "singleFileDeleteFromDevice": "Ten {fileType} zostanie usunięty z Twojego urządzenia.", "deleteFromEnte": "Usuń z Ente", "yesDelete": "Tak, usuń", "movedToTrash": "Przeniesiono do kosza", @@ -402,7 +402,7 @@ } } }, - "advancedSettings": "Ustawienia zaawansowane", + "advancedSettings": "Zaawansowane", "@advancedSettings": { "description": "The text to display in the advanced settings section" }, @@ -412,9 +412,9 @@ "magicSearch": "Magiczne wyszukiwanie", "mlIndexingDescription": "Pamiętaj, że uczenie maszynowe spowoduje większe zużycie przepustowości i baterii, dopóki wszystkie elementy zostaną zindeksowane.", "loadingModel": "Pobieranie modeli...", - "waitingForWifi": "Czekam na WiFi...", + "waitingForWifi": "Czekanie na WiFi...", "status": "Stan", - "indexedItems": "Indeksowane elementy", + "indexedItems": "Zindeksowane elementy", "pendingItems": "Oczekujące elementy", "clearIndexes": "Wyczyść indeksy", "selectFoldersForBackup": "Wybierz foldery do stworzenia kopii zapasowej", @@ -457,14 +457,14 @@ "youAreOnTheLatestVersion": "Korzystasz z najnowszej wersji", "account": "Konto", "manageSubscription": "Zarządzaj subskrypcją", - "authToChangeYourEmail": "Proszę uwierzytelnić się, aby zmienić swój adres e-mail", + "authToChangeYourEmail": "Prosimy uwierzytelnić się, aby zmienić swój adres e-mail", "changePassword": "Zmień hasło", - "authToChangeYourPassword": "Proszę uwierzytelnić się, aby zmienić hasło", + "authToChangeYourPassword": "Prosimy uwierzytelnić się, aby zmienić hasło", "emailVerificationToggle": "Weryfikacja e-mail", - "authToChangeEmailVerificationSetting": "Proszę uwierzytelnić się, aby zmienić weryfikację e-mail", + "authToChangeEmailVerificationSetting": "Prosimy uwierzytelnić się, aby zmienić weryfikację e-mail", "exportYourData": "Eksportuj swoje dane", "logout": "Wyloguj", - "authToInitiateAccountDeletion": "Proszę uwierzytelnić się, aby zainicjować usuwanie konta", + "authToInitiateAccountDeletion": "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta", "areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?", "yesLogout": "Tak, wyloguj", "aNewVersionOfEnteIsAvailable": "Dostępna jest nowa wersja Ente.", @@ -491,8 +491,8 @@ "youveNoDuplicateFilesThatCanBeCleared": "Nie masz duplikatów plików, które mogą być wyczyszczone", "success": "Sukces", "rateUs": "Oceń nas", - "remindToEmptyDeviceTrash": "Również puste \"Ostatnio usunięte\" z \"Ustawienia\" -> \"Pamięć\", aby odebrać wolną przestrzeń", - "youHaveSuccessfullyFreedUp": "Pomyślnie zwolniłeś {storageSaved}!", + "remindToEmptyDeviceTrash": "Również opróżnij \"Ostatnio usunięte\" z \"Ustawienia\" -> \"Pamięć\", aby odebrać wolną przestrzeń", + "youHaveSuccessfullyFreedUp": "Pomyślnie zwolniłeś/aś {storageSaved}!", "@youHaveSuccessfullyFreedUp": { "description": "The text to display when the user has successfully freed up storage", "type": "text", @@ -525,16 +525,16 @@ "notifications": "Powiadomienia", "sharedPhotoNotifications": "Nowe udostępnione zdjęcia", "sharedPhotoNotificationsExplanation": "Otrzymuj powiadomienia, gdy ktoś doda zdjęcie do udostępnionego albumu, którego jesteś częścią", - "advanced": "Ustawienia zaawansowane", + "advanced": "Zaawansowane", "general": "Ogólne", "security": "Bezpieczeństwo", - "authToViewYourRecoveryKey": "Proszę uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania", + "authToViewYourRecoveryKey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania", "twofactor": "Uwierzytelnianie dwustopniowe", "authToConfigureTwofactorAuthentication": "Uwierzytelnij się, aby skonfigurować uwierzytelnianie dwustopniowe", "lockscreen": "Ekran blokady", - "authToChangeLockscreenSetting": "Proszę uwierzytelnić się, aby zmienić ustawienia ekranu blokady", + "authToChangeLockscreenSetting": "Prosimy uwierzytelnić się, aby zmienić ustawienia ekranu blokady", "viewActiveSessions": "Zobacz aktywne sesje", - "authToViewYourActiveSessions": "Proszę uwierzytelnić, aby wyświetlić swoje aktywne sesje", + "authToViewYourActiveSessions": "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje", "disableTwofactor": "Wyłącz uwierzytelnianie dwustopniowe", "confirm2FADisable": "Czy na pewno chcesz wyłączyć uwierzytelnianie dwustopniowe?", "no": "Nie", @@ -559,7 +559,7 @@ "systemTheme": "Systemowy", "freeTrial": "Darmowy okres próbny", "selectYourPlan": "Wybierz swój plan", - "enteSubscriptionPitch": "Ente zachowuje twoje wspomnienia, więc są zawsze dostępne dla Ciebie, nawet jeśli zgubisz urządzenie.", + "enteSubscriptionPitch": "Ente zachowuje Twoje wspomnienia, więc są zawsze dostępne dla Ciebie, nawet jeśli zgubisz urządzenie.", "enteSubscriptionShareWithFamily": "Twoja rodzina może być również dodana do Twojego planu.", "currentUsageIs": "Aktualne użycie to ", "@currentUsageIs": { @@ -572,9 +572,9 @@ "faqs": "FAQ – Często zadawane pytania", "renewsOn": "Subskrypcja odnowi się {endDate}", "freeTrialValidTill": "Okres próbny ważny do {endDate}", - "validTill": "Ważna do {endDate}", + "validTill": "Ważne do {endDate}", "addOnValidTill": "Twój dodatek {storageAmount} jest ważny do {endDate}", - "playStoreFreeTrialValidTill": "Bezpłatny okres próbny do {endDate}.\nNastępnie możesz wybrać płatny plan.", + "playStoreFreeTrialValidTill": "Bezpłatny okres próbny ważny do {endDate}.\nNastępnie możesz wybrać płatny plan.", "subWillBeCancelledOn": "Twoja subskrypcja zostanie anulowana dnia {endDate}", "subscription": "Subskrypcja", "paymentDetails": "Szczegóły płatności", @@ -588,7 +588,7 @@ "yesCancel": "Tak, anuluj", "failedToRenew": "Nie udało się odnowić", "failedToCancel": "Nie udało się anulować", - "twoMonthsFreeOnYearlyPlans": "2 miesiące za darmo w planach rocznych", + "twoMonthsFreeOnYearlyPlans": "2 miesiące za darmo na planach rocznych", "monthly": "Miesięcznie", "@monthly": { "description": "The text to display for monthly plans", @@ -617,7 +617,7 @@ "send": "Wyślij", "askCancelReason": "Twoja subskrypcja została anulowana. Czy chcesz podzielić się powodem?", "thankYouForSubscribing": "Dziękujemy za subskrypcję!", - "yourPurchaseWasSuccessful": "Twój zakup był udany", + "yourPurchaseWasSuccessful": "Twój zakup zakończył się pomyślnie", "yourPlanWasSuccessfullyUpgraded": "Twój plan został pomyślnie ulepszony", "yourPlanWasSuccessfullyDowngraded": "Twój plan został pomyślnie obniżony", "yourSubscriptionWasUpdatedSuccessfully": "Twoja subskrypcja została pomyślnie zaktualizowana", @@ -645,7 +645,7 @@ "areYouSureYouWantToExit": "Czy na pewno chcesz wyjść?", "thankYou": "Dziękujemy", "failedToVerifyPaymentStatus": "Nie udało się zweryfikować stanu płatności", - "pleaseWaitForSometimeBeforeRetrying": "Proszę poczekać chwilę przed ponowną próbą", + "pleaseWaitForSometimeBeforeRetrying": "Prosimy poczekać chwilę przed ponowną próbą", "paymentFailedMessage": "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!", "youAreOnAFamilyPlan": "Jesteś w planie rodzinnym!", "contactFamilyAdmin": "Proszę skontaktuj się z {familyAdminEmail}, by zarzadząć swoją subskrypcją", @@ -665,12 +665,12 @@ "endtoendEncryptedByDefault": "Domyślnie zaszyfrowane metodą end-to-end", "safelyStored": "Bezpiecznie przechowywane", "atAFalloutShelter": "w schronie", - "designedToOutlive": "Zaprojektowane do przetrwania na zawsze", + "designedToOutlive": "Zaprojektowane do przetrwania", "available": "Dostępne", "everywhere": "wszędzie", "androidIosWebDesktop": "Android, iOS, Strona Internetowa, Aplikacja Komputerowa", - "mobileWebDesktop": "Aplikacja Mobilna, Strona Internetowa, Komputer", - "newToEnte": "Nowy do Ente", + "mobileWebDesktop": "Aplikacja Mobilna, Strona Internetowa, Aplikacja Komputerowa", + "newToEnte": "Nowy/a do Ente", "pleaseLoginAgain": "Zaloguj się ponownie", "autoLogoutMessage": "Z powodu technicznego błędu, zostałeś wylogowany. Przepraszamy za niedogodności.", "yourSubscriptionHasExpired": "Twoja subskrypcja wygasła", @@ -684,7 +684,7 @@ "backupFailed": "Tworzenie kopii zapasowej nie powiodło się", "couldNotBackUpTryLater": "Nie można utworzyć kopii zapasowej Twoich danych.\nSpróbujemy ponownie później.", "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente może zaszyfrować i zachować pliki tylko wtedy, gdy udzielisz do nich dostępu", - "pleaseGrantPermissions": "Proszę przyznać uprawnienia", + "pleaseGrantPermissions": "Prosimy przyznać uprawnienia", "grantPermission": "Przyznaj uprawnienie", "privateSharing": "Udostępnianie prywatne", "shareOnlyWithThePeopleYouWant": "Udostępnij tylko ludziom, którym chcesz", @@ -795,7 +795,7 @@ } } }, - "deleteAll": "Usuń wszystkie", + "deleteAll": "Usuń Wszystko", "renameAlbum": "Zmień nazwę albumu", "convertToAlbum": "Konwertuj na album", "setCover": "Ustaw okładkę", @@ -904,7 +904,7 @@ "freeUpAmount": "Zwolnij {sizeInMBorGB}", "thisEmailIsAlreadyInUse": "Ten e-mail jest już używany", "incorrectCode": "Nieprawidłowy kod", - "authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, proszę spróbować ponownie", + "authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, prosimy spróbować ponownie", "verificationFailedPleaseTryAgain": "Weryfikacja nie powiodła się, spróbuj ponownie", "authenticating": "Uwierzytelnianie...", "authenticationSuccessful": "Uwierzytelnianie powiodło się!", @@ -937,7 +937,7 @@ } }, "archiving": "Archiwizowanie...", - "unarchiving": "Odarchiwizowanie...", + "unarchiving": "Usuwanie z archiwum...", "successfullyArchived": "Pomyślnie zarchiwizowano", "successfullyUnarchived": "Pomyślnie przywrócono z archiwum", "renameFile": "Zmień nazwę pliku", @@ -982,7 +982,7 @@ "loadMessage1": "Możesz udostępnić swoją subskrypcję swojej rodzinie", "loadMessage2": "Do tej pory zachowaliśmy ponad 30 milionów wspomnień", "loadMessage3": "Przechowujemy 3 kopie Twoich danych, jedną w podziemnym schronie", - "loadMessage4": "Wszystkie nasze aplikacje mają otwarte źródło", + "loadMessage4": "Wszystkie nasze aplikacje są otwarto źródłowe", "loadMessage5": "Nasz kod źródłowy i kryptografia zostały poddane zewnętrznemu audytowi", "loadMessage6": "Możesz udostępniać linki do swoich albumów swoim bliskim", "loadMessage7": "Nasze aplikacje mobilne działają w tle, aby zaszyfrować i wykonać kopię zapasową wszystkich nowych zdjęć, które klikniesz", @@ -1000,7 +1000,7 @@ "searchFileTypesAndNamesEmptySection": "Typy plików i nazwy", "searchCaptionEmptySection": "Dodaj opisy takie jak \"#trip\" w informacji o zdjęciu, aby szybko znaleźć je tutaj", "language": "Język", - "selectLanguage": "Wybierz język", + "selectLanguage": "Wybierz Język", "locationName": "Nazwa lokalizacji", "addLocation": "Dodaj lokalizację", "groupNearbyPhotos": "Grupuj pobliskie zdjęcia", @@ -1012,7 +1012,7 @@ "save": "Zapisz", "centerPoint": "Punkt środkowy", "pickCenterPoint": "Wybierz punkt środkowy", - "useSelectedPhoto": "Użyj zaznaczonego zdjęcia", + "useSelectedPhoto": "Użyj zaznaczone zdjęcie", "resetToDefault": "Przywróć domyślne", "@resetToDefault": { "description": "Button text to reset cover photo to default" @@ -1091,7 +1091,7 @@ "@androidDeviceCredentialsSetupDescription": { "description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side." }, - "goToSettings": "Przejdź do Ustawień", + "goToSettings": "Przejdź do ustawień", "@goToSettings": { "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." }, @@ -1143,6 +1143,7 @@ "successfullyHid": "Pomyślnie ukryto", "successfullyUnhid": "Pomyślnie odkryto", "crashReporting": "Zgłaszanie awarii", + "enableMultiPartUpload": "Włącz przesyłanie wieloczęściowe", "addToHiddenAlbum": "Dodaj do ukrytego albumu", "moveToHiddenAlbum": "Przenieś do ukrytego albumu", "fileTypes": "Rodzaje plików", @@ -1194,8 +1195,8 @@ "selectALocationFirst": "Najpierw wybierz lokalizację", "changeLocationOfSelectedItems": "Zmienić lokalizację wybranych elementów?", "editsToLocationWillOnlyBeSeenWithinEnte": "Edycje lokalizacji będą widoczne tylko w Ente", - "cleanUncategorized": "Wyczyść niekategoryzowane", - "cleanUncategorizedDescription": "Usuń wszystkie pliki z niekategoryzowanych, które są obecne w innych albumach", + "cleanUncategorized": "Wyczyść Nieskategoryzowane", + "cleanUncategorizedDescription": "Usuń wszystkie pliki z Nieskategoryzowanych, które są obecne w innych albumach", "waitingForVerification": "Oczekiwanie na weryfikację...", "passkey": "Klucz dostępu", "passkeyAuthTitle": "Weryfikacja kluczem dostępu", @@ -1203,7 +1204,7 @@ "loginSessionExpired": "Sesja wygasła", "loginSessionExpiredDetails": "Twoja sesja wygasła. Zaloguj się ponownie.", "verifyPasskey": "Zweryfikuj klucz dostępu", - "playOnTv": "Odtwarzaj album w telewizji", + "playOnTv": "Odtwórz album na telewizorze", "pair": "Sparuj", "deviceNotFound": "Nie znaleziono urządzenia", "castInstruction": "Odwiedź cast.ente.io na urządzeniu, które chcesz sparować.\n\nWprowadź poniższy kod, aby odtworzyć album na telewizorze.", @@ -1214,10 +1215,10 @@ "addAName": "Dodaj nazwę", "findPeopleByName": "Szybko szukaj osób po imieniu", "addViewers": "{count, plural, one {Dodaj widza} few {Dodaj widzów} many {Dodaj widzów} other {Dodaj widzów}}", - "addCollaborators": "{count, plural, one {Dodaj współpracownika} few {Dodaj współpracowników} many {Dodaj współpracowników} other {Dodaj współpracowników}}", + "addCollaborators": "{count, plural, one {Dodaj współuczestnika} few {Dodaj współuczestników} many {Dodaj współuczestników} other {Dodaj współuczestników}}", "longPressAnEmailToVerifyEndToEndEncryption": "Naciśnij i przytrzymaj e-mail, aby zweryfikować szyfrowanie end-to-end.", "developerSettingsWarning": "Czy na pewno chcesz zmodyfikować ustawienia programisty?", - "developerSettings": "Ustawienia deweloperskie", + "developerSettings": "Ustawienia dla programistów", "serverEndpoint": "Punkt końcowy serwera", "invalidEndpoint": "Punkt końcowy jest nieprawidłowy", "invalidEndpointMessage": "Niestety, wprowadzony punkt końcowy jest nieprawidłowy. Wprowadź prawidłowy punkt końcowy i spróbuj ponownie.", @@ -1231,8 +1232,8 @@ "manualPairDesc": "Parowanie PIN-em działa z każdym ekranem, na którym chcesz wyświetlić swój album.", "connectToDevice": "Połącz z urządzeniem", "autoCastDialogBody": "Tutaj zobaczysz dostępne urządzenia Cast.", - "autoCastiOSPermission": "Upewnij się, że uprawnienia sieci lokalnej są włączone dla aplikacji Ente Zdjęcia w Ustawieniach.", - "noDeviceFound": "Nie wykryto urządzenia", + "autoCastiOSPermission": "Upewnij się, że uprawnienia sieci lokalnej są włączone dla aplikacji Zdjęcia Ente w Ustawieniach.", + "noDeviceFound": "Nie znaleziono żadnego urządzenia", "stopCastingTitle": "Zatrzymaj wyświetlanie", "stopCastingBody": "Czy chcesz przestać wyświetlać?", "castIPMismatchTitle": "Nie udało się wyświetlić albumu", @@ -1240,10 +1241,10 @@ "pairingComplete": "Parowanie zakończone", "savingEdits": "Zapisywanie zmian...", "autoPair": "Automatyczne parowanie", - "pairWithPin": "Sparuj z kodem PIN", + "pairWithPin": "Sparuj kodem PIN", "faceRecognition": "Rozpoznawanie twarzy", - "foundFaces": "Znalezione twarze", - "clusteringProgress": "Postęp grupowania", + "foundFaces": "Znaleziono twarze", + "clusteringProgress": "Postęp tworzenia klastrów", "indexingIsPaused": "Wstrzymano indeksowanie. Zostanie ono automatycznie wznowione, gdy urządzenie będzie gotowe.", "trim": "Przytnij", "crop": "Kadruj", diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index b1fe399716..5b57b202a5 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1143,6 +1143,7 @@ "successfullyHid": "Ocultado com sucesso", "successfullyUnhid": "Desocultado com sucesso", "crashReporting": "Relatório de falhas", + "enableMultiPartUpload": "Ativar envio de várias partes", "addToHiddenAlbum": "Adicionar a álbum oculto", "moveToHiddenAlbum": "Mover para álbum oculto", "fileTypes": "Tipos de arquivo", diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 2055ef0322..a8abc5dfcb 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -936,10 +936,10 @@ } } }, - "archiving": "正在归档中...", - "unarchiving": "正在取消归档...", - "successfullyArchived": "归档成功", - "successfullyUnarchived": "取消归档成功", + "archiving": "正在存档...", + "unarchiving": "正在取消存档...", + "successfullyArchived": "存档成功", + "successfullyUnarchived": "取消存档成功", "renameFile": "重命名文件", "enterFileName": "请输入文件名", "filesDeleted": "文件已删除", @@ -1143,6 +1143,7 @@ "successfullyHid": "已成功隐藏", "successfullyUnhid": "已成功取消隐藏", "crashReporting": "上报崩溃", + "enableMultiPartUpload": "启用分片上传", "addToHiddenAlbum": "添加到隐藏相册", "moveToHiddenAlbum": "移至隐藏相册", "fileTypes": "文件类型", @@ -1279,7 +1280,6 @@ "tooManyIncorrectAttempts": "错误尝试次数过多", "videoInfo": "视频详情", "appLockDescription": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。", - "swipeLockEnablePreSteps": "要启用滑动锁定,请在系统设置中设置设备密码或屏幕锁。", "autoLock": "自动锁定", "immediately": "立即", "autoLockFeatureDescription": "应用程序进入后台后锁定的时间", @@ -1291,6 +1291,6 @@ "pleaseSelectQuickLinksToRemove": "请选择要删除的快速链接", "removePublicLinks": "删除公开链接", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "这将删除所有选定的快速链接的公共链接。", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestView": "访客视图", + "guestViewEnablePreSteps": "要启用访客视图,请在系统设置中设置设备密码或屏幕锁。" } \ No newline at end of file From 6bdafc0ed231fa0dbcf288c93874326e2922f059 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 19 Aug 2024 01:16:45 +0000 Subject: [PATCH 0393/1179] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_ar.arb | 102 +++++++++++++++++++++++++++------- auth/lib/l10n/arb/app_ca.arb | 8 ++- auth/lib/l10n/arb/app_hi.arb | 5 +- auth/lib/l10n/arb/app_nl.arb | 3 +- auth/lib/l10n/arb/app_pl.arb | 94 +++++++++++++++---------------- auth/lib/l10n/arb/app_pt.arb | 104 +++++++++++++++++------------------ auth/lib/l10n/arb/app_ru.arb | 28 +++++++++- 7 files changed, 222 insertions(+), 122 deletions(-) diff --git a/auth/lib/l10n/arb/app_ar.arb b/auth/lib/l10n/arb/app_ar.arb index f9d37c7ba9..db71268f8b 100644 --- a/auth/lib/l10n/arb/app_ar.arb +++ b/auth/lib/l10n/arb/app_ar.arb @@ -6,11 +6,11 @@ "@counterAppBarTitle": { "description": "Text shown in the AppBar of the Counter Page" }, - "onBoardingBody": "النسخ الاحتياطي لأوامر 2FA", - "onBoardingGetStarted": "إبدأ الآن", + "onBoardingBody": "النسخ الاحتياطي لشيفرات الاستيثاق ذي العاملين", + "onBoardingGetStarted": "ابدأ الآن", "setupFirstAccount": "إعداد الحساب الأول الخاص بك", - "importScanQrCode": "مسح رمز QR", - "qrCode": "رمز QR", + "importScanQrCode": "مسح شيفرة الاستجابة السريعة", + "qrCode": "شيفرة الاستجابة السريعة", "importEnterSetupKey": "أدخِل مفتاح الإعداد", "importAccountPageTitle": "أدخل تفاصيل الحساب", "secretCanNotBeEmpty": "لا يمكن أن يكون رمز السر فارغ", @@ -20,6 +20,8 @@ "codeIssuerHint": "المصدِّر", "codeSecretKeyHint": "الرمز السري", "codeAccountHint": "الحساب (you@domain.com)", + "codeTagHint": "وسم", + "accountKeyType": "نوع المفتاح", "sessionExpired": "انتهت صلاحية الجلسة", "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" @@ -31,10 +33,10 @@ "saveAction": "حفظ", "nextTotpTitle": "التالي", "deleteCodeTitle": "حذف الرمز؟", - "deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذا الرمز ؟ هذا الإجراء لا رجعة فيه.", - "viewLogsAction": "عرض السجل", - "sendLogsDescription": "هذا سوف يرسل عبر السجلات لمساعدتنا على تصحيح مشكلتك. وبينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل تقاسمها.", - "preparingLogsTitle": "جاري إعداد السجلات...", + "deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.", + "viewLogsAction": "عرض السجلات", + "sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.", + "preparingLogsTitle": "جارٍ إعداد السجلات...", "emailLogsTitle": "سجلات البريد الإلكتروني", "emailLogsMessage": "الرجاء إرسال السجلات إلى {email}", "@emailLogsMessage": { @@ -69,21 +71,23 @@ "useRecoveryKey": "استخدم مفتاح الاسترداد", "incorrectPasswordTitle": "كلمة المرور غير صحيحة", "welcomeBack": "مرحبًا مجددًا!", - "madeWithLoveAtPrefix": "مصنوعة مع ❤️ في ", + "madeWithLoveAtPrefix": "مصنوعة بـ❤️ في ", "supportDevs": "اشترك في ente لدعمنا", "supportDiscount": "استخدم رمز القسيمة \"AUTH\" للحصول على 10% خصم من السنة الأولى", - "changeEmail": "تغيير البريد الإلكتروني", - "changePassword": "تغيير كلمة المرور", + "changeEmail": "غير البريد الإلكتروني", + "changePassword": "غير كلمة المرور", "data": "البيانات", - "importCodes": "رمزالاستيراد", - "importTypePlainText": "نص عادي", + "importCodes": "استورد شيفرات", + "importTypePlainText": "نص بسيط", + "importTypeEnteEncrypted": "تصدير Ente Ecrypted", "passwordForDecryptingExport": "كلمة المرور لفك تشفير التصدير", "passwordEmptyError": "لا يمكن أن تكون كلمة المرور فارغة", - "importFromApp": "استيراد الرموز من {appName}", - "importGoogleAuthGuide": "قم بتصدير حساباتك من Google Authenticator إلى رمز QR code باستخدام خيار \"Transfer Accounts\" ثم استخدم جهازًا آخر لمسح رمز الاستجابة السريعة ضوئيًا.\n\nنصيحة: يمكنك استخدام كاميرا الويب الخاصة بالكمبيوتر المحمول لالتقاط صورة لرمز الاستجابة السريعة.", - "importSelectJsonFile": "حدد ملف JSON", - "importSelectAppExport": "حدد ملف التصدير {appName}", - "importRaivoGuide": "استخدم خيار تصدير OTP إلى أرشيف Zip في إعدادات Raivo.\n\nاستخرج ملف zip واسترد ملف JSON.", + "importFromApp": "استورد الشيفرات من {appName}", + "importGoogleAuthGuide": "صدر حساباتك من Google Authenticator إلى شيفرة استجابة سريعة باستخدام خيار \"نقل الحسابات\" ثم استخدم جهازًا آخر لمسح شيفرة الاستجابة السريعة ضوئيًا.\n\nنصيحة: يمكنك استخدام كاميرا الشبكة الخاصة بحاسوبك المحمول لالتقاط صورة لشيفرة الاستجابة السريعة.", + "importSelectJsonFile": "انتقِ ملف JSON", + "importSelectAppExport": "حدد ملف التصدير الخاص بـ{appName}", + "importEnteEncGuide": "اختر ملف JSON المشفر المصدَّر من Ente", + "importRaivoGuide": "استخدم خيار \"صدر كلمات المرور لمرة واحدة إلى أرشيف Zip\" في إعدادات Raivo.\n\nاستخرج ملف الـzip واسترد ملف الـJSON.", "importBitwardenGuide": "استخدم خيار \"تصدير خزانة\" داخل أدوات Bitwarden واستيراد ملف JSON غير مشفر.", "importAegisGuide": "استخدم خيار \"Export the vault\" في إعدادات Aegis.\n\nإذا كان المخزن الخاص بك مشفرًا، فستحتاج إلى إدخال كلمة مرور المخزن لفك تشفير المخزن.", "import2FasGuide": "استخدم خيار \"الإعدادات -> النسخ الاحتياطي - التصدير\" في 2FAS.\n\nإذا تم تشفير النسخة الاحتياطية، سوف تحتاج إلى إدخال كلمة المرور لفك تشفير النسخة الاحتياطية", @@ -112,18 +116,22 @@ "copied": "تم النسخ", "pleaseTryAgain": "حاول مرة اخرى", "existingUser": "المستخدم موجود", + "newUser": "جديد في Ente", "delete": "حذف", "enterYourPasswordHint": "أدخل كلمة المرور الخاصة بك", "forgotPassword": "هل نسيت كلمة المرور", "oops": "عذرًا", "suggestFeatures": "اقتراح ميزة", "faq": "الأسئلة الأكثر شيوعاً", + "faq_q_1": "إلى أي مدى Auth آمن؟", + "faq_a_1": "كل الشيفرات التي تنسخها احتياطيا بواسطة Auth تخزن مشفرة من الطرفين. يعني هذا أنك وحدك من يمكنك الوصول لشيفراتك. تطبيقاتنا مفتوحة المصدر وتشفيرنا تم اختباره من جهات خارجية.", "faq_q_2": "هل يمكنني الوصول إلى رموزي على سطح المكتب؟", "faq_a_2": "يمكنك الوصول إلى رموزك على الويب @ auth.ente.io.", "faq_q_3": "كيف يمكنني حذف الرموز؟", "faq_a_3": "يمكنك حذف الرمز عن طريق السحب لليسار على هذا العنصر.", "faq_q_4": "كيف يمكنني دعم هذا المشروع؟", "faq_a_4": "يمكنك دعم تطوير هذا المشروع عن طريق الاشتراك في تطبيق الصور @ ente.io.", + "faq_q_5": "كيف يمكنني تفعيل قفل FaceID في Auth", "faq_a_5": "يمكنك تمكين قفل FaceID تحت الإعدادات => الحماية => قفل الشاشة.", "somethingWentWrongMessage": "حدث خطأ ما، يرجى المحاولة مرة أخرى", "leaveFamily": "مغادرة خطة العائلة", @@ -150,6 +158,7 @@ } } }, + "invalidQRCode": "شيفرة استجابة سريعة غير صالحة", "noRecoveryKeyTitle": "لا يوجد مفتاح استرجاع؟", "enterEmailHint": "أدخل عنوان البريد الإلكتروني الخاص بك", "invalidEmailTitle": "عنوان البريد الإلكتروني غير صالح", @@ -194,6 +203,8 @@ "saveKey": "حفظ المفتاح", "save": "حفظ", "send": "إرسال", + "saveOrSendDescription": "هل تريد حفظه إلى السعة التخزينية الخاصة بك (مجلد التنزيلات افتراضيا) أم إرساله إلى تطبيقات أخرى؟", + "saveOnlyDescription": "هل تريد حفظه إلى السعة التخزينية الخاصة بك (مجلد التنزيلات افتراضيا)؟", "back": "الرجوع", "createAccount": "إنشاء حساب", "passwordStrength": "قوة كلمة المرور: {passwordStrengthValue}", @@ -252,12 +263,15 @@ "exportLogs": "تصدير السجلات", "enterYourRecoveryKey": "أدخل رمز الاسترداد", "tempErrorContactSupportIfPersists": "يبدو أنه حدث خطأ ما. الرجاء إعادة المحاولة لاحقا. إذا استمر الخطأ، يرجى الاتصال بفريق الدعم.", + "networkHostLookUpErr": "تعذر الاتصال بـEnte، فضلا تحقق من إعدادات الشبكة الخاصة بك وتواصل مع الدعم إذا استمر الخطأ.", + "networkConnectionRefusedErr": "تعذر الإتصال بـEnte، فضلا أعد المحاولة لاحقا. إذا استمر الخطأ، فضلا تواصل مع الدعم.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "يبدو أنه حدث خطأ ما. الرجاء إعادة المحاولة لاحقا. إذا استمر الخطأ، يرجى الاتصال بفريق الدعم.", "about": "حول", "weAreOpenSource": "الخدمة مفتوحة المصدر!", "privacy": "الخصوصية", "terms": "الشروط", "checkForUpdates": "بحث عن تحديثات", + "checkStatus": "تحقق من الحالة", "downloadUpdate": "تحميل", "criticalUpdateAvailable": "تحديث حاسم متوفر", "updateAvailable": "التحديث متاح", @@ -341,6 +355,7 @@ "deleteCodeAuthMessage": "المصادقة لحذف الرمز", "showQRAuthMessage": "المصادقة لإظهار رمز QR", "confirmAccountDeleteTitle": "تأكيد حذف الحساب", + "confirmAccountDeleteMessage": "هذا الحساب مرتبط بتطبيقات Ente أخرى، إذا كنت تستخدم أحدها.\n\nسنضع موعدا لحذف بياناتك المرفوعة عبر كل تطبيقات Ente، وسيتم حذف حسابك بصورة دائمة.", "androidBiometricHint": "التحقق من الهوية", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -401,6 +416,55 @@ "doNotSignOut": "لا تقم بتسجيل الخروج", "hearUsWhereTitle": "كيف سمعت عن Ente؟ (اختياري)", "hearUsExplanation": "نحن لا نتتبع تثبيت التطبيق. سيكون من المفيد إذا أخبرتنا أين وجدتنا!", + "recoveryKeySaved": "حُفِظ مفتاح الاستعادة في مجلد التنزيلات!", + "waitingForBrowserRequest": "بانتظار طلب المتصفح...", + "waitingForVerification": "بانتظار التحقق...", "passkey": "مفتاح المرور", - "developerSettings": "اعدادات المطور" + "passKeyPendingVerification": "التحقق ما زال جارٍ", + "loginSessionExpired": "انتهت صلاحية الجلسة", + "loginSessionExpiredDetails": "انتهت صلاحية جلستك. فضلا أعد تسجيل الدخول.", + "developerSettingsWarning": "هل أنت متأكد أنك تريد تعديل خيارات المطور؟", + "developerSettings": "اعدادات المطور", + "serverEndpoint": "نقطة طرف الخادم", + "invalidEndpoint": "نقطة طرف غير صالحة", + "invalidEndpointMessage": "عذرا، نقطة الطرف التي أدخلتها غير صالحة. فضلا أدخل نقطة طرف صالحة وأعد المحاولة.", + "endpointUpdatedMessage": "حُدِّثَت نقطة الطرف بنجاح", + "customEndpoint": "متصل بـ{endpoint}", + "pinText": "ثبت", + "unpinText": "ألغِ التثبيت", + "pinnedCodeMessage": "ثُبِّت {code}", + "unpinnedCodeMessage": "أُلغِي تثبيت {code}", + "tags": "الأوسمة", + "createNewTag": "أنشيء وسم جديد", + "tag": "وسم", + "create": "أنشيء", + "editTag": "حرر الوسم", + "deleteTagTitle": "حذف الوسم؟", + "deleteTagMessage": "هل أنت متأكد أنك تريد حذف هذا الوسم؟ لا يمكن عكس هذا الإجراء.", + "somethingWentWrongParsingCode": "تعذر علينا إعراب أكواد {x}.", + "updateNotAvailable": "التحديث غير متاح", + "viewRawCodes": "عرض الشيفرات الأصلية", + "rawCodes": "الشيفرات الأصلية", + "rawCodeData": "بيانات الشيفرات الأصلية", + "appLock": "قفل التطبيق", + "noSystemLockFound": "لا يوجد قفل نظام", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "لتمكين قفل التطبيق، فضلا أعد شيفرة مرور الجهاز أو قفل الشاشة في إعدادات نظامك.", + "autoLock": "قفل تلقائي", + "immediately": "فورًا", + "reEnterPassword": "أعد إدخال كلمة المرور", + "reEnterPin": "أعد إدخال رقم التعريف الشخصي", + "next": "التالي", + "tooManyIncorrectAttempts": "محاولات خاطئة أكثر من المسموح", + "tapToUnlock": "المس لإلغاء القفل", + "setNewPassword": "عين كلمة مرور جديدة", + "deviceLock": "قفل الجهاز", + "hideContent": "أخفِ المحتوى", + "hideContentDescriptionAndroid": "يخفي محتوى التطبيق في مبدل التطبيقات ويمنع لقطات الشاشة", + "hideContentDescriptioniOS": "يخفي محتوى التطبيق في مبدل التطبيقات", + "autoLockFeatureDescription": "الوقت الذي بعده ينقفل التطبيق بعدما يوضع في الخلفية", + "appLockDescription": "اختر بين شاشة القفل الافتراضية الخاصة بجهازك وشاشة قفل مخصصة برقم تعريف شخصي أو كلمة مرور.", + "pinLock": "قفل رقم التعريف الشخصي", + "enterPin": "أدخل رقم التعريف الشخصي", + "setNewPin": "عين رقم تعريف شخصي جديد", + "importFailureDescNew": "تعذر إعراب الملف المنتقى." } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_ca.arb b/auth/lib/l10n/arb/app_ca.arb index 9ba17aac84..806186818f 100644 --- a/auth/lib/l10n/arb/app_ca.arb +++ b/auth/lib/l10n/arb/app_ca.arb @@ -16,5 +16,11 @@ }, "pleaseLoginAgain": "Torna a iniciar sessió", "verifyPassword": "Verifica la contrasenya", - "pleaseWait": "Si us plau, espera..." + "pleaseWait": "Si us plau, espera...", + "incorrectPasswordTitle": "Contrasenya incorrecta", + "welcomeBack": "Benvingut de nou!", + "madeWithLoveAtPrefix": "fet amb ❤️ a ", + "changeEmail": "Canvia el correu electrònic", + "changePassword": "Canvia la contrasenya", + "importTypePlainText": "Text pla" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_hi.arb b/auth/lib/l10n/arb/app_hi.arb index 9e26dfeeb6..6be531505b 100644 --- a/auth/lib/l10n/arb/app_hi.arb +++ b/auth/lib/l10n/arb/app_hi.arb @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "account": "खाता", + "unlock": "खोलें" +} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_nl.arb b/auth/lib/l10n/arb/app_nl.arb index d0ffb56a20..a998025512 100644 --- a/auth/lib/l10n/arb/app_nl.arb +++ b/auth/lib/l10n/arb/app_nl.arb @@ -465,5 +465,6 @@ "appLockDescription": "Kies tussen de standaard schermvergrendeling van uw apparaat en een aangepaste schermvergrendeling met een pincode of wachtwoord.", "pinLock": "Pin vergrendeling", "enterPin": "Pin invoeren", - "setNewPin": "Nieuwe pin instellen" + "setNewPin": "Nieuwe pin instellen", + "importFailureDescNew": "Kon het geselecteerde bestand niet lezen." } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_pl.arb b/auth/lib/l10n/arb/app_pl.arb index d7ad3c4f1f..f7917109cc 100644 --- a/auth/lib/l10n/arb/app_pl.arb +++ b/auth/lib/l10n/arb/app_pl.arb @@ -16,9 +16,9 @@ "secretCanNotBeEmpty": "Sekret nie może być pusty", "bothIssuerAndAccountCanNotBeEmpty": "Pola wydawca i konto nie mogą być puste", "incorrectDetails": "Nieprawidłowe szczegóły", - "pleaseVerifyDetails": "Proszę zweryfikować szczegóły i spróbuj ponownie", + "pleaseVerifyDetails": "Prosimy zweryfikować szczegóły i spróbować ponownie", "codeIssuerHint": "Wydawca", - "codeSecretKeyHint": "Tajny klucz", + "codeSecretKeyHint": "Tajny Klucz", "codeAccountHint": "Konto (ty@domena.com)", "codeTagHint": "Oznacz", "accountKeyType": "Rodzaj klucza", @@ -26,7 +26,7 @@ "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" }, - "pleaseLoginAgain": "Prosimy zaloguj się ponownie", + "pleaseLoginAgain": "Prosimy zalogować się ponownie", "loggingOut": "Wylogowywanie...", "timeBasedKeyType": "Oparte na czasie (TOTP)", "counterBasedKeyType": "Oparte na liczniku (HOTP)", @@ -36,9 +36,9 @@ "deleteCodeMessage": "Czy na pewno chcesz usunąć ten kod? Ta akcja jest nieodwracalna.", "viewLogsAction": "Wyświetl logi", "sendLogsDescription": "Spowoduje to przesłanie logów, które pomogą nam rozwiązać Twój problem. Chociaż podejmujemy środki ostrożności, aby zapewnić, że wrażliwe informacje nie są rejestrowane, zachęcamy do obejrzenia tych dzienników przed ich udostępnieniem.", - "preparingLogsTitle": "Przygotowanie logów...", - "emailLogsTitle": "Wyślij log mailem", - "emailLogsMessage": "Proszę wysłać logi do {email}", + "preparingLogsTitle": "Przygotowywanie logów...", + "emailLogsTitle": "Wyślij logi mailem", + "emailLogsMessage": "Prosimy wysłać logi do {email}", "@emailLogsMessage": { "placeholders": { "email": { @@ -64,14 +64,14 @@ "blog": "Blog", "merchandise": "Sklep", "verifyPassword": "Zweryfikuj hasło", - "pleaseWait": "Proszę czekać...", + "pleaseWait": "Prosimy czekać...", "generatingEncryptionKeysTitle": "Generowanie kluczy szyfrujących...", "recreatePassword": "Zresetuj hasło", "recreatePasswordMessage": "Obecne urządzenie nie jest wystarczająco wydajne, aby zweryfikować Twoje hasło, więc musimy je raz zregenerować w sposób, który działa ze wszystkimi urządzeniami. \n\nZaloguj się przy użyciu klucza odzyskiwania i zresetuj swoje hasło (możesz ponownie użyć tego samego, jeśli chcesz).", "useRecoveryKey": "Użyj kodu odzyskiwania", "incorrectPasswordTitle": "Nieprawidłowe hasło", "welcomeBack": "Witaj ponownie!", - "madeWithLoveAtPrefix": "wykonane z ❤️ w ", + "madeWithLoveAtPrefix": "zrobione z ❤️ w ", "supportDevs": "Subskrybuj ente aby wesprzeć ten projekt.", "supportDiscount": "Użyj kodu rabatowego \"AUTH\", aby otrzymać 10% rabatu na pierwszy rok", "changeEmail": "Zmień adres e-mail", @@ -98,13 +98,13 @@ "importCodeDelimiterInfo": "Kody mogą być oddzielone przecinkiem lub nową linią", "selectFile": "Wybierz plik", "emailVerificationToggle": "Weryfikacja e-mail", - "emailVerificationEnableWarning": "Jeśli przechowujesz uwierzytelnianie dwuskładnikowe do twojego e-mailu z nami, włączenie weryfikacji adresu e-mail może spowodować impas. Jeśli jesteś zablokowany z jednej usługi, możesz nie być w stanie zalogować się do drugiej.", - "authToChangeEmailVerificationSetting": "Proszę uwierzytelnić, aby zmienić weryfikację e-mail", - "authToViewYourRecoveryKey": "Proszę uwierzytelnić, aby wyświetlić swój klucz odzyskiwania", - "authToChangeYourEmail": "Proszę uwierzytelnić, aby zmienić swój adres e-mail", - "authToChangeYourPassword": "Proszę uwierzytelnić, aby zmienić hasło", - "authToViewSecrets": "Proszę uwierzytelnić, aby wyświetlić swoje sekrety", - "authToInitiateSignIn": "Proszę uwierzytelnić się, aby zainicjować logowanie do kopii zapasowej.", + "emailVerificationEnableWarning": "Aby uniknąć zablokowania się z konta, upewnij się, że przed włączeniem weryfikacji e-mail przechowujesz kopię 2FA dla swojego adresu e-mail poza Ente Auth.", + "authToChangeEmailVerificationSetting": "Prosimy uwierzytelnić się, aby zmienić weryfikację e-mail", + "authToViewYourRecoveryKey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania", + "authToChangeYourEmail": "Prosimy uwierzytelnić się, aby zmienić swój adres e-mail", + "authToChangeYourPassword": "Prosimy uwierzytelnić się, aby zmienić hasło", + "authToViewSecrets": "Prosimy uwierzytelnić się, aby wyświetlić swoje sekrety", + "authToInitiateSignIn": "Prosimy uwierzytelnić się, aby zainicjować logowanie do kopii zapasowej.", "ok": "Ok", "cancel": "Anuluj", "yes": "Tak", @@ -114,8 +114,8 @@ "general": "Ogólne", "settings": "Ustawienia", "copied": "Skopiowano", - "pleaseTryAgain": "Proszę spróbować ponownie", - "existingUser": "Istniejący użytkownik", + "pleaseTryAgain": "Prosimy spróbować ponownie", + "existingUser": "Istniejący Użytkownik", "newUser": "Nowy/a do Ente", "delete": "Usuń", "enterYourPasswordHint": "Wprowadź swoje hasło", @@ -133,7 +133,7 @@ "faq_a_4": "Możesz wspierać rozwój tego projektu, subskrybując do naszej aplikacji Zdjęcia na ente.io.", "faq_q_5": "Jak mogę włączyć blokadę FaceID w Ente Auth", "faq_a_5": "Możesz włączyć blokadę FaceID w Ustawienia → Bezpieczeństwo→ Ekran blokady.", - "somethingWentWrongMessage": "Coś poszło nie tak. Proszę, spróbuj ponownie", + "somethingWentWrongMessage": "Coś poszło nie tak, prosimy spróbować ponownie", "leaveFamily": "Opuść rodzinę", "leaveFamilyMessage": "Czy jesteś pewien/pewna, że chcesz opuścić plan rodzinny?", "inFamilyPlanMessage": "Jesteś w planie rodzinnym!", @@ -142,7 +142,7 @@ "scanACode": "Skanuj kod", "verify": "Zweryfikuj", "verifyEmail": "Zweryfikuj adres e-mail", - "enterCodeHint": "Wprowadź sześciocyfrowy kod z twojej aplikacji uwierzytelniającej", + "enterCodeHint": "Wprowadź sześciocyfrowy kod z \nTwojej aplikacji uwierzytelniającej", "lostDeviceTitle": "Zagubiono urządzenie?", "twoFactorAuthTitle": "Uwierzytelnianie dwustopniowe", "passkeyAuthTitle": "Weryfikacja kluczem dostępu", @@ -150,7 +150,7 @@ "recoverAccount": "Odzyskaj konto", "enterRecoveryKeyHint": "Wprowadź swój klucz odzyskiwania", "recover": "Odzyskaj", - "contactSupportViaEmailMessage": "Wyślij wiadomość e-mail na {email} z zarejestrowanego adresu e-mail", + "contactSupportViaEmailMessage": "Wyślij wiadomość e-mail na {email} z Twojego zarejestrowanego adresu e-mail", "@contactSupportViaEmailMessage": { "placeholders": { "email": { @@ -162,17 +162,17 @@ "noRecoveryKeyTitle": "Brak klucza odzyskiwania?", "enterEmailHint": "Wprowadź adres e-mail", "invalidEmailTitle": "Nieprawidłowy adres e-mail", - "invalidEmailMessage": "Proszę wpisać prawidłowy adres e-mail.", + "invalidEmailMessage": "Prosimy podać prawidłowy adres e-mail.", "deleteAccount": "Usuń konto", "deleteAccountQuery": "Będzie nam przykro, że odchodzisz. Masz jakiś problem?", "yesSendFeedbackAction": "Tak, wyślij opinię", "noDeleteAccountAction": "Nie, usuń moje konto", - "initiateAccountDeleteTitle": "Proszę uwierzytelnić, aby zainicjować usuwanie konta", + "initiateAccountDeleteTitle": "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta", "sendEmail": "Wyślij e-mail", "createNewAccount": "Utwórz nowe konto", "weakStrength": "Słabe", "strongStrength": "Silne", - "moderateStrength": "Umiarkowany", + "moderateStrength": "Umiarkowane", "confirmPassword": "Potwierdź hasło", "close": "Zamknij", "oopsSomethingWentWrong": "Ups! Coś poszło nie tak.", @@ -181,10 +181,10 @@ "social": "Społeczność", "security": "Bezpieczeństwo", "lockscreen": "Ekran blokady", - "authToChangeLockscreenSetting": "Proszę uwierzytelnić, aby zmienić ustawienia ekranu blokady", + "authToChangeLockscreenSetting": "Prosimy uwierzytelnić się, aby zmienić ustawienia ekranu blokady", "lockScreenEnablePreSteps": "Aby włączyć ekran blokady, ustaw hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", - "viewActiveSessions": "Zobacz aktualne sesje", - "authToViewYourActiveSessions": "Proszę uwierzytelnić, aby wyświetlić swój klucz odzyskiwania", + "viewActiveSessions": "Zobacz aktywne sesje", + "authToViewYourActiveSessions": "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje", "searchHint": "Szukaj...", "search": "Szukaj", "sorryUnableToGenCode": "Przepraszamy, nie można wygenerować kodu dla {issuerName}", @@ -199,12 +199,12 @@ "recoveryKeyCopiedToClipboard": "Klucz odzyskiwania został skopiowany do schowka", "recoveryKeyOnForgotPassword": "Jeśli zapomnisz hasła, jedynym sposobem na odzyskanie danych jest ten klucz.", "recoveryKeySaveDescription": "Nie przechowujemy tego klucza, proszę zachować ten 24 wyrazowy klucz w bezpiecznym miejscu.", - "doThisLater": "Zrób To Później", + "doThisLater": "Zrób to później", "saveKey": "Zapisz klucz", "save": "Zapisz", "send": "Wyślij", - "saveOrSendDescription": "Czy chcesz zapisać to do pamięci masowej (domyślnie folder Pobrane) czy wysłać to do innych aplikacji?", - "saveOnlyDescription": "Czy chcesz zapisać to do pamięci masowej (domyślnie folder Pobrane)?", + "saveOrSendDescription": "Czy chcesz zapisać to do swojej pamięci masowej (domyślnie folder Pobrane) czy wysłać to do innych aplikacji?", + "saveOnlyDescription": "Czy chcesz zapisać to do swojej pamięci masowej (domyślnie folder Pobrane)?", "back": "Wstecz", "createAccount": "Utwórz konto", "passwordStrength": "Siła hasła: {passwordStrengthValue}", @@ -221,7 +221,7 @@ }, "password": "Hasło", "signUpTerms": "Akceptuję warunki korzystania z usługi i politykę prywatności", - "privacyPolicyTitle": "Polityka prywatności", + "privacyPolicyTitle": "Polityka Prywatności", "termsOfServicesTitle": "Regulamin", "encryption": "Szyfrowanie", "setPasswordTitle": "Ustaw hasło", @@ -238,7 +238,7 @@ "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Przepraszamy, nie mogliśmy wygenerować kluczy bezpiecznych na tym urządzeniu.\n\nZarejestruj się z innego urządzenia.", "howItWorks": "Jak to działa", "ackPasswordLostWarning": "Rozumiem, że jeśli utracę hasło, mogę stracić moje dane, ponieważ moje dane są szyfrowane end-to-end.", - "loginTerms": "Klikając zaloguj się zgadzam się na Regulamin i politykę prywatności", + "loginTerms": "Klikając, zaloguj się, zgadzam się na regulamin i politykę prywatności", "logInLabel": "Zaloguj się", "logout": "Wyloguj się", "areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?", @@ -246,8 +246,8 @@ "exit": "Wyjdź", "verifyingRecoveryKey": "Weryfikowanie klucza odzyskiwania...", "recoveryKeyVerified": "Klucz odzyskiwania zweryfikowany", - "recoveryKeySuccessBody": "Świetnie! Twój klucz odzyskiwania jest prawidłowy. Dziękuję za weryfikację.\n\nPamiętaj, aby przechowywać klucz odzyskiwania w bezpiecznej kopii zapasowej.", - "invalidRecoveryKey": "Wprowadzony klucz odzyskiwania jest nieprawidłowy. Upewnij się, że zawiera 24 słowa i sprawdź pisownię każdego z nich.\n\nJeśli wprowadziłeś starszy kod odzyskiwania, upewnij się, że ma on 64 znaki i sprawdź każdy z nich.", + "recoveryKeySuccessBody": "Znakomicie! Klucz odzyskiwania jest prawidłowy. Dziękujemy za weryfikację.\n\nPamiętaj, aby bezpiecznie przechowywać kopię zapasową klucza odzyskiwania.", + "invalidRecoveryKey": "Wprowadzony klucz odzyskiwania jest nieprawidłowy. Upewnij się, że zawiera 24 słowa i sprawdź pisownię każdego z nich.\n\nJeśli wprowadziłeś/aś starszy kod odzyskiwania, upewnij się, że ma on 64 znaki i sprawdź każdy z nich.", "recreatePasswordTitle": "Zresetuj hasło", "recreatePasswordBody": "Obecne urządzenie nie jest wystarczająco wydajne, aby zweryfikować Twoje hasło, więc musimy je raz zregenerować w sposób, który działa ze wszystkimi urządzeniami. \n\nZaloguj się przy użyciu klucza odzyskiwania i zresetuj swoje hasło (możesz ponownie użyć tego samego, jeśli chcesz).", "invalidKey": "Nieprawidłowy klucz", @@ -258,7 +258,7 @@ "confirmYourRecoveryKey": "Potwierdź klucz odzyskiwania", "confirm": "Potwierdź", "emailYourLogs": "Wyślij mailem logi", - "pleaseSendTheLogsTo": "Proszę wysłać logi do {toEmail}", + "pleaseSendTheLogsTo": "Prosimy wysłać logi do {toEmail}", "copyEmailAddress": "Kopiuj adres e-mail", "exportLogs": "Eksportuj logi", "enterYourRecoveryKey": "Wprowadź swój klucz odzyskiwania", @@ -279,14 +279,14 @@ "checking": "Sprawdzanie...", "youAreOnTheLatestVersion": "Używasz najnowszej wersji", "warning": "Ostrzeżenie", - "exportWarningDesc": "Wyeksportowany plik zawiera poufne informacje. Przechowuj to bezpiecznie.", + "exportWarningDesc": "Wyeksportowany plik zawiera poufne informacje. Przechowuj go bezpiecznie.", "iUnderStand": "Rozumiem", "@iUnderStand": { "description": "Text for the button to confirm the user understands the warning" }, - "authToExportCodes": "Proszę uwierzytelnić, aby wyeksportować swoje kody", + "authToExportCodes": "Prosimy uwierzytelnić się, aby wyeksportować swoje kody", "importSuccessTitle": "Hura!", - "importSuccessDesc": "Zaimportowałeś {count} kodów!", + "importSuccessDesc": "Zaimportowałeś/aś {count} kodów!", "@importSuccessDesc": { "placeholders": { "count": { @@ -328,7 +328,7 @@ "incorrectCode": "Nieprawidłowy kod", "sorryTheCodeYouveEnteredIsIncorrect": "Niestety, wprowadzony kod jest nieprawidłowy", "emailChangedTo": "Adres e-mail został zmieniony na {newEmail}", - "authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, proszę spróbować ponownie", + "authenticationFailedPleaseTryAgain": "Uwierzytelnianie nie powiodło się, prosimy spróbować ponownie", "authenticationSuccessful": "Uwierzytelnianie powiodło się!", "twofactorAuthenticationSuccessfullyReset": "Pomyślnie zresetowano uwierzytelnianie dwustopniowe", "incorrectRecoveryKey": "Nieprawidłowy klucz odzyskiwania", @@ -343,7 +343,7 @@ "useOffline": "Używaj bez kopii zapasowych", "signInToBackup": "Zaloguj się, aby wykonać kopię zapasową swoich kodów", "singIn": "Zaloguj się", - "sigInBackupReminder": "Proszę wyeksportować swoje kody, aby upewnić się, że masz kopię zapasową, z której możesz przywrócić swoje kody.", + "sigInBackupReminder": "Prosimy wyeksportować swoje kody, aby upewnić się, że masz kopię zapasową, z której możesz przywrócić swoje kody.", "offlineModeWarning": "Wybrałeś kontynuację bez kopii zapasowych. Proszę wykonywać ręczne kopie zapasowe, aby upewnić się, że Twoje kody są bezpieczne.", "showLargeIcons": "Pokaż duże ikony", "shouldHideCode": "Ukryj kody", @@ -351,9 +351,9 @@ "focusOnSearchBar": "Uaktywnij wyszukiwanie przy uruchamianiu aplikacji", "confirmUpdatingkey": "Czy na pewno chcesz zaktualizować tajny klucz?", "minimizeAppOnCopy": "Minimalizuj aplikację przy kopiowaniu", - "editCodeAuthMessage": "Uwierzytelnij, aby edytować kod", - "deleteCodeAuthMessage": "Uwierzytelnij, aby usunąć kod", - "showQRAuthMessage": "Uwierzytelnij, aby pokazać kod QR", + "editCodeAuthMessage": "Uwierzytelnij się, aby edytować kod", + "deleteCodeAuthMessage": "Uwierzytelnij się, aby usunąć kod", + "showQRAuthMessage": "Uwierzytelnij się, aby pokazać kod QR", "confirmAccountDeleteTitle": "Potwierdź usunięcie konta", "confirmAccountDeleteMessage": "To konto jest połączone z innymi aplikacjami Ente, jeśli ich używasz.\n\nTwoje przesłane dane, we wszystkich aplikacjach Ente, zostaną zaplanowane do usunięcia, a Twoje konto zostanie trwale usunięte.", "androidBiometricHint": "Potwierdź swoją tożsamość", @@ -388,7 +388,7 @@ "@androidDeviceCredentialsSetupDescription": { "description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side." }, - "goToSettings": "Przejdź do Ustawień", + "goToSettings": "Przejdź do ustawień", "@goToSettings": { "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." }, @@ -409,12 +409,12 @@ "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." }, "noInternetConnection": "Brak połączenia z Internetem", - "pleaseCheckYourInternetConnectionAndTryAgain": "Proszę sprawdzić połączenie internetowe i spróbować ponownie.", + "pleaseCheckYourInternetConnectionAndTryAgain": "Prosimy sprawdzić połączenie internetowe i spróbować ponownie.", "signOutFromOtherDevices": "Wyloguj z pozostałych urządzeń", "signOutOtherBody": "Jeśli uważasz, że ktoś może znać Twoje hasło, możesz wymusić wylogowanie na wszystkich innych urządzeniach korzystających z Twojego konta.", "signOutOtherDevices": "Wyloguj z pozostałych urządzeń", "doNotSignOut": "Nie wylogowuj mnie", - "hearUsWhereTitle": "Jak usłyszałeś o Ente? (opcjonalnie)", + "hearUsWhereTitle": "Jak usłyszałeś/aś o Ente? (opcjonalnie)", "hearUsExplanation": "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!", "recoveryKeySaved": "Klucz odzyskiwania zapisany w folderze Pobrane!", "waitingForBrowserRequest": "Oczekiwanie na żądanie przeglądarki...", @@ -424,7 +424,7 @@ "loginSessionExpired": "Sesja wygasła", "loginSessionExpiredDetails": "Twoja sesja wygasła. Zaloguj się ponownie.", "developerSettingsWarning": "Czy na pewno chcesz zmodyfikować ustawienia programisty?", - "developerSettings": "Ustawienia deweloperskie", + "developerSettings": "Ustawienia dla programistów", "serverEndpoint": "Punkt końcowy serwera", "invalidEndpoint": "Punkt końcowy jest nieprawidłowy", "invalidEndpointMessage": "Niestety, wprowadzony punkt końcowy jest nieprawidłowy. Wprowadź prawidłowy punkt końcowy i spróbuj ponownie.", @@ -441,7 +441,7 @@ "editTag": "Edytuj Etykietę", "deleteTagTitle": "Usunąć etykietę?", "deleteTagMessage": "Czy na pewno chcesz usunąć tę etykietę? Ta akcja jest nieodwracalna.", - "somethingWentWrongParsingCode": "Nie udało się przetworzyć kodów {x}.", + "somethingWentWrongParsingCode": "Nie udało się przetworzyć {x} kodów.", "updateNotAvailable": "Aktualizacja jest niedostępna", "viewRawCodes": "Zobacz surowe kody", "rawCodes": "Surowe kody", diff --git a/auth/lib/l10n/arb/app_pt.arb b/auth/lib/l10n/arb/app_pt.arb index e9bb5f06c4..399b6f09a5 100644 --- a/auth/lib/l10n/arb/app_pt.arb +++ b/auth/lib/l10n/arb/app_pt.arb @@ -6,15 +6,15 @@ "@counterAppBarTitle": { "description": "Text shown in the AppBar of the Counter Page" }, - "onBoardingBody": "Proteja seus códigos 2FA", + "onBoardingBody": "Proteja os seus códigos 2FA", "onBoardingGetStarted": "Introdução", "setupFirstAccount": "Configure sua primeira conta", "importScanQrCode": "Escanear QR code", "qrCode": "QR Code", "importEnterSetupKey": "Insira uma chave de configuração", - "importAccountPageTitle": "Inserir detalhes da conta", + "importAccountPageTitle": "Inserir dados da conta", "secretCanNotBeEmpty": "A chave secreta não pode ser vazia", - "bothIssuerAndAccountCanNotBeEmpty": "Emissor e conta não podem ficar vazios", + "bothIssuerAndAccountCanNotBeEmpty": "O emissor e a conta não podem estar vazios", "incorrectDetails": "Detalhes incorretos", "pleaseVerifyDetails": "Por favor, verifique os detalhes e tente novamente", "codeIssuerHint": "Emissor", @@ -33,12 +33,12 @@ "saveAction": "Salvar", "nextTotpTitle": "avançar", "deleteCodeTitle": "Apagar código?", - "deleteCodeMessage": "Tem certeza de que deseja excluir este código? Esta ação é irreversível.", + "deleteCodeMessage": "Deseja mesmo excluir este código? Esta ação é irreversível.", "viewLogsAction": "Ver logs", - "sendLogsDescription": "Isto irá compartilhar seus logs para nos ajudar a depurar seu problema. Embora tomemos precauções para garantir que informações sensíveis não sejam enviadas, encorajamos você a ver esses logs antes de compartilhá-los.", + "sendLogsDescription": "Isto compartilhará seus logs para ajudar-nos depurar seu problema. Enquanto tomamos precauções para ter certeza que as informações sensíveis não estejam registradas, nós encorajamos você a visualizar esses logs antes de compartilhá-los.", "preparingLogsTitle": "Preparando logs...", "emailLogsTitle": "Logs (e-mail)", - "emailLogsMessage": "Por favor, envie os logs para {email}", + "emailLogsMessage": "Envie os logs para {email}", "@emailLogsMessage": { "placeholders": { "email": { @@ -67,7 +67,7 @@ "pleaseWait": "Aguarde...", "generatingEncryptionKeysTitle": "Gerando chaves de criptografia...", "recreatePassword": "Recriar senha", - "recreatePasswordMessage": "O dispositivo atual não é poderoso o suficiente para verificar sua senha, mas podemos regenerar de uma forma que funcione com todos os dispositivos.\n\nPor favor, faça o login usando sua chave de recuperação e recrie sua senha (você pode usar o mesmo novamente se desejar).", + "recreatePasswordMessage": "Não é possível verificar a sua senha no dispositivo atual, então precisamos regenerá-la para que funcione em todos os dispositivos. \n\nEntre com a sua chave de recuperação e regenere sua senha (você pode usar a mesma se quiser).", "useRecoveryKey": "Usar chave de recuperação", "incorrectPasswordTitle": "Senha incorreta", "welcomeBack": "Bem-vindo(a) de volta!", @@ -124,25 +124,25 @@ "suggestFeatures": "Sugerir recursos", "faq": "Perguntas frequentes", "faq_q_1": "Quão seguro é o Auth?", - "faq_a_1": "Todos os códigos que você faz backup via Auth são armazenados criptografados de ponta a ponta. Isso significa que somente você pode acessar seus códigos. Nossos aplicativos são de código aberto e nossa criptografia foi auditada externamente.", - "faq_q_2": "Eu posso acessar meus códigos no computador?", + "faq_a_1": "Todos os backups de códigos via Auth são armazenados com criptografia de ponta-a-ponta. Isso significa que só você pode acessar os códigos. Nossos apps são de código-aberto e nossa criptografia é auditada por terceiros.", + "faq_q_2": "Posso acessar meus códigos no computador?", "faq_a_2": "Você pode acessar seus códigos na web em auth.ente.io.", "faq_q_3": "Como posso excluir códigos?", "faq_a_3": "Você pode excluir um código deslizando para a esquerda sobre esse item.", "faq_q_4": "Como posso apoiar este projeto?", - "faq_a_4": "Você pode apoiar o desenvolvimento deste projeto assinando nosso aplicativo de Fotos em ente.io.", - "faq_q_5": "Como posso ativar o bloqueio facial no Auth", + "faq_a_4": "Você pode apoiar o desenvolvimento do projeto com a assinatura do nosso app Photos @ ente.io.", + "faq_q_5": "Como ativar o bloqueio facial no Auth", "faq_a_5": "Você pode ativar o bloqueio facial em Configurações → Segurança → Tela de bloqueio.", - "somethingWentWrongMessage": "Algo deu errado. Por favor, tente outra vez", + "somethingWentWrongMessage": "Algo deu errado. Tente outra vez", "leaveFamily": "Sair da família", - "leaveFamilyMessage": "Tem certeza que deseja sair do plano familiar?", + "leaveFamilyMessage": "Deseja mesmo sair do plano familiar?", "inFamilyPlanMessage": "Você está em um plano familiar!", "swipeHint": "Deslize para a esquerda para editar ou remover os códigos", "scan": "Escanear", "scanACode": "Escanear código", "verify": "Verificar", "verifyEmail": "Verificar e-mail", - "enterCodeHint": "Digite o código de 6 dígitos de\nseu aplicativo autenticador", + "enterCodeHint": "Digite o código de 6 dígitos\ndo seu app autenticador", "lostDeviceTitle": "Perdeu um dispositivo?", "twoFactorAuthTitle": "Autenticação de dois fatores", "passkeyAuthTitle": "Verificação de chave de acesso", @@ -162,9 +162,9 @@ "noRecoveryKeyTitle": "Sem chave de recuperação?", "enterEmailHint": "Insira o endereço de e-mail", "invalidEmailTitle": "Endereço de e-mail inválido", - "invalidEmailMessage": "Por favor, insira um endereço de e-mail válido.", + "invalidEmailMessage": "Insira um endereço de e-mail válido.", "deleteAccount": "Excluir conta", - "deleteAccountQuery": "Sentiremos muito por vê-lo partir. Você está enfrentando algum problema?", + "deleteAccountQuery": "Estamos tristes com sua decisão. Você encontrou algum problema?", "yesSendFeedbackAction": "Sim, enviar feedback", "noDeleteAccountAction": "Não, excluir conta", "initiateAccountDeleteTitle": "Por favor, autentique-se para iniciar a exclusão de conta", @@ -191,20 +191,20 @@ "noResult": "Nenhum resultado", "addCode": "Adicionar código", "scanAQrCode": "Escanear QR code", - "enterDetailsManually": "Insira os dados manualmente", + "enterDetailsManually": "Inserir dados manualmente", "edit": "Editar", "copiedToClipboard": "Copiado para a área de transferência", - "copiedNextToClipboard": "Copiado o próximo código para a área de transferência", + "copiedNextToClipboard": "Próximo código copiado para a área de transferência", "error": "Erro", - "recoveryKeyCopiedToClipboard": "A chave de recuperação foi copiada para a área de transferência", - "recoveryKeyOnForgotPassword": "Caso você esqueça sua senha, a única maneira de recuperar seus dados é com essa chave.", - "recoveryKeySaveDescription": "Não armazenamos essa chave, por favor, salve essa chave de 24 palavras em um lugar seguro.", + "recoveryKeyCopiedToClipboard": "Chave de recuperação copiada para a área de transferência", + "recoveryKeyOnForgotPassword": "Caso esqueça sua senha, a única maneira de recuperar seus dados é com esta chave.", + "recoveryKeySaveDescription": "Não armazenamos esta chave de 24 palavras. Salve-a em um lugar seguro.", "doThisLater": "Fazer isso depois", "saveKey": "Salvar chave", "save": "Salvar", "send": "Enviar", - "saveOrSendDescription": "Você deseja salvar isso no seu armazenamento (pasta de downloads por padrão) ou enviá-lo para outros aplicativos?", - "saveOnlyDescription": "Você deseja salvar isto no seu armazenamento (pasta de downloads por padrão)?", + "saveOrSendDescription": "Deseja mesmo salvar em seu armazenamento (pasta Downloads por padrão) ou enviar para outros apps?", + "saveOnlyDescription": "Deseja mesmo salvar em seu armazenamento (pasta Downloads por padrão)?", "back": "Voltar", "createAccount": "Criar conta", "passwordStrength": "Força da senha: {passwordStrengthValue}", @@ -228,10 +228,10 @@ "changePasswordTitle": "Alterar senha", "resetPasswordTitle": "Redefinir senha", "encryptionKeys": "Chaves de criptografia", - "passwordWarning": "Nós não salvamos essa senha, então se você a esquecer, nós não poderemos descriptografar seus dados", + "passwordWarning": "Não salvamos esta senha, então se você esquecê-la, não podemos descriptografar seus dados", "enterPasswordToEncrypt": "Digite uma senha que podemos usar para criptografar seus dados", - "enterNewPasswordToEncrypt": "Insira uma senha nova para criptografar seus dados", - "passwordChangedSuccessfully": "Senha alterada com sucesso", + "enterNewPasswordToEncrypt": "Insira uma nova senha para criptografar seus dados", + "passwordChangedSuccessfully": "A senha foi alterada", "generatingEncryptionKeys": "Gerando chaves de criptografia...", "continueLabel": "Continuar", "insecureDevice": "Dispositivo inseguro", @@ -241,15 +241,15 @@ "loginTerms": "Ao clicar em login, eu concordo com os termos de serviço e a política de privacidade", "logInLabel": "Entrar", "logout": "Sair", - "areYouSureYouWantToLogout": "Você tem certeza que deseja encerrar a sessão?", - "yesLogout": "Sim, saia", + "areYouSureYouWantToLogout": "Deseja mesmo sair?", + "yesLogout": "Sim, quero sair", "exit": "Sair", "verifyingRecoveryKey": "Verificando chave de recuperação...", "recoveryKeyVerified": "Chave de recuperação verificada", "recoveryKeySuccessBody": "Ótimo! Sua chave de recuperação é válida. Obrigado por verificar.\n\nLembre-se de manter o backup seguro de sua chave de recuperação.", "invalidRecoveryKey": "A chave de recuperação que você digitou não é válida. Certifique-se de que contém 24 palavras e verifique a ortografia de cada uma.\n\nSe você inseriu um código de recuperação mais antigo, verifique se ele tem 64 caracteres e verifique cada um deles.", "recreatePasswordTitle": "Redefinir senha", - "recreatePasswordBody": "O dispositivo atual não é poderoso o suficiente para verificar sua senha, mas podemos recriar de uma forma que funcione com todos os dispositivos.\n\nPor favor, faça o login usando sua chave de recuperação e recrie sua senha (você pode usar a mesma novamente se desejar).", + "recreatePasswordBody": "Não é possível verificar a sua senha no dispositivo atual, mas podemos regenerá-la para que funcione em todos os dispositivos. \n\nEntre com a sua chave de recuperação e regenere sua senha (você pode usar a mesma se quiser).", "invalidKey": "Chave inválida", "tryAgain": "Tente novamente", "viewRecoveryKey": "Ver chave de recuperação", @@ -258,7 +258,7 @@ "confirmYourRecoveryKey": "Confirme sua chave de recuperação", "confirm": "Confirmar", "emailYourLogs": "Enviar logs por e-mail", - "pleaseSendTheLogsTo": "Por favor, envie os logs para \n{toEmail}", + "pleaseSendTheLogsTo": "Envie os logs para \n{toEmail}", "copyEmailAddress": "Copiar endereço de e-mail", "exportLogs": "Exportar logs", "enterYourRecoveryKey": "Digite a chave de recuperação", @@ -275,7 +275,7 @@ "downloadUpdate": "Baixar", "criticalUpdateAvailable": "Atualização crítica disponível", "updateAvailable": "Atualização disponível", - "update": "Atualização", + "update": "Atualizar", "checking": "Verificando...", "youAreOnTheLatestVersion": "Você está na versão mais recente", "warning": "Atenção", @@ -323,8 +323,8 @@ "thisDevice": "Esse dispositivo", "toResetVerifyEmail": "Para redefinir a sua senha, por favor verifique o seu email primeiro.", "thisEmailIsAlreadyInUse": "Este e-mail já está em uso", - "verificationFailedPleaseTryAgain": "Falha na verificação. Por favor, tente novamente", - "yourVerificationCodeHasExpired": "O código de verificação expirou", + "verificationFailedPleaseTryAgain": "Falha na verificação. Tente novamente", + "yourVerificationCodeHasExpired": "Seu código de verificação expirou", "incorrectCode": "Código incorreto", "sorryTheCodeYouveEnteredIsIncorrect": "Desculpe, o código que você inseriu está incorreto", "emailChangedTo": "E-mail alterado para {newEmail}", @@ -335,7 +335,7 @@ "theRecoveryKeyYouEnteredIsIncorrect": "A chave de recuperação inserida está incorreta", "enterPassword": "Inserir senha", "selectExportFormat": "Selecione o formato para exportação", - "exportDialogDesc": "As exportações criptografadas ficarão protegidas por uma senha de sua escolha.", + "exportDialogDesc": "As exportações criptografadas serão protegidas por uma senha de sua escolha.", "encrypted": "Criptografado", "plainText": "Texto simples", "passwordToEncryptExport": "Senha para criptografar a exportação", @@ -349,13 +349,13 @@ "shouldHideCode": "Ocultar códigos", "doubleTapToViewHiddenCode": "Você pode tocar duas vezes em uma entrada para ver o código", "focusOnSearchBar": "Foco na busca ao iniciar o app", - "confirmUpdatingkey": "Você tem certeza que deseja atualizar a chave secreta?", + "confirmUpdatingkey": "Deseja mesmo atualizar a sua chave secreta?", "minimizeAppOnCopy": "Minimizar app ao copiar", "editCodeAuthMessage": "Autenticar para editar o código", "deleteCodeAuthMessage": "Autenticar para excluir o código", "showQRAuthMessage": "Autenticar para mostrar o QR code", "confirmAccountDeleteTitle": "Confirmar exclusão de conta", - "confirmAccountDeleteMessage": "Esta conta está vinculada a outros aplicativos Ente, se você usa algum.\n\nSeus dados enviados, em todos os aplicativos Ente, serão agendados para exclusão, e sua conta será excluída permanentemente.", + "confirmAccountDeleteMessage": "Esta conta está vinculada a outros apps Ente, se você usa algum.\n\nSeus dados enviados, entre todos os apps Ente, serão marcados para exclusão, e sua conta será apagada permanentemente.", "androidBiometricHint": "Verificar identidade", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -380,11 +380,11 @@ "@androidBiometricRequiredTitle": { "description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters." }, - "androidDeviceCredentialsRequiredTitle": "Credenciais do dispositivo são necessárias", + "androidDeviceCredentialsRequiredTitle": "Credenciais do dispositivo necessárias", "@androidDeviceCredentialsRequiredTitle": { "description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters." }, - "androidDeviceCredentialsSetupDescription": "Credenciais do dispositivo são necessárias", + "androidDeviceCredentialsSetupDescription": "Credenciais do dispositivo necessárias", "@androidDeviceCredentialsSetupDescription": { "description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side." }, @@ -410,25 +410,25 @@ }, "noInternetConnection": "Não conectado à internet", "pleaseCheckYourInternetConnectionAndTryAgain": "Verifique sua conexão com a internet e tente novamente.", - "signOutFromOtherDevices": "Terminar sessão em outros dispositivos", + "signOutFromOtherDevices": "Sair da conta em outros dispositivos", "signOutOtherBody": "Se você acha que alguém pode saber sua senha, você pode forçar todos os outros dispositivos que estão com sua conta a desconectar.", "signOutOtherDevices": "Sair em outros dispositivos", "doNotSignOut": "Não sair", "hearUsWhereTitle": "Como você ouviu sobre o Ente? (opcional)", - "hearUsExplanation": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", + "hearUsExplanation": "Não sabemos como você encontrou nosso app. Seria útil se você nos contasse!", "recoveryKeySaved": "Chave de recuperação salva na pasta Downloads!", "waitingForBrowserRequest": "Aguardando solicitação do navegador...", - "waitingForVerification": "Esperando por verificação...", + "waitingForVerification": "Aguardando verificação...", "passkey": "Chave de acesso", "passKeyPendingVerification": "A verificação ainda está pendente", "loginSessionExpired": "Sessão expirada", "loginSessionExpiredDetails": "Sua sessão expirou. Por favor, entre novamente.", - "developerSettingsWarning": "Tem certeza de que deseja modificar as configurações de Desenvolvedor?", + "developerSettingsWarning": "Deseja mesmo alterar os ajustes de Desenvolvedor?", "developerSettings": "Ajustes de Desenvolvedor", "serverEndpoint": "Endpoint do servidor", "invalidEndpoint": "Endpoint inválido", "invalidEndpointMessage": "Desculpe, o endpoint que você inseriu é inválido. Por favor, insira um endpoint válido e tente novamente.", - "endpointUpdatedMessage": "Endpoint atualizado com sucesso", + "endpointUpdatedMessage": "O endpoint foi atualizado", "customEndpoint": "Conectado a {endpoint}", "pinText": "Fixar", "unpinText": "Desafixar", @@ -440,28 +440,28 @@ "create": "Criar", "editTag": "Editar etiqueta", "deleteTagTitle": "Apagar etiqueta?", - "deleteTagMessage": "Tem certeza de que deseja excluir esta etiqueta? Essa ação é irreversível.", + "deleteTagMessage": "Deseja mesmo excluir esta etiqueta? Essa ação é irreversível.", "somethingWentWrongParsingCode": "Não foi possível analisar os códigos {x}.", "updateNotAvailable": "Atualização indisponível", "viewRawCodes": "Ver códigos brutos", - "rawCodes": "Código bruto", - "rawCodeData": "Dado do código bruto", - "appLock": "Bloqueio de app", - "noSystemLockFound": "Nenhum bloqueio de sistema encontrado", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", + "rawCodes": "Códigos brutos", + "rawCodeData": "Dados de códigos brutos", + "appLock": "Bloqueio do app", + "noSystemLockFound": "Nenhum bloqueio do sistema encontrado", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema.", "autoLock": "Bloqueio automático", "immediately": "Imediatamente", "reEnterPassword": "Reinserir senha", "reEnterPin": "Reinserir PIN", - "next": "Próximo", + "next": "Avançar", "tooManyIncorrectAttempts": "Muitas tentativas incorretas", "tapToUnlock": "Toque para desbloquear", - "setNewPassword": "Defina nova senha", + "setNewPassword": "Defina a nova senha", "deviceLock": "Bloqueio do dispositivo", "hideContent": "Ocultar conteúdo", "hideContentDescriptionAndroid": "Oculta o conteúdo do app no seletor de apps e desativa as capturas de tela", "hideContentDescriptioniOS": "Oculta o conteúdo do seletor de apps", - "autoLockFeatureDescription": "Tempo após o qual o app bloqueia depois de ser colocado em segundo plano", + "autoLockFeatureDescription": "Tempo de bloqueio do app em segundo plano", "appLockDescription": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.", "pinLock": "Bloqueio PIN", "enterPin": "Insira o PIN", diff --git a/auth/lib/l10n/arb/app_ru.arb b/auth/lib/l10n/arb/app_ru.arb index 8b38703698..7ebecdc987 100644 --- a/auth/lib/l10n/arb/app_ru.arb +++ b/auth/lib/l10n/arb/app_ru.arb @@ -263,6 +263,8 @@ "exportLogs": "Экспорт журналов", "enterYourRecoveryKey": "Введите свой ключ восстановления", "tempErrorContactSupportIfPersists": "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки.", + "networkHostLookUpErr": "Не удается подключиться к Ente, пожалуйста, проверьте настройки своей сети и обратитесь в службу поддержки, если ошибка повторится.", + "networkConnectionRefusedErr": "Не удается подключиться к Ente, пожалуйста, повторите попытку через некоторое время. Если ошибка не устраняется, обратитесь в службу поддержки.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки.", "about": "О программе", "weAreOpenSource": "У нас открытое программное обеспечение!", @@ -440,5 +442,29 @@ "deleteTagTitle": "Удалить метку?", "deleteTagMessage": "Вы уверены, что хотите удалить эту метку? Это действие необратимо.", "somethingWentWrongParsingCode": "Мы не смогли разобрать коды {x}.", - "updateNotAvailable": "Обновление недоступно" + "updateNotAvailable": "Обновление недоступно", + "viewRawCodes": "Просмотр сырых кодов", + "rawCodes": "Сырые коды", + "rawCodeData": "Сырая информация кодов", + "appLock": "Блокировка приложения", + "noSystemLockFound": "Системная блокировка не найдена", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.", + "autoLock": "Автоблокировка", + "immediately": "Немедленно", + "reEnterPassword": "Подтвердите пароль", + "reEnterPin": "Введите PIN-код ещё раз", + "next": "Далее", + "tooManyIncorrectAttempts": "Слишком много неудачных попыток", + "tapToUnlock": "Нажмите для разблокировки", + "setNewPassword": "Задать новый пароль", + "deviceLock": "Блокировка устройства", + "hideContent": "Скрыть содержимое", + "hideContentDescriptionAndroid": "Скрывает содержимое приложения в переключателе приложений и отключает скриншоты", + "hideContentDescriptioniOS": "Скрывает содержимое приложения в переключателе приложений", + "autoLockFeatureDescription": "Время в фоне, после которого приложение блокируется", + "appLockDescription": "Выберите между экраном блокировки вашего устройства и пользовательским экраном блокировки с PIN-кодом или паролем.", + "pinLock": "Pin Замок", + "enterPin": "Введите PIN", + "setNewPin": "Установите новый PIN", + "importFailureDescNew": "Не удалось обработать выбранный файл." } \ No newline at end of file From fed7864b11aed78bf0d20c2b1ab0a1f5088773df Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 13:45:35 +0530 Subject: [PATCH 0394/1179] Fetching state --- web/apps/photos/src/services/searchService.ts | 4 ++ .../new/photos/components/MLSettings.tsx | 14 +++++-- web/packages/new/photos/services/ml/index.ts | 10 +++-- web/packages/new/photos/services/ml/worker.ts | 38 +++++++++++++++---- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 987a4cdacb..1be9fa01fd 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -193,6 +193,10 @@ export async function getMLStatusSuggestion(): Promise { case "indexing": label = t("indexing_photos", status); break; + case "fetching": + // label = pt("Fetching"indexing_photos", status); + label = `Fetching indexes (${status.nSyncedFiles} / ${status.nTotalFiles})`; + break; case "clustering": label = t("indexing_people", status); break; diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 581869e0bd..87613912d7 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,6 +1,7 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { MenuItemGroup } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; +import { pt } from "@/base/i18n"; import log from "@/base/log"; import { disableML, @@ -299,12 +300,15 @@ const ManageML: React.FC = ({ let status: string; switch (phase) { - case "indexing": - status = "running"; - break; case "scheduled": status = "scheduled"; break; + case "fetching": + status = "fetching"; + break; + case "indexing": + status = "running"; + break; // TODO: Clustering default: status = "done"; @@ -352,7 +356,9 @@ const ManageML: React.FC = ({ {t("indexing")} - {t("indexing_status", { context: status })} + {status == "fetching" + ? pt("Fetching") + : t("indexing_status", { context: status })} diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index f6e0be04e6..e4c56a4569 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -404,13 +404,16 @@ export type MLStatus = * * - "indexing": The indexer is currently running. * + * - "fetching": The indexer is currently running, but we're primarily + * fetching indexes for existing files. + * * - "clustering": All file we know of have been indexed, and we are now * clustering the faces that were found. * * - "done": ML indexing and face clustering is complete for the user's * library. */ - phase: "scheduled" | "indexing" | "clustering" | "done"; + phase: "scheduled" | "indexing" | "fetching" | "clustering" | "done"; /** The number of files that have already been indexed. */ nSyncedFiles: number; /** The total number of files that are eligible for indexing. */ @@ -478,8 +481,9 @@ const getMLStatus = async (): Promise => { let phase: MLStatus["phase"]; if (indexableCount > 0) { - const isIndexing = await (await worker()).isIndexing(); - phase = !isIndexing ? "scheduled" : "indexing"; + const state = await (await worker()).state; + phase = + state == "indexing" || state == "fetching" ? state : "scheduled"; } else { phase = "done"; } diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 7e6825ad9b..79520cc076 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -1,4 +1,5 @@ import { clientPackageName } from "@/base/app"; +import { assertionFailed } from "@/base/assert"; import { isHTTP4xxError } from "@/base/http"; import { getKVN } from "@/base/kv"; import { ensureAuthToken } from "@/base/local-user"; @@ -39,6 +40,20 @@ import { } from "./ml-data"; import type { CLIPMatches, MLWorkerDelegate } from "./worker-types"; +/** + * A rough hint at what the worker is up to. + * + * - "idle": Not doing anything + * - "tick": Transitioning to a new state + * - "indexing": Indexing + * - "fetching": A subset of indexing + * + * During indexing, the state is set to "fetching" whenever remote provided us + * data for more than 50% of the files that we requested from it in the last + * fetch during indexing. + */ +export type WorkerState = "idle" | "tick" | "indexing" | "fetching"; + const idleDurationStart = 5; /* 5 seconds */ const idleDurationMax = 16 * 60; /* 16 minutes */ @@ -76,9 +91,11 @@ interface IndexableItem { * particular, for finding the closest CLIP match when the user does a search. */ export class MLWorker { + /** The last known state of the worker. */ + public state: WorkerState = "idle"; + private electron: ElectronMLWorker | undefined; private delegate: MLWorkerDelegate | undefined; - private state: "idle" | "tick" | "indexing" = "idle"; private liveQ: IndexableItem[] = []; private idleTimeout: ReturnType | undefined; private idleDuration = idleDurationStart; /* unit: seconds */ @@ -164,13 +181,6 @@ export class MLWorker { } } - /** - * Return true if we're currently indexing. - */ - isIndexing() { - return this.state == "indexing"; - } - /** * Find {@link CLIPMatches} for a given {@link searchPhrase}. */ @@ -234,8 +244,20 @@ export class MLWorker { 200, ); if (!filesByID.size) return []; + // Fetch their existing ML data (if any). const mlDataByID = await fetchMLData(filesByID); + + // If the number of files for which remote gave us data is more than 50% + // of what we asked of it, assume we are "fetching", not "indexing". + // This is a heuristic to try and show a better indexing state in the UI + // (so that the user does not think that their files are being + // unnecessarily reindexed). + if (this.state != "indexing" && this.state != "fetching") + assertionFailed(`Unexpected state ${this.state}`); + this.state = + mlDataByID.size * 2 > filesByID.size ? "fetching" : "indexing"; + // Return files after annotating them with their existing ML data. return Array.from(filesByID, ([id, file]) => ({ enteFile: file, From aaebef5b2208cde92519e6922db8bf4e38493565 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:18:45 +0530 Subject: [PATCH 0395/1179] [mob] Show score if query contains score threshold --- mobile/lib/models/file/file.dart | 4 +++- .../semantic_search/semantic_search_service.dart | 12 ++++++++++++ mobile/lib/ui/viewer/file/thumbnail_widget.dart | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mobile/lib/models/file/file.dart b/mobile/lib/models/file/file.dart index 40d4a388af..979cf27059 100644 --- a/mobile/lib/models/file/file.dart +++ b/mobile/lib/models/file/file.dart @@ -268,9 +268,11 @@ class EnteFile { } String? get caption { - return pubMagicMetadata?.caption; + return debugCaption ?? pubMagicMetadata?.caption; } + String? debugCaption; + String get thumbnailUrl { if (localFileServer.isNotEmpty) { return "$localFileServer/thumb/$uploadedFileID"; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 44c90964e2..f8354f49c9 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -144,12 +144,14 @@ class SemanticSearchService { String query, { double? scoreThreshold, }) async { + bool showScore = false; // if the query starts with 0.xxx, the split the query to get score threshold and actual query if (query.startsWith(RegExp(r"0\.\d+"))) { final parts = query.split(" "); if (parts.length > 1) { scoreThreshold = double.parse(parts[0]); query = parts.sublist(1).join(" "); + showScore = true; } } final textEmbedding = await _getTextEmbedding(query); @@ -165,6 +167,11 @@ class SemanticSearchService { dev.log("Query: $query, Score: ${result.score}, index $i"); } + final Map fileIDToScoreMap = {}; + for (final result in queryResults) { + fileIDToScoreMap[result.id] = result.score; + } + final filesMap = await FilesDB.instance .getFilesFromIDs(queryResults.map((e) => e.id).toList()); @@ -177,8 +184,13 @@ class SemanticSearchService { for (final result in queryResults) { final file = filesMap[result.id]; if (file != null && !ignoredCollections.contains(file.collectionID)) { + if (showScore) { + file.debugCaption = + "${fileIDToScoreMap[result.id]?.toStringAsFixed(3)}"; + } results.add(file); } + if (file == null) { deletedEntries.add(result.id); } diff --git a/mobile/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/lib/ui/viewer/file/thumbnail_widget.dart index 86e6cd1c41..4ace74da94 100644 --- a/mobile/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/lib/ui/viewer/file/thumbnail_widget.dart @@ -201,6 +201,8 @@ class _ThumbnailWidgetState extends State { viewChildren.add(TrashedFileOverlayText(widget.file as TrashFile)); } else if (GalleryContextState.of(context)?.type == GroupType.size) { viewChildren.add(FileSizeOverlayText(widget.file)); + } else if (widget.file.debugCaption != null) { + viewChildren.add(FileOverlayText(widget.file.debugCaption!)); } // todo: Move this icon overlay to the collection widget. if (widget.shouldShowArchiveStatus) { From 979df107bf75c014ca12c1235ab20acdcc345122 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:19:19 +0530 Subject: [PATCH 0396/1179] [mob] Turn of native onnx for android --- mobile/lib/services/machine_learning/ml_model.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index daad0ad61a..a0384f1813 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -19,7 +19,8 @@ abstract class MlModel { final _downloadModelLock = Lock(); - static final bool usePlatformPlugin = Platform.isAndroid; + // static final bool usePlatformPlugin = Platform.isAndroid; + static const bool usePlatformPlugin = false; bool get isInitialized => usePlatformPlugin ? _isNativePluginInitialized : _isFfiInitialized; From 9325e1476f89b19e638b67cf6b19ca548eba6a01 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:19:33 +0530 Subject: [PATCH 0397/1179] [mob] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index e411353443..34c761c480 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.19+919 +version: 0.9.20+920 publish_to: none environment: From cf3b75702192ceb0baf922015ef25639958eef6e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 14:26:55 +0530 Subject: [PATCH 0398/1179] Most recent file IDs first --- web/packages/new/photos/services/ml/db.ts | 17 +++++++++++++---- web/packages/new/photos/services/ml/worker.ts | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 7252483845..91f0dd21fa 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -394,14 +394,23 @@ export const indexableAndIndexedCounts = async () => { * universe, we filter out fileIDs the files corresponding to which have already * been indexed, or which should be ignored. * - * @param count Limit the result to up to {@link count} items. + * @param count Limit the result to up to {@link count} items. If there are more + * than {@link count} items present, the files with the higher file IDs (which + * can be taken as a approximate for their creation order) are preferred. */ -export const indexableFileIDs = async (count?: number) => { +export const indexableFileIDs = async (count: number) => { const db = await mlDB(); const tx = db.transaction("file-status", "readonly"); - return tx.store + let cursor = await tx.store .index("status") - .getAllKeys(IDBKeyRange.only("indexable"), count); + .openKeyCursor(IDBKeyRange.only("indexable"), "prev"); + const result: number[] = []; + while (cursor && count > 0) { + result.push(cursor.primaryKey); + cursor = await cursor.continue(); + count -= 1; + } + return result; }; /** diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 79520cc076..27dd602aef 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -339,6 +339,8 @@ const indexNextBatch = async ( * about. Then return the next {@link count} files that still need to be * indexed. * + * When returning from amongst pending files, prefer the most recent ones first. + * * For specifics of what a "sync" entails, see {@link updateAssumingLocalFiles}. * * @param userID Sync only files owned by a {@link userID} with the face DB. From d96d4773cfee137aa47255058f479948905f149d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 14:42:46 +0530 Subject: [PATCH 0399/1179] Fix status during live uploads --- web/packages/new/photos/services/ml/index.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index e4c56a4569..53a57a3b73 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -479,13 +479,19 @@ const getMLStatus = async (): Promise => { const { indexedCount, indexableCount } = await indexableAndIndexedCounts(); + // During live uploads, the indexable count remains zero even as the indexer + // is processing the newly uploaded items. This is because these "live + // queue" items do not yet have a "file-status" entry. + // + // So use the state of the worker as a guide for the phase, not the + // indexable count. + let phase: MLStatus["phase"]; - if (indexableCount > 0) { - const state = await (await worker()).state; - phase = - state == "indexing" || state == "fetching" ? state : "scheduled"; + const state = await (await worker()).state; + if (state == "indexing" || state == "fetching") { + phase = state; } else { - phase = "done"; + phase = indexableCount > 0 ? "scheduled" : "done"; } return { From d7fb8cf82b5f593fd2526c1acad6d7a868e45afa Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 14:54:18 +0530 Subject: [PATCH 0400/1179] Handle the idle transition in the UI --- web/packages/new/photos/services/ml/index.ts | 4 ++-- web/packages/new/photos/services/ml/worker-types.ts | 7 +++---- web/packages/new/photos/services/ml/worker.ts | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 53a57a3b73..07b8afe5cd 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -89,7 +89,7 @@ const worker = () => const createComlinkWorker = async () => { const electron = ensureElectron(); const delegate = { - workerDidProcessFile, + workerDidProcessFileOrIdle, }; // Obtain a message port from the Electron layer. @@ -523,7 +523,7 @@ const setInterimScheduledStatus = () => { setMLStatusSnapshot({ phase: "scheduled", nSyncedFiles, nTotalFiles }); }; -const workerDidProcessFile = throttled(updateMLStatusSnapshot, 2000); +const workerDidProcessFileOrIdle = throttled(updateMLStatusSnapshot, 2000); /** * Use CLIP to perform a natural language search over image embeddings. diff --git a/web/packages/new/photos/services/ml/worker-types.ts b/web/packages/new/photos/services/ml/worker-types.ts index 72d6bce61b..446986b8ef 100644 --- a/web/packages/new/photos/services/ml/worker-types.ts +++ b/web/packages/new/photos/services/ml/worker-types.ts @@ -8,11 +8,10 @@ */ export interface MLWorkerDelegate { /** - * Called whenever a file is processed during indexing. - * - * It is called both when the indexing was successful or it failed. + * Called whenever the worker processes a file during indexing (either + * successfully or with errors), or when in goes into the "idle" state. */ - workerDidProcessFile: () => void; + workerDidProcessFileOrIdle: () => void; } /** diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 27dd602aef..0823a5806a 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -233,6 +233,7 @@ export class MLWorker { this.state = "idle"; this.idleDuration = Math.min(this.idleDuration * 2, idleDurationMax); this.idleTimeout = setTimeout(scheduleTick, this.idleDuration * 1000); + this.delegate?.workerDidProcessFileOrIdle(); } /** Return the next batch of items to backfill (if any). */ @@ -320,7 +321,7 @@ const indexNextBatch = async ( await Promise.race(tasks); // Let the main thread now we're doing something. - delegate?.workerDidProcessFile(); + delegate?.workerDidProcessFileOrIdle(); // Let us drain the microtask queue. This also gives a chance for other // interactive tasks like `clipMatches` to run. From a43c0baa4610911d69036d784acd3ee5e2f1d248 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:00:49 +0530 Subject: [PATCH 0401/1179] Avoid non-greppable context APIs for i18n --- web/apps/accounts/src/pages/_app.tsx | 4 +--- web/apps/auth/src/pages/_app.tsx | 4 +--- web/apps/photos/src/pages/_app.tsx | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/web/apps/accounts/src/pages/_app.tsx b/web/apps/accounts/src/pages/_app.tsx index 4b9572cdd2..6b19b530fb 100644 --- a/web/apps/accounts/src/pages/_app.tsx +++ b/web/apps/accounts/src/pages/_app.tsx @@ -52,9 +52,7 @@ const App: React.FC = ({ Component, pageProps }) => { setDialogBoxAttributesV2, }; - const title = isI18nReady - ? t("title", { context: "accounts" }) - : staticAppTitle; + const title = isI18nReady ? t("title_accounts") : staticAppTitle; return ( <> diff --git a/web/apps/auth/src/pages/_app.tsx b/web/apps/auth/src/pages/_app.tsx index cab009dd17..f369755cad 100644 --- a/web/apps/auth/src/pages/_app.tsx +++ b/web/apps/auth/src/pages/_app.tsx @@ -150,9 +150,7 @@ const App: React.FC = ({ Component, pageProps }) => { somethingWentWrong, }; - const title = isI18nReady - ? t("title", { context: "auth" }) - : staticAppTitle; + const title = isI18nReady ? t("title_auth") : staticAppTitle; return ( <> diff --git a/web/apps/photos/src/pages/_app.tsx b/web/apps/photos/src/pages/_app.tsx index 195ab2f8ff..15d2c58eee 100644 --- a/web/apps/photos/src/pages/_app.tsx +++ b/web/apps/photos/src/pages/_app.tsx @@ -330,9 +330,7 @@ export default function App({ Component, pageProps }: AppProps) { logout, }; - const title = isI18nReady - ? t("title", { context: "photos" }) - : staticAppTitle; + const title = isI18nReady ? t("title_photos") : staticAppTitle; return ( <> From 38d866148f0bf573443895486adeac7a3fc04c09 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:01:54 +0530 Subject: [PATCH 0402/1179] Reduce delay in loading model --- .../semantic_search/semantic_search_service.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index f8354f49c9..34387dea28 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -47,8 +47,6 @@ class SemanticSearchService { Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; - get hasInitialized => _hasInitialized; - Future init() async { if (!localSettings.isFaceIndexingEnabled) { return; @@ -256,7 +254,7 @@ class SemanticSearchService { Future _loadTextModel({bool delay = false}) async { _logger.info("Initializing ClipText"); try { - if (delay) await Future.delayed(const Duration(seconds: 10)); + if (delay) await Future.delayed(const Duration(seconds: 5)); await MLComputer.instance.runClipText("warm up text encoder"); _textModelIsLoaded = true; } catch (e, s) { From 769b3ab21f166777ca703acc23bf567efc0e3c7e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:04:07 +0530 Subject: [PATCH 0403/1179] i18n --- web/apps/photos/src/services/searchService.ts | 3 +-- web/packages/base/locales/en-US/translation.json | 2 ++ web/packages/new/photos/components/MLSettings.tsx | 15 +++++---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 1be9fa01fd..3156652a38 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -194,8 +194,7 @@ export async function getMLStatusSuggestion(): Promise { label = t("indexing_photos", status); break; case "fetching": - // label = pt("Fetching"indexing_photos", status); - label = `Fetching indexes (${status.nSyncedFiles} / ${status.nTotalFiles})`; + label = t("indexing_fetching", status); break; case "clustering": label = t("indexing_people", status); diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 9a5114934b..4df6277261 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "People", "indexing_scheduled": "Indexing is scheduled...", "indexing_photos": "Indexing photos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "Fetching indexes ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indexing people in {{nSyncedFiles, number}} photos...", "indexing_done": "Indexed {{nSyncedFiles, number}} photos", "UNIDENTIFIED_FACES": "Unidentified faces", @@ -484,6 +485,7 @@ "indexing": "Indexing", "processed": "Processed", "indexing_status_running": "Running", + "indexing_status_fetching": "Fetching", "indexing_status_scheduled": "Scheduled", "indexing_status_done": "Done", "ml_search_disable": "Disable machine learning", diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 87613912d7..55fc07c466 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,7 +1,6 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { MenuItemGroup } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; -import { pt } from "@/base/i18n"; import log from "@/base/log"; import { disableML, @@ -301,17 +300,17 @@ const ManageML: React.FC = ({ let status: string; switch (phase) { case "scheduled": - status = "scheduled"; + status = t("indexing_status_scheduled"); break; case "fetching": - status = "fetching"; + status = t("indexing_status_fetching"); break; case "indexing": - status = "running"; + status = t("indexing_status_running"); break; // TODO: Clustering default: - status = "done"; + status = t("indexing_status_done"); break; } const processed = `${nSyncedFiles} / ${nTotalFiles}`; @@ -355,11 +354,7 @@ const ManageML: React.FC = ({ {t("indexing")} - - {status == "fetching" - ? pt("Fetching") - : t("indexing_status", { context: status })} - + {status} Date: Mon, 19 Aug 2024 09:44:48 +0000 Subject: [PATCH 0404/1179] New Crowdin translations by GitHub Action --- web/packages/base/locales/ar-SA/translation.json | 2 ++ web/packages/base/locales/bg-BG/translation.json | 2 ++ web/packages/base/locales/ca-ES/translation.json | 2 ++ web/packages/base/locales/de-DE/translation.json | 2 ++ web/packages/base/locales/el-GR/translation.json | 2 ++ web/packages/base/locales/es-ES/translation.json | 2 ++ web/packages/base/locales/fa-IR/translation.json | 2 ++ web/packages/base/locales/fi-FI/translation.json | 2 ++ web/packages/base/locales/fr-FR/translation.json | 2 ++ web/packages/base/locales/gu-IN/translation.json | 2 ++ web/packages/base/locales/hi-IN/translation.json | 2 ++ web/packages/base/locales/id-ID/translation.json | 2 ++ web/packages/base/locales/is-IS/translation.json | 2 ++ web/packages/base/locales/it-IT/translation.json | 2 ++ web/packages/base/locales/ja-JP/translation.json | 2 ++ web/packages/base/locales/ko-KR/translation.json | 2 ++ web/packages/base/locales/nl-NL/translation.json | 2 ++ web/packages/base/locales/pl-PL/translation.json | 2 ++ web/packages/base/locales/pt-BR/translation.json | 2 ++ web/packages/base/locales/pt-PT/translation.json | 2 ++ web/packages/base/locales/ru-RU/translation.json | 2 ++ web/packages/base/locales/sv-SE/translation.json | 2 ++ web/packages/base/locales/te-IN/translation.json | 2 ++ web/packages/base/locales/th-TH/translation.json | 2 ++ web/packages/base/locales/ti-ER/translation.json | 2 ++ web/packages/base/locales/tr-TR/translation.json | 2 ++ web/packages/base/locales/zh-CN/translation.json | 2 ++ 27 files changed, 54 insertions(+) diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index a4cb7e224e..51713df6ae 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index 638ccb97a5..f0734e481b 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index e9b42bd164..ee1ca7624d 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Personen", "indexing_scheduled": "Indizierung ist geplant...", "indexing_photos": "Indiziere Fotos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Indiziere Personen in {{nSyncedFiles, number}} Fotos...", "indexing_done": "{{nSyncedFiles, number}} Fotos wurden indiziert", "UNIDENTIFIED_FACES": "Unidentifizierte Gesichter", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 0d8684613a..969a843aa6 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "Απροσδιόριστα πρόσωπα", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index fa3c5d4068..4028e189e4 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Personajes", "indexing_scheduled": "El indexado está programado...", "indexing_photos": "Indexando fotos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Indexando personas en {{nSyncedFiles, number}} fotos...", "indexing_done": "", "UNIDENTIFIED_FACES": "Caras no identificadas", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 6edccad9f9..0d0e6972ef 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index b07f836fe0..82b622f142 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 6f254423d3..bf5a0f8d62 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Visages", "indexing_scheduled": "L'indexation est planifiée...", "indexing_photos": "Indexation des photos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Indexation des personnes dans {{nSyncedFiles, number}} photos...", "indexing_done": "Indexation des {{nSyncedFiles, number}} photos", "UNIDENTIFIED_FACES": "Visages non-identifiés", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index e5fbdb85bf..ca03935f0b 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "Mengindeks foto ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 0f6338b49d..a21aeb4964 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index d48bac2360..9e8106948f 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Persone", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "Volti non identificati", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index 6a449ac3a4..863b44c8a1 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 4a1c21ae6e..642d3b3703 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Personen", "indexing_scheduled": "Indexering is gepland...", "indexing_photos": "Analyseren van foto's ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Mensen analyseren in {{nSyncedFiles, number}} photos...", "indexing_done": "{{nSyncedFiles, number}} foto's geanalyseerd", "UNIDENTIFIED_FACES": "Ongeïdentificeerde gezichten", @@ -484,6 +485,7 @@ "indexing": "Indexeren", "processed": "Verwerkt", "indexing_status_running": "Bezig", + "indexing_status_fetching": "", "indexing_status_scheduled": "Gepland", "indexing_status_done": "Voltooid", "ml_search_disable": "Schakel machine learning uit", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index a2291c4d2f..824d852766 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Ludzie", "indexing_scheduled": "Indeksowanie jest zaplanowane...", "indexing_photos": "Indeksowanie zdjęć ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Indeksowanie ludzi w {{nSyncedFiles, number}} zdjęć...", "indexing_done": "Zindeksowano {{nSyncedFiles, number}} zdjęć", "UNIDENTIFIED_FACES": "Niezidentyfikowane twarze", @@ -484,6 +485,7 @@ "indexing": "Indeksowanie", "processed": "Przetworzone", "indexing_status_running": "Uruchomione", + "indexing_status_fetching": "", "indexing_status_scheduled": "Zaplanowane", "indexing_status_done": "Gotowe", "ml_search_disable": "Wyłącz uczenie maszynowe", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 3cd4706931..f344cb21df 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Pessoas", "indexing_scheduled": "Indexação está programada...", "indexing_photos": "Indexando fotos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Indexando pessoas em {{nSyncedFiles, number}} fotos...", "indexing_done": "Foram indexadas {{nSyncedFiles, number}} fotos", "UNIDENTIFIED_FACES": "Rostos não identificados", @@ -484,6 +485,7 @@ "indexing": "Indexando", "processed": "Processado", "indexing_status_running": "Executando", + "indexing_status_fetching": "", "indexing_status_scheduled": "Agendado", "indexing_status_done": "Concluído", "ml_search_disable": "Desativar aprendizado de máquina", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index b627804354..82a3b6abd6 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index e90fed3bc8..632ef77209 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "Люди", "indexing_scheduled": "Индексация запланирована...", "indexing_photos": "Индексирование фотографий ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "Индексирование людей на {{nSyncedFiles, number}} фотографиях...", "indexing_done": "Проиндексировано {{nSyncedFiles, number}} фотографий", "UNIDENTIFIED_FACES": "Нераспознанные лица", @@ -484,6 +485,7 @@ "indexing": "Индексирование", "processed": "Обработано", "indexing_status_running": "Выполняется", + "indexing_status_fetching": "", "indexing_status_scheduled": "Запланировано", "indexing_status_done": "Готово", "ml_search_disable": "Отключить машинное обучение", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 91e189edd0..406644bc83 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index a05a51f3a2..65213cc15e 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "", "indexing_scheduled": "", "indexing_photos": "", + "indexing_fetching": "", "indexing_people": "", "indexing_done": "", "UNIDENTIFIED_FACES": "", @@ -484,6 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", + "indexing_status_fetching": "", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index fcd9752e84..ebda6f6017 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -232,6 +232,7 @@ "PEOPLE": "人物", "indexing_scheduled": "索引已安排...", "indexing_photos": "正在索引照片 ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", + "indexing_fetching": "", "indexing_people": "正在为{{nSyncedFiles, number}}张照片中的人物建立索引...", "indexing_done": "已索引 {{nSyncedFiles, number}} 张照片", "UNIDENTIFIED_FACES": "身份不明的面孔", @@ -484,6 +485,7 @@ "indexing": "索引中", "processed": "已处理", "indexing_status_running": "运行中", + "indexing_status_fetching": "", "indexing_status_scheduled": "已安排", "indexing_status_done": "已完成", "ml_search_disable": "禁用机器学习", From 564008693276b7eb06d419e08d5f782a728c2cd5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 09:58:10 +0530 Subject: [PATCH 0405/1179] Remove unnecessary conversion attempt --- web/packages/base/crypto/libsodium.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 31eb85141d..6145970972 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -231,7 +231,7 @@ export const encryptBoxB64 = async ( const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES); const encryptedData = sodium.crypto_secretbox_easy( await bytes(data), - await bytes(nonce), + nonce, await bytes(key), ); return { From 62c32d02ce4fc2c3405b304c67731d77ca0d6c58 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 11:38:56 +0530 Subject: [PATCH 0406/1179] Start treating it as a gateway --- .../photos/src/services/collectionService.ts | 3 +- web/apps/photos/src/services/entityService.ts | 3 +- web/apps/photos/src/services/fileService.ts | 2 +- web/packages/base/crypto/ente.ts | 224 ------------------ web/packages/base/crypto/index.ts | 220 +++++++++++++++++ web/packages/base/crypto/worker.ts | 3 +- web/packages/base/session-store.ts | 2 +- web/packages/media/file-metadata.ts | 2 +- web/packages/new/photos/services/file-data.ts | 2 +- .../new/photos/services/ml/ml-data.ts | 2 +- .../new/photos/services/user-entity.ts | 2 +- 11 files changed, 230 insertions(+), 235 deletions(-) delete mode 100644 web/packages/base/crypto/ente.ts diff --git a/web/apps/photos/src/services/collectionService.ts b/web/apps/photos/src/services/collectionService.ts index 0558c7473f..60d4ea35cc 100644 --- a/web/apps/photos/src/services/collectionService.ts +++ b/web/apps/photos/src/services/collectionService.ts @@ -1,5 +1,4 @@ -import { sharedCryptoWorker } from "@/base/crypto"; -import { encryptMetadataJSON } from "@/base/crypto/ente"; +import { encryptMetadataJSON, sharedCryptoWorker } from "@/base/crypto"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { ItemVisibility } from "@/media/file-metadata"; diff --git a/web/apps/photos/src/services/entityService.ts b/web/apps/photos/src/services/entityService.ts index 2516a185db..7bd32e556a 100644 --- a/web/apps/photos/src/services/entityService.ts +++ b/web/apps/photos/src/services/entityService.ts @@ -1,5 +1,4 @@ -import { sharedCryptoWorker } from "@/base/crypto"; -import { decryptMetadataJSON } from "@/base/crypto/ente"; +import { decryptMetadataJSON, sharedCryptoWorker } from "@/base/crypto"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import HTTPService from "@ente/shared/network/HTTPService"; diff --git a/web/apps/photos/src/services/fileService.ts b/web/apps/photos/src/services/fileService.ts index 5cd16129c5..82ce81ede0 100644 --- a/web/apps/photos/src/services/fileService.ts +++ b/web/apps/photos/src/services/fileService.ts @@ -1,4 +1,4 @@ -import { encryptMetadataJSON } from "@/base/crypto/ente"; +import { encryptMetadataJSON } from "@/base/crypto"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { getLocalFiles, setLocalFiles } from "@/new/photos/services/files"; diff --git a/web/packages/base/crypto/ente.ts b/web/packages/base/crypto/ente.ts deleted file mode 100644 index 476e589505..0000000000 --- a/web/packages/base/crypto/ente.ts +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @file Higher level functions that use the ontology of Ente's types - * - * [Note: Crypto code hierarchy] - * - * 1. crypto/ente.ts (Ente specific higher level functions) - * 2. crypto/libsodium.ts (More primitive wrappers over libsodium) - * 3. libsodium-wrappers (JavaScript bindings to libsodium) - * - * Our cryptography primitives are provided by libsodium, specifically, its - * JavaScript bindings ("libsodium-wrappers"). This is the lowest layer. - * - * Direct usage of "libsodium-wrappers" is restricted to `crypto/libsodium.ts`. - * This is the next higher layer, and the first one that our code should - * directly use. Usually the functions in this file are thin wrappers over the - * raw libsodium APIs, with a bit of massaging. They also ensure that - * sodium.ready has been called before accessing libsodium's APIs, thus all the - * functions it exposes are async. - * - * The highest layer is this file, `crypto/ente.ts`. These are usually simple - * compositions of functionality exposed by `crypto/libsodium.ts`, but the - * difference is that the functions in ente.ts don't talk in terms of the crypto - * algorithms, but rather in terms the higher-level Ente specific goal we are - * trying to accomplish. - * - * There is an additional actor in the play. Cryptographic operations are CPU - * intensive and would cause the UI to stutter if used directly on the main - * thread. To keep the UI smooth, we instead want to run them in a web worker. - * However, sometimes we already _are_ running in a web worker, and delegating - * to another worker is wasteful. - * - * To handle both these scenario, each function in this file is split into the - * external API, and the underlying implementation (denoted by an "_" prefix). - * The external API functions check to see if we're already in a web worker, and - * if so directly invoke the implementation. Otherwise the call the sibling - * function in a shared "crypto" web worker (which then invokes the - * implementation, but this time in the context of a web worker). - * - * To avoid a circular dependency during webpack imports, we need to keep the - * implementation functions in a separate file (ente-impl.ts). This is a bit - * unfortunate, since it makes them harder to read and reason about (since their - * documentation and parameter names are all in ente.ts). - * - * Some older code directly calls the functions in the shared crypto.worker.ts, - * but that should be avoided since it makes the code not behave the way we want - * when we're already in a web worker. There are exceptions to this - * recommendation though (in circumstances where we create more crypto workers - * instead of using the shared one). - */ -import { sharedCryptoWorker } from "."; -import { assertionFailed } from "../assert"; -import { inWorker } from "../env"; -import * as ei from "./ente-impl"; -import type { BytesOrB64, EncryptedBlob, EncryptedBox } from "./types"; - -/** - * Some of these functions have not yet been needed on the main thread, and for - * these we don't have a corresponding sharedCryptoWorker method. - * - * This assertion will let us know when we need to implement them. This will - * gracefully degrade in production: the functionality will work, just that the - * crypto operations will happen on the main thread itself. - */ -const assertInWorker = (x: T): T => { - if (!inWorker()) assertionFailed("Currently only usable in a web worker"); - return x; -}; - -/** - * Encrypt the given data, returning a box containing the encrypted data and a - * randomly generated nonce that was used during encryption. - * - * Both the encrypted data and the nonce are returned as base64 strings. - * - * Use {@link decryptBoxB64} to decrypt the result. - * - * > The suffix "Box" comes from the fact that it uses the so called secretbox - * > APIs provided by libsodium under the hood. - * > - * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] - */ -export const encryptBoxB64 = (data: BytesOrB64, key: BytesOrB64) => - inWorker() - ? ei._encryptBoxB64(data, key) - : sharedCryptoWorker().then((w) => w.encryptBoxB64(data, key)); - -/** - * Encrypt the given data, returning a blob containing the encrypted data and a - * decryption header. - * - * This function is usually used to encrypt data associated with an Ente object - * (file, collection, entity) using the object's key. - * - * Use {@link decryptBlob} to decrypt the result. - * - * > The suffix "Blob" comes from our convention of naming functions that use - * > the secretstream APIs in one-shot mode. - * > - * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] - */ -export const encryptBlob = (data: BytesOrB64, key: BytesOrB64) => - assertInWorker(ei._encryptBlob(data, key)); - -/** - * A variant of {@link encryptBlob} that returns the result components as base64 - * strings. - */ -export const encryptBlobB64 = (data: BytesOrB64, key: BytesOrB64) => - assertInWorker(ei._encryptBlobB64(data, key)); - -/** - * Encrypt the thumbnail for a file. - * - * This is midway variant of {@link encryptBlob} and {@link encryptBlobB64} that - * returns the decryption header as a base64 string, but leaves the data - * unchanged. - * - * Use {@link decryptThumbnail} to decrypt the result. - */ -export const encryptThumbnail = (data: BytesOrB64, key: BytesOrB64) => - assertInWorker(ei._encryptThumbnail(data, key)); - -/** - * Encrypt the JSON metadata associated with an Ente object (file, collection or - * entity) using the object's key. - * - * This is a variant of {@link encryptBlobB64} tailored for encrypting any - * arbitrary metadata associated with an Ente object. For example, it is used - * for encrypting the various metadata fields associated with a file, using that - * file's key. - * - * Instead of raw bytes, it takes as input an arbitrary JSON object which it - * encodes into a string, and encrypts that. - * - * Use {@link decryptMetadataJSON} to decrypt the result. - * - * @param jsonValue The JSON value to encrypt. This can be an arbitrary JSON - * value, but since TypeScript currently doesn't have a native JSON type, it is - * typed as {@link unknown}. - * - * @param key The encryption key. - */ -export const encryptMetadataJSON_New = (jsonValue: unknown, key: BytesOrB64) => - inWorker() - ? ei._encryptMetadataJSON_New(jsonValue, key) - : sharedCryptoWorker().then((w) => - w.encryptMetadataJSON_New(jsonValue, key), - ); - -/** - * Deprecated, use {@link encryptMetadataJSON_New} instead. - */ -export const encryptMetadataJSON = async (r: { - jsonValue: unknown; - keyB64: string; -}) => - inWorker() - ? ei._encryptMetadataJSON(r) - : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); - -/** - * Decrypt a box encrypted using {@link encryptBoxB64}. - */ -export const decryptBox = (box: EncryptedBox, key: BytesOrB64) => - inWorker() - ? ei._decryptBox(box, key) - : sharedCryptoWorker().then((w) => w.decryptBox(box, key)); - -/** - * Variant of {@link decryptBox} that returns the result as a base64 string. - */ -export const decryptBoxB64 = (box: EncryptedBox, key: BytesOrB64) => - inWorker() - ? ei._decryptBoxB64(box, key) - : sharedCryptoWorker().then((w) => w.decryptBoxB64(box, key)); - -/** - * Decrypt a blob encrypted using either {@link encryptBlob} or - * {@link encryptBlobB64}. - */ -export const decryptBlob = (blob: EncryptedBlob, key: BytesOrB64) => - assertInWorker(ei._decryptBlob(blob, key)); - -/** - * A variant of {@link decryptBlob} that returns the result as a base64 string. - */ -export const decryptBlobB64 = (blob: EncryptedBlob, key: BytesOrB64) => - inWorker() - ? ei._decryptBlobB64(blob, key) - : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); - -/** - * Decrypt the thumbnail encrypted using {@link encryptThumbnail}. - */ -export const decryptThumbnail = (blob: EncryptedBlob, key: BytesOrB64) => - assertInWorker(ei._decryptThumbnail(blob, key)); - -/** - * Decrypt the metadata JSON encrypted using {@link encryptMetadataJSON}. - * - * @returns The decrypted JSON value. Since TypeScript does not have a native - * JSON type, we need to return it as an `unknown`. - */ -export const decryptMetadataJSON_New = ( - blob: EncryptedBlob, - key: BytesOrB64, -) => - inWorker() - ? ei._decryptMetadataJSON_New(blob, key) - : sharedCryptoWorker().then((w) => - w.decryptMetadataJSON_New(blob, key), - ); - -/** - * Deprecated, retains the old API. - */ -export const decryptMetadataJSON = (r: { - encryptedDataB64: string; - decryptionHeaderB64: string; - keyB64: string; -}) => - inWorker() - ? ei._decryptMetadataJSON(r) - : sharedCryptoWorker().then((w) => w.decryptMetadataJSON(r)); diff --git a/web/packages/base/crypto/index.ts b/web/packages/base/crypto/index.ts index 736978f7ff..c1f09516eb 100644 --- a/web/packages/base/crypto/index.ts +++ b/web/packages/base/crypto/index.ts @@ -1,4 +1,53 @@ +/** + * @file Higher level functions that use the ontology of Ente's requirements. + * + * [Note: Crypto code hierarchy] + * + * 1. @/base/crypto (Crypto API for our code) + * 2. @/base/crypto/libsodium (Lower level wrappers over libsodium) + * 3. libsodium-wrappers (JavaScript bindings to libsodium) + * + * Our cryptography primitives are provided by libsodium, specifically, its + * JavaScript bindings ("libsodium-wrappers"). This is the lowest layer. + * + * Direct usage of "libsodium-wrappers" is restricted to `crypto/libsodium.ts`. + * This is the next higher layer. Usually the functions in this file are thin + * wrappers over the raw libsodium APIs, with a bit of massaging. They also + * ensure that sodium.ready has been called before accessing libsodium's APIs, + * thus all the functions it exposes are async. + * + * The highest layer is this file, `crypto/index.ts`, and the one that our own + * code should use. These are usually simple compositions of functionality + * exposed by `crypto/libsodium.ts`, the primary difference being that these + * functions try to talk in terms of higher-level Ente specific goal we are + * trying to accomplish instead of the specific underlying crypto algorithms. + * + * There is an additional actor in play. Cryptographic operations like + * encryption are CPU intensive and would cause the UI to stutter if used + * directly on the main thread. To keep the UI smooth, we instead want to run + * them in a web worker. However, sometimes we already _are_ running in a web + * worker, and delegating to another worker is wasteful. + * + * To handle both these scenario, the potentially CPU intensive functions in + * this file are split into the external API, and the underlying implementation + * (denoted by an "_" prefix). To avoid a circular dependency during webpack + * imports, we need to keep the implementation functions in a separate file + * (`ente-impl.ts`). + * + * The external API functions check to see if we're already in a web worker, and + * if so directly invoke the implementation. Otherwise the call the sibling + * function in a shared "crypto" web worker (which then invokes the + * implementation function, but this time in the context of a web worker). + * + * Also, some code (e.g. the uploader) creates it own crypto worker instances, + * and thus directly calls the functions in the web worker (it created) instead + * of going through this file. + */ import { ComlinkWorker } from "@/base/worker/comlink-worker"; +import { assertionFailed } from "../assert"; +import { inWorker } from "../env"; +import * as ei from "./ente-impl"; +import type { BytesOrB64, EncryptedBlob, EncryptedBox } from "./types"; import type { CryptoWorker } from "./worker"; /** @@ -21,3 +70,174 @@ export const createComlinkCryptoWorker = () => "crypto", new Worker(new URL("worker.ts", import.meta.url)), ); + +/** + * Some of the potentially CPU intensive functions below have not yet been + * needed on the main thread, and for these we don't have a corresponding + * sharedCryptoWorker method. + * + * This assertion will let us know when we need to implement them. This will + * gracefully degrade in production: the functionality will work, just that the + * crypto operations will happen on the main thread itself. + */ +const assertInWorker = (x: T): T => { + if (!inWorker()) assertionFailed("Currently only usable in a web worker"); + return x; +}; + +/** + * Encrypt the given data, returning a box containing the encrypted data and a + * randomly generated nonce that was used during encryption. + * + * Both the encrypted data and the nonce are returned as base64 strings. + * + * Use {@link decryptBoxB64} to decrypt the result. + * + * > The suffix "Box" comes from the fact that it uses the so called secretbox + * > APIs provided by libsodium under the hood. + * > + * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] + */ +export const encryptBoxB64 = (data: BytesOrB64, key: BytesOrB64) => + inWorker() + ? ei._encryptBoxB64(data, key) + : sharedCryptoWorker().then((w) => w.encryptBoxB64(data, key)); + +/** + * Encrypt the given data, returning a blob containing the encrypted data and a + * decryption header. + * + * This function is usually used to encrypt data associated with an Ente object + * (file, collection, entity) using the object's key. + * + * Use {@link decryptBlob} to decrypt the result. + * + * > The suffix "Blob" comes from our convention of naming functions that use + * > the secretstream APIs in one-shot mode. + * > + * > See: [Note: 3 forms of encryption (Box | Blob | Stream)] + */ +export const encryptBlob = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptBlob(data, key)); + +/** + * A variant of {@link encryptBlob} that returns the result components as base64 + * strings. + */ +export const encryptBlobB64 = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptBlobB64(data, key)); + +/** + * Encrypt the thumbnail for a file. + * + * This is midway variant of {@link encryptBlob} and {@link encryptBlobB64} that + * returns the decryption header as a base64 string, but leaves the data + * unchanged. + * + * Use {@link decryptThumbnail} to decrypt the result. + */ +export const encryptThumbnail = (data: BytesOrB64, key: BytesOrB64) => + assertInWorker(ei._encryptThumbnail(data, key)); + +/** + * Encrypt the JSON metadata associated with an Ente object (file, collection or + * entity) using the object's key. + * + * This is a variant of {@link encryptBlobB64} tailored for encrypting any + * arbitrary metadata associated with an Ente object. For example, it is used + * for encrypting the various metadata fields associated with a file, using that + * file's key. + * + * Instead of raw bytes, it takes as input an arbitrary JSON object which it + * encodes into a string, and encrypts that. + * + * Use {@link decryptMetadataJSON} to decrypt the result. + * + * @param jsonValue The JSON value to encrypt. This can be an arbitrary JSON + * value, but since TypeScript currently doesn't have a native JSON type, it is + * typed as {@link unknown}. + * + * @param key The encryption key. + */ +export const encryptMetadataJSON_New = (jsonValue: unknown, key: BytesOrB64) => + inWorker() + ? ei._encryptMetadataJSON_New(jsonValue, key) + : sharedCryptoWorker().then((w) => + w.encryptMetadataJSON_New(jsonValue, key), + ); + +/** + * Deprecated, use {@link encryptMetadataJSON_New} instead. + */ +export const encryptMetadataJSON = async (r: { + jsonValue: unknown; + keyB64: string; +}) => + inWorker() + ? ei._encryptMetadataJSON(r) + : sharedCryptoWorker().then((w) => w.encryptMetadataJSON(r)); + +/** + * Decrypt a box encrypted using {@link encryptBoxB64}. + */ +export const decryptBox = (box: EncryptedBox, key: BytesOrB64) => + inWorker() + ? ei._decryptBox(box, key) + : sharedCryptoWorker().then((w) => w.decryptBox(box, key)); + +/** + * Variant of {@link decryptBox} that returns the result as a base64 string. + */ +export const decryptBoxB64 = (box: EncryptedBox, key: BytesOrB64) => + inWorker() + ? ei._decryptBoxB64(box, key) + : sharedCryptoWorker().then((w) => w.decryptBoxB64(box, key)); + +/** + * Decrypt a blob encrypted using either {@link encryptBlob} or + * {@link encryptBlobB64}. + */ +export const decryptBlob = (blob: EncryptedBlob, key: BytesOrB64) => + assertInWorker(ei._decryptBlob(blob, key)); + +/** + * A variant of {@link decryptBlob} that returns the result as a base64 string. + */ +export const decryptBlobB64 = (blob: EncryptedBlob, key: BytesOrB64) => + inWorker() + ? ei._decryptBlobB64(blob, key) + : sharedCryptoWorker().then((w) => w.decryptBlobB64(blob, key)); + +/** + * Decrypt the thumbnail encrypted using {@link encryptThumbnail}. + */ +export const decryptThumbnail = (blob: EncryptedBlob, key: BytesOrB64) => + assertInWorker(ei._decryptThumbnail(blob, key)); + +/** + * Decrypt the metadata JSON encrypted using {@link encryptMetadataJSON}. + * + * @returns The decrypted JSON value. Since TypeScript does not have a native + * JSON type, we need to return it as an `unknown`. + */ +export const decryptMetadataJSON_New = ( + blob: EncryptedBlob, + key: BytesOrB64, +) => + inWorker() + ? ei._decryptMetadataJSON_New(blob, key) + : sharedCryptoWorker().then((w) => + w.decryptMetadataJSON_New(blob, key), + ); + +/** + * Deprecated, retains the old API. + */ +export const decryptMetadataJSON = (r: { + encryptedDataB64: string; + decryptionHeaderB64: string; + keyB64: string; +}) => + inWorker() + ? ei._decryptMetadataJSON(r) + : sharedCryptoWorker().then((w) => w.decryptMetadataJSON(r)); diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 7ce5b56775..26b3e481c6 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -5,7 +5,8 @@ import * as libsodium from "./libsodium"; /** * A web worker that exposes some of the functions defined in either the Ente - * specific layer (crypto/ente.ts) or the libsodium layer (crypto/libsodium.ts). + * specific layer (@/base/crypto) or the libsodium layer + * (@/base/crypto/libsodium.ts). * * See: [Note: Crypto code hierarchy]. * diff --git a/web/packages/base/session-store.ts b/web/packages/base/session-store.ts index 26782ce964..2493467348 100644 --- a/web/packages/base/session-store.ts +++ b/web/packages/base/session-store.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { decryptBox } from "./crypto/ente"; +import { decryptBox } from "./crypto"; import { toB64 } from "./crypto/libsodium"; /** diff --git a/web/packages/media/file-metadata.ts b/web/packages/media/file-metadata.ts index c4954f43aa..011200ff95 100644 --- a/web/packages/media/file-metadata.ts +++ b/web/packages/media/file-metadata.ts @@ -1,4 +1,4 @@ -import { decryptMetadataJSON, encryptMetadataJSON } from "@/base/crypto/ente"; +import { decryptMetadataJSON, encryptMetadataJSON } from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import { diff --git a/web/packages/new/photos/services/file-data.ts b/web/packages/new/photos/services/file-data.ts index df4ddbf9f4..3ea3fd999d 100644 --- a/web/packages/new/photos/services/file-data.ts +++ b/web/packages/new/photos/services/file-data.ts @@ -1,4 +1,4 @@ -import { encryptBlobB64 } from "@/base/crypto/ente"; +import { encryptBlobB64 } from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; import { apiURL } from "@/base/origins"; import type { EnteFile } from "@/new/photos/types/file"; diff --git a/web/packages/new/photos/services/ml/ml-data.ts b/web/packages/new/photos/services/ml/ml-data.ts index fb31bc9dcc..f0b2abfac6 100644 --- a/web/packages/new/photos/services/ml/ml-data.ts +++ b/web/packages/new/photos/services/ml/ml-data.ts @@ -1,4 +1,4 @@ -import { decryptBlob } from "@/base/crypto/ente"; +import { decryptBlob } from "@/base/crypto"; import log from "@/base/log"; import type { EnteFile } from "@/new/photos/types/file"; import { nullToUndefined } from "@/utils/transform"; diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 7ea981df09..297429ce10 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,4 +1,4 @@ -import { decryptBlob, decryptBoxB64 } from "@/base/crypto/ente"; +import { decryptBlob, decryptBoxB64 } from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; From c0e48c7ada333a398fa139e4ec59cac7a720e9a2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 11:49:57 +0530 Subject: [PATCH 0407/1179] keygen --- web/packages/base/crypto/index.ts | 7 +++++++ web/packages/base/crypto/libsodium.ts | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/web/packages/base/crypto/index.ts b/web/packages/base/crypto/index.ts index c1f09516eb..4a43b1ba15 100644 --- a/web/packages/base/crypto/index.ts +++ b/web/packages/base/crypto/index.ts @@ -47,6 +47,7 @@ import { ComlinkWorker } from "@/base/worker/comlink-worker"; import { assertionFailed } from "../assert"; import { inWorker } from "../env"; import * as ei from "./ente-impl"; +import * as libsodium from "./libsodium"; import type { BytesOrB64, EncryptedBlob, EncryptedBox } from "./types"; import type { CryptoWorker } from "./worker"; @@ -85,6 +86,12 @@ const assertInWorker = (x: T): T => { return x; }; +/** + * Generate a new randomly generated 256-bit key suitable for use with the *Box + * encryption functions. + */ +export const generateBoxKey = libsodium.generateBoxKey; + /** * Encrypt the given data, returning a box containing the encrypted data and a * randomly generated nonce that was used during encryption. diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 6145970972..1efcda7676 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -128,6 +128,17 @@ export async function fromHex(input: string) { const bytes = async (bob: BytesOrB64) => typeof bob == "string" ? fromB64(bob) : bob; +/** + * Generate a key for use with the *Box encryption functions. + * + * This returns a new randomly generated 256-bit key suitable for being used + * with libsodium's secretbox APIs. + */ +export const generateBoxKey = async () => { + await sodium.ready; + return toB64(sodium.crypto_secretbox_keygen()); +}; + /** * Encrypt the given data using libsodium's secretbox APIs, using a randomly * generated nonce. From c39fcb39682e297f3ab1f9bd86533fc68b261df3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 11:59:26 +0530 Subject: [PATCH 0408/1179] Use --- web/packages/new/photos/services/user-entity.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 297429ce10..61ece151eb 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -1,4 +1,9 @@ -import { decryptBlob, decryptBoxB64 } from "@/base/crypto"; +import { + decryptBlob, + decryptBoxB64, + encryptBoxB64, + generateBoxKey, +} from "@/base/crypto"; import { authenticatedRequestHeaders, ensureOk, HTTPError } from "@/base/http"; import { getKV, getKVN, setKV } from "@/base/kv"; import { apiURL } from "@/base/origins"; @@ -229,6 +234,13 @@ const saveRemoteUserEntityKey = ( entityKey: RemoteUserEntityKey, ) => setKV(entityKeyKey(type), JSON.stringify(entityKey)); +/** + * Generate a new entity key and return it after encrypting it using the user's + * master key. + */ +const generateEncryptedEntityKey = async () => + encryptBoxB64(await generateBoxKey(), await masterKeyFromSession()); + /** * Decrypt an encrypted entity key using the user's master key. */ From 3f9a7e08a14368ecf785e5abb65040c06db67a82 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:36:30 +0530 Subject: [PATCH 0409/1179] Better state during initial load --- web/packages/new/photos/services/ml/index.ts | 4 +++- web/packages/new/photos/services/ml/worker.ts | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 07b8afe5cd..9aa2c4338c 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -490,8 +490,10 @@ const getMLStatus = async (): Promise => { const state = await (await worker()).state; if (state == "indexing" || state == "fetching") { phase = state; + } else if (state == "init" || indexableCount > 0) { + phase = "scheduled"; } else { - phase = indexableCount > 0 ? "scheduled" : "done"; + phase = "done"; } return { diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 0823a5806a..d6e2e17a43 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -43,6 +43,7 @@ import type { CLIPMatches, MLWorkerDelegate } from "./worker-types"; /** * A rough hint at what the worker is up to. * + * - "init": Worker has been created but hasn't done anything yet. * - "idle": Not doing anything * - "tick": Transitioning to a new state * - "indexing": Indexing @@ -52,7 +53,7 @@ import type { CLIPMatches, MLWorkerDelegate } from "./worker-types"; * data for more than 50% of the files that we requested from it in the last * fetch during indexing. */ -export type WorkerState = "idle" | "tick" | "indexing" | "fetching"; +export type WorkerState = "init" | "idle" | "tick" | "indexing" | "fetching"; const idleDurationStart = 5; /* 5 seconds */ const idleDurationMax = 16 * 60; /* 16 minutes */ @@ -92,7 +93,7 @@ interface IndexableItem { */ export class MLWorker { /** The last known state of the worker. */ - public state: WorkerState = "idle"; + public state: WorkerState = "init"; private electron: ElectronMLWorker | undefined; private delegate: MLWorkerDelegate | undefined; From e6f26e62ae76d91581443864f85d3a997b6ddd96 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:40:57 +0530 Subject: [PATCH 0410/1179] Fix jumping --- web/packages/new/photos/services/ml/worker.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index d6e2e17a43..bbec976a34 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -203,7 +203,12 @@ export class MLWorker { const liveQ = this.liveQ; this.liveQ = []; - this.state = "indexing"; + + // Retain the previous state if it was one of the indexing states. This + // prevents jumping between "fetching" and "indexing" being shown in the + // UI during the initial load. + if (this.state != "fetching" && this.state != "indexing") + this.state = "indexing"; // Use the liveQ if present, otherwise get the next batch to backfill. const items = liveQ.length ? liveQ : await this.backfillQ(); From d6151a89e8cb1a4e28989de9ca0286f2c27243e2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:46:52 +0530 Subject: [PATCH 0411/1179] Fix --- web/packages/new/photos/services/ml/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index bbec976a34..e59e0f8731 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -139,7 +139,7 @@ export class MLWorker { /** Invoked in response to external events. */ private wakeUp() { - if (this.state == "idle") { + if (this.state == "init" || this.state == "idle") { // We are currently paused. Get back to work. if (this.idleTimeout) clearTimeout(this.idleTimeout); this.idleTimeout = undefined; From 63d65a4311b9b2fc4258cd73e63d78bd25481c3d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 15:55:07 +0530 Subject: [PATCH 0412/1179] Expose decryptBlob to main thread --- web/packages/base/crypto/index.ts | 4 +++- web/packages/base/crypto/worker.ts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/web/packages/base/crypto/index.ts b/web/packages/base/crypto/index.ts index 4a43b1ba15..386d1ac7da 100644 --- a/web/packages/base/crypto/index.ts +++ b/web/packages/base/crypto/index.ts @@ -205,7 +205,9 @@ export const decryptBoxB64 = (box: EncryptedBox, key: BytesOrB64) => * {@link encryptBlobB64}. */ export const decryptBlob = (blob: EncryptedBlob, key: BytesOrB64) => - assertInWorker(ei._decryptBlob(blob, key)); + inWorker() + ? ei._decryptBlob(blob, key) + : sharedCryptoWorker().then((w) => w.decryptBlob(blob, key)); /** * A variant of {@link decryptBlob} that returns the result as a base64 string. diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 26b3e481c6..82f2d47624 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -19,6 +19,7 @@ export class CryptoWorker { encryptMetadataJSON = ei._encryptMetadataJSON; decryptBox = ei._decryptBox; decryptBoxB64 = ei._decryptBoxB64; + decryptBlob = ei._decryptBlob; decryptBlobB64 = ei._decryptBlobB64; decryptThumbnail = ei._decryptThumbnail; decryptMetadataJSON_New = ei._decryptMetadataJSON_New; From 48c29700a4956804808f0d55b3d8031023b8997a Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Mon, 19 Aug 2024 16:47:47 +0530 Subject: [PATCH 0413/1179] [mob][auth] Work around for new applock key --- auth/lib/utils/lock_screen_settings.dart | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/auth/lib/utils/lock_screen_settings.dart b/auth/lib/utils/lock_screen_settings.dart index 1235c95e15..14d56963ca 100644 --- a/auth/lib/utils/lock_screen_settings.dart +++ b/auth/lib/utils/lock_screen_settings.dart @@ -1,6 +1,7 @@ import "dart:convert"; import "dart:typed_data"; +import "package:ente_auth/core/configuration.dart"; import "package:ente_auth/utils/platform_util.dart"; import "package:ente_crypto_dart/ente_crypto_dart.dart"; import "package:flutter_secure_storage/flutter_secure_storage.dart"; @@ -20,6 +21,8 @@ class LockScreenSettings { static const autoLockTime = "ls_auto_lock_time"; static const keyHideAppContent = "ls_hide_app_content"; static const keyAppLockSet = "ls_is_app_lock_set"; + static const keyHasMigratedLockScreenChanges = + "ls_has_migrated_lock_screen_changes"; final List autoLockDurations = const [ Duration(seconds: 0), Duration(seconds: 5), @@ -38,6 +41,23 @@ class LockScreenSettings { ///Workaround for privacyScreen not working when app is killed and opened. await setHideAppContent(getShouldHideAppContent()); + + await setHasMigratedLockScreenChanges(); + } + + Future setHasMigratedLockScreenChanges() async { + if (_preferences.getBool(keyHasMigratedLockScreenChanges) == null || + getIsAppLockSet() == false) { + await _preferences.setBool(keyHasMigratedLockScreenChanges, true); + + final bool passwordEnabled = await isPasswordSet(); + final bool pinEnabled = await isPinSet(); + final bool systemLockEnabled = + Configuration.instance.shouldShowSystemLockScreen(); + if (passwordEnabled || pinEnabled || systemLockEnabled) { + await isAppLockSet(true); + } + } } Future setHideAppContent(bool hideContent) async { From 95a03ef86dd6249d5514d6c2aadafb8c71d4fa50 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Mon, 19 Aug 2024 17:06:48 +0530 Subject: [PATCH 0414/1179] [mob][auth] Minor fixes --- .../lock_screen/lock_screen_options.dart | 19 +++++++++++-------- auth/lib/utils/lock_screen_settings.dart | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart index 29965a3b6c..df211a9cec 100644 --- a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart +++ b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart @@ -44,10 +44,7 @@ class _LockScreenOptionsState extends State { hideAppContent = _lockscreenSetting.getShouldHideAppContent(); autoLockTimeInMilliseconds = _lockscreenSetting.getAutoLockTime(); _initializeSettings(); - appLock = _lockscreenSetting.getIsAppLockSet() || - _configuration.shouldShowSystemLockScreen() || - isPasswordEnabled || - isPinEnabled; + appLock = _lockscreenSetting.getIsAppLockSet(); } Future _initializeSettings() async { @@ -87,7 +84,7 @@ class _LockScreenOptionsState extends State { }, ), ); - await _lockscreenSetting.isAppLockSet(result); + await _lockscreenSetting.setAppLockEnabled(result); await _initializeSettings(); setState(() { if (result) { @@ -105,7 +102,7 @@ class _LockScreenOptionsState extends State { ), ); - await _lockscreenSetting.isAppLockSet(result); + await _lockscreenSetting.setAppLockEnabled(result); await _initializeSettings(); setState(() { if (result) { @@ -116,9 +113,15 @@ class _LockScreenOptionsState extends State { Future _onToggleSwitch() async { AppLock.of(context)!.setEnabled(!appLock); - await _configuration.setSystemLockScreen(false); + if (await LocalAuthenticationService.instance + .isLocalAuthSupportedOnDevice()) { + await _configuration.setSystemLockScreen(!appLock); + await _lockscreenSetting.setAppLockEnabled(!appLock); + } else { + await _configuration.setSystemLockScreen(false); + await _lockscreenSetting.setAppLockEnabled(false); + } await _lockscreenSetting.removePinAndPassword(); - await _lockscreenSetting.isAppLockSet(false); if (PlatformUtil.isMobile()) { await _lockscreenSetting.setHideAppContent(!appLock); setState(() { diff --git a/auth/lib/utils/lock_screen_settings.dart b/auth/lib/utils/lock_screen_settings.dart index 14d56963ca..bd60c62445 100644 --- a/auth/lib/utils/lock_screen_settings.dart +++ b/auth/lib/utils/lock_screen_settings.dart @@ -55,7 +55,7 @@ class LockScreenSettings { final bool systemLockEnabled = Configuration.instance.shouldShowSystemLockScreen(); if (passwordEnabled || pinEnabled || systemLockEnabled) { - await isAppLockSet(true); + await setAppLockEnabled(true); } } } @@ -104,7 +104,7 @@ class LockScreenSettings { await _preferences.setInt(keyInvalidAttempts, count); } - Future isAppLockSet(bool value) async { + Future setAppLockEnabled(bool value) async { await _preferences.setBool(keyAppLockSet, value); } From bc94882234fcb2bbf47274eb086ada081661fd76 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Mon, 19 Aug 2024 17:34:50 +0530 Subject: [PATCH 0415/1179] [mob][auth] Upgraded local_auth 2.2.0 -> 2.3.0 --- auth/pubspec.lock | 32 ++++++++++++++++---------------- auth/pubspec.yaml | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 12908fc253..9475f9b77c 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -869,18 +869,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -901,10 +901,10 @@ packages: dependency: "direct main" description: name: local_auth - sha256: "280421b416b32de31405b0a25c3bd42dfcef2538dfbb20c03019e02a5ed55ed0" + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" local_auth_android: dependency: "direct main" description: @@ -917,10 +917,10 @@ packages: dependency: "direct main" description: name: local_auth_darwin - sha256: e424ebf90d5233452be146d4a7da4bcd7a70278b67791592f3fde1bda8eef9e2 + sha256: "7ba5738c874ca2b910d72385d00d2bebad9d4e807612936cf5e32bc01a048c71" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" local_auth_platform_interface: dependency: transitive description: @@ -957,10 +957,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" menu_base: dependency: transitive description: @@ -973,10 +973,10 @@ packages: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -1539,10 +1539,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" timezone: dependency: transitive description: @@ -1707,10 +1707,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.4" watcher: dependency: transitive description: diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index a607dbe12c..9a4ddc7fb3 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -67,7 +67,7 @@ dependencies: http: ^1.1.0 intl: ^0.19.0 json_annotation: ^4.5.0 - local_auth: ^2.2.0 + local_auth: ^2.3.0 local_auth_android: ^1.0.37 local_auth_darwin: ^1.2.2 logging: ^1.0.1 From f84054b4ceb68cda29e14023275ca7f9965eeb49 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Mon, 19 Aug 2024 17:36:04 +0530 Subject: [PATCH 0416/1179] [mob][auth] macOS pin/passcode support --- auth/lib/services/local_authentication_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/lib/services/local_authentication_service.dart b/auth/lib/services/local_authentication_service.dart index f47ed693cd..9072d02184 100644 --- a/auth/lib/services/local_authentication_service.dart +++ b/auth/lib/services/local_authentication_service.dart @@ -122,7 +122,7 @@ class LocalAuthenticationService { Future isLocalAuthSupportedOnDevice() async { try { - return Platform.isMacOS || Platform.isLinux + return Platform.isLinux ? await FlutterLocalAuthentication().canAuthenticate() : await LocalAuthentication().isDeviceSupported(); } on MissingPluginException { From 1323525cd872e1aca3614f5d602db95af7ee1981 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Mon, 19 Aug 2024 18:59:03 +0530 Subject: [PATCH 0417/1179] [mob][auth] Independent applock implemented --- .../local_authentication_service.dart | 4 ++- .../lock_screen/lock_screen_options.dart | 27 ++++++++++--------- auth/lib/utils/lock_screen_settings.dart | 24 +++++++++-------- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/auth/lib/services/local_authentication_service.dart b/auth/lib/services/local_authentication_service.dart index 9072d02184..a5a2042338 100644 --- a/auth/lib/services/local_authentication_service.dart +++ b/auth/lib/services/local_authentication_service.dart @@ -6,6 +6,7 @@ import 'package:ente_auth/ui/settings/lock_screen/lock_screen_pin.dart'; import 'package:ente_auth/ui/tools/app_lock.dart'; import 'package:ente_auth/utils/auth_util.dart'; import 'package:ente_auth/utils/dialog_util.dart'; +import 'package:ente_auth/utils/lock_screen_settings.dart'; import 'package:ente_auth/utils/toast_util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -23,7 +24,8 @@ class LocalAuthenticationService { BuildContext context, String infoMessage, ) async { - if (await isLocalAuthSupportedOnDevice()) { + if (await isLocalAuthSupportedOnDevice() || + LockScreenSettings.instance.getIsAppLockSet()) { AppLock.of(context)!.setEnabled(false); final result = await requestAuthentication( context, diff --git a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart index df211a9cec..3196ff895d 100644 --- a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart +++ b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart @@ -84,13 +84,15 @@ class _LockScreenOptionsState extends State { }, ), ); - await _lockscreenSetting.setAppLockEnabled(result); - await _initializeSettings(); - setState(() { - if (result) { + + if (result) { + await _configuration.setSystemLockScreen(false); + await _lockscreenSetting.setAppLockEnabled(true); + setState(() { appLock = _lockscreenSetting.getIsAppLockSet(); - } - }); + }); + } + await _initializeSettings(); } Future _passwordLock() async { @@ -101,14 +103,13 @@ class _LockScreenOptionsState extends State { }, ), ); - - await _lockscreenSetting.setAppLockEnabled(result); - await _initializeSettings(); - setState(() { - if (result) { + if (result) { + await _configuration.setSystemLockScreen(false); + setState(() { appLock = _lockscreenSetting.getIsAppLockSet(); - } - }); + }); + } + await _initializeSettings(); } Future _onToggleSwitch() async { diff --git a/auth/lib/utils/lock_screen_settings.dart b/auth/lib/utils/lock_screen_settings.dart index bd60c62445..100bd3434a 100644 --- a/auth/lib/utils/lock_screen_settings.dart +++ b/auth/lib/utils/lock_screen_settings.dart @@ -46,18 +46,20 @@ class LockScreenSettings { } Future setHasMigratedLockScreenChanges() async { - if (_preferences.getBool(keyHasMigratedLockScreenChanges) == null || - getIsAppLockSet() == false) { - await _preferences.setBool(keyHasMigratedLockScreenChanges, true); - - final bool passwordEnabled = await isPasswordSet(); - final bool pinEnabled = await isPinSet(); - final bool systemLockEnabled = - Configuration.instance.shouldShowSystemLockScreen(); - if (passwordEnabled || pinEnabled || systemLockEnabled) { - await setAppLockEnabled(true); - } + if (_preferences.getBool(keyHasMigratedLockScreenChanges) != null) { + return; } + + final bool passwordEnabled = await isPasswordSet(); + final bool pinEnabled = await isPinSet(); + final bool systemLockEnabled = + Configuration.instance.shouldShowSystemLockScreen(); + + if (passwordEnabled || pinEnabled || systemLockEnabled) { + await setAppLockEnabled(true); + } + + await _preferences.setBool(keyHasMigratedLockScreenChanges, true); } Future setHideAppContent(bool hideContent) async { From f7666deb5a61d0ead46c61cce696cbcd4ee2de1d Mon Sep 17 00:00:00 2001 From: Brogio Date: Mon, 19 Aug 2024 17:10:07 +0200 Subject: [PATCH 0418/1179] Update social_section_widget.dart Updated Mastodon link --- auth/lib/ui/settings/social_section_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/lib/ui/settings/social_section_widget.dart b/auth/lib/ui/settings/social_section_widget.dart index cda18366c5..0ef0d24442 100644 --- a/auth/lib/ui/settings/social_section_widget.dart +++ b/auth/lib/ui/settings/social_section_widget.dart @@ -47,7 +47,7 @@ class SocialSectionWidget extends StatelessWidget { "https://shop.ente.io", launchInExternalApp: !Platform.isAndroid, ), - const SocialsMenuItemWidget("Mastodon", "https://mstdn.social/@ente/"), + const SocialsMenuItemWidget("Mastodon", "https://fosstodon.org/@ente"), sectionOptionSpacing, const SocialsMenuItemWidget("Twitter", "https://twitter.com/enteio"), sectionOptionSpacing, From 8d667f86b1b547cd21622f86376f2493547537a5 Mon Sep 17 00:00:00 2001 From: Brogio Date: Mon, 19 Aug 2024 17:10:50 +0200 Subject: [PATCH 0419/1179] Update social_section_widget.dart --- mobile/lib/ui/settings/social_section_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/social_section_widget.dart b/mobile/lib/ui/settings/social_section_widget.dart index 2e04aa723b..0b29760c13 100644 --- a/mobile/lib/ui/settings/social_section_widget.dart +++ b/mobile/lib/ui/settings/social_section_widget.dart @@ -55,7 +55,7 @@ class SocialSectionWidget extends StatelessWidget { sectionOptionSpacing, SocialsMenuItemWidget( S.of(context).mastodon, - "https://mstdn.social/@ente", + "https://fosstodon.org/@ente", ), sectionOptionSpacing, SocialsMenuItemWidget( From 8c5b07b3ce48475bd14181bf91ff03b644260ae8 Mon Sep 17 00:00:00 2001 From: Brogio Date: Mon, 19 Aug 2024 17:14:31 +0200 Subject: [PATCH 0420/1179] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0aabb8116..9d14ed9a33 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ connect with the community. [![Discord](https://img.shields.io/discord/948937918347608085?style=for-the-badge&logo=Discord&logoColor=white&label=Discord)](https://discord.gg/z2YVKkycX3) [![Ente's Blog RSS](https://img.shields.io/badge/blog-rss-F88900?style=for-the-badge&logo=rss&logoColor=white)](https://ente.io/blog/rss.xml) -[![Twitter](.github/assets/twitter.svg)](https://twitter.com/enteio)   [![Mastodon](.github/assets/mastodon.svg)](https://mstdn.social/@ente) +[![Twitter](.github/assets/twitter.svg)](https://twitter.com/enteio)   [![Mastodon](.github/assets/mastodon.svg)](https://fosstodon.org/@ente) --- From 0a35291084ebe88a4a5f56667d56642c3bfec140 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 19 Aug 2024 21:16:00 +0530 Subject: [PATCH 0421/1179] Lint fix --- web/packages/new/photos/services/user-entity.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 61ece151eb..7e26726dd5 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -238,7 +238,8 @@ const saveRemoteUserEntityKey = ( * Generate a new entity key and return it after encrypting it using the user's * master key. */ -const generateEncryptedEntityKey = async () => +// TODO: Temporary export to silence lint +export const generateEncryptedEntityKey = async () => encryptBoxB64(await generateBoxKey(), await masterKeyFromSession()); /** From 6ba92298ddb12066b905ae7cd216cdcf505d117e Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 20 Aug 2024 04:49:15 +0000 Subject: [PATCH 0422/1179] New Crowdin translations by GitHub Action --- .../base/locales/et-EE/translation.json | 658 ++++++++++++++++++ .../base/locales/fr-FR/translation.json | 6 +- .../base/locales/pl-PL/translation.json | 8 +- .../base/locales/zh-CN/translation.json | 4 +- 4 files changed, 667 insertions(+), 9 deletions(-) create mode 100644 web/packages/base/locales/et-EE/translation.json diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json new file mode 100644 index 0000000000..65213cc15e --- /dev/null +++ b/web/packages/base/locales/et-EE/translation.json @@ -0,0 +1,658 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "ENTER_EMAIL": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "password": "", + "link_password_description": "", + "unlock": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "REFERRAL_CODE_HINT": "", + "REFERRAL_INFO": "", + "PASSPHRASE_MATCH_ERROR": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "upload": "", + "import": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_one": "", + "add_photos_other": "", + "select_photos": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "FILE_NOT_UPLOADED_LIST": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "DOWNLOAD_HIDDEN_ITEMS": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "title_photos": "", + "title_auth": "", + "title_accounts": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "password_changed_elsewhere": "", + "password_changed_elsewhere_message": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "cancel": "", + "LOGOUT": "", + "delete_account": "", + "delete_account_manually_message": "", + "LOGOUT_MESSAGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "OFFLINE_MSG": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "CURRENT_USAGE": "", + "TWO_MONTHS_FREE": "", + "POPULAR": "", + "free_plan_option": "", + "free_plan_description": "", + "active": "", + "subscription_info_free": "", + "subscription_info_family": "", + "subscription_info_expired": "", + "subscription_info_renewal_cancelled": "", + "subscription_info_storage_quota_exceeded": "", + "subscription_status_renewal_active": "", + "subscription_status_renewal_cancelled": "", + "add_on_valid_till": "", + "subscription_expired": "", + "storage_quota_exceeded": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "MONTH_SHORT": "", + "YEAR": "", + "update_subscription_title": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH": "", + "SEARCH_RESULTS": "", + "NO_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "CITY": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "", + "FILE_TYPE": "", + "CLIP": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count_other": "", + "TERMS_AND_CONDITIONS": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "PEOPLE": "", + "indexing_scheduled": "", + "indexing_photos": "", + "indexing_fetching": "", + "indexing_people": "", + "indexing_done": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_NAME": "", + "CAPTION_PLACEHOLDER": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "MAP": "", + "MAP_SETTINGS": "", + "ENABLE_MAPS": "", + "ENABLE_MAP": "", + "DISABLE_MAPS": "", + "ENABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP": "", + "DETAILS": "", + "view_exif": "", + "no_exif": "", + "exif": "", + "ISO": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "ENABLE_TWO_FACTOR": "", + "enable": "", + "enabled": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "disable": "", + "reconfigure": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "select_folder": "", + "select_zips": "", + "faq": "", + "takeout_hint": "", + "DESTINATION": "", + "START": "", + "LAST_EXPORT_TIME": "", + "EXPORT_AGAIN": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "ETAGS_BLOCKED": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "failed_uploads_hint": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "ARCHIVE": "", + "FAVORITES": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "HIDE_COLLECTION": "", + "UNHIDE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "REMOVE": "", + "YES_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "METADATA_DATE": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "INSTALL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "ADD_COLLABORATORS": "", + "ADD_NEW_EMAIL": "", + "shared_with_people_zero": "", + "shared_with_people_one": "", + "shared_with_people_other": "", + "participants_zero": "", + "participants_one": "", + "participants_other": "", + "ADD_VIEWERS": "", + "CHANGE_PERMISSIONS_TO_VIEWER": "", + "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", + "CONVERT_TO_VIEWER": "", + "CONVERT_TO_COLLABORATOR": "", + "CHANGE_PERMISSION": "", + "REMOVE_PARTICIPANT": "", + "CONFIRM_REMOVE": "", + "MANAGE": "", + "ADDED_AS": "", + "COLLABORATOR_RIGHTS": "", + "REMOVE_PARTICIPANT_HEAD": "", + "OWNER": "", + "COLLABORATORS": "", + "ADD_MORE": "", + "VIEWERS": "", + "OR_ADD_EXISTING": "", + "REMOVE_PARTICIPANT_MESSAGE": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "FILE_DOWNLOAD": "", + "link_password_lock": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "NO_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "SHARED_USING": "", + "SHARING_REFERRAL_CODE": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "file": "", + "folder": "", + "google_takeout": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "STOP_DOWNLOADS_HEADER": "", + "YES_STOP_DOWNLOADS": "", + "STOP_ALL_DOWNLOADS_MESSAGE": "", + "albums_one": "", + "albums_other": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ALL_HIDDEN_ALBUMS": "", + "HIDDEN_ALBUMS": "", + "HIDDEN_ITEMS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "WATCH_FOLDERS": "", + "upgrade_now": "", + "renew_now": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "CHANGE_FOLDER": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "WEAK_DEVICE": "", + "drag_and_drop_hint": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "more_details": "", + "ml_search": "", + "ml_search_description": "", + "ml_search_footnote": "", + "indexing": "", + "processed": "", + "indexing_status_running": "", + "indexing_status_fetching": "", + "indexing_status_scheduled": "", + "indexing_status_done": "", + "ml_search_disable": "", + "ml_search_disable_confirm": "", + "ml_consent": "", + "ml_consent_title": "", + "ml_consent_description": "", + "ml_consent_confirmation": "", + "labs": "", + "YOURS": "", + "passphrase_strength_weak": "", + "passphrase_strength_moderate": "", + "passphrase_strength_strong": "", + "preferences": "", + "language": "", + "advanced": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "storage_unit": { + "b": "", + "kb": "", + "mb": "", + "gb": "", + "tb": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "MIGRATING_EXPORT": "", + "RENAMING_COLLECTION_FOLDERS": "", + "TRASHING_DELETED_FILES": "", + "TRASHING_DELETED_COLLECTIONS": "", + "CONTINUOUS_EXPORT": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "", + "delete_account_reason_label": "", + "delete_account_reason_placeholder": "", + "delete_reason": { + "missing_feature": "", + "behaviour": "", + "found_another_service": "", + "not_listed": "" + }, + "delete_account_feedback_label": "", + "delete_account_feedback_placeholder": "", + "delete_account_confirm_checkbox_label": "", + "delete_account_confirm": "", + "delete_account_confirm_message": "", + "feedback_required": "", + "feedback_required_found_another_service": "", + "RECOVER_TWO_FACTOR": "", + "at": "", + "AUTH_NEXT": "", + "AUTH_DOWNLOAD_MOBILE_APP": "", + "HIDDEN": "", + "HIDE": "", + "UNHIDE": "", + "UNHIDE_TO_COLLECTION": "", + "SORT_BY": "", + "NEWEST_FIRST": "", + "OLDEST_FIRST": "", + "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", + "SELECT_COLLECTION": "", + "PIN_ALBUM": "", + "UNPIN_ALBUM": "", + "DOWNLOAD_COMPLETE": "", + "DOWNLOADING_COLLECTION": "", + "DOWNLOAD_FAILED": "", + "DOWNLOAD_PROGRESS": "", + "CHRISTMAS": "", + "CHRISTMAS_EVE": "", + "NEW_YEAR": "", + "NEW_YEAR_EVE": "", + "IMAGE": "", + "VIDEO": "", + "LIVE_PHOTO": "", + "editor": { + "crop": "" + }, + "CONVERT": "", + "CONFIRM_EDITOR_CLOSE_MESSAGE": "", + "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", + "BRIGHTNESS": "", + "CONTRAST": "", + "SATURATION": "", + "BLUR": "", + "INVERT_COLORS": "", + "ASPECT_RATIO": "", + "SQUARE": "", + "ROTATE_LEFT": "", + "ROTATE_RIGHT": "", + "FLIP_VERTICALLY": "", + "FLIP_HORIZONTALLY": "", + "DOWNLOAD_EDITED": "", + "SAVE_A_COPY_TO_ENTE": "", + "RESTORE_ORIGINAL": "", + "TRANSFORM": "", + "COLORS": "", + "FLIP": "", + "ROTATION": "", + "RESET": "", + "PHOTO_EDITOR": "", + "FASTER_UPLOAD": "", + "FASTER_UPLOAD_DESCRIPTION": "", + "CAST_ALBUM_TO_TV": "", + "ENTER_CAST_PIN_CODE": "", + "PAIR_DEVICE_TO_TV": "", + "TV_NOT_FOUND": "", + "AUTO_CAST_PAIR": "", + "AUTO_CAST_PAIR_DESC": "", + "PAIR_WITH_PIN": "", + "CHOOSE_DEVICE_FROM_BROWSER": "", + "PAIR_WITH_PIN_DESC": "", + "VISIT_CAST_ENTE_IO": "", + "CAST_AUTO_PAIR_FAILED": "", + "FREEHAND": "", + "APPLY_CROP": "", + "PHOTO_EDIT_REQUIRED_TO_SAVE": "", + "passkeys": "", + "passkey_fetch_failed": "", + "manage_passkey": "", + "delete_passkey": "", + "delete_passkey_confirmation": "", + "rename_passkey": "", + "add_passkey": "", + "enter_passkey_name": "", + "passkeys_description": "", + "CREATED_AT": "", + "passkey_add_failed": "", + "passkey_login_failed": "", + "passkey_login_invalid_url": "", + "passkey_login_already_claimed_session": "", + "passkey_login_generic_error": "", + "passkey_login_credential_hint": "", + "passkeys_not_supported": "", + "try_again": "", + "check_status": "", + "passkey_login_instructions": "", + "passkey_login": "", + "passkey": "", + "passkey_verify_description": "", + "waiting_for_verification": "", + "verification_still_pending": "", + "passkey_verified": "", + "redirecting_back_to_app": "", + "redirect_close_instructions": "", + "redirect_again": "", + "autogenerated_first_album_name": "", + "autogenerated_default_album_name": "", + "developer_settings": "", + "server_endpoint": "", + "more_information": "", + "save": "" +} diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index bf5a0f8d62..51b0af4559 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -33,7 +33,7 @@ "ENTER_ENC_PASSPHRASE": "Veuillez saisir un mot de passe que nous pourrons utiliser pour chiffrer vos données", "PASSPHRASE_DISCLAIMER": "Nous ne stockons pas votre mot de passe, donc si vous le perdez, nous ne pourrons pas vous aider à récupérer vos données sans une clé de récupération.", "WELCOME_TO_ENTE_HEADING": "Bienvenue sur ", - "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage photo avec cryptage de bout en bout", + "WELCOME_TO_ENTE_SUBHEADING": "Stockage et partage de photos chiffrés de bout en bout", "WHERE_YOUR_BEST_PHOTOS_LIVE": "Là où vivent vos meilleures photos", "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Génération des clés de chiffrement...", "PASSPHRASE_HINT": "Mot de passe", @@ -232,7 +232,7 @@ "PEOPLE": "Visages", "indexing_scheduled": "L'indexation est planifiée...", "indexing_photos": "Indexation des photos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Récupération des index ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indexation des personnes dans {{nSyncedFiles, number}} photos...", "indexing_done": "Indexation des {{nSyncedFiles, number}} photos", "UNIDENTIFIED_FACES": "Visages non-identifiés", @@ -485,7 +485,7 @@ "indexing": "", "processed": "", "indexing_status_running": "", - "indexing_status_fetching": "", + "indexing_status_fetching": "Récupération", "indexing_status_scheduled": "", "indexing_status_done": "", "ml_search_disable": "", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 824d852766..e70e986e85 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -124,7 +124,7 @@ "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "Wyślij wiadomość e-mail na {{emailID}} z zarejestrowanego adresu e-mail", "CONTACT_SUPPORT": "Skontaktuj się z pomocą techniczną", "REQUEST_FEATURE": "Zaproponuj Funkcję", - "SUPPORT": "Wsparcie techniczne", + "SUPPORT": "Wsparcie Techniczne", "CONFIRM": "Potwierdź", "cancel": "Anuluj", "LOGOUT": "Wyloguj się", @@ -232,7 +232,7 @@ "PEOPLE": "Ludzie", "indexing_scheduled": "Indeksowanie jest zaplanowane...", "indexing_photos": "Indeksowanie zdjęć ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Pobieranie indeksów ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indeksowanie ludzi w {{nSyncedFiles, number}} zdjęć...", "indexing_done": "Zindeksowano {{nSyncedFiles, number}} zdjęć", "UNIDENTIFIED_FACES": "Niezidentyfikowane twarze", @@ -257,7 +257,7 @@ "no_exif": "Brak danych Exif", "exif": "Exif", "ISO": "ISO", - "TWO_FACTOR": "Uwierzytelnianie Dwustopniowe", + "TWO_FACTOR": "Uwierzytelnianie dwustopniowe", "TWO_FACTOR_AUTHENTICATION": "Uwierzytelnianie dwustopniowe", "TWO_FACTOR_QR_INSTRUCTION": "Zeskanuj poniższy kod QR za pomocą swojej ulubionej aplikacji uwierzytelniającej", "ENTER_CODE_MANUALLY": "Wprowadź kod ręcznie", @@ -485,7 +485,7 @@ "indexing": "Indeksowanie", "processed": "Przetworzone", "indexing_status_running": "Uruchomione", - "indexing_status_fetching": "", + "indexing_status_fetching": "Pobieranie", "indexing_status_scheduled": "Zaplanowane", "indexing_status_done": "Gotowe", "ml_search_disable": "Wyłącz uczenie maszynowe", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index ebda6f6017..c6e11c8068 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -232,7 +232,7 @@ "PEOPLE": "人物", "indexing_scheduled": "索引已安排...", "indexing_photos": "正在索引照片 ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "获取索引中 ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "正在为{{nSyncedFiles, number}}张照片中的人物建立索引...", "indexing_done": "已索引 {{nSyncedFiles, number}} 张照片", "UNIDENTIFIED_FACES": "身份不明的面孔", @@ -485,7 +485,7 @@ "indexing": "索引中", "processed": "已处理", "indexing_status_running": "运行中", - "indexing_status_fetching": "", + "indexing_status_fetching": "获取中", "indexing_status_scheduled": "已安排", "indexing_status_done": "已完成", "ml_search_disable": "禁用机器学习", From 5cd093c4139f68c2a1cd738a217dad672e88b74c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 10:29:09 +0530 Subject: [PATCH 0423/1179] Add workaround for Polish plurals Instead of foo_other, i18n seems to fallback to the base language translation for languages like Polish that have multiple plurals. Use the workaround mentioned here: https://github.com/i18next/i18next/issues/1851#issuecomment-1464017036 --- .../Collections/AllCollections/header.tsx | 2 +- .../emailShare/ManageEmailShare.tsx | 2 +- .../CollectionShare/emailShare/index.tsx | 2 +- .../src/components/UserNameInputDialog.tsx | 4 +++- .../base/locales/ar-SA/translation.json | 22 +++++++++---------- .../base/locales/bg-BG/translation.json | 22 +++++++++---------- .../base/locales/ca-ES/translation.json | 22 +++++++++---------- .../base/locales/de-DE/translation.json | 22 +++++++++---------- .../base/locales/el-GR/translation.json | 22 +++++++++---------- .../base/locales/en-US/translation.json | 22 +++++++++---------- .../base/locales/es-ES/translation.json | 22 +++++++++---------- .../base/locales/et-EE/translation.json | 22 +++++++++---------- .../base/locales/fa-IR/translation.json | 22 +++++++++---------- .../base/locales/fi-FI/translation.json | 22 +++++++++---------- .../base/locales/fr-FR/translation.json | 22 +++++++++---------- .../base/locales/gu-IN/translation.json | 22 +++++++++---------- .../base/locales/hi-IN/translation.json | 22 +++++++++---------- .../base/locales/id-ID/translation.json | 22 +++++++++---------- .../base/locales/is-IS/translation.json | 22 +++++++++---------- .../base/locales/it-IT/translation.json | 22 +++++++++---------- .../base/locales/ja-JP/translation.json | 22 +++++++++---------- .../base/locales/ko-KR/translation.json | 22 +++++++++---------- .../base/locales/nl-NL/translation.json | 22 +++++++++---------- .../base/locales/pl-PL/translation.json | 22 +++++++++---------- .../base/locales/pt-BR/translation.json | 22 +++++++++---------- .../base/locales/pt-PT/translation.json | 22 +++++++++---------- .../base/locales/ru-RU/translation.json | 22 +++++++++---------- .../base/locales/sv-SE/translation.json | 22 +++++++++---------- .../base/locales/te-IN/translation.json | 22 +++++++++---------- .../base/locales/th-TH/translation.json | 22 +++++++++---------- .../base/locales/ti-ER/translation.json | 22 +++++++++---------- .../base/locales/tr-TR/translation.json | 22 +++++++++---------- .../base/locales/zh-CN/translation.json | 22 +++++++++---------- 33 files changed, 325 insertions(+), 323 deletions(-) diff --git a/web/apps/photos/src/components/Collections/AllCollections/header.tsx b/web/apps/photos/src/components/Collections/AllCollections/header.tsx index edbd178f3a..0cf45601d5 100644 --- a/web/apps/photos/src/components/Collections/AllCollections/header.tsx +++ b/web/apps/photos/src/components/Collections/AllCollections/header.tsx @@ -26,7 +26,7 @@ export default function AllCollectionsHeader({ : t("ALL_ALBUMS")} - {t("albums", { count: collectionCount })} + {t("albums_count", { count: collectionCount })}
diff --git a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageEmailShare.tsx b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageEmailShare.tsx index c27c48c529..9f7f407da4 100644 --- a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageEmailShare.tsx +++ b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/ManageEmailShare.tsx @@ -118,7 +118,7 @@ export default function ManageEmailShare({ onClose={onClose} title={collection.name} onRootClose={handleRootClose} - caption={t("participants", { + caption={t("participants_count", { count: peopleCount, })} /> diff --git a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/index.tsx b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/index.tsx index 8b6e08e2a7..3137bcc8aa 100644 --- a/web/apps/photos/src/components/Collections/CollectionShare/emailShare/index.tsx +++ b/web/apps/photos/src/components/Collections/CollectionShare/emailShare/index.tsx @@ -50,7 +50,7 @@ export default function EmailShare({ <> } diff --git a/web/apps/photos/src/components/UserNameInputDialog.tsx b/web/apps/photos/src/components/UserNameInputDialog.tsx index b089cb35d1..73d1169fb8 100644 --- a/web/apps/photos/src/components/UserNameInputDialog.tsx +++ b/web/apps/photos/src/components/UserNameInputDialog.tsx @@ -33,7 +33,9 @@ export default function UserNameInputDialog({ initialValue={uploaderName} callback={handleSubmit} placeholder={t("NAME_PLACEHOLDER")} - buttonText={t("add_photos", { count: toUploadFilesCount ?? 0 })} + buttonText={t("add_photos_count", { + count: toUploadFilesCount ?? 0, + })} fieldType="text" blockButton secondaryButtonAction={onClose} diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 51713df6ae..968e1627bd 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -52,8 +52,8 @@ "import": "استيراد", "ADD_PHOTOS": "إضافة صور", "ADD_MORE_PHOTOS": "إضافة المزيد من الصور", - "add_photos_one": "إضافة 1 عنصر", - "add_photos_other": "إضافة {{count, number}} عناصر", + "add_photos_count_one": "إضافة 1 عنصر", + "add_photos_count": "إضافة {{count, number}} عناصر", "select_photos": "تحديد الصور", "FILE_UPLOAD": "تحميل الملف", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index f0734e481b..7df973eb83 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index ee1ca7624d..c9d64f299f 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -52,8 +52,8 @@ "import": "Importieren", "ADD_PHOTOS": "Fotos hinzufügen", "ADD_MORE_PHOTOS": "Mehr Fotos hinzufügen", - "add_photos_one": "Eine Datei hinzufügen", - "add_photos_other": "{{count, number}} Dateien hinzufügen", + "add_photos_count_one": "Eine Datei hinzufügen", + "add_photos_count": "{{count, number}} Dateien hinzufügen", "select_photos": "Foto auswählen", "FILE_UPLOAD": "Datei hochladen", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Keine Erinnerungen", "photos_count_one": "Eine Erinnerung", - "photos_count_other": "{{count, number}} Erinnerungen", + "photos_count": "{{count, number}} Erinnerungen", "TERMS_AND_CONDITIONS": "Ich stimme den Bedingungen und Datenschutzrichtlinien zu", "ADD_TO_COLLECTION": "Zum Album hinzufügen", "SELECTED": "ausgewählt", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Freigabe ändern", "ADD_COLLABORATORS": "Bearbeiter hinzufügen", "ADD_NEW_EMAIL": "Neue E-Mail-Adresse hinzufügen", - "shared_with_people_zero": "Mit bestimmten Personen teilen", - "shared_with_people_one": "Geteilt mit einer Person", - "shared_with_people_other": "Geteilt mit {{count, number}} Personen", - "participants_zero": "Keine Teilnehmer", - "participants_one": "1 Teilnehmer", - "participants_other": "{{count, number}} Teilnehmer", + "shared_with_people_count_zero": "Mit bestimmten Personen teilen", + "shared_with_people_count_one": "Geteilt mit einer Person", + "shared_with_people_count": "Geteilt mit {{count, number}} Personen", + "participants_count_zero": "Keine Teilnehmer", + "participants_count_one": "1 Teilnehmer", + "participants_count": "{{count, number}} Teilnehmer", "ADD_VIEWERS": "Betrachter hinzufügen", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} wird nicht in der Lage sein, weitere Fotos zum Album

hinzuzufügen. {{selectedEmail}} wird weiterhin die eigenen Fotos aus dem Album entfernen können

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} wird Fotos zum Album hinzufügen können", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Downloads anhalten?", "YES_STOP_DOWNLOADS": "Ja, Downloads anhalten", "STOP_ALL_DOWNLOADS_MESSAGE": "Bist du dir sicher, dass du alle laufenden Downloads anhalten möchtest?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Alben", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Alben", "ALL_ALBUMS": "Alle Alben", "ALBUMS": "Alben", "ALL_HIDDEN_ALBUMS": "Alle versteckten Alben", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 969a843aa6..5f93899450 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -52,8 +52,8 @@ "import": "Εισαγωγή", "ADD_PHOTOS": "Προσθήκη φωτογραφιών", "ADD_MORE_PHOTOS": "Προσθήκη περισσότερων φωτογραφιών", - "add_photos_one": "Προσθήκη 1 αντικειμένου", - "add_photos_other": "Προσθήκη {{count, number}} αντικειμένων", + "add_photos_count_one": "Προσθήκη 1 αντικειμένου", + "add_photos_count": "Προσθήκη {{count, number}} αντικειμένων", "select_photos": "Επιλογή φωτογραφιών", "FILE_UPLOAD": "Μεταφόρτωση Αρχείου", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "1 ανάμνηση", - "photos_count_other": "{{count, number}} αναμνήσεις", + "photos_count": "{{count, number}} αναμνήσεις", "TERMS_AND_CONDITIONS": "Συμφωνώ με τους όρους χρήσης και την πολιτική απορρήτου", "ADD_TO_COLLECTION": "Προσθήκη στο άλμπουμ", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Διακοπή λήψεων;", "YES_STOP_DOWNLOADS": "Ναι, διακοπή λήψεων", "STOP_ALL_DOWNLOADS_MESSAGE": "Είστε σίγουροι ότι θέλετε να διακόψετε όλες τις λήψεις σε εξέλιξη;", - "albums_one": "1 Άλμπουμ", - "albums_other": "{{count, number}} Άλμπουμ", + "albums_count_one": "1 Άλμπουμ", + "albums_count": "{{count, number}} Άλμπουμ", "ALL_ALBUMS": "Όλα τα Άλμπουμ", "ALBUMS": "Άλμπουμ", "ALL_HIDDEN_ALBUMS": "Όλα τα κρυφά άλμπουμ", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 4df6277261..c778a8e45a 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -52,8 +52,8 @@ "import": "Import", "ADD_PHOTOS": "Add photos", "ADD_MORE_PHOTOS": "Add more photos", - "add_photos_one": "Add 1 item", - "add_photos_other": "Add {{count, number}} items", + "add_photos_count_one": "Add 1 item", + "add_photos_count": "Add {{count, number}} items", "select_photos": "Select photos", "FILE_UPLOAD": "File Upload", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "No memories", "photos_count_one": "1 memory", - "photos_count_other": "{{count, number}} memories", + "photos_count": "{{count, number}} memories", "TERMS_AND_CONDITIONS": "I agree to the terms and privacy policy", "ADD_TO_COLLECTION": "Add to album", "SELECTED": "selected", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Modify sharing", "ADD_COLLABORATORS": "Add collaborators", "ADD_NEW_EMAIL": "Add a new email", - "shared_with_people_zero": "Share with specific people", - "shared_with_people_one": "Shared with 1 person", - "shared_with_people_other": "Shared with {{count, number}} people", - "participants_zero": "No participants", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", + "shared_with_people_count_zero": "Share with specific people", + "shared_with_people_count_one": "Shared with 1 person", + "shared_with_people_count": "Shared with {{count, number}} people", + "participants_count_zero": "No participants", + "participants_count_one": "1 participant", + "participants_count": "{{count, number}} participants", "ADD_VIEWERS": "Add viewers", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} will not be able to add more photos to the album

They will still be able to remove photos added by them

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} will be able to add photos to the album", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Stop downloads?", "YES_STOP_DOWNLOADS": "Yes, stop downloads", "STOP_ALL_DOWNLOADS_MESSAGE": "Are you sure that you want to stop all the downloads in progress?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Albums", "ALL_ALBUMS": "All Albums", "ALBUMS": "Albums", "ALL_HIDDEN_ALBUMS": "All hidden albums", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index 4028e189e4..d264755363 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -52,8 +52,8 @@ "import": "Importar", "ADD_PHOTOS": "Añadir fotos", "ADD_MORE_PHOTOS": "Añadir más fotos", - "add_photos_one": "Añadir 1 foto", - "add_photos_other": "Añadir {{count}} fotos", + "add_photos_count_one": "Añadir 1 foto", + "add_photos_count": "Añadir {{count}} fotos", "select_photos": "Seleccionar fotos", "FILE_UPLOAD": "Subir archivo", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "No hay recuerdos", "photos_count_one": "1 recuerdo", - "photos_count_other": "{{count}} recuerdos", + "photos_count": "{{count}} recuerdos", "TERMS_AND_CONDITIONS": "Acepto los términos y política de privacidad", "ADD_TO_COLLECTION": "Añadir al álbum", "SELECTED": "seleccionado", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Modificar compartir", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "Compartido con 1 persona", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "Compartido con 1 persona", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "¿Detener las descargas?", "YES_STOP_DOWNLOADS": "Sí, detener las descargas", "STOP_ALL_DOWNLOADS_MESSAGE": "¿Estás seguro de que quieres detener todas las descargas en curso?", - "albums_one": "1 álbum", - "albums_other": "{{count}} álbumes", + "albums_count_one": "1 álbum", + "albums_count": "{{count}} álbumes", "ALL_ALBUMS": "Todos los álbumes", "ALBUMS": "Álbumes", "ALL_HIDDEN_ALBUMS": "Todos los álbumes ocultos", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 0d0e6972ef..c3d6c8159a 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index 82b622f142..d0f899abef 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -52,8 +52,8 @@ "import": "Tuo", "ADD_PHOTOS": "Lisää kuvia", "ADD_MORE_PHOTOS": "Lisää enemmän kuvia", - "add_photos_one": "Lisää yksi kohde", - "add_photos_other": "Lisää {{count, number}} kohdetta", + "add_photos_count_one": "Lisää yksi kohde", + "add_photos_count": "Lisää {{count, number}} kohdetta", "select_photos": "Valitse kuvat", "FILE_UPLOAD": "Tiedoston lataaminen", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 51b0af4559..a70ea0a2fb 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -52,8 +52,8 @@ "import": "Importer", "ADD_PHOTOS": "Ajouter des photos", "ADD_MORE_PHOTOS": "Ajouter plus de photos", - "add_photos_one": "Ajouter une photo", - "add_photos_other": "Ajouter {{count}} photos", + "add_photos_count_one": "Ajouter une photo", + "add_photos_count": "Ajouter {{count}} photos", "select_photos": "Sélectionner des photos", "FILE_UPLOAD": "Fichier chargé", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Pas de souvenirs", "photos_count_one": "1 souvenir", - "photos_count_other": "{{count}} souvenirs", + "photos_count": "{{count}} souvenirs", "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", "ADD_TO_COLLECTION": "Ajouter à l'album", "SELECTED": "Sélectionné", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Modifier le partage", "ADD_COLLABORATORS": "Ajouter des collaborateurs", "ADD_NEW_EMAIL": "Ajouter un nouvel email", - "shared_with_people_zero": "Partager avec des personnes spécifiques", - "shared_with_people_one": "Partagé avec 1 personne", - "shared_with_people_other": "Partagé avec {{count, number}} personnes", - "participants_zero": "Aucun participant", - "participants_one": "1 participant", - "participants_other": "{{count, number}} participants", + "shared_with_people_count_zero": "Partager avec des personnes spécifiques", + "shared_with_people_count_one": "Partagé avec 1 personne", + "shared_with_people_count": "Partagé avec {{count, number}} personnes", + "participants_count_zero": "Aucun participant", + "participants_count_one": "1 participant", + "participants_count": "{{count, number}} participants", "ADD_VIEWERS": "Ajouter un observateur", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} ne pourra plus ajouter de photos à l'album

Il pourra toujours supprimer les photos qu'il a ajoutées

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} pourra ajouter des photos à l'album", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Arrêter le téléchargement ?", "YES_STOP_DOWNLOADS": "Oui, arrêter les téléchargements", "STOP_ALL_DOWNLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", - "albums_one": "1 album", - "albums_other": "{{count}} albums", + "albums_count_one": "1 album", + "albums_count": "{{count}} albums", "ALL_ALBUMS": "Tous les albums", "ALBUMS": "Albums", "ALL_HIDDEN_ALBUMS": "Tous les albums masqués", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index ca03935f0b..9bf887d7be 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -52,8 +52,8 @@ "import": "Impor", "ADD_PHOTOS": "Tambahkan foto", "ADD_MORE_PHOTOS": "Tambahkan lebih banyak foto", - "add_photos_one": "Tambahkan item", - "add_photos_other": "Tambahkan {{count, number}} item", + "add_photos_count_one": "Tambahkan item", + "add_photos_count": "Tambahkan {{count, number}} item", "select_photos": "Pilih foto", "FILE_UPLOAD": "Unggah File", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Tidak ada kenangan", "photos_count_one": "1 kenangan", - "photos_count_other": "{{count, number}} kenangan", + "photos_count": "{{count, number}} kenangan", "TERMS_AND_CONDITIONS": "Saya menyetujui ketentuan dan kebijakan privasi Ente", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "Tambah kolaborator", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "Bagikan dengan orang tertentu", - "shared_with_people_one": "Berbagi dengan 1 orang", - "shared_with_people_other": "Berbagi dengan {{count, number}} orang", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "Bagikan dengan orang tertentu", + "shared_with_people_count_one": "Berbagi dengan 1 orang", + "shared_with_people_count": "Berbagi dengan {{count, number}} orang", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Album", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Album", "ALL_ALBUMS": "Semua Album", "ALBUMS": "Album", "ALL_HIDDEN_ALBUMS": "Semua album tersembunyi", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index a21aeb4964..609dff0ef7 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index 9e8106948f..bab61f3854 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -52,8 +52,8 @@ "import": "Importa", "ADD_PHOTOS": "Aggiungi foto", "ADD_MORE_PHOTOS": "Aggiungi altre foto", - "add_photos_one": "Aggiungi elemento", - "add_photos_other": "Aggiungi {{count, number}} elementi", + "add_photos_count_one": "Aggiungi elemento", + "add_photos_count": "Aggiungi {{count, number}} elementi", "select_photos": "Seleziona foto", "FILE_UPLOAD": "Carica file", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Nessuna memoria", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "Aggiungi all'album", "SELECTED": "selezionato", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Nessun partecipante", - "participants_one": "1 partecipante", - "participants_other": "{{count, number}} partecipanti", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "Nessun partecipante", + "participants_count_one": "1 partecipante", + "participants_count": "{{count, number}} partecipanti", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Album", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Album", "ALL_ALBUMS": "Tutti gli Album", "ALBUMS": "Album", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index 863b44c8a1..0afc0224fd 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -52,8 +52,8 @@ "import": "가져오기", "ADD_PHOTOS": "사진 추가", "ADD_MORE_PHOTOS": "사진 더 추가하기", - "add_photos_one": "아이템 하나 추가", - "add_photos_other": "아이템 {{count, number}} 개 추가하기", + "add_photos_count_one": "아이템 하나 추가", + "add_photos_count": "아이템 {{count, number}} 개 추가하기", "select_photos": "사진 선택하기", "FILE_UPLOAD": "파일 업로드", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 642d3b3703..1230753848 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -52,8 +52,8 @@ "import": "Importeren", "ADD_PHOTOS": "Foto's toevoegen", "ADD_MORE_PHOTOS": "Meer foto's toevoegen", - "add_photos_one": "1 foto toevoegen", - "add_photos_other": "{{count, number}} foto's toevoegen", + "add_photos_count_one": "1 foto toevoegen", + "add_photos_count": "{{count, number}} foto's toevoegen", "select_photos": "Selecteer foto's", "FILE_UPLOAD": "Bestand uploaden", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Geen herinneringen", "photos_count_one": "1 herinnering", - "photos_count_other": "{{count, number}} herinneringen", + "photos_count": "{{count, number}} herinneringen", "TERMS_AND_CONDITIONS": "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid", "ADD_TO_COLLECTION": "Toevoegen aan album", "SELECTED": "geselecteerd", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Delen wijzigen", "ADD_COLLABORATORS": "Samenwerker toevoegen", "ADD_NEW_EMAIL": "Nieuw e-mailadres toevoegen", - "shared_with_people_zero": "Delen met specifieke mensen", - "shared_with_people_one": "Gedeeld met 1 persoon", - "shared_with_people_other": "Gedeeld met {{count, number}} mensen", - "participants_zero": "Geen deelnemers", - "participants_one": "1 deelnemer", - "participants_other": "{{count, number}} deelnemers", + "shared_with_people_count_zero": "Delen met specifieke mensen", + "shared_with_people_count_one": "Gedeeld met 1 persoon", + "shared_with_people_count": "Gedeeld met {{count, number}} mensen", + "participants_count_zero": "Geen deelnemers", + "participants_count_one": "1 deelnemer", + "participants_count": "{{count, number}} deelnemers", "ADD_VIEWERS": "Voeg kijkers toe", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} zullen geen foto's meer kunnen toevoegen aan dit album

Ze zullen nog steeds bestaande foto's kunnen verwijderen die door hen zijn toegevoegd

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} zal foto's aan het album kunnen toevoegen", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Downloaden stoppen?", "YES_STOP_DOWNLOADS": "Ja, downloads stoppen", "STOP_ALL_DOWNLOADS_MESSAGE": "Weet je zeker dat je wilt stoppen met alle downloads die worden uitgevoerd?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albums", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Albums", "ALL_ALBUMS": "Alle albums", "ALBUMS": "Albums", "ALL_HIDDEN_ALBUMS": "Alle verborgen albums", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index e70e986e85..01a42c7588 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -52,8 +52,8 @@ "import": "Importuj", "ADD_PHOTOS": "Dodaj zdjęcia", "ADD_MORE_PHOTOS": "Dodaj więcej zdjęć", - "add_photos_one": "Dodaj 1 element", - "add_photos_other": "Dodaj {{count, number}} elementów", + "add_photos_count_one": "Dodaj 1 element", + "add_photos_count": "Dodaj {{count, number}} elementów", "select_photos": "Wybierz zdjęcia", "FILE_UPLOAD": "Przesył plików", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Brak wspomnień", "photos_count_one": "1 wspomnienie", - "photos_count_other": "{{count, number}} wspomnień", + "photos_count": "{{count, number}} wspomnień", "TERMS_AND_CONDITIONS": "Akceptuję warunki korzystania z usługi i politykę prywatności", "ADD_TO_COLLECTION": "Dodaj do albumu", "SELECTED": "wybrane", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Modyfikuj udostępnianie", "ADD_COLLABORATORS": "Dodaj współuczestników", "ADD_NEW_EMAIL": "Dodaj nowy adres e-mail", - "shared_with_people_zero": "Podziel się z określonymi osobami", - "shared_with_people_one": "Udostępnione z jedną osobą", - "shared_with_people_other": "Udostępnione z {{count, number}} osobami", - "participants_zero": "Brak uczestników", - "participants_one": "1 uczestnik", - "participants_other": "{{count, number}} uczestników", + "shared_with_people_count_zero": "Podziel się z określonymi osobami", + "shared_with_people_count_one": "Udostępnione z jedną osobą", + "shared_with_people_count": "Udostępnione z {{count, number}} osobami", + "participants_count_zero": "Brak uczestników", + "participants_count_one": "1 uczestnik", + "participants_count": "{{count, number}} uczestników", "ADD_VIEWERS": "Dodaj widzów", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} nie będzie mógł dodać więcej zdjęć do tego albumu.

Nadal będą mogli usuwać istniejące zdjęcia, które dodali

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} będzie mógł dodawać zdjęcia do albumu", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Zatrzymać pobieranie?", "YES_STOP_DOWNLOADS": "Tak, zatrzymaj pobieranie", "STOP_ALL_DOWNLOADS_MESSAGE": "Czy na pewno chcesz zatrzymać wszystkie pobierane w toku?", - "albums_one": "1 Album", - "albums_other": "{{count, number}} Albumów", + "albums_count_one": "1 Album", + "albums_count": "{{count, number}} Albumów", "ALL_ALBUMS": "Wszystkie Albumy", "ALBUMS": "Albumy", "ALL_HIDDEN_ALBUMS": "Wszystkie ukryte albumy", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index f344cb21df..8819b114fd 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -52,8 +52,8 @@ "import": "Importar", "ADD_PHOTOS": "Adicionar fotos", "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", + "add_photos_count_one": "Adicionar item", + "add_photos_count": "Adicionar {{count, number}} itens", "select_photos": "Selecionar fotos", "FILE_UPLOAD": "Envio de Arquivo", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Sem memórias", "photos_count_one": "1 memória", - "photos_count_other": "{{count, number}} memórias", + "photos_count": "{{count, number}} memórias", "TERMS_AND_CONDITIONS": "Eu concordo com os termos e a política de privacidade", "ADD_TO_COLLECTION": "Adicionar ao álbum", "SELECTED": "selecionado", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Modificar compartilhamento", "ADD_COLLABORATORS": "Adicionar colaboradores", "ADD_NEW_EMAIL": "Adicionar um novo email", - "shared_with_people_zero": "Compartilhar com pessoas específicas", - "shared_with_people_one": "Compartilhado com 1 pessoa", - "shared_with_people_other": "Compartilhado com {{count, number}} pessoas", - "participants_zero": "Nenhum participante", - "participants_one": "1 participante", - "participants_other": "{{count, number}} participantes", + "shared_with_people_count_zero": "Compartilhar com pessoas específicas", + "shared_with_people_count_one": "Compartilhado com 1 pessoa", + "shared_with_people_count": "Compartilhado com {{count, number}} pessoas", + "participants_count_zero": "Nenhum participante", + "participants_count_one": "1 participante", + "participants_count": "{{count, number}} participantes", "ADD_VIEWERS": "Adicionar visualizações", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} Não poderá adicionar mais fotos a este álbum

Eles ainda poderão remover as fotos existentes adicionadas por eles

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} poderá adicionar fotos ao álbum", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Parar downloads?", "YES_STOP_DOWNLOADS": "Sim, parar downloads", "STOP_ALL_DOWNLOADS_MESSAGE": "Tem certeza que deseja parar todos os downloads em andamento?", - "albums_one": "1 Álbum", - "albums_other": "{{count, number}} Álbuns", + "albums_count_one": "1 Álbum", + "albums_count": "{{count, number}} Álbuns", "ALL_ALBUMS": "Todos os álbuns", "ALBUMS": "Álbuns", "ALL_HIDDEN_ALBUMS": "Todos os álbuns ocultos", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 82a3b6abd6..b1d4f2f26e 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -52,8 +52,8 @@ "import": "Importar", "ADD_PHOTOS": "Adicionar fotos", "ADD_MORE_PHOTOS": "Adicionar mais fotos", - "add_photos_one": "Adicionar item", - "add_photos_other": "Adicionar {{count, number}} itens", + "add_photos_count_one": "Adicionar item", + "add_photos_count": "Adicionar {{count, number}} itens", "select_photos": "Selecionar fotos", "FILE_UPLOAD": "Enviar Ficheiro", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index 632ef77209..e53cc97a3f 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -52,8 +52,8 @@ "import": "Импорт", "ADD_PHOTOS": "Добавить фотографии", "ADD_MORE_PHOTOS": "Добавить больше фото", - "add_photos_one": "Добавить 1 элемент", - "add_photos_other": "Добавить {{count, number}} элементов", + "add_photos_count_one": "Добавить 1 элемент", + "add_photos_count": "Добавить {{count, number}} элементов", "select_photos": "Выбрать фотографии", "FILE_UPLOAD": "Загрузка файла", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Воспоминания отсутствуют", "photos_count_one": "1 память", - "photos_count_other": "{{count, number}} воспоминания", + "photos_count": "{{count, number}} воспоминания", "TERMS_AND_CONDITIONS": "Я согласен с тем, что условия и политика конфиденциальности", "ADD_TO_COLLECTION": "Добавить в альбом", "SELECTED": "выбрано", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "Изменить общий доступ", "ADD_COLLABORATORS": "Добавление соавторов", "ADD_NEW_EMAIL": "Добавьте новое электронное письмо", - "shared_with_people_zero": "Делитесь с конкретными людьми", - "shared_with_people_one": "Совместно с 1 человеком", - "shared_with_people_other": "Поделился с {{count, number}} люди", - "participants_zero": "Нет участников", - "participants_one": "1 участник", - "participants_other": "{{count, number}} участники", + "shared_with_people_count_zero": "Делитесь с конкретными людьми", + "shared_with_people_count_one": "Совместно с 1 человеком", + "shared_with_people_count": "Поделился с {{count, number}} люди", + "participants_count_zero": "Нет участников", + "participants_count_one": "1 участник", + "participants_count": "{{count, number}} участники", "ADD_VIEWERS": "Добавить зрителей", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} они не смогут добавить больше фотографий в альбом

Они по-прежнему смогут удалять добавленные ими фотографии

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} сможете добавлять фотографии в альбом", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "Остановить загрузку?", "YES_STOP_DOWNLOADS": "Да, остановите загрузку", "STOP_ALL_DOWNLOADS_MESSAGE": "Вы уверены, что хотите остановить все текущие загрузки?", - "albums_one": "1 Альбом", - "albums_other": "{{count, number}} Альбомы", + "albums_count_one": "1 Альбом", + "albums_count": "{{count, number}} Альбомы", "ALL_ALBUMS": "Все альбомы", "ALBUMS": "Альбомы", "ALL_HIDDEN_ALBUMS": "Все скрытые альбомы", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 406644bc83..41f1c3d5a2 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -52,8 +52,8 @@ "import": "Importera", "ADD_PHOTOS": "Lägg till bilder", "ADD_MORE_PHOTOS": "Lägg till fler bilder", - "add_photos_one": "Lägg till ett (1) objekt", - "add_photos_other": "Lägg till {{count, number}} objekt", + "add_photos_count_one": "Lägg till ett (1) objekt", + "add_photos_count": "Lägg till {{count, number}} objekt", "select_photos": "Välj bilder", "FILE_UPLOAD": "Ladda upp", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "Inga deltagare", - "participants_one": "1 deltagare", - "participants_other": "{{count, number}} deltagare", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "Inga deltagare", + "participants_count_one": "1 deltagare", + "participants_count": "{{count, number}} deltagare", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "1 album", - "albums_other": "{{count, number}} album", + "albums_count_one": "1 album", + "albums_count": "{{count, number}} album", "ALL_ALBUMS": "Alla album", "ALBUMS": "Album", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 65213cc15e..2f7b02d9ee 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -52,8 +52,8 @@ "import": "", "ADD_PHOTOS": "", "ADD_MORE_PHOTOS": "", - "add_photos_one": "", - "add_photos_other": "", + "add_photos_count_one": "", + "add_photos_count": "", "select_photos": "", "FILE_UPLOAD": "", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "", "photos_count_one": "", - "photos_count_other": "", + "photos_count": "", "TERMS_AND_CONDITIONS": "", "ADD_TO_COLLECTION": "", "SELECTED": "", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", "ADD_NEW_EMAIL": "", - "shared_with_people_zero": "", - "shared_with_people_one": "", - "shared_with_people_other": "", - "participants_zero": "", - "participants_one": "", - "participants_other": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", "ADD_VIEWERS": "", "CHANGE_PERMISSIONS_TO_VIEWER": "", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "", "YES_STOP_DOWNLOADS": "", "STOP_ALL_DOWNLOADS_MESSAGE": "", - "albums_one": "", - "albums_other": "", + "albums_count_one": "", + "albums_count": "", "ALL_ALBUMS": "", "ALBUMS": "", "ALL_HIDDEN_ALBUMS": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index c6e11c8068..fc592f6026 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -52,8 +52,8 @@ "import": "导入", "ADD_PHOTOS": "添加照片", "ADD_MORE_PHOTOS": "添加更多的照片", - "add_photos_one": "添加1个项目", - "add_photos_other": "添加 {{count, number}} 个项目", + "add_photos_count_one": "添加1个项目", + "add_photos_count": "添加 {{count, number}} 个项目", "select_photos": "选择照片", "FILE_UPLOAD": "上传文件", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "没有回忆", "photos_count_one": "1个回忆", - "photos_count_other": "{{count, number}} 个回忆", + "photos_count": "{{count, number}} 个回忆", "TERMS_AND_CONDITIONS": "我同意 条款隐私政策", "ADD_TO_COLLECTION": "添加到相册", "SELECTED": "已选", @@ -366,12 +366,12 @@ "MODIFY_SHARING": "更改共享", "ADD_COLLABORATORS": "添加协作者", "ADD_NEW_EMAIL": "添加新的电子邮件", - "shared_with_people_zero": "与特定人员分享", - "shared_with_people_one": "已与1个人共享", - "shared_with_people_other": "已与 {count, number} 个人共享", - "participants_zero": "暂无参与者", - "participants_one": "1 名参与者", - "participants_other": "{{count, number}} 名参与者", + "shared_with_people_count_zero": "与特定人员分享", + "shared_with_people_count_one": "已与1个人共享", + "shared_with_people_count": "已与 {count, number} 个人共享", + "participants_count_zero": "暂无参与者", + "participants_count_one": "1 名参与者", + "participants_count": "{{count, number}} 名参与者", "ADD_VIEWERS": "添加查看者", "CHANGE_PERMISSIONS_TO_VIEWER": "

{{selectedEmail}} 将无法向相册添加更多照片

他们仍然可以删除他们添加的照片

", "CHANGE_PERMISSIONS_TO_COLLABORATOR": "{{selectedEmail}} 将能够将照片添加到相册", @@ -426,8 +426,8 @@ "STOP_DOWNLOADS_HEADER": "要停止下载吗?", "YES_STOP_DOWNLOADS": "是,停止下载", "STOP_ALL_DOWNLOADS_MESSAGE": "您确定要停止所有正在进行的下载?", - "albums_one": "1个相册", - "albums_other": "{{count, number}} 个相册", + "albums_count_one": "1个相册", + "albums_count": "{{count, number}} 个相册", "ALL_ALBUMS": "所有相册", "ALBUMS": "相册", "ALL_HIDDEN_ALBUMS": "所有隐藏的相册", From 9f41257139a3f6889a7f474f1f6e414118619bb3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:43:20 +0530 Subject: [PATCH 0424/1179] [mob] Remove feature flag for ML beta --- mobile/lib/main.dart | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 896505b298..bf02a5c018 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -302,13 +302,7 @@ Future _init(bool isBackground, {String via = ''}) async { MachineLearningController.instance.init(); _logger.info("MachineLearningController done"); - if (flagService.faceSearchEnabled) { - unawaited(MLService.instance.init()); - } else { - if (localSettings.isFaceIndexingEnabled) { - unawaited(localSettings.toggleFaceIndexing()); - } - } + unawaited(MLService.instance.init()); PersonService.init( EntityService.instance, MLDataDB.instance, From 730a0d4fae2fc6d885c1aea8c249d64a1b0e655f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:44:30 +0530 Subject: [PATCH 0425/1179] [mob] Rename --- mobile/lib/ui/settings_page.dart | 2 +- mobile/plugins/ente_feature_flag/lib/src/service.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/settings_page.dart b/mobile/lib/ui/settings_page.dart index a3c3c83cb9..e002ad8463 100644 --- a/mobile/lib/ui/settings_page.dart +++ b/mobile/lib/ui/settings_page.dart @@ -144,7 +144,7 @@ class SettingsPage extends StatelessWidget { if (hasLoggedIn && flagService.internalUser) { contents.addAll([sectionSpacing, const DebugSectionWidget()]); - if (flagService.faceSearchEnabled) { + if (flagService.isBetaUser) { contents.addAll([sectionSpacing, const MLDebugSectionWidget()]); } } diff --git a/mobile/plugins/ente_feature_flag/lib/src/service.dart b/mobile/plugins/ente_feature_flag/lib/src/service.dart index e7df0f34d1..32dd5d3b95 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/service.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/service.dart @@ -67,7 +67,7 @@ class FlagService { bool get mapEnabled => flags.mapEnabled; - bool get faceSearchEnabled => internalUser || flags.betaUser; + bool get isBetaUser => internalUser || flags.betaUser; bool get recoveryKeyVerified => flags.recoveryKeyVerified; From 19c6ebefd3a6195d5d8c4e9d4ccd79cdd04537ba Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 10:45:20 +0530 Subject: [PATCH 0426/1179] Add note --- .../contentOverlay/individual/usageSection.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/web/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx b/web/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx index 251a58d823..857ac9c633 100644 --- a/web/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx +++ b/web/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx @@ -11,6 +11,17 @@ interface Iprops { storage: number; } export function IndividualUsageSection({ usage, storage, fileCount }: Iprops) { + // [Note: Fallback translation for languages with multiple plurals] + // + // Languages like Polish and Arabian have multiple plural forms, and + // currently i18n falls back to the base language translation instead of the + // "_other" form if all the plural forms are not listed out. + // + // As a workaround, name the _other form as the unprefixed name. That is, + // instead of calling the most general plural form as foo_count_other, call + // it foo_count (To keep our heads straight, we adopt the convention that + // all such pluralizable strings use the _count suffix, but that's not a + // requirement from the library). return ( From 6caf6c48a60611d14e7ffbe62842b0a6ca461e29 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:56:53 +0530 Subject: [PATCH 0427/1179] [mob] Ask for ml consent while enabling ML --- mobile/ios/Podfile.lock | 6 - mobile/ios/Runner.xcodeproj/project.pbxproj | 2 - mobile/lib/generated/intl/messages_de.dart | 2 + mobile/lib/generated/intl/messages_en.dart | 10 ++ mobile/lib/generated/intl/messages_pl.dart | 140 ++++++++-------- mobile/lib/generated/intl/messages_pt.dart | 2 + mobile/lib/generated/intl/messages_zh.dart | 15 +- mobile/lib/generated/l10n.dart | 50 ++++++ mobile/lib/l10n/intl_en.arb | 5 + .../services/user_remote_flag_service.dart | 3 + .../machine_learning_settings_page.dart | 15 +- .../lib/ui/settings/ml/enable_ml_consent.dart | 156 ++++++++++++++++++ .../ente_feature_flag/lib/src/service.dart | 2 + mobile/pubspec.lock | 36 ++-- 14 files changed, 340 insertions(+), 104 deletions(-) create mode 100644 mobile/lib/ui/settings/ml/enable_ml_consent.dart diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 47f378bd59..dc42f83a4b 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -3,8 +3,6 @@ PODS: - Flutter - battery_info (0.0.1): - Flutter - - blurhash_ffi (0.0.1): - - Flutter - connectivity_plus (0.0.1): - Flutter - FlutterMacOS @@ -246,7 +244,6 @@ PODS: DEPENDENCIES: - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - battery_info (from `.symlinks/plugins/battery_info/ios`) - - blurhash_ffi (from `.symlinks/plugins/blurhash_ffi/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) @@ -330,8 +327,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/background_fetch/ios" battery_info: :path: ".symlinks/plugins/battery_info/ios" - blurhash_ffi: - :path: ".symlinks/plugins/blurhash_ffi/ios" connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/darwin" dart_ui_isolate: @@ -442,7 +437,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: background_fetch: 2319bf7e18237b4b269430b7f14d177c0df09c5a battery_info: 09f5c9ee65394f2291c8c6227bedff345b8a730c - blurhash_ffi: 4831b96320d4273876c9a2fd3f7d50b8a3a53509 connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14 device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index e3688f71ab..dd14771994 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -292,7 +292,6 @@ "${BUILT_PRODUCTS_DIR}/Toast/Toast.framework", "${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework", "${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework", - "${BUILT_PRODUCTS_DIR}/blurhash_ffi/blurhash_ffi.framework", "${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework", "${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework", "${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework", @@ -388,7 +387,6 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/blurhash_ffi.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dart_ui_isolate.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework", diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 595d34ca43..a4cb6f2117 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -683,6 +683,8 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Karten aktivieren"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Dies zeigt Ihre Fotos auf einer Weltkarte.\n\nDiese Karte wird von OpenStreetMap gehostet und die genauen Standorte Ihrer Fotos werden niemals geteilt.\n\nSie können diese Funktion jederzeit in den Einstellungen deaktivieren."), + "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( + "Mehrteiliges Hochladen aktivieren"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Verschlüssele Sicherung …"), "encryption": MessageLookupByLibrary.simpleMessage("Verschlüsselung"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 5f9b7d5d27..0de39a7383 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -963,6 +963,16 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlConsent": + MessageLookupByLibrary.simpleMessage("Enable machine learning"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "I understand, and wish to enable machine learning"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Please click here for more details about this feature in our privacy policy"), + "mlConsentTitle": + MessageLookupByLibrary.simpleMessage("Enable machine learning?"), "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 54b76e07cd..abb44e9cca 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -21,7 +21,7 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'pl'; static String m0(count) => - "${Intl.plural(count, one: 'Dodaj współpracownika', few: 'Dodaj współpracowników', many: 'Dodaj współpracowników', other: 'Dodaj współpracowników')}"; + "${Intl.plural(count, one: 'Dodaj współuczestnika', few: 'Dodaj współuczestników', many: 'Dodaj współuczestników', other: 'Dodaj współuczestników')}"; static String m2(count) => "${Intl.plural(count, one: 'Dodaj element', few: 'Dodaj elementy', other: 'Dodaj elementów')}"; @@ -48,7 +48,7 @@ class MessageLookup extends MessageLookupByLibrary { "Prosimy najpierw anulować istniejącą subskrypcję z ${paymentProvider}"; static String m10(user) => - "${user} nie będzie mógł dodać więcej zdjęć do tego albumu\n\nJednak nadal będzie mógł usunąć istniejące zdjęcia, które dodał"; + "${user} nie będzie mógł dodać więcej zdjęć do tego albumu\n\nJednak nadal będą mogli usunąć istniejące zdjęcia, które dodali"; static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { @@ -135,7 +135,7 @@ class MessageLookup extends MessageLookupByLibrary { "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; static String m40(endDate) => - "Bezpłatny okres próbny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; + "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; static String m41(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; @@ -175,7 +175,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m54(emailIDs) => "Udostępnione z ${emailIDs}"; static String m55(fileType) => - "Ten ${fileType} zostanie usunięty z twojego urządzenia."; + "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; static String m56(fileType) => "Ten ${fileType} jest zarówno w Ente, jak i na twoim urządzeniu."; @@ -205,7 +205,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m65(count) => "${Intl.plural(count, zero: '', one: '${count} dzień', few: '${count} dni', other: '${count} dni')}"; - static String m66(endDate) => "Ważna do ${endDate}"; + static String m66(endDate) => "Ważne do ${endDate}"; static String m67(email) => "Zweryfikuj ${email}"; @@ -215,7 +215,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m69(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m70(storageSaved) => "Pomyślnie zwolniłeś ${storageSaved}!"; + static String m70(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -232,7 +232,7 @@ class MessageLookup extends MessageLookupByLibrary { "addANewEmail": MessageLookupByLibrary.simpleMessage("Dodaj nowy adres e-mail"), "addCollaborator": - MessageLookupByLibrary.simpleMessage("Dodaj kolaboratora"), + MessageLookupByLibrary.simpleMessage("Dodaj współuczestnika"), "addCollaborators": m0, "addFromDevice": MessageLookupByLibrary.simpleMessage("Dodaj z urządzenia"), @@ -252,7 +252,7 @@ class MessageLookup extends MessageLookupByLibrary { "addToEnte": MessageLookupByLibrary.simpleMessage("Dodaj do Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Dodaj do ukrytego albumu"), - "addViewer": MessageLookupByLibrary.simpleMessage("Dodaj obserwatora"), + "addViewer": MessageLookupByLibrary.simpleMessage("Dodaj widza"), "addViewers": m1, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Dodaj swoje zdjęcia teraz"), @@ -261,10 +261,9 @@ class MessageLookup extends MessageLookupByLibrary { "addedSuccessfullyTo": m5, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Dodawanie do ulubionych..."), - "advanced": - MessageLookupByLibrary.simpleMessage("Ustawienia zaawansowane"), + "advanced": MessageLookupByLibrary.simpleMessage("Zaawansowane"), "advancedSettings": - MessageLookupByLibrary.simpleMessage("Ustawienia zaawansowane"), + MessageLookupByLibrary.simpleMessage("Zaawansowane"), "after1Day": MessageLookupByLibrary.simpleMessage("Po 1 dniu"), "after1Hour": MessageLookupByLibrary.simpleMessage("Po 1 godzinie"), "after1Month": MessageLookupByLibrary.simpleMessage("Po 1 miesiącu"), @@ -315,7 +314,7 @@ class MessageLookup extends MessageLookupByLibrary { "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), - "apply": MessageLookupByLibrary.simpleMessage("Użyj"), + "apply": MessageLookupByLibrary.simpleMessage("Zastosuj"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Użyj kodu"), "appstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja AppStore"), @@ -346,37 +345,37 @@ class MessageLookup extends MessageLookupByLibrary { "atAFalloutShelter": MessageLookupByLibrary.simpleMessage("w schronie"), "authToChangeEmailVerificationSetting": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby zmienić weryfikację e-mail"), + "Prosimy uwierzytelnić się, aby zmienić weryfikację e-mail"), "authToChangeLockscreenSetting": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby zmienić ustawienia ekranu blokady"), + "Prosimy uwierzytelnić się, aby zmienić ustawienia ekranu blokady"), "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby zmienić swój adres e-mail"), + "Prosimy uwierzytelnić się, aby zmienić swój adres e-mail"), "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby zmienić hasło"), + "Prosimy uwierzytelnić się, aby zmienić hasło"), "authToConfigureTwofactorAuthentication": MessageLookupByLibrary.simpleMessage( "Uwierzytelnij się, aby skonfigurować uwierzytelnianie dwustopniowe"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby zainicjować usuwanie konta"), + "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić, aby wyświetlić swoje aktywne sesje"), + "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby wyświetlić ukryte pliki"), + "Prosimy uwierzytelnić się, aby wyświetlić ukryte pliki"), "authToViewYourMemories": MessageLookupByLibrary.simpleMessage( "Proszę uwierzytelnić się, aby wyświetlić swoje wspomnienia"), "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania"), + "Prosimy uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania"), "authenticating": MessageLookupByLibrary.simpleMessage("Uwierzytelnianie..."), "authenticationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie nie powiodło się, proszę spróbować ponownie"), + "Uwierzytelnianie nie powiodło się, prosimy spróbować ponownie"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie powiodło się!"), "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( "Tutaj zobaczysz dostępne urządzenia Cast."), "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( - "Upewnij się, że uprawnienia sieci lokalnej są włączone dla aplikacji Ente Zdjęcia w Ustawieniach."), + "Upewnij się, że uprawnienia sieci lokalnej są włączone dla aplikacji Zdjęcia Ente w Ustawieniach."), "autoLock": MessageLookupByLibrary.simpleMessage("Automatyczna blokada"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -449,9 +448,9 @@ class MessageLookup extends MessageLookupByLibrary { "claimed": MessageLookupByLibrary.simpleMessage("Odebrano"), "claimedStorageSoFar": m11, "cleanUncategorized": - MessageLookupByLibrary.simpleMessage("Wyczyść niekategoryzowane"), + MessageLookupByLibrary.simpleMessage("Wyczyść Nieskategoryzowane"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( - "Usuń wszystkie pliki z niekategoryzowanych, które są obecne w innych albumach"), + "Usuń wszystkie pliki z Nieskategoryzowanych, które są obecne w innych albumach"), "clearCaches": MessageLookupByLibrary.simpleMessage("Wyczyść pamięć podręczną"), "clearIndexes": MessageLookupByLibrary.simpleMessage("Wyczyść indeksy"), @@ -464,7 +463,7 @@ class MessageLookup extends MessageLookupByLibrary { "clubByFileName": MessageLookupByLibrary.simpleMessage("Club według nazwy pliku"), "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Postęp grupowania"), + MessageLookupByLibrary.simpleMessage("Postęp tworzenia klastrów"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Kod został zastosowany"), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( @@ -472,14 +471,14 @@ class MessageLookup extends MessageLookupByLibrary { "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Kod użyty przez Ciebie"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Utwórz link, aby umożliwić innym dodawanie i przeglądanie zdjęć w udostępnionym albumie bez konieczności korzystania z aplikacji lub konta ente. Świetne rozwiązanie do gromadzenia zdjęć ze wspólnych wydarzeń."), + "Utwórz link, aby umożliwić innym dodawanie i przeglądanie zdjęć w udostępnionym albumie bez konieczności korzystania z aplikacji lub konta Ente. Świetne rozwiązanie do gromadzenia zdjęć ze wspólnych wydarzeń."), "collaborativeLink": - MessageLookupByLibrary.simpleMessage("Link do kolaboracji"), + MessageLookupByLibrary.simpleMessage("Link do współpracy"), "collaborativeLinkCreatedFor": m12, - "collaborator": MessageLookupByLibrary.simpleMessage("Kolaborator"), + "collaborator": MessageLookupByLibrary.simpleMessage("Współuczestnik"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( - "Kolaboranci mogą dodawać zdjęcia i wideo do udostępnionego albumu."), + "Współuczestnicy mogą dodawać zdjęcia i wideo do udostępnionego albumu."), "collageLayout": MessageLookupByLibrary.simpleMessage("Układ"), "collageSaved": MessageLookupByLibrary.simpleMessage("Kolaż zapisano w galerii"), @@ -541,8 +540,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Stwórz nowe konto"), "createOrSelectAlbum": MessageLookupByLibrary.simpleMessage("Utwórz lub wybierz album"), - "createPublicLink": MessageLookupByLibrary.simpleMessage( - "Utwórz link dostępny publicznie"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("Utwórz publiczny link"), "creatingLink": MessageLookupByLibrary.simpleMessage("Tworzenie linku..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( @@ -571,7 +570,7 @@ class MessageLookup extends MessageLookupByLibrary { "Usunąć również zdjęcia (i wideo) znajdujące się w tym albumie ze wszystkich innych albumów, których są częścią?"), "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( "Spowoduje to usunięcie wszystkich pustych albumów. Jest to przydatne, gdy chcesz zmniejszyć ilość śmieci na liście albumów."), - "deleteAll": MessageLookupByLibrary.simpleMessage("Usuń wszystkie"), + "deleteAll": MessageLookupByLibrary.simpleMessage("Usuń Wszystko"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "To konto jest połączone z innymi aplikacjami Ente, jeśli ich używasz. Twoje przesłane dane, we wszystkich aplikacjach Ente, zostaną zaplanowane do usunięcia, a Twoje konto zostanie trwale usunięte."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( @@ -594,9 +593,9 @@ class MessageLookup extends MessageLookupByLibrary { "deleteReason2": MessageLookupByLibrary.simpleMessage( "Aplikacja lub określona funkcja nie zachowuje się tak, jak sądzę, że powinna"), "deleteReason3": MessageLookupByLibrary.simpleMessage( - "Znalazłem inną, lepszą usługę"), + "Znalazłem/am inną, lepszą usługę"), "deleteReason4": MessageLookupByLibrary.simpleMessage( - "Inna, niewymieniona wyżej przyczyna"), + "Moja przyczyna nie jest wymieniona"), "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( "Twoje żądanie zostanie przetworzone w ciągu 72 godzin."), "deleteSharedAlbum": @@ -606,10 +605,10 @@ class MessageLookup extends MessageLookupByLibrary { "descriptions": MessageLookupByLibrary.simpleMessage("Opisy"), "deselectAll": MessageLookupByLibrary.simpleMessage("Odznacz wszystko"), "designedToOutlive": MessageLookupByLibrary.simpleMessage( - "Zaprojektowane do przetrwania na zawsze"), + "Zaprojektowane do przetrwania"), "details": MessageLookupByLibrary.simpleMessage("Szczegóły"), "developerSettings": - MessageLookupByLibrary.simpleMessage("Ustawienia deweloperskie"), + MessageLookupByLibrary.simpleMessage("Ustawienia dla programistów"), "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( "Czy na pewno chcesz zmodyfikować ustawienia programisty?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Wprowadź kod"), @@ -676,6 +675,8 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Włącz mapy"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "To pokaże Twoje zdjęcia na mapie świata.\n\nTa mapa jest hostowana przez Open Street Map, a dokładne lokalizacje Twoich zdjęć nigdy nie są udostępniane.\n\nMożesz wyłączyć tę funkcję w każdej chwili w ustawieniach."), + "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( + "Włącz przesyłanie wieloczęściowe"), "encryptingBackup": MessageLookupByLibrary.simpleMessage( "Szyfrowanie kopii zapasowej..."), "encryption": MessageLookupByLibrary.simpleMessage("Szyfrowanie"), @@ -691,7 +692,7 @@ class MessageLookup extends MessageLookupByLibrary { "entePhotosPerm": MessageLookupByLibrary.simpleMessage( "Ente potrzebuje uprawnień aby przechowywać twoje zdjęcia"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "Ente zachowuje twoje wspomnienia, więc są zawsze dostępne dla Ciebie, nawet jeśli zgubisz urządzenie."), + "Ente zachowuje Twoje wspomnienia, więc są zawsze dostępne dla Ciebie, nawet jeśli zgubisz urządzenie."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Twoja rodzina może być również dodana do Twojego planu."), "enterAlbumName": @@ -715,9 +716,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wprowadź kod polecenia"), "enterThe6digitCodeFromnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( - "Wprowadź 6-cyfrowy kod z\ntwojej aplikacji uwierzytelniającej"), + "Wprowadź 6-cyfrowy kod z\nTwojej aplikacji uwierzytelniającej"), "enterValidEmail": MessageLookupByLibrary.simpleMessage( - "Podaj poprawny adres e-mail."), + "Prosimy podać prawidłowy adres e-mail."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("Podaj swój adres e-mail"), "enterYourPassword": @@ -763,7 +764,7 @@ class MessageLookup extends MessageLookupByLibrary { "faqs": MessageLookupByLibrary.simpleMessage( "FAQ – Często zadawane pytania"), "favorite": MessageLookupByLibrary.simpleMessage("Dodaj do ulubionych"), - "feedback": MessageLookupByLibrary.simpleMessage("Informacja zwrotna"), + "feedback": MessageLookupByLibrary.simpleMessage("Opinia"), "fileFailedToSaveToGallery": MessageLookupByLibrary.simpleMessage( "Nie udało się zapisać pliku do galerii"), "fileInfoAddDescHint": @@ -785,7 +786,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("dla twoich wspomnień"), "forgotPassword": MessageLookupByLibrary.simpleMessage("Nie pamiętam hasła"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Znalezione twarze"), + "foundFaces": MessageLookupByLibrary.simpleMessage("Znaleziono twarze"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Bezpłatna pamięć, którą odebrano"), "freeStorageOnReferralSuccess": m26, @@ -809,7 +810,7 @@ class MessageLookup extends MessageLookupByLibrary { "Generowanie kluczy szyfrujących..."), "genericProgress": m31, "goToSettings": - MessageLookupByLibrary.simpleMessage("Przejdź do Ustawień"), + MessageLookupByLibrary.simpleMessage("Przejdź do ustawień"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Identyfikator Google Play"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -860,7 +861,7 @@ class MessageLookup extends MessageLookupByLibrary { "incorrectRecoveryKeyTitle": MessageLookupByLibrary.simpleMessage( "Nieprawidłowy klucz odzyskiwania"), "indexedItems": - MessageLookupByLibrary.simpleMessage("Indeksowane elementy"), + MessageLookupByLibrary.simpleMessage("Zindeksowane elementy"), "indexingIsPaused": MessageLookupByLibrary.simpleMessage( "Wstrzymano indeksowanie. Zostanie ono automatycznie wznowione, gdy urządzenie będzie gotowe."), "insecureDevice": @@ -894,7 +895,7 @@ class MessageLookup extends MessageLookupByLibrary { "Wybrane elementy zostaną usunięte z tego albumu"), "joinDiscord": MessageLookupByLibrary.simpleMessage("Dołącz do serwera Discord"), - "keepPhotos": MessageLookupByLibrary.simpleMessage("Zachowaj zdjęcia"), + "keepPhotos": MessageLookupByLibrary.simpleMessage("Zachowaj Zdjęcia"), "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage("Pomóż nam z tą informacją"), @@ -928,7 +929,7 @@ class MessageLookup extends MessageLookupByLibrary { "loadMessage3": MessageLookupByLibrary.simpleMessage( "Przechowujemy 3 kopie Twoich danych, jedną w podziemnym schronie"), "loadMessage4": MessageLookupByLibrary.simpleMessage( - "Wszystkie nasze aplikacje mają otwarte źródło"), + "Wszystkie nasze aplikacje są otwarto źródłowe"), "loadMessage5": MessageLookupByLibrary.simpleMessage( "Nasz kod źródłowy i kryptografia zostały poddane zewnętrznemu audytowi"), "loadMessage6": MessageLookupByLibrary.simpleMessage( @@ -999,8 +1000,8 @@ class MessageLookup extends MessageLookupByLibrary { "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Pamiętaj, że uczenie maszynowe spowoduje większe zużycie przepustowości i baterii, dopóki wszystkie elementy zostaną zindeksowane."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage( - "Aplikacja Mobilna, Strona Internetowa, Komputer"), - "moderateStrength": MessageLookupByLibrary.simpleMessage("Umiarkowana"), + "Aplikacja Mobilna, Strona Internetowa, Aplikacja Komputerowa"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("Umiarkowane"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Zmodyfikuj zapytanie lub spróbuj wyszukać"), @@ -1023,14 +1024,14 @@ class MessageLookup extends MessageLookupByLibrary { "Nie można połączyć się z Ente, sprawdź ustawienia sieci i skontaktuj się z pomocą techniczną, jeśli błąd będzie się powtarzał."), "never": MessageLookupByLibrary.simpleMessage("Nigdy"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nowy album"), - "newToEnte": MessageLookupByLibrary.simpleMessage("Nowy do Ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Nowy/a do Ente"), "newest": MessageLookupByLibrary.simpleMessage("Najnowsze"), "next": MessageLookupByLibrary.simpleMessage("Dalej"), "no": MessageLookupByLibrary.simpleMessage("Nie"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Brak jeszcze albumów udostępnianych przez Ciebie"), - "noDeviceFound": - MessageLookupByLibrary.simpleMessage("Nie wykryto urządzenia"), + "noDeviceFound": MessageLookupByLibrary.simpleMessage( + "Nie znaleziono żadnego urządzenia"), "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Brak"), "noDeviceThatCanBeDeleted": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych plików na tym urządzeniu, które można usunąć"), @@ -1084,8 +1085,7 @@ class MessageLookup extends MessageLookupByLibrary { "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("Lub wybierz istniejący"), "pair": MessageLookupByLibrary.simpleMessage("Sparuj"), - "pairWithPin": - MessageLookupByLibrary.simpleMessage("Sparuj z kodem PIN"), + "pairWithPin": MessageLookupByLibrary.simpleMessage("Sparuj kodem PIN"), "pairingComplete": MessageLookupByLibrary.simpleMessage("Parowanie zakończone"), "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), @@ -1136,8 +1136,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wybierz punkt środkowy"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Przypnij album"), "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), - "playOnTv": - MessageLookupByLibrary.simpleMessage("Odtwarzaj album w telewizji"), + "playOnTv": MessageLookupByLibrary.simpleMessage( + "Odtwórz album na telewizorze"), "playStoreFreeTrialValidTill": m40, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), @@ -1151,8 +1151,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), "pleaseEmailUsAt": m41, - "pleaseGrantPermissions": - MessageLookupByLibrary.simpleMessage("Proszę przyznać uprawnienia"), + "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( + "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( @@ -1163,12 +1163,12 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( "Prosimy zweryfikować wprowadzony kod"), - "pleaseWait": MessageLookupByLibrary.simpleMessage("Proszę czekać..."), + "pleaseWait": MessageLookupByLibrary.simpleMessage("Prosimy czekać..."), "pleaseWaitDeletingAlbum": MessageLookupByLibrary.simpleMessage( "Prosimy czekać, usuwanie albumu"), "pleaseWaitForSometimeBeforeRetrying": MessageLookupByLibrary.simpleMessage( - "Proszę poczekać chwilę przed ponowną próbą"), + "Prosimy poczekać chwilę przed ponowną próbą"), "preparingLogs": MessageLookupByLibrary.simpleMessage("Przygotowywanie logów..."), "preserveMore": MessageLookupByLibrary.simpleMessage("Zachowaj więcej"), @@ -1178,7 +1178,7 @@ class MessageLookup extends MessageLookupByLibrary { "Naciśnij i przytrzymaj obraz, aby odtworzyć wideo"), "privacy": MessageLookupByLibrary.simpleMessage("Prywatność"), "privacyPolicyTitle": - MessageLookupByLibrary.simpleMessage("Polityka prywatności"), + MessageLookupByLibrary.simpleMessage("Polityka Prywatności"), "privateBackups": MessageLookupByLibrary.simpleMessage("Prywatne kopie zapasowe"), "privateSharing": @@ -1233,7 +1233,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( - "Również puste \"Ostatnio usunięte\" z \"Ustawienia\" -> \"Pamięć\", aby odebrać wolną przestrzeń"), + "Również opróżnij \"Ostatnio usunięte\" z \"Ustawienia\" -> \"Pamięć\", aby odebrać wolną przestrzeń"), "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( "Opróżnij również swój \"Kosz\", aby zwolnić miejsce"), "remoteImages": MessageLookupByLibrary.simpleMessage("Zdjęcia zdalne"), @@ -1354,7 +1354,7 @@ class MessageLookup extends MessageLookupByLibrary { "Wybierz foldery do stworzenia kopii zapasowej"), "selectItemsToAdd": MessageLookupByLibrary.simpleMessage("Wybierz elementy do dodania"), - "selectLanguage": MessageLookupByLibrary.simpleMessage("Wybierz język"), + "selectLanguage": MessageLookupByLibrary.simpleMessage("Wybierz Język"), "selectMorePhotos": MessageLookupByLibrary.simpleMessage("Wybierz więcej zdjęć"), "selectReason": MessageLookupByLibrary.simpleMessage("Wybierz powód"), @@ -1584,7 +1584,7 @@ class MessageLookup extends MessageLookupByLibrary { "Włącz kopię zapasową, aby automatycznie przesyłać pliki dodane do folderu urządzenia do Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( - "2 miesiące za darmo w planach rocznych"), + "2 miesiące za darmo na planach rocznych"), "twofactor": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie dwustopniowe"), "twofactorAuthenticationHasBeenDisabled": @@ -1603,7 +1603,7 @@ class MessageLookup extends MessageLookupByLibrary { "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Przywróć album z archiwum"), "unarchiving": - MessageLookupByLibrary.simpleMessage("Odarchiwizowanie..."), + MessageLookupByLibrary.simpleMessage("Usuwanie z archiwum..."), "uncategorized": MessageLookupByLibrary.simpleMessage("Bez kategorii"), "unhide": MessageLookupByLibrary.simpleMessage("Odkryj"), "unhideToAlbum": @@ -1633,7 +1633,7 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Użyj kodu odzyskiwania"), "useSelectedPhoto": - MessageLookupByLibrary.simpleMessage("Użyj zaznaczonego zdjęcia"), + MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), "validTill": m66, "verificationFailedPleaseTryAgain": @@ -1669,13 +1669,13 @@ class MessageLookup extends MessageLookupByLibrary { "viewLogs": MessageLookupByLibrary.simpleMessage("Wyświetl logi"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Zobacz klucz odzyskiwania"), - "viewer": MessageLookupByLibrary.simpleMessage("Obserwator"), + "viewer": MessageLookupByLibrary.simpleMessage("Widz"), "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Odwiedź stronę web.ente.io, aby zarządzać subskrypcją"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( "Oczekiwanie na weryfikację..."), "waitingForWifi": - MessageLookupByLibrary.simpleMessage("Czekam na WiFi..."), + MessageLookupByLibrary.simpleMessage("Czekanie na WiFi..."), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("Posiadamy otwarte źródło!"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": @@ -1689,8 +1689,8 @@ class MessageLookup extends MessageLookupByLibrary { "yearsAgo": m69, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), - "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( - "Tak, konwertuj do oglądającego"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("Tak, konwertuj na widza"), "yesDelete": MessageLookupByLibrary.simpleMessage("Tak, usuń"), "yesDiscardChanges": MessageLookupByLibrary.simpleMessage("Tak, odrzuć zmiany"), @@ -1725,8 +1725,8 @@ class MessageLookup extends MessageLookupByLibrary { "Twój plan został pomyślnie obniżony"), "yourPlanWasSuccessfullyUpgraded": MessageLookupByLibrary.simpleMessage( "Twój plan został pomyślnie ulepszony"), - "yourPurchaseWasSuccessful": - MessageLookupByLibrary.simpleMessage("Twój zakup był udany"), + "yourPurchaseWasSuccessful": MessageLookupByLibrary.simpleMessage( + "Twój zakup zakończył się pomyślnie"), "yourStorageDetailsCouldNotBeFetched": MessageLookupByLibrary.simpleMessage( "Nie można pobrać szczegółów pamięci"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 773b78fbf0..c12e70ab9f 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -676,6 +676,8 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), + "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( + "Ativar envio de várias partes"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Criptografando backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Criptografia"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 11ad164002..753968de1d 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -281,7 +281,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("AppStore 订阅"), "archive": MessageLookupByLibrary.simpleMessage("存档"), "archiveAlbum": MessageLookupByLibrary.simpleMessage("存档相册"), - "archiving": MessageLookupByLibrary.simpleMessage("正在归档中..."), + "archiving": MessageLookupByLibrary.simpleMessage("正在存档..."), "areYouSureThatYouWantToLeaveTheFamily": MessageLookupByLibrary.simpleMessage("您确定要离开家庭计划吗?"), "areYouSureYouWantToCancel": @@ -562,6 +562,7 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("启用地图"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "这将在世界地图上显示您的照片。\n\n该地图由 Open Street Map 托管,并且您的照片的确切位置永远不会共享。\n\n您可以随时从“设置”中禁用此功能。"), + "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage("启用分片上传"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("正在加密备份..."), "encryption": MessageLookupByLibrary.simpleMessage("加密"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("加密密钥"), @@ -669,9 +670,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("请在手机“设置”中授权软件访问所有照片"), "grantPermission": MessageLookupByLibrary.simpleMessage("授予权限"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("将附近的照片分组"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "guestView": MessageLookupByLibrary.simpleMessage("访客视图"), + "guestViewEnablePreSteps": + MessageLookupByLibrary.simpleMessage("要启用访客视图,请在系统设置中设置设备密码或屏幕锁。"), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!"), "hearUsWhereTitle": @@ -1208,10 +1209,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("您的订阅似乎已过期。请订阅以启用分享。"), "subscription": MessageLookupByLibrary.simpleMessage("订阅"), "success": MessageLookupByLibrary.simpleMessage("成功"), - "successfullyArchived": MessageLookupByLibrary.simpleMessage("归档成功"), + "successfullyArchived": MessageLookupByLibrary.simpleMessage("存档成功"), "successfullyHid": MessageLookupByLibrary.simpleMessage("已成功隐藏"), "successfullyUnarchived": - MessageLookupByLibrary.simpleMessage("取消归档成功"), + MessageLookupByLibrary.simpleMessage("取消存档成功"), "successfullyUnhid": MessageLookupByLibrary.simpleMessage("已成功取消隐藏"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("建议新功能"), "support": MessageLookupByLibrary.simpleMessage("支持"), @@ -1291,7 +1292,7 @@ class MessageLookup extends MessageLookupByLibrary { "twofactorSetup": MessageLookupByLibrary.simpleMessage("双重认证设置"), "unarchive": MessageLookupByLibrary.simpleMessage("取消存档"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("取消存档相册"), - "unarchiving": MessageLookupByLibrary.simpleMessage("正在取消归档..."), + "unarchiving": MessageLookupByLibrary.simpleMessage("正在取消存档..."), "uncategorized": MessageLookupByLibrary.simpleMessage("未分类的"), "unhide": MessageLookupByLibrary.simpleMessage("取消隐藏"), "unhideToAlbum": MessageLookupByLibrary.simpleMessage("取消隐藏到相册"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index c53e18ac82..e474623678 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2866,6 +2866,56 @@ class S { ); } + /// `Enable machine learning` + String get mlConsent { + return Intl.message( + 'Enable machine learning', + name: 'mlConsent', + desc: '', + args: [], + ); + } + + /// `Enable machine learning?` + String get mlConsentTitle { + return Intl.message( + 'Enable machine learning?', + name: 'mlConsentTitle', + desc: '', + args: [], + ); + } + + /// `If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.` + String get mlConsentDescription { + return Intl.message( + 'If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.', + name: 'mlConsentDescription', + desc: '', + args: [], + ); + } + + /// `Please click here for more details about this feature in our privacy policy` + String get mlConsentPrivacy { + return Intl.message( + 'Please click here for more details about this feature in our privacy policy', + name: 'mlConsentPrivacy', + desc: '', + args: [], + ); + } + + /// `I understand, and wish to enable machine learning` + String get mlConsentConfirmation { + return Intl.message( + 'I understand, and wish to enable machine learning', + name: 'mlConsentConfirmation', + desc: '', + args: [], + ); + } + /// `Magic search` String get magicSearch { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 129f9d109c..01f259efe1 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -409,6 +409,11 @@ "photoGridSize": "Photo grid size", "manageDeviceStorage": "Manage device storage", "machineLearning": "Machine learning", + "mlConsent": "Enable machine learning", + "mlConsentTitle": "Enable machine learning?", + "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.", + "mlConsentPrivacy": "Please click here for more details about this feature in our privacy policy", + "mlConsentConfirmation": "I understand, and wish to enable machine learning", "magicSearch": "Magic search", "mlIndexingDescription": "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.", "loadingModel": "Downloading models...", diff --git a/mobile/lib/services/user_remote_flag_service.dart b/mobile/lib/services/user_remote_flag_service.dart index 846f061b43..98c326e4d7 100644 --- a/mobile/lib/services/user_remote_flag_service.dart +++ b/mobile/lib/services/user_remote_flag_service.dart @@ -22,6 +22,7 @@ class UserRemoteFlagService { static const String recoveryVerificationFlag = "recoveryKeyVerified"; static const String mapEnabled = "mapEnabled"; + static const String mlEnabled = "faceSearchEnabled"; static const String needRecoveryKeyVerification = "needRecoveryKeyVerification"; @@ -48,6 +49,8 @@ class UserRemoteFlagService { bool defaultValue = false; if (key == mapEnabled) { defaultValue = flagService.mapEnabled; + } else if (key == mlEnabled) { + defaultValue = flagService.hasGrantedMLConsent; } return _prefs.getBool(key) ?? defaultValue; } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index f4ea8a76d2..187691e307 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -20,6 +20,7 @@ import "package:photos/ui/components/menu_section_title.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; +import "package:photos/ui/settings/ml/enable_ml_consent.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/wakelock_util.dart"; @@ -127,10 +128,22 @@ class _MachineLearningSettingsPageState trailingWidget: ToggleSwitchWidget( value: () => localSettings.isFaceIndexingEnabled, onChanged: () async { + if (!localSettings.isFaceIndexingEnabled) { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return const EnableMachineLearningConsent(); + }, + ), + ); + if (result == null || result == false) { + return; + } + } final isEnabled = await localSettings.toggleFaceIndexing(); if (isEnabled) { await MLService.instance.init(firstTime: true); - await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); } else {} diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart new file mode 100644 index 0000000000..c3c0da5d79 --- /dev/null +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -0,0 +1,156 @@ +import "package:flutter/material.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/services/user_remote_flag_service.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/common/web_page.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; +import "package:photos/ui/components/title_bar_widget.dart"; +import "package:photos/utils/dialog_util.dart"; + +class EnableMachineLearningConsent extends StatefulWidget { + const EnableMachineLearningConsent({super.key}); + + @override + State createState() => + _EnableMachineLearningConsentState(); +} + +class _EnableMachineLearningConsentState + extends State { + final ValueNotifier _hasAckedPrivacyPolicy = ValueNotifier(false); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + _hasAckedPrivacyPolicy.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: S.of(context).mlConsentTitle, + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) => Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: Column( + children: [ + Text( + S.of(context).mlConsentDescription, + textAlign: TextAlign.left, + style: getEnteTextTheme(context).body.copyWith( + color: getEnteColorScheme(context).textMuted, + ), + ), + const SizedBox(height: 12), + GestureDetector( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return WebPage( + S.of(context).privacyPolicyTitle, + "https://ente.io/privacy", + ); + }, + ), + ); + }, + child: Text( + S.of(context).mlConsentPrivacy, + textAlign: TextAlign.left, + style: getEnteTextTheme(context).body.copyWith( + color: getEnteColorScheme(context).textMuted, + decoration: TextDecoration.underline, + ), + ), + ), + const SizedBox(height: 36), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Checkbox( + value: _hasAckedPrivacyPolicy.value, + side: CheckboxTheme.of(context).side, + onChanged: (value) { + setState(() { + _hasAckedPrivacyPolicy.value = value!; + }); + }, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 1), + child: Text( + S.of(context).mlConsentConfirmation, + style: getEnteTextTheme(context).bodyMuted, + textAlign: TextAlign.left, + ), + ), + ), + ], + ), + const SizedBox(height: 48), + ButtonWidget( + buttonType: ButtonType.primary, + labelText: S.of(context).mlConsent, + isDisabled: _hasAckedPrivacyPolicy.value == false, + onTap: () async { + await enableMlConsent(context); + }, + shouldSurfaceExecutionStates: true, + ), + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.secondary, + labelText: S.of(context).cancel, + onTap: () async { + Navigator.of(context).pop(); + }, + ), + const SafeArea( + child: SizedBox( + height: 12, + ), + ), + ], + ), + ), + childCount: 1, + ), + ), + ], + ), + ); + } + + Future enableMlConsent(BuildContext context) async { + try { + await UserRemoteFlagService.instance.setBoolValue( + UserRemoteFlagService.mlEnabled, + true, + ); + Navigator.of(context).pop(true); + } catch (e) { + // ignore: unawaited_futures + showGenericErrorDialog( + context: context, + error: e, + ); + } + } +} diff --git a/mobile/plugins/ente_feature_flag/lib/src/service.dart b/mobile/plugins/ente_feature_flag/lib/src/service.dart index 32dd5d3b95..bdbe5a6f02 100644 --- a/mobile/plugins/ente_feature_flag/lib/src/service.dart +++ b/mobile/plugins/ente_feature_flag/lib/src/service.dart @@ -71,5 +71,7 @@ class FlagService { bool get recoveryKeyVerified => flags.recoveryKeyVerified; + bool get hasGrantedMLConsent => flags.faceSearchEnabled; + bool get enableMobMultiPart => flags.enableMobMultiPart || internalUser; } diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 88c6d74b5a..73db1a24fa 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1289,18 +1289,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -1433,10 +1433,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" media_extension: dependency: "direct main" description: @@ -1521,10 +1521,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mgrs_dart: dependency: transitive description: @@ -1893,10 +1893,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: @@ -2402,26 +2402,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.0" timezone: dependency: transitive description: @@ -2700,10 +2700,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.1" volume_controller: dependency: transitive description: From 029b43b13d727d06cdae92bcfef2bd21a4ad86c4 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 20 Aug 2024 05:29:06 +0000 Subject: [PATCH 0428/1179] New Crowdin translations by GitHub Action --- web/packages/base/locales/es-ES/translation.json | 6 +++--- web/packages/base/locales/fr-FR/translation.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index d264755363..6fee153eb7 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -53,7 +53,7 @@ "ADD_PHOTOS": "Añadir fotos", "ADD_MORE_PHOTOS": "Añadir más fotos", "add_photos_count_one": "Añadir 1 foto", - "add_photos_count": "Añadir {{count}} fotos", + "add_photos_count": "Añadir {{count, number}} fotos", "select_photos": "Seleccionar fotos", "FILE_UPLOAD": "Subir archivo", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "No hay recuerdos", "photos_count_one": "1 recuerdo", - "photos_count": "{{count}} recuerdos", + "photos_count": "{{count, number}} recuerdos", "TERMS_AND_CONDITIONS": "Acepto los términos y política de privacidad", "ADD_TO_COLLECTION": "Añadir al álbum", "SELECTED": "seleccionado", @@ -427,7 +427,7 @@ "YES_STOP_DOWNLOADS": "Sí, detener las descargas", "STOP_ALL_DOWNLOADS_MESSAGE": "¿Estás seguro de que quieres detener todas las descargas en curso?", "albums_count_one": "1 álbum", - "albums_count": "{{count}} álbumes", + "albums_count": "{{count, number}} álbumes", "ALL_ALBUMS": "Todos los álbumes", "ALBUMS": "Álbumes", "ALL_HIDDEN_ALBUMS": "Todos los álbumes ocultos", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index a70ea0a2fb..bb46d32835 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -53,7 +53,7 @@ "ADD_PHOTOS": "Ajouter des photos", "ADD_MORE_PHOTOS": "Ajouter plus de photos", "add_photos_count_one": "Ajouter une photo", - "add_photos_count": "Ajouter {{count}} photos", + "add_photos_count": "Ajouter {{count, number}} photos", "select_photos": "Sélectionner des photos", "FILE_UPLOAD": "Fichier chargé", "UPLOAD_STAGE_MESSAGE": { @@ -225,7 +225,7 @@ }, "photos_count_zero": "Pas de souvenirs", "photos_count_one": "1 souvenir", - "photos_count": "{{count}} souvenirs", + "photos_count": "{{count, number}} souvenirs", "TERMS_AND_CONDITIONS": "J'accepte les conditions et la politique de confidentialité", "ADD_TO_COLLECTION": "Ajouter à l'album", "SELECTED": "Sélectionné", @@ -427,7 +427,7 @@ "YES_STOP_DOWNLOADS": "Oui, arrêter les téléchargements", "STOP_ALL_DOWNLOADS_MESSAGE": "Êtes-vous certains de vouloir arrêter tous les chargements en cours?", "albums_count_one": "1 album", - "albums_count": "{{count}} albums", + "albums_count": "{{count, number}} albums", "ALL_ALBUMS": "Tous les albums", "ALBUMS": "Albums", "ALL_HIDDEN_ALBUMS": "Tous les albums masqués", From f84ebce2b1f56fd43f85bd6c69101b04e83afc11 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:02:27 +0530 Subject: [PATCH 0429/1179] [mob] Ask for ml consent while enabling ML --- mobile/lib/generated/intl/messages_cs.dart | 1 - mobile/lib/generated/intl/messages_de.dart | 1 - mobile/lib/generated/intl/messages_en.dart | 6 +++- mobile/lib/generated/intl/messages_es.dart | 1 - mobile/lib/generated/intl/messages_fr.dart | 1 - mobile/lib/generated/intl/messages_it.dart | 1 - mobile/lib/generated/intl/messages_ko.dart | 1 - mobile/lib/generated/intl/messages_nl.dart | 1 - mobile/lib/generated/intl/messages_no.dart | 1 - mobile/lib/generated/intl/messages_pt.dart | 1 - mobile/lib/generated/intl/messages_ru.dart | 1 - mobile/lib/generated/intl/messages_zh.dart | 1 - mobile/lib/generated/l10n.dart | 28 ++++++++++++++++--- mobile/lib/l10n/intl_en.arb | 5 +++- .../machine_learning_settings_page.dart | 5 +++- 15 files changed, 37 insertions(+), 18 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 3da9d90da0..b49e60133c 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -76,7 +76,6 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index a4cb6f2117..203738b726 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -1004,7 +1004,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Bitte beachte, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 0de39a7383..bfadffe8aa 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -656,6 +656,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Email your logs"), "empty": MessageLookupByLibrary.simpleMessage("Empty"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Empty trash?"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente supports on-device machine learning for face recognition, magic search and other advanced search features"), "enableMaps": MessageLookupByLibrary.simpleMessage("Enable Maps"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "This will show your photos on a world map.\n\nThis map is hosted by Open Street Map, and the exact locations of your photos are never shared.\n\nYou can disable this feature anytime from Settings."), @@ -973,7 +975,8 @@ class MessageLookup extends MessageLookupByLibrary { "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": MessageLookupByLibrary.simpleMessage("Enable machine learning?"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), + "mlIndexing": + MessageLookupByLibrary.simpleMessage("Enable ML indexing"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), "mobileWebDesktop": @@ -984,6 +987,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modify your query, or try searching for"), "moments": MessageLookupByLibrary.simpleMessage("Moments"), "monthly": MessageLookupByLibrary.simpleMessage("Monthly"), + "moreDetails": MessageLookupByLibrary.simpleMessage("More details"), "moveItem": m35, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Move to album"), "moveToHiddenAlbum": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 6a40a148b8..857b10f70a 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -1008,7 +1008,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Mercancías"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Por favor, ten en cuenta que el aprendizaje automático resultará en un mayor ancho de banda y uso de batería hasta que todos los elementos sean indexados."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index ea4a9b0487..cc0feb9555 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -935,7 +935,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Marchandise"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Ordinateur"), "moderateStrength": diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index c5ca090817..1681da9726 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -904,7 +904,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Mediocre"), diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 855bac73b8..5a372c298b 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -76,7 +76,6 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index ac36a93ab7..b68312d437 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -1002,7 +1002,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Houd er rekening mee dat dit zal resulteren in een hoger internet- en batterijverbruik totdat alle items zijn geïndexeerd."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 3d8529ce4a..886121b119 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -98,7 +98,6 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Long press an email to verify end to end encryption."), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modify your query, or try searching for"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index c12e70ab9f..e8c025de56 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -995,7 +995,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Produtos"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 7911850416..506d3726f5 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -991,7 +991,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Товары"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Пожалуйста, обратите внимание, что машинное обучение приведет к увеличению затрат интернета и энергопотребления до тех пор, пока не будут индексированы все элементы."), "mobileWebDesktop": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 753968de1d..95b5fbabc6 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -818,7 +818,6 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("商品"), - "mlFunctions": MessageLookupByLibrary.simpleMessage("ML functions"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。"), "mobileWebDesktop": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index e474623678..a0528dc053 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9025,11 +9025,31 @@ class S { ); } - /// `ML functions` - String get mlFunctions { + /// `Enable ML indexing` + String get mlIndexing { return Intl.message( - 'ML functions', - name: 'mlFunctions', + 'Enable ML indexing', + name: 'mlIndexing', + desc: '', + args: [], + ); + } + + /// `More details` + String get moreDetails { + return Intl.message( + 'More details', + name: 'moreDetails', + desc: '', + args: [], + ); + } + + /// `Ente supports on-device machine learning for face recognition, magic search and other advanced search features` + String get enableMLIndexingDesc { + return Intl.message( + 'Ente supports on-device machine learning for face recognition, magic search and other advanced search features', + name: 'enableMLIndexingDesc', desc: '', args: [], ); diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 01f259efe1..d4c349565e 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1269,7 +1269,10 @@ } } }, - "mlFunctions": "ML functions", + "mlIndexing": "Enable ML indexing", + "moreDetails" : "More details", + "enableMLIndexingDesc": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", + "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identify documents'", "panorama": "Panorama", "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 187691e307..293899bb67 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -10,6 +10,7 @@ import "package:photos/services/machine_learning/semantic_search/clip/clip_image import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import "package:photos/services/remote_assets_service.dart"; +import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; @@ -128,7 +129,9 @@ class _MachineLearningSettingsPageState trailingWidget: ToggleSwitchWidget( value: () => localSettings.isFaceIndexingEnabled, onChanged: () async { - if (!localSettings.isFaceIndexingEnabled) { + if (!localSettings.isFaceIndexingEnabled && + !UserRemoteFlagService.instance + .getCachedBoolValue(UserRemoteFlagService.mlEnabled)) { final result = await Navigator.push( context, MaterialPageRoute( From 00eb440c01eaeaaa989a1d97b07bae6331a4ec74 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 11:26:10 +0530 Subject: [PATCH 0430/1179] [doc] Large upload troubleshooting --- docs/docs/.vitepress/sidebar.ts | 4 +++ .../photos/troubleshooting/large-uploads.md | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 docs/docs/photos/troubleshooting/large-uploads.md diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 06286ff034..7a475250a2 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -143,6 +143,10 @@ export const sidebar = [ text: "Missing thumbnails", link: "/photos/troubleshooting/thumbnails", }, + { + text: "Large uploads", + link: "/photos/troubleshooting/large-uploads", + }, { text: "Network drives", link: "/photos/troubleshooting/nas", diff --git a/docs/docs/photos/troubleshooting/large-uploads.md b/docs/docs/photos/troubleshooting/large-uploads.md new file mode 100644 index 0000000000..656e9595e2 --- /dev/null +++ b/docs/docs/photos/troubleshooting/large-uploads.md @@ -0,0 +1,28 @@ +--- +title: Large uploads +description: Ente Photos and large (multi TB) uploads +--- + +# Large uploads + +Some customers have reported an issue where their desktop app seems to get stuck +when they are trying to do the initial upload of multi-TB libraries. + +A telltale sign of this is that app would seem to freeze during the upload, and +then restart again from the same state. If you were to look in the logs, you +would notice messages around the "renderer process crashing". + +When this happens, you'll notice in the logs that it crashes when trying to +upload some specific large video, or a set of specific large videos. + +As a workaround, you can **put these videos in a separate folder, complete the +rest of your upload, and then later upload this folder**. + +Another alternative is to drag and drop the folder you are trying to upload into +the app instead of adding a folder watch or uploading a zip. This works better +because during a drag and drop, the app has direct access to the files via +browser APIs instead of going via the file system. + +Note that the app will detect and skip over already uploaded items into an +album, so dragging and dropping the same folder again to upload to the same +album is fine. From 359af7e2ebf38b253c0ab3b5fad5476ed4715a10 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:43:35 +0530 Subject: [PATCH 0431/1179] [mob] Hide clusterID --- mobile/lib/services/search_service.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index 86f4b7c52b..ae00e18299 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -846,7 +846,7 @@ class SearchService { // final String clusterName = "ID:$clusterId, ${files.length}"; // final String clusterName = "${files.length}"; // const String clusterName = ""; - final String clusterName = "$clusterId"; + final String clusterName = clusterId; if (clusterIDToPersonID[clusterId] != null) { // This should not happen, means a faceID is assigned to multiple persons. @@ -861,7 +861,7 @@ class SearchService { facesResult.add( GenericSearchResult( ResultType.faces, - clusterName, + "", files, params: { kClusterParamId: clusterId, From 8b62c18171de9dff2e4f080112120aed5d84eefa Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:48:01 +0530 Subject: [PATCH 0432/1179] [mob] UX change --- mobile/lib/generated/intl/messages_en.dart | 5 +- mobile/lib/generated/l10n.dart | 14 +++- mobile/lib/l10n/intl_en.arb | 2 +- .../machine_learning_settings_page.dart | 75 ++++++++++++++++--- 4 files changed, 79 insertions(+), 17 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index bfadffe8aa..b92a9f13e7 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -949,6 +949,8 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Machine learning"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magic search"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identify documents\'"), "manage": MessageLookupByLibrary.simpleMessage("Manage"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage("Manage device storage"), @@ -975,8 +977,7 @@ class MessageLookup extends MessageLookupByLibrary { "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": MessageLookupByLibrary.simpleMessage("Enable machine learning?"), - "mlIndexing": - MessageLookupByLibrary.simpleMessage("Enable ML indexing"), + "mlIndexing": MessageLookupByLibrary.simpleMessage("Enable Indexing"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), "mobileWebDesktop": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index a0528dc053..5f831a325e 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9025,10 +9025,10 @@ class S { ); } - /// `Enable ML indexing` + /// `Enable Indexing` String get mlIndexing { return Intl.message( - 'Enable ML indexing', + 'Enable Indexing', name: 'mlIndexing', desc: '', args: [], @@ -9055,6 +9055,16 @@ class S { ); } + /// `Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identify documents'` + String get magicSearchHint { + return Intl.message( + 'Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identify documents\'', + name: 'magicSearchHint', + desc: '', + args: [], + ); + } + /// `Panorama` String get panorama { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index d4c349565e..92b58dcd7b 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1269,7 +1269,7 @@ } } }, - "mlIndexing": "Enable ML indexing", + "mlIndexing": "Enable Indexing", "moreDetails" : "More details", "enableMLIndexingDesc": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identify documents'", diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 293899bb67..28e95a42eb 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -3,6 +3,7 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:intl/intl.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/l10n/l10n.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/machine_learning_controller.dart"; import "package:photos/services/machine_learning/ml_service.dart"; @@ -13,11 +14,14 @@ import "package:photos/services/remote_assets_service.dart"; import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/common/loading_widget.dart"; +import "package:photos/ui/common/web_page.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; import "package:photos/ui/components/captioned_text_widget.dart"; import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; import "package:photos/ui/components/menu_section_description_widget.dart"; import "package:photos/ui/components/menu_section_title.dart"; +import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; @@ -62,6 +66,7 @@ class _MachineLearningSettingsPageState @override Widget build(BuildContext context) { + final hasEnabled = localSettings.isFaceIndexingEnabled; return Scaffold( body: CustomScrollView( primary: false, @@ -86,12 +91,16 @@ class _MachineLearningSettingsPageState delegate: SliverChildBuilderDelegate( (delegateBuildContext, index) => Padding( padding: const EdgeInsets.only(left: 16, right: 16), - child: Text( - S.of(context).mlIndexingDescription, - textAlign: TextAlign.left, - style: getEnteTextTheme(context) - .mini - .copyWith(color: getEnteColorScheme(context).textMuted), + child: Column( + children: [ + Text( + S.of(context).mlIndexingDescription, + textAlign: TextAlign.left, + style: getEnteTextTheme(context).mini.copyWith( + color: getEnteColorScheme(context).textMuted, + ), + ), + ], ), ), childCount: 1, @@ -103,7 +112,7 @@ class _MachineLearningSettingsPageState return Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Padding( - padding: const EdgeInsets.symmetric(vertical: 20), + padding: const EdgeInsets.only(top: 20), child: _getMlSettings(context), ), ); @@ -111,6 +120,45 @@ class _MachineLearningSettingsPageState childCount: 1, ), ), + if (!hasEnabled) + SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + children: [ + ButtonWidget( + buttonType: ButtonType.secondary, + labelText: context.l10n.moreDetails, + onTap: () async { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return WebPage( + S.of(context).help, + "https://help.ente.io/photos/features/machine-learning", + ); + }, + ), + ).ignore(); + }, + ), + const SizedBox(height: 12), + Text( + S.of(context).magicSearchHint, + textAlign: TextAlign.left, + style: getEnteTextTheme(context).mini.copyWith( + color: getEnteColorScheme(context).textMuted, + ), + ), + ], + ), + ); + }, + childCount: 1, + ), + ), ], ), ); @@ -123,15 +171,15 @@ class _MachineLearningSettingsPageState children: [ MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: S.of(context).mlFunctions, + title: S.of(context).mlIndexing, ), menuItemColor: colorScheme.fillFaint, trailingWidget: ToggleSwitchWidget( value: () => localSettings.isFaceIndexingEnabled, onChanged: () async { - if (!localSettings.isFaceIndexingEnabled && - !UserRemoteFlagService.instance - .getCachedBoolValue(UserRemoteFlagService.mlEnabled)) { + final hasGivenConsent = UserRemoteFlagService.instance + .getCachedBoolValue(UserRemoteFlagService.mlEnabled); + if (!localSettings.isFaceIndexingEnabled && !hasGivenConsent) { final result = await Navigator.push( context, MaterialPageRoute( @@ -149,7 +197,10 @@ class _MachineLearningSettingsPageState await MLService.instance.init(firstTime: true); await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); - } else {} + } else { + await UserRemoteFlagService.instance + .setBoolValue(UserRemoteFlagService.mlEnabled, false); + } if (mounted) { setState(() {}); } From 8cacb650b6eff7d516ddbf79667e74d123c2e19e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 12:04:04 +0530 Subject: [PATCH 0433/1179] [mob] Move resumable upload setting --- mobile/lib/generated/intl/messages_de.dart | 2 -- mobile/lib/generated/intl/messages_en.dart | 4 ++-- mobile/lib/generated/intl/messages_pl.dart | 2 -- mobile/lib/generated/intl/messages_pt.dart | 2 -- mobile/lib/generated/intl/messages_zh.dart | 1 - mobile/lib/generated/l10n.dart | 8 +++---- mobile/lib/l10n/intl_en.arb | 2 +- .../ui/settings/advanced_settings_screen.dart | 23 ------------------ .../backup/backup_settings_screen.dart | 24 +++++++++++++++++++ 9 files changed, 31 insertions(+), 37 deletions(-) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 203738b726..d86cc2800f 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -683,8 +683,6 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Karten aktivieren"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Dies zeigt Ihre Fotos auf einer Weltkarte.\n\nDiese Karte wird von OpenStreetMap gehostet und die genauen Standorte Ihrer Fotos werden niemals geteilt.\n\nSie können diese Funktion jederzeit in den Einstellungen deaktivieren."), - "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( - "Mehrteiliges Hochladen aktivieren"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Verschlüssele Sicherung …"), "encryption": MessageLookupByLibrary.simpleMessage("Verschlüsselung"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index b92a9f13e7..1424401fa4 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -661,8 +661,6 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Enable Maps"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "This will show your photos on a world map.\n\nThis map is hosted by Open Street Map, and the exact locations of your photos are never shared.\n\nYou can disable this feature anytime from Settings."), - "enableMultiPartUpload": - MessageLookupByLibrary.simpleMessage("Enable multi-part upload"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Encrypting backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Encryption"), @@ -1259,6 +1257,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Restore to album"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Restoring files..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Resumable uploads"), "retry": MessageLookupByLibrary.simpleMessage("Retry"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Please review and delete the items you believe are duplicates."), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index abb44e9cca..9a3dec20ad 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -675,8 +675,6 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Włącz mapy"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "To pokaże Twoje zdjęcia na mapie świata.\n\nTa mapa jest hostowana przez Open Street Map, a dokładne lokalizacje Twoich zdjęć nigdy nie są udostępniane.\n\nMożesz wyłączyć tę funkcję w każdej chwili w ustawieniach."), - "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( - "Włącz przesyłanie wieloczęściowe"), "encryptingBackup": MessageLookupByLibrary.simpleMessage( "Szyfrowanie kopii zapasowej..."), "encryption": MessageLookupByLibrary.simpleMessage("Szyfrowanie"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index e8c025de56..9c5b8d3f92 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -676,8 +676,6 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), - "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage( - "Ativar envio de várias partes"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Criptografando backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Criptografia"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 95b5fbabc6..49f04cd803 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -562,7 +562,6 @@ class MessageLookup extends MessageLookupByLibrary { "enableMaps": MessageLookupByLibrary.simpleMessage("启用地图"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "这将在世界地图上显示您的照片。\n\n该地图由 Open Street Map 托管,并且您的照片的确切位置永远不会共享。\n\n您可以随时从“设置”中禁用此功能。"), - "enableMultiPartUpload": MessageLookupByLibrary.simpleMessage("启用分片上传"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("正在加密备份..."), "encryption": MessageLookupByLibrary.simpleMessage("加密"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("加密密钥"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 5f831a325e..b498ab84dd 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -8015,11 +8015,11 @@ class S { ); } - /// `Enable multi-part upload` - String get enableMultiPartUpload { + /// `Resumable uploads` + String get resumableUploads { return Intl.message( - 'Enable multi-part upload', - name: 'enableMultiPartUpload', + 'Resumable uploads', + name: 'resumableUploads', desc: '', args: [], ); diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 92b58dcd7b..112b3c9e7d 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1148,7 +1148,7 @@ "successfullyHid": "Successfully hid", "successfullyUnhid": "Successfully unhid", "crashReporting": "Crash reporting", - "enableMultiPartUpload": "Enable multi-part upload", + "resumableUploads": "Resumable uploads", "addToHiddenAlbum": "Add to hidden album", "moveToHiddenAlbum": "Move to hidden album", "fileTypes": "File types", diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index bdad641108..6792f254bd 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -192,29 +192,6 @@ class _AdvancedSettingsScreenState extends State { }, ), ), - if (flagService.enableMobMultiPart) - const SizedBox( - height: 24, - ), - if (flagService.enableMobMultiPart) - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).enableMultiPartUpload, - ), - menuItemColor: colorScheme.fillFaint, - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - trailingWidget: ToggleSwitchWidget( - value: () => - localSettings.userEnabledMultiplePart, - onChanged: () async { - await localSettings - .setUserEnabledMultiplePart( - !localSettings.userEnabledMultiplePart, - ); - }, - ), - ), const SizedBox( height: 24, ), diff --git a/mobile/lib/ui/settings/backup/backup_settings_screen.dart b/mobile/lib/ui/settings/backup/backup_settings_screen.dart index 6d15793d7e..6fa4225f6d 100644 --- a/mobile/lib/ui/settings/backup/backup_settings_screen.dart +++ b/mobile/lib/ui/settings/backup/backup_settings_screen.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:photos/core/configuration.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/buttons/icon_button_widget.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; @@ -92,7 +93,30 @@ class BackupSettingsScreen extends StatelessWidget { alignCaptionedTextToLeft: true, isTopBorderRadiusRemoved: true, isGestureDetectorDisabled: true, + isBottomBorderRadiusRemoved: + flagService.enableMobMultiPart, ), + if (flagService.enableMobMultiPart) + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).resumableUploads, + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + trailingWidget: ToggleSwitchWidget( + value: () => + localSettings.userEnabledMultiplePart, + onChanged: () async { + await localSettings + .setUserEnabledMultiplePart( + !localSettings.userEnabledMultiplePart, + ); + }, + ), + alignCaptionedTextToLeft: true, + isTopBorderRadiusRemoved: true, + isGestureDetectorDisabled: true, + ), ], ), const SizedBox(height: 24), From 692589e4c4d2ded7b1aaafdd36bb391580ebc46b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 12:04:46 +0530 Subject: [PATCH 0434/1179] [mob] bump version v0.9.21 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 84bef451fd..f98c7e79e4 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.20+920 +version: 0.9.21+921 publish_to: none environment: From 3a0d6e808b399e2b398693751dcd9a4e2da0b00f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 12:54:26 +0530 Subject: [PATCH 0435/1179] [mob] Fix tensor size for clip image --- .../src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt index eaf32c21e1..5b84568b2e 100644 --- a/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt +++ b/mobile/plugins/onnx_dart/android/src/main/kotlin/io/ente/photos/onnx_dart/OnnxDartPlugin.kt @@ -178,7 +178,8 @@ class OnnxDartPlugin: FlutterPlugin, MethodCallHandler { inputTensorShape = longArrayOf(totalSize, 112, 112, 3) } ModelType.ClipImageEncoder -> { - inputTensorShape = longArrayOf(1, 3, 224, 224) + inputTensorShape = longArrayOf(1, 3, 256, 256) +// inputTensorShape = longArrayOf(1, 3, 256, 256) } ModelType.ClipTextEncoder -> { inputTensorShape = longArrayOf(1, 77) From 0b7ee1ad0b05f05fa65ed7a8c9128050d1dcaaea Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:20:06 +0530 Subject: [PATCH 0436/1179] [mob] Add proguard rule for ai.onnxruntime --- mobile/android/app/build.gradle | 1 + mobile/android/app/proguard-rules.pro | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 mobile/android/app/proguard-rules.pro diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index a7b6c5a29e..ad09d00b94 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -49,6 +49,7 @@ android { versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true + consumerProguardFiles 'proguard-rules.pro' } signingConfigs { diff --git a/mobile/android/app/proguard-rules.pro b/mobile/android/app/proguard-rules.pro new file mode 100644 index 0000000000..f35c179f30 --- /dev/null +++ b/mobile/android/app/proguard-rules.pro @@ -0,0 +1,4 @@ +-keep class ai.onnxruntime.** { *; } +# To ensure that stack traces is unambiguous +# https://developer.android.com/studio/build/shrink-code#decode-stack-trace +-keepattributes LineNumberTable,SourceFile From 508bc4a3e996bac9301b9f3821ea98597282a59a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:21:50 +0530 Subject: [PATCH 0437/1179] [mob] Enable native onnx plugin for droid --- mobile/lib/services/machine_learning/ml_model.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index a0384f1813..daad0ad61a 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -19,8 +19,7 @@ abstract class MlModel { final _downloadModelLock = Lock(); - // static final bool usePlatformPlugin = Platform.isAndroid; - static const bool usePlatformPlugin = false; + static final bool usePlatformPlugin = Platform.isAndroid; bool get isInitialized => usePlatformPlugin ? _isNativePluginInitialized : _isFfiInitialized; From 13449ff169f7b625724f1b1b8d547d1cfb41a3d0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:23:20 +0530 Subject: [PATCH 0438/1179] Fix padding --- mobile/lib/ui/settings/ml/enable_ml_consent.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart index c3c0da5d79..578c7fed51 100644 --- a/mobile/lib/ui/settings/ml/enable_ml_consent.dart +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -94,7 +94,7 @@ class _EnableMachineLearningConsentState ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(vertical: 1), + padding: const EdgeInsets.symmetric(vertical: 12), child: Text( S.of(context).mlConsentConfirmation, style: getEnteTextTheme(context).bodyMuted, From 152e895b876550bd9e9491a5a09e3726890b8b78 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:24:05 +0530 Subject: [PATCH 0439/1179] [mob] Add divider --- mobile/lib/ui/settings/backup/backup_settings_screen.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mobile/lib/ui/settings/backup/backup_settings_screen.dart b/mobile/lib/ui/settings/backup/backup_settings_screen.dart index 6fa4225f6d..8f87fb6037 100644 --- a/mobile/lib/ui/settings/backup/backup_settings_screen.dart +++ b/mobile/lib/ui/settings/backup/backup_settings_screen.dart @@ -96,6 +96,11 @@ class BackupSettingsScreen extends StatelessWidget { isBottomBorderRadiusRemoved: flagService.enableMobMultiPart, ), + if (flagService.enableMobMultiPart) + DividerWidget( + dividerType: DividerType.menuNoIcon, + bgColor: colorScheme.fillFaint, + ), if (flagService.enableMobMultiPart) MenuItemWidget( captionedTextWidget: CaptionedTextWidget( From 6e4e19d7f4768f45120d5313b7d345909e1da4bd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:25:11 +0530 Subject: [PATCH 0440/1179] [mob] bump version v0.9.22 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index f98c7e79e4..5448c13120 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.21+921 +version: 0.9.22+922 publish_to: none environment: From 52d1ba237a42cc2542c2480d00f2184ca0351170 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:28:31 +0530 Subject: [PATCH 0441/1179] [mob] Pass correct ml version --- mobile/lib/services/machine_learning/ml_result.dart | 6 ------ mobile/lib/services/machine_learning/ml_service.dart | 5 +++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_result.dart b/mobile/lib/services/machine_learning/ml_result.dart index 9385639ee8..3f0aab4784 100644 --- a/mobile/lib/services/machine_learning/ml_result.dart +++ b/mobile/lib/services/machine_learning/ml_result.dart @@ -2,7 +2,6 @@ import "dart:convert" show jsonEncode, jsonDecode; import "package:photos/models/ml/face/dimension.dart"; import 'package:photos/models/ml/ml_typedefs.dart'; -import "package:photos/models/ml/ml_versions.dart"; import 'package:photos/services/machine_learning/face_ml/face_alignment/alignment_result.dart'; import 'package:photos/services/machine_learning/face_ml/face_detection/detection.dart'; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; @@ -15,7 +14,6 @@ class MLResult { Dimensions decodedImageSize; - int mlVersion; bool errorOccured; bool onlyThumbnailUsed; @@ -29,7 +27,6 @@ class MLResult { this.fileId = -1, this.faces = const [], this.clip, - this.mlVersion = faceMlVersion, this.errorOccured = false, this.onlyThumbnailUsed = false, this.decodedImageSize = const Dimensions(width: -1, height: -1), @@ -37,7 +34,6 @@ class MLResult { MLResult.fromEnteFileID( fileID, { - this.mlVersion = faceMlVersion, this.errorOccured = false, this.onlyThumbnailUsed = false, this.decodedImageSize = const Dimensions(width: -1, height: -1), @@ -56,7 +52,6 @@ class MLResult { 'fileId': fileId, 'faces': faces?.map((face) => face.toJson()).toList(), 'clip': clip?.toJson(), - 'mlVersion': mlVersion, 'errorOccured': errorOccured, 'onlyThumbnailUsed': onlyThumbnailUsed, 'decodedImageSize': { @@ -78,7 +73,6 @@ class MLResult { clip: json['clip'] != null ? ClipResult.fromJson(json['clip'] as Map) : null, - mlVersion: json['mlVersion'], errorOccured: json['errorOccured'] ?? false, onlyThumbnailUsed: json['onlyThumbnailUsed'] ?? false, decodedImageSize: json['decodedImageSize'] != null diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 48a5d64ea5..66581085fe 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -15,6 +15,7 @@ import "package:photos/models/ml/face/box.dart"; import "package:photos/models/ml/face/detection.dart" as face_detection; import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/face/landmark.dart"; +import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/filedata/filedata_service.dart"; import "package:photos/services/filedata/model/file_data.dart"; @@ -459,7 +460,7 @@ class MLService { dataEntity.putFace( RemoteFaceEmbedding( faces, - result.mlVersion, + faceMlVersion, client: client, height: result.decodedImageSize.height, width: result.decodedImageSize.width, @@ -470,7 +471,7 @@ class MLService { dataEntity.putClip( RemoteClipEmbedding( result.clip!.embedding, - version: result.mlVersion, + version: clipMlVersion, client: client, ), ); From 8c8d81c40e38db87f6158f65745a3195d67abcdb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 20 Aug 2024 11:05:51 +0200 Subject: [PATCH 0442/1179] [mob][photos] ML settings add indicator for wifi pause --- .../semantic_search/semantic_search_service.dart | 8 -------- .../ui/settings/machine_learning_settings_page.dart | 12 +++++++++++- mobile/lib/utils/ml_util.dart | 7 +++++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 34387dea28..ea64eba430 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -102,14 +102,6 @@ class SemanticSearchService { } } - Future getIndexStatus() async { - final indexableFileIDs = await getIndexableFileIDs(); - return IndexStatus( - min(_cachedImageEmbeddings.length, indexableFileIDs.length), - (await _getFileIDsToBeIndexed()).length, - ); - } - Future clearIndexes() async { await MLDataDB.instance.deleteClipIndexes(); final preferences = await SharedPreferences.getInstance(); diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 28e95a42eb..140fc4dfa5 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -359,6 +359,7 @@ class MLStatusWidgetState extends State { MachineLearningController.instance.isDeviceHealthy; final int indexedFiles = snapshot.data!.indexedItems; final int pendingFiles = snapshot.data!.pendingItems; + final bool hasWifi = snapshot.data!.hasWifiEnabled!; if (!isDeviceHealthy && pendingFiles > 0) { return MenuSectionDescriptionWidget( @@ -407,7 +408,16 @@ class MLStatusWidgetState extends State { alignCaptionedTextToLeft: true, isGestureDetectorDisabled: true, ) - : const SizedBox.shrink(), + : (!hasWifi && pendingFiles > 0) + ? MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).waitingForWifi, + ), + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + isGestureDetectorDisabled: true, + ) + : const SizedBox.shrink(), ], ); } diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index ddb885136b..707d43b721 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -21,6 +21,7 @@ import "package:photos/services/machine_learning/semantic_search/semantic_search import "package:photos/services/search_service.dart"; import "package:photos/utils/file_util.dart"; import "package:photos/utils/image_ml_util.dart"; +import "package:photos/utils/network_util.dart"; import "package:photos/utils/thumbnail_util.dart"; final _logger = Logger("MlUtil"); @@ -29,8 +30,9 @@ enum FileDataForML { thumbnailData, fileData } class IndexStatus { final int indexedItems, pendingItems; + final bool? hasWifiEnabled; - IndexStatus(this.indexedItems, this.pendingItems); + IndexStatus(this.indexedItems, this.pendingItems, [this.hasWifiEnabled]); } class FileMLInstruction { @@ -58,7 +60,8 @@ Future getIndexStatus() async { final showIndexedFiles = math.min(indexedFiles, indexableFiles); final showPendingFiles = math.max(indexableFiles - indexedFiles, 0); - return IndexStatus(showIndexedFiles, showPendingFiles); + final hasWifiEnabled = await canUseHighBandwidth(); + return IndexStatus(showIndexedFiles, showPendingFiles, hasWifiEnabled); } catch (e, s) { _logger.severe('Error getting ML status', e, s); rethrow; From dfe329eef9bcc2b1e6dd8617c89b93a2df11d0ec Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:38:26 +0530 Subject: [PATCH 0443/1179] [mob] Minor refactor --- mobile/lib/services/machine_learning/ml_service.dart | 1 - .../semantic_search/semantic_search_service.dart | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 66581085fe..8c7060d2c7 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -492,7 +492,6 @@ class MLService { actuallyRanML = true; await SemanticSearchService.storeClipImageResult( result.clip!, - instruction.file, ); } } on ThumbnailRetrievalException catch (e, s) { diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 34387dea28..756934b5a8 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -263,10 +263,7 @@ class SemanticSearchService { _logger.info("Clip text model loaded"); } - static Future storeClipImageResult( - ClipResult clipResult, - EnteFile entefile, - ) async { + static Future storeClipImageResult(ClipResult clipResult) async { final embedding = ClipEmbedding( fileID: clipResult.fileID, embedding: clipResult.embedding, From c7c22bee88428fe28e592fc4f54035109eaed14b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:35:17 +0530 Subject: [PATCH 0444/1179] Update copy --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 1424401fa4..36d2ce8000 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -970,7 +970,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( "I understand, and wish to enable machine learning"), "mlConsentDescription": MessageLookupByLibrary.simpleMessage( - "If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted."), + "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted."), "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index b498ab84dd..2e4db258b9 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2886,10 +2886,10 @@ class S { ); } - /// `If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.` + /// `If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.` String get mlConsentDescription { return Intl.message( - 'If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.', + 'If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.', name: 'mlConsentDescription', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 112b3c9e7d..aa6e45d5ce 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -411,7 +411,7 @@ "machineLearning": "Machine learning", "mlConsent": "Enable machine learning", "mlConsentTitle": "Enable machine learning?", - "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files. This will happen on your device, and any generated biometric information will be end-to-end encrypted.", + "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.", "mlConsentPrivacy": "Please click here for more details about this feature in our privacy policy", "mlConsentConfirmation": "I understand, and wish to enable machine learning", "magicSearch": "Magic search", From 729c3598da096b45c0f517d8171a51d57f5a5d77 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:37:27 +0530 Subject: [PATCH 0445/1179] Update copy --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 36d2ce8000..50b03455a2 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -948,7 +948,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Machine learning"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magic search"), "magicSearchHint": MessageLookupByLibrary.simpleMessage( - "Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identify documents\'"), + "Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identity documents\'"), "manage": MessageLookupByLibrary.simpleMessage("Manage"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage("Manage device storage"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 2e4db258b9..47d3775d0c 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9055,10 +9055,10 @@ class S { ); } - /// `Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identify documents'` + /// `Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identity documents'` String get magicSearchHint { return Intl.message( - 'Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identify documents\'', + 'Magic search allows to search photos by their contents, e.g. \'flower\', \'red car\', \'identity documents\'', name: 'magicSearchHint', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index aa6e45d5ce..73797ed27e 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1272,7 +1272,7 @@ "mlIndexing": "Enable Indexing", "moreDetails" : "More details", "enableMLIndexingDesc": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", - "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identify documents'", + "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identity documents'", "panorama": "Panorama", "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", From 86065a6b56f9d4bdaf7c5a740ee5d4a835e85646 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:43:48 +0530 Subject: [PATCH 0446/1179] Minor fix --- mobile/lib/models/file/file.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/models/file/file.dart b/mobile/lib/models/file/file.dart index 979cf27059..74affd9844 100644 --- a/mobile/lib/models/file/file.dart +++ b/mobile/lib/models/file/file.dart @@ -268,7 +268,7 @@ class EnteFile { } String? get caption { - return debugCaption ?? pubMagicMetadata?.caption; + return pubMagicMetadata?.caption; } String? debugCaption; From 7a197124eaef1b8fbc86c37432102e8d6bbf372b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:49:01 +0530 Subject: [PATCH 0447/1179] [mob] Log when magicSearch is disabled --- .../semantic_search/semantic_search_service.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index f714133784..baf0e9d58b 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -78,6 +78,10 @@ class SemanticSearchService { // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { if (!isMagicSearchEnabledAndReady()) { + if (flagService.internalUser) { + _logger.info( + "Magic search enabled ${localSettings.isFaceIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}"); + } return (query, []); } // If there's an ongoing request, just update the last query and return its future. From dae5c1a0b883fda18558a7a11f4b53bfa2208333 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:49:31 +0530 Subject: [PATCH 0448/1179] [mob] Lint fi --- .../semantic_search/semantic_search_service.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index baf0e9d58b..25e5acc9be 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -80,7 +80,8 @@ class SemanticSearchService { if (!isMagicSearchEnabledAndReady()) { if (flagService.internalUser) { _logger.info( - "Magic search enabled ${localSettings.isFaceIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}"); + "Magic search enabled ${localSettings.isFaceIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}", + ); } return (query, []); } From eb568080dd3801ca20347f0f91f58043568b93f8 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 20 Aug 2024 15:56:40 +0530 Subject: [PATCH 0449/1179] [mob][auth] Used better names --- auth/lib/utils/lock_screen_settings.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/auth/lib/utils/lock_screen_settings.dart b/auth/lib/utils/lock_screen_settings.dart index 100bd3434a..38c425a025 100644 --- a/auth/lib/utils/lock_screen_settings.dart +++ b/auth/lib/utils/lock_screen_settings.dart @@ -42,10 +42,12 @@ class LockScreenSettings { ///Workaround for privacyScreen not working when app is killed and opened. await setHideAppContent(getShouldHideAppContent()); - await setHasMigratedLockScreenChanges(); + /// Function to Check if the migration for lock screen changes has + /// already been done by checking a stored boolean value. + await runLockScreenChangesMigration(); } - Future setHasMigratedLockScreenChanges() async { + Future runLockScreenChangesMigration() async { if (_preferences.getBool(keyHasMigratedLockScreenChanges) != null) { return; } From d0abf2141f98c680b58a0a2b30afad9538cc26ab Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:21:12 +0530 Subject: [PATCH 0450/1179] [mob] Clean up --- mobile/lib/models/ml/face/face.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/models/ml/face/face.dart b/mobile/lib/models/ml/face/face.dart index 0ff5b86eb1..3036a00630 100644 --- a/mobile/lib/models/ml/face/face.dart +++ b/mobile/lib/models/ml/face/face.dart @@ -59,7 +59,7 @@ class Face { return Face( faceID, fileID, - List.from((json['embedding'] ?? json['embeddings']) as List), + List.from(json['embedding'] as List), json['score'] as double, Detection.fromJson(json['detection'] as Map), // high value means t From cb784d5ec7624e4a3b7bbdf9e7ab55fc60225e7a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:26:31 +0530 Subject: [PATCH 0451/1179] Handle int value in embedding --- mobile/lib/models/ml/face/face.dart | 20 ++++++++++++++++++- .../services/filedata/model/file_data.dart | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/mobile/lib/models/ml/face/face.dart b/mobile/lib/models/ml/face/face.dart index 3036a00630..455938868b 100644 --- a/mobile/lib/models/ml/face/face.dart +++ b/mobile/lib/models/ml/face/face.dart @@ -59,7 +59,7 @@ class Face { return Face( faceID, fileID, - List.from(json['embedding'] as List), + parseAsDoubleList(json['embedding'] as List), json['score'] as double, Detection.fromJson(json['detection'] as Map), // high value means t @@ -77,3 +77,21 @@ class Face { 'blur': blur, }; } + +List parseAsDoubleList(List inputList) { + if (inputList.isEmpty) return const []; + + if (inputList is List) return inputList; + return List.generate( + inputList.length, + (index) { + final value = inputList[index]; + if (value is int) return value.toDouble(); + if (value is double) return value; + throw FormatException( + 'Invalid type at index $index: ${value.runtimeType}', + ); + }, + growable: false, + ); +} diff --git a/mobile/lib/services/filedata/model/file_data.dart b/mobile/lib/services/filedata/model/file_data.dart index d73ee1d2f8..56bfe1cb4e 100644 --- a/mobile/lib/services/filedata/model/file_data.dart +++ b/mobile/lib/services/filedata/model/file_data.dart @@ -147,7 +147,7 @@ class RemoteClipEmbedding { // fromJson factory RemoteClipEmbedding.fromJson(Map json) { return RemoteClipEmbedding( - List.from(json['embedding'] as List), + parseAsDoubleList(json['embedding'] as List), version: json['version'] as int, client: json['client'] as String, ); From 6ba4892294cf175dec69cb4fceca020a8ee02b8f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:50:37 +0530 Subject: [PATCH 0452/1179] Update UX for ml settings --- mobile/lib/generated/intl/messages_en.dart | 3 +- mobile/lib/generated/l10n.dart | 18 +++- mobile/lib/l10n/intl_en.arb | 3 +- .../machine_learning_settings_page.dart | 93 +++++++++++-------- 4 files changed, 71 insertions(+), 46 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 50b03455a2..96e46d6c32 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -656,11 +656,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Email your logs"), "empty": MessageLookupByLibrary.simpleMessage("Empty"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Empty trash?"), + "enable": MessageLookupByLibrary.simpleMessage("Enable"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente supports on-device machine learning for face recognition, magic search and other advanced search features"), "enableMaps": MessageLookupByLibrary.simpleMessage("Enable Maps"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "This will show your photos on a world map.\n\nThis map is hosted by Open Street Map, and the exact locations of your photos are never shared.\n\nYou can disable this feature anytime from Settings."), + "enabled": MessageLookupByLibrary.simpleMessage("Enabled"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Encrypting backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Encryption"), @@ -975,7 +977,6 @@ class MessageLookup extends MessageLookupByLibrary { "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": MessageLookupByLibrary.simpleMessage("Enable machine learning?"), - "mlIndexing": MessageLookupByLibrary.simpleMessage("Enable Indexing"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), "mobileWebDesktop": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 47d3775d0c..f0b468cfe4 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9025,11 +9025,21 @@ class S { ); } - /// `Enable Indexing` - String get mlIndexing { + /// `Enable` + String get enable { return Intl.message( - 'Enable Indexing', - name: 'mlIndexing', + 'Enable', + name: 'enable', + desc: '', + args: [], + ); + } + + /// `Enabled` + String get enabled { + return Intl.message( + 'Enabled', + name: 'enabled', desc: '', args: [], ); diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 73797ed27e..ac4a24a330 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1269,7 +1269,8 @@ } } }, - "mlIndexing": "Enable Indexing", + "enable": "Enable", + "enabled": "Enabled", "moreDetails" : "More details", "enableMLIndexingDesc": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identity documents'", diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 140fc4dfa5..9f2acf5961 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -128,6 +128,14 @@ class _MachineLearningSettingsPageState padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( children: [ + ButtonWidget( + buttonType: ButtonType.primary, + labelText: context.l10n.enable, + onTap: () async { + await toggleIndexingState(); + }, + ), + const SizedBox(height: 12), ButtonWidget( buttonType: ButtonType.secondary, labelText: context.l10n.moreDetails, @@ -164,52 +172,57 @@ class _MachineLearningSettingsPageState ); } + Future toggleIndexingState() async { + final hasGivenConsent = UserRemoteFlagService.instance + .getCachedBoolValue(UserRemoteFlagService.mlEnabled); + if (!localSettings.isFaceIndexingEnabled && !hasGivenConsent) { + final result = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return const EnableMachineLearningConsent(); + }, + ), + ); + if (result == null || result == false) { + return; + } + } + final isEnabled = await localSettings.toggleFaceIndexing(); + if (isEnabled) { + await MLService.instance.init(firstTime: true); + await SemanticSearchService.instance.init(); + unawaited(MLService.instance.runAllML(force: true)); + } else { + await UserRemoteFlagService.instance + .setBoolValue(UserRemoteFlagService.mlEnabled, false); + } + if (mounted) { + setState(() {}); + } + } + Widget _getMlSettings(BuildContext context) { final colorScheme = getEnteColorScheme(context); final hasEnabled = localSettings.isFaceIndexingEnabled; return Column( children: [ - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).mlIndexing, + if (hasEnabled) + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).enabled, + ), + menuItemColor: colorScheme.fillFaint, + trailingWidget: ToggleSwitchWidget( + value: () => localSettings.isFaceIndexingEnabled, + onChanged: () async { + await toggleIndexingState(); + }, + ), + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + isGestureDetectorDisabled: true, ), - menuItemColor: colorScheme.fillFaint, - trailingWidget: ToggleSwitchWidget( - value: () => localSettings.isFaceIndexingEnabled, - onChanged: () async { - final hasGivenConsent = UserRemoteFlagService.instance - .getCachedBoolValue(UserRemoteFlagService.mlEnabled); - if (!localSettings.isFaceIndexingEnabled && !hasGivenConsent) { - final result = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) { - return const EnableMachineLearningConsent(); - }, - ), - ); - if (result == null || result == false) { - return; - } - } - final isEnabled = await localSettings.toggleFaceIndexing(); - if (isEnabled) { - await MLService.instance.init(firstTime: true); - await SemanticSearchService.instance.init(); - unawaited(MLService.instance.runAllML(force: true)); - } else { - await UserRemoteFlagService.instance - .setBoolValue(UserRemoteFlagService.mlEnabled, false); - } - if (mounted) { - setState(() {}); - } - }, - ), - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - isGestureDetectorDisabled: true, - ), const SizedBox( height: 12, ), From ae06577b00d40259752bdae7c5959bad701c58aa Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:51:21 +0530 Subject: [PATCH 0453/1179] Increase padding --- mobile/lib/ui/settings/ml/enable_ml_consent.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart index 578c7fed51..d156954e85 100644 --- a/mobile/lib/ui/settings/ml/enable_ml_consent.dart +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -114,7 +114,7 @@ class _EnableMachineLearningConsentState }, shouldSurfaceExecutionStates: true, ), - const SizedBox(height: 8), + const SizedBox(height: 12), ButtonWidget( buttonType: ButtonType.secondary, labelText: S.of(context).cancel, From 3fa16625be66906c7bb2a4655344fa53d66e4d83 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:53:22 +0530 Subject: [PATCH 0454/1179] [mob] Skip disabling consent on mobile --- mobile/lib/ui/settings/machine_learning_settings_page.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 9f2acf5961..1bbef35ab1 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -194,8 +194,10 @@ class _MachineLearningSettingsPageState await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); } else { - await UserRemoteFlagService.instance - .setBoolValue(UserRemoteFlagService.mlEnabled, false); + // todo: Take a call if we should disable ML from other devices as well + // when the user turns off indexing on mobile + // await UserRemoteFlagService.instance + // .setBoolValue(UserRemoteFlagService.mlEnabled, false); } if (mounted) { setState(() {}); From 29d571e71a2f0865576422198b843f34f1dc178e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:53:53 +0530 Subject: [PATCH 0455/1179] [mob] bump version v0.9.23 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 5448c13120..b666ac5b4f 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.22+922 +version: 0.9.23+923 publish_to: none environment: From 5b816ecb8a23a81a879961454981d66db836ed99 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:59:19 +0530 Subject: [PATCH 0456/1179] [mob] Update copy --- .../lib/ui/settings/machine_learning_settings_page.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 1bbef35ab1..1deead85b0 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -93,6 +93,15 @@ class _MachineLearningSettingsPageState padding: const EdgeInsets.only(left: 16, right: 16), child: Column( children: [ + if (!hasEnabled) + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + S.of(context).enableMLIndexingDesc, + textAlign: TextAlign.left, + style: getEnteTextTheme(context).small, + ), + ), Text( S.of(context).mlIndexingDescription, textAlign: TextAlign.left, From 187dc5ed901765fd4756e094d6fee4eafcc1ebe8 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 20 Aug 2024 15:09:46 +0200 Subject: [PATCH 0457/1179] [mob][photos] Remove unused incorrect method --- .../semantic_search/semantic_search_service.dart | 9 --------- 1 file changed, 9 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 25e5acc9be..435e4c369c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -22,7 +22,6 @@ import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/utils/debouncer.dart"; -import "package:photos/utils/ml_util.dart"; import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { @@ -127,14 +126,6 @@ class SemanticSearchService { .info("Cached embeddings: " + _cachedImageEmbeddings.length.toString()); } - Future> _getFileIDsToBeIndexed() async { - final uploadedFileIDs = await getIndexableFileIDs(); - final embeddedFileIDs = await MLDataDB.instance.getIndexedFileIds(); - embeddedFileIDs.removeWhere((key, value) => value < clipMlVersion); - - return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); - } - Future> getMatchingFiles( String query, { double? scoreThreshold, From 2324ba61085cc76f0338280d5fe3021d51ae934f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 20 Aug 2024 15:17:07 +0200 Subject: [PATCH 0458/1179] [mob][photos] Rename to avoid confusion --- mobile/lib/db/ml/db.dart | 2 +- mobile/lib/utils/ml_util.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 8276ec0a25..727542dfa8 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -160,7 +160,7 @@ class MLDataDB { } /// Returns a map of fileID to the indexed ML version - Future> getIndexedFileIds({ + Future> faceIndexedFileIds({ int minimumMlVersion = faceMlVersion, }) async { final db = await instance.asyncDB; diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 707d43b721..9233199e93 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -73,7 +73,7 @@ Future> getFilesForMlIndexing() async { final time = DateTime.now(); // Get indexed fileIDs for each ML service final Map faceIndexedFileIDs = - await MLDataDB.instance.getIndexedFileIds(); + await MLDataDB.instance.faceIndexedFileIds(); final Map clipIndexedFileIDs = await MLDataDB.instance.clipIndexedFileWithVersion(); final Set queuedFiledIDs = {}; From f2f4bf2fd7bc62fb8325642475255aa455533181 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 21:13:56 +0530 Subject: [PATCH 0459/1179] [desktop] Update translation --- web/packages/base/locales/en-US/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index c778a8e45a..d19119ff1a 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "Do you want to disable machine learning on all your devices?", "ml_consent": "Enable machine learning", "ml_consent_title": "Enable machine learning?", - "ml_consent_description": "

If you enable machine learning, Ente will extract information like face geometry from your photos. This will happen on your device, and any generated biometric information will be end-to-end encrypted.

Please click here for more details about this feature in our privacy policy

", + "ml_consent_description": "

If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.

This will happen on your device, and any generated biometric information will be end-to-end encrypted.

Please click here for more details about this feature in our privacy policy

", "ml_consent_confirmation": "I understand, and wish to enable machine learning", "labs": "Labs", "YOURS": "yours", From 346ef9b17dfd6713824f0d113bf06ac71b5ee851 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 21:46:50 +0530 Subject: [PATCH 0460/1179] Disable all clustering traces --- web/apps/photos/src/services/searchService.ts | 48 ++++--- web/packages/new/photos/services/ml/db.ts | 12 +- web/packages/new/photos/services/ml/index.ts | 120 ++++++++---------- 3 files changed, 85 insertions(+), 95 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 3156652a38..01a3289d93 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -6,12 +6,8 @@ import { isMLEnabled, isMLSupported, mlStatusSnapshot, - wipCluster, - wipClusterEnable, } from "@/new/photos/services/ml"; -import { clusterGroups } from "@/new/photos/services/ml/db"; import type { SearchPerson } from "@/new/photos/services/search"; -import { syncCGroups } from "@/new/photos/services/user-entity"; import { EnteFile } from "@/new/photos/types/file"; import * as chrono from "chrono-node"; import { t } from "i18next"; @@ -420,28 +416,30 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { } } -let done = false; -async function getAllPeople(limit: number = undefined) { - if (!(await wipClusterEnable())) return []; - if (done) return []; +// let done = false; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +async function getAllPeople(_limit: number = undefined) { + return []; + // if (!(await wipClusterEnable())) return []; + // if (done) return []; - done = true; - if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { - await syncCGroups(); - const people = await clusterGroups(); - log.debug(() => ["people", { people }]); - } + // done = true; + // if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_FETCH) { + // await syncCGroups(); + // const people = await clusterGroups(); + // log.debug(() => ["people", { people }]); + // } - let people: Array = []; // await mlIDbStorage.getAllPeople(); - people = await wipCluster(); - // await mlPeopleStore.iterate((person) => { - // people.push(person); - // }); - people = people ?? []; - const result = people - .sort((p1, p2) => p2.files.length - p1.files.length) - .slice(0, limit); - // log.debug(() => ["getAllPeople", result]); + // let people: Array = []; // await mlIDbStorage.getAllPeople(); + // people = await wipCluster(); + // // await mlPeopleStore.iterate((person) => { + // // people.push(person); + // // }); + // people = people ?? []; + // const result = people + // .sort((p1, p2) => p2.files.length - p1.files.length) + // .slice(0, limit); + // // log.debug(() => ["getAllPeople", result]); - return result; + // return result; } diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 91f0dd21fa..e6ba5fe1bc 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -123,12 +123,12 @@ const openMLDB = async () => { db.createObjectStore("clip-index", { keyPath: "fileID" }); } // TODO-Cluster - if (oldVersion < 3) { - if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { - db.createObjectStore("face-cluster", { keyPath: "id" }); - db.createObjectStore("cluster-group", { keyPath: "id" }); - } - } + // if (oldVersion < 3) { + // if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { + // db.createObjectStore("face-cluster", { keyPath: "id" }); + // db.createObjectStore("cluster-group", { keyPath: "id" }); + // } + // } }, blocking() { log.info( diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 9aa2c4338c..c9e6ac4e08 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -6,7 +6,6 @@ import { isDesktop } from "@/base/app"; import { assertionFailed } from "@/base/assert"; import { blobCache } from "@/base/blob-cache"; import { ensureElectron } from "@/base/electron"; -import { isDevBuild } from "@/base/env"; import log from "@/base/log"; import type { Electron } from "@/base/types/ipc"; import { ComlinkWorker } from "@/base/worker/comlink-worker"; @@ -16,18 +15,10 @@ import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; -import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; -import type { SearchPerson } from "../search"; import type { UploadItem } from "../upload/types"; -import { clusterFaces } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; -import { - clearMLDB, - faceIndex, - faceIndexes, - indexableAndIndexedCounts, -} from "./db"; +import { clearMLDB, faceIndex, indexableAndIndexedCounts } from "./db"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; @@ -330,66 +321,66 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { void worker().then((w) => w.onUpload(enteFile, uploadItem)); }; -// TODO-Cluster temporary import here -let last: SearchPerson[] | undefined; +// // TODO-Cluster temporary import here +// let last: SearchPerson[] | undefined; -/** - * WIP! Don't enable, dragon eggs are hatching here. - */ -export const wipClusterEnable = async () => { - if (!process.env.NEXT_PUBLIC_ENTE_WIP_CL) return false; - if (!isDevBuild || !(await isInternalUser())) return false; - return true; -}; +// /** +// * WIP! Don't enable, dragon eggs are hatching here. +// */ +// export const wipClusterEnable = async () => { +// if (!process.env.NEXT_PUBLIC_ENTE_WIP_CL) return false; +// if (!isDevBuild || !(await isInternalUser())) return false; +// return true; +// }; -export const wipCluster = async () => { - if (!(await wipClusterEnable())) return; +// export const wipCluster = async () => { +// if (!(await wipClusterEnable())) return; - if (last) return last; +// if (last) return last; - const { clusters, cgroups } = await clusterFaces(await faceIndexes()); - const clusterByID = new Map( - clusters.map((cluster) => [cluster.id, cluster]), - ); +// const { clusters, cgroups } = await clusterFaces(await faceIndexes()); +// const clusterByID = new Map( +// clusters.map((cluster) => [cluster.id, cluster]), +// ); - const localFiles = await getAllLocalFiles(); - const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); +// const localFiles = await getAllLocalFiles(); +// const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); - const result: SearchPerson[] = []; - for (const cgroup of cgroups) { - let avatarFaceID = cgroup.avatarFaceID; - // TODO-Cluster - // Temp - if (!avatarFaceID) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - avatarFaceID = cgroup.clusterIDs - .map((id) => clusterByID.get(id)) - .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; - } - cgroup.clusterIDs; - const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); - const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); - if (!avatarFaceFileID || !avatarFaceFile) { - assertionFailed(`Face ID ${avatarFaceID} without local file`); - continue; - } - const files = cgroup.clusterIDs - .map((id) => clusterByID.get(id)) - .flatMap((cluster) => cluster?.faceIDs ?? []) - .map((faceID) => fileIDFromFaceID(faceID)) - .filter((fileID) => fileID !== undefined); - result.push({ - id: cgroup.id, - name: cgroup.name, - files, - displayFaceID: avatarFaceID, - displayFaceFile: avatarFaceFile, - }); - } +// const result: SearchPerson[] = []; +// for (const cgroup of cgroups) { +// let avatarFaceID = cgroup.avatarFaceID; +// // TODO-Cluster +// // Temp +// if (!avatarFaceID) { +// // eslint-disable-next-line @typescript-eslint/no-non-null-assertion +// avatarFaceID = cgroup.clusterIDs +// .map((id) => clusterByID.get(id)) +// .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; +// } +// cgroup.clusterIDs; +// const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); +// const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); +// if (!avatarFaceFileID || !avatarFaceFile) { +// assertionFailed(`Face ID ${avatarFaceID} without local file`); +// continue; +// } +// const files = cgroup.clusterIDs +// .map((id) => clusterByID.get(id)) +// .flatMap((cluster) => cluster?.faceIDs ?? []) +// .map((faceID) => fileIDFromFaceID(faceID)) +// .filter((fileID) => fileID !== undefined); +// result.push({ +// id: cgroup.id, +// name: cgroup.name, +// files, +// displayFaceID: avatarFaceID, +// displayFaceFile: avatarFaceFile, +// }); +// } - last = result; - return result; -}; +// last = result; +// return result; +// }; export type MLStatus = | { phase: "disabled" /* The ML remote flag is off */ } @@ -558,7 +549,8 @@ export const unidentifiedFaceIDs = async ( * Extract the fileID of the {@link EnteFile} to which the face belongs from its * faceID. */ -const fileIDFromFaceID = (faceID: string) => { +// TODO-Cluster: temporary export to supress linter +export const fileIDFromFaceID = (faceID: string) => { const fileID = parseInt(faceID.split("_")[0] ?? ""); if (isNaN(fileID)) { assertionFailed(`Ignoring attempt to parse invalid faceID ${faceID}`); From d01a94fbecad501f6658c9233af33c9ba1242b7d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 22:41:29 +0530 Subject: [PATCH 0461/1179] Fix variable capturing --- web/packages/new/photos/services/ml/worker.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index e59e0f8731..fdcb1ac595 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -311,14 +311,17 @@ const indexNextBatch = async ( while (i < items.length) { for (let j = 0; j < tasks.length; j++) { if (i < items.length && !tasks[j]) { - tasks[j] = index(ensure(items[i++]), electron) - .then(() => { - tasks[j] = undefined; - }) - .catch(() => { - allSuccess = false; - tasks[j] = undefined; - }); + // Use an IIFE to capture the value of j at the time of + // invocation. + tasks[j] = ((item: IndexableItem, j: number) => + index(item, electron) + .then(() => { + tasks[j] = undefined; + }) + .catch(() => { + allSuccess = false; + tasks[j] = undefined; + }))(ensure(items[i++]), j); } } From bc93124da07b2fa82c156c21358ed0f9fd8c3923 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 00:22:02 +0530 Subject: [PATCH 0462/1179] Show the delete options for long folder names too --- .../photos/src/components/WatchFolder.tsx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/web/apps/photos/src/components/WatchFolder.tsx b/web/apps/photos/src/components/WatchFolder.tsx index 3da5c35ed4..e95b86eb33 100644 --- a/web/apps/photos/src/components/WatchFolder.tsx +++ b/web/apps/photos/src/components/WatchFolder.tsx @@ -117,6 +117,7 @@ export const WatchFolder: React.FC = ({ open, onClose }) => { @@ -255,7 +256,12 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { return ( - + {watch.collectionMapping === "root" ? ( @@ -267,9 +273,7 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { )} - - {watch.folderPath} - + {watch.folderPath} @@ -278,6 +282,8 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { }; const EntryContainer = styled(Box)({ + overflow: "hidden", + textOverflow: "ellipsis", marginLeft: "12px", marginRight: "6px", marginBottom: "12px", @@ -300,6 +306,12 @@ const EntryHeading: React.FC = ({ watch }) => { ); }; +const FolderPath = styled(Typography)(({ theme }) => ({ + overflow: "hidden", + textOverflow: "ellipsis", + color: theme.colors.text.muted, +})); + interface EntryOptionsProps { confirmStopWatching: () => void; } From d7f9851bb25e16c0f7bff817bdb491cdf2d8bb38 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 20 Aug 2024 22:56:11 +0530 Subject: [PATCH 0463/1179] Show ML option to public beta --- .../src/components/Sidebar/Preferences.tsx | 35 +++++++------------ web/packages/new/photos/services/ml/index.ts | 5 --- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/web/apps/photos/src/components/Sidebar/Preferences.tsx b/web/apps/photos/src/components/Sidebar/Preferences.tsx index 2c6e5d204e..41c8a5886d 100644 --- a/web/apps/photos/src/components/Sidebar/Preferences.tsx +++ b/web/apps/photos/src/components/Sidebar/Preferences.tsx @@ -1,4 +1,3 @@ -import { isDesktop } from "@/base/app"; import { EnteDrawer } from "@/base/components/EnteDrawer"; import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; @@ -9,7 +8,6 @@ import { type SupportedLocale, } from "@/base/i18n"; import { MLSettings } from "@/new/photos/components/MLSettings"; -import { canEnableML } from "@/new/photos/services/ml"; import { EnteMenuItem } from "@ente/shared/components/Menu/EnteMenuItem"; import ChevronRight from "@mui/icons-material/ChevronRight"; import ScienceIcon from "@mui/icons-material/Science"; @@ -17,7 +15,7 @@ import { Box, DialogProps, Stack } from "@mui/material"; import DropdownInput from "components/DropdownInput"; import { t } from "i18next"; import { AppContext } from "pages/_app"; -import React, { useContext, useEffect, useState } from "react"; +import React, { useContext, useState } from "react"; import { AdvancedSettings } from "./AdvancedSettings"; import { MapSettings } from "./MapSetting"; import type { SettingsDrawerProps } from "./types"; @@ -31,13 +29,8 @@ export const Preferences: React.FC = ({ const [advancedSettingsView, setAdvancedSettingsView] = useState(false); const [mapSettingsView, setMapSettingsView] = useState(false); - const [showMLSettings, setShowMLSettings] = useState(false); const [openMLSettings, setOpenMLSettings] = useState(false); - useEffect(() => { - if (isDesktop) void canEnableML().then(setShowMLSettings); - }, []); - const openAdvancedSettings = () => setAdvancedSettingsView(true); const closeAdvancedSettings = () => setAdvancedSettingsView(false); @@ -85,21 +78,19 @@ export const Preferences: React.FC = ({ endIcon={} label={t("advanced")} /> - {showMLSettings && ( - - } + + } + /> + + } + onClick={() => setOpenMLSettings(true)} + label={t("ml_search")} /> - - } - onClick={() => setOpenMLSettings(true)} - label={t("ml_search")} - /> - - - )} + +
diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index c9e6ac4e08..8c141ac396 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -149,11 +149,6 @@ const createMLWorker = (electron: Electron): Promise => { */ export const isMLSupported = isDesktop; -/** - * TODO-ML: This will not be needed when we move to a public beta. - */ -export const canEnableML = async () => await isInternalUser(); - /** * Initialize the ML subsystem if the user has enabled it in preferences. */ From 4644bde60d2c5650c6cbb019b45ce8d5c80d7320 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 00:30:14 +0530 Subject: [PATCH 0464/1179] Rename DBs --- web/packages/new/photos/services/ml/db.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index e6ba5fe1bc..f0499a12ca 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -109,8 +109,7 @@ let _mlDB: ReturnType | undefined; const openMLDB = async () => { deleteLegacyDB(); - // TODO-ML: "face" => "ml", v2 => v1 - const db = await openDB("face", 2, { + const db = await openDB("ml", 1, { upgrade(db, oldVersion, newVersion) { log.info(`Upgrading ML DB ${oldVersion} => ${newVersion}`); if (oldVersion < 1) { @@ -118,17 +117,10 @@ const openMLDB = async () => { keyPath: "fileID", }).createIndex("status", "status"); db.createObjectStore("face-index", { keyPath: "fileID" }); - } - if (oldVersion < 2) { db.createObjectStore("clip-index", { keyPath: "fileID" }); + db.createObjectStore("face-cluster", { keyPath: "id" }); + db.createObjectStore("cluster-group", { keyPath: "id" }); } - // TODO-Cluster - // if (oldVersion < 3) { - // if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { - // db.createObjectStore("face-cluster", { keyPath: "id" }); - // db.createObjectStore("cluster-group", { keyPath: "id" }); - // } - // } }, blocking() { log.info( @@ -180,6 +172,12 @@ const deleteLegacyDB = () => { removeKV("embeddingSyncTime:onnx-clip"), removeKV("embeddingSyncTime:file-ml-clip-face"), ]); + + // Delete the legacy face DB v2. + // + // This code was added Aug 2024 (v1.7.3-beta) and can be removed at some + // point when most clients have migrated (tag: Migration). + void deleteDB("face"); }; /** From 371267ee4e36d2cc4d5e81c27ca2d90dcfe4a769 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 00:42:01 +0530 Subject: [PATCH 0465/1179] Lint fix --- web/packages/new/photos/services/ml/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 8c141ac396..20e8f995cd 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -14,7 +14,6 @@ import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; -import { isInternalUser } from "../feature-flags"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { UploadItem } from "../upload/types"; import { regenerateFaceCrops } from "./crop"; From 5f8d0e1f3b93db290dd5fc24bf695eacd041e0da Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:50:17 +0530 Subject: [PATCH 0466/1179] [mob] Fix log --- .../machine_learning/face_ml/face_recognition_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 1db2dfed18..4898fc5f4e 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -148,7 +148,7 @@ class FaceRecognitionService { } // Yield any remaining instructions if (batchToYield.isNotEmpty) { - _logger.info("queueing indexing for $batchToYield.length"); + _logger.info("queueing indexing for ${batchToYield.length}"); yield batchToYield; } } From eb3637deef5cc5788e38b361b6ceebb3b43132d4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 10:28:51 +0530 Subject: [PATCH 0467/1179] [mob] Remove unused method --- mobile/lib/services/user_remote_flag_service.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mobile/lib/services/user_remote_flag_service.dart b/mobile/lib/services/user_remote_flag_service.dart index 98c326e4d7..a3b1e5553c 100644 --- a/mobile/lib/services/user_remote_flag_service.dart +++ b/mobile/lib/services/user_remote_flag_service.dart @@ -55,14 +55,6 @@ class UserRemoteFlagService { return _prefs.getBool(key) ?? defaultValue; } - Future getBoolValue(String key) async { - if (_prefs.containsKey(key)) { - return _prefs.getBool(key)!; - } - return _getValue(key, "false") - .then((value) => value.toLowerCase() == "true"); - } - Future setBoolValue(String key, bool value) async { await _updateKeyValue(key, value.toString()); return _prefs.setBool(key, value); From dd738927fdf05118cdd801722ec8fe37741e3fe4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 10:44:51 +0530 Subject: [PATCH 0468/1179] [mob] Avoid redundant event --- mobile/lib/db/ml/clip_db.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/db/ml/clip_db.dart b/mobile/lib/db/ml/clip_db.dart index 846fdef512..477be3de83 100644 --- a/mobile/lib/db/ml/clip_db.dart +++ b/mobile/lib/db/ml/clip_db.dart @@ -49,6 +49,7 @@ extension ClipDB on MLDataDB { } Future putMany(List embeddings) async { + if (embeddings.isEmpty) return; final db = await MLDataDB.instance.asyncDB; final inputs = embeddings.map((e) => _getRowFromEmbedding(e)).toList(); await db.executeBatch( From 90a7c7604f5bffdb7464488fa15ac772ab19616c Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 12:09:44 +0530 Subject: [PATCH 0469/1179] [mob][auth] Update flutter submodule to use v3.24.0 --- auth/flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/flutter b/auth/flutter index 761747bfc5..80c2e84975 160000 --- a/auth/flutter +++ b/auth/flutter @@ -1 +1 @@ -Subproject commit 761747bfc538b5af34aa0d3fac380f1bc331ec49 +Subproject commit 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 From 69102ab9e8132d578031822434a28e2e48da9b41 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:21:24 +0530 Subject: [PATCH 0470/1179] [mob] Change log --- mobile/lib/generated/intl/messages_en.dart | 14 ++++ mobile/lib/generated/intl/messages_es.dart | 14 ++++ mobile/lib/generated/intl/messages_fr.dart | 14 ++++ mobile/lib/generated/intl/messages_it.dart | 14 ++++ mobile/lib/generated/intl/messages_nl.dart | 14 ++++ mobile/lib/generated/intl/messages_pl.dart | 14 ++++ mobile/lib/generated/intl/messages_pt.dart | 14 ++++ mobile/lib/generated/intl/messages_ru.dart | 14 ++++ mobile/lib/generated/intl/messages_tr.dart | 14 ++++ mobile/lib/generated/intl/messages_zh.dart | 12 ++++ mobile/lib/generated/l10n.dart | 70 +++++++++++++++++++ mobile/lib/l10n/intl_en.arb | 11 ++- mobile/lib/l10n/intl_es.arb | 13 +++- mobile/lib/l10n/intl_fr.arb | 10 ++- mobile/lib/l10n/intl_it.arb | 10 ++- mobile/lib/l10n/intl_nl.arb | 11 ++- mobile/lib/l10n/intl_pl.arb | 10 ++- mobile/lib/l10n/intl_pt.arb | 10 ++- mobile/lib/l10n/intl_ru.arb | 10 ++- mobile/lib/l10n/intl_tr.arb | 11 ++- mobile/lib/l10n/intl_zh.arb | 11 ++- mobile/lib/services/update_service.dart | 2 +- .../notification/update/change_log_page.dart | 17 ++--- 23 files changed, 315 insertions(+), 19 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 96e46d6c32..d7d288c542 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -428,6 +428,20 @@ class MessageLookup extends MessageLookupByLibrary { "Please check your inbox (and spam) to complete verification"), "checkStatus": MessageLookupByLibrary.simpleMessage("Check status"), "checking": MessageLookupByLibrary.simpleMessage("Checking..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Select photos and check out \"Guest view\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far.\nGuest view will lock them into the photos you select."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Guest View"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "We\'ve added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Panorama Viewer"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Introducing a fresh new video player, with better playback controls and support for HDR videos."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Video Player"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Claim free storage"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim more!"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 857b10f70a..58a96a9359 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -443,6 +443,20 @@ class MessageLookup extends MessageLookupByLibrary { "Revisa tu bandeja de entrada (y spam) para completar la verificación"), "checkStatus": MessageLookupByLibrary.simpleMessage("Comprobar estado"), "checking": MessageLookupByLibrary.simpleMessage("Comprobando..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Selecciona fotos y prueba la \"Vista de Invitado\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "¿Vas a mostrar fotos a un amigo? No te preocupes por si desliza demasiado. La vista de invitado bloqueará las fotos que selecciones."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Vista de Invitado"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Visor Panorámico"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Reproductor de Video"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Reclamar almacenamiento gratis"), "claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index cc0feb9555..c1cdf8742f 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -417,6 +417,20 @@ class MessageLookup extends MessageLookupByLibrary { "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Veuillez consulter votre boîte de courriels (et les indésirables) pour compléter la vérification"), "checking": MessageLookupByLibrary.simpleMessage("Vérification..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Sélectionnez des photos et essayez la \"Vue Invité\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Vous montrez des photos à un ami ? Pas de souci, il ne pourra pas trop faire défiler. La vue invité verrouille les photos que vous sélectionnez."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Vue Invité"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L\'expérience est immersive avec une navigation basée sur le mouvement !"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Visionneuse Panorama"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Lecteur Vidéo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Réclamer le stockage gratuit"), "claimMore": MessageLookupByLibrary.simpleMessage("Réclamez plus !"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 1681da9726..975b8707f1 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -404,6 +404,20 @@ class MessageLookup extends MessageLookupByLibrary { "Per favore, controlla la tua casella di posta (e lo spam) per completare la verifica"), "checking": MessageLookupByLibrary.simpleMessage("Controllo in corso..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Seleziona le foto e prova la \"Vista Ospite\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Mostri le foto a un amico? Non preoccuparti che scorrano troppo lontano. La vista ospite bloccherà le foto che selezioni."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Vista Ospite"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L\'esperienza è immersiva con la navigazione basata sul movimento!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Visualizzatore Panoramico"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Lettore Video"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Richiedi spazio gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Richiedine di più!"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index b68312d437..93084929e9 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -443,6 +443,20 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Status controleren"), "checking": MessageLookupByLibrary.simpleMessage("Controleren..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Selecteer foto\'s en bekijk de \"Gastweergave\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Geef je je telefoon aan een vriend om foto\'s te laten zien? Maak je geen zorgen dat ze te ver swipen. Gastweergave vergrendelt ze op de foto\'s die je selecteert."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Gastweergave"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto\'s met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Panorama Viewer"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video\'s."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Videospeler"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Claim gratis opslag"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim meer!"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 9a3dec20ad..af182fa521 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -442,6 +442,20 @@ class MessageLookup extends MessageLookupByLibrary { "Sprawdź swoją skrzynkę odbiorczą (i spam), aby zakończyć weryfikację"), "checkStatus": MessageLookupByLibrary.simpleMessage("Sprawdź stan"), "checking": MessageLookupByLibrary.simpleMessage("Sprawdzanie..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Wybierz zdjęcia i sprawdź \"Widok Gościa\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Pokazujesz zdjęcia znajomemu? Nie martw się, że przesunie za daleko. Widok gościa zablokuje wybrane przez Ciebie zdjęcia."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Widok Gościa"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Przeglądarka Panoramy"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Odtwarzacz Wideo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Odbierz bezpłatną przestrzeń dyskową"), "claimMore": MessageLookupByLibrary.simpleMessage("Zdobądź więcej!"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 9c5b8d3f92..e859f385e6 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -440,6 +440,20 @@ class MessageLookup extends MessageLookupByLibrary { "Verifique sua caixa de entrada (e spam) para concluir a verificação"), "checkStatus": MessageLookupByLibrary.simpleMessage("Verificar status"), "checking": MessageLookupByLibrary.simpleMessage("Verificando..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Selecione as fotos e experimente o \"Modo Convidado\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Vai mostrar fotos a um amigo? Não se preocupe com ele deslizando demais. O modo convidado bloqueará as fotos que você selecionar."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Modo Convidado"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Visualizador Panorâmico"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Reprodutor de Vídeo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Reivindicar armazenamento gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Reivindique mais!"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 506d3726f5..a8caef60fc 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -438,6 +438,20 @@ class MessageLookup extends MessageLookupByLibrary { "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения верификации"), "checkStatus": MessageLookupByLibrary.simpleMessage("Проверить статус"), "checking": MessageLookupByLibrary.simpleMessage("Проверка..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Выберите фото и попробуйте \"Режим гостя\"."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Показываете фото другу? Не переживайте, что он листнет слишком далеко. Режим гостя заблокирует те фото, которые вы выбрали."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Режим гостя"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Просмотр Панорамы"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Видеоплеер"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Получить бесплатное хранилище"), "claimMore": MessageLookupByLibrary.simpleMessage("Получите больше!"), diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 481534b2c0..b56f297256 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -436,6 +436,20 @@ class MessageLookup extends MessageLookupByLibrary { "Lütfen doğrulama işlemini tamamlamak için gelen kutunuzu (ve spam klasörünüzü) kontrol edin"), "checkStatus": MessageLookupByLibrary.simpleMessage("Check status"), "checking": MessageLookupByLibrary.simpleMessage("Kontrol ediliyor..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Fotoğrafları seçin ve \"Misafir Görünümü\"nü deneyin."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Telefonunuzu bir arkadaşınıza fotoğraf göstermek için mi veriyorsunuz? Fazla kaydırmasından endişelenmeyin. Misafir görünümü seçtiğiniz fotoğraflarla sınırlı kalır."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Misafir Görünümü"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Panorama Görüntüleyici"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Video Oynatıcı"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Bedava alan talep edin"), "claimMore": MessageLookupByLibrary.simpleMessage("Arttır!"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 49f04cd803..f64e6c04f5 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -380,6 +380,18 @@ class MessageLookup extends MessageLookupByLibrary { "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证"), "checkStatus": MessageLookupByLibrary.simpleMessage("检查状态"), "checking": MessageLookupByLibrary.simpleMessage("正在检查..."), + "cl_guest_view_call_to_action": + MessageLookupByLibrary.simpleMessage("选择照片并查看\"访客视图\"。"), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "要把手机递给朋友看照片?别担心他们滑动太远。访客视图将锁定您选择的照片。"), + "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("访客视图"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("全景查看器"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。"), + "cl_video_player_title": MessageLookupByLibrary.simpleMessage("视频播放器"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("领取免费存储"), "claimMore": MessageLookupByLibrary.simpleMessage("领取更多!"), "claimed": MessageLookupByLibrary.simpleMessage("已领取"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index f0b468cfe4..51b8974d54 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9364,6 +9364,76 @@ class S { args: [], ); } + + /// `Guest View` + String get cl_guest_view_title { + return Intl.message( + 'Guest View', + name: 'cl_guest_view_title', + desc: '', + args: [], + ); + } + + /// `Handing over your phone to show photos to a friend? Don't worry about them swiping too far.\nGuest view will lock them into the photos you select.` + String get cl_guest_view_description { + return Intl.message( + 'Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far.\nGuest view will lock them into the photos you select.', + name: 'cl_guest_view_description', + desc: '', + args: [], + ); + } + + /// `Select photos and check out "Guest view".` + String get cl_guest_view_call_to_action { + return Intl.message( + 'Select photos and check out "Guest view".', + name: 'cl_guest_view_call_to_action', + desc: '', + args: [], + ); + } + + /// `Panorama Viewer` + String get cl_panorama_viewer_title { + return Intl.message( + 'Panorama Viewer', + name: 'cl_panorama_viewer_title', + desc: '', + args: [], + ); + } + + /// `We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!` + String get cl_panorama_viewer_description { + return Intl.message( + 'We\'ve added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!', + name: 'cl_panorama_viewer_description', + desc: '', + args: [], + ); + } + + /// `Video Player` + String get cl_video_player_title { + return Intl.message( + 'Video Player', + name: 'cl_video_player_title', + desc: '', + args: [], + ); + } + + /// `Introducing a fresh new video player, with better playback controls and support for HDR videos.` + String get cl_video_player_description { + return Intl.message( + 'Introducing a fresh new video player, with better playback controls and support for HDR videos.', + name: 'cl_video_player_description', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index ac4a24a330..973f57df64 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1302,5 +1302,14 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Guest View", + "cl_guest_view_description": "Handing over your phone to show photos to a friend? Don't worry about them swiping too far.\nGuest view will lock them into the photos you select.", + "cl_guest_view_call_to_action": "Select photos and check out \"Guest view\".", + "cl_panorama_viewer_title": "Panorama Viewer", + "cl_panorama_viewer_description": "We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!", + "cl_video_player_title": "Video Player", + "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos." + } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index b155e61648..ed3145afe1 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1280,5 +1280,16 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + + "cl_guest_view_title": "Vista de Invitado", + "cl_guest_view_description": "¿Vas a mostrar fotos a un amigo? No te preocupes por si desliza demasiado. La vista de invitado bloqueará las fotos que selecciones.", + "cl_guest_view_call_to_action": "Selecciona fotos y prueba la \"Vista de Invitado\".", + "cl_panorama_viewer_title": "Visor Panorámico", + "cl_panorama_viewer_description": "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!", + "cl_video_player_title": "Reproductor de Video", + "cl_video_player_description": "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR." + + } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 17cd11d67e..c3e0e34422 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1197,5 +1197,13 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Vue Invité", + "cl_guest_view_description": "Vous montrez des photos à un ami ? Pas de souci, il ne pourra pas trop faire défiler. La vue invité verrouille les photos que vous sélectionnez.", + "cl_guest_view_call_to_action": "Sélectionnez des photos et essayez la \"Vue Invité\".", + "cl_panorama_viewer_title": "Visionneuse Panorama", + "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec une navigation basée sur le mouvement !", + "cl_video_player_title": "Lecteur Vidéo", + "cl_video_player_description": "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 461eab3ae4..05eccc0c2a 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1159,5 +1159,13 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Vista Ospite", + "cl_guest_view_description": "Mostri le foto a un amico? Non preoccuparti che scorrano troppo lontano. La vista ospite bloccherà le foto che selezioni.", + "cl_guest_view_call_to_action": "Seleziona le foto e prova la \"Vista Ospite\".", + "cl_panorama_viewer_title": "Visualizzatore Panoramico", + "cl_panorama_viewer_description": "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L'esperienza è immersiva con la navigazione basata sul movimento!", + "cl_video_player_title": "Lettore Video", + "cl_video_player_description": "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index c28472819a..06d01889cd 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1311,5 +1311,14 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Gastweergave", + "cl_guest_view_description": "Geef je je telefoon aan een vriend om foto's te laten zien? Maak je geen zorgen dat ze te ver swipen. Gastweergave vergrendelt ze op de foto's die je selecteert.", + "cl_guest_view_call_to_action": "Selecteer foto's en bekijk de \"Gastweergave\".", + "cl_panorama_viewer_title": "Panorama Viewer", + "cl_panorama_viewer_description": "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto's met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!", + "cl_video_player_title": "Videospeler", + "cl_video_player_description": "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video's." + } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 2264fed9e6..4ae94cc21d 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1292,5 +1292,13 @@ "removePublicLinks": "Usuń linki publiczne", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Spowoduje to usunięcie publicznych linków wszystkich zaznaczonych szybkich linków.", "guestView": "Widok gościa", - "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu." + "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu.", + + "cl_guest_view_title": "Widok Gościa", + "cl_guest_view_description": "Pokazujesz zdjęcia znajomemu? Nie martw się, że przesunie za daleko. Widok gościa zablokuje wybrane przez Ciebie zdjęcia.", + "cl_guest_view_call_to_action": "Wybierz zdjęcia i sprawdź \"Widok Gościa\".", + "cl_panorama_viewer_title": "Przeglądarka Panoramy", + "cl_panorama_viewer_description": "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!", + "cl_video_player_title": "Odtwarzacz Wideo", + "cl_video_player_description": "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index a020feb08a..7d4b92075a 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1306,5 +1306,13 @@ "removePublicLinks": "Remover link público", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Isto removerá links públicos de todos os links rápidos selecionados.", "guestView": "Visão de convidado", - "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo." + "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", + + "cl_guest_view_title": "Modo Convidado", + "cl_guest_view_description": "Vai mostrar fotos a um amigo? Não se preocupe com ele deslizando demais. O modo convidado bloqueará as fotos que você selecionar.", + "cl_guest_view_call_to_action": "Selecione as fotos e experimente o \"Modo Convidado\".", + "cl_panorama_viewer_title": "Visualizador Panorâmico", + "cl_panorama_viewer_description": "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!", + "cl_video_player_title": "Reprodutor de Vídeo", + "cl_video_player_description": "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index fa50b08f96..a1986ee7d6 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1279,5 +1279,13 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Режим гостя", + "cl_guest_view_description": "Показываете фото другу? Не переживайте, что он листнет слишком далеко. Режим гостя заблокирует те фото, которые вы выбрали.", + "cl_guest_view_call_to_action": "Выберите фото и попробуйте \"Режим гостя\".", + "cl_panorama_viewer_title": "Просмотр Панорамы", + "cl_panorama_viewer_description": "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!", + "cl_video_player_title": "Видеоплеер", + "cl_video_player_description": "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 0874270399..3020d4e924 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1289,5 +1289,14 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + + "cl_guest_view_title": "Misafir Görünümü", + "cl_guest_view_description": "Telefonunuzu bir arkadaşınıza fotoğraf göstermek için mi veriyorsunuz? Fazla kaydırmasından endişelenmeyin. Misafir görünümü seçtiğiniz fotoğraflarla sınırlı kalır.", + "cl_guest_view_call_to_action": "Fotoğrafları seçin ve \"Misafir Görünümü\"nü deneyin.", + "cl_panorama_viewer_title": "Panorama Görüntüleyici", + "cl_panorama_viewer_description": "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!", + "cl_video_player_title": "Video Oynatıcı", + "cl_video_player_description": "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz." + } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 5ff7b87bc4..a418f1b1ae 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1306,5 +1306,14 @@ "removePublicLinks": "删除公开链接", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "这将删除所有选定的快速链接的公共链接。", "guestView": "访客视图", - "guestViewEnablePreSteps": "要启用访客视图,请在系统设置中设置设备密码或屏幕锁。" + "guestViewEnablePreSteps": "要启用访客视图,请在系统设置中设置设备密码或屏幕锁。", + + "cl_guest_view_title": "访客视图", + "cl_guest_view_description": "要把手机递给朋友看照片?别担心他们滑动太远。访客视图将锁定您选择的照片。", + "cl_guest_view_call_to_action": "选择照片并查看\"访客视图\"。", + "cl_panorama_viewer_title": "全景查看器", + "cl_panorama_viewer_description": "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!", + "cl_video_player_title": "视频播放器", + "cl_video_player_description": "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。" + } \ No newline at end of file diff --git a/mobile/lib/services/update_service.dart b/mobile/lib/services/update_service.dart index 54e685347f..e31d8c9e55 100644 --- a/mobile/lib/services/update_service.dart +++ b/mobile/lib/services/update_service.dart @@ -16,7 +16,7 @@ class UpdateService { static final UpdateService instance = UpdateService._privateConstructor(); static const kUpdateAvailableShownTimeKey = "update_available_shown_time_key"; static const changeLogVersionKey = "update_change_log_key"; - static const currentChangeLogVersion = 21; + static const currentChangeLogVersion = 22; LatestVersionInfo? _latestVersion; final _logger = Logger("UpdateService"); diff --git a/mobile/lib/ui/notification/update/change_log_page.dart b/mobile/lib/ui/notification/update/change_log_page.dart index 2f9254af69..b20bb433f3 100644 --- a/mobile/lib/ui/notification/update/change_log_page.dart +++ b/mobile/lib/ui/notification/update/change_log_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/l10n/l10n.dart"; import 'package:photos/services/update_service.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; @@ -43,7 +44,7 @@ class _ChangeLogPageState extends State { const SizedBox( height: 24, ), - Expanded(child: _getChangeLog()), + Expanded(child: _getChangeLog(context)), const DividerWidget( dividerType: DividerType.solid, ), @@ -109,21 +110,21 @@ class _ChangeLogPageState extends State { ); } - Widget _getChangeLog() { + Widget _getChangeLog(BuildContext ctx) { final scrollController = ScrollController(); final List items = []; items.addAll([ ChangeLogEntry( - "Custom App Lock ✨", - 'Now choose from PIN, password or the default system lock to lock the app. You can set this up in Settings > Security > App lock.', + ctx.l10n.cl_guest_view_title, + '${ctx.l10n.cl_guest_view_description}\n\n${ctx.l10n.cl_guest_view_call_to_action}', ), ChangeLogEntry( - "Select All ✨", - "Selecting all files from gallery made easy with just one click! Select any item from gallery to see the option.", + ctx.l10n.cl_panorama_viewer_title, + ctx.l10n.cl_panorama_viewer_description, ), ChangeLogEntry( - "Bug Fixes", - "Many a bugs were squashed in this release. If you run into any bugs, please write to team@ente.io, or let us know on Discord! 🙏", + ctx.l10n.cl_video_player_title, + ctx.l10n.cl_video_player_description, ), ]); From c68691abbb1c309fb0ab10173a84047beb87de9f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 12:35:01 +0530 Subject: [PATCH 0471/1179] [mob][photos] Modify SelectionActionButton to render icons from an svg asset --- .../selection_action_button_widget.dart | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/mobile/lib/ui/components/bottom_action_bar/selection_action_button_widget.dart b/mobile/lib/ui/components/bottom_action_bar/selection_action_button_widget.dart index 12a744848e..43d94aea41 100644 --- a/mobile/lib/ui/components/bottom_action_bar/selection_action_button_widget.dart +++ b/mobile/lib/ui/components/bottom_action_bar/selection_action_button_widget.dart @@ -1,24 +1,29 @@ import 'dart:math' as math; import "package:flutter/material.dart"; +import "package:flutter_svg/svg.dart"; import "package:photos/theme/ente_theme.dart"; +/// Pass icon or asset path of svg class SelectionActionButton extends StatelessWidget { final String labelText; - final IconData icon; + final IconData? icon; + final String? svgAssetPath; final VoidCallback? onTap; final bool shouldShow; const SelectionActionButton({ required this.labelText, - required this.icon, required this.onTap, + this.icon, + this.svgAssetPath, this.shouldShow = true, super.key, }); @override Widget build(BuildContext context) { + assert(icon != null || svgAssetPath != null); return AnimatedSize( duration: const Duration(milliseconds: 350), curve: Curves.easeInOutCirc, @@ -29,6 +34,7 @@ class SelectionActionButton extends StatelessWidget { labelText: labelText, icon: icon, onTap: onTap, + svgAssetPath: svgAssetPath, ) : const SizedBox( height: 60, @@ -40,12 +46,14 @@ class SelectionActionButton extends StatelessWidget { class _Body extends StatefulWidget { final String labelText; - final IconData icon; + final IconData? icon; + final String? svgAssetPath; final VoidCallback? onTap; const _Body({ required this.labelText, - required this.icon, required this.onTap, + this.icon, + this.svgAssetPath, }); @override @@ -121,11 +129,21 @@ class __BodyState extends State<_Body> { ), ) else - Icon( - widget.icon, - size: 24, - color: getEnteColorScheme(context).textMuted, - ), + widget.svgAssetPath != null + ? SvgPicture.asset( + widget.svgAssetPath!, + colorFilter: ColorFilter.mode( + getEnteColorScheme(context).textMuted, + BlendMode.srcIn, + ), + width: 24, + height: 24, + ) + : Icon( + widget.icon, + size: 24, + color: getEnteColorScheme(context).textMuted, + ), const SizedBox(height: 4), Text( widget.labelText, From 5ac92f5ce4152e4168836ac2655ab9435495d9cd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:42:10 +0530 Subject: [PATCH 0472/1179] [server] Fix skip log check --- server/pkg/middleware/request_logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/middleware/request_logger.go b/server/pkg/middleware/request_logger.go index 360ecbbc3c..15dfbdf554 100644 --- a/server/pkg/middleware/request_logger.go +++ b/server/pkg/middleware/request_logger.go @@ -38,7 +38,7 @@ func shouldSkipBodyLog(method string, path string) bool { if path == "/user-entity/entity" && (method == "POST" || method == "PUT") { return true } - if path == "files/data" && method == "PUT" { + if path == "/files/data" && method == "PUT" { return true } return false From bb65354ac7f178564a0f0f9aa5abb46bdb7d002d Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 13:03:25 +0530 Subject: [PATCH 0473/1179] [mob][photos] Change guest view icon at all places --- mobile/assets/icons/guest_view_icon.svg | 6 ++++ .../file_selection_actions_widget.dart | 2 +- mobile/lib/ui/viewer/file/file_app_bar.dart | 11 ++++-- mobile/pubspec.lock | 36 +++++++++---------- mobile/pubspec.yaml | 1 + 5 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 mobile/assets/icons/guest_view_icon.svg diff --git a/mobile/assets/icons/guest_view_icon.svg b/mobile/assets/icons/guest_view_icon.svg new file mode 100644 index 0000000000..98ff43fac9 --- /dev/null +++ b/mobile/assets/icons/guest_view_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index 29b71de3f9..bca7aa35e7 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -275,7 +275,7 @@ class _FileSelectionActionsWidgetState } items.add( SelectionActionButton( - icon: Icons.people_outline_rounded, + svgAssetPath: "assets/icons/guest_view_icon.svg", labelText: S.of(context).guestView, onTap: _onGuestViewClick, ), diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 8fbf260bca..362868eeec 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -2,6 +2,7 @@ import "dart:async"; import 'dart:io'; import 'package:flutter/material.dart'; +import "package:flutter_svg/flutter_svg.dart"; import "package:local_auth/local_auth.dart"; import 'package:logging/logging.dart'; import 'package:media_extension/media_extension.dart'; @@ -18,6 +19,7 @@ import 'package:photos/models/selected_files.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/hidden_service.dart'; import "package:photos/services/local_authentication_service.dart"; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/ui/viewer/file/custom_app_bar.dart'; import "package:photos/ui/viewer/file_details/favorite_widget.dart"; @@ -298,9 +300,12 @@ class FileAppBarState extends State { value: 6, child: Row( children: [ - Icon( - Icons.people_outline_rounded, - color: Theme.of(context).iconTheme.color, + SvgPicture.asset( + "assets/icons/guest_view_icon.svg", + colorFilter: ColorFilter.mode( + getEnteColorScheme(context).textBase, + BlendMode.srcIn, + ), ), const Padding( padding: EdgeInsets.all(8), diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 0bb93644b3..a91ffe157b 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1296,18 +1296,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -1440,10 +1440,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" media_extension: dependency: "direct main" description: @@ -1528,10 +1528,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mgrs_dart: dependency: transitive description: @@ -1885,10 +1885,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: @@ -2394,26 +2394,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.0" timezone: dependency: transitive description: @@ -2692,10 +2692,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.1" volume_controller: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 20297b2b39..9d511c2ffa 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -250,6 +250,7 @@ flutter: - assets/ - assets/models/clip/ - assets/video-editor/ + - assets/icons/ fonts: - family: Inter fonts: From d27dffc3518f1f12888dadea92dcac81dd52d253 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 13:43:39 +0530 Subject: [PATCH 0474/1179] [mob][photos] upgrade flutter_local_notifications --- auth/pubspec.lock | 12 ++++++------ auth/pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 9475f9b77c..5e425ae12f 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -557,26 +557,26 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "55b9b229307a10974b26296ff29f2e132256ba4bd74266939118eaefa941cb00" + sha256: c500d5d9e7e553f06b61877ca6b9c8b92c570a4c8db371038702e8ce57f8a50f url: "https://pub.dev" source: hosted - version: "16.3.3" + version: "17.2.2" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af url: "https://pub.dev" source: hosted - version: "4.0.0+1" + version: "4.0.1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.0" flutter_localizations: dependency: "direct main" description: flutter diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 9a4ddc7fb3..1e0e3ffb05 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -52,7 +52,7 @@ dependencies: git: url: https://github.com/eaceto/flutter_local_authentication ref: 1ac346a04592a05fd75acccf2e01fa3c7e955d96 - flutter_local_notifications: ^16.3.1+1 + flutter_local_notifications: ^17.2.2 flutter_localizations: sdk: flutter flutter_native_splash: ^2.2.13 From 5ad6f0bd741e1e7b66556f8300e531606c0de7e2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:44:30 +0530 Subject: [PATCH 0475/1179] [server] Fix statusCode for expired sessions --- server/ente/errors.go | 2 ++ server/pkg/repo/passkey/passkey.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server/ente/errors.go b/server/ente/errors.go index effeaee252..696a764f34 100644 --- a/server/ente/errors.go +++ b/server/ente/errors.go @@ -189,6 +189,8 @@ const ( // MaxPasskeysReached is thrown when user attempts to create more than max allowed passkeys MaxPasskeysReached ErrorCode = "MAX_PASSKEYS_REACHED" + + SessionExpired ErrorCode = "SESSION_EXPIRED" ) type ApiError struct { diff --git a/server/pkg/repo/passkey/passkey.go b/server/pkg/repo/passkey/passkey.go index 603c3ab26c..2a517e7bd0 100644 --- a/server/pkg/repo/passkey/passkey.go +++ b/server/pkg/repo/passkey/passkey.go @@ -377,7 +377,7 @@ func (r *Repository) FinishAuthentication(user *ente.User, req *http.Request, se } if time.Now().After(sessionData.Expires) { - err = stacktrace.NewError("session expired") + err = &ente.ApiError{Code: ente.SessionExpired, Message: "Session expired", HttpStatusCode: http.StatusGone} return } From 2eb6d914c3d68e8ba487a4fc6c5c877191ad7d9e Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Wed, 21 Aug 2024 08:22:08 +0000 Subject: [PATCH 0476/1179] New Crowdin translations by GitHub Action --- web/packages/base/locales/fr-FR/translation.json | 6 +++--- web/packages/base/locales/nl-NL/translation.json | 2 +- web/packages/base/locales/pl-PL/translation.json | 2 +- web/packages/base/locales/pt-BR/translation.json | 2 +- web/packages/base/locales/zh-CN/translation.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index bb46d32835..5f498d9204 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -52,8 +52,8 @@ "import": "Importer", "ADD_PHOTOS": "Ajouter des photos", "ADD_MORE_PHOTOS": "Ajouter plus de photos", - "add_photos_count_one": "Ajouter une photo", - "add_photos_count": "Ajouter {{count, number}} photos", + "add_photos_count_one": "Ajouter 1 élément", + "add_photos_count": "Ajouter {{count, number}} éléments", "select_photos": "Sélectionner des photos", "FILE_UPLOAD": "Fichier chargé", "UPLOAD_STAGE_MESSAGE": { @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "", "ml_consent": "Activer l'apprentissage automatique", "ml_consent_title": "Activer l'apprentissage automatique ?", - "ml_consent_description": "

Si vous activez l'apprentissage automatique, Ente extraira de vos photos des informations comme la géométrie des visages. Cela se fera sur votre appareil, avec un cryptage de bout-en-bout de toutes les données biométriques générées.

Veuillez cliquer ici pour accéder à notre politique de confidentialité, vous y trouverez plus de détails concernant cette fonction

", + "ml_consent_description": "", "ml_consent_confirmation": "Je comprends, et souhaite activer l'apprentissage automatique", "labs": "Labo", "YOURS": "Le vôtre", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 1230753848..ab63afd8ba 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "Wil je machine learning op al je apparaten uitschakelen?", "ml_consent": "Schakel machine learning in", "ml_consent_title": "Schakel machine learning in?", - "ml_consent_description": "

Als u machine learning inschakelt, analyseert Ente de gezichtsgeometrie uit uw foto's. Dit gebeurt op uw apparaat en alle gegenereerde biometrische gegevens worden end-to-end versleuteld en blijven privé.

Klik hier voor meer informatie over deze functie in ons privacybeleid

", + "ml_consent_description": "", "ml_consent_confirmation": "Ik begrijp het en wil machine learning inschakelen", "labs": "Lab's", "YOURS": "jouw", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 01a42c7588..2bf6775c9a 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "Czy chcesz wyłączyć uczenie maszynowe na wszystkich Twoich urządzeniach?", "ml_consent": "Włącz uczenie maszynowe", "ml_consent_title": "Włączyć uczenie maszynowe?", - "ml_consent_description": "

Jeśli włączysz uczenie maszynowe, Ente wyodrębni informacje takie jak geometria twarzy z Twoich zdjęć. Będzie to miało miejsce na Twoim urządzeniu, a wygenerowane informacje biometryczne będą szyfrowane end-to-end.

Kliknij tutaj, aby uzyskać więcej informacji na temat tej funkcji w naszej polityce prywatności

", + "ml_consent_description": "

Jeśli włączysz uczenie maszynowe, Ente wyodrębni informacje takie jak geometria twarzy z plików, w tym udostępnionych z Tobą.

Będzie to miało miejsce na Twoim urządzeniu, a wygenerowane informacje biometryczne będą zaszyfrowane end-to-end.

Kliknij tutaj, aby uzyskać więcej informacji na temat tej funkcji w naszej polityce prywatności

", "ml_consent_confirmation": "Rozumiem i chcę włączyć uczenie maszynowe", "labs": "Laboratoria", "YOURS": "twoje", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 8819b114fd..c39ba9237a 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "Você deseja desativar o aprendizado de máquina em todos os seus dispositivos?", "ml_consent": "Habilitar aprendizado de máquina", "ml_consent_title": "Habilitar aprendizado de máquina?", - "ml_consent_description": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos. Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", + "ml_consent_description": "", "ml_consent_confirmation": "Eu entendo, e desejo habilitar o aprendizado de máquina", "labs": "Laboratórios", "YOURS": "seu", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index fc592f6026..9d585e7394 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -492,7 +492,7 @@ "ml_search_disable_confirm": "您想在所有设备上禁用机器学习吗?", "ml_consent": "启用机器学习", "ml_consent_title": "要启用机器学习吗?", - "ml_consent_description": "

如果您启用机器学习,Ente 将从您的所有照片中提取面部几何形状等信息。这将在您的设备上进行,并且任何生成的生物特征信息都将被端到端加密。

请点击此处查看我们的隐私政策中有关此功能的更多详细信息

", + "ml_consent_description": "

如果您启用机器学习,Ente 将从文件(包括与您共享的文件)中提取面部几何形状等信息。

这将在您的设备上发生,并且任何生成的生物特征信息都会被端到端加密。

请点击此处查看我们的隐私政策中有关此功能的更多详细信息

", "ml_consent_confirmation": "我了解了,并希望启用机器学习", "labs": "实验室", "YOURS": "你的", From b202ac0b5e865cde5b4ce8f6a2777f725d903bcc Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 13:56:08 +0530 Subject: [PATCH 0477/1179] photosd-v1.7.3 --- desktop/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index 4b4933c666..1136762943 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -1,10 +1,9 @@ # CHANGELOG -## v1.7.3 (Unreleased) +## v1.7.3 - Face recognition and magic search (public beta). - Support Polish translations. -- . ## v1.7.2 From 268eeab09467b378646f46d48a92deace9889bac Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:15:58 +0530 Subject: [PATCH 0478/1179] [mob] Avoid refreshing cache unless search is initiated --- .../semantic_search/semantic_search_service.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 25e5acc9be..c3be31ddd3 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -44,6 +44,7 @@ class SemanticSearchService { bool _hasInitialized = false; bool _textModelIsLoaded = false; List _cachedImageEmbeddings = []; + bool _isCacheRefreshPending = true; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -57,12 +58,9 @@ class SemanticSearchService { } _hasInitialized = true; - await _loadImageEmbeddings(); + await _refreshClipCache(); Bus.instance.on().listen((event) { - if (!_hasInitialized) return; - _reloadCacheDebouncer.run(() async { - await _loadImageEmbeddings(); - }); + _isCacheRefreshPending = true; }); unawaited(_loadTextModel(delay: true)); @@ -77,6 +75,7 @@ class SemanticSearchService { // searchScreenQuery should only be used for the user initiate query on the search screen. // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { + await _refreshClipCache(); if (!isMagicSearchEnabledAndReady()) { if (flagService.internalUser) { _logger.info( @@ -114,7 +113,11 @@ class SemanticSearchService { _logger.info("Indexes cleared"); } - Future _loadImageEmbeddings() async { + Future _refreshClipCache() async { + if (_isCacheRefreshPending == false) { + return; + } + _isCacheRefreshPending = false; _logger.info("Pulling cached embeddings"); final startTime = DateTime.now(); _cachedImageEmbeddings = await MLDataDB.instance.getAll(); From 3f3f3202afc1a88c52b179721822587c38ded227 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:21:25 +0530 Subject: [PATCH 0479/1179] [mob] Clean up --- .../semantic_search_service.dart | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index c3be31ddd3..a9d8eced29 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -21,8 +21,6 @@ import "package:photos/services/machine_learning/face_ml/face_clustering/cosine_ import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; -import "package:photos/utils/debouncer.dart"; -import "package:photos/utils/ml_util.dart"; import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { @@ -36,15 +34,10 @@ class SemanticSearchService { final LRUMap> _queryCache = LRUMap(20); static const kMinimumSimilarityThreshold = 0.175; - final _reloadCacheDebouncer = Debouncer( - const Duration(milliseconds: 4000), - executionInterval: const Duration(milliseconds: 8000), - ); - bool _hasInitialized = false; bool _textModelIsLoaded = false; - List _cachedImageEmbeddings = []; bool _isCacheRefreshPending = true; + List _cachedImageEmbeddings = []; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -130,14 +123,6 @@ class SemanticSearchService { .info("Cached embeddings: " + _cachedImageEmbeddings.length.toString()); } - Future> _getFileIDsToBeIndexed() async { - final uploadedFileIDs = await getIndexableFileIDs(); - final embeddedFileIDs = await MLDataDB.instance.getIndexedFileIds(); - embeddedFileIDs.removeWhere((key, value) => value < clipMlVersion); - - return uploadedFileIDs.difference(embeddedFileIDs.keys.toSet()).toList(); - } - Future> getMatchingFiles( String query, { double? scoreThreshold, From d75a1c367df8a7ac6f173a599b0bcd3f1af472e3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 14:44:53 +0530 Subject: [PATCH 0480/1179] photosd-v1.7.3 Completes the accidentally leftover package.json update in b202ac0b5e865cde5b4ce8f6a2777f725d903bcc --- desktop/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/package.json b/desktop/package.json index c3da2c3591..db4cb7ec58 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "ente", - "version": "1.7.3-beta", + "version": "1.7.3", "private": true, "description": "Desktop client for Ente Photos", "repository": "github:ente-io/photos-desktop", From 77bd056f40850342979ecd8f557425e8ed260bf3 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 14:53:35 +0530 Subject: [PATCH 0481/1179] [mob][auth] generated code on running flutter clean and flutter pub get --- auth/ios/Podfile.lock | 3 ++- auth/ios/Runner/AppDelegate.swift | 2 +- auth/macos/Flutter/GeneratedPluginRegistrant.swift | 2 ++ auth/macos/Podfile.lock | 7 +++++++ auth/macos/Runner/AppDelegate.swift | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/auth/ios/Podfile.lock b/auth/ios/Podfile.lock index 6771876859..23d01f74c0 100644 --- a/auth/ios/Podfile.lock +++ b/auth/ios/Podfile.lock @@ -67,6 +67,7 @@ PODS: - Toast - local_auth_darwin (0.0.1): - Flutter + - FlutterMacOS - move_to_background (0.0.1): - Flutter - MTBBarcodeScanner (5.0.11) @@ -238,7 +239,7 @@ SPEC CHECKSUMS: flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778 flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c - local_auth_darwin: 4d56c90c2683319835a61274b57620df9c4520ab + local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c diff --git a/auth/ios/Runner/AppDelegate.swift b/auth/ios/Runner/AppDelegate.swift index 3fdfc73894..3c8ec3ec68 100644 --- a/auth/ios/Runner/AppDelegate.swift +++ b/auth/ios/Runner/AppDelegate.swift @@ -2,7 +2,7 @@ import Flutter import UIKit import app_links -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/auth/macos/Flutter/GeneratedPluginRegistrant.swift b/auth/macos/Flutter/GeneratedPluginRegistrant.swift index 5d8c36991d..6c82e1dcac 100644 --- a/auth/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/auth/macos/Flutter/GeneratedPluginRegistrant.swift @@ -14,6 +14,7 @@ import flutter_inappwebview_macos import flutter_local_authentication import flutter_local_notifications import flutter_secure_storage_macos +import local_auth_darwin import package_info_plus import path_provider_foundation import screen_retriever @@ -37,6 +38,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterLocalAuthenticationPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalAuthenticationPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) diff --git a/auth/macos/Podfile.lock b/auth/macos/Podfile.lock index b75b31cb91..74e08546c8 100644 --- a/auth/macos/Podfile.lock +++ b/auth/macos/Podfile.lock @@ -20,6 +20,9 @@ PODS: - flutter_secure_storage_macos (6.1.1): - FlutterMacOS - FlutterMacOS (1.0.0) + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS - OrderedSet (5.0.0) - package_info_plus (0.0.1): - FlutterMacOS @@ -80,6 +83,7 @@ DEPENDENCIES: - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) @@ -121,6 +125,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos FlutterMacOS: :path: Flutter/ephemeral + local_auth_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos path_provider_foundation: @@ -157,6 +163,7 @@ SPEC CHECKSUMS: flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 diff --git a/auth/macos/Runner/AppDelegate.swift b/auth/macos/Runner/AppDelegate.swift index 218f93e023..a6f73a80ad 100644 --- a/auth/macos/Runner/AppDelegate.swift +++ b/auth/macos/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return false From 50094536593cc9d62be9275717ba2cc2e8cea64d Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Wed, 21 Aug 2024 14:55:27 +0530 Subject: [PATCH 0482/1179] [mob][photos] Fixed appLock typo --- mobile/lib/generated/intl/messages_cs.dart | 2 + mobile/lib/generated/intl/messages_de.dart | 2 + mobile/lib/generated/intl/messages_en.dart | 4 +- mobile/lib/generated/intl/messages_es.dart | 2 + mobile/lib/generated/intl/messages_fr.dart | 2 + mobile/lib/generated/intl/messages_it.dart | 2 + mobile/lib/generated/intl/messages_ko.dart | 2 + mobile/lib/generated/intl/messages_nl.dart | 2 + mobile/lib/generated/intl/messages_no.dart | 2 + mobile/lib/generated/intl/messages_pl.dart | 2 + mobile/lib/generated/intl/messages_pt.dart | 2 + mobile/lib/generated/intl/messages_ru.dart | 2 + mobile/lib/generated/intl/messages_tr.dart | 2 + mobile/lib/generated/intl/messages_zh.dart | 2 + mobile/lib/generated/l10n.dart | 30 ++++++---- mobile/lib/l10n/intl_cs.arb | 3 +- mobile/lib/l10n/intl_de.arb | 42 +++++--------- mobile/lib/l10n/intl_en.arb | 8 +-- mobile/lib/l10n/intl_es.arb | 8 +-- mobile/lib/l10n/intl_fr.arb | 5 +- mobile/lib/l10n/intl_it.arb | 5 +- mobile/lib/l10n/intl_ko.arb | 4 +- mobile/lib/l10n/intl_nl.arb | 56 +++++++------------ mobile/lib/l10n/intl_no.arb | 4 +- mobile/lib/l10n/intl_pl.arb | 4 +- mobile/lib/l10n/intl_pt.arb | 43 +++++--------- mobile/lib/l10n/intl_ru.arb | 5 +- mobile/lib/l10n/intl_tr.arb | 5 +- mobile/lib/l10n/intl_zh.arb | 44 +++++---------- .../lock_screen/lock_screen_options.dart | 2 +- 30 files changed, 135 insertions(+), 163 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index b49e60133c..d1c091d780 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Time after which the app locks after being put in the background"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index d86cc2800f..871521d24c 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -314,6 +314,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App-Sperre"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Anwenden"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index d7d288c542..6fd79273d0 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -302,7 +302,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Authentication required"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Apply"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 58a96a9359..03067118d8 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -313,6 +313,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("ID de Apple"), "apply": MessageLookupByLibrary.simpleMessage("Aplicar"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index c1cdf8742f..112d236006 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -301,6 +301,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Appliquer"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 975b8707f1..80c9f5189c 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -294,6 +294,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Applica"), diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 5a372c298b..591d9dd415 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Time after which the app locks after being put in the background"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 93084929e9..08ae3af724 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -313,6 +313,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App-vergrendeling"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Kies tussen het standaard vergrendelingsscherm van uw apparaat en een aangepast vergrendelingsscherm met een pincode of wachtwoord."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Toepassen"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 886121b119..0924d20e93 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -37,6 +37,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Hva er hovedårsaken til at du sletter kontoen din?"), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index af182fa521..6d56441276 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -312,6 +312,8 @@ class MessageLookup extends MessageLookupByLibrary { "Blokada dostępu do aplikacji"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Zastosuj"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index e859f385e6..2e52209c2a 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -311,6 +311,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("Bloqueio de app"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("ID da Apple"), "apply": MessageLookupByLibrary.simpleMessage("Aplicar"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index a8caef60fc..9753246ac5 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -307,6 +307,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Применить"), diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index b56f297256..744b8d3d1c 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -307,6 +307,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple kimliği"), "apply": MessageLookupByLibrary.simpleMessage("Uygula"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index f64e6c04f5..4f9cf2c069 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -273,6 +273,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("应用锁"), "appLockDescription": MessageLookupByLibrary.simpleMessage( "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。"), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("应用"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 51b8974d54..65bcceb0e5 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9225,16 +9225,6 @@ class S { ); } - /// `Choose between your device\'s default lock screen and a custom lock screen with a PIN or password.` - String get appLockDescription { - return Intl.message( - 'Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password.', - name: 'appLockDescription', - desc: '', - args: [], - ); - } - /// `Auto lock` String get autoLock { return Intl.message( @@ -9434,6 +9424,26 @@ class S { args: [], ); } + + /// `Choose between your device's default lock screen and a custom lock screen with a PIN or password.` + String get appLockDescription { + return Intl.message( + 'Choose between your device\'s default lock screen and a custom lock screen with a PIN or password.', + name: 'appLockDescription', + desc: '', + args: [], + ); + } + + /// `Choose between your device's default lock screen and a custom lock screen with a PIN or password.` + String get appLockDescriptions { + return Intl.message( + 'Choose between your device\'s default lock screen and a custom lock screen with a PIN or password.', + name: 'appLockDescriptions', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index a45637aaa8..1bd4f7a493 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -55,5 +55,6 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 71818063d6..36dae62d79 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1253,32 +1253,6 @@ "right": "Rechts", "whatsNew": "Neue Funktionen", "reviewSuggestions": "Vorschläge überprüfen", - "reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "mlFunctions": "ML functions", - "useAsCover": "Als Titelbild festlegen", - "notPersonLabel": "Nicht {name}?", - "@notPersonLabel": { - "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", - "placeholders": { - "name": { - "content": "{name}", - "type": "String" - } - } - }, - "panorama": "Panorama", "reenterPassword": "Passwort erneut eingeben", "reenterPin": "PIN erneut eingeben", "deviceLock": "Gerätsperre", @@ -1292,6 +1266,19 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfigurieren Sie bitte den Gerätepasscode oder die Bildschirmsperre in Ihren Systemeinstellungen.", "tapToUnlock": "Zum Entsperren antippen", "tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche", + "mlFunctions": "ML functions", + "useAsCover": "Als Titelbild festlegen", + "notPersonLabel": "Nicht {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "panorama": "Panorama", "videoInfo": "Video-Informationen", "appLockDescription": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.", "autoLock": "Automatisches Sperren", @@ -1306,5 +1293,6 @@ "removePublicLinks": "Öffentliche Links entfernen", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt.", "guestView": "Gastansicht", - "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen." + "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 973f57df64..55962ddd63 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1271,7 +1271,7 @@ }, "enable": "Enable", "enabled": "Enabled", - "moreDetails" : "More details", + "moreDetails": "More details", "enableMLIndexingDesc": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", "magicSearchHint": "Magic search allows to search photos by their contents, e.g. 'flower', 'red car', 'identity documents'", "panorama": "Panorama", @@ -1289,7 +1289,6 @@ "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "videoInfo": "Video Info", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", "autoLock": "Auto lock", "immediately": "Immediately", "autoLockFeatureDescription": "Time after which the app locks after being put in the background", @@ -1303,13 +1302,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Guest View", "cl_guest_view_description": "Handing over your phone to show photos to a friend? Don't worry about them swiping too far.\nGuest view will lock them into the photos you select.", "cl_guest_view_call_to_action": "Select photos and check out \"Guest view\".", "cl_panorama_viewer_title": "Panorama Viewer", "cl_panorama_viewer_description": "We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!", "cl_video_player_title": "Video Player", - "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos." - + "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index ed3145afe1..38a041098a 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1253,7 +1253,6 @@ "reviewSuggestions": "Revisar sugerencias", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1281,15 +1280,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - - "cl_guest_view_title": "Vista de Invitado", "cl_guest_view_description": "¿Vas a mostrar fotos a un amigo? No te preocupes por si desliza demasiado. La vista de invitado bloqueará las fotos que selecciones.", "cl_guest_view_call_to_action": "Selecciona fotos y prueba la \"Vista de Invitado\".", "cl_panorama_viewer_title": "Visor Panorámico", "cl_panorama_viewer_description": "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!", "cl_video_player_title": "Reproductor de Video", - "cl_video_player_description": "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR." - - + "cl_video_player_description": "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index c3e0e34422..33ab562db2 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1170,7 +1170,6 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1198,12 +1197,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Vue Invité", "cl_guest_view_description": "Vous montrez des photos à un ami ? Pas de souci, il ne pourra pas trop faire défiler. La vue invité verrouille les photos que vous sélectionnez.", "cl_guest_view_call_to_action": "Sélectionnez des photos et essayez la \"Vue Invité\".", "cl_panorama_viewer_title": "Visionneuse Panorama", "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec une navigation basée sur le mouvement !", "cl_video_player_title": "Lecteur Vidéo", - "cl_video_player_description": "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR." + "cl_video_player_description": "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 05eccc0c2a..08b8188c30 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1132,7 +1132,6 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1160,12 +1159,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Vista Ospite", "cl_guest_view_description": "Mostri le foto a un amico? Non preoccuparti che scorrano troppo lontano. La vista ospite bloccherà le foto che selezioni.", "cl_guest_view_call_to_action": "Seleziona le foto e prova la \"Vista Ospite\".", "cl_panorama_viewer_title": "Visualizzatore Panoramico", "cl_panorama_viewer_description": "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L'esperienza è immersiva con la navigazione basata sul movimento!", "cl_video_player_title": "Lettore Video", - "cl_video_player_description": "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR." + "cl_video_player_description": "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 72ecd0e985..1bd4f7a493 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -28,7 +28,6 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -56,5 +55,6 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 06d01889cd..22a9b765b6 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1238,32 +1238,28 @@ "castIPMismatchTitle": "Album casten mislukt", "castIPMismatchBody": "Zorg ervoor dat je op hetzelfde netwerk zit als de tv.", "pairingComplete": "Koppeling voltooid", - "faceRecognition": "Face recognition", + "faceRecognition": "Gezichtsherkenning", "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", + "foundFaces": "Gezichten gevonden", + "clusteringProgress": "Voortgang clusteren", + "indexingIsPaused": "Indexeren is gepauzeerd. Het zal automatisch hervatten wanneer het apparaat klaar is.", + "reenterPassword": "Wachtwoord opnieuw invoeren", + "reenterPin": "PIN opnieuw invoeren", + "deviceLock": "Apparaat vergrendeld", + "pinLock": "PIN vergrendeling", + "next": "Volgende", + "setNewPassword": "Nieuw wachtwoord instellen", + "enterPin": "PIN invoeren", + "setNewPin": "Nieuwe PIN instellen", + "appLock": "App-vergrendeling", + "noSystemLockFound": "Geen systeemvergrendeling gevonden", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", + "tapToUnlock": "Tik om te ontgrendelen", + "tooManyIncorrectAttempts": "Te veel onjuiste pogingen", "mlFunctions": "ML functions", "savingEdits": "Bewerken opslaan...", "autoPair": "Automatisch koppelen", "pairWithPin": "Koppelen met PIN", - "faceRecognition": "Gezichtsherkenning", - "foundFaces": "Gezichten gevonden", - "clusteringProgress": "Voortgang clusteren", - "indexingIsPaused": "Indexeren is gepauzeerd. Het zal automatisch hervatten wanneer het apparaat klaar is.", "trim": "Knippen", "crop": "Bijsnijden", "rotate": "Roteren", @@ -1283,19 +1279,6 @@ } }, "panorama": "Panorama", - "reenterPassword": "Wachtwoord opnieuw invoeren", - "reenterPin": "PIN opnieuw invoeren", - "deviceLock": "Apparaat vergrendeld", - "pinLock": "PIN vergrendeling", - "next": "Volgende", - "setNewPassword": "Nieuw wachtwoord instellen", - "enterPin": "PIN invoeren", - "setNewPin": "Nieuwe PIN instellen", - "appLock": "App-vergrendeling", - "noSystemLockFound": "Geen systeemvergrendeling gevonden", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", - "tapToUnlock": "Tik om te ontgrendelen", - "tooManyIncorrectAttempts": "Te veel onjuiste pogingen", "videoInfo": "Video-info", "appLockDescription": "Kies tussen het standaard vergrendelingsscherm van uw apparaat en een aangepast vergrendelingsscherm met een pincode of wachtwoord.", "swipeLockEnablePreSteps": "Om swipe-vergrendeling in te schakelen, stelt u de toegangscode van het apparaat of schermvergrendeling in uw systeeminstellingen in.", @@ -1312,13 +1295,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Gastweergave", "cl_guest_view_description": "Geef je je telefoon aan een vriend om foto's te laten zien? Maak je geen zorgen dat ze te ver swipen. Gastweergave vergrendelt ze op de foto's die je selecteert.", "cl_guest_view_call_to_action": "Selecteer foto's en bekijk de \"Gastweergave\".", "cl_panorama_viewer_title": "Panorama Viewer", "cl_panorama_viewer_description": "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto's met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!", "cl_video_player_title": "Videospeler", - "cl_video_player_description": "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video's." - + "cl_video_player_description": "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video's.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index e826d1dd12..0c262e3dab 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -42,7 +42,6 @@ "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -70,5 +69,6 @@ "removePublicLinks": "Remove public links", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings." + "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 4ae94cc21d..b982458215 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1293,12 +1293,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Spowoduje to usunięcie publicznych linków wszystkich zaznaczonych szybkich linków.", "guestView": "Widok gościa", "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu.", - "cl_guest_view_title": "Widok Gościa", "cl_guest_view_description": "Pokazujesz zdjęcia znajomemu? Nie martw się, że przesunie za daleko. Widok gościa zablokuje wybrane przez Ciebie zdjęcia.", "cl_guest_view_call_to_action": "Wybierz zdjęcia i sprawdź \"Widok Gościa\".", "cl_panorama_viewer_title": "Przeglądarka Panoramy", "cl_panorama_viewer_description": "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!", "cl_video_player_title": "Odtwarzacz Wideo", - "cl_video_player_description": "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR." + "cl_video_player_description": "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 7d4b92075a..6b6feb4f73 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1253,32 +1253,6 @@ "right": "Direita", "whatsNew": "O que há de novo", "reviewSuggestions": "Revisar sugestões", - "reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "mlFunctions": "ML functions", - "useAsCover": "Usar como capa", - "notPersonLabel": "Não é {name}?", - "@notPersonLabel": { - "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", - "placeholders": { - "name": { - "content": "{name}", - "type": "String" - } - } - }, - "panorama": "Panorama", "reenterPassword": "Reinserir senha", "reenterPin": "Reinserir PIN", "deviceLock": "Bloqueio do dispositivo", @@ -1292,6 +1266,19 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", "tapToUnlock": "Toque para desbloquear", "tooManyIncorrectAttempts": "Muitas tentativas incorretas", + "mlFunctions": "ML functions", + "useAsCover": "Usar como capa", + "notPersonLabel": "Não é {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "panorama": "Panorama", "videoInfo": "Informação de Vídeo", "appLockDescription": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.", "autoLock": "Bloqueio automático", @@ -1307,12 +1294,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Isto removerá links públicos de todos os links rápidos selecionados.", "guestView": "Visão de convidado", "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", - "cl_guest_view_title": "Modo Convidado", "cl_guest_view_description": "Vai mostrar fotos a um amigo? Não se preocupe com ele deslizando demais. O modo convidado bloqueará as fotos que você selecionar.", "cl_guest_view_call_to_action": "Selecione as fotos e experimente o \"Modo Convidado\".", "cl_panorama_viewer_title": "Visualizador Panorâmico", "cl_panorama_viewer_description": "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!", "cl_video_player_title": "Reprodutor de Vídeo", - "cl_video_player_description": "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR." + "cl_video_player_description": "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index a1986ee7d6..b2368075eb 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1252,7 +1252,6 @@ "whatsNew": "Что нового", "reenterPassword": "Re-enter password", "mlFunctions": "ML functions", - "reenterPassword": "Re-enter password", "reenterPin": "Re-enter PIN", "deviceLock": "Device lock", "pinLock": "PIN lock", @@ -1280,12 +1279,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Режим гостя", "cl_guest_view_description": "Показываете фото другу? Не переживайте, что он листнет слишком далеко. Режим гостя заблокирует те фото, которые вы выбрали.", "cl_guest_view_call_to_action": "Выберите фото и попробуйте \"Режим гостя\".", "cl_panorama_viewer_title": "Просмотр Панорамы", "cl_panorama_viewer_description": "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!", "cl_video_player_title": "Видеоплеер", - "cl_video_player_description": "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео." + "cl_video_player_description": "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 3020d4e924..36c4027956 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1290,13 +1290,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Misafir Görünümü", "cl_guest_view_description": "Telefonunuzu bir arkadaşınıza fotoğraf göstermek için mi veriyorsunuz? Fazla kaydırmasından endişelenmeyin. Misafir görünümü seçtiğiniz fotoğraflarla sınırlı kalır.", "cl_guest_view_call_to_action": "Fotoğrafları seçin ve \"Misafir Görünümü\"nü deneyin.", "cl_panorama_viewer_title": "Panorama Görüntüleyici", "cl_panorama_viewer_description": "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!", "cl_video_player_title": "Video Oynatıcı", - "cl_video_player_description": "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz." - + "cl_video_player_description": "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz.", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index a418f1b1ae..c8809d3460 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1253,32 +1253,6 @@ "right": "向右", "whatsNew": "更新日志", "reviewSuggestions": "查看建议", - "reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "mlFunctions": "ML functions", - "useAsCover": "用作封面", - "notPersonLabel": "不是 {name}?", - "@notPersonLabel": { - "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", - "placeholders": { - "name": { - "content": "{name}", - "type": "String" - } - } - }, - "panorama": "全景", "reenterPassword": "再次输入密码", "reenterPin": "再次输入 PIN 码", "deviceLock": "设备锁", @@ -1292,6 +1266,19 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。", "tapToUnlock": "点击解锁", "tooManyIncorrectAttempts": "错误尝试次数过多", + "mlFunctions": "ML functions", + "useAsCover": "用作封面", + "notPersonLabel": "不是 {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "panorama": "全景", "videoInfo": "视频详情", "appLockDescription": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。", "autoLock": "自动锁定", @@ -1307,13 +1294,12 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "这将删除所有选定的快速链接的公共链接。", "guestView": "访客视图", "guestViewEnablePreSteps": "要启用访客视图,请在系统设置中设置设备密码或屏幕锁。", - "cl_guest_view_title": "访客视图", "cl_guest_view_description": "要把手机递给朋友看照片?别担心他们滑动太远。访客视图将锁定您选择的照片。", "cl_guest_view_call_to_action": "选择照片并查看\"访客视图\"。", "cl_panorama_viewer_title": "全景查看器", "cl_panorama_viewer_description": "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!", "cl_video_player_title": "视频播放器", - "cl_video_player_description": "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。" - + "cl_video_player_description": "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。", + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." } \ No newline at end of file diff --git a/mobile/lib/ui/settings/lock_screen/lock_screen_options.dart b/mobile/lib/ui/settings/lock_screen/lock_screen_options.dart index cbda333080..44eeb89674 100644 --- a/mobile/lib/ui/settings/lock_screen/lock_screen_options.dart +++ b/mobile/lib/ui/settings/lock_screen/lock_screen_options.dart @@ -191,7 +191,7 @@ class _LockScreenOptionsState extends State { right: 12, ), child: Text( - S.of(context).appLockDescription, + S.of(context).appLockDescriptions, style: textTheme.miniFaint, textAlign: TextAlign.left, ), From ed2978bf55728d5fcb6231b8553bee506f637d0d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 11:31:24 +0200 Subject: [PATCH 0483/1179] [mob][photos] constructor --- mobile/lib/models/ml/face/face.dart | 38 +++++++++++++++++++ .../services/machine_learning/ml_service.dart | 33 ++-------------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/mobile/lib/models/ml/face/face.dart b/mobile/lib/models/ml/face/face.dart index 455938868b..4a794baff5 100644 --- a/mobile/lib/models/ml/face/face.dart +++ b/mobile/lib/models/ml/face/face.dart @@ -1,4 +1,7 @@ +import "package:photos/models/ml/face/box.dart"; import "package:photos/models/ml/face/detection.dart"; +import "package:photos/models/ml/face/dimension.dart"; +import "package:photos/models/ml/face/landmark.dart"; import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/ml_result.dart"; @@ -42,6 +45,41 @@ class Face { this.fileInfo, }); + factory Face.fromFaceResult( + FaceResult faceResult, + int fileID, + Dimensions decodedDimensions, + ) { + final detection = Detection( + box: FaceBox( + x: faceResult.detection.xMinBox, + y: faceResult.detection.yMinBox, + width: faceResult.detection.width, + height: faceResult.detection.height, + ), + landmarks: faceResult.detection.allKeypoints + .map( + (keypoint) => Landmark( + x: keypoint[0], + y: keypoint[1], + ), + ) + .toList(), + ); + return Face( + faceResult.faceId, + fileID, + faceResult.embedding, + faceResult.detection.score, + detection, + faceResult.blurValue, + fileInfo: FileInfo( + imageHeight: decodedDimensions.height, + imageWidth: decodedDimensions.width, + ), + ); + } + factory Face.empty(int fileID, {bool error = false}) { return Face( "${fileID}_0_0_0_0", diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 8c7060d2c7..ccede73cc9 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -11,10 +11,7 @@ import "package:photos/db/files_db.dart"; import "package:photos/db/ml/db.dart"; import "package:photos/events/machine_learning_control_event.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/models/ml/face/box.dart"; -import "package:photos/models/ml/face/detection.dart" as face_detection; import "package:photos/models/ml/face/face.dart"; -import "package:photos/models/ml/face/landmark.dart"; import "package:photos/models/ml/ml_versions.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/filedata/filedata_service.dart"; @@ -416,35 +413,11 @@ class MLService { ); } for (int i = 0; i < result.faces!.length; ++i) { - final FaceResult faceRes = result.faces![i]; - final detection = face_detection.Detection( - box: FaceBox( - x: faceRes.detection.xMinBox, - y: faceRes.detection.yMinBox, - width: faceRes.detection.width, - height: faceRes.detection.height, - ), - landmarks: faceRes.detection.allKeypoints - .map( - (keypoint) => Landmark( - x: keypoint[0], - y: keypoint[1], - ), - ) - .toList(), - ); faces.add( - Face( - faceRes.faceId, + Face.fromFaceResult( + result.faces![i], result.fileId, - faceRes.embedding, - faceRes.detection.score, - detection, - faceRes.blurValue, - fileInfo: FileInfo( - imageHeight: result.decodedImageSize.height, - imageWidth: result.decodedImageSize.width, - ), + result.decodedImageSize, ), ); } From 701e48c54c9c3606d8bc081a5bc011893e835039 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 11:32:23 +0200 Subject: [PATCH 0484/1179] [mob][photos] Rename for clarity --- mobile/lib/db/ml/db.dart | 2 +- mobile/lib/utils/ml_util.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 727542dfa8..6a4f965a4d 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -177,7 +177,7 @@ class MLDataDB { return result; } - Future getIndexedFileCount({ + Future getFaceIndexedFileCount({ int minimumMlVersion = faceMlVersion, }) async { final db = await instance.asyncDB; diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 9233199e93..a50332bb81 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -53,7 +53,8 @@ class FileMLInstruction { Future getIndexStatus() async { try { final int indexableFiles = (await getIndexableFileIDs()).length; - final int facesIndexedFiles = await MLDataDB.instance.getIndexedFileCount(); + final int facesIndexedFiles = + await MLDataDB.instance.getFaceIndexedFileCount(); final int clipIndexedFiles = await MLDataDB.instance.getClipIndexedFileCount(); final int indexedFiles = math.min(facesIndexedFiles, clipIndexedFiles); From 147a0e005b847c262fe4594865b93e933c9c2bc4 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 11:33:14 +0200 Subject: [PATCH 0485/1179] [mob][photos] Rename --- mobile/lib/ui/settings/debug/ml_debug_section_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index fa936b0818..feb10dac92 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -59,7 +59,7 @@ class _MLDebugSectionWidgetState extends State { children: [ MenuItemWidget( captionedTextWidget: FutureBuilder( - future: MLDataDB.instance.getIndexedFileCount(), + future: MLDataDB.instance.getFaceIndexedFileCount(), builder: (context, snapshot) { if (snapshot.hasData) { return CaptionedTextWidget( From 54a0a0925120fad84d0e40ea530d7e925d7a71a5 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 15:14:41 +0530 Subject: [PATCH 0486/1179] Update auth github workflows to use flutter 3.24.0 --- .github/workflows/auth-lint.yml | 2 +- .github/workflows/auth-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auth-lint.yml b/.github/workflows/auth-lint.yml index 50e73ba13f..b3b302a32e 100644 --- a/.github/workflows/auth-lint.yml +++ b/.github/workflows/auth-lint.yml @@ -9,7 +9,7 @@ on: - ".github/workflows/auth-lint.yml" env: - FLUTTER_VERSION: "3.22.2" + FLUTTER_VERSION: "3.24.0" jobs: lint: diff --git a/.github/workflows/auth-release.yml b/.github/workflows/auth-release.yml index 3cd5333ac3..ef7a3d9192 100644 --- a/.github/workflows/auth-release.yml +++ b/.github/workflows/auth-release.yml @@ -29,7 +29,7 @@ on: - "auth-v*" env: - FLUTTER_VERSION: "3.22.2" + FLUTTER_VERSION: "3.24.0" jobs: build-ubuntu: From b4a4b0cc045495cbf49fc6cb3f2580f68f4050bc Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Wed, 21 Aug 2024 15:45:44 +0530 Subject: [PATCH 0487/1179] Remove extra newline in string --- mobile/lib/l10n/intl_en.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 973f57df64..61b3c67f05 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1305,11 +1305,11 @@ "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", "cl_guest_view_title": "Guest View", - "cl_guest_view_description": "Handing over your phone to show photos to a friend? Don't worry about them swiping too far.\nGuest view will lock them into the photos you select.", + "cl_guest_view_description": "Handing over your phone to show photos to a friend? Don't worry about them swiping too far. Guest view will lock them into the photos you select.", "cl_guest_view_call_to_action": "Select photos and check out \"Guest view\".", "cl_panorama_viewer_title": "Panorama Viewer", "cl_panorama_viewer_description": "We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!", "cl_video_player_title": "Video Player", "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos." -} \ No newline at end of file +} From ab295d9a91ce39ae13f611462bb795edcdd1cf07 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 15:55:58 +0530 Subject: [PATCH 0488/1179] [mob][photos] Update guest view icon --- mobile/assets/icons/guest_view_icon.svg | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mobile/assets/icons/guest_view_icon.svg b/mobile/assets/icons/guest_view_icon.svg index 98ff43fac9..e03b029b28 100644 --- a/mobile/assets/icons/guest_view_icon.svg +++ b/mobile/assets/icons/guest_view_icon.svg @@ -1,6 +1,10 @@ - - - - - + + + + + + + + + From 199938d4b6f6226867ef5174597b885349942a07 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 16:12:02 +0530 Subject: [PATCH 0489/1179] [mob][photos] Remove stale entry in l10n.dart --- mobile/lib/generated/l10n.dart | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 65bcceb0e5..7f3972b7c4 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9425,16 +9425,6 @@ class S { ); } - /// `Choose between your device's default lock screen and a custom lock screen with a PIN or password.` - String get appLockDescription { - return Intl.message( - 'Choose between your device\'s default lock screen and a custom lock screen with a PIN or password.', - name: 'appLockDescription', - desc: '', - args: [], - ); - } - /// `Choose between your device's default lock screen and a custom lock screen with a PIN or password.` String get appLockDescriptions { return Intl.message( From e5d6d324dba00523f8852a35d1490eaf1a159ff9 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:28:24 +0530 Subject: [PATCH 0490/1179] Add API to update referral code --- server/cmd/museum/main.go | 1 + server/ente/storagebonus/referral.go | 4 ++++ server/pkg/api/storage_bonus.go | 16 ++++++++++++++++ server/pkg/repo/storagebonus/referral_codes.go | 2 +- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index c0e25e4e1c..c6de4f5c56 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -612,6 +612,7 @@ func main() { } privateAPI.GET("/storage-bonus/details", storageBonusHandler.GetStorageBonusDetails) + privateAPI.GET("/storage-bonus/change-code", storageBonusHandler.UpdateReferralCode) privateAPI.GET("/storage-bonus/referral-view", storageBonusHandler.GetReferralView) privateAPI.POST("/storage-bonus/referral-claim", storageBonusHandler.ClaimReferral) diff --git a/server/ente/storagebonus/referral.go b/server/ente/storagebonus/referral.go index 816e0ca4e4..be356012e2 100644 --- a/server/ente/storagebonus/referral.go +++ b/server/ente/storagebonus/referral.go @@ -18,6 +18,10 @@ type UserReferralPlanStat struct { UpgradedCount int `json:"upgradedCount"` } +type UpdateReferralCodeRequest struct { + Code string `json:"code" binding:"required"` +} + // PlanInfo represents the referral plan metadata type PlanInfo struct { // IsEnabled indicates if the referral plan is enabled for given user diff --git a/server/pkg/api/storage_bonus.go b/server/pkg/api/storage_bonus.go index 4f2ba1046b..04d0aff898 100644 --- a/server/pkg/api/storage_bonus.go +++ b/server/pkg/api/storage_bonus.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/ente-io/museum/ente" + entity "github.com/ente-io/museum/ente/storagebonus" "github.com/ente-io/museum/pkg/controller/storagebonus" "github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/museum/pkg/utils/handler" @@ -24,6 +25,21 @@ func (h StorageBonusHandler) GetReferralView(context *gin.Context) { context.JSON(http.StatusOK, response) } +func (h StorageBonusHandler) UpdateReferralCode(context *gin.Context) { + var request entity.UpdateReferralCodeRequest + if err := context.ShouldBindJSON(&request); err != nil { + handler.Error(context, stacktrace.Propagate(ente.NewBadRequestWithMessage(err.Error()), "")) + return + } + userID := auth.GetUserID(context.Request.Header) + err := h.Controller.UpdateReferralCode(context, userID, request.Code) + if err != nil { + handler.Error(context, stacktrace.Propagate(err, "")) + return + } + context.JSON(http.StatusOK, gin.H{}) +} + func (h StorageBonusHandler) GetStorageBonusDetails(context *gin.Context) { response, err := h.Controller.GetStorageBonusDetailResponse(context, auth.GetUserID(context.Request.Header)) if err != nil { diff --git a/server/pkg/repo/storagebonus/referral_codes.go b/server/pkg/repo/storagebonus/referral_codes.go index d3f49ec3d0..d28bc2e0ae 100644 --- a/server/pkg/repo/storagebonus/referral_codes.go +++ b/server/pkg/repo/storagebonus/referral_codes.go @@ -55,7 +55,7 @@ func (r *Repository) AddNewCode(ctx context.Context, userID int64, code string) } _, err = r.DB.ExecContext(ctx, "UPDATE referral_codes SET is_active = FALSE WHERE user_id = $1", userID) if err != nil { - return stacktrace.Propagate(err, "failed to update storagebonus code for user %d", userID) + return stacktrace.Propagate(err, "failed to update remove existing code code for user %d", userID) } return r.InsertCode(ctx, userID, code) } From 27c5a179abb7b0cba9cb932fdd845d4b4caba365 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:34:49 +0530 Subject: [PATCH 0491/1179] [server] Add check for existingCode --- server/pkg/repo/storagebonus/referral_codes.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/server/pkg/repo/storagebonus/referral_codes.go b/server/pkg/repo/storagebonus/referral_codes.go index d28bc2e0ae..4316acf161 100644 --- a/server/pkg/repo/storagebonus/referral_codes.go +++ b/server/pkg/repo/storagebonus/referral_codes.go @@ -53,6 +53,15 @@ func (r *Repository) AddNewCode(ctx context.Context, userID int64, code string) HttpStatusCode: http.StatusTooManyRequests, }, "max referral code change limit reached for user %d", userID) } + // check if code already exists + var existCount int + err = r.DB.QueryRowContext(ctx, "SELECT COALESCE(COUNT(*),0) FROM referral_codes WHERE code = $1", code).Scan(&existCount) + if err != nil { + return stacktrace.Propagate(err, "failed to check if code already exists for user %d", userID) + } + if existCount > 0 { + return stacktrace.Propagate(entity.CodeAlreadyExistsErr, "storagebonus code %s already exists", code) + } _, err = r.DB.ExecContext(ctx, "UPDATE referral_codes SET is_active = FALSE WHERE user_id = $1", userID) if err != nil { return stacktrace.Propagate(err, "failed to update remove existing code code for user %d", userID) From 7d969cdadabe09a2d72a974801a94e5fc8553683 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:36:36 +0530 Subject: [PATCH 0492/1179] [server] Apply change limit only for user edit --- server/pkg/api/admin.go | 2 +- server/pkg/api/storage_bonus.go | 2 +- server/pkg/controller/storagebonus/referral.go | 4 ++-- server/pkg/repo/storagebonus/referral_codes.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index aa76906142..4783f2e98b 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -243,7 +243,7 @@ func (h *AdminHandler) UpdateReferral(c *gin.Context) { } go h.DiscordController.NotifyAdminAction( fmt.Sprintf("Admin (%d) updating referral code for %d to %s", auth.GetUserID(c.Request.Header), request.UserID, request.Code)) - err := h.StorageBonusCtl.UpdateReferralCode(c, request.UserID, request.Code) + err := h.StorageBonusCtl.UpdateReferralCode(c, request.UserID, request.Code, true) if err != nil { logrus.WithError(err).Error("Failed to disable 2FA") handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/api/storage_bonus.go b/server/pkg/api/storage_bonus.go index 04d0aff898..46771b8f44 100644 --- a/server/pkg/api/storage_bonus.go +++ b/server/pkg/api/storage_bonus.go @@ -32,7 +32,7 @@ func (h StorageBonusHandler) UpdateReferralCode(context *gin.Context) { return } userID := auth.GetUserID(context.Request.Header) - err := h.Controller.UpdateReferralCode(context, userID, request.Code) + err := h.Controller.UpdateReferralCode(context, userID, request.Code, false) if err != nil { handler.Error(context, stacktrace.Propagate(err, "")) return diff --git a/server/pkg/controller/storagebonus/referral.go b/server/pkg/controller/storagebonus/referral.go index 4cf04e706f..bcc0bc6beb 100644 --- a/server/pkg/controller/storagebonus/referral.go +++ b/server/pkg/controller/storagebonus/referral.go @@ -133,7 +133,7 @@ func (c *Controller) GetOrCreateReferralCode(ctx *gin.Context, userID int64) (*s return referralCode, nil } -func (c *Controller) UpdateReferralCode(ctx *gin.Context, userID int64, code string) error { +func (c *Controller) UpdateReferralCode(ctx *gin.Context, userID int64, code string, isAdminEdit bool) error { code = strings.ToUpper(code) if !random.IsAlphanumeric(code) { return stacktrace.Propagate(ente.NewBadRequestWithMessage("code is not alphanumeric"), "") @@ -141,7 +141,7 @@ func (c *Controller) UpdateReferralCode(ctx *gin.Context, userID int64, code str if len(code) < 4 || len(code) > 8 { return stacktrace.Propagate(ente.NewBadRequestWithMessage("code length should be between 4 and 8"), "") } - err := c.StorageBonus.AddNewCode(ctx, userID, code) + err := c.StorageBonus.AddNewCode(ctx, userID, code, isAdminEdit) if err != nil { return stacktrace.Propagate(err, "failed to update referral code") } diff --git a/server/pkg/repo/storagebonus/referral_codes.go b/server/pkg/repo/storagebonus/referral_codes.go index 4316acf161..29068182fa 100644 --- a/server/pkg/repo/storagebonus/referral_codes.go +++ b/server/pkg/repo/storagebonus/referral_codes.go @@ -39,14 +39,14 @@ func (r *Repository) InsertCode(ctx context.Context, userID int64, code string) // AddNewCode and mark the old one as inactive for a given userID. // Note: This method is not being used in the initial MVP as we don't allow user to change the storagebonus // code -func (r *Repository) AddNewCode(ctx context.Context, userID int64, code string) error { +func (r *Repository) AddNewCode(ctx context.Context, userID int64, code string, isAdminEdit bool) error { // check current referral code count var count int err := r.DB.QueryRowContext(ctx, "SELECT COALESCE(COUNT(*),0) FROM referral_codes WHERE user_id = $1", userID).Scan(&count) if err != nil { return stacktrace.Propagate(err, "failed to get storagebonus code count for user %d", userID) } - if count > maxReferralChangeAllowed { + if !isAdminEdit && count > maxReferralChangeAllowed { return stacktrace.Propagate(&ente.ApiError{ Code: "REFERRAL_CHANGE_LIMIT_REACHED", Message: fmt.Sprintf("max referral code change limit %d reached", maxReferralChangeAllowed), From c57bc2298793aba90b3a45dc9334121d2c026034 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:39:09 +0530 Subject: [PATCH 0493/1179] [server] Fix request type --- server/cmd/museum/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index c6de4f5c56..f2c2d8e2b3 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -612,7 +612,7 @@ func main() { } privateAPI.GET("/storage-bonus/details", storageBonusHandler.GetStorageBonusDetails) - privateAPI.GET("/storage-bonus/change-code", storageBonusHandler.UpdateReferralCode) + privateAPI.POST("/storage-bonus/change-code", storageBonusHandler.UpdateReferralCode) privateAPI.GET("/storage-bonus/referral-view", storageBonusHandler.GetReferralView) privateAPI.POST("/storage-bonus/referral-claim", storageBonusHandler.ClaimReferral) From 6ec39e2e6b8bf38c19082c7aa6213331a33ba597 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:41:10 +0530 Subject: [PATCH 0494/1179] [server] lint fix --- server/pkg/repo/storagebonus/referral_codes_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/repo/storagebonus/referral_codes_test.go b/server/pkg/repo/storagebonus/referral_codes_test.go index 379d932334..117dfb1352 100644 --- a/server/pkg/repo/storagebonus/referral_codes_test.go +++ b/server/pkg/repo/storagebonus/referral_codes_test.go @@ -65,7 +65,7 @@ func TestAddNewReferralCode(t *testing.T) { assert.Nil(t, err) newCode := "C22222" - err = repo.AddNewCode(context.Background(), userID, newCode) + err = repo.AddNewCode(context.Background(), userID, newCode, false) assert.Nil(t, err) referralCode, err := repo.GetCode(context.Background(), userID) From f4a46a1fd3b2c1bdbcdd38cb2db886e77d4bd748 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 13:33:20 +0200 Subject: [PATCH 0495/1179] [mob][photos] Refactor MLResults processing --- .../machine_learning/ml_indexing_isolate.dart | 5 +- .../services/machine_learning/ml_result.dart | 26 +--- .../services/machine_learning/ml_service.dart | 138 +++++++++--------- mobile/lib/utils/image_ml_util.dart | 20 +++ mobile/lib/utils/ml_util.dart | 5 +- 5 files changed, 90 insertions(+), 104 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index 7636135289..b01037dc83 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -228,10 +228,7 @@ class MLIndexingIsolate { debugPrint( "This image with ID ${instruction.file.uploadedFileID} has name ${instruction.file.displayName}.", ); - final resultBuilder = - MLResult.fromEnteFileID(instruction.file.uploadedFileID!) - ..errorOccurred(); - return resultBuilder; + rethrow; } stopwatch.stop(); _logger.info( diff --git a/mobile/lib/services/machine_learning/ml_result.dart b/mobile/lib/services/machine_learning/ml_result.dart index 3f0aab4784..237287cf4a 100644 --- a/mobile/lib/services/machine_learning/ml_result.dart +++ b/mobile/lib/services/machine_learning/ml_result.dart @@ -14,46 +14,26 @@ class MLResult { Dimensions decodedImageSize; - bool errorOccured; - bool onlyThumbnailUsed; - + bool get ranML => facesRan || clipRan; bool get facesRan => faces != null; bool get clipRan => clip != null; - bool get foundFaces => facesRan && faces!.isNotEmpty; - bool get foundNoFaces => facesRan && faces!.isEmpty; - MLResult({ this.fileId = -1, - this.faces = const [], + this.faces, this.clip, - this.errorOccured = false, - this.onlyThumbnailUsed = false, this.decodedImageSize = const Dimensions(width: -1, height: -1), }); MLResult.fromEnteFileID( fileID, { - this.errorOccured = false, - this.onlyThumbnailUsed = false, this.decodedImageSize = const Dimensions(width: -1, height: -1), }) : fileId = fileID; - void noFaceDetected() { - faces = []; - } - - void errorOccurred() { - noFaceDetected(); - errorOccured = true; - } - Map _toJson() => { 'fileId': fileId, 'faces': faces?.map((face) => face.toJson()).toList(), 'clip': clip?.toJson(), - 'errorOccured': errorOccured, - 'onlyThumbnailUsed': onlyThumbnailUsed, 'decodedImageSize': { 'width': decodedImageSize.width, 'height': decodedImageSize.height, @@ -73,8 +53,6 @@ class MLResult { clip: json['clip'] != null ? ClipResult.fromJson(json['clip'] as Map) : null, - errorOccured: json['errorOccured'] ?? false, - onlyThumbnailUsed: json['onlyThumbnailUsed'] ?? false, decodedImageSize: json['decodedImageSize'] != null ? Dimensions( width: json['decodedImageSize']['width'], diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index ccede73cc9..7acfa58264 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -3,7 +3,7 @@ import "dart:io" show Platform; import "dart:math" show min; import "dart:typed_data" show Uint8List; -import "package:flutter/foundation.dart" show debugPrint, kDebugMode; +import "package:flutter/foundation.dart" show kDebugMode; import "package:logging/logging.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:photos/core/event_bus.dart"; @@ -23,7 +23,6 @@ import 'package:photos/services/machine_learning/face_ml/face_embedding/face_emb import 'package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart'; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; -import 'package:photos/services/machine_learning/ml_exceptions.dart'; import "package:photos/services/machine_learning/ml_indexing_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; @@ -373,7 +372,6 @@ class MLService { } Future processImage(FileMLInstruction instruction) async { - // TODO: clean this function up _logger.info( "`processImage` start processing image with uploadedFileID: ${instruction.file.uploadedFileID}", ); @@ -383,6 +381,7 @@ class MLService { final MLResult? result = await MLIndexingIsolate.instance.analyzeImage( instruction, ); + // Check if there's no result simply because MLController paused indexing if (result == null) { if (!_shouldPauseIndexingAndClustering) { _logger.severe( @@ -391,27 +390,23 @@ class MLService { } return actuallyRanML; } + // Check anything actually ran + actuallyRanML = result.ranML; + if (!actuallyRanML) return actuallyRanML; + // Prepare storing data on remote + final FileDataEntity dataEntity = instruction.existingRemoteFileML ?? + FileDataEntity.empty( + instruction.file.uploadedFileID!, + DataType.mlData, + ); + // Faces results if (result.facesRan) { - actuallyRanML = true; final List faces = []; - if (result.foundNoFaces) { - debugPrint( - 'No faces detected for file with name:${instruction.file.displayName}', - ); - faces.add( - Face.empty(result.fileId, error: result.errorOccured), - ); + if (result.faces!.isEmpty) { + faces.add(Face.empty(result.fileId)); + _logger.info("no face detected, storing empty for ${result.fileId}"); } - if (result.foundFaces) { - if (result.decodedImageSize.width == -1 || - result.decodedImageSize.height == -1) { - _logger.severe( - "decodedImageSize is not stored correctly for image with " - "ID: ${instruction.file.uploadedFileID}"); - _logger.info( - "Using aligned image size for image with ID: ${instruction.file.uploadedFileID}. This size is ${result.decodedImageSize.width}x${result.decodedImageSize.height} compared to size of ${instruction.file.width}x${instruction.file.height} in the metadata", - ); - } + if (result.faces!.isNotEmpty) { for (int i = 0; i < result.faces!.length; ++i) { faces.add( Face.fromFaceResult( @@ -421,74 +416,73 @@ class MLService { ), ); } - } - _logger.info("inserting ${faces.length} faces for ${result.fileId}"); - if (!result.errorOccured) { - final FileDataEntity dataEntity = instruction.existingRemoteFileML ?? - FileDataEntity.empty( - instruction.file.uploadedFileID!, - DataType.mlData, - ); - if (result.facesRan) { - dataEntity.putFace( - RemoteFaceEmbedding( - faces, - faceMlVersion, - client: client, - height: result.decodedImageSize.height, - width: result.decodedImageSize.width, - ), - ); - } - if (result.clipRan) { - dataEntity.putClip( - RemoteClipEmbedding( - result.clip!.embedding, - version: clipMlVersion, - client: client, - ), - ); - } - await FileDataService.instance.putFileData( - instruction.file, - dataEntity, - ); - } else { - _logger.warning( - 'Skipped putting embedding because of error ${result.toJsonString()}', - ); + _logger.info("storing ${faces.length} faces for ${result.fileId}"); } await MLDataDB.instance.bulkInsertFaces(faces); + dataEntity.putFace( + RemoteFaceEmbedding( + faces, + faceMlVersion, + client: client, + height: result.decodedImageSize.height, + width: result.decodedImageSize.width, + ), + ); } - + // Clip results if (result.clipRan) { - actuallyRanML = true; await SemanticSearchService.storeClipImageResult( result.clip!, ); + dataEntity.putClip( + RemoteClipEmbedding( + result.clip!.embedding, + version: clipMlVersion, + client: client, + ), + ); } - } on ThumbnailRetrievalException catch (e, s) { - _logger.severe( - 'ThumbnailRetrievalException while processing image with ID ${instruction.file.uploadedFileID}, storing empty face so indexing does not get stuck', - e, - s, - ); - await MLDataDB.instance.bulkInsertFaces( - [Face.empty(instruction.file.uploadedFileID!, error: true)], - ); - await SemanticSearchService.storeEmptyClipImageResult( + // Storing all results on remote + await FileDataService.instance.putFileData( instruction.file, + dataEntity, ); - return true; + return actuallyRanML; } catch (e, s) { + bool acceptedIssue = false; + final String errorString = e.toString(); + if (errorString.contains('ThumbnailRetrievalException')) { + _logger.severe( + 'ThumbnailRetrievalException while processing image with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + e, + s, + ); + acceptedIssue = true; + } + if (errorString.contains('InvalidImageFormatException: Error decoding image')) { + _logger.severe( + 'InvalidImageFormatException while processing image with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + e, + s, + ); + acceptedIssue = true; + } + if (acceptedIssue) { + await MLDataDB.instance.bulkInsertFaces( + [Face.empty(instruction.file.uploadedFileID!, error: true)], + ); + await SemanticSearchService.storeEmptyClipImageResult( + instruction.file, + ); + return true; + } _logger.severe( - "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID}. Not storing any faces, which means it will be automatically retried later.", + "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID}. Not storing any results locally, which means it will be automatically retried later.", e, s, ); return false; } - return actuallyRanML; } Future _ensureDownloadedModels([bool forceRefresh = false]) async { diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index b0badaede3..04a5f3ab53 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -1,10 +1,12 @@ import "dart:async"; import "dart:developer" show log; +import "dart:io" show File; import "dart:math" show max, min; import "dart:typed_data" show Float32List, Uint8List, ByteData; import "dart:ui"; import 'package:flutter/painting.dart' as paint show decodeImageFromList; +import "package:logging/logging.dart"; import 'package:ml_linalg/linalg.dart'; import "package:photos/models/ml/face/box.dart"; import "package:photos/models/ml/face/dimension.dart"; @@ -16,6 +18,24 @@ import 'package:photos/services/machine_learning/face_ml/face_filtering/blur_det /// All of the functions in this file are helper functions for using inside an isolate. /// Don't use them outside of a isolate, unless you are okay with UI jank!!!! +final _logger = Logger("ImageMlUtil"); + +Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { + try { + final imageData = await File(imagePath).readAsBytes(); + final image = await decodeImageFromData(imageData); + final ByteData imageByteData = await getByteDataFromImage(image); + return (image, imageByteData); + } catch (e, s) { + _logger.severe( + 'Error decoding image of format ${imagePath.split('.').last}:', + e, + s, + ); + throw Exception('InvalidImageFormatException: Error decoding image'); + } +} + /// Decodes [Uint8List] image data to an ui.[Image] object. Future decodeImageFromData(Uint8List imageData) async { // Decoding using flutter paint. This is the fastest and easiest method. diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index a50332bb81..33d30711c0 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -1,6 +1,5 @@ import "dart:io" show File; import "dart:math" as math show sqrt, min, max; -import "dart:typed_data" show ByteData; import "package:flutter/services.dart" show PlatformException; import "package:logging/logging.dart"; @@ -282,9 +281,7 @@ Future analyzeImageStatic(Map args) async { final time = DateTime.now(); // Decode the image once to use for both face detection and alignment - final imageData = await File(imagePath).readAsBytes(); - final image = await decodeImageFromData(imageData); - final ByteData imageByteData = await getByteDataFromImage(image); + final (image, imageByteData) = await decodeImageFromPath(imagePath); _logger.info('Reading and decoding image took ' '${DateTime.now().difference(time).inMilliseconds} ms'); final decodedImageSize = From a4309a0ab3ed522447fe186e771fafa1abbfdf3f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 13:38:37 +0200 Subject: [PATCH 0496/1179] [mob][photos] Fix stuck on invalid image formats --- mobile/lib/models/ml/clip.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/lib/models/ml/clip.dart b/mobile/lib/models/ml/clip.dart index 0fb054b3bb..570dae388a 100644 --- a/mobile/lib/models/ml/clip.dart +++ b/mobile/lib/models/ml/clip.dart @@ -1,5 +1,7 @@ import "dart:convert"; +import "package:photos/models/ml/ml_versions.dart"; + class ClipEmbedding { final int fileID; final List embedding; @@ -17,7 +19,7 @@ class ClipEmbedding { return ClipEmbedding( fileID: fileID, embedding: [], - version: 0, + version: clipMlVersion, ); } From a43b97026a8511628b3167c6f4e29c36d0cf893c Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Wed, 21 Aug 2024 17:39:23 +0530 Subject: [PATCH 0497/1179] Add option to claim a custom referral code --- mobile/lib/gateways/storage_bonus_gw.dart | 9 +++ mobile/lib/generated/intl/messages_en.dart | 9 ++- mobile/lib/generated/l10n.dart | 44 +++++++++- mobile/lib/l10n/intl_en.arb | 4 + .../lib/ui/growth/referral_code_widget.dart | 81 +++++++++++++++++-- mobile/lib/ui/growth/referral_screen.dart | 78 +++++++++++------- 6 files changed, 185 insertions(+), 40 deletions(-) diff --git a/mobile/lib/gateways/storage_bonus_gw.dart b/mobile/lib/gateways/storage_bonus_gw.dart index 5b6aad24e5..3b6a08641b 100644 --- a/mobile/lib/gateways/storage_bonus_gw.dart +++ b/mobile/lib/gateways/storage_bonus_gw.dart @@ -15,6 +15,15 @@ class StorageBonusGateway { return _enteDio.post("/storage-bonus/referral-claim?code=$code"); } + Future updateCode(String code) { + return _enteDio.post( + "/storage-bonus/change-code?code=$code", + data: { + "code": code, + }, + ); + } + Future getBonusDetails() async { final response = await _enteDio.get("/storage-bonus/details"); return BonusDetails.fromJson(response.data); diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index d7d288c542..c0dda0ce55 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -413,6 +413,7 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "Visit cast.ente.io on the device you want to pair.\n\nEnter the code below to play the album on your TV."), "centerPoint": MessageLookupByLibrary.simpleMessage("Center point"), + "change": MessageLookupByLibrary.simpleMessage("Change"), "changeEmail": MessageLookupByLibrary.simpleMessage("Change email"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Change location of selected items?"), @@ -422,6 +423,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Change password"), "changePermissions": MessageLookupByLibrary.simpleMessage("Change permissions?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Change your referral code"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Check for updates"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( @@ -431,7 +434,7 @@ class MessageLookup extends MessageLookupByLibrary { "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( "Select photos and check out \"Guest view\"."), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far.\nGuest view will lock them into the photos you select."), + "Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far. Guest view will lock them into the photos you select."), "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("Guest View"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( @@ -465,6 +468,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Clustering progress"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Code applied"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Sorry, you\'ve reached the limit of code changes."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage("Code copied to clipboard"), "codeUsedByYou": @@ -1573,6 +1578,8 @@ class MessageLookup extends MessageLookupByLibrary { "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Unarchive album"), "unarchiving": MessageLookupByLibrary.simpleMessage("Unarchiving..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Sorry, this code is unavailable."), "uncategorized": MessageLookupByLibrary.simpleMessage("Uncategorized"), "unhide": MessageLookupByLibrary.simpleMessage("Unhide"), "unhideToAlbum": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 51b8974d54..a1ad4fe581 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2056,6 +2056,46 @@ class S { ); } + /// `Change your referral code` + String get changeYourReferralCode { + return Intl.message( + 'Change your referral code', + name: 'changeYourReferralCode', + desc: '', + args: [], + ); + } + + /// `Change` + String get change { + return Intl.message( + 'Change', + name: 'change', + desc: '', + args: [], + ); + } + + /// `Sorry, this code is unavailable.` + String get unavailableReferralCode { + return Intl.message( + 'Sorry, this code is unavailable.', + name: 'unavailableReferralCode', + desc: '', + args: [], + ); + } + + /// `Sorry, you've reached the limit of code changes.` + String get codeChangeLimitReached { + return Intl.message( + 'Sorry, you\'ve reached the limit of code changes.', + name: 'codeChangeLimitReached', + desc: '', + args: [], + ); + } + /// `{storageAmountInGB} GB` String storageInGB(Object storageAmountInGB) { return Intl.message( @@ -9375,10 +9415,10 @@ class S { ); } - /// `Handing over your phone to show photos to a friend? Don't worry about them swiping too far.\nGuest view will lock them into the photos you select.` + /// `Handing over your phone to show photos to a friend? Don't worry about them swiping too far. Guest view will lock them into the photos you select.` String get cl_guest_view_description { return Intl.message( - 'Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far.\nGuest view will lock them into the photos you select.', + 'Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far. Guest view will lock them into the photos you select.', name: 'cl_guest_view_description', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 61b3c67f05..6c6deb74d9 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -273,6 +273,10 @@ "failedToApplyCode": "Failed to apply code", "enterReferralCode": "Enter referral code", "codeAppliedPageTitle": "Code applied", + "changeYourReferralCode": "Change your referral code", + "change": "Change", + "unavailableReferralCode": "Sorry, this code is unavailable.", + "codeChangeLimitReached": "Sorry, you've reached the limit of code changes.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Claimed", "@claimed": { diff --git a/mobile/lib/ui/growth/referral_code_widget.dart b/mobile/lib/ui/growth/referral_code_widget.dart index 910ef8de09..d22e591c4d 100644 --- a/mobile/lib/ui/growth/referral_code_widget.dart +++ b/mobile/lib/ui/growth/referral_code_widget.dart @@ -1,12 +1,24 @@ +import "package:dio/dio.dart"; import "package:dotted_border/dotted_border.dart"; import "package:flutter/material.dart"; +import "package:logging/logging.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/services/storage_bonus_service.dart"; import "package:photos/theme/ente_theme.dart"; +import "package:photos/utils/dialog_util.dart"; // Figma: https://www.figma.com/file/SYtMyLBs5SAOkTbfMMzhqt/ente-Visual-Design?node-id=11219%3A62974&t=BRCLJhxXP11Q3Wyw-0 class ReferralCodeWidget extends StatelessWidget { final String codeValue; + final bool shouldAllowEdit; + final Function? notifyParent; - const ReferralCodeWidget(this.codeValue, {Key? key}) : super(key: key); + const ReferralCodeWidget( + this.codeValue, { + this.shouldAllowEdit = false, + this.notifyParent, + super.key, + }); @override Widget build(BuildContext context) { @@ -37,11 +49,18 @@ class ReferralCodeWidget extends StatelessWidget { ), ), const SizedBox(width: 12), - Icon( - Icons.adaptive.share, - size: 22, - color: colorScheme.strokeMuted, - ), + shouldAllowEdit + ? GestureDetector( + onTap: () { + showUpdateReferralCodeDialog(context); + }, + child: Icon( + Icons.edit, + size: 22, + color: colorScheme.strokeMuted, + ), + ) + : const SizedBox.shrink(), ], ), ), @@ -49,4 +68,54 @@ class ReferralCodeWidget extends StatelessWidget { ), ); } + + Future showUpdateReferralCodeDialog(BuildContext context) async { + final result = await showTextInputDialog( + context, + title: S.of(context).changeYourReferralCode, + submitButtonLabel: S.of(context).change, + hintText: S.of(context).enterCode, + alwaysShowSuccessState: true, + initialValue: codeValue, + textCapitalization: TextCapitalization.characters, + onSubmit: (String text) async { + // indicates user cancelled the request + if (text == "" || text.trim() == codeValue) { + return; + } + + try { + await StorageBonusService.instance + .getGateway() + .updateCode(text.trim().toUpperCase()); + notifyParent?.call(); + } catch (e, s) { + Logger("ReferralCodeWidget").severe("Failed to update code", e, s); + if (e is DioError) { + if (e.response?.statusCode == 400) { + await showInfoDialog( + context, + title: S.of(context).error, + body: S.of(context).unavailableReferralCode, + icon: Icons.error, + ); + return; + } else if (e.response?.statusCode == 429) { + await showInfoDialog( + context, + title: S.of(context).error, + body: S.of(context).codeChangeLimitReached, + icon: Icons.error, + ); + return; + } + } + rethrow; + } + }, + ); + if (result is Exception) { + await showGenericErrorDialog(context: context, error: result); + } + } } diff --git a/mobile/lib/ui/growth/referral_screen.dart b/mobile/lib/ui/growth/referral_screen.dart index 570114600d..521f9bccf6 100644 --- a/mobile/lib/ui/growth/referral_screen.dart +++ b/mobile/lib/ui/growth/referral_screen.dart @@ -141,41 +141,57 @@ class ReferralWidget extends StatelessWidget { ), ); }, - child: Container( - width: double.infinity, - decoration: BoxDecoration( - border: Border.all( - color: colorScheme.strokeFaint, - width: 1, - ), - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 12, - horizontal: 12, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - S.of(context).referralStep1, + child: Stack( + children: [ + Container( + width: double.infinity, + decoration: BoxDecoration( + border: Border.all( + color: colorScheme.strokeFaint, + width: 1, ), - const SizedBox(height: 12), - ReferralCodeWidget(referralView.code), - const SizedBox(height: 12), - Text( - S.of(context).referralStep2, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12, + horizontal: 12, ), - const SizedBox(height: 12), - Text( - S - .of(context) - .referralStep3(referralView.planInfo.storageInGB), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).referralStep1, + ), + const SizedBox(height: 12), + ReferralCodeWidget( + referralView.code, + shouldAllowEdit: true, + notifyParent: notifyParent, + ), + const SizedBox(height: 12), + Text( + S.of(context).referralStep2, + ), + const SizedBox(height: 12), + Text( + S.of(context).referralStep3( + referralView.planInfo.storageInGB, + ), + ), + ], ), - ], + ), ), - ), + Positioned( + right: 8, + top: 8, + child: Icon( + Icons.adaptive.share, + color: colorScheme.blurStrokePressed, + ), + ), + ], ), ) : Padding( From 7dd1804e2e4cd50982a1c50ba00b4bbc6267064d Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 20:13:57 +0530 Subject: [PATCH 0498/1179] [mob][auth] change copy --- auth/lib/l10n/arb/app_en.arb | 2 +- auth/lib/ui/settings/lock_screen/lock_screen_options.dart | 2 +- mobile/lib/l10n/intl_en.arb | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/auth/lib/l10n/arb/app_en.arb b/auth/lib/l10n/arb/app_en.arb index 00d64cdec3..06b5e42c44 100644 --- a/auth/lib/l10n/arb/app_en.arb +++ b/auth/lib/l10n/arb/app_en.arb @@ -182,7 +182,7 @@ "security": "Security", "lockscreen": "Lockscreen", "authToChangeLockscreenSetting": "Please authenticate to change lockscreen setting", - "lockScreenEnablePreSteps": "To enable lockscreen, please setup device passcode or screen lock in your system settings.", + "deviceLockEnablePreSteps": "To enable device lock, please setup device passcode or screen lock in your system settings.", "viewActiveSessions": "View active sessions", "authToViewYourActiveSessions": "Please authenticate to view your active sessions", "searchHint": "Search...", diff --git a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart index 3196ff895d..b055a94f1d 100644 --- a/auth/lib/ui/settings/lock_screen/lock_screen_options.dart +++ b/auth/lib/ui/settings/lock_screen/lock_screen_options.dart @@ -70,7 +70,7 @@ class _LockScreenOptionsState extends State { await showErrorDialog( context, context.l10n.noSystemLockFound, - context.l10n.toEnableAppLockPleaseSetupDevicePasscodeOrScreen, + context.l10n.deviceLockEnablePreSteps, ); } await _initializeSettings(); diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 0a68ef1a67..97c1e6f688 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1289,7 +1289,6 @@ "setNewPin": "Set new PIN", "appLock": "App lock", "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "tapToUnlock": "Tap to unlock", "tooManyIncorrectAttempts": "Too many incorrect attempts", "videoInfo": "Video Info", From 0ae080ea6a906c39788cea5a3a1095f5b69de163 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Wed, 21 Aug 2024 20:14:56 +0530 Subject: [PATCH 0499/1179] [mob][auth] bump up version to 3.1.3 --- auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 1e0e3ffb05..8c7e28b873 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 3.1.2+322 +version: 3.1.3+323 publish_to: none environment: From cc10a3a4aced4452c43ef75790abf24e9a28c486 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Wed, 21 Aug 2024 21:47:04 +0530 Subject: [PATCH 0500/1179] fix(mob): readd missing key in locals --- mobile/lib/generated/intl/messages_cs.dart | 2 -- mobile/lib/generated/intl/messages_de.dart | 2 -- mobile/lib/generated/intl/messages_en.dart | 2 -- mobile/lib/generated/intl/messages_es.dart | 2 -- mobile/lib/generated/intl/messages_fr.dart | 2 -- mobile/lib/generated/intl/messages_it.dart | 2 -- mobile/lib/generated/intl/messages_ko.dart | 2 -- mobile/lib/generated/intl/messages_nl.dart | 2 -- mobile/lib/generated/intl/messages_no.dart | 2 -- mobile/lib/generated/intl/messages_pl.dart | 2 -- mobile/lib/generated/intl/messages_pt.dart | 2 -- mobile/lib/generated/intl/messages_ru.dart | 2 -- mobile/lib/generated/intl/messages_tr.dart | 2 -- mobile/lib/generated/intl/messages_zh.dart | 2 -- mobile/lib/generated/l10n.dart | 20 ++++++++++---------- mobile/lib/l10n/intl_en.arb | 8 +++----- 16 files changed, 13 insertions(+), 43 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index d1c091d780..bc7c9f0404 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -33,8 +33,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Add to hidden album"), "addViewers": m1, "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 871521d24c..22ab6ccf6c 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -312,8 +312,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage( "Authentifizierung erforderlich"), "appLock": MessageLookupByLibrary.simpleMessage("App-Sperre"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index d09baa6132..20dd17e0ad 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -301,8 +301,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Authentication required"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 03067118d8..15b3fc0beb 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -311,8 +311,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autentificación requerida"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 112d236006..d390dc3c2e 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -299,8 +299,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Authentification requise"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 80c9f5189c..c92c5d49f6 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -292,8 +292,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autenticazione necessaria"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 591d9dd415..56428cbdf5 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -33,8 +33,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Add to hidden album"), "addViewers": m1, "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 08ae3af724..870bdb30d4 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -311,8 +311,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Verificatie vereist"), "appLock": MessageLookupByLibrary.simpleMessage("App-vergrendeling"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Kies tussen het standaard vergrendelingsscherm van uw apparaat en een aangepast vergrendelingsscherm met een pincode of wachtwoord."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 0924d20e93..9e27e5363a 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -35,8 +35,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Add to hidden album"), "addViewers": m1, "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "askDeleteReason": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 6d56441276..523a98f0ad 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -310,8 +310,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wymagane uwierzytelnienie"), "appLock": MessageLookupByLibrary.simpleMessage( "Blokada dostępu do aplikacji"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 2e52209c2a..7fc0476be0 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -309,8 +309,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autenticação necessária"), "appLock": MessageLookupByLibrary.simpleMessage("Bloqueio de app"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 9753246ac5..c50c61e2e8 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -305,8 +305,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Требуется аутентификация"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 744b8d3d1c..1d6e751171 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -305,8 +305,6 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Kimlik doğrulaması gerekli"), "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "Choose between your device\\\'s default lock screen and a custom lock screen with a PIN or password."), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 4f9cf2c069..a93d621016 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -271,8 +271,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("安卓, iOS, 网页端, 桌面端"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("需要身份验证"), "appLock": MessageLookupByLibrary.simpleMessage("应用锁"), - "appLockDescription": MessageLookupByLibrary.simpleMessage( - "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "appVersion": m7, diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index dfa3deb905..dfcb284687 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9225,16 +9225,6 @@ class S { ); } - /// `To enable app lock, please setup device passcode or screen lock in your system settings.` - String get toEnableAppLockPleaseSetupDevicePasscodeOrScreen { - return Intl.message( - 'To enable app lock, please setup device passcode or screen lock in your system settings.', - name: 'toEnableAppLockPleaseSetupDevicePasscodeOrScreen', - desc: '', - args: [], - ); - } - /// `Tap to unlock` String get tapToUnlock { return Intl.message( @@ -9474,6 +9464,16 @@ class S { args: [], ); } + + /// `To enable app lock, please setup device passcode or screen lock in your system settings.` + String get toEnableAppLockPleaseSetupDevicePasscodeOrScreen { + return Intl.message( + 'To enable app lock, please setup device passcode or screen lock in your system settings.', + name: 'toEnableAppLockPleaseSetupDevicePasscodeOrScreen', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 97c1e6f688..541e994fe6 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1312,8 +1312,6 @@ "cl_panorama_viewer_description": "We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!", "cl_video_player_title": "Video Player", "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." -} - - - + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings." +} \ No newline at end of file From 87a17c003442e319e206649ebf572e7e41c506a4 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 18:20:49 +0200 Subject: [PATCH 0501/1179] [mob][photos] Convert heic to jpg for ML on Android --- mobile/lib/utils/image_ml_util.dart | 30 ++++++++++++++++++++++------- mobile/pubspec.lock | 8 ++++++++ mobile/pubspec.yaml | 1 + 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 04a5f3ab53..843f535343 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -1,11 +1,12 @@ import "dart:async"; import "dart:developer" show log; -import "dart:io" show File; +import "dart:io" show File, Platform; import "dart:math" show max, min; import "dart:typed_data" show Float32List, Uint8List, ByteData; import "dart:ui"; import 'package:flutter/painting.dart' as paint show decodeImageFromList; +import "package:heif_converter/heif_converter.dart"; import "package:logging/logging.dart"; import 'package:ml_linalg/linalg.dart'; import "package:photos/models/ml/face/box.dart"; @@ -27,12 +28,27 @@ Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { final ByteData imageByteData = await getByteDataFromImage(image); return (image, imageByteData); } catch (e, s) { - _logger.severe( - 'Error decoding image of format ${imagePath.split('.').last}:', - e, - s, - ); - throw Exception('InvalidImageFormatException: Error decoding image'); + final format = imagePath.split('.').last; + if ((format == 'heic' || format == 'heif') && Platform.isAndroid) { + _logger.info('Cannot decode $format, converting to JPG format'); + final String? jpgPath = + await HeifConverter.convert(imagePath, format: 'jpg'); + if (jpgPath == null) { + _logger.severe('Error converting $format to jpg:', e, s); + throw Exception('InvalidImageFormatException: Error decoding image'); + } + final imageData = await File(jpgPath).readAsBytes(); + final image = await decodeImageFromData(imageData); + final ByteData imageByteData = await getByteDataFromImage(image); + return (image, imageByteData); + } else { + _logger.severe( + 'Error decoding image of format ${imagePath.split('.').last}:', + e, + s, + ); + throw Exception('InvalidImageFormatException: Error decoding image'); + } } } diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 73db1a24fa..cb234fe33a 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1024,6 +1024,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + heif_converter: + dependency: "direct main" + description: + name: heif_converter + sha256: "63ffc2a72026942de3fcb61450da197100759936085c8279aef35b995b3c1bb3" + url: "https://pub.dev" + source: hosted + version: "1.0.0" hex: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index f48b17f250..d2a96cd883 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -94,6 +94,7 @@ dependencies: fraction: ^5.0.2 freezed_annotation: ^2.4.1 google_nav_bar: ^5.0.5 + heif_converter: ^1.0.0 home_widget: ^0.6.0 html_unescape: ^2.0.0 http: ^1.1.0 From 58dee0ef5ae3c609f127b2a2afc8432c50823c8b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 21:51:35 +0530 Subject: [PATCH 0502/1179] [mob] Disable global ml flag --- mobile/lib/ui/settings/machine_learning_settings_page.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 1deead85b0..89a074ea5b 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -203,10 +203,8 @@ class _MachineLearningSettingsPageState await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); } else { - // todo: Take a call if we should disable ML from other devices as well - // when the user turns off indexing on mobile - // await UserRemoteFlagService.instance - // .setBoolValue(UserRemoteFlagService.mlEnabled, false); + await UserRemoteFlagService.instance + .setBoolValue(UserRemoteFlagService.mlEnabled, false); } if (mounted) { setState(() {}); From 5ef4b7160e7cb88cb6758be29a81acd785ccb815 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 18:31:55 +0200 Subject: [PATCH 0503/1179] [mob][photos] Store ML results on remote first --- .../services/machine_learning/ml_service.dart | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 7acfa58264..d1703de8d9 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -400,8 +400,8 @@ class MLService { DataType.mlData, ); // Faces results + final List faces = []; if (result.facesRan) { - final List faces = []; if (result.faces!.isEmpty) { faces.add(Face.empty(result.fileId)); _logger.info("no face detected, storing empty for ${result.fileId}"); @@ -418,7 +418,6 @@ class MLService { } _logger.info("storing ${faces.length} faces for ${result.fileId}"); } - await MLDataDB.instance.bulkInsertFaces(faces); dataEntity.putFace( RemoteFaceEmbedding( faces, @@ -431,9 +430,6 @@ class MLService { } // Clip results if (result.clipRan) { - await SemanticSearchService.storeClipImageResult( - result.clip!, - ); dataEntity.putClip( RemoteClipEmbedding( result.clip!.embedding, @@ -442,11 +438,20 @@ class MLService { ), ); } - // Storing all results on remote + // Storing results on remote await FileDataService.instance.putFileData( instruction.file, dataEntity, ); + _logger.info("Results for file ${result.fileId} stored on remote"); + // Storing results locally + if (result.facesRan) await MLDataDB.instance.bulkInsertFaces(faces); + if (result.clipRan) { + await SemanticSearchService.storeClipImageResult( + result.clip!, + ); + } + _logger.info("Results for file ${result.fileId} stored locally"); return actuallyRanML; } catch (e, s) { bool acceptedIssue = false; @@ -459,7 +464,8 @@ class MLService { ); acceptedIssue = true; } - if (errorString.contains('InvalidImageFormatException: Error decoding image')) { + if (errorString + .contains('InvalidImageFormatException: Error decoding image')) { _logger.severe( 'InvalidImageFormatException while processing image with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', e, From 3d92a13df63062f441e60c09feefdcab2361a2fc Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 21 Aug 2024 18:34:57 +0200 Subject: [PATCH 0504/1179] [mob][photos] Rename ML DB --- mobile/lib/db/ml/db.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 6a4f965a4d..1a7b6ca6a6 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -28,7 +28,7 @@ import 'package:sqlite_async/sqlite_async.dart'; class MLDataDB { static final Logger _logger = Logger("MLDataDB"); - static const _databaseName = "ente.face_ml_db_v3.db"; + static const _databaseName = "ente.ml.db"; // static const _databaseVersion = 1; From 936f3842f9876b62b8fd95f0e175821778063a10 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 22:10:59 +0530 Subject: [PATCH 0505/1179] [mob] Bump version v0.9.24 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index d2a96cd883..98e61a187c 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.23+923 +version: 0.9.24+924 publish_to: none environment: From f34a2cb2176bf7acab6197fe14c2c0eaa9005970 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 21 Aug 2024 22:23:26 +0530 Subject: [PATCH 0506/1179] [desktop] Bump up the version for the next series --- desktop/CHANGELOG.md | 4 ++++ desktop/package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index 1136762943..94afb2ad16 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## v1.7.4 (Unreleased) + +- . + ## v1.7.3 - Face recognition and magic search (public beta). diff --git a/desktop/package.json b/desktop/package.json index db4cb7ec58..7dc13d845f 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "ente", - "version": "1.7.3", + "version": "1.7.4-beta", "private": true, "description": "Desktop client for Ente Photos", "repository": "github:ente-io/photos-desktop", From 5beec1d3dd8e5b272e650df06b4b96a016b1d030 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:05:40 +0530 Subject: [PATCH 0507/1179] [mob] Skip magic refresh if indexing is disabled --- mobile/lib/services/magic_cache_service.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index 6c66b1bbcc..f70c19316b 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -94,6 +94,9 @@ class MagicCacheService { } Future _updateCacheIfTheTimeHasCome() async { + if (localSettings.isFaceIndexingEnabled) { + return; + } final jsonFile = await RemoteAssetsService.instance .getAssetIfUpdated(_kMagicPromptsDataUrl); if (jsonFile != null) { From 7e9d9bc1268e1c1a617d70d0620f3888b6dc4a26 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:05:50 +0530 Subject: [PATCH 0508/1179] [mob] iOS Build changes --- mobile/ios/Podfile.lock | 6 ++++++ mobile/ios/Runner.xcodeproj/project.pbxproj | 2 ++ 2 files changed, 8 insertions(+) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index dc42f83a4b..9ccda2d8ef 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -108,6 +108,8 @@ PODS: - GoogleUtilities/UserDefaults (7.13.3): - GoogleUtilities/Logger - GoogleUtilities/Privacy + - heif_converter (1.0.0): + - Flutter - home_widget (0.0.1): - Flutter - image_editor_common (1.0.0): @@ -261,6 +263,7 @@ DEPENDENCIES: - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_sodium (from `.symlinks/plugins/flutter_sodium/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) + - heif_converter (from `.symlinks/plugins/heif_converter/ios`) - home_widget (from `.symlinks/plugins/home_widget/ios`) - image_editor_common (from `.symlinks/plugins/image_editor_common/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) @@ -361,6 +364,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_sodium/ios" fluttertoast: :path: ".symlinks/plugins/fluttertoast/ios" + heif_converter: + :path: ".symlinks/plugins/heif_converter/ios" home_widget: :path: ".symlinks/plugins/home_widget/ios" image_editor_common: @@ -462,6 +467,7 @@ SPEC CHECKSUMS: fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + heif_converter: e3802659e4104e27e28c4d7bff07903da2f69318 home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57 image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43 image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj index dd14771994..349bf83d4a 100644 --- a/mobile/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -305,6 +305,7 @@ "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", "${BUILT_PRODUCTS_DIR}/flutter_sodium/flutter_sodium.framework", "${BUILT_PRODUCTS_DIR}/fluttertoast/fluttertoast.framework", + "${BUILT_PRODUCTS_DIR}/heif_converter/heif_converter.framework", "${BUILT_PRODUCTS_DIR}/home_widget/home_widget.framework", "${BUILT_PRODUCTS_DIR}/image_editor_common/image_editor_common.framework", "${BUILT_PRODUCTS_DIR}/image_picker_ios/image_picker_ios.framework", @@ -400,6 +401,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_sodium.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/fluttertoast.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/heif_converter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/home_widget.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_editor_common.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker_ios.framework", From 165f288ad9acb4a54aa7cad61f99b539d86924d2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:07:47 +0530 Subject: [PATCH 0509/1179] [mob] Remove unused key --- mobile/lib/utils/local_settings.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index 726aa04af8..b6dc3a25e7 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -10,9 +10,7 @@ enum AlbumSortKey { class LocalSettings { static const kCollectionSortPref = "collection_sort_pref"; static const kPhotoGridSize = "photo_grid_size"; - static const kEnableMagicSearch = "enable_magic_search"; static const kEnableFaceIndexing = "enable_face_indexing"; - static const kEnableFaceClustering = "enable_face_clustering"; static const kRateUsShownCount = "rate_us_shown_count"; static const kEnableMultiplePart = "ls.enable_multiple_part"; static const kRateUsPromptThreshold = 2; @@ -68,9 +66,6 @@ class LocalSettings { return value; } - bool get isFaceClusteringEnabled => - _prefs.getBool(kEnableFaceIndexing) ?? false; - /// toggleFaceIndexing toggles the face indexing setting and returns the new value Future toggleFaceIndexing() async { await _prefs.setBool(kEnableFaceIndexing, !isFaceIndexingEnabled); From a1b447c5c85556a021abeb94cb6511300061dbad Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:14:28 +0530 Subject: [PATCH 0510/1179] [mob] Rename --- .../lib/services/machine_learning/ml_service.dart | 6 +++--- .../semantic_search/semantic_search_service.dart | 6 +++--- mobile/lib/services/magic_cache_service.dart | 2 +- mobile/lib/services/search_service.dart | 2 +- .../settings/debug/ml_debug_section_widget.dart | 4 ++-- .../settings/machine_learning_settings_page.dart | 10 +++++----- .../lib/ui/viewer/file/file_details_widget.dart | 2 +- mobile/lib/ui/viewer/search_tab/search_tab.dart | 2 +- mobile/lib/utils/local_settings.dart | 15 +++++++++------ 9 files changed, 26 insertions(+), 23 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index d1703de8d9..7fb523a917 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -62,7 +62,7 @@ class MLService { /// Only call this function once at app startup, after that you can directly call [runAllML] Future init({bool firstTime = false}) async { - if (localSettings.isFaceIndexingEnabled == false || _isInitialized) { + if (localSettings.isMLIndexingEnabled == false || _isInitialized) { return; } _logger.info("init called"); @@ -80,7 +80,7 @@ class MLService { // Listen on MachineLearningController Bus.instance.on().listen((event) { - if (localSettings.isFaceIndexingEnabled == false) { + if (localSettings.isMLIndexingEnabled == false) { return; } _mlControllerStatus = event.shouldRun; @@ -572,7 +572,7 @@ class MLService { void _logStatus() { final String status = ''' isInternalUser: ${flagService.internalUser} - isFaceIndexingEnabled: ${localSettings.isFaceIndexingEnabled} + isMLIndexingEnabled: ${localSettings.isMLIndexingEnabled} canRunMLController: $_mlControllerStatus isIndexingOrClusteringRunning: $_isIndexingOrClusteringRunning shouldPauseIndexingAndClustering: $_shouldPauseIndexingAndClustering diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index a9d8eced29..a7c846c29c 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -42,7 +42,7 @@ class SemanticSearchService { String? _latestPendingQuery; Future init() async { - if (!localSettings.isFaceIndexingEnabled) { + if (!localSettings.isMLIndexingEnabled) { return; } if (_hasInitialized) { @@ -60,7 +60,7 @@ class SemanticSearchService { } bool isMagicSearchEnabledAndReady() { - return localSettings.isFaceIndexingEnabled && + return localSettings.isMLIndexingEnabled && _textModelIsLoaded && _cachedImageEmbeddings.isNotEmpty; } @@ -72,7 +72,7 @@ class SemanticSearchService { if (!isMagicSearchEnabledAndReady()) { if (flagService.internalUser) { _logger.info( - "Magic search enabled ${localSettings.isFaceIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}", + "Magic search enabled ${localSettings.isMLIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}", ); } return (query, []); diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index f70c19316b..abe1f334a8 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -94,7 +94,7 @@ class MagicCacheService { } Future _updateCacheIfTheTimeHasCome() async { - if (localSettings.isFaceIndexingEnabled) { + if (localSettings.isMLIndexingEnabled) { return; } final jsonFile = await RemoteAssetsService.instance diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index ae00e18299..88462d7add 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -177,7 +177,7 @@ class SearchService { } Future> getMagicSectionResutls() async { - if (localSettings.isFaceIndexingEnabled && flagService.internalUser) { + if (localSettings.isMLIndexingEnabled && flagService.internalUser) { return MagicCacheService.instance.getMagicGenericSearchResult(); } else { return []; diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index feb10dac92..7b888e066b 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -63,7 +63,7 @@ class _MLDebugSectionWidgetState extends State { builder: (context, snapshot) { if (snapshot.hasData) { return CaptionedTextWidget( - title: localSettings.isFaceIndexingEnabled + title: localSettings.isMLIndexingEnabled ? "Disable faces (${snapshot.data!} files done)" : "Enable faces (${snapshot.data!} files done)", ); @@ -76,7 +76,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - final isEnabled = await localSettings.toggleFaceIndexing(); + final isEnabled = await localSettings.toggleMLIndexing(); if (!isEnabled) { MLService.instance.pauseIndexingAndClustering(); } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 89a074ea5b..dbd96e8a43 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -66,7 +66,7 @@ class _MachineLearningSettingsPageState @override Widget build(BuildContext context) { - final hasEnabled = localSettings.isFaceIndexingEnabled; + final hasEnabled = localSettings.isMLIndexingEnabled; return Scaffold( body: CustomScrollView( primary: false, @@ -184,7 +184,7 @@ class _MachineLearningSettingsPageState Future toggleIndexingState() async { final hasGivenConsent = UserRemoteFlagService.instance .getCachedBoolValue(UserRemoteFlagService.mlEnabled); - if (!localSettings.isFaceIndexingEnabled && !hasGivenConsent) { + if (!localSettings.isMLIndexingEnabled && !hasGivenConsent) { final result = await Navigator.push( context, MaterialPageRoute( @@ -197,7 +197,7 @@ class _MachineLearningSettingsPageState return; } } - final isEnabled = await localSettings.toggleFaceIndexing(); + final isEnabled = await localSettings.toggleMLIndexing(); if (isEnabled) { await MLService.instance.init(firstTime: true); await SemanticSearchService.instance.init(); @@ -213,7 +213,7 @@ class _MachineLearningSettingsPageState Widget _getMlSettings(BuildContext context) { final colorScheme = getEnteColorScheme(context); - final hasEnabled = localSettings.isFaceIndexingEnabled; + final hasEnabled = localSettings.isMLIndexingEnabled; return Column( children: [ if (hasEnabled) @@ -223,7 +223,7 @@ class _MachineLearningSettingsPageState ), menuItemColor: colorScheme.fillFaint, trailingWidget: ToggleSwitchWidget( - value: () => localSettings.isFaceIndexingEnabled, + value: () => localSettings.isMLIndexingEnabled, onChanged: () async { await toggleIndexingState(); }, diff --git a/mobile/lib/ui/viewer/file/file_details_widget.dart b/mobile/lib/ui/viewer/file/file_details_widget.dart index 98bf342012..21318523ba 100644 --- a/mobile/lib/ui/viewer/file/file_details_widget.dart +++ b/mobile/lib/ui/viewer/file/file_details_widget.dart @@ -280,7 +280,7 @@ class _FileDetailsWidgetState extends State { ]); } - if (localSettings.isFaceIndexingEnabled) { + if (localSettings.isMLIndexingEnabled) { fileDetailsTiles.addAll([ FacesItemWidget(file), const FileDetailsDivider(), diff --git a/mobile/lib/ui/viewer/search_tab/search_tab.dart b/mobile/lib/ui/viewer/search_tab/search_tab.dart index e6ffb43da8..650eb1be11 100644 --- a/mobile/lib/ui/viewer/search_tab/search_tab.dart +++ b/mobile/lib/ui/viewer/search_tab/search_tab.dart @@ -115,7 +115,7 @@ class _AllSearchSectionsState extends State { itemBuilder: (context, index) { switch (searchTypes[index]) { case SectionType.face: - if (!localSettings.isFaceIndexingEnabled) { + if (!localSettings.isMLIndexingEnabled) { return const SizedBox.shrink(); } return PeopleSection( diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index b6dc3a25e7..cdf0b6ef63 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -10,7 +10,7 @@ enum AlbumSortKey { class LocalSettings { static const kCollectionSortPref = "collection_sort_pref"; static const kPhotoGridSize = "photo_grid_size"; - static const kEnableFaceIndexing = "enable_face_indexing"; + static const _kisMLIndexingEnabled = "ls.enable_ml_idx"; static const kRateUsShownCount = "rate_us_shown_count"; static const kEnableMultiplePart = "ls.enable_multiple_part"; static const kRateUsPromptThreshold = 2; @@ -55,8 +55,11 @@ class LocalSettings { return getRateUsShownCount() < kRateUsPromptThreshold; } - bool get isFaceIndexingEnabled => - _prefs.getBool(kEnableFaceIndexing) ?? false; + // remove `enable_face_indexing`fallback after sometime, affects internal users only + bool get isMLIndexingEnabled => + _prefs.getBool(_kisMLIndexingEnabled) ?? + _prefs.getBool('enable_face_indexing') ?? + false; bool get userEnabledMultiplePart => _prefs.getBool(kEnableMultiplePart) ?? false; @@ -67,9 +70,9 @@ class LocalSettings { } /// toggleFaceIndexing toggles the face indexing setting and returns the new value - Future toggleFaceIndexing() async { - await _prefs.setBool(kEnableFaceIndexing, !isFaceIndexingEnabled); - return isFaceIndexingEnabled; + Future toggleMLIndexing() async { + await _prefs.setBool(_kisMLIndexingEnabled, !isMLIndexingEnabled); + return isMLIndexingEnabled; } //#region todo:(NG) remove this section, only needed for internal testing to see From 915612195417df914e2c45856713c4e587639cd5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:14:53 +0530 Subject: [PATCH 0511/1179] bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 98e61a187c..f594556d65 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.24+924 +version: 0.9.25+925 publish_to: none environment: From ab58dcfeb4c78a60b78234102c0ced58be92f5cb Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:37:29 +0530 Subject: [PATCH 0512/1179] [mob][photos] Fix person cover photo --- mobile/lib/models/ml/face/person.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/models/ml/face/person.dart b/mobile/lib/models/ml/face/person.dart index 49754be925..2e5191c485 100644 --- a/mobile/lib/models/ml/face/person.dart +++ b/mobile/lib/models/ml/face/person.dart @@ -131,7 +131,7 @@ class PersonData { name: json['name'] as String, assigned: assigned, rejected: rejected, - avatarFaceID: json['avatarFaceId'] as String?, + avatarFaceID: json['avatarFaceID'] as String?, isHidden: json['isHidden'] as bool? ?? false, birthDate: json['birthDate'] as String?, ); From c2e540f82190df1232e4c3526e710cfb0775c081 Mon Sep 17 00:00:00 2001 From: S T Date: Wed, 21 Aug 2024 21:30:39 -0700 Subject: [PATCH 0513/1179] [auth][l10n] Added Ukrainian translation (#2806) ## Description ## Tests Co-authored-by: stro --- auth/lib/locale.dart | 1 + auth/lib/ui/settings/language_picker.dart | 2 ++ 2 files changed, 3 insertions(+) diff --git a/auth/lib/locale.dart b/auth/lib/locale.dart index ebca9528af..b66d6a3d93 100644 --- a/auth/lib/locale.dart +++ b/auth/lib/locale.dart @@ -17,6 +17,7 @@ const List appSupportedLocales = [ Locale('pt', 'BR'), Locale('ru'), Locale('tr'), + Locale('uk'), Locale("zh", "CN"), ]; diff --git a/auth/lib/ui/settings/language_picker.dart b/auth/lib/ui/settings/language_picker.dart index 1d0aa32e80..f9b94948f9 100644 --- a/auth/lib/ui/settings/language_picker.dart +++ b/auth/lib/ui/settings/language_picker.dart @@ -154,6 +154,8 @@ class _ItemsWidgetState extends State { return 'Русский'; case 'tr': return 'Türkçe'; + case 'uk': + return 'Українська'; case 'fi': return 'Suomi'; case 'zh': From e1da8b90fd7089bce9a924401187571c5e310920 Mon Sep 17 00:00:00 2001 From: Nikunj Kumar Nakum <40589688+nikunjkumarnakum@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:01:12 +0530 Subject: [PATCH 0514/1179] [auth] Updated Kraken icon (#2763) ## Description Updated kraken icon to latest icon ## Tests --- auth/assets/custom-icons/icons/kraken.svg | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/auth/assets/custom-icons/icons/kraken.svg b/auth/assets/custom-icons/icons/kraken.svg index f46c926724..260d14342e 100644 --- a/auth/assets/custom-icons/icons/kraken.svg +++ b/auth/assets/custom-icons/icons/kraken.svg @@ -1 +1,18 @@ - + + + + + + + + + + + + + + + + + + From c42fd383a8096c84194cf255c811401a9d4295b1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 22 Aug 2024 11:54:59 +0530 Subject: [PATCH 0515/1179] [mob] Switch to upstream pkg for onnxruntime --- mobile/ios/Podfile.lock | 34 +++++++++++++++++----------------- mobile/pubspec.lock | 11 +++++------ mobile/pubspec.yaml | 5 +---- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 9ccda2d8ef..8ebcc2c8fe 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -35,9 +35,9 @@ PODS: - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.28.0): + - FirebaseCoreInternal (10.29.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.28.0): + - FirebaseInstallations (10.29.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) @@ -165,12 +165,12 @@ PODS: - Flutter - onnxruntime (0.0.1): - Flutter - - onnxruntime-objc (= 1.18.0) - - onnxruntime-c (1.18.0) - - onnxruntime-objc (1.18.0): - - onnxruntime-objc/Core (= 1.18.0) - - onnxruntime-objc/Core (1.18.0): - - onnxruntime-c (= 1.18.0) + - onnxruntime-objc (= 1.15.1) + - onnxruntime-c (1.15.1) + - onnxruntime-objc (1.15.1): + - onnxruntime-objc/Core (= 1.15.1) + - onnxruntime-objc/Core (1.15.1): + - onnxruntime-c (= 1.15.1) - open_mail_app (0.0.1): - Flutter - OrderedSet (5.0.0) @@ -191,9 +191,9 @@ PODS: - Flutter - screen_brightness_ios (0.1.0): - Flutter - - SDWebImage (5.19.2): - - SDWebImage/Core (= 5.19.2) - - SDWebImage/Core (5.19.2) + - SDWebImage (5.19.6): + - SDWebImage/Core (= 5.19.6) + - SDWebImage/Core (5.19.6) - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) @@ -452,8 +452,8 @@ SPEC CHECKSUMS: firebase_core: 66b99b4fb4e5d7cc4e88d4c195fe986681f3466a firebase_messaging: 0eb0425d28b4f4af147cdd4adcaf7c0100df28ed FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894 - FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698 - FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e + FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 + FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd FirebaseMessaging: 4d52717dd820707cc4eadec5eb981b4832ec8d5d fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 @@ -487,9 +487,9 @@ SPEC CHECKSUMS: move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d nanopb: 438bc412db1928dac798aa6fd75726007be04262 native_video_player: d12af78a1a4a8cf09775a5177d5b392def6fd23c - onnxruntime: e7c2ae44385191eaad5ae64c935a72debaddc997 - onnxruntime-c: a909204639a1f035f575127ac406f781ac797c9c - onnxruntime-objc: b6fab0f1787aa6f7190c2013f03037df4718bd8b + onnxruntime: e9346181d75b8dea8733bdae512a22c298962e00 + onnxruntime-c: ebdcfd8650bcbd10121c125262f99dea681b92a3 + onnxruntime-objc: ae7acec7a3d03eaf072d340afed7a35635c1c2a6 open_mail_app: 794172f6a22cd16319d3ddaf45e945b2f74952b0 OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 @@ -500,7 +500,7 @@ SPEC CHECKSUMS: PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 receive_sharing_intent: 6837b01768e567fe8562182397bf43d63d8c6437 screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 - SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a + SDWebImage: a79252b60f4678812d94316c91da69ec83089c9f SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 Sentry: ebc12276bd17613a114ab359074096b6b3725203 sentry_flutter: 88ebea3f595b0bc16acc5bedacafe6d60c12dcd5 diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index cb234fe33a..463a5ef926 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1666,12 +1666,11 @@ packages: onnxruntime: dependency: "direct main" description: - path: "." - ref: ente_onnxruntime - resolved-ref: fb9393e36013790938b5bc995a4dca15fed3c944 - url: "https://github.com/ente-io/onnxruntime.git" - source: git - version: "1.1.0" + name: onnxruntime + sha256: e77ec05acafc135cc5fe7bcdf11b101b39f06513c9d5e9fa02cb1929f6bac72a + url: "https://pub.dev" + source: hosted + version: "1.4.1" open_mail_app: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index f594556d65..3446823991 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -128,10 +128,7 @@ dependencies: native_video_player: ^1.3.1 onnx_dart: path: plugins/onnx_dart - onnxruntime: - git: - url: https://github.com/ente-io/onnxruntime.git - ref: ente_onnxruntime + onnxruntime: ^1.4.1 open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 From 67f230fac59e1fa9a21fed1392f83a495a69ee73 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 09:19:14 +0200 Subject: [PATCH 0516/1179] [mob][photos] Indexing description copy change --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 20dd17e0ad..2a7b7c4910 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -997,7 +997,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentTitle": MessageLookupByLibrary.simpleMessage("Enable machine learning?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), + "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed. Consider using the desktop app for faster indexing, all results will be synced automatically."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderate"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index dfcb284687..8d249e569f 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2966,10 +2966,10 @@ class S { ); } - /// `Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.` + /// `Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed. Consider using the desktop app for faster indexing, all results will be synced automatically.` String get mlIndexingDescription { return Intl.message( - 'Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.', + 'Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed. Consider using the desktop app for faster indexing, all results will be synced automatically.', name: 'mlIndexingDescription', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 541e994fe6..350d646bc1 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -419,7 +419,7 @@ "mlConsentPrivacy": "Please click here for more details about this feature in our privacy policy", "mlConsentConfirmation": "I understand, and wish to enable machine learning", "magicSearch": "Magic search", - "mlIndexingDescription": "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.", + "mlIndexingDescription": "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed. Consider using the desktop app for faster indexing, all results will be synced automatically.", "loadingModel": "Downloading models...", "waitingForWifi": "Waiting for WiFi...", "status": "Status", From 4ee815e53011d341714cf127e8a48a4bc1ede28a Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 13:10:30 +0530 Subject: [PATCH 0517/1179] Prompt family members to contact admin to change referral code --- mobile/lib/generated/intl/messages_en.dart | 4 +++ mobile/lib/generated/l10n.dart | 10 +++++++ mobile/lib/l10n/intl_en.arb | 1 + .../lib/ui/growth/referral_code_widget.dart | 27 ++++++++++++++++--- mobile/lib/ui/growth/referral_screen.dart | 3 ++- 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index c0dda0ce55..0cc81cb39b 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -127,6 +127,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Not ${name}?"; + static String m71(familyAdminEmail) => + "Please contact ${familyAdminEmail} to change your code."; + static String m38(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; @@ -1067,6 +1070,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), + "onlyFamilyAdminCanChangeCode": m71, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("Oops, could not save edits"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index a1ad4fe581..94729093a1 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2096,6 +2096,16 @@ class S { ); } + /// `Please contact {familyAdminEmail} to change your code.` + String onlyFamilyAdminCanChangeCode(Object familyAdminEmail) { + return Intl.message( + 'Please contact $familyAdminEmail to change your code.', + name: 'onlyFamilyAdminCanChangeCode', + desc: '', + args: [familyAdminEmail], + ); + } + /// `{storageAmountInGB} GB` String storageInGB(Object storageAmountInGB) { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 6c6deb74d9..18f3ab1068 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -277,6 +277,7 @@ "change": "Change", "unavailableReferralCode": "Sorry, this code is unavailable.", "codeChangeLimitReached": "Sorry, you've reached the limit of code changes.", + "onlyFamilyAdminCanChangeCode": "Please contact {familyAdminEmail} to change your code.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Claimed", "@claimed": { diff --git a/mobile/lib/ui/growth/referral_code_widget.dart b/mobile/lib/ui/growth/referral_code_widget.dart index d22e591c4d..a314360be8 100644 --- a/mobile/lib/ui/growth/referral_code_widget.dart +++ b/mobile/lib/ui/growth/referral_code_widget.dart @@ -3,6 +3,7 @@ import "package:dotted_border/dotted_border.dart"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/models/user_details.dart"; import "package:photos/services/storage_bonus_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/utils/dialog_util.dart"; @@ -10,12 +11,14 @@ import "package:photos/utils/dialog_util.dart"; // Figma: https://www.figma.com/file/SYtMyLBs5SAOkTbfMMzhqt/ente-Visual-Design?node-id=11219%3A62974&t=BRCLJhxXP11Q3Wyw-0 class ReferralCodeWidget extends StatelessWidget { final String codeValue; - final bool shouldAllowEdit; + final bool shouldShowEdit; + final UserDetails? userDetails; final Function? notifyParent; const ReferralCodeWidget( this.codeValue, { - this.shouldAllowEdit = false, + this.shouldShowEdit = false, + this.userDetails, this.notifyParent, super.key, }); @@ -49,10 +52,26 @@ class ReferralCodeWidget extends StatelessWidget { ), ), const SizedBox(width: 12), - shouldAllowEdit + shouldShowEdit ? GestureDetector( onTap: () { - showUpdateReferralCodeDialog(context); + if (userDetails!.isPartOfFamily() && + !userDetails!.isFamilyAdmin()) { + final String familyAdmin = userDetails! + .familyData!.members! + .firstWhere((element) => element.isAdmin) + .email; + showInfoDialog( + context, + title: S.of(context).error, + body: S + .of(context) + .onlyFamilyAdminCanChangeCode(familyAdmin), + icon: Icons.error, + ); + } else { + showUpdateReferralCodeDialog(context); + } }, child: Icon( Icons.edit, diff --git a/mobile/lib/ui/growth/referral_screen.dart b/mobile/lib/ui/growth/referral_screen.dart index 521f9bccf6..d2897dd381 100644 --- a/mobile/lib/ui/growth/referral_screen.dart +++ b/mobile/lib/ui/growth/referral_screen.dart @@ -166,7 +166,8 @@ class ReferralWidget extends StatelessWidget { const SizedBox(height: 12), ReferralCodeWidget( referralView.code, - shouldAllowEdit: true, + shouldShowEdit: true, + userDetails: userDetails, notifyParent: notifyParent, ), const SizedBox(height: 12), From 0ba2bd92b56a8aa8648824e9747079a600684fc6 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 09:42:22 +0200 Subject: [PATCH 0518/1179] [mob][photos] Another copy change --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 2a7b7c4910..dab6a9a574 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -991,7 +991,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( "I understand, and wish to enable machine learning"), "mlConsentDescription": MessageLookupByLibrary.simpleMessage( - "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted."), + "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private."), "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 8d249e569f..ed0e671600 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2926,10 +2926,10 @@ class S { ); } - /// `If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.` + /// `If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.` String get mlConsentDescription { return Intl.message( - 'If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.', + 'If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.', name: 'mlConsentDescription', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 350d646bc1..a321ad06b9 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -415,7 +415,7 @@ "machineLearning": "Machine learning", "mlConsent": "Enable machine learning", "mlConsentTitle": "Enable machine learning?", - "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.", + "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.", "mlConsentPrivacy": "Please click here for more details about this feature in our privacy policy", "mlConsentConfirmation": "I understand, and wish to enable machine learning", "magicSearch": "Magic search", From fea2cc27d8910c7e3255e6e63def3751e023aff3 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 09:48:45 +0200 Subject: [PATCH 0519/1179] Revert change --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index dab6a9a574..2a7b7c4910 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -991,7 +991,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( "I understand, and wish to enable machine learning"), "mlConsentDescription": MessageLookupByLibrary.simpleMessage( - "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private."), + "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted."), "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( "Please click here for more details about this feature in our privacy policy"), "mlConsentTitle": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index ed0e671600..8d249e569f 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -2926,10 +2926,10 @@ class S { ); } - /// `If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.` + /// `If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.` String get mlConsentDescription { return Intl.message( - 'If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.', + 'If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.', name: 'mlConsentDescription', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index a321ad06b9..350d646bc1 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -415,7 +415,7 @@ "machineLearning": "Machine learning", "mlConsent": "Enable machine learning", "mlConsentTitle": "Enable machine learning?", - "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted to remain private.", + "mlConsentDescription": "If you enable machine learning, Ente will extract information like face geometry from files, including those shared with you.\n\nThis will happen on your device, and any generated biometric information will be end-to-end encrypted.", "mlConsentPrivacy": "Please click here for more details about this feature in our privacy policy", "mlConsentConfirmation": "I understand, and wish to enable machine learning", "magicSearch": "Magic search", From 2ffad1f2a26651c5f2b93b1bd77cf45b65e936b0 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Thu, 22 Aug 2024 13:48:09 +0530 Subject: [PATCH 0520/1179] Update watch-folders.md --- docs/docs/photos/features/watch-folders.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/photos/features/watch-folders.md b/docs/docs/photos/features/watch-folders.md index 6a7d50a153..10b0460957 100644 --- a/docs/docs/photos/features/watch-folders.md +++ b/docs/docs/photos/features/watch-folders.md @@ -26,7 +26,7 @@ allows you to automate backups to ente's cloud. where you can add and remove watched folders. 2. To start watching a folder, press the **Add folder** button and select the - folder on your laptop that you want to watch for any changes. You can also + folder on your system that you want to watch for any changes. You can also drag and drop the folder here. 3. If the folder has nesting, you will see two options - **A single album** and From 6db9a6bedcf1e9d47c3faa00e8566e4c74908060 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:03:06 +0530 Subject: [PATCH 0521/1179] [mob][ml] reduce parallel download to 5 for ios --- mobile/lib/services/machine_learning/ml_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 7fb523a917..db0bdfd5c0 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -57,7 +57,7 @@ class MLService { bool _isIndexingOrClusteringRunning = false; bool _shouldPauseIndexingAndClustering = false; - static const int _fileDownloadLimit = 10; + static final int _fileDownloadLimit = Platform.isIOS ? 5 : 10; static const _kForceClusteringFaceCount = 8000; /// Only call this function once at app startup, after that you can directly call [runAllML] From 0e642cd254933e07c47a177ab71ed0547cfd5ca9 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 22 Aug 2024 16:46:11 +0530 Subject: [PATCH 0522/1179] [mob][photos] Create separate widget for home tab's app bar --- mobile/lib/ui/home/home_app_bar_widget.dart | 135 ++++++++++++++++++++ mobile/lib/ui/home/status_bar_widget.dart | 6 +- mobile/lib/ui/tabs/home_widget.dart | 5 + 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 mobile/lib/ui/home/home_app_bar_widget.dart diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart new file mode 100644 index 0000000000..5cda20e593 --- /dev/null +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -0,0 +1,135 @@ +import "dart:async"; +import "dart:io"; + +import "package:flutter/material.dart"; +import "package:logging/logging.dart"; +import "package:photo_manager/photo_manager.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/sync_status_update_event.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/services/local_sync_service.dart"; +import "package:photos/theme/text_style.dart"; +import "package:photos/ui/components/buttons/icon_button_widget.dart"; +import "package:photos/ui/home/status_bar_widget.dart"; +import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; + +class HomeAppBarWidget extends StatefulWidget { + const HomeAppBarWidget({super.key}); + + @override + State createState() => _HomeAppBarWidgetState(); +} + +class _HomeAppBarWidgetState extends State { + bool _showStatus = false; + bool _showErrorBanner = false; + + late StreamSubscription _subscription; + final _logger = Logger("HomeAppBarWidget"); + + @override + void initState() { + super.initState(); + _subscription = Bus.instance.on().listen((event) { + _logger.info("Received event " + event.status.toString()); + + if (event.status == SyncStatus.error) { + setState(() { + _showErrorBanner = true; + }); + } else { + setState(() { + _showErrorBanner = false; + }); + } + + if (event.status == SyncStatus.completedFirstGalleryImport || + event.status == SyncStatus.completedBackup) { + Future.delayed(const Duration(milliseconds: 2000), () { + if (mounted) { + setState(() { + _showStatus = false; + }); + } + }); + } else { + setState(() { + _showStatus = true; + }); + } + }); + } + + dispose() { + _subscription.cancel(); + super.dispose(); + } + + @override + AppBar build(BuildContext context) { + return AppBar( + centerTitle: true, + title: _showStatus + ? _showErrorBanner + ? const Text("ente", style: brandStyleMedium) + : const SyncStatusWidget() + : const Text("ente", style: brandStyleMedium), + actions: [ + IconButtonWidget( + icon: Icons.add_photo_alternate_outlined, + iconButtonType: IconButtonType.primary, + onTap: () async { + try { + final PermissionState state = + await requestPhotoMangerPermissions(); + await LocalSyncService.instance.onUpdatePermission(state); + } on Exception catch (e) { + Logger("HomeHeaderWidget").severe( + "Failed to request permission: ${e.toString()}", + e, + ); + } + if (!LocalSyncService.instance.hasGrantedFullPermission()) { + if (Platform.isAndroid) { + await PhotoManager.openSetting(); + } else { + final bool hasGrantedLimit = + LocalSyncService.instance.hasGrantedLimitedPermissions(); + // ignore: unawaited_futures + showChoiceActionSheet( + context, + title: S.of(context).preserveMore, + body: S.of(context).grantFullAccessPrompt, + firstButtonLabel: S.of(context).openSettings, + firstButtonOnTap: () async { + await PhotoManager.openSetting(); + }, + secondButtonLabel: hasGrantedLimit + ? S.of(context).selectMorePhotos + : S.of(context).cancel, + secondButtonOnTap: () async { + if (hasGrantedLimit) { + await PhotoManager.presentLimited(); + } + }, + ); + } + } else { + unawaited( + routeToPage( + context, + BackupFolderSelectionPage( + buttonText: S.of(context).backup, + ), + ), + ); + } + }, + ), + ], + ); + } +} diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index 8df1a90242..3815e4cf3a 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -38,6 +38,8 @@ class _StatusBarWidgetState extends State { @override void initState() { + super.initState(); + _subscription = Bus.instance.on().listen((event) { _logger.info("Received event " + event.status.toString()); if (event.status == SyncStatus.error) { @@ -72,7 +74,6 @@ class _StatusBarWidgetState extends State { setState(() {}); } }); - super.initState(); } @override @@ -142,13 +143,14 @@ class _SyncStatusWidgetState extends State { @override void initState() { + super.initState(); + _subscription = Bus.instance.on().listen((event) { setState(() { _event = event; }); }); _event = SyncService.instance.getLastSyncStatusEvent(); - super.initState(); } @override diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 3c902ceb1a..dd31847c3e 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -41,6 +41,7 @@ import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/ui/extents_page_view.dart'; import 'package:photos/ui/home/grant_permissions_widget.dart'; import 'package:photos/ui/home/header_widget.dart'; +import "package:photos/ui/home/home_app_bar_widget.dart"; import 'package:photos/ui/home/home_bottom_nav_bar.dart'; import 'package:photos/ui/home/home_gallery_widget.dart'; import 'package:photos/ui/home/landing_page_widget.dart'; @@ -359,6 +360,10 @@ class _HomeWidgetState extends State { }, ), ), + appBar: const PreferredSize( + preferredSize: const Size.fromHeight(kToolbarHeight), + child: HomeAppBarWidget(), + ), resizeToAvoidBottomInset: false, ), ), From 8b40f7093641f7dd646f9b85516fa556987a7fc3 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:06:10 +0530 Subject: [PATCH 0523/1179] Simply email verification template --- server/ente/user.go | 4 +- server/mail-templates/ott.html | 126 +++++++++++++++ server/mail-templates/ott_auth.html | 215 ------------------------- server/mail-templates/ott_photos.html | 215 ------------------------- server/pkg/api/user.go | 2 +- server/pkg/controller/user/userauth.go | 28 +--- 6 files changed, 136 insertions(+), 454 deletions(-) create mode 100644 server/mail-templates/ott.html delete mode 100644 server/mail-templates/ott_auth.html delete mode 100644 server/mail-templates/ott_photos.html diff --git a/server/ente/user.go b/server/ente/user.go index 79c7cf96bd..cd8e7e3ebe 100644 --- a/server/ente/user.go +++ b/server/ente/user.go @@ -1,9 +1,7 @@ package ente const ( - PhotosOTTTemplate = "ott_photos.html" - - AuthOTTTemplate = "ott_auth.html" + OTTTemplate = "ott.html" ChangeEmailOTTTemplate = "ott_change_email.html" EmailChangedTemplate = "email_changed.html" diff --git a/server/mail-templates/ott.html b/server/mail-templates/ott.html new file mode 100644 index 0000000000..ca45513dd3 --- /dev/null +++ b/server/mail-templates/ott.html @@ -0,0 +1,126 @@ + + + + + + + +
 
+
+

Please use this code to verify your email address

+
+
{{.VerificationCode}}
+
+
+

If you need help, just hit the reply button!

+
+
+ + + + \ No newline at end of file diff --git a/server/mail-templates/ott_auth.html b/server/mail-templates/ott_auth.html deleted file mode 100644 index 9c89cb12ab..0000000000 --- a/server/mail-templates/ott_auth.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - -
-
- - - - -
- - - - -
- - - - -
- - - - - -
- - - - - - - - - -
-
- - - - - -
- -
- - - - - - -
Use this code to verify your email address
- - - - - -
- - - - - - -
-
{{.VerificationCode}}
-
-
- - - - - -
-
- - - - - -
ente.io
- -
-
-
-
-
- - diff --git a/server/mail-templates/ott_photos.html b/server/mail-templates/ott_photos.html deleted file mode 100644 index 1c7e63d946..0000000000 --- a/server/mail-templates/ott_photos.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - -
-
- - - - -
- - - - -
- - - - -
- - - - - -
- - - - - - - - - -
-
- - - - - -
- -
- - - - - - -
Use this code to verify your email address
- - - - - -
- - - - - - -
-
{{.VerificationCode}}
-
-
- - - - - -
-
- - - - - -
ente.io
- -
-
-
-
-
- - diff --git a/server/pkg/api/user.go b/server/pkg/api/user.go index 223ebb30da..51a3516975 100644 --- a/server/pkg/api/user.go +++ b/server/pkg/api/user.go @@ -35,7 +35,7 @@ func (h *UserHandler) SendOTT(c *gin.Context) { handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Email id is missing")) return } - err := h.UserController.SendEmailOTT(c, email, request.Client, request.Purpose) + err := h.UserController.SendEmailOTT(c, email, request.Purpose) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) return diff --git a/server/pkg/controller/user/userauth.go b/server/pkg/controller/user/userauth.go index 5548dd23ad..8f662280f2 100644 --- a/server/pkg/controller/user/userauth.go +++ b/server/pkg/controller/user/userauth.go @@ -5,9 +5,10 @@ import ( "encoding/base64" "errors" "fmt" - "github.com/ente-io/museum/pkg/utils/random" "strings" + "github.com/ente-io/museum/pkg/utils/random" + "github.com/ente-io/museum/pkg/utils/config" "github.com/ente-io/museum/pkg/utils/network" "github.com/gin-contrib/requestid" @@ -78,7 +79,7 @@ func hardcodedOTTForEmail(hardCodedOTT HardCodedOTT, email string) string { } // SendEmailOTT generates and sends an OTT to the provided email address -func (c *UserController) SendEmailOTT(context *gin.Context, email string, client string, purpose string) error { +func (c *UserController) SendEmailOTT(context *gin.Context, email string, purpose string) error { if purpose == ente.ChangeEmailOTTPurpose { _, err := c.UserRepo.GetUserIDWithEmail(email) if err == nil { @@ -123,7 +124,7 @@ func (c *UserController) SendEmailOTT(context *gin.Context, email string, client return stacktrace.Propagate(err, "") } log.Info("Added ott for " + emailHash + ": " + ott) - err = emailOTT(context, email, ott, client, purpose) + err = emailOTT(email, ott, purpose) if err != nil { return stacktrace.Propagate(err, "") } @@ -282,31 +283,18 @@ func (c *UserController) TerminateSession(userID int64, token string) error { return stacktrace.Propagate(c.UserAuthRepo.RemoveToken(userID, token), "") } -func emailOTT(c *gin.Context, to string, ott string, client string, purpose string) error { +func emailOTT(to string, ott string, purpose string) error { var templateName string - if auth.GetApp(c) == ente.Auth { - templateName = ente.AuthOTTTemplate - } else { - templateName = ente.PhotosOTTTemplate - } if purpose == ente.ChangeEmailOTTPurpose { templateName = ente.ChangeEmailOTTTemplate - } - var inlineImages []map[string]interface{} - inlineImage := make(map[string]interface{}) - inlineImage["cid"] = "img-email-verification-header" - inlineImage["mime_type"] = "image/png" - if auth.GetApp(c) == ente.Photos { - inlineImage["content"] = "iVBORw0KGgoAAAANSUhEUgAAAMgAAACsCAYAAAA+PePSAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABFKSURBVHgB7Z1fjFXVFca/UdQRRbGaVMMQLk1ASR9gGg21bZpBxofGWsCH4oOUmcSXogRN+4CYVqyV0FQDhED6YDND6IP0QUHti4VybVItaZWhPkz5YziEmWhSiMAADqJO93fuOTAz3vlzz9l7n733Wb9k5w5xWrh/vrvWt9baezdBMMbQ0FBFPUxXa4Fa/HlW8p8qycKwP9fjTJ11InnsSR+bmprOQDBCE4TcKCFQBBW12tSaj6uCmA47pII5pFaEmmiqEHIjAslAIgiKYCmuCsKWGBqhippodkMiTSZEIJMkSZcoiCWoRQofqaq1R63dSiwRhAkRgYyDEgUjAwXRgbF9gq9EqIlls4hlbEQgo0jSpw74HSkahf5li1pVEctIRCAJShht6mENaqJw0U/YolutHWLya5ReIEoYHephJcoTLSZLHFWUULpRYkopkCSNYrToQHjeQjeRWs+XVSilE4gSB4WxHuVOo7IQoYRCKY1AlDBYot0EiRh5iVAioQQvkMR8PwfxGLqJ1FoUetXrGgQKfYZajBj7IeIwQUWt4+o17kqaqEESZARJKlMUh/gMO0QINO0KSiDJN1kXJGIURTdqQokQCMEIJDHhFIdEjWKJEFA08d6DDPMar0PE4QIVtehLNiX9Jq/xOoIkKRVNeAWCi0TwvNLlbQRR4uB4yEGIOFymotbBpGjiJV4KRL3g7Gt0Q1IqH+B71JW8Z97hVYqV5LT0Gx0QfIQ7Gzt92tnojUASv8EXeD4Core3N179/f3xn6dNm4aFCxdi3rx5CJQIHvkSLwQSmhk/d+4cduzYge7ubgwMDNT9nRkzZmD16tV45JFHECARPBGJ8wIJTRx9fX1YsWLFlYgxERTKzp070dLSgsCI4IFInBZIaOJgKvXYY4+NGTXG4pZbbolFEmDaFcFxkThbxQpNHK+99hqWLFnSsDgIUzL+b/n/ERgVtfa7POzoZAQJTRz0Ghs2bIAO6Eu4AiOCo5HEOYGEJo6tW7fGSyciEns4JZDQxPHiiy/G1SoTiEjs4IxAkiZgEKMj9AxMqUx7BpaA161bF5v4gOBpKotcaSa6JBBO4y6F51AcLOOyYmUDVrZY4QpMJN1KIJ1wACeqWMmcjvfiYI+D1SZb4iD8u/h38u8OiA5XZrcKjyDJpGcXPKfRBqBuAm0odqhIYsbETZJCBZKYcvoOr6dyszYAdUORbN++PaSGIn1Ia5GmvbAUKzHlrFh5LY69e/c6IQ7C6MUoxn9TIMSfkSJ3JhbpQZhjVuAxbACuWrXKCXGksEjAf5Op8nIBVFD7rBRCISlWCL7DRANQN4H1SpapVGs3LGNdICE0A30QR0pAIinEjxQhkG7UrhvwkrVr13o3NMiG4saNGxEAvOBnESxiVSA+p1bM7Z944gkcOHAAPsJditu2bQuhodhp88wtawLxObVij4PisNkANEEgvRKmWrNtjaLYrGKth6fisDk6YpK0DOx5150lX2tVLSsRJIkex+EZFAVLpkV1x00RSCRZZOMeRVsRZD88g16DDcDQxEH4nJYuXep7VLQSRYwLJDHmFXgEq1RMRVxqAOomgG28bcmB5UYxnmKpJ8HUqgJP8KnHoQuPeyWRSrNmwyBGI4hv0aOM4iAeP++K+ow9BYMYjSA+RQ+T22N9oaOjI96h6BlGy77GIogv0YO5OLvjZRcH4fAl+z18TTyCZV9jUcRYBPEhetjeHusL3E/CrrtHZWBjXsRIBPEhehSxPdYX+Jp41lCsmLqDxFSKtQYOU/T2WB/wsOtuZABWu0CUktvUwwI4SnrIgYhjYlKReBJl25LPnlZMRJAOOAqbYq5sj/UFz7bxas9ctJp0l2eudJ6PW1aeffZZrFzp9FYe7SVf3RGkDQ7CJpiIIz/sFTneUGTJtwMa0S0Q58x5WbvjpvDg9VwCjWhLsVxMr3zcHusLjm/j5d71HmhAZwQxOhPTCGkDUMRhjvRCIEe77tqmfHVGECc656Fsj/UFRzdfaeusaxGIK+mV6QYgPwxMKziK4ePhByzV0mjrfn0cFclsHUcE6UqxCj+ZPR2PMCmOPXv2xKeD+HoySHt7e/wc+Fx04mjXXctnUpdAtFYOGsXG9lj2AEK4g4PPwYS5TrfxOnQskpbPZO4UKzlY+FMUBM0iq1WmOXLkCEKBxvree++FKShAVrkc4La8TUMdEaSwuSvW422IIzRMR0K+J470SnJ/NnUIpBD/IQ1At3Hk/cn92ZyC/MyHRQa+uIg/vP0ndL29E01Tp2Do4hcQ3IQCuTh9CN/90Q9xV/PtmHvzTFgm92dThwcZgiV29e/DK9FbsUhSPnsjwmdvmq8wh+RByNy5c2GSa2fejKnL5+C6u6/efUORbF/wC9x1w+2wRO7hxVwplon5+7H4yyfvYdOxP48QB7nxJxVM33h//IYIxcOoTmHc+uv7RoiDfDx4Gqt6XoZF+A+oIAd5PYg1g76rf+z9CNfc3hy/ITd1zot/FoqBgrj1V/ehuX3shiFF8sEZq9G4DTnI60EqsMSR8xM3oW743p3xm/TZG8dx6d1PINiBX0r8chodMcaCAvnOdLMp3jBy+ZC8ArFq0CdD+mY1t8/EwLYP8dXpQQjmaF7cotLc2XFq5Si5spy8z8rZvef0JPQmtkx82WC0oNfwwPtVkIPMAkk66M5f4UwTf8P375S0SxOMFDc+PHtcn+EY0zlMm3VwMU8EcTZ6jCZNu6bcfVssFEm7skGPx6jhcDo1Fpm/yPM8U+ejx2hSEz/415MY3Of1LUtWadSEOwi/zDPtMCxFBBkO3+ypj85B84Mzce73ByWajAMjRfPimXE65WHUGE4FGSlVBBkOhUITP7i3T62TIpRRMFrc1KH6SncE0VeahYzkEUgFAcBvx+tb7xATn5B2wpmOCvkEcisCQUx8DQ96GlmpICOlTbHqwW9NrrL1TuoNFgZGBRkRgdQh7Z2wE//lyfMIFQ97GtYRgYxBOgBJX8K0KzQCM+HGEIFMQNo74bj9Q3feD9/hNO0Lh7sx7ZetKBEVZMT4PekhwGjCD9XP3v8tPr50Gr7CDWd8DpbHzb0muHKFSY6cP4ll/1yHxys/xuOzHoYvUBCbPtqFo5PYMiCMRASSAW77ZcpFkbicdnH35R9PvIVX+/ZByIYIJCNpLv/B2cMqojxsc5/1pKCAN3/09S3KQmOIQHLCDyJTmOUz2vFoywMomivCFZ+hhTwmPYIQww/lZpXjLzuwrjATz0jxyok3xYTXJ/OpJhJBNEKh0MQ/2rIYy9WylXZREIwa/PuFuohAXIKm+J1TPcZNPKMGfQbTPGFcChFIhEAmek1g2sTXO0RPGJNCBHICwoTw2z0uCWvqnRy90IdNx3aJz2iMs8iIpFiWSHsnv/v2zzOdUSs9jVxEyEjeFEtoAKZdrDLRlzSSdokJz01hHkTIQNo7mcjES09DG5mvhM7TB9FyD3VZST/8qw69XLd3IoOFWinkdPdcV1sJNSgA9k7Y5CMUzor3X6h7kr2Qmcxf5plTLJ5UNzQ0RJGUYl+IadKS7d9PHRKvoZczee4HyVvFiuDp+VgusqvvbxC0k8sK5N0wdQiC4Da5PqN5BSJGXXCdCDnIK5AqBG3IhaRGKDTFiiDVLC18eXoQZ3/zL7nLRDPKoFeRg1wmndUBVcmiQtsgZObSvj5cfON4HEF4aN1Xpwbj86rkSJ7cVJETHbNYNEFtEBqGUeNiVy8uHx4ZhHkW1+c9p+ID7Hi6upCZ3EUkHcf+7IbQEHGkUKnU2bXvfU0cw3/n4qvHcEb9DiOKkIncn00dEUQqWQ1w+fCnuND130kfkM3fO/PMe/EBdpJ2NUzuz2ZugSQ+pApJs8aFEeFCdy8+P3gKWWDaxWjD09flaoJJUc3TQU/RtR9kD0QgYzLchOeB0eQCPUvP/zD1p3MkmozPHmhAl0CY622CMAKmU4NvRmP6jKwwCnHRxDPtEuqixRtrEUgyuBhB9qjHpCac17uZhCXhS//4BDd13oPr7r4NwhWirNc+j0bn4dU7IMRRgw0/0+JIYdo18FJPnHpJtesKWtIronNPOkPacygpY/U0bCEmfgSboQltEUSFNJbUqighTKfOqahRlDhSUhPPCFbiaNKjK70iuu8H0RbafCBNp+gFXBo05LVx7J2UdK5rCzSiWyDdKMHwYtzl3nU0zv1dvsOQwmUnvmTXW1ehEa3nYiVNw3fUj0sQKJfe/ViJ45g3o+lp2vWFinYl6MR360yviImD42iQghNI0SY8LyUZgNReSdV+R2Eyf19FIKQ9DRdMeF4CH4Dsybv3ox6mjh6lktvgOY0OFvpCOgDJ+9EZTQJJu7Sa8xQjt9wqJXfD45MX+U17fvuHsQkPTRzDYTPz3EsHQzDxUfKZ047Ja6C97KxzsJDfrlmnbn0jNfGed+KfhyFMnu5Os74Gnhwsx3ItS7e++4ysMIpweTgAaSx6EGMCSUq+VLbTU762Bgt9wcMBSGPRg5hMsSgSRpEIjmJ7sNAXPBqANBo9iI0LdJ5W63U4hO89DVt4MABpNHoQoxGEKIVzyrcKR6AJD6GnYQuHByCNRw9iXCAJxpU+EWk6deHVo3KCYQYcHIBcBAtYEUjS4TTSyJkIXwYLfUHHAGR/fz9yon3maixsXuK5Xq2VsFj29W2w0BfyDkD29ecqikSwmJFYE0hS9qVh74JhxITbITXxzQ+22ByAfN5W9CC2PEhMYqqqyMC0KVMn/J2QBgt9gdGk0QHIe2bNQUa6bRjz4VgVSEInMmyqeuib94/7313d3VcW0gFI+r2JhNJ6/beQgQgFFHusCyQJj51okOUti3FX89fvFY9PLFTpVOiDhb4w0QDkNz64jAdaf4AMWE2tUppQEMqPpLNak+bfH/0Hj+94Bte23ISmqVNwuedU/IZIxHATNhevW3BHbOIZVdiD2rJmA9rb29EgW5Q4nkIBFCkQVrMOosHD5rZu3RovwT9Wr14drwaJ1GrVcc5uFgoTCFEiqaAmkoZKvwcOHMDatWt11NMFCyxcuBBPPvlk/NggFEVrEalVSqECIUokHchY+u3t7Y3FMjAwAME9ZsyYgXnz5sUrI522q1ajKVwgRIlkPUp8KqNQF5ry9SgYJwRClEi6Ueu0C8JuJY5lcACXBEIfsl+tBRDKTIQCTfloimgU1iV5QfitEUEoK5Fai1wRB3EmgqQklS1GkgqEMhGhJo4IDuGcQIiIpHREcFAcxEmBEBFJaYjgqDiIswIhIpLgieCwOIjTAiEikmCJ4Lg4iPMCISKS4IjggTiIM2Xe8UheSG7SjyD4ziF4Ig7ihUBI8oK2QtP910IhxKf++yIO4o1ACBtIyQhC4ccICQ3D2aoOl5qAk8ELD1KPZAqY5/56cTh2iaEgni56Kjcr3gqEiHl3ngge+Y16eJVijWaYLynkUDphXPietPosDuJ1BBlOknJxT0kFQpEwpepMzmT2nmAEQpKUaz1kX0lRVFETR4RA8DrFGg3fGFZKUDtWKIJgizRqeO036hGUQFKSigkbi17ek+gZ9Bqzfa1STURQKVY9pNJljCpqvY0qAibICDKcJO3irZSSdukhUmtZkk5VETjBCySFKYAIJRdpw292KBWqyRB8ijUWUhaeNBFqXm6zb2MiOiitQFISofCMYDlNZSRVtXaEar4nS+kFkqKE0qYeOlDuHgojRBW1w6KrEEQgo0mqXm0oV1SpqrUHtQtq5OahYYhAxiERC4/dX4LwvEqEmrfgKYY9EOoiApkkiViWoiaWNvhJFbVIsTu0jrcpRCAZSI5JZfpFwcyHm4JhqsTIwC2uLMv2SPrUOCIQTSQmn6KpoCYa/mxrMxc/+BGuCqLKP4sg8iMCMciwSDP8cVbyOHrVIxr1c/rnE7gqiDOSLpnj/8EQWj7GK3LoAAAAAElFTkSuQmCC" } else { - inlineImage["content"] = "iVBORw0KGgoAAAANSUhEUgAAALAAAACwCAYAAACvt+ReAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABHlSURBVHgB7Z1tjFxV/ce/U7ZGxa3bEsrflr+d5o+x5W9tN/ZJAu60PFi1ursm9SnSbuWFwZIAMTFAom6jKdEX0iYg+AK7SzRqfNHWmABa2qmokW61iwq7QA23L7oiaLvsQhG3MJ7vnXOXu7t3Zu7MfTrn3PNpTnd3Zpru7nznN9/fwzm3AEtoKpVKUXzwr2VidchVlA/zvg5ivMY6LZbjrUKh4MASigIscxBCpQDXyLVafiyitjCTYBhVQR+Tnw8LYY/DMgMrYEwLtgdVoXbjrWiqGsNyHUJV0A5yTm4FLERbQlW0XagKV0coZkbog0LMZeSQXAnYJ9odSNcOpIEjVlmswTyJ2XgBGy7aWjioinmfEPMwDMZIAUtP24eqny0h31DAFPIADMQoAUvh3irWbchPtA2Lg2pU3m1S8meEgGV9th9Vm2BpzAAMEbLWApbC3Q9rE1plAJoLeR40hMIVa0B8+jyseKPQJ9bz4ne5XwYD7dAqAluPmzj9qCZ82nT8tBGwEC9LYfdA3S6ZKTio2ooBaIDyArY+NzMGoIE/VtoDC/HSLpyEFW8W9Il1UjwH34TCKBmBbdRVjrJYO1WMxspFYBt1laSEajTug2IoI2BWGMRikrYXtsKgInxOWG67R1aDlEAJCyEtw1HYCoMuOGJtUsFSZB6BZXmMlqEIiy4UUbUUPciYTAUsM9wDsJZBR/icHci6SpGZhZB+9zZYTGCvsBO3IwNSF7BMABh1S7CYxEFUS22ptqFTFbBM1viDrobBjIyM4Pjx4zhz5oz79dKlS7F+/XqsXLkShsPh+d40k7vUBJyHSgNFe++997ofg6CQb7nlFvT29sJgHKRYoUhFwKaLd2JiAnfddRcOHz4c6vEUMIVMQRuKg5REnLiATRfv6Ogodu3aNW0XwkLxPvTQQ1bEEUm0jGa6eGkVbrzxxqbFS/hvtm/f7vplQymKdTTpQfnEBCyrDUzYijCQwcFBV4CTk5NoFYqYduLAgQMwlCKqteLE6vyJWQjxTfNZybxTkwRM1LjihJ6Yy1DKwkpsQgIkEoFlk8JI8e7Zsyd28ZIkXhQKUZKaiJ3YI7BsLfbDMFhpuPvuuxN/u6ctYUXDUPpFJN6NGIlVwHK4wzhDR/Hu2LEjtYTruuuucyP9ggULYCBsdBxETMQmYJltcqrMqMEcr1rQSqUhCuza0VIYWGZjq7kzrvJaLAKWWaZxI5FZidfD4Fqxg6qII89NxJXE0fcWYRBsUPT09GQmXpL1CyhBiqhqJjKRBSz3SRk1FvnYY4+5DYooNd648GrFBjY8bhPaiaybSBbCRN/LKsOdd94JFWEVxLBBoMh+OKqA2SYuwRB0qMUa2PCI1ORo2ULIem8JhqBLI8HAhkcpipVoKQKbZh1Yc2W2rxOGReKWrUSrAh6AIYdJ0+/qOkxDP0xfbAgtWYmmBSyrDvuhOWl315KCDQ9OxhnStWu6S9eUgE1pWLA0xbdfU0pTBjU8HDTZ4Gg2ieO5ZUVojImD5AY1PIposqcQOgLLxO15aIzBnS0XQyJxUwldMxG4HxrD1rDJ4iVe167WrmhNoE0N3WYOFYF1j758QrnxUoXWcFoY0LVbHiYKh43A/dAUlsii7l3TEZYHNW94hKp0NYzAOkdflpcMqpO2hOYNj4ZROEwE7oeGMPrkXbxE89ZzQy9cNwLrGn0N3yDZEhp37RbWqws3isD90Iykdg3rDnMBipgdSM2oWxduFIEZfYvQBJ3nGtJCw1oxo+/yWlG4ZgSWMw9FaACjiuEn3MSGhs0c1oX7at1Zz0LcCg3gE2HCUE6aaCji7lp3BFoIEX3XoDq0ozSmt4aThhNsLDVqcvA2T7osz76xVgRWfpOmFW90NLNegUeV1YrASidvVrzxo0HDY1xE4IWzb5wTgYV4S1BYvCqc12AiGtTOO6Q2ZxBkIfqgKBSvKuc1mIgGIp5jI+ZYCFXtA30amxRWvMmjcNdujo2YIWAZoo9CMZI8bKS9vR3bd2x3nzTdBsH5jsTy4X333he7peJlwRiNFdxrN6MaMVvAe6FY/TfJtzUKdvChQe33krmD7D29sb87KXpC5j4h4Okq2WwP3AWFSNqT7bpllxEnP/JnYDMnbhjdFaz2zNDotIDl5NkaKEIaCcWKFStgCj29yVzRQcGS5Rr/RWP8EThX4iUmXfo1yXcSBXdyT79a5wXdmCV2HFJNvJkTHj2rANPB1i/gTC/APTVxwRWubmeU5Qm2nu+44w48dWQELw2ddZ+zjJge7nGrENJTnENGnD/zGo7d9IT7Kn/lQ2fxsyd+gnOVs0iakVGzJthWrkjWEn1kQxd6Orbh/NGp6duWbL4Ma762Eu9c8g6kjLtTwxNwCRnWfw9v+y3Gn5lZAjr5xnEcefPRRIVsBRwO1spv+sCX8Z5ni5ianJpz/6VrF6HrhxuQMm49uE1+kVkC9+R3R+aIl3RetN5daQjZUpvuDb24+vy1eP2PU+CfIF46IezE5AXMb29DilCz0wIuIQPGn5nAcz9y6j6GIl4+7woceeNR/OlNrU+c0YrFCy7Dje/9EhaeXIzXawjXz0tD/3LtRIq4OZsn4GXIgKfvPxXqcR2FRfh02+exufJRPHjhPhuNE+ZjV27Fxn904aJnw0fU/0ymntC5riFTC/HyaHM7ZCnkr87/urUVCfH/l6/CDee34pJTi6EBRf7VJjtwWmFtRby8vfAObOnYig+/1oWpVxrbBUXgfHCREbgIDbG2Ih6uvrwL17+2FRdNttVM0hRGXwF7WFvxFix3hZ1IY5LGAHD5i5mkP3Ghv4A9rK2o7jJuJGCK/Kq2LmyetyWwpqsZ5giYeLai613XYuDcD6ytmAXtwsfbevDmGHS0C0Eso4CNuUysxyWvLHZtxdDFv8eRC48ERiVDruoTis6Vndh80RYsfHYx3oRRLKSA342M+M8rydYO1716Fd5XWYEj8+baCr6VmgZHKv1zu/wZt733C3j/C6tMsAtBvDvTCDw1kfwv1bMVH7y4E4fGf54LW0Hhdm/sxeoX1uP1Z6ZMsQtBFI20EEFc8eoKfGPZHjwy/ks8KpaJMAJvve6Twi581J0Ye91c4U6TGwGTV8dewzW4Fqvmd+JfG8ZgEgXx59NXbsM/fzzh/pw5oSNXAvagrej45SKM/O8pXPHFYtpTVLHDeeoTX/+LOxWWMzr0fuYiwmGi04fOYOXNV2BZt367kxl1n77/OTz3o9OmJmkNybWACd9uveh1pRByBjsLWuKfQ2fd7ztHdiGQ3AvYg5GYolA9Gl+YuICnHzjVcI46L1gB+/CiMcW89turlIvGp4RVoO3Jq10Iotmr1ecC2omHtxzDSMiB+6RhkvabLx13t19Z8c6EAh6HJRBGu0eEkJsdvI8Lblvni+jhjx3LY4UhDOO0EBRw7kppYaGtOPyZ37u+OM0kzyZpoRi3HjgkaSV5jLonvvFnjB15EZaGuAJ2YNBIZZIkXXKzSVrTuAJ+GZamYDTmoogZkaPCczH+/J0R63Ob52WbxEXAS/LOt+hTvSTtsW2/s+JtjXOehbC0CG0FS27NJnk2SYuF01bAMRE2ybNJWqw4VsAx4iV5Y0f/gdUBJzbaJC12rICTgNGVy0vybJKWGE5boVBwKpWKbWYkgDeuaX1uMlC73iyEA0siWPEmxjD/8gT8JCwWvTjNvzwBD8Ni0Ysy/7ICtujKDAthBZwA4ziHn1YGxS/3BCyx42rWnUbj1V5EJcKBHeqJjXLl1/gDfoN/iz+jlb+6Iu4pfFaUehbCEplhapaf+HdkHIIlMg7+hgcq9wiD9itXvP7b91b2uMK2RGbaMbQF3WhpHoq1XPmViLqP130chT1cGcKWwqewAh+ApSWmg61fwAfF2g9L09AePFI5NCPi1sPzxmuwFqXCDdZWNM/cCCx9MO9Q5qLfqkMhHqz8zLUHrUDhO5W/uSKmmC2hoP91vC9mbyk6BivghjDS/qHy+HSSFgXvRUBr0Ve42UbjxhzzfzF7W/1BWOpSTdK+NydJiwqF7CV5/4ZtP9dhhkZnRGBee9YO9gRDsdLnJl3T9ZI8aysCcahR/w1Bu5IHxboVlmloF+KOuPXwe2ub5M2gPPuGIAEzRFsBC17AmIi6v2g5SYuKl+RtLHwEG3E1LG5wncEcAVsb8VaSxqibNYzGtC5MGHOe5M2xD6TW2WiDyCn+JE0lvCSP7wj8PIeUg26sdTJP7myEF+lG8RRUhp0+zlbkMMnbF3RjoICljSiLT0vIAWknaVHJYZLH5kXgqEO9s9HYby7BYCgA1l2zStKiwiRvuHJCPEk3CCFfD4PZV+uOeucDD8DQU3uqNd1fYKDygLbi9cN3D/rjF/B3GAiTt4Fad9YUsJy3rKl8XaHHZZLWaGpMN2gr+HPRWhiW5JXr3dnoeNW9Yn0TBhB18EYXDBwQ2l3vzrqXGJBRWPuSGn0uo5Pp4vXwXqwcrNc8Gg/4J8+CCHONjH5oyvQuCI0qDHHCTqLmu0B2N3pAwxPa5ck9ZSRQkZi/YH4iF/wOuzsiL2g6INQw+pKwlxjYKdbziJm3vastdgHrVtNNCw1rxw2jLwklYBmF6YV3QFGyHrzRBSZ5o5WnsBHXxFo7vjjeyy2Eir6kmYu89IvVDcWGfFQavNEFDsx7tuJzhZ34H7wHihEq+pLQFzqUrwil6sKqDt7oQpy1444VCxATu8NGX9LsZbZYF6aNKCJD8lLTTYuoteP57fPFiuWKbQ6qGgtNU/+r3Ll8u/j0ADLCf+KNJT78m0t5glAR/xf633a8vx0xsds7cScsTV8rWfwHHLUsIwaWbL4s9GNrnXhjiRcKmTMizdiKS9ddghgYqDfzUIsCWkBE4aL4cBIRE7qXhs7i2E1P1H2MrelmS5jDV7oe3CBEvAgRYNTtbMb7erRkXGRZjZniPYgAf+hL1y4KvHZEnGcvWFrHG9mkkD++tBtvG3v7jPtZPosoXrKvFfGSliKwhxDxUUTs0M2Owm+0X8DjE0etcBXlqqXX4BNLujF1ouJ+vaz7cqz71ipEoCzEuwktElXARcRgJR7eUsaLS/6Onw/91FYWNOH6dTe4g/RX3bw+SgRu2Tp4NJ3E+ZH/ceiicy0++OD73OTMilcfLl7yTqz99qqo9uH2KOIlkSKwh4jErN1F3gR6ZuwM7v/+/Tg+dBxjY2OwqMe6devwlZu/4n6MCH3vbYhIXAKmhaCVKCImhoaGMPrMKCYnJ2HJhvb2dnd5bN68GQvaY+m4Oahah8hb1mIRMInLD1uMJ7Lv9RPJA/uR39BOWCz12RmXeElsAiaySxc5qbMYy26pkdiIzUL4iSupsxhFLEnbbBIRMImjyWExhoNCvL1IgCQFzGSOIraXLMg3vA53KY6KQxCxemA/8hvmq86BJa84YvUkJV6SWAT2kOU1RuIiLHnCEWtTnBWHIBIXMLEizh0OUhAvSUXAxIo4NzhISbwkMQ88G/kDcWzOXtLWXJiwpSZekpqAiU/E9np05lFGtdrgIEVSFTBhRiprgsYd3Zpj2KTYlGS1oRapC9hDdmVs21l/difRYQtLaklcLURy1yM+7IedYtMNRtudcc82NEvmAia2QqEdDlJO1mqRmYXwI38RnbC+WAf4HHWqIF6iRAT2I6JxH6rb9a2lUAtaBvrdpo5+ShrlBEykpaAvLsGiAmXEPIgeF0pYiNnwFyXPCmCVwshLfWkCf/e3yxKZAwVRMgL7kdG4Hwofrm0oZSgadf0oGYH9yGjch+p+OweWpHHE6lU56vpRPgL7kUPyLJobce06xfAubLk3i45aq2glYA9rK2JnAE2ejK4KWgrYwwo5MmVo4HProbwHrofPHy+HAVcUTZEBsZbr4nProXUEno0vInfBtqVno6XHbYRRAvYjO3o8myLvu6LLYh1C9Qh/42rqxgrYQwiZAmblIk9R2btIO89jKMNgjBewHyHmkvjQBzPFnBvR+smVgP1IMXMWmWLW1WZwf+Ex5Ey0fnIrYD8y+aOIKejVUFfQDqp+lsI9aKKnbRYr4ABkx2+NXJ7dSFPUFKaDqlCflB+HrWDnYgXcBDJS+9cyVOeWg1YQ43hrus7xfX1afu0u3WuzafJf05durhLhbZAAAAAASUVORK5CYII=" + templateName = ente.OTTTemplate } - inlineImages = append(inlineImages, inlineImage) - subject := fmt.Sprintf("Email verification code: %s", ott) + subject := fmt.Sprintf("Verification code: %s", ott) err := emailUtil.SendTemplatedEmail([]string{to}, "Ente", "verify@ente.io", subject, templateName, map[string]interface{}{ "VerificationCode": ott, - }, inlineImages) + }, nil) if err != nil { return stacktrace.Propagate(err, "") } From ba1cd6a8ccdfa2a1e22c46a7d951b3ab54987343 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:08:11 +0530 Subject: [PATCH 0524/1179] Update green --- server/mail-templates/ott.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/mail-templates/ott.html b/server/mail-templates/ott.html index ca45513dd3..73750e9f79 100644 --- a/server/mail-templates/ott.html +++ b/server/mail-templates/ott.html @@ -98,7 +98,7 @@ a:hover {

Please use this code to verify your email address

-
{{.VerificationCode}}
+
{{.VerificationCode}}

If you need help, just hit the reply button!

From 369db7321262c7c12ff18d0f475578fe932ea6e0 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:09:20 +0530 Subject: [PATCH 0525/1179] Update change-email template --- server/mail-templates/ott_change_email.html | 331 +++++++------------- 1 file changed, 121 insertions(+), 210 deletions(-) diff --git a/server/mail-templates/ott_change_email.html b/server/mail-templates/ott_change_email.html index d1964c8511..f2cf32bafc 100644 --- a/server/mail-templates/ott_change_email.html +++ b/server/mail-templates/ott_change_email.html @@ -1,215 +1,126 @@ - - - - - - - - - - - - - +} + +.footer-icons { + padding: 4px !important; + width: 24px !important; +} + + -
-
- - - - -
- - - - -
- - - - -
- - - - - -
- - - - - - - - - -
-
- - - - - -
- -
- - - - - - -
Enter the following code to update your email address
- - - - - -
- - - - - - -
-
{{.VerificationCode}}
-
-
- - - - - -
-
- - - - - -
Please respond to this email if you are facing any issues
- -
-
-
-
-
+
 
+
+

Enter the following code to update your email address

+
+
{{.VerificationCode}}
+
+
+

If you need help, just hit the reply button!

+
+
+ + \ No newline at end of file From 0d63a3073bed158511eb56d95f3629bdd60e862c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 22 Aug 2024 17:15:19 +0530 Subject: [PATCH 0526/1179] [mob]Release tensors to avoid OOM error --- mobile/lib/services/filedata/model/response.dart | 6 ++++++ .../face_detection/face_detection_service.dart | 12 +++++++++--- .../face_embedding/face_embedding_service.dart | 3 +++ .../semantic_search/clip/clip_image_encoder.dart | 3 +++ .../semantic_search/clip/clip_text_encoder.dart | 3 +++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/filedata/model/response.dart b/mobile/lib/services/filedata/model/response.dart index c65322114f..661a75e662 100644 --- a/mobile/lib/services/filedata/model/response.dart +++ b/mobile/lib/services/filedata/model/response.dart @@ -13,6 +13,12 @@ class FileDataResponse { required this.pendingIndexFileIDs, }); + // empty response + FileDataResponse.empty() + : data = {}, + fetchErrorFileIDs = {}, + pendingIndexFileIDs = {}; + String debugLog() { final nonZeroFetchErrorFileIDs = fetchErrorFileIDs.isNotEmpty ? 'errorForFileIDs: ${fetchErrorFileIDs.length}' diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index afe1a3cfae..c232317b3a 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -131,9 +131,15 @@ class FaceDetectionService extends MlModel { final runOptions = OrtRunOptions(); final session = OrtSession.fromAddress(sessionAddress); final List outputs = session.run(runOptions, inputs); - // inputOrt.release(); - // runOptions.release(); - return outputs[0]?.value as List>>; // [1, 25200, 16] + final result = + outputs[0]?.value as List>>; // [1, 25200, 16] + inputOrt.release(); + runOptions.release(); + outputs.forEach((element) { + element?.release(); + }); + + return result; } static Future>>> _runPlatformPluginPredict( diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index b2f0b2d9d1..f36a69c752 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -74,6 +74,9 @@ class FaceEmbeddingService extends MlModel { for (final embedding in embeddings) { normalizeEmbedding(embedding); } + inputOrt.release(); + runOptions.release(); + outputs.forEach((element) => element?.release()); stopwatch.stop(); _logger.info( 'MobileFaceNetFFI interpreter.run is finished, in ${stopwatch.elapsedMilliseconds}ms', diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index adce139ef5..ac1d9e20da 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -53,6 +53,9 @@ class ClipImageEncoder extends MlModel { final runOptions = OrtRunOptions(); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; + inputOrt.release(); + runOptions.release(); + outputs.forEach((element) => element?.release()); normalizeEmbedding(embedding); w.stopWithLog("done"); return embedding; diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index cdf3fdf47c..ff75a9028e 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -54,6 +54,9 @@ class ClipTextEncoder extends MlModel { final session = OrtSession.fromAddress(address); final outputs = session.run(runOptions, inputs); final embedding = (outputs[0]?.value as List>)[0]; + inputOrt.release(); + runOptions.release(); + outputs.forEach((element) => element?.release()); normalizeEmbedding(embedding); return embedding; } From 3687fc0eaac3f4b9ccf35e901c003939e1bb3e8c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 22 Aug 2024 17:20:51 +0530 Subject: [PATCH 0527/1179] [mob][photos] Bump version v0.9.26 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 3446823991..e2ebeb72b9 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.25+925 +version: 0.9.26+926 publish_to: none environment: From 183ed3f1d70757f1accb3a6a6f3d57d90fe0fc4d Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 22 Aug 2024 17:35:55 +0530 Subject: [PATCH 0528/1179] [mob][photos] Refactor + UI tweaks on home app bar --- .../lib/ui/components/home_header_widget.dart | 100 ------ .../ui/home/error_warning_header_widget.dart | 102 ++++++ mobile/lib/ui/home/header_widget.dart | 4 +- mobile/lib/ui/home/home_app_bar_widget.dart | 198 +++++++++++- mobile/lib/ui/home/status_bar_widget.dart | 292 ------------------ 5 files changed, 296 insertions(+), 400 deletions(-) delete mode 100644 mobile/lib/ui/components/home_header_widget.dart create mode 100644 mobile/lib/ui/home/error_warning_header_widget.dart delete mode 100644 mobile/lib/ui/home/status_bar_widget.dart diff --git a/mobile/lib/ui/components/home_header_widget.dart b/mobile/lib/ui/components/home_header_widget.dart deleted file mode 100644 index 7f2519a190..0000000000 --- a/mobile/lib/ui/components/home_header_widget.dart +++ /dev/null @@ -1,100 +0,0 @@ -import "dart:async"; -import "dart:io"; - -import 'package:flutter/material.dart'; -import "package:logging/logging.dart"; -import "package:photo_manager/photo_manager.dart"; -import "package:photos/generated/l10n.dart"; -import "package:photos/services/local_sync_service.dart"; -import 'package:photos/ui/components/buttons/icon_button_widget.dart'; -import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; -import "package:photos/utils/dialog_util.dart"; -import "package:photos/utils/navigation_util.dart"; -import "package:photos/utils/photo_manager_util.dart"; - -class HomeHeaderWidget extends StatefulWidget { - final Widget centerWidget; - const HomeHeaderWidget({required this.centerWidget, Key? key}) - : super(key: key); - - @override - State createState() => _HomeHeaderWidgetState(); -} - -class _HomeHeaderWidgetState extends State { - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - children: [ - IconButtonWidget( - iconButtonType: IconButtonType.primary, - icon: Icons.menu_outlined, - onTap: () { - Scaffold.of(context).openDrawer(); - }, - ), - ], - ), - AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - child: widget.centerWidget, - ), - IconButtonWidget( - icon: Icons.add_photo_alternate_outlined, - iconButtonType: IconButtonType.primary, - onTap: () async { - try { - final PermissionState state = - await requestPhotoMangerPermissions(); - await LocalSyncService.instance.onUpdatePermission(state); - } on Exception catch (e) { - Logger("HomeHeaderWidget").severe( - "Failed to request permission: ${e.toString()}", - e, - ); - } - if (!LocalSyncService.instance.hasGrantedFullPermission()) { - if (Platform.isAndroid) { - await PhotoManager.openSetting(); - } else { - final bool hasGrantedLimit = - LocalSyncService.instance.hasGrantedLimitedPermissions(); - // ignore: unawaited_futures - showChoiceActionSheet( - context, - title: S.of(context).preserveMore, - body: S.of(context).grantFullAccessPrompt, - firstButtonLabel: S.of(context).openSettings, - firstButtonOnTap: () async { - await PhotoManager.openSetting(); - }, - secondButtonLabel: hasGrantedLimit - ? S.of(context).selectMorePhotos - : S.of(context).cancel, - secondButtonOnTap: () async { - if (hasGrantedLimit) { - await PhotoManager.presentLimited(); - } - }, - ); - } - } else { - unawaited( - routeToPage( - context, - BackupFolderSelectionPage( - buttonText: S.of(context).backup, - ), - ), - ); - } - }, - ), - ], - ); - } -} diff --git a/mobile/lib/ui/home/error_warning_header_widget.dart b/mobile/lib/ui/home/error_warning_header_widget.dart new file mode 100644 index 0000000000..ffda3f4c42 --- /dev/null +++ b/mobile/lib/ui/home/error_warning_header_widget.dart @@ -0,0 +1,102 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import "package:logging/logging.dart"; +import 'package:photos/core/event_bus.dart'; +import 'package:photos/events/notification_event.dart'; +import 'package:photos/events/sync_status_update_event.dart'; +import "package:photos/generated/l10n.dart"; +import 'package:photos/services/user_remote_flag_service.dart'; +import "package:photos/theme/ente_theme.dart"; +import 'package:photos/ui/account/verify_recovery_page.dart'; +import 'package:photos/ui/components/notification_widget.dart'; +import 'package:photos/ui/home/header_error_widget.dart'; +import 'package:photos/utils/navigation_util.dart'; + +const double kContainerHeight = 36; + +class ErrorWarningHeader extends StatefulWidget { + const ErrorWarningHeader({Key? key}) : super(key: key); + + @override + State createState() => _ErrorWarningHeaderState(); +} + +class _ErrorWarningHeaderState extends State { + static final _logger = Logger("StatusBarWidget"); + + late StreamSubscription _subscription; + late StreamSubscription _notificationSubscription; + bool _showErrorBanner = false; + Error? _syncError; + + @override + void initState() { + super.initState(); + + _subscription = Bus.instance.on().listen((event) { + _logger.info("Received event " + event.status.toString()); + if (event.status == SyncStatus.error) { + setState(() { + _syncError = event.error; + _showErrorBanner = true; + }); + } else { + setState(() { + _syncError = null; + _showErrorBanner = false; + }); + } + }); + _notificationSubscription = + Bus.instance.on().listen((event) { + if (mounted) { + setState(() {}); + } + }); + } + + @override + void dispose() { + _subscription.cancel(); + _notificationSubscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _showErrorBanner + ? Divider( + height: 8, + color: getEnteColorScheme(context).strokeFaint, + ) + : const SizedBox.shrink(), + _showErrorBanner + ? HeaderErrorWidget(error: _syncError) + : const SizedBox.shrink(), + UserRemoteFlagService.instance.shouldShowRecoveryVerification() && + !_showErrorBanner + ? Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: NotificationWidget( + startIcon: Icons.error_outline, + actionIcon: Icons.arrow_forward, + text: S.of(context).confirmYourRecoveryKey, + type: NotificationType.banner, + onTap: () async => { + await routeToPage( + context, + const VerifyRecoveryPage(), + forceCustomPageRoute: true, + ), + }, + ), + ) + : const SizedBox.shrink(), + ], + ); + } +} diff --git a/mobile/lib/ui/home/header_widget.dart b/mobile/lib/ui/home/header_widget.dart index a322382f14..e4cf9057a7 100644 --- a/mobile/lib/ui/home/header_widget.dart +++ b/mobile/lib/ui/home/header_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; +import "package:photos/ui/home/error_warning_header_widget.dart"; import "package:photos/ui/home/memories/memories_widget.dart"; -import 'package:photos/ui/home/status_bar_widget.dart'; class HeaderWidget extends StatelessWidget { const HeaderWidget({ @@ -14,7 +14,7 @@ class HeaderWidget extends StatelessWidget { return const Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - StatusBarWidget(), + ErrorWarningHeader(), MemoriesWidget(), ], ); diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index 5cda20e593..0f535de5fe 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -2,15 +2,20 @@ import "dart:async"; import "dart:io"; import "package:flutter/material.dart"; +import "package:intl/intl.dart"; import "package:logging/logging.dart"; import "package:photo_manager/photo_manager.dart"; import "package:photos/core/event_bus.dart"; +import "package:photos/ente_theme_data.dart"; import "package:photos/events/sync_status_update_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/services/local_sync_service.dart"; +import "package:photos/services/sync_service.dart"; +import "package:photos/theme/ente_theme.dart"; import "package:photos/theme/text_style.dart"; +import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; -import "package:photos/ui/home/status_bar_widget.dart"; +import "package:photos/ui/home/error_warning_header_widget.dart"; import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; @@ -33,6 +38,7 @@ class _HomeAppBarWidgetState extends State { @override void initState() { super.initState(); + _subscription = Bus.instance.on().listen((event) { _logger.info("Received event " + event.status.toString()); @@ -72,11 +78,21 @@ class _HomeAppBarWidgetState extends State { AppBar build(BuildContext context) { return AppBar( centerTitle: true, - title: _showStatus - ? _showErrorBanner - ? const Text("ente", style: brandStyleMedium) - : const SyncStatusWidget() - : const Text("ente", style: brandStyleMedium), + title: AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + switchInCurve: Curves.easeOutQuad, + switchOutCurve: Curves.easeInQuad, + child: _showStatus + ? AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + switchInCurve: Curves.easeOutQuad, + switchOutCurve: Curves.easeInQuad, + child: _showErrorBanner + ? const Text("ente", style: brandStyleMedium) + : const SyncStatusWidget(), + ) + : const Text("ente", style: brandStyleMedium), + ), actions: [ IconButtonWidget( icon: Icons.add_photo_alternate_outlined, @@ -133,3 +149,173 @@ class _HomeAppBarWidgetState extends State { ); } } + +class SyncStatusWidget extends StatefulWidget { + const SyncStatusWidget({Key? key}) : super(key: key); + + @override + State createState() => _SyncStatusWidgetState(); +} + +class _SyncStatusWidgetState extends State { + static const Duration kSleepDuration = Duration(milliseconds: 3000); + + SyncStatusUpdate? _event; + late StreamSubscription _subscription; + + @override + void initState() { + super.initState(); + + _subscription = Bus.instance.on().listen((event) { + setState(() { + _event = event; + }); + }); + _event = SyncService.instance.getLastSyncStatusEvent(); + } + + @override + void dispose() { + _subscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final bool isNotOutdatedEvent = _event != null && + (_event!.status == SyncStatus.completedBackup || + _event!.status == SyncStatus.completedFirstGalleryImport) && + (DateTime.now().microsecondsSinceEpoch - _event!.timestamp > + kSleepDuration.inMicroseconds); + if (_event == null || + isNotOutdatedEvent || + //sync error cases are handled in StatusBarWidget + _event!.status == SyncStatus.error) { + return const SizedBox.shrink(); + } + if (_event!.status == SyncStatus.completedBackup) { + return const AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + switchInCurve: Curves.easeOutQuad, + switchOutCurve: Curves.easeInQuad, + child: SyncStatusCompletedWidget(), + ); + } + return AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + switchInCurve: Curves.easeOutQuad, + switchOutCurve: Curves.easeInQuad, + child: RefreshIndicatorWidget(_event), + ); + } +} + +class RefreshIndicatorWidget extends StatelessWidget { + final SyncStatusUpdate? event; + + const RefreshIndicatorWidget(this.event, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: kContainerHeight, + alignment: Alignment.center, + child: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + EnteLoadingWidget( + color: getEnteColorScheme(context).primary400, + ), + const SizedBox(width: 12), + Text( + _getRefreshingText(context), + style: getEnteTextTheme(context).small, + ), + ], + ), + ], + ), + ), + ); + } + + String _getRefreshingText(BuildContext context) { + if (event!.status == SyncStatus.startedFirstGalleryImport || + event!.status == SyncStatus.completedFirstGalleryImport) { + return S.of(context).loadingGallery; + } + if (event!.status == SyncStatus.applyingRemoteDiff) { + return S.of(context).syncing; + } + if (event!.status == SyncStatus.preparingForUpload) { + return S.of(context).encryptingBackup; + } + if (event!.status == SyncStatus.inProgress) { + final format = NumberFormat(); + return S.of(context).syncProgress( + format.format(event!.completed!), + format.format(event!.total!), + ); + } + if (event!.status == SyncStatus.paused) { + return event!.reason; + } + if (event!.status == SyncStatus.error) { + return event!.reason; + } + if (event!.status == SyncStatus.completedBackup) { + if (event!.wasStopped) { + return S.of(context).syncStopped; + } + } + return S.of(context).allMemoriesPreserved; + } +} + +class SyncStatusCompletedWidget extends StatelessWidget { + const SyncStatusCompletedWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + return Container( + color: colorScheme.backdropBase, + height: kContainerHeight, + child: Align( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.cloud_done_outlined, + color: Theme.of(context).colorScheme.greenAlternative, + size: 22, + ), + Padding( + padding: const EdgeInsets.only(left: 12), + child: Text( + S.of(context).allMemoriesPreserved, + style: getEnteTextTheme(context).small, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart deleted file mode 100644 index 3815e4cf3a..0000000000 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ /dev/null @@ -1,292 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import "package:intl/intl.dart"; -import "package:logging/logging.dart"; -import 'package:photos/core/event_bus.dart'; -import 'package:photos/ente_theme_data.dart'; -import 'package:photos/events/notification_event.dart'; -import 'package:photos/events/sync_status_update_event.dart'; -import "package:photos/generated/l10n.dart"; -import 'package:photos/services/sync_service.dart'; -import 'package:photos/services/user_remote_flag_service.dart'; -import "package:photos/theme/ente_theme.dart"; -import 'package:photos/theme/text_style.dart'; -import 'package:photos/ui/account/verify_recovery_page.dart'; -import 'package:photos/ui/components/home_header_widget.dart'; -import 'package:photos/ui/components/notification_widget.dart'; -import 'package:photos/ui/home/header_error_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -const double kContainerHeight = 36; - -class StatusBarWidget extends StatefulWidget { - const StatusBarWidget({Key? key}) : super(key: key); - - @override - State createState() => _StatusBarWidgetState(); -} - -class _StatusBarWidgetState extends State { - static final _logger = Logger("StatusBarWidget"); - - late StreamSubscription _subscription; - late StreamSubscription _notificationSubscription; - bool _showStatus = false; - bool _showErrorBanner = false; - Error? _syncError; - - @override - void initState() { - super.initState(); - - _subscription = Bus.instance.on().listen((event) { - _logger.info("Received event " + event.status.toString()); - if (event.status == SyncStatus.error) { - setState(() { - _syncError = event.error; - _showErrorBanner = true; - }); - } else { - setState(() { - _syncError = null; - _showErrorBanner = false; - }); - } - if (event.status == SyncStatus.completedFirstGalleryImport || - event.status == SyncStatus.completedBackup) { - Future.delayed(const Duration(milliseconds: 2000), () { - if (mounted) { - setState(() { - _showStatus = false; - }); - } - }); - } else { - setState(() { - _showStatus = true; - }); - } - }); - _notificationSubscription = - Bus.instance.on().listen((event) { - if (mounted) { - setState(() {}); - } - }); - } - - @override - void dispose() { - _subscription.cancel(); - _notificationSubscription.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - HomeHeaderWidget( - centerWidget: _showStatus - ? _showErrorBanner - ? const Text("ente", style: brandStyleMedium) - : const SyncStatusWidget() - : const Text("ente", style: brandStyleMedium), - ), - _showErrorBanner - ? Divider( - height: 8, - color: getEnteColorScheme(context).strokeFaint, - ) - : const SizedBox.shrink(), - _showErrorBanner - ? HeaderErrorWidget(error: _syncError) - : const SizedBox.shrink(), - UserRemoteFlagService.instance.shouldShowRecoveryVerification() && - !_showErrorBanner - ? Padding( - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), - child: NotificationWidget( - startIcon: Icons.error_outline, - actionIcon: Icons.arrow_forward, - text: S.of(context).confirmYourRecoveryKey, - type: NotificationType.banner, - onTap: () async => { - await routeToPage( - context, - const VerifyRecoveryPage(), - forceCustomPageRoute: true, - ), - }, - ), - ) - : const SizedBox.shrink(), - ], - ); - } -} - -class SyncStatusWidget extends StatefulWidget { - const SyncStatusWidget({Key? key}) : super(key: key); - - @override - State createState() => _SyncStatusWidgetState(); -} - -class _SyncStatusWidgetState extends State { - static const Duration kSleepDuration = Duration(milliseconds: 3000); - - SyncStatusUpdate? _event; - late StreamSubscription _subscription; - - @override - void initState() { - super.initState(); - - _subscription = Bus.instance.on().listen((event) { - setState(() { - _event = event; - }); - }); - _event = SyncService.instance.getLastSyncStatusEvent(); - } - - @override - void dispose() { - _subscription.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final bool isNotOutdatedEvent = _event != null && - (_event!.status == SyncStatus.completedBackup || - _event!.status == SyncStatus.completedFirstGalleryImport) && - (DateTime.now().microsecondsSinceEpoch - _event!.timestamp > - kSleepDuration.inMicroseconds); - if (_event == null || - isNotOutdatedEvent || - //sync error cases are handled in StatusBarWidget - _event!.status == SyncStatus.error) { - return const SizedBox.shrink(); - } - if (_event!.status == SyncStatus.completedBackup) { - return const SyncStatusCompletedWidget(); - } - return RefreshIndicatorWidget(_event); - } -} - -class RefreshIndicatorWidget extends StatelessWidget { - static const _inProgressIcon = CircularProgressIndicator( - strokeWidth: 2, - valueColor: AlwaysStoppedAnimation(Color.fromRGBO(45, 194, 98, 1.0)), - ); - - final SyncStatusUpdate? event; - - const RefreshIndicatorWidget(this.event, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: kContainerHeight, - alignment: Alignment.center, - child: SingleChildScrollView( - physics: const NeverScrollableScrollPhysics(), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(2), - width: 22, - height: 22, - child: _inProgressIcon, - ), - Padding( - padding: const EdgeInsets.fromLTRB(12, 4, 0, 0), - child: Text(_getRefreshingText(context)), - ), - ], - ), - ], - ), - ), - ); - } - - String _getRefreshingText(BuildContext context) { - if (event!.status == SyncStatus.startedFirstGalleryImport || - event!.status == SyncStatus.completedFirstGalleryImport) { - return S.of(context).loadingGallery; - } - if (event!.status == SyncStatus.applyingRemoteDiff) { - return S.of(context).syncing; - } - if (event!.status == SyncStatus.preparingForUpload) { - return S.of(context).encryptingBackup; - } - if (event!.status == SyncStatus.inProgress) { - final format = NumberFormat(); - return S.of(context).syncProgress( - format.format(event!.completed!), - format.format(event!.total!), - ); - } - if (event!.status == SyncStatus.paused) { - return event!.reason; - } - if (event!.status == SyncStatus.error) { - return event!.reason; - } - if (event!.status == SyncStatus.completedBackup) { - if (event!.wasStopped) { - return S.of(context).syncStopped; - } - } - return S.of(context).allMemoriesPreserved; - } -} - -class SyncStatusCompletedWidget extends StatelessWidget { - const SyncStatusCompletedWidget({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - color: Theme.of(context).colorScheme.defaultBackgroundColor, - height: kContainerHeight, - child: Align( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - Icons.cloud_done_outlined, - color: Theme.of(context).colorScheme.greenAlternative, - size: 22, - ), - Padding( - padding: const EdgeInsets.only(left: 12), - child: Text(S.of(context).allMemoriesPreserved), - ), - ], - ), - ], - ), - ), - ); - } -} From 36085eb78f495555eb3b6f71f299371f92064df3 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:36:24 +0530 Subject: [PATCH 0529/1179] Update first upload template --- .../mail-templates/web_app_first_upload.html | 667 ++++++------------ 1 file changed, 226 insertions(+), 441 deletions(-) diff --git a/server/mail-templates/web_app_first_upload.html b/server/mail-templates/web_app_first_upload.html index 4f837aafbe..cd6282b53c 100644 --- a/server/mail-templates/web_app_first_upload.html +++ b/server/mail-templates/web_app_first_upload.html @@ -1,463 +1,248 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Congratulations on preserving your first memory with Ente!

- @media screen and (max-width: 480px) { +

+ Did you know that we will be keeping 3 copies of this memory, at 3 + different locations so that they are as safe as they can be? One of + these copies will in fact be preserved in an underground fallout + shelter! +

- .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

+ While we work our magic, you can go ahead share your memories with your + loved ones. If they aren't on Ente yet, you can + share links. +

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } +

+ That's not all, we have beautiful mobile apps (linked below) that backup + any moments you capture, automatically in the background. +

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Congratulations - on preserving - your first - memory with - ente! -
-
-
-
-
- Did you know that we will be - keeping 3 copies of this memory, at 3 different locations so that they are - as safe as they can be? One of these copies will in fact be preserved in - an underground fallout shelter! -
-
-
-
-
- While we work our magic, - you can go ahead share your memories with your loved ones. - If they aren't on ente yet, - you can share links. -
-
-
-
-
- That's not all, - we have beautiful mobile apps (linked below) that backup - the photos you capture, automatically in the background. - -
-
-
-
-
- Now as you check out the product, - if there's anything you need help with, just write back and - we'll be there for you! -
-
-
-
-
- - - team@ente -
-
-
-
- -
-
-
- - - -
-
- -
- - - - - - - - -
- - - - - -
- - Download on PlayStore - -
- -
- - -
- -
-
- - -
-
- -
- - - - - - - - - -
- - - - - -
- - Download on AppStore - -
- -
- - -
- -
-
- - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
-
- -
-
-
+
+ + Download on
+       PlayStore + +
+ + Download on
+       AppStore + +
+

+ Now as you check out Ente, if there's anything you need help with, + please write back and we'll be there for you! +

-
- - - +
+ + From eee01322c8fadee6b633567fa39814544cd65a8c Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:40:07 +0530 Subject: [PATCH 0530/1179] Update first upload template for mobile --- .../mobile_app_first_upload.html | 498 ++++++------------ 1 file changed, 172 insertions(+), 326 deletions(-) diff --git a/server/mail-templates/mobile_app_first_upload.html b/server/mail-templates/mobile_app_first_upload.html index 1ee9546720..8ff37bafaa 100644 --- a/server/mail-templates/mobile_app_first_upload.html +++ b/server/mail-templates/mobile_app_first_upload.html @@ -1,347 +1,193 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Congratulations on preserving your first memory with Ente!

- @media screen and (max-width: 480px) { +

+ Did you know that we will be keeping 3 copies of this memory, at 3 + different locations so that they are as safe as they can be? One of + these copies will in fact be preserved in an underground fallout + shelter! +

- .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

+ While we work our magic, you can go ahead share your memories with your + loved ones. If they aren't on Ente yet, you can + share links. +

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } +

That's not all, if you wish to import more of your photos, we have an awesome desktop app waiting for you @ ente.io/download/desktop.

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Congratulations - on preserving - your first - memory with - ente! -
-
-
-
-
- Did you know that we will be - keeping 3 copies of this memory, at 3 different locations so that they are - as safe as they can be? One of these copies will in fact be preserved in - an underground fallout shelter! -
-
-
-
-
- While we work our magic, - you can go ahead share your memories with your loved ones. - If they aren't on ente yet, - you can share links. -
-
-
-
-
- That's not all, - if you wish to import more of your photos, we have an awesome - desktop app waiting for you @ - ente.io/download/desktop. - -
-
-
-
-
- Now as you check out the product, - if there's anything you need help with, just write back and - we'll be there for you! -
-
-
-
-
- - - team@ente -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
+

+ Now as you check out Ente, if there's anything you need help with, + please write back and we'll be there for you! +

-
- - - - \ No newline at end of file +
+ + + From 08f428f4ddbe6827fc504893dd2032dee92c8756 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 17:49:20 +0530 Subject: [PATCH 0531/1179] Update some more templates --- .../storage_limit_exceeded.html | 395 ++++++--------- server/mail-templates/subscription_ended.html | 404 ++++++--------- .../mail-templates/subscription_upgraded.html | 463 +++++++----------- .../mail-templates/successful_referral.html | 436 ++++++----------- 4 files changed, 627 insertions(+), 1071 deletions(-) diff --git a/server/mail-templates/storage_limit_exceeded.html b/server/mail-templates/storage_limit_exceeded.html index 49270a8644..8ab67aa60c 100644 --- a/server/mail-templates/storage_limit_exceeded.html +++ b/server/mail-templates/storage_limit_exceeded.html @@ -1,253 +1,150 @@ - + + + + + - - - - - + pre { + background: #f4f4f4f4; + padding: 2px; + } - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey, -
-
-
-
-
- This is to let you know that you have used up your storage limit. The files you've uploaded so far will remain accessible, but no new files will be backed up until you upgrade your subscription. -
-
-
-
-
- If you're looking for a safe space to preserve more of your memories, please do upgrade, we would be delighted to serve you! -
-
-
-
-
- In - case you have - any questions or - feedback, just - write back, we'd - be happy to - help. -
-
-
-
-
- That's - all, we hope you have a memorable day ahead! -
-
-
-
-
- - - team@ente.io -
-
-
-
-
-
-
-
- -
-
-
-
-
+ table { + width: 100%; + border: 1px solid #ddd; + } - + table td { + border-color: #ddd; + padding: 5px; + } - \ No newline at end of file + .wrap { + background-color: #fff; + padding: 30px; + max-width: 525px; + margin: 0 auto; + border-radius: 5px; + } + + .button { + background: #0055d4; + border-radius: 3px; + text-decoration: none !important; + color: #fff !important; + font-weight: bold; + padding: 10px 30px; + display: inline-block; + } + + .button:hover { + background: #111; + } + + .footer { + text-align: center; + font-size: 12px; + color: #888; + } + + .footer a { + color: #888; + margin-right: 5px; + } + + .gutter { + padding: 30px; + } + + img { + max-width: 100%; + height: auto; + } + + a { + color: #0055d4; + } + + a:hover { + color: #111; + } + + @media screen and (max-width: 600px) { + .wrap { + max-width: auto; + } + + .gutter { + padding: 10px; + } + } + + .footer-icons { + padding: 4px !important; + width: 24px !important; + } + + + +
 
+
+

Hey,

+ +

This is to let you know that you have used up your storage limit. The + files you've uploaded so far will remain accessible, but no new files will + be backed up until you upgrade your subscription. +

+ +

If you're looking for a safe space to preserve more of your memories, + please do upgrade, we would be delighted to serve you!

+ +

In case you have any questions or feedback, just write back, we'd be + happy to help.

+ +

If at any point you need support, or have feedback to share, please do + write to us. We want Ente to work well for you.

+ +

That's all, wish you a memorable day ahead!

+
+
+ + + diff --git a/server/mail-templates/subscription_ended.html b/server/mail-templates/subscription_ended.html index d83a174515..8f658bbae1 100644 --- a/server/mail-templates/subscription_ended.html +++ b/server/mail-templates/subscription_ended.html @@ -1,264 +1,178 @@ - + + + + + - - - .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } + +
 
+
+

Your subscription to Ente Photos has ended. Thank you for trying us out!

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Your subscription to - Ente Photos has ended. Thank you for trying out ente. -
-
-
-
- If you still have data stored in ente, we encourage you to follow the steps outlined here to export your data: help.ente.io/photos/migration/export. -
-
-
-
- If there's anything we could have done better, please let us know by replying to - this email. Your feedback will help us be better by the next time you subscribe! -
-
-
-
-
-
-
- -
-
-
-
-
- - +

+ If you still have data stored in ente, we encourage you to follow the steps outlined here to export your data: help.ente.io/photos/migration/export. +

+

If there's anything we could have done better, please let us know by + replying to this email. Your feedback will help us get better!

+
+
+ + diff --git a/server/mail-templates/subscription_upgraded.html b/server/mail-templates/subscription_upgraded.html index 241bc39154..9f1cd6ec36 100644 --- a/server/mail-templates/subscription_upgraded.html +++ b/server/mail-templates/subscription_upgraded.html @@ -1,322 +1,187 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hello!

- @media screen and (max-width: 480px) { - .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

+ We want to take this opportunity to thank you for subscribing to a paid plan. +

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } +

In case you did not know, you can share links to your albums with your + loved ones who aren't on Ente. You can even let them add photos via these + links. All this, end-to-end encrypted, in original quality.

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } +

You can also use our family plans to share your storage with them, at + no extra cost.

- table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } +

If at any point you need support, or have feedback to share, please do + write to us. We want Ente to work well for you.

- img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hello! -
-
-
-
-
- We want to take this opportunity to thank you for subscribing to a paid plan. -
-
-
-
-
- - In case you did not know, you can share links to your albums with your loved ones who aren't on ente. You can even let them add photos via these links. All this, end-to-end encrypted, in original quality. - -
-
-
-
-
- - You can also use our family plans to share your storage with them, at no extra cost. - -
-
-
-
-
- - If at any point you need support, or have feedback to share, please do write to us. We want ente to work well for you. - -
-
-
-
-
- - Here's to a beautiful journey together 🥂 - -
-
-
-
-
- - - team@ente - -
-
-
-
-
-
-
-
-
-
- -
- About - Blog - Community - Shop -
-
-
-
-
-
-
-
- -
-
-
+

Here's to a beautiful journey together 🥂

-
- - - +
+ + diff --git a/server/mail-templates/successful_referral.html b/server/mail-templates/successful_referral.html index fd7f3ea231..9fa2c3248b 100644 --- a/server/mail-templates/successful_referral.html +++ b/server/mail-templates/successful_referral.html @@ -1,298 +1,178 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Congratulations!

- @media screen and (max-width: 480px) { - .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

+ One of the customers you referred has upgraded to a paid plan, and as a + thank you, we have credited 10 GB to your account. +

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } - - .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Congratulations! -
-
-
-
-
- One of the customers you referred has upgraded to a paid plan, and as a thank you, we have credited 10 GB to your account. -
-
-
-
-
- - Thank you for spreading the word! - -
-
-
-
-
- - - team@ente - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
+

Thank you for spreading the word!

-
- - - +
+ + From 34612017081d11514d905c9297829ca45eb05d1b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 22 Aug 2024 17:58:57 +0530 Subject: [PATCH 0532/1179] [mob][photos] Add shadow to home tab's app bar --- mobile/lib/ui/home/error_warning_header_widget.dart | 7 ------- mobile/lib/ui/home/home_app_bar_widget.dart | 6 ++++++ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mobile/lib/ui/home/error_warning_header_widget.dart b/mobile/lib/ui/home/error_warning_header_widget.dart index ffda3f4c42..b657db492f 100644 --- a/mobile/lib/ui/home/error_warning_header_widget.dart +++ b/mobile/lib/ui/home/error_warning_header_widget.dart @@ -7,7 +7,6 @@ import 'package:photos/events/notification_event.dart'; import 'package:photos/events/sync_status_update_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/user_remote_flag_service.dart'; -import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/account/verify_recovery_page.dart'; import 'package:photos/ui/components/notification_widget.dart'; import 'package:photos/ui/home/header_error_widget.dart'; @@ -67,12 +66,6 @@ class _ErrorWarningHeaderState extends State { Widget build(BuildContext context) { return Column( children: [ - _showErrorBanner - ? Divider( - height: 8, - color: getEnteColorScheme(context).strokeFaint, - ) - : const SizedBox.shrink(), _showErrorBanner ? HeaderErrorWidget(error: _syncError) : const SizedBox.shrink(), diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index 0f535de5fe..60b512b7ea 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -76,7 +76,13 @@ class _HomeAppBarWidgetState extends State { @override AppBar build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); return AppBar( + backgroundColor: colorScheme.backgroundBase, + elevation: 4, + surfaceTintColor: Colors.transparent, + shadowColor: Colors.black.withOpacity(0.2), + clipBehavior: Clip.none, centerTitle: true, title: AnimatedSwitcher( duration: const Duration(milliseconds: 500), From f64de55b307c553044eaf78c5e287ee48096c206 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 18:05:49 +0530 Subject: [PATCH 0533/1179] Update more templates --- server/mail-templates/account_deleted.html | 397 +++++---------- .../account_deleted_active_sub.html | 398 +++++---------- server/mail-templates/email_changed.html | 342 +++++-------- server/mail-templates/files_collected.html | 397 +++++---------- server/mail-templates/on_hold.html | 390 +++++---------- server/mail-templates/report_alert.html | 471 +++++------------- .../report_limit_exceeded_alert.html | 458 +++++------------ 7 files changed, 865 insertions(+), 1988 deletions(-) diff --git a/server/mail-templates/account_deleted.html b/server/mail-templates/account_deleted.html index 9c0cc6669b..e9963746f9 100644 --- a/server/mail-templates/account_deleted.html +++ b/server/mail-templates/account_deleted.html @@ -1,296 +1,143 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hey,

- @media screen and (max-width: 480px) { - .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

As requested by you, we've deleted your Ente account and scheduled your + uploaded data for deletion.

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } +

If you accidentally deleted your account, please contact our support + immediately to try and recover your uploaded data before the next + scheduled deletion happens.

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey! -
-
-
-
-
- As requested by you, we've deleted your ente account and scheduled your uploaded data for deletion. -
-
-
-
-
- If you accidentally deleted your account, please contact our support immediately to try and recover your uploaded data before the next scheduled deletion happens. -
-
-
-
-
- - Thank you for checking out ente, we hope that you will give us another opportunity in the future! - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
+

Thank you for checking out Ente, we wish you a great time ahead!

-
- - - +
+ + diff --git a/server/mail-templates/account_deleted_active_sub.html b/server/mail-templates/account_deleted_active_sub.html index 951ed442e3..1d33aebc10 100644 --- a/server/mail-templates/account_deleted_active_sub.html +++ b/server/mail-templates/account_deleted_active_sub.html @@ -1,296 +1,144 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hey,

- @media screen and (max-width: 480px) { - .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

As requested by you, we've deleted your ente account and scheduled your + uploaded data for deletion. If you have an App Store subscription for + Ente, please remember to cancel it too.

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } +

If you accidentally deleted your account, please contact our support + immediately to try and recover your uploaded data before the next + scheduled deletion happens.

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey! -
-
-
-
-
- As requested by you, we've deleted your ente account and scheduled your uploaded data for deletion. If you have an App Store subscription for ente, please remember to cancel it too. -
-
-
-
-
- If you accidentally deleted your account, please contact our support immediately to try and recover your uploaded data before the next scheduled deletion happens. -
-
-
-
-
- - Thank you for checking out ente, we hope that you will give us another opportunity in the future! - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
+

Thank you for checking out Ente, we wish you a great time ahead!

-
- - - +
+ + diff --git a/server/mail-templates/email_changed.html b/server/mail-templates/email_changed.html index 5343d6bb6c..35316969fe 100644 --- a/server/mail-templates/email_changed.html +++ b/server/mail-templates/email_changed.html @@ -1,235 +1,139 @@ - + + + + + - - - - - + .gutter { + padding: 10px; + } + } - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey, -
-
-
-
-
- This is to alert you that your email address has been updated to {{.NewEmail}}. -
-
-
-
-
- Please respond if you need any assistance. -
-
-
-
-
-
- - - team@ente.io -
-
-
-
-
- -
-
- -
-
-
+ .footer-icons { + padding: 4px !important; + width: 24px !important; + } + + + +
 
+
+

Hey,

+ +

This is to alert you that your email address has been updated to + {{.NewEmail}}.

+ +

Please respond if you need any assistance.

-
- - - - \ No newline at end of file +
+ + + diff --git a/server/mail-templates/files_collected.html b/server/mail-templates/files_collected.html index 6f48f323fb..1faed00522 100644 --- a/server/mail-templates/files_collected.html +++ b/server/mail-templates/files_collected.html @@ -1,299 +1,138 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hello!

- @media screen and (max-width: 480px) { - .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

Someone has added photos to your album.

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } - - .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-

- 💝 -

-
- - - - - - -
-
-
- Hey there! -
-
-
-
-
- Someone has added photos to your album. -
-
-
-
-
- - Please open your ente app to view them. - -
-
-
-
-
-
-
-
-
-
- -
- About - Blog - Community -
-
-
-
-
-
-
-
- -
-
-
+

Please open your Ente app to view them.

-
- - - +
+ + diff --git a/server/mail-templates/on_hold.html b/server/mail-templates/on_hold.html index 6cce9e6c9c..ec0b500d88 100644 --- a/server/mail-templates/on_hold.html +++ b/server/mail-templates/on_hold.html @@ -1,285 +1,145 @@ - + + + + + - - - .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } + +
 
+
+

Hey,

- .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } +

{{.PaymentProvider}} has informed us that they were unable to renew + your subscription. Please update your payment method within the app so + that your subscription can be renewed.

- table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey,
-
-
-
-
- {{.PaymentProvider}} - has informed us that - they were - unable to renew your - subscription. - Please update your - payment method - within - the app - so that your - subscription can be - renewed.
-
-
-
-
- If we don't get a - payment confirmation - from - {{.PaymentProvider}} - within the next - 31 days, our systems - may remove your - account and all - associated data with - it.
-
-
-
-
- If you need support, - please reply to this - email, we're quick - to respond!
-
-
-
-
- -
-
-
-
-
- - +

If we don't get a payment confirmation from {{.PaymentProvider}} within + the next 31 days, our systems may remove your account and all associated + data with it.

+

If you need support, please reply to this email, we're quick to + respond!

+
+
+ + diff --git a/server/mail-templates/report_alert.html b/server/mail-templates/report_alert.html index 8294458edb..3991d27ef4 100644 --- a/server/mail-templates/report_alert.html +++ b/server/mail-templates/report_alert.html @@ -1,359 +1,148 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hey,

- @media screen and (max-width: 480px) { +

+ This is to notify that someone you shared your album with has reported + its contents for abusing our + terms of service. +

- .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } - - .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } - - .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey, -
-
-
-
-
- This - is to notify - that someone you - shared your - album with - has reported - its contents for - abusing our terms - of - service. -
-
-
-
-
- Here - are more details - regarding this - report: -
    -
  • Album - Link: - {{.AlbumLink}} -
  • -
  • Reason: - {{.Reason}} -
  • -
  • Comments: - {{.Comments}} -
  • -
-
-
-
- If - there's anything - that you need - help with, - please respond - to this - email. -
-
-
-
- -
- Thank - you! - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
-
-
- - - - \ No newline at end of file +

Here are more details regarding this report:

+
    +
  • Album Link: {{.AlbumLink}}
  • +
  • Reason: {{.Reason}}
  • +
  • Comments: {{.Comments}}
  • +
+

If you need help, please respond to this email.

+
+
+ + + diff --git a/server/mail-templates/report_limit_exceeded_alert.html b/server/mail-templates/report_limit_exceeded_alert.html index 6d9a31d6b2..a227fb9d4a 100644 --- a/server/mail-templates/report_limit_exceeded_alert.html +++ b/server/mail-templates/report_limit_exceeded_alert.html @@ -1,353 +1,143 @@ - + + + + + - - - ol ol ol ol { - list-style-type: decimal !important; - } + +
 
+
+

Hey,

- @media screen and (max-width: 480px) { +

We have received too many abuse reports against an album you've shared + over Ente.

- .preheader .rightColumnContent, - .footer .rightColumnContent { - text-align: left !important; - } +

In an abundance of caution, we have temporarily disabled the publicly + accessible link that we were serving.

- .preheader .rightColumnContent div, - .preheader .rightColumnContent span, - .footer .rightColumnContent div, - .footer .rightColumnContent span { - text-align: left !important; - } - - .preheader .rightColumnContent, - .preheader .leftColumnContent { - font-size: 80% !important; - padding: 5px 0; - } - - table.wrapper-mobile { - width: 100% !important; - table-layout: fixed; - } - - img.max-width { - height: auto !important; - max-width: 100% !important; - } - - a.bulletproof-button { - display: block !important; - width: auto !important; - font-size: 80%; - padding-left: 0 !important; - padding-right: 0 !important; - } - - .columns { - width: 100% !important; - } - - .column { - display: block !important; - width: 100% !important; - padding-left: 0 !important; - padding-right: 0 !important; - margin-left: 0 !important; - margin-right: 0 !important; - } - - .social-icon-column { - display: inline-block !important; - } - } - - - - - - -
-
- - - - - - -
- - - - - - -
- - - - - - -
- - - - - - - -
- - - - - - - - - - - - - -
-
-
- Hey, -
-
-
-
-
- We - have received - too many abuse - reports against - an - album you've - shared over - ente. -
-
-
-
-
- - In an abundance - of caution, we - have temporarily - disabled the - publicly - accessible link - that we were - serving. - -
-
-
-
-
- In - the meanwhile, - if - you need - support, - please respond - to this - email. -
-
-
-
- -
- Thank - you! - -
-
-
-
-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
-
-
-
-
- - - - \ No newline at end of file +

In the meanwhile, if you need support, please respond to this + email.

+
+
+ + + From d37c85bce27f2dc85038bca2aa9803301b513999 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 18:09:23 +0530 Subject: [PATCH 0534/1179] Minor updates to family plan templates --- server/mail-templates/family_accepted.html | 4 ++-- server/mail-templates/family_invited.html | 2 +- server/mail-templates/family_left.html | 4 ++-- server/mail-templates/family_removed.html | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/mail-templates/family_accepted.html b/server/mail-templates/family_accepted.html index 6153e9c89b..7e09465943 100644 --- a/server/mail-templates/family_accepted.html +++ b/server/mail-templates/family_accepted.html @@ -227,11 +227,11 @@ role="module-content"> Hey!

{{.MemberEmailID}} has joined your family on - ente!
+ Ente!

Your storage space will now be shared with them.

- Please check the ente app to manage + Please check the Ente app to manage your family.

diff --git a/server/mail-templates/family_invited.html b/server/mail-templates/family_invited.html index ad1fb4da9a..98d801a02c 100644 --- a/server/mail-templates/family_invited.html +++ b/server/mail-templates/family_invited.html @@ -231,7 +231,7 @@ Hey!

{{.AdminEmailID}} has invited you to be a part of their family on - ente!

Please + Ente!

Please click the button below to upgrade your storage space. diff --git a/server/mail-templates/family_left.html b/server/mail-templates/family_left.html index c2056a1a44..11151817e4 100644 --- a/server/mail-templates/family_left.html +++ b/server/mail-templates/family_left.html @@ -227,12 +227,12 @@ role="module-content"> Hey!

{{.MemberEmailID}} has left your family on - ente!
+ Ente!

Your storage space will no longer be shared with them.

- Please check the ente app to manage + Please check the Ente app to manage your family. diff --git a/server/mail-templates/family_removed.html b/server/mail-templates/family_removed.html index 278023ad46..d15e07854c 100644 --- a/server/mail-templates/family_removed.html +++ b/server/mail-templates/family_removed.html @@ -228,10 +228,10 @@ Hey!

You have been removed from {{.AdminEmailID}}’s family on - ente.
+ Ente.

Please upgrade your subscription from the - app to continue using ente. + app to continue using Ente. From 92ab8e5289c16a4e8fcccd35cb3479e071270502 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 22 Aug 2024 18:12:08 +0530 Subject: [PATCH 0535/1179] ente -> Ente --- server/pkg/controller/email/email_notification.go | 4 ++-- server/pkg/controller/family/admin.go | 6 +++--- server/pkg/controller/public_collection.go | 4 ++-- server/pkg/controller/user/user.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/pkg/controller/email/email_notification.go b/server/pkg/controller/email/email_notification.go index 01b9466836..56bc91f013 100644 --- a/server/pkg/controller/email/email_notification.go +++ b/server/pkg/controller/email/email_notification.go @@ -23,11 +23,11 @@ const ( FilesCollectedTemplateID = "files_collected" FilesCollectedSubject = "You've got photos!" SubscriptionUpgradedTemplate = "subscription_upgraded.html" - SubscriptionUpgradedSubject = "Thank you for choosing ente!" + SubscriptionUpgradedSubject = "Thank you for choosing Ente!" FilesCollectedMuteDurationInMinutes = 10 StorageLimitExceededSubject = "[Alert] You have exceeded your storage limit" ReferralSuccessfulTemplate = "successful_referral.html" - ReferralSuccessfulSubject = "You've earned 10 GB on ente! 🎁" + ReferralSuccessfulSubject = "You've earned 10 GB on Ente! 🎁" ) type EmailNotificationController struct { diff --git a/server/pkg/controller/family/admin.go b/server/pkg/controller/family/admin.go index aba7f428b0..3db9aa4b72 100644 --- a/server/pkg/controller/family/admin.go +++ b/server/pkg/controller/family/admin.go @@ -220,18 +220,18 @@ func (c *Controller) sendNotification(ctx context.Context, adminUserID int64, me if newStatus == ente.INVITED { templateName = InviteTemplate - title = "You've been invited to join a family on ente!" + title = "You've been invited to join a family on Ente!" emailTo = memberUser.Email inlineImage["content"] = HappyHeaderImage } else if newStatus == ente.REMOVED { emailTo = memberUser.Email templateName = RemovedTemplate - title = "You have been removed from the family account on ente" + title = "You have been removed from the family account on Ente" inlineImage["content"] = SadHeaderImage } else if newStatus == ente.LEFT { emailTo = adminUser.Email templateName = LeftTemplate - title = fmt.Sprintf("%s has left your family on ente", memberUser.Email) + title = fmt.Sprintf("%s has left your family on Ente", memberUser.Email) inlineImage["content"] = SadHeaderImage } else if newStatus == ente.ACCEPTED { emailTo = adminUser.Email diff --git a/server/pkg/controller/public_collection.go b/server/pkg/controller/public_collection.go index 694db8bb10..d526837ddd 100644 --- a/server/pkg/controller/public_collection.go +++ b/server/pkg/controller/public_collection.go @@ -38,11 +38,11 @@ const ( DeviceLimitWarningThreshold = 2000 - AbuseAlertSubject = "[Alert] Abuse report received against your album on ente" + AbuseAlertSubject = "[Alert] Abuse report received against your album on Ente" AbuseAlertTeamSubject = "Abuse report received" - AbuseLimitExceededSubject = "[Alert] Too many abuse reports received against your album on ente" + AbuseLimitExceededSubject = "[Alert] Too many abuse reports received against your album on Ente" AbuseAlertTemplate = "report_alert.html" diff --git a/server/pkg/controller/user/user.go b/server/pkg/controller/user/user.go index ddd6cf2dec..c81ff73c8a 100644 --- a/server/pkg/controller/user/user.go +++ b/server/pkg/controller/user/user.go @@ -93,7 +93,7 @@ const ( // their account. AccountDeletedEmailTemplate = "account_deleted.html" AccountDeletedWithActiveSubscriptionEmailTemplate = "account_deleted_active_sub.html" - AccountDeletedEmailSubject = "Your ente account has been deleted" + AccountDeletedEmailSubject = "Your Ente account has been deleted" ) func NewUserController( From 6adbf176303ec90dd21eb12924be4334d38639eb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 14:52:09 +0200 Subject: [PATCH 0536/1179] [mob][photos] Only download models on wifi --- .../machine_learning/ml_computer.dart | 9 ++++--- .../services/machine_learning/ml_model.dart | 25 ++++++++++++++++--- .../services/machine_learning/ml_service.dart | 7 ++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index ed9cc719d4..afbd511c62 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -158,8 +158,8 @@ class MLComputer { } Future> runClipText(String query) async { - await _ensureLoadedClipTextModel(); try { + await _ensureLoadedClipTextModel(); final int clipAddress = ClipTextEncoder.instance.sessionAddress; final textEmbedding = await _runInIsolate( ( @@ -195,9 +195,10 @@ class MLComputer { // Load ClipText model final String modelName = ClipTextEncoder.instance.modelName; - final String modelRemotePath = ClipTextEncoder.instance.modelRemotePath; - final String modelPath = - await RemoteAssetsService.instance.getAssetPath(modelRemotePath); + final String? modelPath = await ClipTextEncoder.instance.downloadModelSafe(); + if (modelPath == null) { + throw Exception("Could not download clip text model, no wifi"); + } final address = await _runInIsolate( ( MLComputerOperation.loadModel, diff --git a/mobile/lib/services/machine_learning/ml_model.dart b/mobile/lib/services/machine_learning/ml_model.dart index daad0ad61a..a3a05e5f14 100644 --- a/mobile/lib/services/machine_learning/ml_model.dart +++ b/mobile/lib/services/machine_learning/ml_model.dart @@ -5,6 +5,7 @@ import "package:onnx_dart/onnx_dart.dart"; import "package:onnxruntime/onnxruntime.dart"; import "package:photos/services/machine_learning/onnx_env.dart"; import "package:photos/services/remote_assets_service.dart"; +import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; abstract class MlModel { @@ -32,6 +33,7 @@ abstract class MlModel { bool _isNativePluginInitialized = false; int _nativePluginSessionIndex = -1; + /// WARNING: If [downloadModel] was not first called, this method will download the model first using high bandwidth. Future<(String, String)> getModelNameAndPath() async { return _downloadModelLock.synchronized(() async { final path = @@ -40,12 +42,29 @@ abstract class MlModel { }); } - Future downloadModel([bool forceRefresh = false]) async { + Future downloadModelSafe() async { + if (await RemoteAssetsService.instance.hasAsset(modelRemotePath)) { + return await RemoteAssetsService.instance.getAssetPath(modelRemotePath); + } else { + if (await canUseHighBandwidth()) { + return await downloadModel(); + } else { + logger.warning( + 'Cannot return model path as it is not available locally and high bandwidth is not available.', + ); + return null; + } + } + } + + Future downloadModel([bool forceRefresh = false]) async { return _downloadModelLock.synchronized(() async { if (forceRefresh) { - await RemoteAssetsService.instance.getAssetIfUpdated(modelRemotePath); + final file = await RemoteAssetsService.instance + .getAssetIfUpdated(modelRemotePath); + return file!.path; } else { - await RemoteAssetsService.instance.getAsset(modelRemotePath); + return await RemoteAssetsService.instance.getAssetPath(modelRemotePath); } }); } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 7fb523a917..d37e358dd8 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -171,6 +171,8 @@ class MLService { 'stopping indexing because user is not connected to wifi', ); break; + } else { + await _ensureDownloadedModels(); } final futures = >[]; for (final instruction in chunk) { @@ -500,6 +502,11 @@ class MLService { _logger.finest("Models already downloaded"); return; } + final goodInternet = await canUseHighBandwidth(); + if (!goodInternet) { + _logger.info("Cannot download models because user is not connected to wifi"); + return; + } _logger.info('Downloading models'); await Future.wait([ FaceDetectionService.instance.downloadModel(forceRefresh), From 51cf793012027b6dbb4edff7f7c75b4c68d3dd1d Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 14:52:47 +0200 Subject: [PATCH 0537/1179] [mob][photos] Remove unneeded beta check --- mobile/lib/ui/settings_page.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mobile/lib/ui/settings_page.dart b/mobile/lib/ui/settings_page.dart index e002ad8463..de3882cfae 100644 --- a/mobile/lib/ui/settings_page.dart +++ b/mobile/lib/ui/settings_page.dart @@ -144,9 +144,7 @@ class SettingsPage extends StatelessWidget { if (hasLoggedIn && flagService.internalUser) { contents.addAll([sectionSpacing, const DebugSectionWidget()]); - if (flagService.isBetaUser) { - contents.addAll([sectionSpacing, const MLDebugSectionWidget()]); - } + contents.addAll([sectionSpacing, const MLDebugSectionWidget()]); } contents.add(const AppVersionWidget()); contents.add(const DeveloperSettingsWidget()); From 3e3795444a4aac3bd3cd174dc379fa1f0e39715a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 22 Aug 2024 18:17:02 +0530 Subject: [PATCH 0538/1179] [docs] Troubleshooting photo dates from GT --- docs/docs/.vitepress/sidebar.ts | 4 ++ docs/docs/photos/faq/photo-dates.md | 53 +++++++++++++++++++ .../migration/from-google-photos/index.md | 6 +-- 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 docs/docs/photos/faq/photo-dates.md diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 7a475250a2..6aff8e3319 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -125,6 +125,10 @@ export const sidebar = [ text: "Hide vs archive", link: "/photos/faq/hidden-and-archive", }, + { + text: "Photo dates", + link: "/photos/faq/photo-dates", + }, ], }, { diff --git a/docs/docs/photos/faq/photo-dates.md b/docs/docs/photos/faq/photo-dates.md new file mode 100644 index 0000000000..b29938d282 --- /dev/null +++ b/docs/docs/photos/faq/photo-dates.md @@ -0,0 +1,53 @@ +--- +title: Photo dates +description: Ensuring correct metadata and dates in Ente Photos +--- + +# Photos dates + +Ente will import the date for your photos from three places: + +1. Exif +2. Metadata JSON +3. File name + +## Exif + +Normally, Ente app tries to read the date of the photo from the Exif and other +metadata (e.g. XMP, IPTC) embedded in the file. + +> [!TIP] +> +> You can see all of the Exif metadata embedded within a photo by using the +> "View all Exif data" option in the info panel for the photo in Ente. + +## Importing from Google Takeout + +In case of photos exported from Google Photos, the metadata is not embedded +within the file itself, but is instead present in a separate sidecar ".json" +file. Ente knows how to read these files, and in such cases can pick up the +metadata from them. + +When you export your data using a Google Takeout, Google provides you both your +photos and their associated metadata JSON files. However, for incomprehensible +reasons, they split the JSON and photo across zip files. That is, in some cases +if you have a file named `flower.jpeg`, which has an associated metadata JSON +file named `flower.json`, Google will put the `.jpeg` and the `.json` in +separate Takeout zips, and Ente will be unable to correlate them. + +To avoid such issues, **we [recommend](/photos/migration/from-google-photos/) +unzipping all of your Google takeout zips into a single folder, and then +importing that folder into Ente**. This way, we will be able to always correctly +map, for example, `flower.jpeg` and `flower.json` and show the same date for +`flower.jpeg` that you would've seen within Google Photos. + +## Screenshots + +In case the photo does not have a date in the Exif data (and it is not a Google +Takeout), for example, for screenshots or Whatsapp forwards, Ente will still try +and deduce the correct date for the file from the name of the file. + +> [!NOTE] +> +> This process works great most of the time, but it is inherently based on +> heuristics and is not exact. diff --git a/docs/docs/photos/migration/from-google-photos/index.md b/docs/docs/photos/migration/from-google-photos/index.md index 80973e9268..e334ca5f88 100644 --- a/docs/docs/photos/migration/from-google-photos/index.md +++ b/docs/docs/photos/migration/from-google-photos/index.md @@ -40,9 +40,9 @@ it with Ente. 9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload", select "Google takeout" and pick the ZIP file you just downloaded. - -> If you were provided with multiple ZIP files, please extract **all** the -> files into one folder and select that folder instead. + +> If you were provided with multiple ZIP files, please extract **all** the files +> into one folder and select that folder instead. ![Importing Google Takeout into Ente](google-takeout.png){width=400px} From 06f6c5c318a74a9d2431343b1a05bb0cf5dada59 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 22 Aug 2024 18:31:07 +0530 Subject: [PATCH 0539/1179] Casing --- docs/docs/photos/faq/photo-dates.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/photos/faq/photo-dates.md b/docs/docs/photos/faq/photo-dates.md index b29938d282..506f24f566 100644 --- a/docs/docs/photos/faq/photo-dates.md +++ b/docs/docs/photos/faq/photo-dates.md @@ -21,19 +21,19 @@ metadata (e.g. XMP, IPTC) embedded in the file. > You can see all of the Exif metadata embedded within a photo by using the > "View all Exif data" option in the info panel for the photo in Ente. -## Importing from Google Takeout +## Importing from Google takeout In case of photos exported from Google Photos, the metadata is not embedded within the file itself, but is instead present in a separate sidecar ".json" file. Ente knows how to read these files, and in such cases can pick up the metadata from them. -When you export your data using a Google Takeout, Google provides you both your +When you export your data using a Google takeout, Google provides you both your photos and their associated metadata JSON files. However, for incomprehensible reasons, they split the JSON and photo across zip files. That is, in some cases if you have a file named `flower.jpeg`, which has an associated metadata JSON file named `flower.json`, Google will put the `.jpeg` and the `.json` in -separate Takeout zips, and Ente will be unable to correlate them. +separate takeout zips, and Ente will be unable to correlate them. To avoid such issues, **we [recommend](/photos/migration/from-google-photos/) unzipping all of your Google takeout zips into a single folder, and then @@ -44,7 +44,7 @@ map, for example, `flower.jpeg` and `flower.json` and show the same date for ## Screenshots In case the photo does not have a date in the Exif data (and it is not a Google -Takeout), for example, for screenshots or Whatsapp forwards, Ente will still try +takeout), for example, for screenshots or Whatsapp forwards, Ente will still try and deduce the correct date for the file from the name of the file. > [!NOTE] From b96185df635121f3bc14dfb05ed348900fd4c506 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 22 Aug 2024 18:43:14 +0530 Subject: [PATCH 0540/1179] [mob][photos] Change elevation colors of app --- mobile/lib/theme/colors.dart | 4 ++-- mobile/lib/ui/home/home_app_bar_widget.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/theme/colors.dart b/mobile/lib/theme/colors.dart index be8ed8e7e4..f46e4e6fbf 100644 --- a/mobile/lib/theme/colors.dart +++ b/mobile/lib/theme/colors.dart @@ -163,8 +163,8 @@ const Color backgroundElevatedLight = Color.fromRGBO(255, 255, 255, 1); const Color backgroundElevated2Light = Color.fromRGBO(251, 251, 251, 1); const Color backgroundBaseDark = Color.fromRGBO(0, 0, 0, 1); -const Color backgroundElevatedDark = Color.fromRGBO(27, 27, 27, 1); -const Color backgroundElevated2Dark = Color.fromRGBO(37, 37, 37, 1); +const Color backgroundElevatedDark = Color.fromRGBO(9, 9, 9, 1); +const Color backgroundElevated2Dark = Color.fromRGBO(18, 18, 18, 1); // Backdrop Colors const Color backdropBaseLight = Color.fromRGBO(255, 255, 255, 0.92); diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index 60b512b7ea..31ed26db2f 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -78,7 +78,7 @@ class _HomeAppBarWidgetState extends State { AppBar build(BuildContext context) { final colorScheme = getEnteColorScheme(context); return AppBar( - backgroundColor: colorScheme.backgroundBase, + backgroundColor: colorScheme.backgroundElevated, elevation: 4, surfaceTintColor: Colors.transparent, shadowColor: Colors.black.withOpacity(0.2), From eaf136d34f0e81edd5dd5f0691b865acb513615e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 15:37:03 +0200 Subject: [PATCH 0541/1179] [mob][photos] notify user if model download is paused --- .../services/machine_learning/ml_service.dart | 11 +++++- .../machine_learning_settings_page.dart | 37 +++++++++++++------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index d37e358dd8..ebe56b893e 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -493,6 +493,13 @@ class MLService { } } + void triggerModelsDownload() { + if (!areModelsDownloaded && !_downloadModelLock.locked) { + _logger.info("Models not downloaded, starting download"); + unawaited(_ensureDownloadedModels()); + } + } + Future _ensureDownloadedModels([bool forceRefresh = false]) async { if (_downloadModelLock.locked) { _logger.finest("Download models already in progress"); @@ -504,7 +511,9 @@ class MLService { } final goodInternet = await canUseHighBandwidth(); if (!goodInternet) { - _logger.info("Cannot download models because user is not connected to wifi"); + _logger.info( + "Cannot download models because user is not connected to wifi", + ); return; } _logger.info('Downloading models'); diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index dbd96e8a43..a98fac2c6d 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -27,6 +27,7 @@ import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; import "package:photos/ui/settings/ml/enable_ml_consent.dart"; import "package:photos/utils/ml_util.dart"; +import "package:photos/utils/network_util.dart"; import "package:photos/utils/wakelock_util.dart"; class MachineLearningSettingsPage extends StatefulWidget { @@ -257,6 +258,8 @@ class ModelLoadingState extends StatefulWidget { class _ModelLoadingStateState extends State { StreamSubscription<(String, int, int)>? _progressStream; final Map _progressMap = {}; + Timer? _timer; + @override void initState() { _progressStream = @@ -277,6 +280,9 @@ class _ModelLoadingStateState extends State { setState(() {}); } }); + _timer = Timer.periodic(const Duration(seconds: 10), (timer) { + setState(() {}); + }); super.initState(); } @@ -284,6 +290,7 @@ class _ModelLoadingStateState extends State { void dispose() { super.dispose(); _progressStream?.cancel(); + _timer?.cancel(); } @override @@ -292,8 +299,25 @@ class _ModelLoadingStateState extends State { children: [ MenuSectionTitle(title: S.of(context).status), MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: _getTitle(context), + captionedTextWidget: FutureBuilder( + future: canUseHighBandwidth(), + builder: (context, snapshot) { + if (snapshot.hasData) { + if (snapshot.data!) { + MLService.instance.triggerModelsDownload(); + return CaptionedTextWidget( + title: S.of(context).loadingModel, + key: const ValueKey("loading_model"), + ); + } else { + return CaptionedTextWidget( + title: S.of(context).waitingForWifi, + key: const ValueKey("waiting_for_wifi"), + ); + } + } + return const CaptionedTextWidget(title: ""); + }, ), trailingWidget: EnteLoadingWidget( size: 12, @@ -322,15 +346,6 @@ class _ModelLoadingStateState extends State { ], ); } - - String _getTitle(BuildContext context) { - // TODO: uncomment code below to actually check for high bandwidth - // final usableConnection = await canUseHighBandwidth(); - // if (!usableConnection) { - // return S.of(context).waitingForWifi; - // } - return S.of(context).loadingModel; - } } class MLStatusWidget extends StatefulWidget { From 1d50cdeeca5a64421ca243dfa8c39db1c0b2a86c Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 16:18:16 +0200 Subject: [PATCH 0542/1179] [mob][photos] Fix ml not stopping on interaction --- mobile/lib/services/machine_learning/ml_service.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index ebe56b893e..36a550098b 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -165,12 +165,13 @@ class MLService { int fileAnalyzedCount = 0; final Stopwatch stopwatch = Stopwatch()..start(); + stream: await for (final chunk in instructionStream) { if (!await canUseHighBandwidth()) { _logger.info( 'stopping indexing because user is not connected to wifi', ); - break; + break stream; } else { await _ensureDownloadedModels(); } @@ -178,7 +179,7 @@ class MLService { for (final instruction in chunk) { if (_shouldPauseIndexingAndClustering) { _logger.info("indexAllImages() was paused, stopping"); - break; + break stream; } await _ensureLoadedModels(instruction); futures.add(processImage(instruction)); From 5eb153a3106923c9cecd4b40974f7f5f4802d56f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 16:23:14 +0200 Subject: [PATCH 0543/1179] [mob][photos] Prevent double ML sessions in debug iOS --- mobile/lib/services/machine_learning/ml_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 36a550098b..10ee47198e 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -551,7 +551,7 @@ class MLService { } bool _cannotRunMLFunction({String function = ""}) { - if (kDebugMode && Platform.isIOS) { + if (kDebugMode && Platform.isIOS && !_isIndexingOrClusteringRunning) { return false; } if (_isIndexingOrClusteringRunning) { From bb6ac34920a919020d95fc4591c41805fb9c1a6e Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Thu, 22 Aug 2024 16:37:09 +0200 Subject: [PATCH 0544/1179] [mob][photos] Keep triggering ML on ML settings page --- mobile/lib/services/machine_learning/ml_service.dart | 10 ++++++++++ .../ui/settings/machine_learning_settings_page.dart | 1 + 2 files changed, 11 insertions(+) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 10ee47198e..9321c3f96a 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -55,6 +55,7 @@ class MLService { bool _showClusteringIsHappening = false; bool _mlControllerStatus = false; bool _isIndexingOrClusteringRunning = false; + bool _isRunningML = false; bool _shouldPauseIndexingAndClustering = false; static const int _fileDownloadLimit = 10; @@ -118,6 +119,7 @@ class MLService { _mlControllerStatus = true; } if (_cannotRunMLFunction() && !force) return; + _isRunningML = true; await sync(); @@ -134,6 +136,14 @@ class MLService { } catch (e, s) { _logger.severe("runAllML failed", e, s); rethrow; + } finally { + _isRunningML = false; + } + } + + void triggerML() { + if (_mlControllerStatus && !_isIndexingOrClusteringRunning && !_isRunningML) { + unawaited(runAllML()); } } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index a98fac2c6d..040126aec3 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -363,6 +363,7 @@ class MLStatusWidgetState extends State { void initState() { super.initState(); _timer = Timer.periodic(const Duration(seconds: 10), (timer) { + MLService.instance.triggerML(); setState(() {}); }); } From 7ddee7d75e0ad53a42153609f4634619e99bd406 Mon Sep 17 00:00:00 2001 From: Shamshid Date: Fri, 23 Aug 2024 03:13:07 +0400 Subject: [PATCH 0545/1179] [Auth] Add HuggingFace icon (#2827) --- auth/assets/custom-icons/_data/custom-icons.json | 7 +++++++ auth/assets/custom-icons/icons/huggingface.svg | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 auth/assets/custom-icons/icons/huggingface.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 46f02a4915..59fbafe734 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -235,6 +235,13 @@ { "title": "HTX" }, + { + "title": "HuggingFace", + "altNames": [ + "Hugging Face" + ], + "slug": "huggingface" + }, { "title": "IceDrive", "slug": "Icedrive" diff --git a/auth/assets/custom-icons/icons/huggingface.svg b/auth/assets/custom-icons/icons/huggingface.svg new file mode 100644 index 0000000000..c377084d61 --- /dev/null +++ b/auth/assets/custom-icons/icons/huggingface.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file From f0bf07a384fc06e6b2e89aac75d83467090ad606 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 09:51:57 +0530 Subject: [PATCH 0546/1179] Move variant into custom component --- web/apps/photos/src/components/WatchFolder.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/components/WatchFolder.tsx b/web/apps/photos/src/components/WatchFolder.tsx index e95b86eb33..60bd050048 100644 --- a/web/apps/photos/src/components/WatchFolder.tsx +++ b/web/apps/photos/src/components/WatchFolder.tsx @@ -273,7 +273,7 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { )} - {watch.folderPath} + {watch.folderPath} @@ -306,7 +306,11 @@ const EntryHeading: React.FC = ({ watch }) => { ); }; -const FolderPath = styled(Typography)(({ theme }) => ({ +const FolderPath: React.FC = ({ children }) => ( + {children} +); + +const FolderPath_ = styled(Typography)(({ theme }) => ({ overflow: "hidden", textOverflow: "ellipsis", color: theme.colors.text.muted, From 385655365d85e1824674429d315ebd22d1d8ad41 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:06:17 +0530 Subject: [PATCH 0547/1179] [mob] Fix android build --- mobile/android/app/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index ad09d00b94..8cbcb017a7 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -35,6 +35,12 @@ android { main.java.srcDirs += 'src/main/kotlin' } + packagingOptions { + pickFirst 'lib/arm64-v8a/libonnxruntime.so' + pickFirst 'lib/armeabi-v7a/libonnxruntime.so' + + } + lintOptions { disable 'InvalidPackage' warningsAsErrors false From 489dc2e46dc22aefc118c650aee6814664f010c5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 10:32:20 +0530 Subject: [PATCH 0548/1179] Extract --- .../photos/src/components/Notification.tsx | 14 +++---------- web/packages/base/components/Typography.tsx | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 web/packages/base/components/Typography.tsx diff --git a/web/apps/photos/src/components/Notification.tsx b/web/apps/photos/src/components/Notification.tsx index 0ade15c750..76adb95a12 100644 --- a/web/apps/photos/src/components/Notification.tsx +++ b/web/apps/photos/src/components/Notification.tsx @@ -1,4 +1,7 @@ +import { EllipsizedTypography } from "@/base/components/Typography"; +import { IconButtonWithBG } from "@ente/shared/components/Container"; import CloseIcon from "@mui/icons-material/Close"; +import InfoIcon from "@mui/icons-material/InfoOutlined"; import { Box, Button, @@ -6,15 +9,10 @@ import { Stack, SxProps, Theme, - Typography, - styled, type ButtonProps, } from "@mui/material"; import { NotificationAttributes } from "types/Notification"; -import { IconButtonWithBG } from "@ente/shared/components/Container"; -import InfoIcon from "@mui/icons-material/InfoOutlined"; - interface Iprops { open: boolean; onClose: () => void; @@ -127,9 +125,3 @@ export default function Notification({ ); } - -const EllipsizedTypography = styled(Typography)` - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -`; diff --git a/web/packages/base/components/Typography.tsx b/web/packages/base/components/Typography.tsx new file mode 100644 index 0000000000..ba118157d3 --- /dev/null +++ b/web/packages/base/components/Typography.tsx @@ -0,0 +1,21 @@ +import { styled, Typography } from "@mui/material"; + +/** + * A variant of {@link Typography} that inserts ellipsis instead of wrapping the + * text over multiple lines, or letting it overflow. + * + * Refs: + * - https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_text/Wrapping_breaking_text + * - https://developer.mozilla.org/en-US/docs/Web/CSS/white-space + */ +export const EllipsizedTypography = styled(Typography)` + /* Initial value of overflow is visible. Set overflow (the handling of + content that is too small for the container in the inline direction) to + hidden instead. */ + overflow: hidden; + /* Specify handling of text when it overflows, asking the browser to insert + ellipsis instead of clipping. */ + text-overflow: ellipsis; + /* Don't automatically wrap the text by inserting line breaks. */ + white-space: nowrap; +`; From f3dae23e2a5738d9496f1ad8196a1a9b888e2265 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 10:36:53 +0530 Subject: [PATCH 0549/1179] Use --- .../photos/src/components/PhotoViewer/FileInfo/index.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx index 4827059278..a1c771a795 100644 --- a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx @@ -1,5 +1,6 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { Titlebar } from "@/base/components/Titlebar"; +import { EllipsizedTypography } from "@/base/components/Typography"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import type { ParsedMetadata } from "@/media/file-metadata"; @@ -609,16 +610,13 @@ const RawExif: React.FC = ({ {namespace} - {description} - + ))} From 6e13216c53f20d98f3bba375e831820925a7863b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:38:04 +0530 Subject: [PATCH 0550/1179] Revert "[mob] Fix android build (#2832)" This reverts commit 5735e050e23bb780648e5eec9a6ac6f60275d24d, reversing changes made to 7ddee7d75e0ad53a42153609f4634619e99bd406. --- mobile/android/app/build.gradle | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 8cbcb017a7..ad09d00b94 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -35,12 +35,6 @@ android { main.java.srcDirs += 'src/main/kotlin' } - packagingOptions { - pickFirst 'lib/arm64-v8a/libonnxruntime.so' - pickFirst 'lib/armeabi-v7a/libonnxruntime.so' - - } - lintOptions { disable 'InvalidPackage' warningsAsErrors false From 630770be568d2ec2d146cfd4b8d9a275bb01d363 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:40:06 +0530 Subject: [PATCH 0551/1179] Use old onnx package to unblock release --- mobile/pubspec.lock | 11 ++++++----- mobile/pubspec.yaml | 5 ++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 463a5ef926..cb234fe33a 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1666,11 +1666,12 @@ packages: onnxruntime: dependency: "direct main" description: - name: onnxruntime - sha256: e77ec05acafc135cc5fe7bcdf11b101b39f06513c9d5e9fa02cb1929f6bac72a - url: "https://pub.dev" - source: hosted - version: "1.4.1" + path: "." + ref: ente_onnxruntime + resolved-ref: fb9393e36013790938b5bc995a4dca15fed3c944 + url: "https://github.com/ente-io/onnxruntime.git" + source: git + version: "1.1.0" open_mail_app: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index e2ebeb72b9..837c8fd5f7 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -128,7 +128,10 @@ dependencies: native_video_player: ^1.3.1 onnx_dart: path: plugins/onnx_dart - onnxruntime: ^1.4.1 + onnxruntime: + git: + url: https://github.com/ente-io/onnxruntime.git + ref: ente_onnxruntime open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 From 270acf18968c2970ce9077843b9698b132a1d4f0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 10:40:30 +0530 Subject: [PATCH 0552/1179] [mob] Bump version v0.9.27 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 837c8fd5f7..3458c66b2f 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.26+926 +version: 0.9.27+927 publish_to: none environment: From 467dccf8bbdd20724e419a10a0d8e0a083ad1f1d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 10:43:52 +0530 Subject: [PATCH 0553/1179] Use --- web/apps/photos/src/components/WatchFolder.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/web/apps/photos/src/components/WatchFolder.tsx b/web/apps/photos/src/components/WatchFolder.tsx index 60bd050048..0214507eda 100644 --- a/web/apps/photos/src/components/WatchFolder.tsx +++ b/web/apps/photos/src/components/WatchFolder.tsx @@ -1,3 +1,4 @@ +import { EllipsizedTypography } from "@/base/components/Typography"; import { ensureElectron } from "@/base/electron"; import { basename, dirname } from "@/base/file"; import type { CollectionMapping, FolderWatch } from "@/base/types/ipc"; @@ -307,15 +308,11 @@ const EntryHeading: React.FC = ({ watch }) => { }; const FolderPath: React.FC = ({ children }) => ( - {children} + + {children} + ); -const FolderPath_ = styled(Typography)(({ theme }) => ({ - overflow: "hidden", - textOverflow: "ellipsis", - color: theme.colors.text.muted, -})); - interface EntryOptionsProps { confirmStopWatching: () => void; } From 9577ff7776662bbf0bdbf6c764ab8882f416f885 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 10:44:57 +0530 Subject: [PATCH 0554/1179] Remove unnecessary rep --- web/apps/photos/src/components/WatchFolder.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/apps/photos/src/components/WatchFolder.tsx b/web/apps/photos/src/components/WatchFolder.tsx index 0214507eda..66688266c6 100644 --- a/web/apps/photos/src/components/WatchFolder.tsx +++ b/web/apps/photos/src/components/WatchFolder.tsx @@ -260,7 +260,6 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { {watch.collectionMapping === "root" ? ( @@ -284,7 +283,6 @@ const WatchEntry: React.FC = ({ watch, removeWatch }) => { const EntryContainer = styled(Box)({ overflow: "hidden", - textOverflow: "ellipsis", marginLeft: "12px", marginRight: "6px", marginBottom: "12px", From 251716bad60fe5aac3f5fc5c6412983046479bec Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 11:58:55 +0530 Subject: [PATCH 0555/1179] [server] Return 400 on invalid RCPT address --- server/pkg/utils/email/email.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index a19987a1d8..f3ddbe67b1 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -8,6 +8,7 @@ package email import ( "bytes" "encoding/json" + "fmt" "html/template" "net/http" "net/smtp" @@ -91,6 +92,9 @@ func sendViaSMTP(toEmails []string, fromName string, fromEmail string, subject s auth := smtp.PlainAuth("", smtpUsername, smtpPassword, smtpServer) err := smtp.SendMail(smtpServer+":"+smtpPort, auth, fromEmail, []string{toEmail}, []byte(emailMessage)) if err != nil { + if strings.Contains(err.Error(), "Invalid RCPT TO address provided") { + return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid email %s", toEmail)), err.Error()) + } return stacktrace.Propagate(err, "") } } From c509bffaa3d8aee5b0b6f6abee9bdf469432ad36 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 13:21:32 +0530 Subject: [PATCH 0556/1179] Switch to libsodium-wrappers-sumo --- web/docs/dependencies.md | 22 +++++----------------- web/packages/base/crypto/index.ts | 4 +++- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/web/docs/dependencies.md b/web/docs/dependencies.md index efdbf617ce..7435d80367 100644 --- a/web/docs/dependencies.md +++ b/web/docs/dependencies.md @@ -48,25 +48,13 @@ The root `package.json` also has a convenience dev dependency: ## Cryptography -We use [libsodium](https://libsodium.gitbook.io/doc/) for encryption, key -generation etc. Specifically, we use its WebAssembly and JS wrappers made using -Emscripten, maintained by the original authors of libsodium themselves - +We use [libsodium](https://libsodium.gitbook.io/doc/) for our cryptography +primitives. Specifically, we use its WebAssembly target, accessible via +JavaScript wrappers maintained by the original authors of libsodium themselves - [libsodium-wrappers](https://github.com/jedisct1/libsodium.js). -Currently, we've pinned the version to 0.7.9 since later versions remove the -`crypto_pwhash_*` functionality that we use (they've not been deprecated, -they've just been moved to a different NPM package). From the (upstream) -[release notes](https://github.com/jedisct1/libsodium/releases/tag/1.0.19-RELEASE): - -> Emscripten: the `crypto_pwhash_*()` functions have been removed from Sumo -> builds, as they reserve a substantial amount of JavaScript memory, even when -> not used. - -This wording is a bit incorrect, they've actually been _added_ to the sumo -builds (See this [issue](https://github.com/jedisct1/libsodium.js/issues/326)). - -Updating it is not a big problem, it is just a pending chore - we want to test a -bit more exhaustively when changing the crypto layer. +We need to use the "sumo" variant, _libsodium-wrappers-sumo_, to get access to +the `crypto_pwhash_*()` functions. ## Meta frameworks diff --git a/web/packages/base/crypto/index.ts b/web/packages/base/crypto/index.ts index 386d1ac7da..c2cf7bc005 100644 --- a/web/packages/base/crypto/index.ts +++ b/web/packages/base/crypto/index.ts @@ -8,7 +8,9 @@ * 3. libsodium-wrappers (JavaScript bindings to libsodium) * * Our cryptography primitives are provided by libsodium, specifically, its - * JavaScript bindings ("libsodium-wrappers"). This is the lowest layer. + * JavaScript bindings ("libsodium-wrappers"). This is the lowest layer. Note + * that we use the sumo variant, "libsodium-wrappers-sumo", since the standard + * variant does not provide the `crypto_pwhash_*` functions. * * Direct usage of "libsodium-wrappers" is restricted to `crypto/libsodium.ts`. * This is the next higher layer. Usually the functions in this file are thin From a328189891ff5cad9b9a5639d2c663ffcd572fa4 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 10:35:26 +0200 Subject: [PATCH 0557/1179] [mob][photos] Use bilinear interpolation for clip --- mobile/lib/utils/image_ml_util.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 843f535343..6e44f1430f 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -231,7 +231,7 @@ Future preprocessImageClip( const int blueOff = 2 * requiredHeight * requiredWidth; for (var h = 0 + heightOffset; h < scaledHeight - heightOffset; h++) { for (var w = 0 + widthOffset; w < scaledWidth - widthOffset; w++) { - final Color pixel = _getPixelBicubic( + final Color pixel = _getPixelBilinear( w / scale, h / scale, image, From d788ca28afa2cf90c35020a294e2ad3e4c4c88fa Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 14:35:19 +0530 Subject: [PATCH 0558/1179] Update --- web/package.json | 3 --- web/packages/base/package.json | 2 ++ web/packages/utils/package.json | 4 +--- web/yarn.lock | 35 ++++++++++++++++++++------------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/web/package.json b/web/package.json index 09009c14c1..1e8b777ad9 100644 --- a/web/package.json +++ b/web/package.json @@ -32,9 +32,6 @@ "preview:photos": "yarn build:photos && python3 -m http.server -d apps/photos/out 3000", "preview:staff": "yarn workspace staff preview" }, - "resolutions": { - "libsodium": "0.7.9" - }, "devDependencies": { "concurrently": "^8.2.2", "eslint": "^8", diff --git a/web/packages/base/package.json b/web/packages/base/package.json index 36bcf203f9..f268461396 100644 --- a/web/packages/base/package.json +++ b/web/packages/base/package.json @@ -12,6 +12,7 @@ "i18next": "^23.11", "i18next-resources-to-backend": "^1.2", "is-electron": "^2.2", + "libsodium-wrappers-sumo": "^0.7.15", "nanoid": "^5.0.7", "next": "^14.2", "react": "^18", @@ -20,6 +21,7 @@ }, "devDependencies": { "@/build-config": "*", + "@types/libsodium-wrappers-sumo": "^0.7.8", "@types/react": "^18", "@types/react-dom": "^18" } diff --git a/web/packages/utils/package.json b/web/packages/utils/package.json index 930e3aa44f..9ea448666e 100644 --- a/web/packages/utils/package.json +++ b/web/packages/utils/package.json @@ -3,11 +3,9 @@ "version": "0.0.0", "private": true, "dependencies": { - "libsodium-wrappers": "0.7.9", "yup": "^1.4" }, "devDependencies": { - "@/build-config": "*", - "@types/libsodium-wrappers": "0.7.9" + "@/build-config": "*" } } diff --git a/web/yarn.lock b/web/yarn.lock index 90cbd1d0b5..7a06b6f53d 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1063,10 +1063,17 @@ dependencies: "@types/geojson" "*" -"@types/libsodium-wrappers@0.7.9": - version "0.7.9" - resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#89c3ad2156d5143e64bce86cfeb0045a983aeccc" - integrity sha512-LisgKLlYQk19baQwjkBZZXdJL0KbeTpdEnrAfz5hQACbklCY0gVFnsKUyjfNWF1UQsCSjw93Sj5jSbiO8RPfdw== +"@types/libsodium-wrappers-sumo@^0.7.8": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.8.tgz#33e32b454fb6b340758c9ffdb1f9657e1be058ff" + integrity sha512-N2+df4MB/A+W0RAcTw7A5oxKgzD+Vh6Ye7lfjWIi5SdTzVLfHPzxUjhwPqHLO5Ev9fv/+VHl+sUaUuTg4fUPqw== + dependencies: + "@types/libsodium-wrappers" "*" + +"@types/libsodium-wrappers@*": + version "0.7.14" + resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.14.tgz#f688f8d44e46ed61c401f82ff757581655fbcc42" + integrity sha512-5Kv68fXuXK0iDuUir1WPGw2R9fOZUlYlSAa0ztMcL0s0BfIDTqg9GXz8K30VJpPP3sxWhbolnQma2x+/TfkzDQ== "@types/node@*": version "20.11.20" @@ -3367,17 +3374,17 @@ libheif-js@^1.17.1: resolved "https://registry.yarnpkg.com/libheif-js/-/libheif-js-1.17.1.tgz#7772cc5a31098df0354f0fadb49a939030765acd" integrity sha512-g9wBm/CasGZMjmH3B2sD9+AO7Y5+79F0oPS+sdAulSxQeYeCeiTIP+lDqvlPofD+y76wvfVtotKZ8AuvZQnWgg== -libsodium-wrappers@0.7.9: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" - integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== - dependencies: - libsodium "^0.7.0" +libsodium-sumo@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz#91c1d863fe3fbce6d6b9db1aadaa622733a1d007" + integrity sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw== -libsodium@0.7.9, libsodium@^0.7.0: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" - integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== +libsodium-wrappers-sumo@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz#0ef2a99b4b17e8385aa7e6850593660dbaf5fb40" + integrity sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA== + dependencies: + libsodium-sumo "^0.7.15" lie@3.1.1: version "3.1.1" From 46f53494df442e290e696300c88ab6246d154661 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 14:39:05 +0530 Subject: [PATCH 0559/1179] Update --- web/docs/dependencies.md | 8 ++++---- web/packages/base/crypto/libsodium.ts | 2 +- web/packages/base/crypto/worker.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/docs/dependencies.md b/web/docs/dependencies.md index 7435d80367..84275c11fc 100644 --- a/web/docs/dependencies.md +++ b/web/docs/dependencies.md @@ -49,12 +49,12 @@ The root `package.json` also has a convenience dev dependency: ## Cryptography We use [libsodium](https://libsodium.gitbook.io/doc/) for our cryptography -primitives. Specifically, we use its WebAssembly target, accessible via -JavaScript wrappers maintained by the original authors of libsodium themselves - +primitives. We use its WebAssembly target, accessible via JavaScript wrappers +maintained by the original authors of libsodium themselves - [libsodium-wrappers](https://github.com/jedisct1/libsodium.js). -We need to use the "sumo" variant, _libsodium-wrappers-sumo_, to get access to -the `crypto_pwhash_*()` functions. +More precisely, we use the sumo variant, "libsodium-wrappers-sumo", since the +standard variant does not provide the `crypto_pwhash_*` functions. ## Meta frameworks diff --git a/web/packages/base/crypto/libsodium.ts b/web/packages/base/crypto/libsodium.ts index 1efcda7676..cd91633c17 100644 --- a/web/packages/base/crypto/libsodium.ts +++ b/web/packages/base/crypto/libsodium.ts @@ -10,7 +10,7 @@ */ import { mergeUint8Arrays } from "@/utils/array"; import { CustomError } from "@ente/shared/error"; -import sodium, { type StateAddress } from "libsodium-wrappers"; +import sodium, { type StateAddress } from "libsodium-wrappers-sumo"; import type { BytesOrB64, EncryptedBlob, diff --git a/web/packages/base/crypto/worker.ts b/web/packages/base/crypto/worker.ts index 82f2d47624..b348d6a299 100644 --- a/web/packages/base/crypto/worker.ts +++ b/web/packages/base/crypto/worker.ts @@ -1,5 +1,5 @@ import { expose } from "comlink"; -import type { StateAddress } from "libsodium-wrappers"; +import type { StateAddress } from "libsodium-wrappers-sumo"; import * as ei from "./ente-impl"; import * as libsodium from "./libsodium"; From f0c546bc3ba4463ca3deea08f123880dead1babc Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 12:01:35 +0200 Subject: [PATCH 0560/1179] [mob][photos] clip bilinear --- mobile/lib/utils/image_ml_util.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 843f535343..6e44f1430f 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -231,7 +231,7 @@ Future preprocessImageClip( const int blueOff = 2 * requiredHeight * requiredWidth; for (var h = 0 + heightOffset; h < scaledHeight - heightOffset; h++) { for (var w = 0 + widthOffset; w < scaledWidth - widthOffset; w++) { - final Color pixel = _getPixelBicubic( + final Color pixel = _getPixelBilinear( w / scale, h / scale, image, From 5a226502c15ffaf9e890a5be3111fe10bd6c2625 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 15:37:38 +0530 Subject: [PATCH 0561/1179] Update Electron 30.2.0 => 30.4.0 Routine update, no changes that impact us noticed in the changelog https://github.com/electron/electron/releases --- desktop/package.json | 2 +- desktop/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 7dc13d845f..77fdd3fe3e 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -47,7 +47,7 @@ "@types/ffmpeg-static": "^3.0", "concurrently": "^8", "cross-env": "^7.0.3", - "electron": "^30", + "electron": "^30.4.0", "electron-builder": "25.0.0-alpha.8", "eslint": "^9", "prettier": "^3", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index afbe850a91..03754f1a30 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -1319,10 +1319,10 @@ electron-updater@^6.2: semver "^7.3.8" tiny-typed-emitter "^2.1.0" -electron@^30: - version "30.2.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-30.2.0.tgz#a309deba0289d24c3059fa349729f1eab7a7b720" - integrity sha512-x4/pUsOyWReAAo3/ZfvL7AvNbfS5dE8HqMC1mjFM/mL847KE/LpRFfOe5DjKqI2OQMTNvSth1mH0LJageHB0Zg== +electron@^30.4.0: + version "30.4.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.4.0.tgz#66641a644059147f0e597e49999599e23dcdbfe3" + integrity sha512-ric3KLPQ9anXYjtTDkj5NbEcXZqRUwqxrxTviIjLdMdHqd5O+hkSHEzXgbSJUOt+7uw+zZuybn9+IM9y7iEpqg== dependencies: "@electron/get" "^2.0.0" "@types/node" "^20.9.0" From 974311585170446d6a67627021ee5cbec67d2f93 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 15:41:26 +0530 Subject: [PATCH 0562/1179] Update ONNX runtime 0.18 => 0.19 https://github.com/microsoft/onnxruntime/releases --- desktop/package.json | 2 +- desktop/yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 77fdd3fe3e..3d77dc5bbd 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -37,7 +37,7 @@ "lru-cache": "^11", "next-electron-server": "^1", "node-stream-zip": "^1.15", - "onnxruntime-node": "^1.18" + "onnxruntime-node": "^1.19.0" }, "devDependencies": { "@eslint/js": "^9", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 03754f1a30..713e69aac5 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -2591,17 +2591,17 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onnxruntime-common@1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz#b904dc6ff134e7f21a3eab702fac17538f59e116" - integrity sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q== +onnxruntime-common@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.19.0.tgz#1d913321caa5eda76775c496d9f0f831dd30bec6" + integrity sha512-Oo16UIJ/xLOtZDVGcL4bL8EP8MiNFztyBmR3pB14D+cl/UCpOgHHzEk0MADSmYXQ0FgyEegPXtOFcJqhq1YRsw== -onnxruntime-node@^1.18: - version "1.18.0" - resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz#ad3947365ca038ec3a16fa4c48972708ccd294e9" - integrity sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww== +onnxruntime-node@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.19.0.tgz#7ce538eb400cf2370023e7f07f7e7a4d7589cc1f" + integrity sha512-JivYcrZ9H9YPpHnP+5rTVTJjzuD+ZB0TsB0//e2La0ViYNG0hmTvnwFgmRoes6F7E1PyVMpyRftmcl9pnIWsnw== dependencies: - onnxruntime-common "1.18.0" + onnxruntime-common "1.19.0" tar "^7.0.1" optionator@^0.9.3: From 8118f980f652874fc7694c7d195acf5c8a07943a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 15:49:00 +0530 Subject: [PATCH 0563/1179] List out in full and patch updates Going forward, we'll use npx npm-check-updates to update the package.json so the full version numbers are desirable. --- desktop/package.json | 36 ++++++++++---------- desktop/yarn.lock | 78 ++++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 3d77dc5bbd..7094e2a5d6 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -24,37 +24,37 @@ "jackspeak": "2.1.1" }, "dependencies": { - "any-shell-escape": "^0.1", - "auto-launch": "^5.0", - "chokidar": "^3.6", + "any-shell-escape": "^0.1.1", + "auto-launch": "^5.0.6", + "chokidar": "^3.6.0", "clip-bpe-js": "^0.0.6", "comlink": "^4.4.1", - "compare-versions": "^6.1", - "electron-log": "^5.1", - "electron-store": "^8.2", + "compare-versions": "^6.1.1", + "electron-log": "^5.1.7", + "electron-store": "^8.2.0", "electron-updater": "^6.2", - "ffmpeg-static": "^5.2", - "lru-cache": "^11", - "next-electron-server": "^1", - "node-stream-zip": "^1.15", + "ffmpeg-static": "^5.2.0", + "lru-cache": "^11.0.0", + "next-electron-server": "^1.0.0", + "node-stream-zip": "^1.15.0", "onnxruntime-node": "^1.19.0" }, "devDependencies": { "@eslint/js": "^9", "@tsconfig/node20": "^20.1.4", - "@types/auto-launch": "^5.0", + "@types/auto-launch": "^5.0.5", "@types/eslint__js": "^8.42.3", - "@types/ffmpeg-static": "^3.0", - "concurrently": "^8", + "@types/ffmpeg-static": "^3.0.3", + "concurrently": "^8.2.2", "cross-env": "^7.0.3", "electron": "^30.4.0", "electron-builder": "25.0.0-alpha.8", "eslint": "^9", - "prettier": "^3", - "prettier-plugin-organize-imports": "^4", - "prettier-plugin-packagejson": "^2", - "shx": "^0.3", - "typescript": "^5", + "prettier": "^3.3.3", + "prettier-plugin-organize-imports": "^4.0.0", + "prettier-plugin-packagejson": "^2.5.1", + "shx": "^0.3.4", + "typescript": "^5.5.4", "typescript-eslint": "^8.0.0-alpha.41" }, "packageManager": "yarn@1.22.22", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 713e69aac5..8b248774b5 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -264,7 +264,7 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.4.tgz#3457d42eddf12d3bde3976186ab0cd22b85df928" integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg== -"@types/auto-launch@^5.0": +"@types/auto-launch@^5.0.5": version "5.0.5" resolved "https://registry.yarnpkg.com/@types/auto-launch/-/auto-launch-5.0.5.tgz#439ed36aaaea501e2e2cfbddd8a20c366c34863b" integrity sha512-/nGvQZSzM/pvCMCh4Gt2kIeiUmOP/cKGJbjlInI+A+5MoV/7XmT56DJ6EU8bqc3+ItxEe4UC2GVspmPzcCc8cg== @@ -306,7 +306,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/ffmpeg-static@^3.0": +"@types/ffmpeg-static@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/ffmpeg-static/-/ffmpeg-static-3.0.3.tgz#605358ac6304507a75c2fd5fd861534837b19e2f" integrity sha512-wmjANN0CiYs5clQESK+xE6plet0y9ndqaNBdQx4IIw7ZbPBMQw+14Lq4ky2WqMqGlpFJ9ZUxU0O43TvVZziyyA== @@ -546,7 +546,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -any-shell-escape@^0.1: +any-shell-escape@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/any-shell-escape/-/any-shell-escape-0.1.1.tgz#d55ab972244c71a9a5e1ab0879f30bf110806959" integrity sha512-36j4l5HVkboyRhIWgtMh1I9i8LTdFqVwDEHy1cp+QioJyKgAUG40X0W8s7jakWRta/Sjvm8mUG1fU6Tj8mWagQ== @@ -661,7 +661,7 @@ atomically@^1.7.0: resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== -auto-launch@^5.0: +auto-launch@^5.0.6: version "5.0.6" resolved "https://registry.yarnpkg.com/auto-launch/-/auto-launch-5.0.6.tgz#ccc238ddc07b2fa84e96a1bc2fd11b581a20cb2d" integrity sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA== @@ -858,7 +858,7 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@^3.6: +chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -983,10 +983,10 @@ compare-version@^0.1.2: resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== -compare-versions@^6.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" - integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== +compare-versions@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== concat-map@0.0.1: version "0.0.1" @@ -1003,7 +1003,7 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concurrently@^8: +concurrently@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== @@ -1279,10 +1279,10 @@ electron-builder@25.0.0-alpha.8: simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-log@^5.1: - version "5.1.5" - resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.5.tgz#70d5051fc5ab7669b2592f53f72034867269c96e" - integrity sha512-vuq10faUAxRbILgQx7yHoMObKZDEfj7hMSZrJPsVrDNeCpV/HN11dU7QuY4UDUe055pzBxhSCB3m0+6D3Aktjw== +electron-log@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.7.tgz#73c7ddc1602b3a9ee355bc09d1dc490864add0eb" + integrity sha512-/PjrS9zGkrZCDTHt6IgNE3FeciBbi4wd7U76NG9jAoNXF99E9IJdvBkqvaUJ1NjLojYDKs0kTvn9YhKy1/Zi+Q== electron-publish@25.0.0-alpha.7: version "25.0.0-alpha.7" @@ -1297,7 +1297,7 @@ electron-publish@25.0.0-alpha.7: lazy-val "^1.0.5" mime "^2.5.2" -electron-store@^8.2: +electron-store@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.2.0.tgz#114e6e453e8bb746ab4ccb542424d8c881ad2ca1" integrity sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw== @@ -1536,7 +1536,7 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -ffmpeg-static@^5.2: +ffmpeg-static@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz#6ca64a5ed6e69ec4896d175c1f69dd575db7c5ef" integrity sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA== @@ -2261,7 +2261,7 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== -lru-cache@^11: +lru-cache@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.0.tgz#15d93a196f189034d7166caf9fe55e7384c98a21" integrity sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA== @@ -2499,7 +2499,7 @@ negotiator@^0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -next-electron-server@^1: +next-electron-server@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-electron-server/-/next-electron-server-1.0.0.tgz#03e133ed64a5ef671b6c6409f908c4901b1828cb" integrity sha512-fTUaHwT0Jry2fbdUSIkAiIqgDAInI5BJFF4/j90/okvZCYlyx6yxpXB30KpzmOG6TN/ESwyvsFJVvS2WHT8PAA== @@ -2540,7 +2540,7 @@ node-gyp@^9.0.0: tar "^6.1.2" which "^2.0.2" -node-stream-zip@^1.15: +node-stream-zip@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== @@ -2757,23 +2757,23 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-organize-imports@^4: +prettier-plugin-organize-imports@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.0.0.tgz#a69acf024ea3c8eb650c81f664693826ca853534" integrity sha512-vnKSdgv9aOlqKeEFGhf9SCBsTyzDSyScy1k7E0R1Uo4L0cTcOV7c1XQaT7jfXIOc/p08WLBfN2QUQA9zDSZMxA== -prettier-plugin-packagejson@^2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.0.tgz#23d2cb8b1f7840702d35e3a5078e564ea0bc63e0" - integrity sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg== +prettier-plugin-packagejson@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.1.tgz#026742dee06e3de0d32b0546abcc51413943942a" + integrity sha512-6i4PW1KxEA+VrokYNGeI/q8qQX3u5DNBc7eLr9GX4OrvWr9DMls1lhbuNopkKG7Li9rTNxerWnYQyjxoUO4ROA== dependencies: sort-package-json "2.10.0" - synckit "0.9.0" + synckit "0.9.1" -prettier@^3: - version "3.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" - integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== progress@^2.0.3: version "2.0.3" @@ -3051,7 +3051,7 @@ shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shx@^0.3: +shx@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.4.tgz#74289230b4b663979167f94e1935901406e40f02" integrity sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g== @@ -3225,10 +3225,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.0.tgz#5b33b458b3775e4466a5b377fba69c63572ae449" - integrity sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg== +synckit@0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" @@ -3347,16 +3347,16 @@ typescript-eslint@^8.0.0-alpha.41: "@typescript-eslint/parser" "8.0.0-alpha.41" "@typescript-eslint/utils" "8.0.0-alpha.41" -typescript@^5: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== - typescript@^5.3.3, typescript@^5.4.3: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" From d9ec49b0ac0a3630e2a3977ceb5c08659fb70ceb Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 15:57:09 +0530 Subject: [PATCH 0564/1179] Update electron updater https://github.com/electron-userland/electron-builder/releases --- desktop/package.json | 4 +- desktop/yarn.lock | 208 +++++++++++++++++++------------------------ 2 files changed, 94 insertions(+), 118 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 7094e2a5d6..5c6f4bf4f6 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -32,7 +32,7 @@ "compare-versions": "^6.1.1", "electron-log": "^5.1.7", "electron-store": "^8.2.0", - "electron-updater": "^6.2", + "electron-updater": "^6.3.4", "ffmpeg-static": "^5.2.0", "lru-cache": "^11.0.0", "next-electron-server": "^1.0.0", @@ -48,7 +48,7 @@ "concurrently": "^8.2.2", "cross-env": "^7.0.3", "electron": "^30.4.0", - "electron-builder": "25.0.0-alpha.8", + "electron-builder": "^25.0.5", "eslint": "^9", "prettier": "^3.3.3", "prettier-plugin-organize-imports": "^4.0.0", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 8b248774b5..267599c32a 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -56,19 +56,19 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.3.0.tgz#9659cf6c92563dd69411afce229f52f9f7196227" - integrity sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w== +"@electron/notarize@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.3.2.tgz#20a52a961747be8542a35003380988a0d3fe15e6" + integrity sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg== dependencies: debug "^4.1.1" fs-extra "^9.0.1" promise-retry "^2.0.1" -"@electron/osx-sign@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.3.0.tgz#bd6fb60c519b76ca8a000e5801f5685690e8adad" - integrity sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ== +"@electron/osx-sign@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.3.1.tgz#faf7eeca7ca004a6be541dc4cf7a1bd59ec59b1c" + integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -559,31 +559,31 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" - integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== +app-builder-bin@5.0.0-alpha.7: + version "5.0.0-alpha.7" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.7.tgz#8c835ad083b18fb5d434bc4e4d99cca1fb46c19f" + integrity sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g== -app-builder-lib@25.0.0-alpha.8: - version "25.0.0-alpha.8" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.0.0-alpha.8.tgz#e8065005b0b5d43f22153ac72101f71bf4e1022b" - integrity sha512-d/pcaTcDv3gfdl9AGGP/DKvc+A+TdJmG15f+vqPeEGKOoqLE0ukReaEevXAtH3wOOs5CqgX6QgNPdszeeqFn3Q== +app-builder-lib@25.0.5: + version "25.0.5" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.0.5.tgz#4886ee77030576cbd36fab92633347d3cc554f87" + integrity sha512-rxgxMx1f7I4ZAP0jA5+5iB7X6x6MJvGF7GauRzQBnIVihwXX2HOiAE7yenyY9Ry5YAiH47MnCxdq413Wq6XOcQ== dependencies: "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.3.0" - "@electron/osx-sign" "1.3.0" + "@electron/notarize" "2.3.2" + "@electron/osx-sign" "1.3.1" "@electron/rebuild" "3.6.0" "@electron/universal" "2.0.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "25.0.0-alpha.6" - builder-util-runtime "9.2.5-alpha.2" + builder-util "25.0.3" + builder-util-runtime "9.2.5" chromium-pickle-js "^0.2.0" debug "^4.3.4" ejs "^3.1.8" - electron-publish "25.0.0-alpha.7" + electron-publish "25.0.3" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -591,8 +591,9 @@ app-builder-lib@25.0.0-alpha.8: isbinaryfile "^5.0.0" js-yaml "^4.1.0" lazy-val "^1.0.5" - minimatch "^5.1.1" + minimatch "^10.0.0" read-config-file "6.4.0" + resedit "^1.7.0" sanitize-filename "^1.6.3" semver "^7.3.8" tar "^6.1.12" @@ -760,32 +761,24 @@ buffer@^5.1.0, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.2.4: - version "9.2.4" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a" - integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== +builder-util-runtime@9.2.5: + version "9.2.5" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz#0afdffa0adb5c84c14926c7dd2cf3c6e96e9be83" + integrity sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util-runtime@9.2.5-alpha.2: - version "9.2.5-alpha.2" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.5-alpha.2.tgz#b0a1737996717d7ae0b71e5efdf0bfbd1dd2c21e" - integrity sha512-/Ln2ddejGj2HNMJ+X66mKHRcOvmRzUO/dSi8t4hSV64J7IA+DE+mqDb+zogIE2gin7p7YwcGiOkKny4nwPPPXg== - dependencies: - debug "^4.3.4" - sax "^1.2.4" - -builder-util@25.0.0-alpha.6: - version "25.0.0-alpha.6" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.0.0-alpha.6.tgz#4ac5e13d9e6c750987efc9cd9c1eace58622a30b" - integrity sha512-ghT1XcP6JI926AArlBcPHRRKYCsVWbT/ywnXPwW5X1ani2jmnddPpnwm92xRvCPWGBmeXd2diF69FV5rBJxhRQ== +builder-util@25.0.3: + version "25.0.3" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.0.3.tgz#bd00d8e8abbe6ea56974a2adbbc39578eab0134b" + integrity sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" - app-builder-bin "4.0.0" + app-builder-bin "5.0.0-alpha.7" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.5-alpha.2" + builder-util-runtime "9.2.5" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" @@ -1042,14 +1035,6 @@ config-file-ts@0.2.8-rc1: glob "^10.3.12" typescript "^5.4.3" -config-file-ts@^0.2.4: - version "0.2.6" - resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" - integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== - dependencies: - glob "^10.3.10" - typescript "^5.3.3" - console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -1198,14 +1183,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@25.0.0-alpha.8: - version "25.0.0-alpha.8" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.0.0-alpha.8.tgz#fe887023ffc9ce72dfd2472303a76ec008a156d2" - integrity sha512-1/Sfl1sQugHkHEobFafyx1HcmgkFj8pV7HFEK0NQ8bH5K2qsGvknjAeHjtYhV2sBoSNGod4P0SfbScS6p6h4eg== +dmg-builder@25.0.5: + version "25.0.5" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.0.5.tgz#e7e2731b65cf1ed43c14f2ca672e7d9a2e0234f0" + integrity sha512-ocnZV44ZqInoSFaY54fF7BlCtw+WtbrjyPrkBhaB+Ztn7GPKjmFgRbIKytifJ8h9Cib8jdFRMgjCUtkU45Y6DA== dependencies: - app-builder-lib "25.0.0-alpha.8" - builder-util "25.0.0-alpha.6" - builder-util-runtime "9.2.5-alpha.2" + app-builder-lib "25.0.5" + builder-util "25.0.3" + builder-util-runtime "9.2.5" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -1240,21 +1225,11 @@ dotenv-expand@^11.0.6: dependencies: dotenv "^16.4.4" -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - dotenv@^16.4.4, dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -dotenv@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" - integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== - ejs@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" @@ -1262,20 +1237,20 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@25.0.0-alpha.8: - version "25.0.0-alpha.8" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.0.0-alpha.8.tgz#7238623cf7a753d0da31f16daea8767d0ef6d572" - integrity sha512-nfrtTljEZackbhJE1BcK+RFXrPvrkrBo0TgR0gH2GxNhPiRTwj/S24K3zHbYj6vBaDVtnqlS6Mqm8tMUrRU4tA== +electron-builder@^25.0.5: + version "25.0.5" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.0.5.tgz#fed2432016618fd5ff81dc9dad7ec47889ffe0f1" + integrity sha512-Uj5LFRbUqNiVajsgqcwlKe+CHtwubK3hcoJsW5C2YiWodej2mmxM+LrTqga0rrWWHVMNmrcmGcS/WHpKwy6KEw== dependencies: - app-builder-lib "25.0.0-alpha.8" - builder-util "25.0.0-alpha.6" - builder-util-runtime "9.2.5-alpha.2" + app-builder-lib "25.0.5" + builder-util "25.0.3" + builder-util-runtime "9.2.5" chalk "^4.1.2" - dmg-builder "25.0.0-alpha.8" + dmg-builder "25.0.5" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" - read-config-file "6.3.2" + read-config-file "6.4.0" simple-update-notifier "2.0.0" yargs "^17.6.2" @@ -1284,14 +1259,14 @@ electron-log@^5.1.7: resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.7.tgz#73c7ddc1602b3a9ee355bc09d1dc490864add0eb" integrity sha512-/PjrS9zGkrZCDTHt6IgNE3FeciBbi4wd7U76NG9jAoNXF99E9IJdvBkqvaUJ1NjLojYDKs0kTvn9YhKy1/Zi+Q== -electron-publish@25.0.0-alpha.7: - version "25.0.0-alpha.7" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.0.0-alpha.7.tgz#3c1944c8890b22d5f674772bf16c5382da248861" - integrity sha512-d9R6Jnds3PjzBM4Wt3nRn9ramkbM3kBzt9a6WHQL4/09ByyZGZ1Cu9GS9atRCkH3tBJlOIotUYVhVO36lk3sAA== +electron-publish@25.0.3: + version "25.0.3" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.0.3.tgz#63509992a5ae31bb2b0d8863b26a2f7c35e303cc" + integrity sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "25.0.0-alpha.6" - builder-util-runtime "9.2.5-alpha.2" + builder-util "25.0.3" + builder-util-runtime "9.2.5" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" @@ -1305,18 +1280,18 @@ electron-store@^8.2.0: conf "^10.2.0" type-fest "^2.17.0" -electron-updater@^6.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.2.1.tgz#1c9adb9ba2a21a5dc50a8c434c45360d5e9fe6c9" - integrity sha512-83eKIPW14qwZqUUM6wdsIRwVKZyjmHxQ4/8G+1C6iS5PdDt7b1umYQyj1/qPpH510GmHEQe4q0kCPe3qmb3a0Q== +electron-updater@^6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.4.tgz#3934bc89875bb524c2cbbd11041114e97c0c2496" + integrity sha512-uZUo7p1Y53G4tl6Cgw07X1yF8Jlz6zhaL7CQJDZ1fVVkOaBfE2cWtx80avwDVi8jHp+I/FWawrMgTAeCCNIfAg== dependencies: - builder-util-runtime "9.2.4" + builder-util-runtime "9.2.5" fs-extra "^10.1.0" js-yaml "^4.1.0" lazy-val "^1.0.5" lodash.escaperegexp "^4.1.2" lodash.isequal "^4.5.0" - semver "^7.3.8" + semver "^7.6.3" tiny-typed-emitter "^2.1.0" electron@^30.4.0: @@ -1732,17 +1707,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" - glob@^10.3.12, glob@^10.3.7: version "10.4.1" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" @@ -2106,7 +2070,7 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jackspeak@2.1.1, jackspeak@^2.3.6, jackspeak@^3.1.2: +jackspeak@2.1.1, jackspeak@^3.1.2: version "2.1.1" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd" integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw== @@ -2167,7 +2131,7 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.2.0, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -2195,7 +2159,7 @@ keyv@^4.0.0, keyv@^4.5.4: dependencies: json-buffer "3.0.1" -lazy-val@^1.0.4, lazy-val@^1.0.5: +lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== @@ -2357,6 +2321,13 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -2364,14 +2335,14 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.1: +minimatch@^5.0.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1, minimatch@^9.0.3: +minimatch@^9.0.3: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -2713,7 +2684,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2, path-scurry@^1.11.1: +path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -2726,6 +2697,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pe-library@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-0.4.1.tgz#e269be0340dcb13aa6949d743da7d658c3e2fbea" + integrity sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -2823,18 +2799,6 @@ read-binary-file-arch@^1.0.6: dependencies: debug "^4.3.4" -read-config-file@6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" - integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== - dependencies: - config-file-ts "^0.2.4" - dotenv "^9.0.2" - dotenv-expand "^5.1.0" - js-yaml "^4.1.0" - json5 "^2.2.0" - lazy-val "^1.0.4" - read-config-file@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.4.0.tgz#970542833216cccff6b1d83320495003dcf85a45" @@ -2885,6 +2849,13 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +resedit@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resedit/-/resedit-1.7.1.tgz#150c101000210968730141ae2eb504ca0aead165" + integrity sha512-/FJ6/gKAXbcHtivannhecWsa43kGVFK3aHHv9Jm3x0eFiM31MoGihkAOWbm3UsvjYLRVw0zTkfARy2dI96JL1Q== + dependencies: + pe-library "^0.4.1" + resolve-alpn@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -3013,6 +2984,11 @@ semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: dependencies: lru-cache "^6.0.0" +semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -3347,7 +3323,7 @@ typescript-eslint@^8.0.0-alpha.41: "@typescript-eslint/parser" "8.0.0-alpha.41" "@typescript-eslint/utils" "8.0.0-alpha.41" -typescript@^5.3.3, typescript@^5.4.3: +typescript@^5.4.3: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== From 5fe1fc8039712df0a84042db9cbcefed7fa96b3c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 15:59:10 +0530 Subject: [PATCH 0565/1179] Update eslint and frens --- desktop/package.json | 4 +- desktop/yarn.lock | 121 ++++++++++++++++++++++--------------------- 2 files changed, 65 insertions(+), 60 deletions(-) diff --git a/desktop/package.json b/desktop/package.json index 5c6f4bf4f6..1a33272037 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -40,7 +40,7 @@ "onnxruntime-node": "^1.19.0" }, "devDependencies": { - "@eslint/js": "^9", + "@eslint/js": "^9.9.0", "@tsconfig/node20": "^20.1.4", "@types/auto-launch": "^5.0.5", "@types/eslint__js": "^8.42.3", @@ -55,7 +55,7 @@ "prettier-plugin-packagejson": "^2.5.1", "shx": "^0.3.4", "typescript": "^5.5.4", - "typescript-eslint": "^8.0.0-alpha.41" + "typescript-eslint": "^8.2.0" }, "packageManager": "yarn@1.22.22", "productName": "ente" diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 267599c32a..dfef3d4780 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -146,11 +146,16 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.7.0", "@eslint/js@^9": +"@eslint/js@9.7.0": version "9.7.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.7.0.tgz#b712d802582f02b11cfdf83a85040a296afec3f0" integrity sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng== +"@eslint/js@^9.9.0": + version "9.9.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638" + integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug== + "@eslint/object-schema@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" @@ -379,62 +384,62 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.41.tgz#8dfb0416c802cf53d9b8ba2688bb5d87c3b5a5ba" - integrity sha512-WePtbzWMaQO4qtGAXp3zzEN8yYZCEuAHVCERCUXgoSUTQ80F5UB7T5lYyA9ySpFDB7rqJ2ev98DtnbS4U3Ms+w== +"@typescript-eslint/eslint-plugin@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz#bf50e9c8dac6bdf15dd1b52ca29448550903558e" + integrity sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.0.0-alpha.41" - "@typescript-eslint/type-utils" "8.0.0-alpha.41" - "@typescript-eslint/utils" "8.0.0-alpha.41" - "@typescript-eslint/visitor-keys" "8.0.0-alpha.41" + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/type-utils" "8.2.0" + "@typescript-eslint/utils" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.0.0-alpha.41.tgz#d6b5f3a869a78d490c94628bc119a9a38c5842a8" - integrity sha512-7HMXwy/q/59ZASBXz2FtdIsR7LgABrR8j2dTKq9GMR8OkjjdO4klxWSY/uOBozVt4UxlMRYsBdBDhEq4/tHRiw== +"@typescript-eslint/parser@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.2.0.tgz#de3993304feb98576d9ffbf10c83ca1bcb68a5dd" + integrity sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg== dependencies: - "@typescript-eslint/scope-manager" "8.0.0-alpha.41" - "@typescript-eslint/types" "8.0.0-alpha.41" - "@typescript-eslint/typescript-estree" "8.0.0-alpha.41" - "@typescript-eslint/visitor-keys" "8.0.0-alpha.41" + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.41.tgz#7729d129d966cc34a3b37c12cf08ba1b0467d516" - integrity sha512-iNxuQ0TMVfFiMJ2al4bGd/mY9+aLtBxnHfo7B2xoVzR6cRFgUdBLlMa//MSIjSmVRpCEqNLQnkxpJb96tFG+xw== +"@typescript-eslint/scope-manager@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz#4a4bd7e7df5522acc8795c3b6f21e8c41b951138" + integrity sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw== dependencies: - "@typescript-eslint/types" "8.0.0-alpha.41" - "@typescript-eslint/visitor-keys" "8.0.0-alpha.41" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" -"@typescript-eslint/type-utils@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.41.tgz#6da1e44d9ce1e060e66feaa45f73a792965a0e69" - integrity sha512-+QIA1z/jrox6bbvqlyqBQjotpevieLTycfiuoKuqGcKoskFZV5Rma51BV8LCJacnOafwJtSi+7b8zDo8OsXUvA== +"@typescript-eslint/type-utils@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz#5cd7fef50f492e5a0f508bdd40678861a57c3549" + integrity sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w== dependencies: - "@typescript-eslint/typescript-estree" "8.0.0-alpha.41" - "@typescript-eslint/utils" "8.0.0-alpha.41" + "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/utils" "8.2.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.0.0-alpha.41.tgz#c1f8dacfb118e4d9febdff2f065802c4db69beae" - integrity sha512-n0P2FP3YC3pD3yoiCf4lHqbUP45xlnOk8HkjB+LtKSUZZWLLJ8k1ZXZtQj7MEX22tytCMj//Bmq403xFuCwfIg== +"@typescript-eslint/types@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.2.0.tgz#dfe9895a2812f7c6bf7af863054c22a67060420c" + integrity sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ== -"@typescript-eslint/typescript-estree@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.41.tgz#c78c96d6b3f39355aac2bdf2f999abfd9333121f" - integrity sha512-adCr+vbLYTFhwhIwjIjjMxTdUYiPA2Jlyuhnbj092IzgLHtT79bvuwcgPWeTyLbFb/13SMKmOEka00xHiqLpig== +"@typescript-eslint/typescript-estree@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz#fbdb93a1c7ac7f1f96ae2de4fc97cd64c60ae894" + integrity sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA== dependencies: - "@typescript-eslint/types" "8.0.0-alpha.41" - "@typescript-eslint/visitor-keys" "8.0.0-alpha.41" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -442,22 +447,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.0.0-alpha.41.tgz#de7d1fb1856773c7343028352cf326a668aa43b9" - integrity sha512-DTxc9VdERS6iloiw1P5tgRDqRArmp/sIuvgdHBvGh2SiltEFc3VjLGnHHGSTr6GfH7tjFWvcCnCtxx+pjWfp5Q== +"@typescript-eslint/utils@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.2.0.tgz#02d442285925f28d520587185f295f932702e733" + integrity sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.0.0-alpha.41" - "@typescript-eslint/types" "8.0.0-alpha.41" - "@typescript-eslint/typescript-estree" "8.0.0-alpha.41" + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/typescript-estree" "8.2.0" -"@typescript-eslint/visitor-keys@8.0.0-alpha.41": - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.41.tgz#6ddefe0a08a36683e2e8db4b161d6b67374b7757" - integrity sha512-uetCAUBVC+YarBdZnWzDDgX11PpAEGV8Cw31I3d1xNrhx6/bJGThKX+holEmd3amMdnr4w/XUKH/4YuQOgtjDA== +"@typescript-eslint/visitor-keys@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz#f6abb3b6508898a117175ddc11f9b9869cc96834" + integrity sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q== dependencies: - "@typescript-eslint/types" "8.0.0-alpha.41" + "@typescript-eslint/types" "8.2.0" eslint-visitor-keys "^3.4.3" "@xmldom/xmldom@^0.8.8": @@ -3314,14 +3319,14 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript-eslint@^8.0.0-alpha.41: - version "8.0.0-alpha.41" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.0.0-alpha.41.tgz#b88af15dfbfa08051f4697698193fcae04ee147f" - integrity sha512-+e7D2XDZeHLe9D3bP7S0Va8YdLHzn3YcesoxMS9SjMWhtaSb5ylxk2txqT84sUS0WIDQetZlvDg2/UmY5B/ycg== +typescript-eslint@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.2.0.tgz#90d75636b663a9f5e391e9b3a33f3031236a25c8" + integrity sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw== dependencies: - "@typescript-eslint/eslint-plugin" "8.0.0-alpha.41" - "@typescript-eslint/parser" "8.0.0-alpha.41" - "@typescript-eslint/utils" "8.0.0-alpha.41" + "@typescript-eslint/eslint-plugin" "8.2.0" + "@typescript-eslint/parser" "8.2.0" + "@typescript-eslint/utils" "8.2.0" typescript@^5.4.3: version "5.4.5" From d96e747c5e8bdcfc6dee18298a0be418aee58cd8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 16:02:18 +0530 Subject: [PATCH 0566/1179] Regen yarn.lock --- desktop/yarn.lock | 225 +++++++++++++++++++++------------------------- 1 file changed, 100 insertions(+), 125 deletions(-) diff --git a/desktop/yarn.lock b/desktop/yarn.lock index dfef3d4780..376d2c3527 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== "@babel/runtime@^7.21.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" + integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== dependencies: regenerator-runtime "^0.14.0" @@ -122,10 +122,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== -"@eslint/config-array@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.0.tgz#ff305e1ee618a00e6e5d0485454c8d92d94a860d" - integrity sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA== +"@eslint/config-array@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" + integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== dependencies: "@eslint/object-schema" "^2.1.4" debug "^4.3.1" @@ -146,12 +146,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.7.0": - version "9.7.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.7.0.tgz#b712d802582f02b11cfdf83a85040a296afec3f0" - integrity sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng== - -"@eslint/js@^9.9.0": +"@eslint/js@9.9.0", "@eslint/js@^9.9.0": version "9.9.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638" integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug== @@ -292,9 +287,9 @@ "@types/ms" "*" "@types/eslint@*": - version "8.56.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.10.tgz#eb2370a73bf04a901eeba8f22595c7ee0f7eb58d" - integrity sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ== + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" + integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -345,18 +340,25 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@types/node@*", "@types/node@^20.9.0": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== +"@types/node@*": + version "22.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" + integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/node@^20.9.0": + version "20.16.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.1.tgz#0b44b15271d0e2191ca68faf1fbe506e06aed732" + integrity sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ== + dependencies: + undici-types "~6.19.2" + "@types/plist@^3.0.1": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" @@ -530,14 +532,14 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.3: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" ansi-regex@^5.0.1: version "5.0.1" @@ -648,9 +650,9 @@ async-exit-hook@^2.0.1: integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -734,20 +736,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1087,17 +1082,10 @@ debounce-fn@^4.0.0: dependencies: mimic-fn "^3.0.0" -debug@4, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -1383,15 +1371,15 @@ eslint-visitor-keys@^4.0.0: integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== eslint@^9: - version "9.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.7.0.tgz#bedb48e1cdc2362a0caaa106a4c6ed943e8b09e4" - integrity sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw== + version "9.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.0.tgz#8d214e69ae4debeca7ae97daebbefe462072d975" + integrity sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.17.0" + "@eslint/config-array" "^0.17.1" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.7.0" + "@eslint/js" "9.9.0" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.3.0" "@nodelib/fs.walk" "^1.2.8" @@ -1502,6 +1490,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -1540,7 +1533,7 @@ filelist@^1.0.4: dependencies: minimatch "^5.0.1" -fill-range@^7.0.1, fill-range@^7.1.1: +fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== @@ -1576,9 +1569,9 @@ flatted@^3.2.9: integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -1713,14 +1706,15 @@ glob-parent@^6.0.2: is-glob "^4.0.3" glob@^10.3.12, glob@^10.3.7: - version "10.4.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" + package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: @@ -1855,7 +1849,7 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -hasown@^2.0.0: +hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -1934,9 +1928,9 @@ ieee754@^1.1.13: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -2002,11 +1996,11 @@ is-ci@^3.0.0: ci-info "^3.2.0" is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" @@ -2085,9 +2079,9 @@ jackspeak@2.1.1, jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.7" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -2226,9 +2220,9 @@ lowercase-keys@^2.0.0: integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: version "11.0.0" @@ -2347,14 +2341,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.3: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: +minimatch@^9.0.3, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -2417,7 +2404,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.0, minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -2481,9 +2468,9 @@ next-electron-server@^1.0.0: integrity sha512-fTUaHwT0Jry2fbdUSIkAiIqgDAInI5BJFF4/j90/okvZCYlyx6yxpXB30KpzmOG6TN/ESwyvsFJVvS2WHT8PAA== node-abi@^3.45.0: - version "3.62.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" - integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== + version "3.67.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.67.0.tgz#1d159907f18d18e18809dbbb5df47ed2426a08df" + integrity sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw== dependencies: semver "^7.3.5" @@ -2652,6 +2639,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -2913,9 +2905,9 @@ rimraf@^3.0.2: glob "^7.1.3" rimraf@^5.0.5: - version "5.0.7" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" - integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== dependencies: glob "^10.3.7" @@ -2963,9 +2955,9 @@ sanitize-filename@^1.6.3: truncate-utf8-bytes "^1.0.0" sax@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== semver-compare@^1.0.0: version "1.0.0" @@ -2977,19 +2969,7 @@ semver@^6.2.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^7.6.3: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -3227,13 +3207,13 @@ tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: yallist "^4.0.0" tar@^7.0.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-7.2.0.tgz#f03ae6ecd2e2bab880f2ef33450f502e761d7548" - integrity sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w== + version "7.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== dependencies: "@isaacs/fs-minipass" "^4.0.0" chownr "^3.0.0" - minipass "^7.1.0" + minipass "^7.1.2" minizlib "^3.0.1" mkdirp "^3.0.1" yallist "^5.0.0" @@ -3293,9 +3273,9 @@ ts-api-utils@^1.3.0: integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== tslib@^2.1.0, tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -3328,20 +3308,15 @@ typescript-eslint@^8.2.0: "@typescript-eslint/parser" "8.2.0" "@typescript-eslint/utils" "8.2.0" -typescript@^5.4.3: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -typescript@^5.5.4: +typescript@^5.4.3, typescript@^5.5.4: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== unique-filename@^2.0.0: version "2.0.1" @@ -3372,7 +3347,7 @@ untildify@^3.0.2: resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== -uri-js@^4.2.2, uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -3380,9 +3355,9 @@ uri-js@^4.2.2, uri-js@^4.4.1: punycode "^2.1.0" utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e" + integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== util-deprecate@^1.0.1: version "1.0.2" From 97d63c940e8af512e47388a1635bcc5695d856ef Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 16:05:11 +0530 Subject: [PATCH 0567/1179] New rule! https://typescript-eslint.io/rules/return-await/ --- desktop/src/main/services/ffmpeg.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/main/services/ffmpeg.ts b/desktop/src/main/services/ffmpeg.ts index 4803fd6f0c..6ba4bf52f0 100644 --- a/desktop/src/main/services/ffmpeg.ts +++ b/desktop/src/main/services/ffmpeg.ts @@ -64,7 +64,7 @@ export const ffmpegExec = async ( await execAsync(cmd); - return fs.readFile(outputFilePath); + return await fs.readFile(outputFilePath); } finally { if (isInputFileTemporary) await deleteTempFileIgnoringErrors(inputFilePath); From 5a107db577ca62460c76e12b4c1feda63f16fba6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 16:59:48 +0530 Subject: [PATCH 0568/1179] Document chrono-node --- web/apps/photos/package.json | 2 +- web/docs/dependencies.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/web/apps/photos/package.json b/web/apps/photos/package.json index 1a4f265b3e..87bc68d698 100644 --- a/web/apps/photos/package.json +++ b/web/apps/photos/package.json @@ -12,7 +12,7 @@ "@stripe/stripe-js": "^1.13.2", "bip39": "^3.0.4", "bs58": "^5.0.0", - "chrono-node": "^2.2.6", + "chrono-node": "^2.7.6", "debounce": "^2.0.0", "exifreader": "^4", "fast-srp-hap": "^2.0.4", diff --git a/web/docs/dependencies.md b/web/docs/dependencies.md index 84275c11fc..e553e31196 100644 --- a/web/docs/dependencies.md +++ b/web/docs/dependencies.md @@ -218,6 +218,9 @@ For more details, see [translations.md](translations.md). for converting arbitrary strings into strings that are suitable for being used as filenames. +- [chrono-node](https://github.com/wanasit/chrono) is used for parsing natural + language queries into dates for showing search results. + ### Face search - [transformation-matrix](https://github.com/chrvadala/transformation-matrix) From 017829685066126eeee5c832e5de199c47f52a1f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 13:50:04 +0200 Subject: [PATCH 0569/1179] [mob][photos] Stop indexing queue when ML is disabled --- mobile/lib/ui/settings/machine_learning_settings_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 040126aec3..cf83d4a800 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -204,6 +204,7 @@ class _MachineLearningSettingsPageState await SemanticSearchService.instance.init(); unawaited(MLService.instance.runAllML(force: true)); } else { + MLService.instance.pauseIndexingAndClustering(); await UserRemoteFlagService.instance .setBoolValue(UserRemoteFlagService.mlEnabled, false); } From aaadffa613001d69f246514c4f92d210d5587bae Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 17:22:21 +0530 Subject: [PATCH 0570/1179] Move --- web/apps/photos/src/services/searchService.ts | 48 +++++++------------ web/apps/photos/src/types/search/index.ts | 11 ++--- web/apps/photos/src/utils/search/index.ts | 28 ----------- web/apps/photos/src/worker/search.worker.ts | 18 ++++++- web/packages/new/photos/services/search.ts | 13 ----- .../new/photos/services/search/index.ts | 30 ++++++++++++ .../new/photos/services/search/types.ts | 24 ++++++++++ 7 files changed, 91 insertions(+), 81 deletions(-) delete mode 100644 web/apps/photos/src/utils/search/index.ts delete mode 100644 web/packages/new/photos/services/search.ts create mode 100644 web/packages/new/photos/services/search/index.ts create mode 100644 web/packages/new/photos/services/search/types.ts diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 01a3289d93..3736327e7e 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -7,15 +7,17 @@ import { isMLSupported, mlStatusSnapshot, } from "@/new/photos/services/ml"; -import type { SearchPerson } from "@/new/photos/services/search"; +import { parsePotentialDate } from "@/new/photos/services/search"; +import type { + DateValue, + SearchPerson, +} from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; -import * as chrono from "chrono-node"; import { t } from "i18next"; import { Collection } from "types/collection"; import { EntityType, LocationTag, LocationTagData } from "types/entity"; import { ClipSearchScores, - DateValue, Search, SearchOption, Suggestion, @@ -23,12 +25,9 @@ import { } from "types/search"; import ComlinkSearchWorker from "utils/comlink/ComlinkSearchWorker"; import { getUniqueFiles } from "utils/file"; -import { getFormattedDate } from "utils/search"; import { getLatestEntities } from "./entityService"; import locationSearchService, { City } from "./locationSearchService"; -const DIGITS = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); - export const getDefaultOptions = async () => { return [ await getMLStatusSuggestion(), @@ -209,7 +208,7 @@ export async function getMLStatusSuggestion(): Promise { } function getDateSuggestion(searchPhrase: string): Suggestion[] { - const searchedDates = parseHumanDate(searchPhrase); + const searchedDates = parsePotentialDate(searchPhrase); return searchedDates.map((searchedDate) => ({ type: SuggestionType.DATE, @@ -218,6 +217,16 @@ function getDateSuggestion(searchPhrase: string): Suggestion[] { })); } +export function getFormattedDate(date: DateValue) { + const options = {}; + date.date && (options["day"] = "numeric"); + (date.month || date.month === 0) && (options["month"] = "long"); + date.year && (options["year"] = "numeric"); + return new Intl.DateTimeFormat("en-IN", options).format( + new Date(date.year ?? 1, date.month ?? 1, date.date ?? 1), + ); +} + function getCollectionSuggestion( searchPhrase: string, collections: Collection[], @@ -332,31 +341,6 @@ function searchFilesByCaption(searchPhrase: string, files: EnteFile[]) { ); } -function parseHumanDate(humanDate: string): DateValue[] { - const date = chrono.parseDate(humanDate); - const date1 = chrono.parseDate(`${humanDate} 1`); - if (date !== null) { - const dates = [ - { month: date.getMonth() }, - { date: date.getDate(), month: date.getMonth() }, - ]; - let reverse = false; - humanDate.split("").forEach((c) => { - if (DIGITS.has(c)) { - reverse = true; - } - }); - if (reverse) { - return dates.reverse(); - } - return dates; - } - if (date1) { - return [{ month: date1.getMonth() }]; - } - return []; -} - async function searchLocationTag(searchPhrase: string): Promise { const locationTags = await getLatestEntities( EntityType.LOCATION_TAG, diff --git a/web/apps/photos/src/types/search/index.ts b/web/apps/photos/src/types/search/index.ts index 5c9158958a..ffa26fdd5e 100644 --- a/web/apps/photos/src/types/search/index.ts +++ b/web/apps/photos/src/types/search/index.ts @@ -1,6 +1,9 @@ import { FileType } from "@/media/file-type"; import type { MLStatus } from "@/new/photos/services/ml"; -import type { SearchPerson } from "@/new/photos/services/search"; +import type { + DateValue, + SearchPerson, +} from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; import { City } from "services/locationSearchService"; import { LocationTagData } from "types/entity"; @@ -18,12 +21,6 @@ export enum SuggestionType { CITY = "CITY", } -export interface DateValue { - date?: number; - month?: number; - year?: number; -} - export interface Suggestion { type: SuggestionType; label: string; diff --git a/web/apps/photos/src/utils/search/index.ts b/web/apps/photos/src/utils/search/index.ts deleted file mode 100644 index 392211ca3e..0000000000 --- a/web/apps/photos/src/utils/search/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { DateValue } from "types/search"; - -export const isSameDayAnyYear = - (baseDate: DateValue) => (compareDate: Date) => { - let same = true; - - if (baseDate.month || baseDate.month === 0) { - same = baseDate.month === compareDate.getMonth(); - } - if (same && baseDate.date) { - same = baseDate.date === compareDate.getDate(); - } - if (same && baseDate.year) { - same = baseDate.year === compareDate.getFullYear(); - } - - return same; - }; - -export function getFormattedDate(date: DateValue) { - const options = {}; - date.date && (options["day"] = "numeric"); - (date.month || date.month === 0) && (options["month"] = "long"); - date.year && (options["year"] = "numeric"); - return new Intl.DateTimeFormat("en-IN", options).format( - new Date(date.year ?? 1, date.month ?? 1, date.date ?? 1), - ); -} diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index f81aecfb96..3f30216852 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -1,3 +1,4 @@ +import type { DateValue } from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; import * as Comlink from "comlink"; import { @@ -5,7 +6,6 @@ import { isInsideLocationTag, } from "services/locationSearchService"; import { Search } from "types/search"; -import { isSameDayAnyYear } from "utils/search"; export class DedicatedSearchWorker { private files: EnteFile[] = []; @@ -65,3 +65,19 @@ function isSearchedFile(file: EnteFile, search: Search) { } return false; } + +const isSameDayAnyYear = (baseDate: DateValue) => (compareDate: Date) => { + let same = true; + + if (baseDate.month || baseDate.month === 0) { + same = baseDate.month === compareDate.getMonth(); + } + if (same && baseDate.date) { + same = baseDate.date === compareDate.getDate(); + } + if (same && baseDate.year) { + same = baseDate.year === compareDate.getFullYear(); + } + + return same; +}; diff --git a/web/packages/new/photos/services/search.ts b/web/packages/new/photos/services/search.ts deleted file mode 100644 index 587485d571..0000000000 --- a/web/packages/new/photos/services/search.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { EnteFile } from "@/new/photos/types/file"; - -/** - * A massaged version of {@link CGroup} suitable for being shown in search - * results. - */ -export interface SearchPerson { - id: string; - name?: string; - files: number[]; - displayFaceID: string; - displayFaceFile: EnteFile; -} diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts new file mode 100644 index 0000000000..b20256d932 --- /dev/null +++ b/web/packages/new/photos/services/search/index.ts @@ -0,0 +1,30 @@ +import * as chrono from "chrono-node"; +import type { DateValue } from "./types"; + +const DIGITS = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); + +export const parsePotentialDate = (humanDate: string): DateValue[] => { + const date = chrono.parseDate(humanDate); + const date1 = chrono.parseDate(`${humanDate} 1`); + if (date !== null) { + const dates = [ + { month: date.getMonth() }, + { date: date.getDate(), month: date.getMonth() }, + ]; + let reverse = false; + humanDate.split("").forEach((c) => { + if (DIGITS.has(c)) { + reverse = true; + } + }); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (reverse) { + return dates.reverse(); + } + return dates; + } + if (date1) { + return [{ month: date1.getMonth() }]; + } + return []; +}; diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts new file mode 100644 index 0000000000..924b7a78df --- /dev/null +++ b/web/packages/new/photos/services/search/types.ts @@ -0,0 +1,24 @@ +/** + * @file types shared between the main thread interface to search (`index.ts`) + * and the search worker (`worker.ts`) + */ + +import type { EnteFile } from "../../types/file"; + +export interface DateValue { + date?: number; + month?: number; + year?: number; +} + +/** + * A massaged version of {@link CGroup} suitable for being shown in search + * results. + */ +export interface SearchPerson { + id: string; + name?: string; + files: number[]; + displayFaceID: string; + displayFaceFile: EnteFile; +} From a5ffb0f4bd445090a1fb79f81d3c857036d26bc2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 17:27:38 +0530 Subject: [PATCH 0571/1179] Rename --- web/apps/photos/src/services/searchService.ts | 10 +++---- web/apps/photos/src/types/search/index.ts | 6 ++-- web/apps/photos/src/worker/search.worker.ts | 29 ++++++++++--------- .../new/photos/services/search/index.ts | 6 ++-- .../new/photos/services/search/types.ts | 21 +++++++++++--- 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 3736327e7e..27bbe574bc 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -9,7 +9,7 @@ import { } from "@/new/photos/services/ml"; import { parsePotentialDate } from "@/new/photos/services/search"; import type { - DateValue, + SearchDateComponents, SearchPerson, } from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; @@ -217,13 +217,13 @@ function getDateSuggestion(searchPhrase: string): Suggestion[] { })); } -export function getFormattedDate(date: DateValue) { +export function getFormattedDate(date: SearchDateComponents) { const options = {}; - date.date && (options["day"] = "numeric"); + date.day && (options["day"] = "numeric"); (date.month || date.month === 0) && (options["month"] = "long"); date.year && (options["year"] = "numeric"); return new Intl.DateTimeFormat("en-IN", options).format( - new Date(date.year ?? 1, date.month ?? 1, date.date ?? 1), + new Date(date.year ?? 1, date.month ?? 1, date.day ?? 1), ); } @@ -369,7 +369,7 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { switch (option.type) { case SuggestionType.DATE: return { - date: option.value as DateValue, + date: option.value as SearchDateComponents, }; case SuggestionType.LOCATION: diff --git a/web/apps/photos/src/types/search/index.ts b/web/apps/photos/src/types/search/index.ts index ffa26fdd5e..4c0b901655 100644 --- a/web/apps/photos/src/types/search/index.ts +++ b/web/apps/photos/src/types/search/index.ts @@ -1,7 +1,7 @@ import { FileType } from "@/media/file-type"; import type { MLStatus } from "@/new/photos/services/ml"; import type { - DateValue, + SearchDateComponents, SearchPerson, } from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; @@ -25,7 +25,7 @@ export interface Suggestion { type: SuggestionType; label: string; value: - | DateValue + | SearchDateComponents | number[] | SearchPerson | MLStatus @@ -37,7 +37,7 @@ export interface Suggestion { } export type Search = { - date?: DateValue; + date?: SearchDateComponents; location?: LocationTagData; city?: City; collection?: number; diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index 3f30216852..e32a449dcf 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -1,4 +1,4 @@ -import type { DateValue } from "@/new/photos/services/search/types"; +import type { SearchDateComponents } from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; import * as Comlink from "comlink"; import { @@ -66,18 +66,19 @@ function isSearchedFile(file: EnteFile, search: Search) { return false; } -const isSameDayAnyYear = (baseDate: DateValue) => (compareDate: Date) => { - let same = true; +const isSameDayAnyYear = + (baseDate: SearchDateComponents) => (compareDate: Date) => { + let same = true; - if (baseDate.month || baseDate.month === 0) { - same = baseDate.month === compareDate.getMonth(); - } - if (same && baseDate.date) { - same = baseDate.date === compareDate.getDate(); - } - if (same && baseDate.year) { - same = baseDate.year === compareDate.getFullYear(); - } + if (baseDate.month || baseDate.month === 0) { + same = baseDate.month === compareDate.getMonth(); + } + if (same && baseDate.day) { + same = baseDate.day === compareDate.getDate(); + } + if (same && baseDate.year) { + same = baseDate.year === compareDate.getFullYear(); + } - return same; -}; + return same; + }; diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index b20256d932..660360b4e4 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -1,9 +1,11 @@ import * as chrono from "chrono-node"; -import type { DateValue } from "./types"; +import type { SearchDateComponents } from "./types"; const DIGITS = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); -export const parsePotentialDate = (humanDate: string): DateValue[] => { +export const parsePotentialDate = ( + humanDate: string, +): SearchDateComponents[] => { const date = chrono.parseDate(humanDate); const date1 = chrono.parseDate(`${humanDate} 1`); if (date !== null) { diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 924b7a78df..8d4b71eab5 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -5,10 +5,23 @@ import type { EnteFile } from "../../types/file"; -export interface DateValue { - date?: number; - month?: number; - year?: number; +/** + * A parsed version of a potential natural language date time string. + * + * The components which were parsed will be set. The type doesn't enforce this, + * but at least one component will be present. + * + * e.g. "December 2022" will be parsed into a (year 2022, month 12, day + * undefined), while "22 December 2022" will be parsed into (year 2022, month + * 12, day 22). + */ +export interface SearchDateComponents { + /** The year, if the search string specified one. */ + year: number | undefined; + /** The month, if the search string specified one. */ + month: number | undefined; + /** The day of the month, if the search string specified one. */ + day: number | undefined; } /** From c3e8a81845fa3e9b32aa837a1007c7af1ea6c0bd Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 13:57:40 +0200 Subject: [PATCH 0572/1179] [mob][photos] Lint warnings --- .../debug/ml_debug_section_widget.dart | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 7b888e066b..0b375cce60 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -20,7 +20,7 @@ import "package:photos/utils/dialog_util.dart"; import 'package:photos/utils/toast_util.dart'; class MLDebugSectionWidget extends StatefulWidget { - const MLDebugSectionWidget({Key? key}) : super(key: key); + const MLDebugSectionWidget({super.key}); @override State createState() => _MLDebugSectionWidgetState(); @@ -54,7 +54,7 @@ class _MLDebugSectionWidgetState extends State { } Widget _getSectionOptions(BuildContext context) { - final Logger _logger = Logger("MLDebugSectionWidget"); + final Logger logger = Logger("MLDebugSectionWidget"); return Column( children: [ MenuItemWidget( @@ -84,7 +84,7 @@ class _MLDebugSectionWidgetState extends State { setState(() {}); } } catch (e, s) { - _logger.warning('indexing failed ', e, s); + logger.warning('indexing failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -106,7 +106,7 @@ class _MLDebugSectionWidgetState extends State { setState(() {}); } } catch (e, s) { - _logger.warning('Remote fetch toggle failed ', e, s); + logger.warning('Remote fetch toggle failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -132,7 +132,7 @@ class _MLDebugSectionWidgetState extends State { setState(() {}); } } catch (e, s) { - _logger.warning('debugIndexingDisabled toggle failed ', e, s); + logger.warning('debugIndexingDisabled toggle failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -150,7 +150,7 @@ class _MLDebugSectionWidgetState extends State { MLService.instance.debugIndexingDisabled = false; unawaited(MLService.instance.runAllML()); } catch (e, s) { - _logger.warning('indexAndClusterAll failed ', e, s); + logger.warning('indexAndClusterAll failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -168,7 +168,7 @@ class _MLDebugSectionWidgetState extends State { MLService.instance.debugIndexingDisabled = false; unawaited(MLService.instance.indexAllImages()); } catch (e, s) { - _logger.warning('indexing failed ', e, s); + logger.warning('indexing failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -198,7 +198,7 @@ class _MLDebugSectionWidgetState extends State { Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('clustering failed ', e, s); + logger.warning('clustering failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -224,7 +224,7 @@ class _MLDebugSectionWidgetState extends State { }); } } catch (e, s) { - _logger.warning('Checking for mixed clusters failed', e, s); + logger.warning('Checking for mixed clusters failed', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -243,7 +243,7 @@ class _MLDebugSectionWidgetState extends State { Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('sync person mappings failed ', e, s); + logger.warning('sync person mappings failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -270,7 +270,7 @@ class _MLDebugSectionWidgetState extends State { Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('reset feedback failed ', e, s); + logger.warning('reset feedback failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -303,7 +303,7 @@ class _MLDebugSectionWidgetState extends State { Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('peopleToPersonMapping remove failed ', e, s); + logger.warning('peopleToPersonMapping remove failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -332,7 +332,7 @@ class _MLDebugSectionWidgetState extends State { Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('drop feedback failed ', e, s); + logger.warning('drop feedback failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, @@ -358,7 +358,7 @@ class _MLDebugSectionWidgetState extends State { await SemanticSearchService.instance.clearIndexes(); showShortToast(context, "Done"); } catch (e, s) { - _logger.warning('drop clip embeddings failed ', e, s); + logger.warning('drop clip embeddings failed ', e, s); await showGenericErrorDialog(context: context, error: e); } }, From 4ad9089f9007593b29743fb13e2a273ce8740bfb Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 17:38:42 +0530 Subject: [PATCH 0573/1179] [mob][photos] Show home tab app bar only on home tab --- mobile/lib/ui/tabs/home_widget.dart | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index dd31847c3e..6eed6c17b1 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -360,10 +360,7 @@ class _HomeWidgetState extends State { }, ), ), - appBar: const PreferredSize( - preferredSize: const Size.fromHeight(kToolbarHeight), - child: HomeAppBarWidget(), - ), + resizeToAvoidBottomInset: false, ), ), @@ -424,12 +421,25 @@ class _HomeWidgetState extends State { children: [ _showShowBackupHook ? const StartBackupHookWidget(headerWidget: _headerWidget) - : HomeGalleryWidget( - header: _headerWidget, - footer: const SizedBox( - height: 160, - ), - selectedFiles: _selectedFiles, + : Stack( + children: [ + const Positioned( + top: 0, + left: 0, + right: 0, + child: HomeAppBarWidget(), + ), + Padding( + padding: const EdgeInsets.only(top: kToolbarHeight), + child: HomeGalleryWidget( + header: _headerWidget, + footer: const SizedBox( + height: 160, + ), + selectedFiles: _selectedFiles, + ), + ), + ], ), _userCollectionsTab, _sharedCollectionTab, From 27c5153fb373d8d3039eb2331d8f9ee2568b2c14 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 17:43:29 +0530 Subject: [PATCH 0574/1179] Less arbitrary --- .../new/photos/services/search/index.ts | 53 +++++++++---------- .../new/photos/services/search/types.ts | 21 +++++--- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 660360b4e4..a60b02b14f 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -1,32 +1,27 @@ +import { nullToUndefined } from "@/utils/transform"; +import type { Component } from "chrono-node"; import * as chrono from "chrono-node"; import type { SearchDateComponents } from "./types"; -const DIGITS = new Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]); - -export const parsePotentialDate = ( - humanDate: string, -): SearchDateComponents[] => { - const date = chrono.parseDate(humanDate); - const date1 = chrono.parseDate(`${humanDate} 1`); - if (date !== null) { - const dates = [ - { month: date.getMonth() }, - { date: date.getDate(), month: date.getMonth() }, - ]; - let reverse = false; - humanDate.split("").forEach((c) => { - if (DIGITS.has(c)) { - reverse = true; - } - }); - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (reverse) { - return dates.reverse(); - } - return dates; - } - if (date1) { - return [{ month: date1.getMonth() }]; - } - return []; -}; +/** + * Try to parse an arbitrary search string into sets of date components. + * + * e.g. "December 2022" will be parsed into a + * + * [(year 2022, month 12, day undefined)] + * + * while "22 December 2022" will be parsed into + * + * [(year 2022, month 12, day 22)] + */ +export const parseDateComponents = (s: string): SearchDateComponents[] => + chrono.parse(s).map((result) => { + const p = result.start; + const component = (s: Component) => + p.isCertain(s) ? nullToUndefined(p.get(s)) : undefined; + const year = component("year"); + const month = component("month"); + const day = component("day"); + const date = p.date(); + return { year, month, day, date }; + }); diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 8d4b71eab5..5cc4ea7976 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -10,18 +10,25 @@ import type { EnteFile } from "../../types/file"; * * The components which were parsed will be set. The type doesn't enforce this, * but at least one component will be present. - * - * e.g. "December 2022" will be parsed into a (year 2022, month 12, day - * undefined), while "22 December 2022" will be parsed into (year 2022, month - * 12, day 22). */ export interface SearchDateComponents { - /** The year, if the search string specified one. */ + /** + * The year, if the search string specified one. + */ year: number | undefined; - /** The month, if the search string specified one. */ + /** + * The month, if the search string specified one. + */ month: number | undefined; - /** The day of the month, if the search string specified one. */ + /** + * The day of the month, if the search string specified one. + */ day: number | undefined; + /** + * The "best" guess at the exact JavaScript {@link Date} that was intended + * by the search string. + */ + date: Date; } /** From a913d2550d4f6361b2db45a728f79373eded91d0 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 17:43:56 +0530 Subject: [PATCH 0575/1179] [mob][photos] Fix status bar not adapting it's color with each screen's appbar colour, which is it's background --- mobile/lib/ui/tabs/home_widget.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 6eed6c17b1..bd5f2da610 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -361,6 +361,15 @@ class _HomeWidgetState extends State { ), ), + ///To fix the status bar not adapting it's color when switching + ///screens the have different appbar colours. + appBar: PreferredSize( + preferredSize: const Size.fromHeight(0), + child: AppBar( + backgroundColor: getEnteColorScheme(context).backgroundElevated, + ), + ), + resizeToAvoidBottomInset: false, ), ), From 8379fb726da5cf978bef09dab909ff3fe56f4851 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 17:55:36 +0530 Subject: [PATCH 0576/1179] Parse --- web/apps/photos/src/services/searchService.ts | 23 ++++--------------- .../new/photos/services/search/index.ts | 19 ++++++++++++--- .../new/photos/services/search/types.ts | 11 +++------ 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 27bbe574bc..26b07cf937 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -7,7 +7,7 @@ import { isMLSupported, mlStatusSnapshot, } from "@/new/photos/services/ml"; -import { parsePotentialDate } from "@/new/photos/services/search"; +import { parseDateComponents } from "@/new/photos/services/search"; import type { SearchDateComponents, SearchPerson, @@ -207,25 +207,12 @@ export async function getMLStatusSuggestion(): Promise { }; } -function getDateSuggestion(searchPhrase: string): Suggestion[] { - const searchedDates = parsePotentialDate(searchPhrase); - - return searchedDates.map((searchedDate) => ({ +const getDateSuggestion = (searchPhrase: string): Suggestion[] => + parseDateComponents(searchPhrase).map(({ components, formattedDate }) => ({ type: SuggestionType.DATE, - value: searchedDate, - label: getFormattedDate(searchedDate), + value: components, + label: formattedDate, })); -} - -export function getFormattedDate(date: SearchDateComponents) { - const options = {}; - date.day && (options["day"] = "numeric"); - (date.month || date.month === 0) && (options["month"] = "long"); - date.year && (options["year"] = "numeric"); - return new Intl.DateTimeFormat("en-IN", options).format( - new Date(date.year ?? 1, date.month ?? 1, date.day ?? 1), - ); -} function getCollectionSuggestion( searchPhrase: string, diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index a60b02b14f..5aac8dcceb 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -13,15 +13,28 @@ import type { SearchDateComponents } from "./types"; * while "22 December 2022" will be parsed into * * [(year 2022, month 12, day 22)] + * + * In addition, also return a formatted representation of the "best" guess at + * the date that was intended by the search string. */ -export const parseDateComponents = (s: string): SearchDateComponents[] => +export const parseDateComponents = ( + s: string, +): { components: SearchDateComponents; formattedDate: string }[] => chrono.parse(s).map((result) => { const p = result.start; const component = (s: Component) => p.isCertain(s) ? nullToUndefined(p.get(s)) : undefined; + const year = component("year"); const month = component("month"); const day = component("day"); - const date = p.date(); - return { year, month, day, date }; + + const format: Intl.DateTimeFormatOptions = {}; + if (year) format.year = "numeric"; + if (month !== undefined) format.month = "long"; + if (day) format.day = "numeric"; + + const formatter = new Intl.DateTimeFormat(undefined, format); + const formattedDate = formatter.format(p.date()); + return { components: { year, month, day }, formattedDate }; }); diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 5cc4ea7976..2cce11126a 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -15,20 +15,15 @@ export interface SearchDateComponents { /** * The year, if the search string specified one. */ - year: number | undefined; + year?: number; /** * The month, if the search string specified one. */ - month: number | undefined; + month?: number; /** * The day of the month, if the search string specified one. */ - day: number | undefined; - /** - * The "best" guess at the exact JavaScript {@link Date} that was intended - * by the search string. - */ - date: Date; + day?: number; } /** From 7f3d7c530f8ea7359b02935ac6605f3a7a1a5acf Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:15:23 +0530 Subject: [PATCH 0577/1179] Revert "[mob][photos] Show home tab app bar only on home tab" This reverts commit 4ad9089f9007593b29743fb13e2a273ce8740bfb. --- mobile/lib/ui/tabs/home_widget.dart | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index bd5f2da610..53c4620e34 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -41,7 +41,6 @@ import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/ui/extents_page_view.dart'; import 'package:photos/ui/home/grant_permissions_widget.dart'; import 'package:photos/ui/home/header_widget.dart'; -import "package:photos/ui/home/home_app_bar_widget.dart"; import 'package:photos/ui/home/home_bottom_nav_bar.dart'; import 'package:photos/ui/home/home_gallery_widget.dart'; import 'package:photos/ui/home/landing_page_widget.dart'; @@ -369,7 +368,6 @@ class _HomeWidgetState extends State { backgroundColor: getEnteColorScheme(context).backgroundElevated, ), ), - resizeToAvoidBottomInset: false, ), ), @@ -430,25 +428,12 @@ class _HomeWidgetState extends State { children: [ _showShowBackupHook ? const StartBackupHookWidget(headerWidget: _headerWidget) - : Stack( - children: [ - const Positioned( - top: 0, - left: 0, - right: 0, - child: HomeAppBarWidget(), - ), - Padding( - padding: const EdgeInsets.only(top: kToolbarHeight), - child: HomeGalleryWidget( - header: _headerWidget, - footer: const SizedBox( - height: 160, - ), - selectedFiles: _selectedFiles, - ), - ), - ], + : HomeGalleryWidget( + header: _headerWidget, + footer: const SizedBox( + height: 160, + ), + selectedFiles: _selectedFiles, ), _userCollectionsTab, _sharedCollectionTab, From 295fa609a611913d7f3863bed4154d67964aaf47 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:18:05 +0530 Subject: [PATCH 0578/1179] Revert "[mob][photos] Add shadow to home tab's app bar" This reverts commit 34612017081d11514d905c9297829ca45eb05d1b. --- mobile/lib/ui/home/error_warning_header_widget.dart | 7 +++++++ mobile/lib/ui/home/home_app_bar_widget.dart | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mobile/lib/ui/home/error_warning_header_widget.dart b/mobile/lib/ui/home/error_warning_header_widget.dart index b657db492f..ffda3f4c42 100644 --- a/mobile/lib/ui/home/error_warning_header_widget.dart +++ b/mobile/lib/ui/home/error_warning_header_widget.dart @@ -7,6 +7,7 @@ import 'package:photos/events/notification_event.dart'; import 'package:photos/events/sync_status_update_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/user_remote_flag_service.dart'; +import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/account/verify_recovery_page.dart'; import 'package:photos/ui/components/notification_widget.dart'; import 'package:photos/ui/home/header_error_widget.dart'; @@ -66,6 +67,12 @@ class _ErrorWarningHeaderState extends State { Widget build(BuildContext context) { return Column( children: [ + _showErrorBanner + ? Divider( + height: 8, + color: getEnteColorScheme(context).strokeFaint, + ) + : const SizedBox.shrink(), _showErrorBanner ? HeaderErrorWidget(error: _syncError) : const SizedBox.shrink(), diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index 31ed26db2f..0f535de5fe 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -76,13 +76,7 @@ class _HomeAppBarWidgetState extends State { @override AppBar build(BuildContext context) { - final colorScheme = getEnteColorScheme(context); return AppBar( - backgroundColor: colorScheme.backgroundElevated, - elevation: 4, - surfaceTintColor: Colors.transparent, - shadowColor: Colors.black.withOpacity(0.2), - clipBehavior: Clip.none, centerTitle: true, title: AnimatedSwitcher( duration: const Duration(milliseconds: 500), From 118b828ee510c51de09391f13be8c0a04e8660e9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 18:18:19 +0530 Subject: [PATCH 0579/1179] Update matcher --- web/apps/photos/src/services/searchService.ts | 8 ++--- web/apps/photos/src/worker/search.worker.ts | 30 +++++++++---------- .../new/photos/services/search/index.ts | 2 +- .../new/photos/services/search/types.ts | 7 +++-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 26b07cf937..38641ba9ed 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -115,22 +115,22 @@ function getHolidaySuggestion(searchPhrase: string): Suggestion[] { return [ { label: t("CHRISTMAS"), - value: { month: 11, date: 25 }, + value: { month: 12, date: 25 }, type: SuggestionType.DATE, }, { label: t("CHRISTMAS_EVE"), - value: { month: 11, date: 24 }, + value: { month: 12, date: 24 }, type: SuggestionType.DATE, }, { label: t("NEW_YEAR"), - value: { month: 0, date: 1 }, + value: { month: 1, date: 1 }, type: SuggestionType.DATE, }, { label: t("NEW_YEAR_EVE"), - value: { month: 11, date: 31 }, + value: { month: 12, date: 31 }, type: SuggestionType.DATE, }, ].filter((suggestion) => diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index e32a449dcf..73605432f6 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -29,7 +29,8 @@ function isSearchedFile(file: EnteFile, search: Search) { } if (search?.date) { - return isSameDayAnyYear(search.date)( + return isDateComponentsMatch( + search.date, new Date(file.metadata.creationTime / 1000), ); } @@ -66,19 +67,18 @@ function isSearchedFile(file: EnteFile, search: Search) { return false; } -const isSameDayAnyYear = - (baseDate: SearchDateComponents) => (compareDate: Date) => { - let same = true; +const isDateComponentsMatch = ( + { year, month, day }: SearchDateComponents, + date: Date, +) => { + // Components are guaranteed to have at least one component, so start by + // assuming true. + let match = true; - if (baseDate.month || baseDate.month === 0) { - same = baseDate.month === compareDate.getMonth(); - } - if (same && baseDate.day) { - same = baseDate.day === compareDate.getDate(); - } - if (same && baseDate.year) { - same = baseDate.year === compareDate.getFullYear(); - } + if (year) match = date.getFullYear() == year; + // JS getMonth is 0-indexed. + if (match && month) match = date.getMonth() + 1 == month; + if (match && day) match = date.getDate() == day; - return same; - }; + return match; +}; diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 5aac8dcceb..602546415a 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -31,7 +31,7 @@ export const parseDateComponents = ( const format: Intl.DateTimeFormatOptions = {}; if (year) format.year = "numeric"; - if (month !== undefined) format.month = "long"; + if (month) format.month = "long"; if (day) format.day = "numeric"; const formatter = new Intl.DateTimeFormat(undefined, format); diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 2cce11126a..c009e546c6 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -13,15 +13,16 @@ import type { EnteFile } from "../../types/file"; */ export interface SearchDateComponents { /** - * The year, if the search string specified one. + * The year, if the search string specified one. e.g. `2024`. */ year?: number; /** - * The month, if the search string specified one. + * The month (1 to 12, with December being 12), if the search string + * specified one. */ month?: number; /** - * The day of the month, if the search string specified one. + * The day of the month (1 to 31), if the search string specified one. */ day?: number; } From 52b13d25b563a7254da9f48bf1d21bc8bacf1db9 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:19:41 +0530 Subject: [PATCH 0580/1179] [mob][photos] chore --- mobile/lib/ui/home/home_app_bar_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index 0f535de5fe..f61ac2818a 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -196,7 +196,7 @@ class _SyncStatusWidgetState extends State { } if (_event!.status == SyncStatus.completedBackup) { return const AnimatedSwitcher( - duration: const Duration(milliseconds: 500), + duration: Duration(milliseconds: 500), switchInCurve: Curves.easeOutQuad, switchOutCurve: Curves.easeInQuad, child: SyncStatusCompletedWidget(), From 66d7e7e043e4fe2cfc43e322d91e23ce6256bbb4 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:22:18 +0530 Subject: [PATCH 0581/1179] Revert "[mob][photos] Refactor + UI tweaks on home app bar" This reverts commit 183ed3f1d70757f1accb3a6a6f3d57d90fe0fc4d. --- .../lib/ui/components/home_header_widget.dart | 100 ++++++ .../ui/home/error_warning_header_widget.dart | 102 ------ mobile/lib/ui/home/header_widget.dart | 4 +- mobile/lib/ui/home/home_app_bar_widget.dart | 198 +----------- mobile/lib/ui/home/status_bar_widget.dart | 292 ++++++++++++++++++ 5 files changed, 400 insertions(+), 296 deletions(-) create mode 100644 mobile/lib/ui/components/home_header_widget.dart delete mode 100644 mobile/lib/ui/home/error_warning_header_widget.dart create mode 100644 mobile/lib/ui/home/status_bar_widget.dart diff --git a/mobile/lib/ui/components/home_header_widget.dart b/mobile/lib/ui/components/home_header_widget.dart new file mode 100644 index 0000000000..7f2519a190 --- /dev/null +++ b/mobile/lib/ui/components/home_header_widget.dart @@ -0,0 +1,100 @@ +import "dart:async"; +import "dart:io"; + +import 'package:flutter/material.dart'; +import "package:logging/logging.dart"; +import "package:photo_manager/photo_manager.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/services/local_sync_service.dart"; +import 'package:photos/ui/components/buttons/icon_button_widget.dart'; +import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; + +class HomeHeaderWidget extends StatefulWidget { + final Widget centerWidget; + const HomeHeaderWidget({required this.centerWidget, Key? key}) + : super(key: key); + + @override + State createState() => _HomeHeaderWidgetState(); +} + +class _HomeHeaderWidgetState extends State { + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButtonWidget( + iconButtonType: IconButtonType.primary, + icon: Icons.menu_outlined, + onTap: () { + Scaffold.of(context).openDrawer(); + }, + ), + ], + ), + AnimatedSwitcher( + duration: const Duration(milliseconds: 250), + child: widget.centerWidget, + ), + IconButtonWidget( + icon: Icons.add_photo_alternate_outlined, + iconButtonType: IconButtonType.primary, + onTap: () async { + try { + final PermissionState state = + await requestPhotoMangerPermissions(); + await LocalSyncService.instance.onUpdatePermission(state); + } on Exception catch (e) { + Logger("HomeHeaderWidget").severe( + "Failed to request permission: ${e.toString()}", + e, + ); + } + if (!LocalSyncService.instance.hasGrantedFullPermission()) { + if (Platform.isAndroid) { + await PhotoManager.openSetting(); + } else { + final bool hasGrantedLimit = + LocalSyncService.instance.hasGrantedLimitedPermissions(); + // ignore: unawaited_futures + showChoiceActionSheet( + context, + title: S.of(context).preserveMore, + body: S.of(context).grantFullAccessPrompt, + firstButtonLabel: S.of(context).openSettings, + firstButtonOnTap: () async { + await PhotoManager.openSetting(); + }, + secondButtonLabel: hasGrantedLimit + ? S.of(context).selectMorePhotos + : S.of(context).cancel, + secondButtonOnTap: () async { + if (hasGrantedLimit) { + await PhotoManager.presentLimited(); + } + }, + ); + } + } else { + unawaited( + routeToPage( + context, + BackupFolderSelectionPage( + buttonText: S.of(context).backup, + ), + ), + ); + } + }, + ), + ], + ); + } +} diff --git a/mobile/lib/ui/home/error_warning_header_widget.dart b/mobile/lib/ui/home/error_warning_header_widget.dart deleted file mode 100644 index ffda3f4c42..0000000000 --- a/mobile/lib/ui/home/error_warning_header_widget.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import "package:logging/logging.dart"; -import 'package:photos/core/event_bus.dart'; -import 'package:photos/events/notification_event.dart'; -import 'package:photos/events/sync_status_update_event.dart'; -import "package:photos/generated/l10n.dart"; -import 'package:photos/services/user_remote_flag_service.dart'; -import "package:photos/theme/ente_theme.dart"; -import 'package:photos/ui/account/verify_recovery_page.dart'; -import 'package:photos/ui/components/notification_widget.dart'; -import 'package:photos/ui/home/header_error_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -const double kContainerHeight = 36; - -class ErrorWarningHeader extends StatefulWidget { - const ErrorWarningHeader({Key? key}) : super(key: key); - - @override - State createState() => _ErrorWarningHeaderState(); -} - -class _ErrorWarningHeaderState extends State { - static final _logger = Logger("StatusBarWidget"); - - late StreamSubscription _subscription; - late StreamSubscription _notificationSubscription; - bool _showErrorBanner = false; - Error? _syncError; - - @override - void initState() { - super.initState(); - - _subscription = Bus.instance.on().listen((event) { - _logger.info("Received event " + event.status.toString()); - if (event.status == SyncStatus.error) { - setState(() { - _syncError = event.error; - _showErrorBanner = true; - }); - } else { - setState(() { - _syncError = null; - _showErrorBanner = false; - }); - } - }); - _notificationSubscription = - Bus.instance.on().listen((event) { - if (mounted) { - setState(() {}); - } - }); - } - - @override - void dispose() { - _subscription.cancel(); - _notificationSubscription.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _showErrorBanner - ? Divider( - height: 8, - color: getEnteColorScheme(context).strokeFaint, - ) - : const SizedBox.shrink(), - _showErrorBanner - ? HeaderErrorWidget(error: _syncError) - : const SizedBox.shrink(), - UserRemoteFlagService.instance.shouldShowRecoveryVerification() && - !_showErrorBanner - ? Padding( - padding: - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), - child: NotificationWidget( - startIcon: Icons.error_outline, - actionIcon: Icons.arrow_forward, - text: S.of(context).confirmYourRecoveryKey, - type: NotificationType.banner, - onTap: () async => { - await routeToPage( - context, - const VerifyRecoveryPage(), - forceCustomPageRoute: true, - ), - }, - ), - ) - : const SizedBox.shrink(), - ], - ); - } -} diff --git a/mobile/lib/ui/home/header_widget.dart b/mobile/lib/ui/home/header_widget.dart index e4cf9057a7..a322382f14 100644 --- a/mobile/lib/ui/home/header_widget.dart +++ b/mobile/lib/ui/home/header_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; -import "package:photos/ui/home/error_warning_header_widget.dart"; import "package:photos/ui/home/memories/memories_widget.dart"; +import 'package:photos/ui/home/status_bar_widget.dart'; class HeaderWidget extends StatelessWidget { const HeaderWidget({ @@ -14,7 +14,7 @@ class HeaderWidget extends StatelessWidget { return const Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ErrorWarningHeader(), + StatusBarWidget(), MemoriesWidget(), ], ); diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart index f61ac2818a..5cda20e593 100644 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ b/mobile/lib/ui/home/home_app_bar_widget.dart @@ -2,20 +2,15 @@ import "dart:async"; import "dart:io"; import "package:flutter/material.dart"; -import "package:intl/intl.dart"; import "package:logging/logging.dart"; import "package:photo_manager/photo_manager.dart"; import "package:photos/core/event_bus.dart"; -import "package:photos/ente_theme_data.dart"; import "package:photos/events/sync_status_update_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/services/local_sync_service.dart"; -import "package:photos/services/sync_service.dart"; -import "package:photos/theme/ente_theme.dart"; import "package:photos/theme/text_style.dart"; -import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; -import "package:photos/ui/home/error_warning_header_widget.dart"; +import "package:photos/ui/home/status_bar_widget.dart"; import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; @@ -38,7 +33,6 @@ class _HomeAppBarWidgetState extends State { @override void initState() { super.initState(); - _subscription = Bus.instance.on().listen((event) { _logger.info("Received event " + event.status.toString()); @@ -78,21 +72,11 @@ class _HomeAppBarWidgetState extends State { AppBar build(BuildContext context) { return AppBar( centerTitle: true, - title: AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - switchInCurve: Curves.easeOutQuad, - switchOutCurve: Curves.easeInQuad, - child: _showStatus - ? AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - switchInCurve: Curves.easeOutQuad, - switchOutCurve: Curves.easeInQuad, - child: _showErrorBanner - ? const Text("ente", style: brandStyleMedium) - : const SyncStatusWidget(), - ) - : const Text("ente", style: brandStyleMedium), - ), + title: _showStatus + ? _showErrorBanner + ? const Text("ente", style: brandStyleMedium) + : const SyncStatusWidget() + : const Text("ente", style: brandStyleMedium), actions: [ IconButtonWidget( icon: Icons.add_photo_alternate_outlined, @@ -149,173 +133,3 @@ class _HomeAppBarWidgetState extends State { ); } } - -class SyncStatusWidget extends StatefulWidget { - const SyncStatusWidget({Key? key}) : super(key: key); - - @override - State createState() => _SyncStatusWidgetState(); -} - -class _SyncStatusWidgetState extends State { - static const Duration kSleepDuration = Duration(milliseconds: 3000); - - SyncStatusUpdate? _event; - late StreamSubscription _subscription; - - @override - void initState() { - super.initState(); - - _subscription = Bus.instance.on().listen((event) { - setState(() { - _event = event; - }); - }); - _event = SyncService.instance.getLastSyncStatusEvent(); - } - - @override - void dispose() { - _subscription.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final bool isNotOutdatedEvent = _event != null && - (_event!.status == SyncStatus.completedBackup || - _event!.status == SyncStatus.completedFirstGalleryImport) && - (DateTime.now().microsecondsSinceEpoch - _event!.timestamp > - kSleepDuration.inMicroseconds); - if (_event == null || - isNotOutdatedEvent || - //sync error cases are handled in StatusBarWidget - _event!.status == SyncStatus.error) { - return const SizedBox.shrink(); - } - if (_event!.status == SyncStatus.completedBackup) { - return const AnimatedSwitcher( - duration: Duration(milliseconds: 500), - switchInCurve: Curves.easeOutQuad, - switchOutCurve: Curves.easeInQuad, - child: SyncStatusCompletedWidget(), - ); - } - return AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - switchInCurve: Curves.easeOutQuad, - switchOutCurve: Curves.easeInQuad, - child: RefreshIndicatorWidget(_event), - ); - } -} - -class RefreshIndicatorWidget extends StatelessWidget { - final SyncStatusUpdate? event; - - const RefreshIndicatorWidget(this.event, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: kContainerHeight, - alignment: Alignment.center, - child: SingleChildScrollView( - physics: const NeverScrollableScrollPhysics(), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - EnteLoadingWidget( - color: getEnteColorScheme(context).primary400, - ), - const SizedBox(width: 12), - Text( - _getRefreshingText(context), - style: getEnteTextTheme(context).small, - ), - ], - ), - ], - ), - ), - ); - } - - String _getRefreshingText(BuildContext context) { - if (event!.status == SyncStatus.startedFirstGalleryImport || - event!.status == SyncStatus.completedFirstGalleryImport) { - return S.of(context).loadingGallery; - } - if (event!.status == SyncStatus.applyingRemoteDiff) { - return S.of(context).syncing; - } - if (event!.status == SyncStatus.preparingForUpload) { - return S.of(context).encryptingBackup; - } - if (event!.status == SyncStatus.inProgress) { - final format = NumberFormat(); - return S.of(context).syncProgress( - format.format(event!.completed!), - format.format(event!.total!), - ); - } - if (event!.status == SyncStatus.paused) { - return event!.reason; - } - if (event!.status == SyncStatus.error) { - return event!.reason; - } - if (event!.status == SyncStatus.completedBackup) { - if (event!.wasStopped) { - return S.of(context).syncStopped; - } - } - return S.of(context).allMemoriesPreserved; - } -} - -class SyncStatusCompletedWidget extends StatelessWidget { - const SyncStatusCompletedWidget({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final colorScheme = getEnteColorScheme(context); - return Container( - color: colorScheme.backdropBase, - height: kContainerHeight, - child: Align( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - Icons.cloud_done_outlined, - color: Theme.of(context).colorScheme.greenAlternative, - size: 22, - ), - Padding( - padding: const EdgeInsets.only(left: 12), - child: Text( - S.of(context).allMemoriesPreserved, - style: getEnteTextTheme(context).small, - ), - ), - ], - ), - ], - ), - ), - ); - } -} diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart new file mode 100644 index 0000000000..3815e4cf3a --- /dev/null +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -0,0 +1,292 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import "package:intl/intl.dart"; +import "package:logging/logging.dart"; +import 'package:photos/core/event_bus.dart'; +import 'package:photos/ente_theme_data.dart'; +import 'package:photos/events/notification_event.dart'; +import 'package:photos/events/sync_status_update_event.dart'; +import "package:photos/generated/l10n.dart"; +import 'package:photos/services/sync_service.dart'; +import 'package:photos/services/user_remote_flag_service.dart'; +import "package:photos/theme/ente_theme.dart"; +import 'package:photos/theme/text_style.dart'; +import 'package:photos/ui/account/verify_recovery_page.dart'; +import 'package:photos/ui/components/home_header_widget.dart'; +import 'package:photos/ui/components/notification_widget.dart'; +import 'package:photos/ui/home/header_error_widget.dart'; +import 'package:photos/utils/navigation_util.dart'; + +const double kContainerHeight = 36; + +class StatusBarWidget extends StatefulWidget { + const StatusBarWidget({Key? key}) : super(key: key); + + @override + State createState() => _StatusBarWidgetState(); +} + +class _StatusBarWidgetState extends State { + static final _logger = Logger("StatusBarWidget"); + + late StreamSubscription _subscription; + late StreamSubscription _notificationSubscription; + bool _showStatus = false; + bool _showErrorBanner = false; + Error? _syncError; + + @override + void initState() { + super.initState(); + + _subscription = Bus.instance.on().listen((event) { + _logger.info("Received event " + event.status.toString()); + if (event.status == SyncStatus.error) { + setState(() { + _syncError = event.error; + _showErrorBanner = true; + }); + } else { + setState(() { + _syncError = null; + _showErrorBanner = false; + }); + } + if (event.status == SyncStatus.completedFirstGalleryImport || + event.status == SyncStatus.completedBackup) { + Future.delayed(const Duration(milliseconds: 2000), () { + if (mounted) { + setState(() { + _showStatus = false; + }); + } + }); + } else { + setState(() { + _showStatus = true; + }); + } + }); + _notificationSubscription = + Bus.instance.on().listen((event) { + if (mounted) { + setState(() {}); + } + }); + } + + @override + void dispose() { + _subscription.cancel(); + _notificationSubscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + HomeHeaderWidget( + centerWidget: _showStatus + ? _showErrorBanner + ? const Text("ente", style: brandStyleMedium) + : const SyncStatusWidget() + : const Text("ente", style: brandStyleMedium), + ), + _showErrorBanner + ? Divider( + height: 8, + color: getEnteColorScheme(context).strokeFaint, + ) + : const SizedBox.shrink(), + _showErrorBanner + ? HeaderErrorWidget(error: _syncError) + : const SizedBox.shrink(), + UserRemoteFlagService.instance.shouldShowRecoveryVerification() && + !_showErrorBanner + ? Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: NotificationWidget( + startIcon: Icons.error_outline, + actionIcon: Icons.arrow_forward, + text: S.of(context).confirmYourRecoveryKey, + type: NotificationType.banner, + onTap: () async => { + await routeToPage( + context, + const VerifyRecoveryPage(), + forceCustomPageRoute: true, + ), + }, + ), + ) + : const SizedBox.shrink(), + ], + ); + } +} + +class SyncStatusWidget extends StatefulWidget { + const SyncStatusWidget({Key? key}) : super(key: key); + + @override + State createState() => _SyncStatusWidgetState(); +} + +class _SyncStatusWidgetState extends State { + static const Duration kSleepDuration = Duration(milliseconds: 3000); + + SyncStatusUpdate? _event; + late StreamSubscription _subscription; + + @override + void initState() { + super.initState(); + + _subscription = Bus.instance.on().listen((event) { + setState(() { + _event = event; + }); + }); + _event = SyncService.instance.getLastSyncStatusEvent(); + } + + @override + void dispose() { + _subscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final bool isNotOutdatedEvent = _event != null && + (_event!.status == SyncStatus.completedBackup || + _event!.status == SyncStatus.completedFirstGalleryImport) && + (DateTime.now().microsecondsSinceEpoch - _event!.timestamp > + kSleepDuration.inMicroseconds); + if (_event == null || + isNotOutdatedEvent || + //sync error cases are handled in StatusBarWidget + _event!.status == SyncStatus.error) { + return const SizedBox.shrink(); + } + if (_event!.status == SyncStatus.completedBackup) { + return const SyncStatusCompletedWidget(); + } + return RefreshIndicatorWidget(_event); + } +} + +class RefreshIndicatorWidget extends StatelessWidget { + static const _inProgressIcon = CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation(Color.fromRGBO(45, 194, 98, 1.0)), + ); + + final SyncStatusUpdate? event; + + const RefreshIndicatorWidget(this.event, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: kContainerHeight, + alignment: Alignment.center, + child: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(2), + width: 22, + height: 22, + child: _inProgressIcon, + ), + Padding( + padding: const EdgeInsets.fromLTRB(12, 4, 0, 0), + child: Text(_getRefreshingText(context)), + ), + ], + ), + ], + ), + ), + ); + } + + String _getRefreshingText(BuildContext context) { + if (event!.status == SyncStatus.startedFirstGalleryImport || + event!.status == SyncStatus.completedFirstGalleryImport) { + return S.of(context).loadingGallery; + } + if (event!.status == SyncStatus.applyingRemoteDiff) { + return S.of(context).syncing; + } + if (event!.status == SyncStatus.preparingForUpload) { + return S.of(context).encryptingBackup; + } + if (event!.status == SyncStatus.inProgress) { + final format = NumberFormat(); + return S.of(context).syncProgress( + format.format(event!.completed!), + format.format(event!.total!), + ); + } + if (event!.status == SyncStatus.paused) { + return event!.reason; + } + if (event!.status == SyncStatus.error) { + return event!.reason; + } + if (event!.status == SyncStatus.completedBackup) { + if (event!.wasStopped) { + return S.of(context).syncStopped; + } + } + return S.of(context).allMemoriesPreserved; + } +} + +class SyncStatusCompletedWidget extends StatelessWidget { + const SyncStatusCompletedWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.defaultBackgroundColor, + height: kContainerHeight, + child: Align( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.cloud_done_outlined, + color: Theme.of(context).colorScheme.greenAlternative, + size: 22, + ), + Padding( + padding: const EdgeInsets.only(left: 12), + child: Text(S.of(context).allMemoriesPreserved), + ), + ], + ), + ], + ), + ), + ); + } +} From 67ee52177526845b748c55ea1e7d486d646ebb04 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:24:06 +0530 Subject: [PATCH 0582/1179] Revert "[mob][photos] Create separate widget for home tab's app bar" This reverts commit 0e642cd254933e07c47a177ab71ed0547cfd5ca9. --- mobile/lib/ui/home/home_app_bar_widget.dart | 135 -------------------- mobile/lib/ui/home/status_bar_widget.dart | 6 +- 2 files changed, 2 insertions(+), 139 deletions(-) delete mode 100644 mobile/lib/ui/home/home_app_bar_widget.dart diff --git a/mobile/lib/ui/home/home_app_bar_widget.dart b/mobile/lib/ui/home/home_app_bar_widget.dart deleted file mode 100644 index 5cda20e593..0000000000 --- a/mobile/lib/ui/home/home_app_bar_widget.dart +++ /dev/null @@ -1,135 +0,0 @@ -import "dart:async"; -import "dart:io"; - -import "package:flutter/material.dart"; -import "package:logging/logging.dart"; -import "package:photo_manager/photo_manager.dart"; -import "package:photos/core/event_bus.dart"; -import "package:photos/events/sync_status_update_event.dart"; -import "package:photos/generated/l10n.dart"; -import "package:photos/services/local_sync_service.dart"; -import "package:photos/theme/text_style.dart"; -import "package:photos/ui/components/buttons/icon_button_widget.dart"; -import "package:photos/ui/home/status_bar_widget.dart"; -import "package:photos/ui/settings/backup/backup_folder_selection_page.dart"; -import "package:photos/utils/dialog_util.dart"; -import "package:photos/utils/navigation_util.dart"; -import "package:photos/utils/photo_manager_util.dart"; - -class HomeAppBarWidget extends StatefulWidget { - const HomeAppBarWidget({super.key}); - - @override - State createState() => _HomeAppBarWidgetState(); -} - -class _HomeAppBarWidgetState extends State { - bool _showStatus = false; - bool _showErrorBanner = false; - - late StreamSubscription _subscription; - final _logger = Logger("HomeAppBarWidget"); - - @override - void initState() { - super.initState(); - _subscription = Bus.instance.on().listen((event) { - _logger.info("Received event " + event.status.toString()); - - if (event.status == SyncStatus.error) { - setState(() { - _showErrorBanner = true; - }); - } else { - setState(() { - _showErrorBanner = false; - }); - } - - if (event.status == SyncStatus.completedFirstGalleryImport || - event.status == SyncStatus.completedBackup) { - Future.delayed(const Duration(milliseconds: 2000), () { - if (mounted) { - setState(() { - _showStatus = false; - }); - } - }); - } else { - setState(() { - _showStatus = true; - }); - } - }); - } - - dispose() { - _subscription.cancel(); - super.dispose(); - } - - @override - AppBar build(BuildContext context) { - return AppBar( - centerTitle: true, - title: _showStatus - ? _showErrorBanner - ? const Text("ente", style: brandStyleMedium) - : const SyncStatusWidget() - : const Text("ente", style: brandStyleMedium), - actions: [ - IconButtonWidget( - icon: Icons.add_photo_alternate_outlined, - iconButtonType: IconButtonType.primary, - onTap: () async { - try { - final PermissionState state = - await requestPhotoMangerPermissions(); - await LocalSyncService.instance.onUpdatePermission(state); - } on Exception catch (e) { - Logger("HomeHeaderWidget").severe( - "Failed to request permission: ${e.toString()}", - e, - ); - } - if (!LocalSyncService.instance.hasGrantedFullPermission()) { - if (Platform.isAndroid) { - await PhotoManager.openSetting(); - } else { - final bool hasGrantedLimit = - LocalSyncService.instance.hasGrantedLimitedPermissions(); - // ignore: unawaited_futures - showChoiceActionSheet( - context, - title: S.of(context).preserveMore, - body: S.of(context).grantFullAccessPrompt, - firstButtonLabel: S.of(context).openSettings, - firstButtonOnTap: () async { - await PhotoManager.openSetting(); - }, - secondButtonLabel: hasGrantedLimit - ? S.of(context).selectMorePhotos - : S.of(context).cancel, - secondButtonOnTap: () async { - if (hasGrantedLimit) { - await PhotoManager.presentLimited(); - } - }, - ); - } - } else { - unawaited( - routeToPage( - context, - BackupFolderSelectionPage( - buttonText: S.of(context).backup, - ), - ), - ); - } - }, - ), - ], - ); - } -} diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index 3815e4cf3a..8df1a90242 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -38,8 +38,6 @@ class _StatusBarWidgetState extends State { @override void initState() { - super.initState(); - _subscription = Bus.instance.on().listen((event) { _logger.info("Received event " + event.status.toString()); if (event.status == SyncStatus.error) { @@ -74,6 +72,7 @@ class _StatusBarWidgetState extends State { setState(() {}); } }); + super.initState(); } @override @@ -143,14 +142,13 @@ class _SyncStatusWidgetState extends State { @override void initState() { - super.initState(); - _subscription = Bus.instance.on().listen((event) { setState(() { _event = event; }); }); _event = SyncService.instance.getLastSyncStatusEvent(); + super.initState(); } @override From 20223ddec8fe0859a475a2adb0aa23d8b87dcc60 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:35:05 +0530 Subject: [PATCH 0583/1179] [mob][photos] Refactor + minor UI change --- mobile/lib/ui/tabs/home_widget.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 53c4620e34..dd31dbeda6 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -76,7 +76,6 @@ class _HomeWidgetState extends State { static final _settingsPage = SettingsPage( emailNotifier: UserService.instance.emailValueNotifier, ); - static const _headerWidget = HeaderWidget(); final _logger = Logger("HomeWidgetState"); final _selectedFiles = SelectedFiles(); @@ -365,7 +364,7 @@ class _HomeWidgetState extends State { appBar: PreferredSize( preferredSize: const Size.fromHeight(0), child: AppBar( - backgroundColor: getEnteColorScheme(context).backgroundElevated, + backgroundColor: getEnteColorScheme(context).backgroundBase, ), ), resizeToAvoidBottomInset: false, @@ -427,9 +426,9 @@ class _HomeWidgetState extends State { physics: const BouncingScrollPhysics(), children: [ _showShowBackupHook - ? const StartBackupHookWidget(headerWidget: _headerWidget) + ? const StartBackupHookWidget(headerWidget: HeaderWidget()) : HomeGalleryWidget( - header: _headerWidget, + header: const HeaderWidget(), footer: const SizedBox( height: 160, ), From 370731b56ae147b279c36559bc4ccf6b7d8e614f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 15:06:33 +0200 Subject: [PATCH 0584/1179] [mob][photos] ml debug options 1/x --- .../face_ml/face_recognition_service.dart | 10 ++++------ .../debug/ml_debug_section_widget.dart | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 4898fc5f4e..f639520df3 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -65,12 +65,6 @@ class FaceRecognitionService { Future sync() async { await _syncPersonFeedback(); - if (localSettings.remoteFetchEnabled) { - } else { - _logger.severe( - 'Not fetching embeddings because user manually disabled it in debug options', - ); - } } Future _syncPersonFeedback() async { @@ -95,6 +89,10 @@ class FaceRecognitionService { List batchToYield = []; for (final chunk in chunks) { + if (!localSettings.remoteFetchEnabled) { + _logger.warning("remoteFetchEnabled is false, skiping embedding fetch"); + yield chunk; + } final Set ids = {}; final Map pendingIndex = {}; for (final instruction in chunk) { diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index 0b375cce60..af6f8b16b2 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -17,6 +17,7 @@ import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/settings/common_settings.dart'; import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/ml_util.dart"; import 'package:photos/utils/toast_util.dart'; class MLDebugSectionWidget extends StatefulWidget { @@ -58,14 +59,15 @@ class _MLDebugSectionWidgetState extends State { return Column( children: [ MenuItemWidget( - captionedTextWidget: FutureBuilder( - future: MLDataDB.instance.getFaceIndexedFileCount(), + captionedTextWidget: FutureBuilder( + future: getIndexStatus(), builder: (context, snapshot) { if (snapshot.hasData) { + final IndexStatus status = snapshot.data!; return CaptionedTextWidget( title: localSettings.isMLIndexingEnabled - ? "Disable faces (${snapshot.data!} files done)" - : "Enable faces (${snapshot.data!} files done)", + ? "Disable ML (${status.indexedItems} files indexed)" + : "Enable ML (${status.indexedItems} files indexed)", ); } return const SizedBox.shrink(); @@ -77,7 +79,11 @@ class _MLDebugSectionWidgetState extends State { onTap: () async { try { final isEnabled = await localSettings.toggleMLIndexing(); - if (!isEnabled) { + if (isEnabled) { + await MLService.instance.init(); + await SemanticSearchService.instance.init(); + unawaited(MLService.instance.runAllML(force: true)); + } else { MLService.instance.pauseIndexingAndClustering(); } if (mounted) { @@ -93,8 +99,8 @@ class _MLDebugSectionWidgetState extends State { MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: localSettings.remoteFetchEnabled - ? "Remote fetch enabled" - : "Remote fetch disabled", + ? "Disable remote fetch" + : "Enable remote fetch", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, From 2d4225f6ad3482a3654d5226291f6c6b8d617464 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 23 Aug 2024 18:53:54 +0530 Subject: [PATCH 0585/1179] [mob][photos] Revert change to dark theme elevation colors becuase of inconsistancy across app with some dark theme colors of few components --- mobile/lib/theme/colors.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/theme/colors.dart b/mobile/lib/theme/colors.dart index f46e4e6fbf..be8ed8e7e4 100644 --- a/mobile/lib/theme/colors.dart +++ b/mobile/lib/theme/colors.dart @@ -163,8 +163,8 @@ const Color backgroundElevatedLight = Color.fromRGBO(255, 255, 255, 1); const Color backgroundElevated2Light = Color.fromRGBO(251, 251, 251, 1); const Color backgroundBaseDark = Color.fromRGBO(0, 0, 0, 1); -const Color backgroundElevatedDark = Color.fromRGBO(9, 9, 9, 1); -const Color backgroundElevated2Dark = Color.fromRGBO(18, 18, 18, 1); +const Color backgroundElevatedDark = Color.fromRGBO(27, 27, 27, 1); +const Color backgroundElevated2Dark = Color.fromRGBO(37, 37, 37, 1); // Backdrop Colors const Color backdropBaseLight = Color.fromRGBO(255, 255, 255, 0.92); From e47b4169ed178eac8ac14b407d8da43eaf79303a Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 15:26:23 +0200 Subject: [PATCH 0586/1179] [mob][photos] small refactor --- mobile/lib/models/ml/ml_versions.dart | 3 + .../face_ml/face_recognition_service.dart | 107 ------------------ .../services/machine_learning/ml_service.dart | 8 +- mobile/lib/utils/ml_util.dart | 107 +++++++++++++++++- 4 files changed, 113 insertions(+), 112 deletions(-) diff --git a/mobile/lib/models/ml/ml_versions.dart b/mobile/lib/models/ml/ml_versions.dart index d22c4c0670..a52982fb23 100644 --- a/mobile/lib/models/ml/ml_versions.dart +++ b/mobile/lib/models/ml/ml_versions.dart @@ -2,3 +2,6 @@ const faceMlVersion = 1; const clipMlVersion = 1; const clusterMlVersion = 1; const minimumClusterSize = 2; + +const embeddingFetchLimit = 200; +const fileDownloadMlLimit = 10; diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index f639520df3..8b3bb7eda1 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -5,17 +5,8 @@ import "dart:ui" show Image; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; -import "package:photos/db/ml/clip_db.dart"; -import "package:photos/db/ml/db.dart"; import "package:photos/events/diff_sync_complete_event.dart"; import "package:photos/events/people_changed_event.dart"; -import "package:photos/extensions/list.dart"; -import "package:photos/models/ml/clip.dart"; -import "package:photos/models/ml/face/face.dart"; -import "package:photos/models/ml/ml_versions.dart"; -import "package:photos/service_locator.dart"; -import "package:photos/services/filedata/filedata_service.dart"; -import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/detection.dart"; import "package:photos/services/machine_learning/face_ml/face_detection/face_detection_service.dart"; import "package:photos/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart"; @@ -23,7 +14,6 @@ import "package:photos/services/machine_learning/face_ml/person/person_service.d import "package:photos/services/machine_learning/ml_exceptions.dart"; import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/image_ml_util.dart"; -import "package:photos/utils/ml_util.dart"; class FaceRecognitionService { final _logger = Logger("FaceRecognitionService"); @@ -40,8 +30,6 @@ class FaceRecognitionService { bool _shouldSyncPeople = false; bool _isSyncing = false; - static const _embeddingFetchLimit = 200; - Future init() async { if (_isInitialized) { return; @@ -80,101 +68,6 @@ class FaceRecognitionService { _isSyncing = false; } - Stream> syncEmbeddings({ - int yieldSize = 10, - }) async* { - final List filesToIndex = await getFilesForMlIndexing(); - final List> chunks = - filesToIndex.chunks(_embeddingFetchLimit); - List batchToYield = []; - - for (final chunk in chunks) { - if (!localSettings.remoteFetchEnabled) { - _logger.warning("remoteFetchEnabled is false, skiping embedding fetch"); - yield chunk; - } - final Set ids = {}; - final Map pendingIndex = {}; - for (final instruction in chunk) { - ids.add(instruction.file.uploadedFileID!); - pendingIndex[instruction.file.uploadedFileID!] = instruction; - } - _logger.info("fetching embeddings for ${ids.length} files"); - final res = await FileDataService.instance.getFilesData(ids); - _logger.info("embeddingResponse ${res.debugLog()}"); - final List faces = []; - final List clipEmbeddings = []; - for (FileDataEntity fileMl in res.data.values) { - final existingInstruction = pendingIndex[fileMl.fileID]!; - final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); - //Note: Always do null check, empty value means no face was found. - if (facesFromRemoteEmbedding != null) { - faces.addAll(facesFromRemoteEmbedding); - existingInstruction.shouldRunFaces = false; - } - if (fileMl.clipEmbedding != null && - fileMl.clipEmbedding!.version >= clipMlVersion) { - clipEmbeddings.add( - ClipEmbedding( - fileID: fileMl.fileID, - embedding: fileMl.clipEmbedding!.embedding, - version: fileMl.clipEmbedding!.version, - ), - ); - existingInstruction.shouldRunClip = false; - } - if (!existingInstruction.pendingML) { - pendingIndex.remove(fileMl.fileID); - } else { - existingInstruction.existingRemoteFileML = fileMl; - pendingIndex[fileMl.fileID] = existingInstruction; - } - } - for (final fileID in pendingIndex.keys) { - final instruction = pendingIndex[fileID]!; - if (instruction.pendingML) { - batchToYield.add(instruction); - if (batchToYield.length == yieldSize) { - _logger.info("queueing indexing for $yieldSize"); - yield batchToYield; - batchToYield = []; - } - } - } - await MLDataDB.instance.bulkInsertFaces(faces); - await MLDataDB.instance.putMany(clipEmbeddings); - } - // Yield any remaining instructions - if (batchToYield.isNotEmpty) { - _logger.info("queueing indexing for ${batchToYield.length}"); - yield batchToYield; - } - } - - // Returns a list of faces from the given remote fileML. null if the version is less than the current version - // or if the remote faceEmbedding is null. - List? _getFacesFromRemoteEmbedding(FileDataEntity fileMl) { - final RemoteFaceEmbedding? remoteFaceEmbedding = fileMl.faceEmbedding; - if (shouldDiscardRemoteEmbedding(fileMl)) { - return null; - } - final List faces = []; - if (remoteFaceEmbedding!.faces.isEmpty) { - faces.add( - Face.empty(fileMl.fileID), - ); - } else { - for (final f in remoteFaceEmbedding.faces) { - f.fileInfo = FileInfo( - imageHeight: remoteFaceEmbedding.height, - imageWidth: remoteFaceEmbedding.width, - ); - faces.add(f); - } - } - return faces; - } - static Future> runFacesPipeline( int enteFileID, Image image, diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 9321c3f96a..d54d45000c 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -58,7 +58,6 @@ class MLService { bool _isRunningML = false; bool _shouldPauseIndexingAndClustering = false; - static const int _fileDownloadLimit = 10; static const _kForceClusteringFaceCount = 8000; /// Only call this function once at app startup, after that you can directly call [runAllML] @@ -142,7 +141,9 @@ class MLService { } void triggerML() { - if (_mlControllerStatus && !_isIndexingOrClusteringRunning && !_isRunningML) { + if (_mlControllerStatus && + !_isIndexingOrClusteringRunning && + !_isRunningML) { unawaited(runAllML()); } } @@ -169,8 +170,7 @@ class MLService { _isIndexingOrClusteringRunning = true; _logger.info('starting image indexing'); final Stream> instructionStream = - FaceRecognitionService.instance - .syncEmbeddings(yieldSize: _fileDownloadLimit); + fetchEmbeddingsAndInstructions(); int fileAnalyzedCount = 0; final Stopwatch stopwatch = Stopwatch()..start(); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 33d30711c0..c30872c4bf 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -7,11 +7,16 @@ import "package:photos/core/configuration.dart"; import "package:photos/db/files_db.dart"; import "package:photos/db/ml/clip_db.dart"; import "package:photos/db/ml/db.dart"; +import "package:photos/extensions/list.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; +import "package:photos/models/ml/clip.dart"; import "package:photos/models/ml/face/dimension.dart"; +import "package:photos/models/ml/face/face.dart"; import "package:photos/models/ml/ml_versions.dart"; +import "package:photos/service_locator.dart"; +import "package:photos/services/filedata/filedata_service.dart"; import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/ml_exceptions.dart"; @@ -68,6 +73,7 @@ Future getIndexStatus() async { } } +/// Return a list of file instructions for files that should be indexed for ML Future> getFilesForMlIndexing() async { _logger.info('getFilesForMlIndexing called'); final time = DateTime.now(); @@ -146,7 +152,106 @@ Future> getFilesForMlIndexing() async { return sortedBylocalID; } -bool shouldDiscardRemoteEmbedding(FileDataEntity fileML) { +Stream> fetchEmbeddingsAndInstructions({ + int yieldSize = fileDownloadMlLimit, +}) async* { + final List filesToIndex = await getFilesForMlIndexing(); + final List> chunks = + filesToIndex.chunks(embeddingFetchLimit); + List batchToYield = []; + + for (final chunk in chunks) { + if (!localSettings.remoteFetchEnabled) { + _logger.warning("remoteFetchEnabled is false, skiping embedding fetch"); + final batches = chunk.chunks(yieldSize); + for (final batch in batches) { + yield batch; + } + continue; + } + final Set ids = {}; + final Map pendingIndex = {}; + for (final instruction in chunk) { + ids.add(instruction.file.uploadedFileID!); + pendingIndex[instruction.file.uploadedFileID!] = instruction; + } + _logger.info("fetching embeddings for ${ids.length} files"); + final res = await FileDataService.instance.getFilesData(ids); + _logger.info("embeddingResponse ${res.debugLog()}"); + final List faces = []; + final List clipEmbeddings = []; + for (FileDataEntity fileMl in res.data.values) { + final existingInstruction = pendingIndex[fileMl.fileID]!; + final facesFromRemoteEmbedding = _getFacesFromRemoteEmbedding(fileMl); + //Note: Always do null check, empty value means no face was found. + if (facesFromRemoteEmbedding != null) { + faces.addAll(facesFromRemoteEmbedding); + existingInstruction.shouldRunFaces = false; + } + if (fileMl.clipEmbedding != null && + fileMl.clipEmbedding!.version >= clipMlVersion) { + clipEmbeddings.add( + ClipEmbedding( + fileID: fileMl.fileID, + embedding: fileMl.clipEmbedding!.embedding, + version: fileMl.clipEmbedding!.version, + ), + ); + existingInstruction.shouldRunClip = false; + } + if (!existingInstruction.pendingML) { + pendingIndex.remove(fileMl.fileID); + } else { + existingInstruction.existingRemoteFileML = fileMl; + pendingIndex[fileMl.fileID] = existingInstruction; + } + } + for (final fileID in pendingIndex.keys) { + final instruction = pendingIndex[fileID]!; + if (instruction.pendingML) { + batchToYield.add(instruction); + if (batchToYield.length == yieldSize) { + _logger.info("queueing indexing for $yieldSize"); + yield batchToYield; + batchToYield = []; + } + } + } + await MLDataDB.instance.bulkInsertFaces(faces); + await MLDataDB.instance.putMany(clipEmbeddings); + } + // Yield any remaining instructions + if (batchToYield.isNotEmpty) { + _logger.info("queueing indexing for ${batchToYield.length}"); + yield batchToYield; + } +} + +// Returns a list of faces from the given remote fileML. null if the version is less than the current version +// or if the remote faceEmbedding is null. +List? _getFacesFromRemoteEmbedding(FileDataEntity fileMl) { + final RemoteFaceEmbedding? remoteFaceEmbedding = fileMl.faceEmbedding; + if (_shouldDiscardRemoteEmbedding(fileMl)) { + return null; + } + final List faces = []; + if (remoteFaceEmbedding!.faces.isEmpty) { + faces.add( + Face.empty(fileMl.fileID), + ); + } else { + for (final f in remoteFaceEmbedding.faces) { + f.fileInfo = FileInfo( + imageHeight: remoteFaceEmbedding.height, + imageWidth: remoteFaceEmbedding.width, + ); + faces.add(f); + } + } + return faces; +} + +bool _shouldDiscardRemoteEmbedding(FileDataEntity fileML) { final fileID = fileML.fileID; final RemoteFaceEmbedding? faceEmbedding = fileML.faceEmbedding; if (faceEmbedding == null || faceEmbedding.version < faceMlVersion) { From de25072755819bc2c195f9c87fa852f7182de4ae Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 15:30:46 +0200 Subject: [PATCH 0587/1179] [mob][photos] ml debug options 2/x --- mobile/lib/ui/settings/debug/ml_debug_section_widget.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index af6f8b16b2..c083c824dd 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -121,8 +121,8 @@ class _MLDebugSectionWidgetState extends State { MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: MLService.instance.debugIndexingDisabled - ? "Debug enable indexing again" - : "Debug disable indexing", + ? "Enable auto indexing (debug)" + : "Disable auto indexing (debug)", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -133,6 +133,8 @@ class _MLDebugSectionWidgetState extends State { !MLService.instance.debugIndexingDisabled; if (MLService.instance.debugIndexingDisabled) { MLService.instance.pauseIndexingAndClustering(); + } else { + unawaited(MLService.instance.runAllML()); } if (mounted) { setState(() {}); From da5da33dc256a6fdba13dc9698209fc6a49a6961 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:09:19 +0530 Subject: [PATCH 0588/1179] Weekday --- web/apps/photos/src/worker/search.worker.ts | 3 ++- web/packages/new/photos/services/search/index.ts | 5 ++++- web/packages/new/photos/services/search/types.ts | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index 73605432f6..41cc61d636 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -68,7 +68,7 @@ function isSearchedFile(file: EnteFile, search: Search) { } const isDateComponentsMatch = ( - { year, month, day }: SearchDateComponents, + { year, month, day, weekday }: SearchDateComponents, date: Date, ) => { // Components are guaranteed to have at least one component, so start by @@ -79,6 +79,7 @@ const isDateComponentsMatch = ( // JS getMonth is 0-indexed. if (match && month) match = date.getMonth() + 1 == month; if (match && day) match = date.getDate() == day; + if (match && weekday) match = date.getDay() == weekday; return match; }; diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 602546415a..4a2309e6bd 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -28,13 +28,16 @@ export const parseDateComponents = ( const year = component("year"); const month = component("month"); const day = component("day"); + const weekday = component("weekday"); + const components = { year, month, day, weekday }; const format: Intl.DateTimeFormatOptions = {}; if (year) format.year = "numeric"; if (month) format.month = "long"; if (day) format.day = "numeric"; + if (weekday) format.weekday = "long"; const formatter = new Intl.DateTimeFormat(undefined, format); const formattedDate = formatter.format(p.date()); - return { components: { year, month, day }, formattedDate }; + return { components, formattedDate }; }); diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index c009e546c6..a33c7ac21e 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -25,6 +25,11 @@ export interface SearchDateComponents { * The day of the month (1 to 31), if the search string specified one. */ day?: number; + /** + * The day of the week (0 to 6, with Sunday being 0), if the search string + * specified one. + */ + weekday?: number; } /** From ac3a323abd60f4d8d3523b4a289930b992568beb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 16:51:54 +0200 Subject: [PATCH 0589/1179] [mob][photos] ml debug options --- mobile/lib/db/ml/db.dart | 2 +- .../debug/ml_debug_section_widget.dart | 77 +++++++++---------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 1a7b6ca6a6..94fea81090 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -942,7 +942,7 @@ class MLDataDB { } /// WARNING: This will delete ALL data in the tables! Only use this for debug/testing purposes! - Future dropFeedbackTables() async { + Future dropFacesFeedbackTables() async { try { final db = await instance.asyncDB; diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index c083c824dd..a3bd5c1a7f 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -7,7 +7,7 @@ import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/models/ml/face/person.dart"; import "package:photos/service_locator.dart"; -import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; +import "package:photos/services/machine_learning/face_ml/face_recognition_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; @@ -148,7 +148,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Run sync, indexing, clustering", + title: "Trigger run ML", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -166,7 +166,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Run indexing", + title: "Trigger run indexing", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -189,7 +189,7 @@ class _MLDebugSectionWidgetState extends State { if (snapshot.hasData) { return CaptionedTextWidget( title: - "Run clustering (${(100 * snapshot.data!).toStringAsFixed(0)}% done)", + "Trigger clustering (${(100 * snapshot.data!).toStringAsFixed(0)}% done)", ); } return const SizedBox.shrink(); @@ -202,7 +202,7 @@ class _MLDebugSectionWidgetState extends State { try { await PersonService.instance.fetchRemoteClusterFeedback(); MLService.instance.debugIndexingDisabled = false; - await MLService.instance.clusterAllImages(clusterInBuckets: true); + await MLService.instance.clusterAllImages(); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { @@ -211,32 +211,32 @@ class _MLDebugSectionWidgetState extends State { } }, ), - sectionOptionSpacing, - MenuItemWidget( - captionedTextWidget: const CaptionedTextWidget( - title: "Check for mixed clusters", - ), - pressedColor: getEnteColorScheme(context).fillFaint, - trailingIcon: Icons.chevron_right_outlined, - trailingIconIsMuted: true, - onTap: () async { - try { - final susClusters = - await ClusterFeedbackService.instance.checkForMixedClusters(); - for (final clusterinfo in susClusters) { - Future.delayed(const Duration(seconds: 4), () { - showToast( - context, - 'Cluster with ${clusterinfo.$2} photos is sus', - ); - }); - } - } catch (e, s) { - logger.warning('Checking for mixed clusters failed', e, s); - await showGenericErrorDialog(context: context, error: e); - } - }, - ), + // sectionOptionSpacing, + // MenuItemWidget( + // captionedTextWidget: const CaptionedTextWidget( + // title: "Check for mixed clusters", + // ), + // pressedColor: getEnteColorScheme(context).fillFaint, + // trailingIcon: Icons.chevron_right_outlined, + // trailingIconIsMuted: true, + // onTap: () async { + // try { + // final susClusters = + // await ClusterFeedbackService.instance.checkForMixedClusters(); + // for (final clusterinfo in susClusters) { + // Future.delayed(const Duration(seconds: 4), () { + // showToast( + // context, + // 'Cluster with ${clusterinfo.$2} photos is sus', + // ); + // }); + // } + // } catch (e, s) { + // logger.warning('Checking for mixed clusters failed', e, s); + // await showGenericErrorDialog(context: context, error: e); + // } + // }, + // ), sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( @@ -247,8 +247,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - await PersonService.instance.reconcileClusters(); - Bus.instance.fire(PeopleChangedEvent()); + await FaceRecognitionService.instance.sync(); showShortToast(context, "Done"); } catch (e, s) { logger.warning('sync person mappings failed ', e, s); @@ -270,11 +269,11 @@ class _MLDebugSectionWidgetState extends State { context, title: "Are you sure?", body: - "This will drop all people and their related feedback. It will keep clustering labels and embeddings untouched.", + "This will drop all people and their related feedback stored locally. It will keep clustering labels and embeddings untouched, as well as persons stored on remote.", firstButtonLabel: "Yes, confirm", firstButtonOnTap: () async { try { - await MLDataDB.instance.dropFeedbackTables(); + await MLDataDB.instance.dropFacesFeedbackTables(); Bus.instance.fire(PeopleChangedEvent()); showShortToast(context, "Done"); } catch (e, s) { @@ -298,7 +297,7 @@ class _MLDebugSectionWidgetState extends State { context, title: "Are you sure?", body: - "This will delete all people, their related feedback and clustering labels. It will keep embeddings untouched.", + "This will delete all people (also from remote), their related feedback and clustering labels. It will keep embeddings untouched.", firstButtonLabel: "Yes, confirm", firstButtonOnTap: () async { try { @@ -321,7 +320,7 @@ class _MLDebugSectionWidgetState extends State { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Reset faces everything (embeddings)", + title: "Reset all local faces", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -331,7 +330,7 @@ class _MLDebugSectionWidgetState extends State { context, title: "Are you sure?", body: - "You will need to again re-index all the faces. You can drop feedback if you want to label again", + "This will drop all local faces data. You will need to again re-index faces.", firstButtonLabel: "Yes, confirm", firstButtonOnTap: () async { try { @@ -349,7 +348,7 @@ class _MLDebugSectionWidgetState extends State { ), MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( - title: "Reset clip embeddings", + title: "Reset all local clip", ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, From e9686613b675ae6c3c89dddb214099dcbcd272d3 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Fri, 23 Aug 2024 20:21:54 +0530 Subject: [PATCH 0590/1179] Increase the limit for referral code length --- server/pkg/controller/storagebonus/referral.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/controller/storagebonus/referral.go b/server/pkg/controller/storagebonus/referral.go index bcc0bc6beb..9f61eac0d5 100644 --- a/server/pkg/controller/storagebonus/referral.go +++ b/server/pkg/controller/storagebonus/referral.go @@ -138,7 +138,7 @@ func (c *Controller) UpdateReferralCode(ctx *gin.Context, userID int64, code str if !random.IsAlphanumeric(code) { return stacktrace.Propagate(ente.NewBadRequestWithMessage("code is not alphanumeric"), "") } - if len(code) < 4 || len(code) > 8 { + if len(code) < 4 || len(code) > 20 { return stacktrace.Propagate(ente.NewBadRequestWithMessage("code length should be between 4 and 8"), "") } err := c.StorageBonus.AddNewCode(ctx, userID, code, isAdminEdit) From 00865e3ee21fcb0ee76f69be25b45e0c7ad8495a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:23:04 +0530 Subject: [PATCH 0591/1179] Handle years Ref: https://github.com/wanasit/chrono/issues/296 --- .../new/photos/services/search/index.ts | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 4a2309e6bd..00ee4d4b77 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -3,6 +3,11 @@ import type { Component } from "chrono-node"; import * as chrono from "chrono-node"; import type { SearchDateComponents } from "./types"; +interface DateSearchResult { + components: SearchDateComponents; + formattedDate: string; +} + /** * Try to parse an arbitrary search string into sets of date components. * @@ -17,9 +22,14 @@ import type { SearchDateComponents } from "./types"; * In addition, also return a formatted representation of the "best" guess at * the date that was intended by the search string. */ -export const parseDateComponents = ( - s: string, -): { components: SearchDateComponents; formattedDate: string }[] => +export const parseDateComponents = (s: string): DateSearchResult[] => { + const result = parseChrono(s); + if (result.length) return result; + // chrono does not parse years like "2024", so do it manually. + return parseYearComponents(s); +}; + +export const parseChrono = (s: string): DateSearchResult[] => chrono.parse(s).map((result) => { const p = result.start; const component = (s: Component) => @@ -41,3 +51,16 @@ export const parseDateComponents = ( const formattedDate = formatter.format(p.date()); return { components, formattedDate }; }); + +/** Parse a string like "2024" into a date search result. */ +const parseYearComponents = (s: string): DateSearchResult[] => { + // s is already trimmed + if (s.length == 4) { + const year = parseInt(s); + if (year > 0 && year <= 9999) { + const components = { year }; + return [{ components, formattedDate: s }]; + } + } + return []; +}; From 039055ccc050060afdff9384a5701d54815e1b9d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:24:30 +0530 Subject: [PATCH 0592/1179] Dedup --- web/apps/photos/src/services/searchService.ts | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 38641ba9ed..ce59404ad6 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -47,7 +47,6 @@ export const getAutoCompleteSuggestions = await getClipSuggestion(searchPhrase), ...getFileTypeSuggestion(searchPhrase), ...getHolidaySuggestion(searchPhrase), - ...getYearSuggestion(searchPhrase), ...getDateSuggestion(searchPhrase), ...getCollectionSuggestion(searchPhrase, collections), getFileNameSuggestion(searchPhrase, files), @@ -138,26 +137,6 @@ function getHolidaySuggestion(searchPhrase: string): Suggestion[] { ); } -function getYearSuggestion(searchPhrase: string): Suggestion[] { - if (searchPhrase.length === 4) { - try { - const year = parseInt(searchPhrase); - if (year >= 1970 && year <= new Date().getFullYear()) { - return [ - { - label: searchPhrase, - value: { year }, - type: SuggestionType.DATE, - }, - ]; - } - } catch (e) { - log.error("getYearSuggestion failed", e); - } - } - return []; -} - export async function getAllPeopleSuggestion(): Promise> { try { const people = await getAllPeople(200); From 177d3dcccfbc7512ececa242979c22dfc54e8339 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:27:28 +0530 Subject: [PATCH 0593/1179] Guarantees --- web/apps/photos/src/worker/search.worker.ts | 4 +- .../new/photos/services/search/index.ts | 45 ++++++++++--------- .../new/photos/services/search/types.ts | 4 +- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index 41cc61d636..6308a8d3c5 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -71,8 +71,8 @@ const isDateComponentsMatch = ( { year, month, day, weekday }: SearchDateComponents, date: Date, ) => { - // Components are guaranteed to have at least one component, so start by - // assuming true. + // Components are guaranteed to have at least one attribute present, so + // start by assuming true. let match = true; if (year) match = date.getFullYear() == year; diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 00ee4d4b77..26cce2f230 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -30,34 +30,39 @@ export const parseDateComponents = (s: string): DateSearchResult[] => { }; export const parseChrono = (s: string): DateSearchResult[] => - chrono.parse(s).map((result) => { - const p = result.start; - const component = (s: Component) => - p.isCertain(s) ? nullToUndefined(p.get(s)) : undefined; + chrono + .parse(s) + .map((result) => { + const p = result.start; + const component = (s: Component) => + p.isCertain(s) ? nullToUndefined(p.get(s)) : undefined; - const year = component("year"); - const month = component("month"); - const day = component("day"); - const weekday = component("weekday"); - const components = { year, month, day, weekday }; + const year = component("year"); + const month = component("month"); + const day = component("day"); + const weekday = component("weekday"); - const format: Intl.DateTimeFormatOptions = {}; - if (year) format.year = "numeric"; - if (month) format.month = "long"; - if (day) format.day = "numeric"; - if (weekday) format.weekday = "long"; + if (!year && !month && !day && !weekday) return undefined; + const components = { year, month, day, weekday }; - const formatter = new Intl.DateTimeFormat(undefined, format); - const formattedDate = formatter.format(p.date()); - return { components, formattedDate }; - }); + const format: Intl.DateTimeFormatOptions = {}; + if (year) format.year = "numeric"; + if (month) format.month = "long"; + if (day) format.day = "numeric"; + if (weekday) format.weekday = "long"; + + const formatter = new Intl.DateTimeFormat(undefined, format); + const formattedDate = formatter.format(p.date()); + return { components, formattedDate }; + }) + .filter((x) => x !== undefined); /** Parse a string like "2024" into a date search result. */ const parseYearComponents = (s: string): DateSearchResult[] => { - // s is already trimmed + // s is already trimmed. if (s.length == 4) { const year = parseInt(s); - if (year > 0 && year <= 9999) { + if (year && year <= 9999) { const components = { year }; return [{ components, formattedDate: s }]; } diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index a33c7ac21e..458de6a8b9 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -8,8 +8,8 @@ import type { EnteFile } from "../../types/file"; /** * A parsed version of a potential natural language date time string. * - * The components which were parsed will be set. The type doesn't enforce this, - * but at least one component will be present. + * All attributes which were parsed will be set. The type doesn't enforce this, + * but it is guaranteed that at least one attribute will be present. */ export interface SearchDateComponents { /** From 44a6f256d6845c1a14dfe9d68ae92ce0e1f25b11 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 17:16:38 +0200 Subject: [PATCH 0594/1179] [mob][photos] Show errored faces count --- mobile/lib/db/ml/db.dart | 8 ++++++++ .../ui/settings/debug/ml_debug_section_widget.dart | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 94fea81090..5f5cb7af35 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -660,6 +660,14 @@ class MLDataDB { return maps.first['count'] as int; } + Future getErroredFaceCount() async { + final db = await instance.asyncDB; + final List> maps = await db.getAll( + 'SELECT COUNT(*) as count FROM $facesTable WHERE $faceScore < 0', + ); + return maps.first['count'] as int; + } + Future getClusteredOrFacelessFileCount() async { final db = await instance.asyncDB; final List> clustered = await db.getAll( diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index a3bd5c1a7f..0d00275990 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -256,6 +256,19 @@ class _MLDebugSectionWidgetState extends State { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Show empty indexes", + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + final emptyFaces = await MLDataDB.instance.getErroredFaceCount(); + showShortToast(context, '$emptyFaces empty faces'); + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( title: "Reset faces feedback", @@ -346,6 +359,7 @@ class _MLDebugSectionWidgetState extends State { ); }, ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( title: "Reset all local clip", From d4a59983cbfba982b19519d20700a282d717be6a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:46:24 +0530 Subject: [PATCH 0595/1179] Fix holiday parsing --- web/apps/photos/src/services/searchService.ts | 32 ++----------------- .../new/photos/services/search/index.ts | 31 +++++++++++------- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index ce59404ad6..02a0062270 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -46,7 +46,6 @@ export const getAutoCompleteSuggestions = const suggestions: Suggestion[] = [ await getClipSuggestion(searchPhrase), ...getFileTypeSuggestion(searchPhrase), - ...getHolidaySuggestion(searchPhrase), ...getDateSuggestion(searchPhrase), ...getCollectionSuggestion(searchPhrase, collections), getFileNameSuggestion(searchPhrase, files), @@ -110,33 +109,6 @@ function getFileTypeSuggestion(searchPhrase: string): Suggestion[] { ); } -function getHolidaySuggestion(searchPhrase: string): Suggestion[] { - return [ - { - label: t("CHRISTMAS"), - value: { month: 12, date: 25 }, - type: SuggestionType.DATE, - }, - { - label: t("CHRISTMAS_EVE"), - value: { month: 12, date: 24 }, - type: SuggestionType.DATE, - }, - { - label: t("NEW_YEAR"), - value: { month: 1, date: 1 }, - type: SuggestionType.DATE, - }, - { - label: t("NEW_YEAR_EVE"), - value: { month: 12, date: 31 }, - type: SuggestionType.DATE, - }, - ].filter((suggestion) => - suggestion.label.toLowerCase().includes(searchPhrase), - ); -} - export async function getAllPeopleSuggestion(): Promise> { try { const people = await getAllPeople(200); @@ -187,10 +159,10 @@ export async function getMLStatusSuggestion(): Promise { } const getDateSuggestion = (searchPhrase: string): Suggestion[] => - parseDateComponents(searchPhrase).map(({ components, formattedDate }) => ({ + parseDateComponents(searchPhrase).map(({ components, label }) => ({ type: SuggestionType.DATE, value: components, - label: formattedDate, + label, })); function getCollectionSuggestion( diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 26cce2f230..e421988633 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -1,11 +1,12 @@ import { nullToUndefined } from "@/utils/transform"; import type { Component } from "chrono-node"; import * as chrono from "chrono-node"; +import { t } from "i18next"; import type { SearchDateComponents } from "./types"; interface DateSearchResult { components: SearchDateComponents; - formattedDate: string; + label: string; } /** @@ -22,12 +23,10 @@ interface DateSearchResult { * In addition, also return a formatted representation of the "best" guess at * the date that was intended by the search string. */ -export const parseDateComponents = (s: string): DateSearchResult[] => { - const result = parseChrono(s); - if (result.length) return result; - // chrono does not parse years like "2024", so do it manually. - return parseYearComponents(s); -}; +export const parseDateComponents = (s: string): DateSearchResult[] => + parseChrono(s) + .concat(parseYearComponents(s)) + .concat(parseHolidayComponents(s)); export const parseChrono = (s: string): DateSearchResult[] => chrono @@ -52,20 +51,30 @@ export const parseChrono = (s: string): DateSearchResult[] => if (weekday) format.weekday = "long"; const formatter = new Intl.DateTimeFormat(undefined, format); - const formattedDate = formatter.format(p.date()); - return { components, formattedDate }; + const label = formatter.format(p.date()); + return { components, label }; }) .filter((x) => x !== undefined); -/** Parse a string like "2024" into a date search result. */ +/** chrono does not parse years like "2024", so do it manually. */ const parseYearComponents = (s: string): DateSearchResult[] => { // s is already trimmed. if (s.length == 4) { const year = parseInt(s); if (year && year <= 9999) { const components = { year }; - return [{ components, formattedDate: s }]; + return [{ components, label: s }]; } } return []; }; + +const holidays: DateSearchResult[] = [ + { components: { month: 12, day: 25 }, label: t("CHRISTMAS") }, + { components: { month: 12, day: 24 }, label: t("CHRISTMAS_EVE") }, + { components: { month: 1, day: 1 }, label: t("NEW_YEAR") }, + { components: { month: 12, day: 31 }, label: t("NEW_YEAR_EVE") }, +]; + +const parseHolidayComponents = (s: string) => + holidays.filter(({ label }) => label.toLowerCase().includes(s)); From a1237dfafe20ccc6c83333e57e38a0f9867c6c96 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 20:55:42 +0530 Subject: [PATCH 0596/1179] Fix undefineds --- web/packages/new/photos/services/search/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index e421988633..75e98e280c 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -69,7 +69,8 @@ const parseYearComponents = (s: string): DateSearchResult[] => { return []; }; -const holidays: DateSearchResult[] = [ +// This cannot be a const, it needs to be evaluated lazily for the t() to work. +const holidays = (): DateSearchResult[] => [ { components: { month: 12, day: 25 }, label: t("CHRISTMAS") }, { components: { month: 12, day: 24 }, label: t("CHRISTMAS_EVE") }, { components: { month: 1, day: 1 }, label: t("NEW_YEAR") }, @@ -77,4 +78,4 @@ const holidays: DateSearchResult[] = [ ]; const parseHolidayComponents = (s: string) => - holidays.filter(({ label }) => label.toLowerCase().includes(s)); + holidays().filter(({ label }) => label.toLowerCase().includes(s)); From 0e0f06d9a6765c815277596dd5929ad42bac92d3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 23 Aug 2024 21:02:07 +0530 Subject: [PATCH 0597/1179] [server] Handle invalid domain err --- server/pkg/utils/email/email.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index f3ddbe67b1..57ce28f6e1 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -20,6 +20,11 @@ import ( "github.com/spf13/viper" ) +var knownInvalidEmailErrors = []string{ + "Invalid RCPT TO address provided", + "Invalid domain name", +} + // Send sends an email func Send(toEmails []string, fromName string, fromEmail string, subject string, htmlBody string, inlineImages []map[string]interface{}) error { smtpHost := viper.GetString("smtp.host") @@ -92,8 +97,11 @@ func sendViaSMTP(toEmails []string, fromName string, fromEmail string, subject s auth := smtp.PlainAuth("", smtpUsername, smtpPassword, smtpServer) err := smtp.SendMail(smtpServer+":"+smtpPort, auth, fromEmail, []string{toEmail}, []byte(emailMessage)) if err != nil { - if strings.Contains(err.Error(), "Invalid RCPT TO address provided") { - return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid email %s", toEmail)), err.Error()) + errMsg := err.Error() + for _, knownError := range knownInvalidEmailErrors { + if strings.Contains(errMsg, knownError) { + return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid email %s", toEmail)), errMsg) + } } return stacktrace.Propagate(err, "") } From ee3a9202278d3c837beded599d7952306657bd39 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 21:11:21 +0530 Subject: [PATCH 0598/1179] Hour --- web/apps/photos/src/worker/search.worker.ts | 3 ++- web/packages/new/photos/services/search/index.ts | 6 ++++-- web/packages/new/photos/services/search/types.ts | 5 +++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index 6308a8d3c5..660a40108d 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -68,7 +68,7 @@ function isSearchedFile(file: EnteFile, search: Search) { } const isDateComponentsMatch = ( - { year, month, day, weekday }: SearchDateComponents, + { year, month, day, weekday, hour }: SearchDateComponents, date: Date, ) => { // Components are guaranteed to have at least one attribute present, so @@ -80,6 +80,7 @@ const isDateComponentsMatch = ( if (match && month) match = date.getMonth() + 1 == month; if (match && day) match = date.getDate() == day; if (match && weekday) match = date.getDay() == weekday; + if (match && hour) match = date.getHours() == hour; return match; }; diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 75e98e280c..586e0d08f4 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -40,15 +40,17 @@ export const parseChrono = (s: string): DateSearchResult[] => const month = component("month"); const day = component("day"); const weekday = component("weekday"); + const hour = component("hour"); - if (!year && !month && !day && !weekday) return undefined; - const components = { year, month, day, weekday }; + if (!year && !month && !day && !weekday && !hour) return undefined; + const components = { year, month, day, weekday, hour }; const format: Intl.DateTimeFormatOptions = {}; if (year) format.year = "numeric"; if (month) format.month = "long"; if (day) format.day = "numeric"; if (weekday) format.weekday = "long"; + if (hour) format.hour = "2-digit"; const formatter = new Intl.DateTimeFormat(undefined, format); const label = formatter.format(p.date()); diff --git a/web/packages/new/photos/services/search/types.ts b/web/packages/new/photos/services/search/types.ts index 458de6a8b9..f80a4b4565 100644 --- a/web/packages/new/photos/services/search/types.ts +++ b/web/packages/new/photos/services/search/types.ts @@ -30,6 +30,11 @@ export interface SearchDateComponents { * specified one. */ weekday?: number; + /** + * The hour of the day (0 to 23, with 0 as midnight), if the search string + * specified one. + */ + hour?: number; } /** From abd5234e7c05b5f2c51b514da9dfd604e99f78a5 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 23 Aug 2024 17:48:18 +0200 Subject: [PATCH 0599/1179] [mob][photos] resolve merge conflict --- mobile/lib/models/ml/ml_versions.dart | 4 +++- mobile/lib/services/machine_learning/ml_service.dart | 2 +- mobile/lib/utils/ml_util.dart | 7 +++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mobile/lib/models/ml/ml_versions.dart b/mobile/lib/models/ml/ml_versions.dart index a52982fb23..2d382209dc 100644 --- a/mobile/lib/models/ml/ml_versions.dart +++ b/mobile/lib/models/ml/ml_versions.dart @@ -1,7 +1,9 @@ +import "dart:io" show Platform; + const faceMlVersion = 1; const clipMlVersion = 1; const clusterMlVersion = 1; const minimumClusterSize = 2; const embeddingFetchLimit = 200; -const fileDownloadMlLimit = 10; +final fileDownloadMlLimit = Platform.isIOS ? 5 : 10; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index d54d45000c..5a562b710b 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -170,7 +170,7 @@ class MLService { _isIndexingOrClusteringRunning = true; _logger.info('starting image indexing'); final Stream> instructionStream = - fetchEmbeddingsAndInstructions(); + fetchEmbeddingsAndInstructions(fileDownloadMlLimit); int fileAnalyzedCount = 0; final Stopwatch stopwatch = Stopwatch()..start(); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index c30872c4bf..13fb1474c7 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -152,9 +152,8 @@ Future> getFilesForMlIndexing() async { return sortedBylocalID; } -Stream> fetchEmbeddingsAndInstructions({ - int yieldSize = fileDownloadMlLimit, -}) async* { +Stream> fetchEmbeddingsAndInstructions( + int yieldSize,) async* { final List filesToIndex = await getFilesForMlIndexing(); final List> chunks = filesToIndex.chunks(embeddingFetchLimit); @@ -167,7 +166,7 @@ Stream> fetchEmbeddingsAndInstructions({ for (final batch in batches) { yield batch; } - continue; + continue; } final Set ids = {}; final Map pendingIndex = {}; From a84aa346f502f659411da14afcbd59147728c07a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 21:28:26 +0530 Subject: [PATCH 0600/1179] Better hours --- web/packages/new/photos/services/search/index.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/search/index.ts b/web/packages/new/photos/services/search/index.ts index 586e0d08f4..d5d3154f5e 100644 --- a/web/packages/new/photos/services/search/index.ts +++ b/web/packages/new/photos/services/search/index.ts @@ -1,7 +1,7 @@ import { nullToUndefined } from "@/utils/transform"; import type { Component } from "chrono-node"; import * as chrono from "chrono-node"; -import { t } from "i18next"; +import i18n, { t } from "i18next"; import type { SearchDateComponents } from "./types"; interface DateSearchResult { @@ -50,9 +50,12 @@ export const parseChrono = (s: string): DateSearchResult[] => if (month) format.month = "long"; if (day) format.day = "numeric"; if (weekday) format.weekday = "long"; - if (hour) format.hour = "2-digit"; + if (hour) { + format.hour = "numeric"; + format.dayPeriod = "short"; + } - const formatter = new Intl.DateTimeFormat(undefined, format); + const formatter = new Intl.DateTimeFormat(i18n.language, format); const label = formatter.format(p.date()); return { components, label }; }) From 68d722d06bd0d620c57bd331ea29ef8d8b6bbf87 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 21:37:18 +0530 Subject: [PATCH 0601/1179] Use UI date --- web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx | 4 ++-- web/apps/photos/src/worker/search.worker.ts | 4 +++- web/packages/shared/file-metadata.ts | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx index a1c771a795..801fcfe38e 100644 --- a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx @@ -20,7 +20,7 @@ import { formattedByteSize } from "@/new/photos/utils/units"; import CopyButton from "@ente/shared/components/CodeBlock/CopyButton"; import { FlexWrapper } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; -import { getPublicMagicMetadataMTSync } from "@ente/shared/file-metadata"; +import { getPublicMagicMetadataSync } from "@ente/shared/file-metadata"; import { formatDate, formatTime } from "@ente/shared/time/format"; import CalendarTodayIcon from "@mui/icons-material/CalendarToday"; import CameraOutlined from "@mui/icons-material/CameraOutlined"; @@ -366,7 +366,7 @@ export const CreationTime: React.FC = ({ const openEditMode = () => setIsInEditMode(true); const closeEditMode = () => setIsInEditMode(false); - const publicMagicMetadata = getPublicMagicMetadataMTSync(enteFile); + const publicMagicMetadata = getPublicMagicMetadataSync(enteFile); const originalDate = getUICreationDate(enteFile, publicMagicMetadata); const saveEdits = async (pickedTime: ParsedMetadataDate) => { diff --git a/web/apps/photos/src/worker/search.worker.ts b/web/apps/photos/src/worker/search.worker.ts index 660a40108d..1100e3c223 100644 --- a/web/apps/photos/src/worker/search.worker.ts +++ b/web/apps/photos/src/worker/search.worker.ts @@ -1,5 +1,7 @@ +import { getUICreationDate } from "@/media/file-metadata"; import type { SearchDateComponents } from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; +import { getPublicMagicMetadataSync } from "@ente/shared/file-metadata"; import * as Comlink from "comlink"; import { isInsideCity, @@ -31,7 +33,7 @@ function isSearchedFile(file: EnteFile, search: Search) { if (search?.date) { return isDateComponentsMatch( search.date, - new Date(file.metadata.creationTime / 1000), + getUICreationDate(file, getPublicMagicMetadataSync(file)), ); } if (search?.location) { diff --git a/web/packages/shared/file-metadata.ts b/web/packages/shared/file-metadata.ts index a5608ed382..0723a975ef 100644 --- a/web/packages/shared/file-metadata.ts +++ b/web/packages/shared/file-metadata.ts @@ -8,7 +8,7 @@ import { fileLogID } from "@/new/photos/utils/file"; /** * On-demand decrypt the public magic metadata for an {@link EnteFile} for code - * running on the main thread, but do it synchronously. + * running synchronously. * * It both modifies the given file object, and also returns the decrypted * metadata. @@ -18,7 +18,7 @@ import { fileLogID } from "@/new/photos/utils/file"; * check and should be a no-op in usually. On debug builds it'll throw if it * finds its assumptions broken. */ -export const getPublicMagicMetadataMTSync = (enteFile: EnteFile) => { +export const getPublicMagicMetadataSync = (enteFile: EnteFile) => { if (!enteFile.pubMagicMetadata) return undefined; if (typeof enteFile.pubMagicMetadata.data == "string") { if (isDevBuild) From 5fd92096c9b4bf62a3489682323eb5a039982774 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 21:41:25 +0530 Subject: [PATCH 0602/1179] Add CHANGELOG entry --- desktop/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index 94afb2ad16..a48bbf7ab0 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -2,6 +2,7 @@ ## v1.7.4 (Unreleased) +- Improved date search, including support for day of week and hour of day. - . ## v1.7.3 From 3cca9512dfe0d83a592b156f7d51ba6e6ba52ac8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 23 Aug 2024 21:43:40 +0530 Subject: [PATCH 0603/1179] LF --- .../src/components/Search/SearchBar/searchInput/index.tsx | 8 +++++--- web/packages/new/photos/components/PeopleList.tsx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx index 1317464b49..18b7289915 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx @@ -1,6 +1,9 @@ import { FileType } from "@/media/file-type"; import { isMLEnabled } from "@/new/photos/services/ml"; -import type { SearchPerson } from "@/new/photos/services/search"; +import type { + SearchDateComponents, + SearchPerson, +} from "@/new/photos/services/search/types"; import { EnteFile } from "@/new/photos/types/file"; import CloseIcon from "@mui/icons-material/Close"; import { IconButton } from "@mui/material"; @@ -21,7 +24,6 @@ import { Collection } from "types/collection"; import { LocationTagData } from "types/entity"; import { ClipSearchScores, - DateValue, Search, SearchOption, SuggestionType, @@ -118,7 +120,7 @@ export default function SearchInput(props: Iprops) { switch (selectedOption.type) { case SuggestionType.DATE: search = { - date: selectedOption.value as DateValue, + date: selectedOption.value as SearchDateComponents, }; props.setIsOpen(true); break; diff --git a/web/packages/new/photos/components/PeopleList.tsx b/web/packages/new/photos/components/PeopleList.tsx index d3d6fe0c9c..7c42d157dd 100644 --- a/web/packages/new/photos/components/PeopleList.tsx +++ b/web/packages/new/photos/components/PeopleList.tsx @@ -3,7 +3,7 @@ import type { EnteFile } from "@/new/photos/types/file"; import { Skeleton, Typography, styled } from "@mui/material"; import { t } from "i18next"; import React, { useEffect, useState } from "react"; -import type { SearchPerson } from "../services/search"; +import type { SearchPerson } from "../services/search/types"; export interface PeopleListProps { people: SearchPerson[]; From de341b262177340b840d8e908e1504a7a77ecad0 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Fri, 23 Aug 2024 23:00:04 +0530 Subject: [PATCH 0604/1179] [photos] v0.9.28 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 3458c66b2f..66fcf99443 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.27+927 +version: 0.9.28+928 publish_to: none environment: From a61b52ac1016e75f3433ca62ba122bc9f9691477 Mon Sep 17 00:00:00 2001 From: "green." <41323182+greeeen-dev@users.noreply.github.com> Date: Fri, 23 Aug 2024 20:46:00 +0200 Subject: [PATCH 0605/1179] Update index.md --- docs/docs/auth/migration-guides/authy/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/auth/migration-guides/authy/index.md b/docs/docs/auth/migration-guides/authy/index.md index c72becd001..eae1f25545 100644 --- a/docs/docs/auth/migration-guides/authy/index.md +++ b/docs/docs/auth/migration-guides/authy/index.md @@ -1,5 +1,5 @@ --- -title: Migrating from Authy +title: (Obsolete) Migrating from Authy description: Guide for importing your existing Authy 2FA tokens into Ente Auth --- @@ -9,9 +9,9 @@ A guide written by Green, an ente.io lover > [!WARNING] > -> Authy will soon be dropping support for its desktop apps in the near future. -> If you are looking to switch to Ente Authenticator from Authy, I heavily -> recommend you export your codes as soon as you can. +> Authy has dropped all support for its desktop apps. It is no longer possible +> to export data from Authy using these methods. You will need to reconfigure +> 2FA for each of your accounts. --- From fa72aac869ea7b33fe58b7cbe06c04c79cea8a94 Mon Sep 17 00:00:00 2001 From: Johannes7k75 <57235955+Johannes7k75@users.noreply.github.com> Date: Fri, 23 Aug 2024 23:24:05 +0200 Subject: [PATCH 0606/1179] Update TransformMenu.tsx --- .../PhotoViewer/ImageEditorOverlay/TransformMenu.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx index 354baeb751..bea37b3df6 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx @@ -300,6 +300,9 @@ const TransformMenu = () => { } + style={{ + transform: "rotateZ(90deg)" + }} onClick={createFlipCanvasHandler("vertical")} label={t("FLIP_VERTICALLY")} /> From 26c2d9a9ddbdaa58ae2927594d463da61be762cf Mon Sep 17 00:00:00 2001 From: Johannes7k75 Date: Fri, 23 Aug 2024 23:30:04 +0200 Subject: [PATCH 0607/1179] fix rotation of vertical mirror --- .../PhotoViewer/ImageEditorOverlay/TransformMenu.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx index bea37b3df6..d72278ef03 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx @@ -299,10 +299,7 @@ const TransformMenu = () => { > } - style={{ - transform: "rotateZ(90deg)" - }} + startIcon={} onClick={createFlipCanvasHandler("vertical")} label={t("FLIP_VERTICALLY")} /> From 9f166d2e48f9a87737754f6c74030d5909d9d29b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 11:22:13 +0530 Subject: [PATCH 0608/1179] [desktop] Remove unnecessary readwrite tx --- web/packages/new/photos/services/ml/db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index f0499a12ca..f6d2043752 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -374,7 +374,7 @@ export const updateAssumingLocalFiles = async ( */ export const indexableAndIndexedCounts = async () => { const db = await mlDB(); - const tx = db.transaction("file-status", "readwrite"); + const tx = db.transaction("file-status", "readonly"); const indexableCount = await tx.store .index("status") .count(IDBKeyRange.only("indexable")); From a9f0da7ed3c9eb11ef34a505333813f257e0c02f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 12:36:55 +0530 Subject: [PATCH 0609/1179] Move --- .../src/services/upload/uploadManager.ts | 19 +++++-------------- .../src/services/upload/uploadService.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 4b9156685e..dfa51d242f 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -1,6 +1,5 @@ import { createComlinkCryptoWorker } from "@/base/crypto"; import { type CryptoWorker } from "@/base/crypto/worker"; -import { ensureElectron } from "@/base/electron"; import { lowercaseExtension, nameAndExtension } from "@/base/file"; import log from "@/base/log"; import type { Electron } from "@/base/types/ipc"; @@ -35,7 +34,11 @@ import { tryParseTakeoutMetadataJSON, type ParsedMetadataJSON, } from "./takeout"; -import UploadService, { uploadItemFileName, uploader } from "./uploadService"; +import UploadService, { + uploadItemFileName, + uploadItemSize, + uploader, +} from "./uploadService"; export type FileID = number; @@ -978,18 +981,6 @@ const removePotentialLivePhotoSuffix = (name: string, suffix?: string) => { return foundSuffix ? name.slice(0, foundSuffix.length * -1) : name; }; -/** - * Return the size of the given {@link uploadItem}. - */ -const uploadItemSize = async (uploadItem: UploadItem): Promise => { - if (uploadItem instanceof File) return uploadItem.size; - if (typeof uploadItem == "string") - return ensureElectron().pathOrZipItemSize(uploadItem); - if (Array.isArray(uploadItem)) - return ensureElectron().pathOrZipItemSize(uploadItem); - return uploadItem.file.size; -}; - /** * [Note: Memory pressure when uploading video files] * diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index fca23c01b0..d83eaa15de 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -846,6 +846,18 @@ const tryExtractVideoMetadata = async (uploadItem: UploadItem) => { } }; +/** + * Return the size of the given {@link uploadItem}. + */ +export const uploadItemSize = async (uploadItem: UploadItem): Promise => { + if (uploadItem instanceof File) return uploadItem.size; + if (typeof uploadItem == "string") + return ensureElectron().pathOrZipItemSize(uploadItem); + if (Array.isArray(uploadItem)) + return ensureElectron().pathOrZipItemSize(uploadItem); + return uploadItem.file.size; +}; + const computeHash = async (uploadItem: UploadItem, worker: CryptoWorker) => { const { stream, chunkCount } = await readUploadItem(uploadItem); const hashState = await worker.initChunkHashing(); From 66c88fa067b2d1500ae0541c792efcf42ac8cca7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 12:57:23 +0530 Subject: [PATCH 0610/1179] [mob] Fix type error --- .../face_ml/face_clustering/face_clustering_service.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index 1319c65409..f3064dbb60 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -263,8 +263,8 @@ class FaceClusteringService { Future predictWithinClusterComputer( Map input, { Map? fileIDToCreationTime, - Map oldClusterSummaries = - const {}, + Map oldClusterSummaries = + const {}, double distanceThreshold = kRecommendedDistanceThreshold, }) async { _logger.info( @@ -366,7 +366,7 @@ class FaceClusteringService { Future predictCompleteComputer( Map input, { Map? fileIDToCreationTime, - required Map oldClusterSummaries, + required Map oldClusterSummaries, double distanceThreshold = kRecommendedDistanceThreshold, double mergeThreshold = 0.30, }) async { From 63e21126f5747331f880eb897847b0f39ced4b82 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 12:58:40 +0530 Subject: [PATCH 0611/1179] [mob] Show delete face option on face group page --- mobile/lib/models/gallery_type.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/models/gallery_type.dart b/mobile/lib/models/gallery_type.dart index b73c0e080f..fb07f23a0a 100644 --- a/mobile/lib/models/gallery_type.dart +++ b/mobile/lib/models/gallery_type.dart @@ -82,13 +82,13 @@ extension GalleyTypeExtension on GalleryType { case GalleryType.locationTag: case GalleryType.quickLink: case GalleryType.peopleTag: + case GalleryType.cluster: return true; case GalleryType.trash: case GalleryType.archive: case GalleryType.hiddenSection: case GalleryType.hiddenOwnedCollection: case GalleryType.sharedCollection: - case GalleryType.cluster: return false; } } From 18a6af3776d655f87e5b7c9b1b7af33d7585e42b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 13:07:46 +0530 Subject: [PATCH 0612/1179] Alt --- .../src/services/upload/uploadService.ts | 62 +++++++++++++++++-- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index d83eaa15de..2a60e7242f 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -764,6 +764,10 @@ const extractImageOrVideoMetadata = async ( const hash = await computeHash(uploadItem, worker); + // Some of this logic is duplicated below in `uploadItemCreationDate`. + // + // See: [Note: Duplicate retrieval of creation date for live photo clubbing] + const parsedMetadataJSON = matchTakeoutMetadata( fileName, collectionID, @@ -811,7 +815,7 @@ const extractImageOrVideoMetadata = async ( const tryExtractImageMetadata = async ( uploadItem: UploadItem, - lastModifiedMs: number, + lastModifiedMs: number | undefined, ): Promise => { let file: File; if (typeof uploadItem == "string" || Array.isArray(uploadItem)) { @@ -820,9 +824,8 @@ const tryExtractImageMetadata = async ( // reasonable to read the entire stream into memory here. const { response } = await readStream(ensureElectron(), uploadItem); const path = typeof uploadItem == "string" ? uploadItem : uploadItem[1]; - file = new File([await response.arrayBuffer()], basename(path), { - lastModified: lastModifiedMs, - }); + const opts = lastModifiedMs ? { lastModified: lastModifiedMs } : {}; + file = new File([await response.arrayBuffer()], basename(path), opts); } else if (uploadItem instanceof File) { file = uploadItem; } else { @@ -846,10 +849,59 @@ const tryExtractVideoMetadata = async (uploadItem: UploadItem) => { } }; +/** + * Return the creation date for the given {@link uploadItem}. + * + * [Note: Duplicate retrieval of creation date for live photo clubbing] + * + * This function duplicates some logic of {@link extractImageOrVideoMetadata}. + * This duplication, while not good, is currently unavoidable with the way the + * code is structured since the live photo clubbing happens at an earlier time + * in the pipeline when we don't have the Exif data, but the Exif data is needed + * to determine the file's creation time (to ensure that we only club photos and + * videos with close by creation times, instead of just relying on file names). + * + * Note that unlike {@link extractImageOrVideoMetadata}, we don't try to + * fallback to the file's modification time. This is because for the purpose of + * live photo clubbing, we wish to use the creation date only in cases where we + * have it. + */ +export const uploadItemCreationDate = async ( + uploadItem: UploadItem, + fileTypeInfo: FileTypeInfo, + collectionID: number, + parsedMetadataJSONMap: Map, +) => { + const fileName = uploadItemFileName(uploadItem); + const { fileType } = fileTypeInfo; + + const parsedMetadataJSON = matchTakeoutMetadata( + fileName, + collectionID, + parsedMetadataJSONMap, + ); + + if (parsedMetadataJSON?.creationTime) + return parsedMetadataJSON?.creationTime; + + let parsedMetadata: ParsedMetadata; + if (fileType == FileType.image) { + parsedMetadata = await tryExtractImageMetadata(uploadItem, undefined); + } else if (fileType == FileType.video) { + parsedMetadata = await tryExtractVideoMetadata(uploadItem); + } else { + throw new Error(`Unexpected file type ${fileType} for ${uploadItem}`); + } + + return parsedMetadata.creationDate; +}; + /** * Return the size of the given {@link uploadItem}. */ -export const uploadItemSize = async (uploadItem: UploadItem): Promise => { +export const uploadItemSize = async ( + uploadItem: UploadItem, +): Promise => { if (uploadItem instanceof File) return uploadItem.size; if (typeof uploadItem == "string") return ensureElectron().pathOrZipItemSize(uploadItem); From c0f628ce2da3cf7a3fa65eca117045da392193e4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 13:15:15 +0530 Subject: [PATCH 0613/1179] Club into a live photo only if within 5 mins --- .../src/services/upload/uploadManager.ts | 31 +++++++++++++++++-- .../src/services/upload/uploadService.ts | 5 ++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index dfa51d242f..23e7d7a97e 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -35,6 +35,7 @@ import { type ParsedMetadataJSON, } from "./takeout"; import UploadService, { + uploadItemCreationDate, uploadItemFileName, uploadItemSize, uploader, @@ -427,7 +428,10 @@ class UploadManager { } if (mediaItems.length) { - const clusteredMediaItems = await clusterLivePhotos(mediaItems); + const clusteredMediaItems = await clusterLivePhotos( + mediaItems, + this.parsedMetadataJSONMap, + ); this.abortIfCancelled(); @@ -838,6 +842,7 @@ const markUploaded = async (electron: Electron, item: ClusteredUploadItem) => { */ const clusterLivePhotos = async ( items: UploadItemWithCollectionIDAndName[], + parsedMetadataJSONMap: Map, ) => { const result: ClusteredUploadItem[] = []; items @@ -865,7 +870,7 @@ const clusterLivePhotos = async ( collectionID: g.collectionID, uploadItem: g.uploadItem, }; - if (await areLivePhotoAssets(fa, ga)) { + if (await areLivePhotoAssets(fa, ga, parsedMetadataJSONMap)) { const [image, video] = fFileType == FileType.image ? [f, g] : [g, f]; result.push({ @@ -906,6 +911,7 @@ interface PotentialLivePhotoAsset { const areLivePhotoAssets = async ( f: PotentialLivePhotoAsset, g: PotentialLivePhotoAsset, + parsedMetadataJSONMap: Map, ) => { if (f.collectionID != g.collectionID) return false; @@ -952,6 +958,27 @@ const areLivePhotoAssets = async ( return false; } + // Finally, ensure that the creation times of the image and video are within + // some epsilon of each other. This is to avoid clubbing together unrelated + // items that coincidentally have the same name (this is not uncommon since, + // e.g. many cameras use a deterministic numbering scheme). + + const fDate = await uploadItemCreationDate( + f.uploadItem, + f.fileType, + f.collectionID, + parsedMetadataJSONMap, + ); + const gDate = await uploadItemCreationDate( + g.uploadItem, + g.fileType, + g.collectionID, + parsedMetadataJSONMap, + ); + if (!fDate || !gDate) return false; + const secondDelta = Math.abs(fDate - gDate) / 1e6; + if (secondDelta > 5 * 60 /* 5 mins */) return false; + return true; }; diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index 2a60e7242f..e8e907c3f1 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -868,12 +868,11 @@ const tryExtractVideoMetadata = async (uploadItem: UploadItem) => { */ export const uploadItemCreationDate = async ( uploadItem: UploadItem, - fileTypeInfo: FileTypeInfo, + fileType: FileType, collectionID: number, parsedMetadataJSONMap: Map, ) => { const fileName = uploadItemFileName(uploadItem); - const { fileType } = fileTypeInfo; const parsedMetadataJSON = matchTakeoutMetadata( fileName, @@ -893,7 +892,7 @@ export const uploadItemCreationDate = async ( throw new Error(`Unexpected file type ${fileType} for ${uploadItem}`); } - return parsedMetadata.creationDate; + return parsedMetadata.creationDate?.timestamp; }; /** From 0258df5f4102c766e8b6a551a73f74a5101b23da Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 13:53:39 +0530 Subject: [PATCH 0614/1179] [auth] Log provider when code parsing fails --- auth/lib/models/code.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/auth/lib/models/code.dart b/auth/lib/models/code.dart index 696d3f2fc1..1229bc61a5 100644 --- a/auth/lib/models/code.dart +++ b/auth/lib/models/code.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:ente_auth/models/code_display.dart'; import 'package:ente_auth/utils/totp_util.dart'; +import 'package:logging/logging.dart'; class Code { static const defaultDigits = 6; @@ -123,10 +124,11 @@ class Code { static Code fromOTPAuthUrl(String rawData, {CodeDisplay? display}) { Uri uri = Uri.parse(rawData); final issuer = _getIssuer(uri); + final account = _getAccount(uri); try { final code = Code( - _getAccount(uri), + account, issuer, _getDigits(uri), _getPeriod(uri), @@ -144,6 +146,8 @@ class Code { if (rawData.contains("#")) { return Code.fromOTPAuthUrl(rawData.replaceAll("#", '%23')); } else { + Logger("Code").warning( + 'Error while parsing code for issuer $issuer, $account', e); rethrow; } } From 5a35edbbabd569c230fa073f9549377032165346 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:09:24 +0530 Subject: [PATCH 0615/1179] [auth] Fix bug in importing account with special chars --- auth/lib/ui/settings/data/import/aegis_import.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth/lib/ui/settings/data/import/aegis_import.dart b/auth/lib/ui/settings/data/import/aegis_import.dart index cb5adb8d07..2360adb723 100644 --- a/auth/lib/ui/settings/data/import/aegis_import.dart +++ b/auth/lib/ui/settings/data/import/aegis_import.dart @@ -141,8 +141,8 @@ Future _processAegisExportFile( bool isFavorite = item['favorite'] ?? false; List tags = []; var kind = item['type']; - var account = item['name']; - var issuer = item['issuer']; + var account = Uri.encodeComponent(item['name']); + var issuer = Uri.encodeComponent(item['issuer']); var algorithm = item['info']['algo']; var secret = item['info']['secret']; var timer = item['info']['period']; From 724dcd97c1ead1a8f9c69b063849434c59b2251d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:22:35 +0530 Subject: [PATCH 0616/1179] [auth] Fix steam import from 2fas --- auth/lib/ui/settings/data/import/two_fas_import.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth/lib/ui/settings/data/import/two_fas_import.dart b/auth/lib/ui/settings/data/import/two_fas_import.dart index fa4ec5aede..d571c5971d 100644 --- a/auth/lib/ui/settings/data/import/two_fas_import.dart +++ b/auth/lib/ui/settings/data/import/two_fas_import.dart @@ -152,14 +152,14 @@ Future _process2FasExportFile( // Build the OTP URL String otpUrl; - if (kind.toLowerCase() == 'totp') { + if (kind.toLowerCase() == 'totp' || kind.toLowerCase() == 'steam') { otpUrl = 'otpauth://$kind/$issuer:$account?secret=$secret&issuer=$issuer&algorithm=$algorithm&digits=$digits&period=$timer'; } else if (kind.toLowerCase() == 'hotp') { otpUrl = 'otpauth://$kind/$issuer:$account?secret=$secret&issuer=$issuer&algorithm=$algorithm&digits=$digits&counter=$counter'; } else { - throw Exception('Invalid OTP type'); + throw Exception('Invalid OTP type ${kind.toLowerCase()}'); } parsedCodes.add(Code.fromOTPAuthUrl(otpUrl)); } From b8e89ac78a4346705a4c163f60a9f88418667068 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:28:19 +0530 Subject: [PATCH 0617/1179] [auth] Lint fixes --- auth/lib/models/code.dart | 4 +++- auth/lib/services/user_service.dart | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/auth/lib/models/code.dart b/auth/lib/models/code.dart index 1229bc61a5..5f7cc0f135 100644 --- a/auth/lib/models/code.dart +++ b/auth/lib/models/code.dart @@ -147,7 +147,9 @@ class Code { return Code.fromOTPAuthUrl(rawData.replaceAll("#", '%23')); } else { Logger("Code").warning( - 'Error while parsing code for issuer $issuer, $account', e); + 'Error while parsing code for issuer $issuer, $account', + e, + ); rethrow; } } diff --git a/auth/lib/services/user_service.dart b/auth/lib/services/user_service.dart index ca88796f15..313e96a8b1 100644 --- a/auth/lib/services/user_service.dart +++ b/auth/lib/services/user_service.dart @@ -581,7 +581,7 @@ class UserService { SetupSRPResponse.fromJson(response.data); final serverB = SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + // ignore: unused_local_variable final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); @@ -667,7 +667,8 @@ class UserService { final String srpB = createSessionResponse.data["srpB"]; final serverB = SRP6Util.decodeBigInt(base64Decode(srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + + // ignore: unused_local_variable final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); final response = await _dio.post( From 6baa1c08c5b567b8459067cb6c35ba3c9f5307f4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:09:32 +0530 Subject: [PATCH 0618/1179] [server] Admin endpoint to disable email mfa --- server/cmd/museum/main.go | 1 + server/pkg/api/admin.go | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index f2c2d8e2b3..4f600dffdb 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -643,6 +643,7 @@ func main() { adminAPI.POST("/user/disable-2fa", adminHandler.DisableTwoFactor) adminAPI.POST("/user/update-referral", adminHandler.UpdateReferral) adminAPI.POST("/user/disable-passkeys", adminHandler.RemovePasskeys) + adminAPI.POST("/user/disable-email-verification", adminHandler.DisableEmailVerification) adminAPI.POST("/user/close-family", adminHandler.CloseFamily) adminAPI.PUT("/user/change-email", adminHandler.ChangeEmail) adminAPI.DELETE("/user/delete", adminHandler.DeleteUser) diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 4783f2e98b..ba27bbe132 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -281,6 +281,32 @@ func (h *AdminHandler) RemovePasskeys(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } +func (h *AdminHandler) DisableEmailVerification(c *gin.Context) { + var request ente.AdminOpsForUserRequest + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Bad request")) + return + } + + go h.DiscordController.NotifyAdminAction( + fmt.Sprintf("Admin (%d) removing email mfa for account %d", auth.GetUserID(c.Request.Header), request.UserID)) + logger := logrus.WithFields(logrus.Fields{ + "user_id": request.UserID, + "admin_id": auth.GetUserID(c.Request.Header), + "req_id": requestid.Get(c), + "req_ctx": "disable_email_mfa", + }) + logger.Info("Initiate remove passkeys") + err := h.UserController.UpdateEmailMFA(c, request.UserID, false) + if err != nil { + logger.WithError(err).Error("Failed to disable email mfa") + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + logger.Info("Email MFA successfully removed") + c.JSON(http.StatusOK, gin.H{}) +} + func (h *AdminHandler) UpdateFeatureFlag(c *gin.Context) { var request ente.AdminUpdateKeyValueRequest if err := c.ShouldBindJSON(&request); err != nil { From 2a8ff8e1c869924ea49883304e21233169a16550 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 15:30:12 +0530 Subject: [PATCH 0619/1179] [docs] Mention FS times --- docs/docs/photos/faq/photo-dates.md | 62 +++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/docs/docs/photos/faq/photo-dates.md b/docs/docs/photos/faq/photo-dates.md index 506f24f566..cf2ea54b47 100644 --- a/docs/docs/photos/faq/photo-dates.md +++ b/docs/docs/photos/faq/photo-dates.md @@ -1,17 +1,22 @@ --- title: Photo dates -description: Ensuring correct metadata and dates in Ente Photos +description: Handling of metadata, in particular creation dates, in Ente Photos --- # Photos dates +This document describes Ente's handling of metadata, in particular photo +creation dates. + +## Import + Ente will import the date for your photos from three places: 1. Exif 2. Metadata JSON 3. File name -## Exif +### Exif Normally, Ente app tries to read the date of the photo from the Exif and other metadata (e.g. XMP, IPTC) embedded in the file. @@ -21,7 +26,7 @@ metadata (e.g. XMP, IPTC) embedded in the file. > You can see all of the Exif metadata embedded within a photo by using the > "View all Exif data" option in the info panel for the photo in Ente. -## Importing from Google takeout +### Importing from Google takeout In case of photos exported from Google Photos, the metadata is not embedded within the file itself, but is instead present in a separate sidecar ".json" @@ -41,7 +46,7 @@ importing that folder into Ente**. This way, we will be able to always correctly map, for example, `flower.jpeg` and `flower.json` and show the same date for `flower.jpeg` that you would've seen within Google Photos. -## Screenshots +### Screenshots In case the photo does not have a date in the Exif data (and it is not a Google takeout), for example, for screenshots or Whatsapp forwards, Ente will still try @@ -51,3 +56,52 @@ and deduce the correct date for the file from the name of the file. > > This process works great most of the time, but it is inherently based on > heuristics and is not exact. + +## Export + +Ente guarantees that you will get back the _exact_ same original photos and +videos that you imported. The modifications (e.g. date changes) you make within +Ente will be written into a separate metadata JSON file during export so as to +not modify the original. + +> There is one exception to this. For JPEG files, the Exif DateTimeOriginal is +> changed during export from web or desktop apps. This was done on a customer +> request, but in hindsight this has been an incorrect move. We are going to +> deprecate this behavior, and will instead provide separate tools (or +> functionality within the app itself) for customers who intentionally wish to +> modify their originals to reflect the associated metadata JSON. + +### File creation time. + +The photo's data will be preserved verbatim, however when it is written out to +disk on a new machine a new file gets created. This file will not have the same +file system creation time as the file that was uploaded. + +1. "Creation time" is not a universal concept, e.g. Linux does not support it. + From the man page of [fstat](https://linux.die.net/man/2/fstat), we can see + that this information is just not recorded by the file system on Linux. + +2. The isn't a way to set it even on Windows and macOS for files downloaded from + the browser, or for files saved from the mobile apps. + +We have considered modifying our desktop and CLI clients to write back the +photo's creation time into the creation time of the filesytem file during +export. But it is not clear if this would be less or more confusing. There are +two main downsides: + +1. It will be inconsistent. This behaviour would only happen on Windows and + macOS, and only when using the desktop or CLI, not for other Ente clients. + Learning from our experience of modifying DateTimeOriginal, we feel + consistency is important. + +2. It will require workarounds. e.g. for the desktop app, Node.js doesn't + natively support modifying the creation time (for similar reasons as + described above), and we will have to include binary packages like + [utimes](https://github.com/baileyherbert/utimes). + +We will also note that Ente is a photos app, not a file system backup app. The +customers for whom the creation time of the file on disk is paramount might be +better served by file backup apps, not a photos app. + +All this said though, nothing is set in stone. If enough customers deem it +important, we will prioritize adding support for the workaround. From 6786491d729e3f13d70b1789720982a97d0d1e23 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:35:53 +0530 Subject: [PATCH 0620/1179] [server] Add admin endpoint to add ott --- server/cmd/museum/main.go | 1 + server/ente/admin.go | 20 +++++++++++++++++ server/pkg/api/admin.go | 31 ++++++++++++++++++++++++++ server/pkg/controller/user/userauth.go | 14 ++++++++++++ 4 files changed, 66 insertions(+) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 4f600dffdb..c12bfa83bf 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -644,6 +644,7 @@ func main() { adminAPI.POST("/user/update-referral", adminHandler.UpdateReferral) adminAPI.POST("/user/disable-passkeys", adminHandler.RemovePasskeys) adminAPI.POST("/user/disable-email-verification", adminHandler.DisableEmailVerification) + adminAPI.POST("/user/add-ott", adminHandler.AddOtt) adminAPI.POST("/user/close-family", adminHandler.CloseFamily) adminAPI.PUT("/user/change-email", adminHandler.ChangeEmail) adminAPI.DELETE("/user/delete", adminHandler.DeleteUser) diff --git a/server/ente/admin.go b/server/ente/admin.go index 5434ea4553..a51ee5698b 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -23,6 +23,26 @@ type UpdateReferralCodeRequest struct { Code string `json:"code" binding:"required"` } +type AdminOttReq struct { + Email string `json:"email" binding:"required"` + Code string `json:"code" binding:"required"` + App App `json:"app" binding:"required"` + ExpiryTime int64 `json:"expiryTime" binding:"required"` +} + +func (a AdminOttReq) Validate() error { + if !a.App.IsValid() { + return errors.New("invalid app") + } + if a.ExpiryTime < time.Now().UnixMicro() { + return errors.New("expiry time should be in future") + } + if len(a.Code) < 6 { + return errors.New("invalid code length, should be at least 6 digit") + } + return nil +} + type AdminOpsForUserRequest struct { UserID int64 `json:"userID" binding:"required"` } diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index ba27bbe132..36680b3ab5 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -307,6 +307,37 @@ func (h *AdminHandler) DisableEmailVerification(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } +func (h *AdminHandler) AddOtt(c *gin.Context) { + var request ente.AdminOttReq + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Bad request")) + return + } + if err := request.Validate(); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage(err.Error()), "Bad request")) + return + } + + go h.DiscordController.NotifyAdminAction( + fmt.Sprintf("Admin (%d) adding custom ott", auth.GetUserID(c.Request.Header))) + logger := logrus.WithFields(logrus.Fields{ + "user_id": request.Email, + "code": request.Code, + "admin_id": auth.GetUserID(c.Request.Header), + "req_id": requestid.Get(c), + "req_ctx": "custom_ott", + }) + + err := h.UserController.AddAdminOtt(request) + if err != nil { + logger.WithError(err).Error("Failed to add ott") + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + logger.Info("Success added ott") + c.JSON(http.StatusOK, gin.H{}) +} + func (h *AdminHandler) UpdateFeatureFlag(c *gin.Context) { var request ente.AdminUpdateKeyValueRequest if err := c.ShouldBindJSON(&request); err != nil { diff --git a/server/pkg/controller/user/userauth.go b/server/pkg/controller/user/userauth.go index 8f662280f2..f57d95869b 100644 --- a/server/pkg/controller/user/userauth.go +++ b/server/pkg/controller/user/userauth.go @@ -134,6 +134,20 @@ func (c *UserController) SendEmailOTT(context *gin.Context, email string, purpos return nil } +func (c *UserController) AddAdminOtt(req ente.AdminOttReq) error { + emailHash, err := crypto.GetHash(req.Email, c.HashingKey) + if err != nil { + log.WithError(err).Error("Failed to get hash") + return nil + } + err = c.UserAuthRepo.AddOTT(emailHash, req.App, req.Code, req.ExpiryTime) + if err != nil { + log.WithError(err).Error("Failed to add ott") + return stacktrace.Propagate(err, "") + } + return nil +} + // verifyEmailOtt should be deprecated in favor of verifyEmailOttWithSession once clients are updated. func (c *UserController) verifyEmailOtt(context *gin.Context, email string, ott string) error { ott = strings.TrimSpace(ott) From 27546fb558fce078cd39e8e2e5b3959831d95fda Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:38:13 +0530 Subject: [PATCH 0621/1179] [server] Allow both enabling or removing email MFA --- server/cmd/museum/main.go | 2 +- server/ente/admin.go | 4 +++- server/pkg/api/admin.go | 14 +++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index c12bfa83bf..0536871755 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -643,7 +643,7 @@ func main() { adminAPI.POST("/user/disable-2fa", adminHandler.DisableTwoFactor) adminAPI.POST("/user/update-referral", adminHandler.UpdateReferral) adminAPI.POST("/user/disable-passkeys", adminHandler.RemovePasskeys) - adminAPI.POST("/user/disable-email-verification", adminHandler.DisableEmailVerification) + adminAPI.POST("/user/update-email-mfa", adminHandler.UpdateEmailMFA) adminAPI.POST("/user/add-ott", adminHandler.AddOtt) adminAPI.POST("/user/close-family", adminHandler.CloseFamily) adminAPI.PUT("/user/change-email", adminHandler.ChangeEmail) diff --git a/server/ente/admin.go b/server/ente/admin.go index a51ee5698b..828173be7f 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -3,6 +3,7 @@ package ente import ( "errors" "fmt" + "time" ) // GetEmailsFromHashesRequest represents a request to convert hashes @@ -44,7 +45,8 @@ func (a AdminOttReq) Validate() error { } type AdminOpsForUserRequest struct { - UserID int64 `json:"userID" binding:"required"` + UserID int64 `json:"userID" binding:"required"` + EmailMFA *bool `json:"emailMFA"` } // ReQueueItemRequest puts an item back into the queue for processing. diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 36680b3ab5..f1006a1d6b 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -281,15 +281,19 @@ func (h *AdminHandler) RemovePasskeys(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } -func (h *AdminHandler) DisableEmailVerification(c *gin.Context) { +func (h *AdminHandler) UpdateEmailMFA(c *gin.Context) { var request ente.AdminOpsForUserRequest if err := c.ShouldBindJSON(&request); err != nil { handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Bad request")) return } + if request.EmailMFA == nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("emailMFA is required"), "")) + return + } go h.DiscordController.NotifyAdminAction( - fmt.Sprintf("Admin (%d) removing email mfa for account %d", auth.GetUserID(c.Request.Header), request.UserID)) + fmt.Sprintf("Admin (%d) updating email mfa (%v) for account %d", auth.GetUserID(c.Request.Header), request.EmailMFA, request.UserID)) logger := logrus.WithFields(logrus.Fields{ "user_id": request.UserID, "admin_id": auth.GetUserID(c.Request.Header), @@ -297,13 +301,13 @@ func (h *AdminHandler) DisableEmailVerification(c *gin.Context) { "req_ctx": "disable_email_mfa", }) logger.Info("Initiate remove passkeys") - err := h.UserController.UpdateEmailMFA(c, request.UserID, false) + err := h.UserController.UpdateEmailMFA(c, request.UserID, *request.EmailMFA) if err != nil { - logger.WithError(err).Error("Failed to disable email mfa") + logger.WithError(err).Error("Failed to update email mfa") handler.Error(c, stacktrace.Propagate(err, "")) return } - logger.Info("Email MFA successfully removed") + logger.Info("Email MFA successfully updated") c.JSON(http.StatusOK, gin.H{}) } From c00d18cb5d5a601974f556996a5a19cccf8ca2af Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:39:45 +0530 Subject: [PATCH 0622/1179] minor refactor --- server/pkg/utils/email/email.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index 57ce28f6e1..5666aed556 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -98,8 +98,8 @@ func sendViaSMTP(toEmails []string, fromName string, fromEmail string, subject s err := smtp.SendMail(smtpServer+":"+smtpPort, auth, fromEmail, []string{toEmail}, []byte(emailMessage)) if err != nil { errMsg := err.Error() - for _, knownError := range knownInvalidEmailErrors { - if strings.Contains(errMsg, knownError) { + for i := range knownInvalidEmailErrors { + if strings.Contains(errMsg, knownInvalidEmailErrors[i]) { return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Invalid email %s", toEmail)), errMsg) } } From 391ccb051c45e21a23b5ef32da90eb028fee8306 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 15:47:41 +0530 Subject: [PATCH 0623/1179] [web] Change live photo clubbing threshold to 2 minutes --- web/apps/photos/src/services/upload/uploadManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/services/upload/uploadManager.ts b/web/apps/photos/src/services/upload/uploadManager.ts index 23e7d7a97e..1028f84aed 100644 --- a/web/apps/photos/src/services/upload/uploadManager.ts +++ b/web/apps/photos/src/services/upload/uploadManager.ts @@ -977,7 +977,7 @@ const areLivePhotoAssets = async ( ); if (!fDate || !gDate) return false; const secondDelta = Math.abs(fDate - gDate) / 1e6; - if (secondDelta > 5 * 60 /* 5 mins */) return false; + if (secondDelta > 2 * 60 /* 2 mins */) return false; return true; }; From 0bc8b428bbd2409ccedd8e3ea3b467064c88514d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:48:16 +0530 Subject: [PATCH 0624/1179] [server] Log slow files data put requests --- server/pkg/controller/filedata/controller.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/server/pkg/controller/filedata/controller.go b/server/pkg/controller/filedata/controller.go index d5f400c4fe..98b08e47d6 100644 --- a/server/pkg/controller/filedata/controller.go +++ b/server/pkg/controller/filedata/controller.go @@ -17,6 +17,7 @@ import ( "github.com/ente-io/museum/pkg/utils/network" "github.com/ente-io/museum/pkg/utils/s3config" "github.com/ente-io/stacktrace" + "github.com/gin-contrib/requestid" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" "strings" @@ -76,6 +77,9 @@ func New(repo *fileDataRepo.Repository, } func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataRequest) error { + startTime := gTime.Now() + opStartTime := gTime.Now() + logFields := log.Fields{} if err := req.Validate(); err != nil { return stacktrace.Propagate(err, "validation failed") } @@ -84,6 +88,8 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR if err != nil { return stacktrace.Propagate(err, "") } + logFields["validationTime"] = gTime.Since(opStartTime).Milliseconds() + opStartTime = gTime.Now() if req.Type != ente.MlData && req.Type != ente.PreviewVideo { return stacktrace.Propagate(ente.NewBadRequestWithMessage("unsupported object type "+string(req.Type)), "") } @@ -112,6 +118,8 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR log.Error(uploadErr) return stacktrace.Propagate(uploadErr, "") } + logFields["uploadTime"] = gTime.Since(opStartTime).Milliseconds() + opStartTime = gTime.Now() row := fileData.Row{ FileID: req.FileID, @@ -124,6 +132,15 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR if err != nil { return stacktrace.Propagate(err, "") } + logFields["dbInsertTime"] = gTime.Since(opStartTime).Milliseconds() + // log if total time is more than 2 seconds + if gTime.Since(startTime) > 2*gTime.Second { + logFields["totalTime"] = gTime.Since(startTime).Milliseconds() + logFields["req_id"] = requestid.Get(ctx) + logFields["fileID"] = req.FileID + log.WithFields(logFields).Warn("slow request") + } + return nil } From 5edf3f8e1d5d856b23251730bfbbe4d13ea73140 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:09:17 +0530 Subject: [PATCH 0625/1179] [server] Handle case where fileInfo is missing --- server/pkg/controller/file.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/server/pkg/controller/file.go b/server/pkg/controller/file.go index f14ea34305..dc00c5e76c 100644 --- a/server/pkg/controller/file.go +++ b/server/pkg/controller/file.go @@ -499,10 +499,22 @@ func (c *FileController) GetFileInfo(ctx *gin.Context, userID int64, fileIDs []i // prepare a list of FileInfoResponse fileInfoList := make([]*ente.FileInfoResponse, 0) for _, fileID := range fileIDs { - fileInfoList = append(fileInfoList, &ente.FileInfoResponse{ - ID: fileID, - FileInfo: *fileInfoResponse[fileID], - }) + id := fileID + fileInfo := fileInfoResponse[id] + if fileInfo == nil { + // This should be happening only for older users who may have a stale + // collection_file entry for a file that user has deleted + log.WithField("fileID", id).Error("fileInfo not found") + fileInfoList = append(fileInfoList, &ente.FileInfoResponse{ + ID: id, + FileInfo: ente.FileInfo{FileSize: -1, ThumbnailSize: -1}, + }) + } else { + fileInfoList = append(fileInfoList, &ente.FileInfoResponse{ + ID: id, + FileInfo: *fileInfo, + }) + } } return &ente.FilesInfoResponse{ FilesInfo: fileInfoList, From 829b4ab43669cac03a0cbff0a339b556f8c02b1d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:35:25 +0530 Subject: [PATCH 0626/1179] [server] Treat firstUser as admin if admins config is empty --- server/configurations/local.yaml | 1 + server/pkg/middleware/auth.go | 8 ++++++++ server/pkg/repo/userauth.go | 11 +++++++++++ 3 files changed, 20 insertions(+) diff --git a/server/configurations/local.yaml b/server/configurations/local.yaml index 707b9155aa..bca362b838 100644 --- a/server/configurations/local.yaml +++ b/server/configurations/local.yaml @@ -323,6 +323,7 @@ internal: # local-domain-suffix: "@example.org" # local-domain-value: 123456 # List of user IDs that can use the admin API endpoints. + # If this is not set, as a fallback, the first user is considered an admin. admins: [] # Replication config diff --git a/server/pkg/middleware/auth.go b/server/pkg/middleware/auth.go index 5adeaf0567..81a9f85f97 100644 --- a/server/pkg/middleware/auth.go +++ b/server/pkg/middleware/auth.go @@ -91,6 +91,14 @@ func (m *AuthMiddleware) AdminAuthMiddleware() gin.HandlerFunc { return } } + // if no admins are set, then check if the user is first user in the system + if len(admins) == 0 { + id, err := m.UserAuthRepo.GetMinUserID() + if err != nil && id == userID { + c.Next() + return + } + } c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "insufficient permissions"}) } } diff --git a/server/pkg/repo/userauth.go b/server/pkg/repo/userauth.go index c182e9e870..ed17061431 100644 --- a/server/pkg/repo/userauth.go +++ b/server/pkg/repo/userauth.go @@ -172,3 +172,14 @@ func (repo *UserAuthRepository) GetActiveSessions(userID int64, app ente.App) ([ } return sessions, nil } + +// GetMinUserID returns the first user that was created in the system +func (repo *UserAuthRepository) GetMinUserID() (int64, error) { + row := repo.DB.QueryRow(`select min(user_id) from users where encrypted_email is not null;`) + var id int64 + err := row.Scan(&id) + if err != nil { + return -1, stacktrace.Propagate(err, "") + } + return id, nil +} From 9be01793ac03e4e9c929c5ac6d70a421661e5111 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 24 Aug 2024 16:46:15 +0530 Subject: [PATCH 0627/1179] remove check for deleted user --- server/pkg/repo/userauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/repo/userauth.go b/server/pkg/repo/userauth.go index ed17061431..03d597072d 100644 --- a/server/pkg/repo/userauth.go +++ b/server/pkg/repo/userauth.go @@ -175,7 +175,7 @@ func (repo *UserAuthRepository) GetActiveSessions(userID int64, app ente.App) ([ // GetMinUserID returns the first user that was created in the system func (repo *UserAuthRepository) GetMinUserID() (int64, error) { - row := repo.DB.QueryRow(`select min(user_id) from users where encrypted_email is not null;`) + row := repo.DB.QueryRow(`select min(user_id) from users;`) var id int64 err := row.Scan(&id) if err != nil { From d0a485f8aab1b4e2bf7cea3356fe825120b5b4cc Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 17:01:39 +0530 Subject: [PATCH 0628/1179] [docs] Document first user as admin https://github.com/ente-io/ente/pull/2869/ --- docs/docs/self-hosting/faq/index.md | 7 +++++++ docs/docs/self-hosting/guides/admin.md | 27 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/docs/self-hosting/faq/index.md b/docs/docs/self-hosting/faq/index.md index 622e74a242..b1f0c0d311 100644 --- a/docs/docs/self-hosting/faq/index.md +++ b/docs/docs/self-hosting/faq/index.md @@ -31,3 +31,10 @@ particular, you can use the `ente admin update-subscription` CLI command to increase the [storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md) of accounts on your instance. + +### How can I become an admin on my self hosted instance? + +The first user you create on your instance is treated as an admin. + +If you want, you can modify this behaviour by providing an explicit list of +admins in the [configuration](/self-hosting/guides/admin#becoming-an-admin). diff --git a/docs/docs/self-hosting/guides/admin.md b/docs/docs/self-hosting/guides/admin.md index 92f52a91f0..c138eb4c33 100644 --- a/docs/docs/self-hosting/guides/admin.md +++ b/docs/docs/self-hosting/guides/admin.md @@ -24,8 +24,31 @@ and subsequently increase the [storage and account validity](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_admin_update-subscription.md) using the CLI. -For security purposes, we need to whitelist the user IDs that can perform admin -actions on the server. To do this, +> [!NOTE] +> +> The CLI command to add an account does not create Ente accounts. It only adds +> existing accounts to the list of (existing) accounts that the CLI can use. + +## Becoming an admin + +By default, the first user (and only the first user) created on the system is +considered as an admin. + +This facility is provided as a convenience for people who are getting started +with self hosting. For more serious deployments, we recommend creating an +explicit whitelist of admins. + +> [!NOTE] +> +> The first user is only treated as the admin if there are the list of admins in +> the configuration is empty. +> +> Also, if at some point you delete the first user, then you will need to define +> a whitelist to make some other user as the admin if you wish (since the first +> account has been deleted). + +To whitelist the user IDs that can perform admin actions on the server, use the +following steps: - Create a `museum.yaml` in the directory where you're starting museum from. For example, if you're running using `docker compose up`, then this file From e10d581bdb04846efb892dac4f856b05dd65e15d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 24 Aug 2024 17:14:30 +0530 Subject: [PATCH 0629/1179] [web] Update yarn.lock Leftover bit of https://github.com/ente-io/ente/pull/2849 --- web/yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/yarn.lock b/web/yarn.lock index 7a06b6f53d..b07f00a270 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1679,10 +1679,10 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chrono-node@^2.2.6: - version "2.7.5" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.7.5.tgz#1a8a03f94a7ae583b4d56b1427c766c0bafc3c1d" - integrity sha512-VJWqFN5rWmXVvXAxOD4i0jX8Tb4cLswaslyaAFhxM45zNXPsZleygPbgiaYBD7ORb9fj07zBgJb0Q6eKL+0iJg== +chrono-node@^2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.7.6.tgz#46d338e5c515b4dcedc5b5f56b1239b0217bf4aa" + integrity sha512-yugKSRLHc6B6kXxm/DwNc94zhaddAjCSO9IOGH3w7NIWNM+gUoLl/2/XLndiw4I+XhU4H2LOhC5Ab2JjS6JWsA== dependencies: dayjs "^1.10.0" From 066b251f75945869266ccfc563956b703d4f96e5 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sat, 24 Aug 2024 21:51:39 +0200 Subject: [PATCH 0630/1179] [mob][photos] Type error --- .../face_ml/face_clustering/face_clustering_service.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index f3064dbb60..d37a8821f9 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -306,7 +306,7 @@ class FaceClusteringService { Future predictLinearComputer( Map input, { Map? fileIDToCreationTime, - required Map oldClusterSummaries, + required Map oldClusterSummaries, double distanceThreshold = kRecommendedDistanceThreshold, }) async { if (input.isEmpty) { @@ -545,7 +545,6 @@ ClusteringResult _runLinearClustering(Map args) { sortedFaceInfos[i].clusterId = sortedFaceInfos[closestIdx].clusterId; } else { clusterID = newClusterID(); - ; sortedFaceInfos[i].clusterId = clusterID; } } From 4adf74b062d7743d86a15f3bc5833e979451b8e6 Mon Sep 17 00:00:00 2001 From: ludespeedny Date: Sat, 24 Aug 2024 20:21:49 -0400 Subject: [PATCH 0631/1179] [Auth] Adjust icons (#2831) Removed extra line after "enom" and adjusted itch.io icon color to more closely match their recommended color in dark and light mode. --- auth/assets/custom-icons/_data/custom-icons.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 59fbafe734..9c9a1d0609 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -181,8 +181,7 @@ }, { "title": "enom" - }, - + }, { "title": "Epic Games", "slug": "epic_games", @@ -266,7 +265,7 @@ { "title": "Itch", "slug": "itch_io", - "hex": "e7685e" + "hex": "000000" }, { "title": "IVPN", From 09da5ca550079e01d22d0480d62b44534ee9756b Mon Sep 17 00:00:00 2001 From: Shamshid Date: Sun, 25 Aug 2024 04:23:26 +0400 Subject: [PATCH 0632/1179] [Auth] Optimize and improve icons (#2843) Overall custom_icons directory size improvement is from **1.3M -> 704K** #### Replaced image data icons: - 3commas - Addy_io - Bitskins - Bitvavo - Configcat - Controld - Kpn - Marketplacedottf - Odido - Peerberry - Porkbun - Skinport - Tweakers - Wise #### Optimized icons: - Bitwarden - Bloom_host - Booking - Brave_creators - Cloudamqp - Cloudflare - Epic_games - Google - HuggingFace - Kraken - Mintos - Mistral - MyFritz - Notion - Nucommunity - Nvidia - Rockstar_games - Samsung - Sms_pool_net - Synology_dsm - Teleport - Twitch - Ubisoft - Uphold - Whmcs - Windscribe - Ynab #### Improved icons: - LocalWP - Mercado_livre - Transip - Twingate - Ubuntu_one - Wyze - Yandex #### Fixed icons: - Workos - Poloniex - Proxmox - Registro_br --- auth/assets/custom-icons/icons/3commas.svg | 7 +- auth/assets/custom-icons/icons/Yandex.svg | 6 +- auth/assets/custom-icons/icons/addy_io.svg | 26 +- auth/assets/custom-icons/icons/bitskins.svg | 6 +- auth/assets/custom-icons/icons/bitvavo.svg | 6 +- auth/assets/custom-icons/icons/bitwarden.svg | 13 +- auth/assets/custom-icons/icons/bloom_host.svg | 15 +- auth/assets/custom-icons/icons/booking.svg | 6 +- .../custom-icons/icons/brave_creators.svg | 23 +- auth/assets/custom-icons/icons/cloudamqp.svg | 29 +- auth/assets/custom-icons/icons/cloudflare.svg | 6 +- auth/assets/custom-icons/icons/configcat.svg | 17 +- auth/assets/custom-icons/icons/controld.svg | 4 +- auth/assets/custom-icons/icons/epic_games.svg | 4 +- auth/assets/custom-icons/icons/google.svg | 10 +- .../assets/custom-icons/icons/huggingface.svg | 22 +- auth/assets/custom-icons/icons/kpn.svg | 8 +- auth/assets/custom-icons/icons/kraken.svg | 10 +- auth/assets/custom-icons/icons/local_wp.svg | 25 +- .../custom-icons/icons/marketplacedottf.svg | 6 +- .../custom-icons/icons/mercado_livre.svg | 17 +- auth/assets/custom-icons/icons/mintos.svg | 5 +- auth/assets/custom-icons/icons/mistral.svg | 14 +- auth/assets/custom-icons/icons/myfritz.svg | 399 +----------------- auth/assets/custom-icons/icons/notion.svg | 6 +- .../assets/custom-icons/icons/nucommunity.svg | 39 +- auth/assets/custom-icons/icons/nvidia.svg | 4 +- auth/assets/custom-icons/icons/odido.svg | 31 +- auth/assets/custom-icons/icons/peerberry.svg | 5 +- auth/assets/custom-icons/icons/poloniex.svg | 8 +- auth/assets/custom-icons/icons/porkbun.svg | 8 +- auth/assets/custom-icons/icons/proxmox.svg | 8 +- .../assets/custom-icons/icons/registro_br.svg | 10 +- .../custom-icons/icons/rockstar_games.svg | 8 +- auth/assets/custom-icons/icons/samsung.svg | 10 +- auth/assets/custom-icons/icons/skinport.svg | 14 +- .../custom-icons/icons/sms_pool_net.svg | 12 +- auth/assets/custom-icons/icons/surfshark.svg | 7 +- .../custom-icons/icons/synology_dsm.svg | 4 +- auth/assets/custom-icons/icons/teleport.svg | 11 +- auth/assets/custom-icons/icons/transip.svg | 5 +- auth/assets/custom-icons/icons/tweakers.svg | 5 +- auth/assets/custom-icons/icons/twingate.svg | 4 +- auth/assets/custom-icons/icons/twitch.svg | 11 +- auth/assets/custom-icons/icons/ubisoft.svg | 4 +- auth/assets/custom-icons/icons/ubuntu_one.svg | 114 +---- auth/assets/custom-icons/icons/uphold.svg | 4 +- auth/assets/custom-icons/icons/whmcs.svg | 5 +- auth/assets/custom-icons/icons/windscribe.svg | 19 +- auth/assets/custom-icons/icons/wise.svg | 5 +- auth/assets/custom-icons/icons/workos.svg | 8 +- auth/assets/custom-icons/icons/wyze.svg | 5 +- auth/assets/custom-icons/icons/ynab.svg | 22 +- 53 files changed, 271 insertions(+), 809 deletions(-) diff --git a/auth/assets/custom-icons/icons/3commas.svg b/auth/assets/custom-icons/icons/3commas.svg index 759756347f..7421474c53 100644 --- a/auth/assets/custom-icons/icons/3commas.svg +++ b/auth/assets/custom-icons/icons/3commas.svg @@ -1,3 +1,4 @@ - - - + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/Yandex.svg b/auth/assets/custom-icons/icons/Yandex.svg index 90554f4329..45bd17af9e 100644 --- a/auth/assets/custom-icons/icons/Yandex.svg +++ b/auth/assets/custom-icons/icons/Yandex.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/auth/assets/custom-icons/icons/addy_io.svg b/auth/assets/custom-icons/icons/addy_io.svg index 04316d510a..1b8f349a92 100644 --- a/auth/assets/custom-icons/icons/addy_io.svg +++ b/auth/assets/custom-icons/icons/addy_io.svg @@ -1,3 +1,23 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/bitskins.svg b/auth/assets/custom-icons/icons/bitskins.svg index 4dde228c30..42996c5fdc 100644 --- a/auth/assets/custom-icons/icons/bitskins.svg +++ b/auth/assets/custom-icons/icons/bitskins.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/bitvavo.svg b/auth/assets/custom-icons/icons/bitvavo.svg index 224896c0db..793f30818c 100644 --- a/auth/assets/custom-icons/icons/bitvavo.svg +++ b/auth/assets/custom-icons/icons/bitvavo.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/bitwarden.svg b/auth/assets/custom-icons/icons/bitwarden.svg index c03505ddba..733925e518 100644 --- a/auth/assets/custom-icons/icons/bitwarden.svg +++ b/auth/assets/custom-icons/icons/bitwarden.svg @@ -1,11 +1,4 @@ - - - - - - - - - - + + + diff --git a/auth/assets/custom-icons/icons/bloom_host.svg b/auth/assets/custom-icons/icons/bloom_host.svg index b11e866d09..6f624a3265 100644 --- a/auth/assets/custom-icons/icons/bloom_host.svg +++ b/auth/assets/custom-icons/icons/bloom_host.svg @@ -1,8 +1,7 @@ - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/booking.svg b/auth/assets/custom-icons/icons/booking.svg index 419b0d98b7..6643f7dc44 100644 --- a/auth/assets/custom-icons/icons/booking.svg +++ b/auth/assets/custom-icons/icons/booking.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/auth/assets/custom-icons/icons/brave_creators.svg b/auth/assets/custom-icons/icons/brave_creators.svg index be879b00b1..9f0ec0959e 100644 --- a/auth/assets/custom-icons/icons/brave_creators.svg +++ b/auth/assets/custom-icons/icons/brave_creators.svg @@ -1,19 +1,12 @@ - + + + + - - - - - - - - - + + + + - - - - - diff --git a/auth/assets/custom-icons/icons/cloudamqp.svg b/auth/assets/custom-icons/icons/cloudamqp.svg index 65ec3aebd2..a4a9189541 100644 --- a/auth/assets/custom-icons/icons/cloudamqp.svg +++ b/auth/assets/custom-icons/icons/cloudamqp.svg @@ -1,19 +1,10 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/cloudflare.svg b/auth/assets/custom-icons/icons/cloudflare.svg index b6d32c8132..88a4b28ae5 100644 --- a/auth/assets/custom-icons/icons/cloudflare.svg +++ b/auth/assets/custom-icons/icons/cloudflare.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/auth/assets/custom-icons/icons/configcat.svg b/auth/assets/custom-icons/icons/configcat.svg index 12f7e4e81a..5bcfb6aab8 100644 --- a/auth/assets/custom-icons/icons/configcat.svg +++ b/auth/assets/custom-icons/icons/configcat.svg @@ -1,9 +1,8 @@ - - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/controld.svg b/auth/assets/custom-icons/icons/controld.svg index 068d73c3e9..983deb9c50 100644 --- a/auth/assets/custom-icons/icons/controld.svg +++ b/auth/assets/custom-icons/icons/controld.svg @@ -1,3 +1,3 @@ - - + + diff --git a/auth/assets/custom-icons/icons/epic_games.svg b/auth/assets/custom-icons/icons/epic_games.svg index f5de8cda87..b6685c9ac0 100644 --- a/auth/assets/custom-icons/icons/epic_games.svg +++ b/auth/assets/custom-icons/icons/epic_games.svg @@ -1,3 +1,3 @@ - - + + diff --git a/auth/assets/custom-icons/icons/google.svg b/auth/assets/custom-icons/icons/google.svg index 6fac804e6b..60ec66bc38 100644 --- a/auth/assets/custom-icons/icons/google.svg +++ b/auth/assets/custom-icons/icons/google.svg @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/auth/assets/custom-icons/icons/huggingface.svg b/auth/assets/custom-icons/icons/huggingface.svg index c377084d61..c5b6b9b392 100644 --- a/auth/assets/custom-icons/icons/huggingface.svg +++ b/auth/assets/custom-icons/icons/huggingface.svg @@ -1,11 +1,11 @@ - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/kpn.svg b/auth/assets/custom-icons/icons/kpn.svg index ba1c9a16e7..177b11172d 100644 --- a/auth/assets/custom-icons/icons/kpn.svg +++ b/auth/assets/custom-icons/icons/kpn.svg @@ -1,3 +1,5 @@ - - - + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/kraken.svg b/auth/assets/custom-icons/icons/kraken.svg index 260d14342e..1d09481d81 100644 --- a/auth/assets/custom-icons/icons/kraken.svg +++ b/auth/assets/custom-icons/icons/kraken.svg @@ -1,4 +1,4 @@ - + @@ -10,9 +10,9 @@ - - - + + + - + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/local_wp.svg b/auth/assets/custom-icons/icons/local_wp.svg index f37d988ec4..4d31801781 100644 --- a/auth/assets/custom-icons/icons/local_wp.svg +++ b/auth/assets/custom-icons/icons/local_wp.svg @@ -1,24 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/auth/assets/custom-icons/icons/marketplacedottf.svg b/auth/assets/custom-icons/icons/marketplacedottf.svg index bc56a92cec..aaacc1b4e0 100644 --- a/auth/assets/custom-icons/icons/marketplacedottf.svg +++ b/auth/assets/custom-icons/icons/marketplacedottf.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/auth/assets/custom-icons/icons/mercado_livre.svg b/auth/assets/custom-icons/icons/mercado_livre.svg index c4401f6945..0a0f858bdb 100644 --- a/auth/assets/custom-icons/icons/mercado_livre.svg +++ b/auth/assets/custom-icons/icons/mercado_livre.svg @@ -1,11 +1,8 @@ - - - - - - - - - - + + + + + + + diff --git a/auth/assets/custom-icons/icons/mintos.svg b/auth/assets/custom-icons/icons/mintos.svg index e32f381e6b..938f59e3c8 100644 --- a/auth/assets/custom-icons/icons/mintos.svg +++ b/auth/assets/custom-icons/icons/mintos.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/auth/assets/custom-icons/icons/mistral.svg b/auth/assets/custom-icons/icons/mistral.svg index dc605b8d49..1b42719f26 100644 --- a/auth/assets/custom-icons/icons/mistral.svg +++ b/auth/assets/custom-icons/icons/mistral.svg @@ -1,8 +1,8 @@ - - - - - - - + + + + + + + diff --git a/auth/assets/custom-icons/icons/myfritz.svg b/auth/assets/custom-icons/icons/myfritz.svg index 83579a94f6..6baf7b4452 100644 --- a/auth/assets/custom-icons/icons/myfritz.svg +++ b/auth/assets/custom-icons/icons/myfritz.svg @@ -1,396 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/auth/assets/custom-icons/icons/notion.svg b/auth/assets/custom-icons/icons/notion.svg index f9daeea3f2..877ea1a676 100644 --- a/auth/assets/custom-icons/icons/notion.svg +++ b/auth/assets/custom-icons/icons/notion.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/auth/assets/custom-icons/icons/nucommunity.svg b/auth/assets/custom-icons/icons/nucommunity.svg index 29f040cbe7..dbb3e1ccc8 100644 --- a/auth/assets/custom-icons/icons/nucommunity.svg +++ b/auth/assets/custom-icons/icons/nucommunity.svg @@ -1,38 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/auth/assets/custom-icons/icons/nvidia.svg b/auth/assets/custom-icons/icons/nvidia.svg index 82c6f14506..196c738dc1 100644 --- a/auth/assets/custom-icons/icons/nvidia.svg +++ b/auth/assets/custom-icons/icons/nvidia.svg @@ -1,3 +1,3 @@ - - + + diff --git a/auth/assets/custom-icons/icons/odido.svg b/auth/assets/custom-icons/icons/odido.svg index 7fef3d7e96..60e04b440a 100644 --- a/auth/assets/custom-icons/icons/odido.svg +++ b/auth/assets/custom-icons/icons/odido.svg @@ -1,3 +1,30 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/peerberry.svg b/auth/assets/custom-icons/icons/peerberry.svg index 72e8b69736..6c04bf2b56 100644 --- a/auth/assets/custom-icons/icons/peerberry.svg +++ b/auth/assets/custom-icons/icons/peerberry.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/auth/assets/custom-icons/icons/poloniex.svg b/auth/assets/custom-icons/icons/poloniex.svg index 37ad09e2b0..2dfea608ee 100644 --- a/auth/assets/custom-icons/icons/poloniex.svg +++ b/auth/assets/custom-icons/icons/poloniex.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/auth/assets/custom-icons/icons/porkbun.svg b/auth/assets/custom-icons/icons/porkbun.svg index 8765d9764a..67d2c24c3f 100644 --- a/auth/assets/custom-icons/icons/porkbun.svg +++ b/auth/assets/custom-icons/icons/porkbun.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/auth/assets/custom-icons/icons/proxmox.svg b/auth/assets/custom-icons/icons/proxmox.svg index 97c46af95f..472e2e5337 100644 --- a/auth/assets/custom-icons/icons/proxmox.svg +++ b/auth/assets/custom-icons/icons/proxmox.svg @@ -1,6 +1,4 @@ - - - - - + + + diff --git a/auth/assets/custom-icons/icons/registro_br.svg b/auth/assets/custom-icons/icons/registro_br.svg index fa5b9cb810..07a218c027 100644 --- a/auth/assets/custom-icons/icons/registro_br.svg +++ b/auth/assets/custom-icons/icons/registro_br.svg @@ -1,7 +1,5 @@ - - - - - - + + + + diff --git a/auth/assets/custom-icons/icons/rockstar_games.svg b/auth/assets/custom-icons/icons/rockstar_games.svg index bf2061c2b3..8b4bc52379 100644 --- a/auth/assets/custom-icons/icons/rockstar_games.svg +++ b/auth/assets/custom-icons/icons/rockstar_games.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + diff --git a/auth/assets/custom-icons/icons/samsung.svg b/auth/assets/custom-icons/icons/samsung.svg index 1c622af77d..10b0b44bd3 100644 --- a/auth/assets/custom-icons/icons/samsung.svg +++ b/auth/assets/custom-icons/icons/samsung.svg @@ -1,7 +1,5 @@ - - - - - - + + + + diff --git a/auth/assets/custom-icons/icons/skinport.svg b/auth/assets/custom-icons/icons/skinport.svg index 0d3cf32369..9ccb9fede1 100644 --- a/auth/assets/custom-icons/icons/skinport.svg +++ b/auth/assets/custom-icons/icons/skinport.svg @@ -1,3 +1,13 @@ - - + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/sms_pool_net.svg b/auth/assets/custom-icons/icons/sms_pool_net.svg index a57bc71226..b21b82a5ef 100644 --- a/auth/assets/custom-icons/icons/sms_pool_net.svg +++ b/auth/assets/custom-icons/icons/sms_pool_net.svg @@ -1,10 +1,4 @@ - - - - - - - - - + + + diff --git a/auth/assets/custom-icons/icons/surfshark.svg b/auth/assets/custom-icons/icons/surfshark.svg index 745b066ce9..6fb0a551b0 100644 --- a/auth/assets/custom-icons/icons/surfshark.svg +++ b/auth/assets/custom-icons/icons/surfshark.svg @@ -1,5 +1,4 @@ - - - - + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/synology_dsm.svg b/auth/assets/custom-icons/icons/synology_dsm.svg index 791dee6782..87acab455a 100644 --- a/auth/assets/custom-icons/icons/synology_dsm.svg +++ b/auth/assets/custom-icons/icons/synology_dsm.svg @@ -1,3 +1,3 @@ - - + + diff --git a/auth/assets/custom-icons/icons/teleport.svg b/auth/assets/custom-icons/icons/teleport.svg index 3e4dd5bb24..8b0ce64156 100644 --- a/auth/assets/custom-icons/icons/teleport.svg +++ b/auth/assets/custom-icons/icons/teleport.svg @@ -1,10 +1,3 @@ - - - - - - - - - + + diff --git a/auth/assets/custom-icons/icons/transip.svg b/auth/assets/custom-icons/icons/transip.svg index 7f35566e83..70de0bf719 100644 --- a/auth/assets/custom-icons/icons/transip.svg +++ b/auth/assets/custom-icons/icons/transip.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/auth/assets/custom-icons/icons/tweakers.svg b/auth/assets/custom-icons/icons/tweakers.svg index 36a948725a..4d07db9dac 100644 --- a/auth/assets/custom-icons/icons/tweakers.svg +++ b/auth/assets/custom-icons/icons/tweakers.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/auth/assets/custom-icons/icons/twingate.svg b/auth/assets/custom-icons/icons/twingate.svg index 75d36c7f00..130f862688 100644 --- a/auth/assets/custom-icons/icons/twingate.svg +++ b/auth/assets/custom-icons/icons/twingate.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/auth/assets/custom-icons/icons/twitch.svg b/auth/assets/custom-icons/icons/twitch.svg index c64a9b9450..0d4478fdcb 100644 --- a/auth/assets/custom-icons/icons/twitch.svg +++ b/auth/assets/custom-icons/icons/twitch.svg @@ -1,8 +1,5 @@ - - - - - - - + + + + diff --git a/auth/assets/custom-icons/icons/ubisoft.svg b/auth/assets/custom-icons/icons/ubisoft.svg index c1c69620c2..fc17aec2ca 100644 --- a/auth/assets/custom-icons/icons/ubisoft.svg +++ b/auth/assets/custom-icons/icons/ubisoft.svg @@ -1 +1,3 @@ -Ubisoft \ No newline at end of file + + + diff --git a/auth/assets/custom-icons/icons/ubuntu_one.svg b/auth/assets/custom-icons/icons/ubuntu_one.svg index e22ff3f8f0..3b5ebf9542 100644 --- a/auth/assets/custom-icons/icons/ubuntu_one.svg +++ b/auth/assets/custom-icons/icons/ubuntu_one.svg @@ -1,113 +1,3 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - + + diff --git a/auth/assets/custom-icons/icons/uphold.svg b/auth/assets/custom-icons/icons/uphold.svg index d1edc8761b..98d17af3f1 100644 --- a/auth/assets/custom-icons/icons/uphold.svg +++ b/auth/assets/custom-icons/icons/uphold.svg @@ -1,3 +1,3 @@ - - + + diff --git a/auth/assets/custom-icons/icons/whmcs.svg b/auth/assets/custom-icons/icons/whmcs.svg index 6aa398c3f1..7f5f218539 100644 --- a/auth/assets/custom-icons/icons/whmcs.svg +++ b/auth/assets/custom-icons/icons/whmcs.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/auth/assets/custom-icons/icons/windscribe.svg b/auth/assets/custom-icons/icons/windscribe.svg index 47e920fb6a..928c4dcdf8 100644 --- a/auth/assets/custom-icons/icons/windscribe.svg +++ b/auth/assets/custom-icons/icons/windscribe.svg @@ -1,13 +1,6 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + diff --git a/auth/assets/custom-icons/icons/wise.svg b/auth/assets/custom-icons/icons/wise.svg index 71aadde59c..f05cb12980 100644 --- a/auth/assets/custom-icons/icons/wise.svg +++ b/auth/assets/custom-icons/icons/wise.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/auth/assets/custom-icons/icons/workos.svg b/auth/assets/custom-icons/icons/workos.svg index d01eaad932..b923c311da 100644 --- a/auth/assets/custom-icons/icons/workos.svg +++ b/auth/assets/custom-icons/icons/workos.svg @@ -1,6 +1,4 @@ - - - - - + + + diff --git a/auth/assets/custom-icons/icons/wyze.svg b/auth/assets/custom-icons/icons/wyze.svg index 89d252c154..7feb0ac62a 100644 --- a/auth/assets/custom-icons/icons/wyze.svg +++ b/auth/assets/custom-icons/icons/wyze.svg @@ -1 +1,4 @@ -Wyze \ No newline at end of file + + + + diff --git a/auth/assets/custom-icons/icons/ynab.svg b/auth/assets/custom-icons/icons/ynab.svg index 4ddfc9fa07..c4fef51f47 100644 --- a/auth/assets/custom-icons/icons/ynab.svg +++ b/auth/assets/custom-icons/icons/ynab.svg @@ -1,20 +1,4 @@ - - - - - - - - - - - - - - - - - - - + + + From b9a2cea390f7cc131e40046e6934dda84d90454f Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 24 Aug 2024 01:23:57 +0530 Subject: [PATCH 0633/1179] [mob][photos] added authentication to view passkeys --- mobile/lib/ui/settings/security_section_widget.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/settings/security_section_widget.dart b/mobile/lib/ui/settings/security_section_widget.dart index a2ffe4f1ff..f3dec26867 100644 --- a/mobile/lib/ui/settings/security_section_widget.dart +++ b/mobile/lib/ui/settings/security_section_widget.dart @@ -132,7 +132,16 @@ class _SecuritySectionWidgetState extends State { pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, trailingIconIsMuted: true, - onTap: () async => await onPasskeyClick(context), + onTap: () async { + final hasAuthenticated = await LocalAuthenticationService.instance + .requestLocalAuthentication( + context, + "Please authenticate to view your passkey", + ); + if (hasAuthenticated) { + await onPasskeyClick(context); + } + }, ), sectionOptionSpacing, ], From ad0bc4a634997ad43a34bd54b98bab286d2392c4 Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Sat, 24 Aug 2024 13:09:03 +0530 Subject: [PATCH 0634/1179] [mob][photos] Extract string --- mobile/lib/generated/intl/messages_cs.dart | 2 ++ mobile/lib/generated/intl/messages_de.dart | 2 ++ mobile/lib/generated/intl/messages_en.dart | 2 ++ mobile/lib/generated/intl/messages_es.dart | 2 ++ mobile/lib/generated/intl/messages_fr.dart | 2 ++ mobile/lib/generated/intl/messages_it.dart | 2 ++ mobile/lib/generated/intl/messages_ko.dart | 2 ++ mobile/lib/generated/intl/messages_nl.dart | 2 ++ mobile/lib/generated/intl/messages_no.dart | 2 ++ mobile/lib/generated/intl/messages_pl.dart | 2 ++ mobile/lib/generated/intl/messages_pt.dart | 2 ++ mobile/lib/generated/intl/messages_ru.dart | 2 ++ mobile/lib/generated/intl/messages_tr.dart | 2 ++ mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_cs.arb | 3 ++- mobile/lib/l10n/intl_de.arb | 3 ++- mobile/lib/l10n/intl_en.arb | 3 ++- mobile/lib/l10n/intl_es.arb | 3 ++- mobile/lib/l10n/intl_fr.arb | 3 ++- mobile/lib/l10n/intl_it.arb | 3 ++- mobile/lib/l10n/intl_ko.arb | 3 ++- mobile/lib/l10n/intl_nl.arb | 3 ++- mobile/lib/l10n/intl_no.arb | 3 ++- mobile/lib/l10n/intl_pl.arb | 3 ++- mobile/lib/l10n/intl_pt.arb | 3 ++- mobile/lib/l10n/intl_ru.arb | 3 ++- mobile/lib/l10n/intl_tr.arb | 3 ++- mobile/lib/l10n/intl_zh.arb | 3 ++- mobile/lib/ui/settings/security_section_widget.dart | 2 +- 30 files changed, 67 insertions(+), 15 deletions(-) diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index bc7c9f0404..be665f29b7 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Time after which the app locks after being put in the background"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 22ab6ccf6c..5ab7d07eee 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -360,6 +360,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bitte authentifizieren, um Zwei-Faktor-Authentifizierung zu konfigurieren"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Bitte authentifizieren, um die Löschung des Kontos einzuleiten"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Bitte authentifizieren, um die aktiven Sitzungen anzusehen"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index a26535288e..41aa799988 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -351,6 +351,8 @@ class MessageLookup extends MessageLookupByLibrary { "Please authenticate to configure two-factor authentication"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Please authenticate to initiate account deletion"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Please authenticate to view your active sessions"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 15b3fc0beb..8aca561096 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -358,6 +358,8 @@ class MessageLookup extends MessageLookupByLibrary { "Por favor, autentícate para configurar la autenticación de dos factores"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Por favor, autentícate para iniciar la eliminación de la cuenta"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Por favor, autentícate para ver tus sesiones activas"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index d390dc3c2e..1416686d47 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -349,6 +349,8 @@ class MessageLookup extends MessageLookupByLibrary { "Veuillez vous authentifier pour configurer l\'authentification à deux facteurs"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour débuter la suppression du compte"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour voir vos sessions actives"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index c92c5d49f6..914c7315c6 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -340,6 +340,8 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticati per configurare l\'autenticazione a due fattori"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Autenticati per avviare l\'eliminazione dell\'account"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Autenticati per visualizzare le sessioni attive"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 56428cbdf5..0ce3e0bd49 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -35,6 +35,8 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Time after which the app locks after being put in the background"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 870bdb30d4..9ea99ef92c 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -360,6 +360,8 @@ class MessageLookup extends MessageLookupByLibrary { "Graag verifiëren om tweestapsverificatie te configureren"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Gelieve te verifiëren om het verwijderen van je account te starten"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Graag verifiëren om uw actieve sessies te bekijken"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 9e27e5363a..9ac7fbaee5 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -39,6 +39,8 @@ class MessageLookup extends MessageLookupByLibrary { "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Hva er hovedårsaken til at du sletter kontoen din?"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( "Time after which the app locks after being put in the background"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 523a98f0ad..0da7816b14 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -357,6 +357,8 @@ class MessageLookup extends MessageLookupByLibrary { "Uwierzytelnij się, aby skonfigurować uwierzytelnianie dwustopniowe"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 7fc0476be0..dc6578d6b7 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -357,6 +357,8 @@ class MessageLookup extends MessageLookupByLibrary { "Por favor, autentique-se para configurar a autenticação de dois fatores"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Por favor, autentique-se para iniciar a exclusão de conta"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Por favor, autentique-se para ver as sessões ativas"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index c50c61e2e8..138d6848c8 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -352,6 +352,8 @@ class MessageLookup extends MessageLookupByLibrary { "Пожалуйста, авторизуйтесь для настройки двухфакторной аутентификации"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Пожалуйста, авторизуйтесь, чтобы начать удаление аккаунта"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Пожалуйста, авторизуйтесь для просмотра активных сессий"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 1d6e751171..7216e9500e 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -352,6 +352,8 @@ class MessageLookup extends MessageLookupByLibrary { "İki faktörlü kimlik doğrulamayı yapılandırmak için lütfen kimlik doğrulaması yapın"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Hesap silme işlemini başlatmak için lütfen kimlik doğrulaması yapın"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Aktif oturumlarınızı görüntülemek için lütfen kimliğinizi doğrulayın"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index a93d621016..4629433319 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -313,6 +313,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份认证"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage("请进行身份验证以启动账户删除"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage("请验证以查看您的活动会话"), "authToViewYourHiddenFiles": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 27d9c79b6e..a95e8b035c 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9484,6 +9484,16 @@ class S { args: [], ); } + + /// `Please authenticate to view your passkey` + String get authToViewPasskey { + return Intl.message( + 'Please authenticate to view your passkey', + name: 'authToViewPasskey', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 1bd4f7a493..49563ff49d 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -56,5 +56,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 36dae62d79..32f16997ee 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1294,5 +1294,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt.", "guestView": "Gastansicht", "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 9949d855f3..a09d80b36f 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1314,5 +1314,6 @@ "cl_video_player_title": "Video Player", "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos.", "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings." + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 38a041098a..8b6bef5acc 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1287,5 +1287,6 @@ "cl_panorama_viewer_description": "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!", "cl_video_player_title": "Reproductor de Video", "cl_video_player_description": "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 33ab562db2..5d9188b80c 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1204,5 +1204,6 @@ "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec une navigation basée sur le mouvement !", "cl_video_player_title": "Lecteur Vidéo", "cl_video_player_description": "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 08b8188c30..f7116668e6 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1166,5 +1166,6 @@ "cl_panorama_viewer_description": "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L'esperienza è immersiva con la navigazione basata sul movimento!", "cl_video_player_title": "Lettore Video", "cl_video_player_description": "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 1bd4f7a493..49563ff49d 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -56,5 +56,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 22a9b765b6..8acd3f01cb 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1302,5 +1302,6 @@ "cl_panorama_viewer_description": "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto's met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!", "cl_video_player_title": "Videospeler", "cl_video_player_description": "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video's.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 0c262e3dab..f22ec4f7d0 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -70,5 +70,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index b982458215..3a8e9f7f06 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1300,5 +1300,6 @@ "cl_panorama_viewer_description": "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!", "cl_video_player_title": "Odtwarzacz Wideo", "cl_video_player_description": "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 6b6feb4f73..b7fd30ea85 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1301,5 +1301,6 @@ "cl_panorama_viewer_description": "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!", "cl_video_player_title": "Reprodutor de Vídeo", "cl_video_player_description": "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index b2368075eb..fead2aae50 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1286,5 +1286,6 @@ "cl_panorama_viewer_description": "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!", "cl_video_player_title": "Видеоплеер", "cl_video_player_description": "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 36c4027956..ffd6ec0f7c 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1297,5 +1297,6 @@ "cl_panorama_viewer_description": "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!", "cl_video_player_title": "Video Oynatıcı", "cl_video_player_description": "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index c8809d3460..be97d070f4 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1301,5 +1301,6 @@ "cl_panorama_viewer_description": "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!", "cl_video_player_title": "视频播放器", "cl_video_player_description": "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password." + "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", + "authToViewPasskey": "Please authenticate to view your passkey" } \ No newline at end of file diff --git a/mobile/lib/ui/settings/security_section_widget.dart b/mobile/lib/ui/settings/security_section_widget.dart index f3dec26867..1348bae9de 100644 --- a/mobile/lib/ui/settings/security_section_widget.dart +++ b/mobile/lib/ui/settings/security_section_widget.dart @@ -136,7 +136,7 @@ class _SecuritySectionWidgetState extends State { final hasAuthenticated = await LocalAuthenticationService.instance .requestLocalAuthentication( context, - "Please authenticate to view your passkey", + S.of(context).authToViewPasskey, ); if (hasAuthenticated) { await onPasskeyClick(context); From fe8d5a98c52c0a91cfbd39953f1a6ee0ea8ef864 Mon Sep 17 00:00:00 2001 From: JamesS-M <36538072+JamesS-M@users.noreply.github.com> Date: Sat, 24 Aug 2024 21:41:30 -0300 Subject: [PATCH 0635/1179] add wealthsimple icon --- auth/assets/custom-icons/_data/custom-icons.json | 3 +++ auth/assets/custom-icons/icons/wealthsimple.svg | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 auth/assets/custom-icons/icons/wealthsimple.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 9c9a1d0609..84978c1851 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -617,6 +617,9 @@ "titile": "Vikunja", "slug": "vikunja" }, + { + "title": "Wealthsimple" + }, { "title": "WHMCS" }, diff --git a/auth/assets/custom-icons/icons/wealthsimple.svg b/auth/assets/custom-icons/icons/wealthsimple.svg new file mode 100644 index 0000000000..dd81aef762 --- /dev/null +++ b/auth/assets/custom-icons/icons/wealthsimple.svg @@ -0,0 +1,6 @@ + \ No newline at end of file From 7e61c07a495d99cffab3a59c70b82c66e65cd7d8 Mon Sep 17 00:00:00 2001 From: Saibotk Date: Mon, 26 Aug 2024 01:25:34 +0200 Subject: [PATCH 0636/1179] [web][photos] Fix missing sidebar button padding Previously the button was assigned 0 left padding instead of its default 12px padding. This caused the ripple and hover effects to be off. It also caused the button to be right on the screen edge on mobile. This is now fixed by just removing the override. --- web/apps/photos/src/components/pages/gallery/Navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/components/pages/gallery/Navbar.tsx b/web/apps/photos/src/components/pages/gallery/Navbar.tsx index 45ae67d80c..a2cf98b4e3 100644 --- a/web/apps/photos/src/components/pages/gallery/Navbar.tsx +++ b/web/apps/photos/src/components/pages/gallery/Navbar.tsx @@ -53,7 +53,7 @@ export function GalleryNavbar({ ) : ( <> {!isInSearchMode && ( - + )} From f77fadee26a290b122fa6c1fde043e3e2a5a5ff7 Mon Sep 17 00:00:00 2001 From: Saibotk Date: Mon, 26 Aug 2024 01:28:19 +0200 Subject: [PATCH 0637/1179] [web][photos] Fix mobile upload button hover & position The hover and ripple effects and the positioning were off on the mobile upload button, because the `.mobile-button` class used the wrong class to let the element appear again. It used `display: block`, but the MUI IconButton actually has `display: inline-flex`, which will also fix the wrong height of the button. See https://github.com/mui/material-ui/issues/33020 --- web/apps/photos/src/components/Upload/UploadButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/components/Upload/UploadButton.tsx b/web/apps/photos/src/components/Upload/UploadButton.tsx index 72d0319bc5..b202dfb8e0 100644 --- a/web/apps/photos/src/components/Upload/UploadButton.tsx +++ b/web/apps/photos/src/components/Upload/UploadButton.tsx @@ -17,7 +17,7 @@ const Wrapper = styled("div")<{ $disableShrink: boolean }>` !$disableShrink && `@media (max-width: 624px) { & .mobile-button { - display: block; + display: inline-flex; } & .desktop-button { display: none; From 2584a1d09fbe61e70bbba0886ca450fe507d6383 Mon Sep 17 00:00:00 2001 From: Saibotk Date: Mon, 26 Aug 2024 01:02:39 +0200 Subject: [PATCH 0638/1179] [web][photos] Fix search icon layout & color This fixes the search icon in the search box not being centered properly and also not having the muted color style. The container is a flex-box layout which already tries to center its items. But due to the icons in MUI having a display of `inline-block`, our `Box` container also needs `display: inline-flex` to properly calculate the height. Now the box container is the same height as the icon and it gets centered correctly again. This is the same methodology that the MUI native `IconButton` also uses as a display value. See https://github.com/mui/material-ui/issues/33020#issuecomment-1149971549 This also removes the `icon` css class from the Box container since it does not exist anyway. And we fixed the theme color not being applied. This was otherwise just passed as a raw string to the color property and now correctly uses the intended theme color. --- .../Search/SearchBar/searchInput/valueContainerWithIcon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx index 359885c45f..177d02b729 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx @@ -33,7 +33,7 @@ export const ValueContainerWithIcon: SelectComponents< >["ValueContainer"] = (props) => ( - + theme.colors.stroke.muted}> {getIconByType(props.getValue()[0]?.type)} {props.children} From 0a2f8879a681c6e6c9db5ff06690bd938600f0ea Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 26 Aug 2024 00:31:54 +0000 Subject: [PATCH 0639/1179] New Crowdin translations by GitHub Action --- .../base/locales/de-DE/translation.json | 4 +- .../base/locales/it-IT/translation.json | 6 +- .../base/locales/km-KH/translation.json | 658 ++++++++++++++++++ .../base/locales/nl-NL/translation.json | 14 +- .../base/locales/pl-PL/translation.json | 2 +- .../base/locales/pt-BR/translation.json | 6 +- .../base/locales/sv-SE/translation.json | 22 +- .../base/locales/zh-CN/translation.json | 4 +- 8 files changed, 687 insertions(+), 29 deletions(-) create mode 100644 web/packages/base/locales/km-KH/translation.json diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index c9d64f299f..6c83a4dd72 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -2,7 +2,7 @@ "HERO_SLIDE_1_TITLE": "
Private Sicherungen
für deine Erinnerungen
", "HERO_SLIDE_1": "Standardmäßig Ende-zu-Ende verschlüsselt", "HERO_SLIDE_2_TITLE": "
Sicher gespeichert
in einem Luftschutzbunker
", - "HERO_SLIDE_2": "Entwickelt um zu überleben", + "HERO_SLIDE_2": "Entwickelt, um zu überleben", "HERO_SLIDE_3_TITLE": "
Überall
verfügbar
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", "LOGIN": "Anmelden", @@ -653,6 +653,6 @@ "autogenerated_default_album_name": "Neues Album", "developer_settings": "Entwicklereinstellungen", "server_endpoint": "Server Endpunkt", - "more_information": "", + "more_information": "Weitere Informationen", "save": "Speichern" } diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index bab61f3854..e32e814fda 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -24,7 +24,7 @@ "EXPIRED_CODE": "Il tuo codice di verifica è scaduto", "SENDING": "Invio in corso...", "SENT": "Inviato!", - "password": "", + "password": "Password", "link_password_description": "Inserisci la password per sbloccare l'album", "unlock": "", "SET_PASSPHRASE": "Imposta una password", @@ -175,7 +175,7 @@ "UPDATE_PAYMENT_METHOD": "Aggiorna metodo di pagamento", "MONTHLY": "Mensile", "YEARLY": "Annuale", - "MONTH_SHORT": "", + "MONTH_SHORT": "mese", "YEAR": "", "update_subscription_title": "Conferma le modifiche al piano", "UPDATE_SUBSCRIPTION_MESSAGE": "Sei sicuro di voler cambiare il piano?", @@ -294,7 +294,7 @@ "EMAIl_ALREADY_OWNED": "Email già in uso", "ETAGS_BLOCKED": "", "LIVE_PHOTOS_DETECTED": "", - "RETRY_FAILED": "", + "RETRY_FAILED": "Ritenta i caricamenti non andati a buon fine", "FAILED_UPLOADS": "Caricamento fallito ", "failed_uploads_hint": "", "SKIPPED_FILES": "Ignora caricamenti", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json new file mode 100644 index 0000000000..2f7b02d9ee --- /dev/null +++ b/web/packages/base/locales/km-KH/translation.json @@ -0,0 +1,658 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "ENTER_EMAIL": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "password": "", + "link_password_description": "", + "unlock": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "REFERRAL_CODE_HINT": "", + "REFERRAL_INFO": "", + "PASSPHRASE_MATCH_ERROR": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "upload": "", + "import": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_count_one": "", + "add_photos_count": "", + "select_photos": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "FILE_NOT_UPLOADED_LIST": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "DOWNLOAD_HIDDEN_ITEMS": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "title_photos": "", + "title_auth": "", + "title_accounts": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "password_changed_elsewhere": "", + "password_changed_elsewhere_message": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "cancel": "", + "LOGOUT": "", + "delete_account": "", + "delete_account_manually_message": "", + "LOGOUT_MESSAGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "OFFLINE_MSG": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "CURRENT_USAGE": "", + "TWO_MONTHS_FREE": "", + "POPULAR": "", + "free_plan_option": "", + "free_plan_description": "", + "active": "", + "subscription_info_free": "", + "subscription_info_family": "", + "subscription_info_expired": "", + "subscription_info_renewal_cancelled": "", + "subscription_info_storage_quota_exceeded": "", + "subscription_status_renewal_active": "", + "subscription_status_renewal_cancelled": "", + "add_on_valid_till": "", + "subscription_expired": "", + "storage_quota_exceeded": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "MONTH_SHORT": "", + "YEAR": "", + "update_subscription_title": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH": "", + "SEARCH_RESULTS": "", + "NO_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "CITY": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "", + "FILE_TYPE": "", + "CLIP": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count": "", + "TERMS_AND_CONDITIONS": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "PEOPLE": "", + "indexing_scheduled": "", + "indexing_photos": "", + "indexing_fetching": "", + "indexing_people": "", + "indexing_done": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_NAME": "", + "CAPTION_PLACEHOLDER": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "MAP": "", + "MAP_SETTINGS": "", + "ENABLE_MAPS": "", + "ENABLE_MAP": "", + "DISABLE_MAPS": "", + "ENABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP": "", + "DETAILS": "", + "view_exif": "", + "no_exif": "", + "exif": "", + "ISO": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "ENABLE_TWO_FACTOR": "", + "enable": "", + "enabled": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "disable": "", + "reconfigure": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "select_folder": "", + "select_zips": "", + "faq": "", + "takeout_hint": "", + "DESTINATION": "", + "START": "", + "LAST_EXPORT_TIME": "", + "EXPORT_AGAIN": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "ETAGS_BLOCKED": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "failed_uploads_hint": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "ARCHIVE": "", + "FAVORITES": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "HIDE_COLLECTION": "", + "UNHIDE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "REMOVE": "", + "YES_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "METADATA_DATE": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "INSTALL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "ADD_COLLABORATORS": "", + "ADD_NEW_EMAIL": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", + "ADD_VIEWERS": "", + "CHANGE_PERMISSIONS_TO_VIEWER": "", + "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", + "CONVERT_TO_VIEWER": "", + "CONVERT_TO_COLLABORATOR": "", + "CHANGE_PERMISSION": "", + "REMOVE_PARTICIPANT": "", + "CONFIRM_REMOVE": "", + "MANAGE": "", + "ADDED_AS": "", + "COLLABORATOR_RIGHTS": "", + "REMOVE_PARTICIPANT_HEAD": "", + "OWNER": "", + "COLLABORATORS": "", + "ADD_MORE": "", + "VIEWERS": "", + "OR_ADD_EXISTING": "", + "REMOVE_PARTICIPANT_MESSAGE": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "FILE_DOWNLOAD": "", + "link_password_lock": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "NO_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "SHARED_USING": "", + "SHARING_REFERRAL_CODE": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "file": "", + "folder": "", + "google_takeout": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "STOP_DOWNLOADS_HEADER": "", + "YES_STOP_DOWNLOADS": "", + "STOP_ALL_DOWNLOADS_MESSAGE": "", + "albums_count_one": "", + "albums_count": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ALL_HIDDEN_ALBUMS": "", + "HIDDEN_ALBUMS": "", + "HIDDEN_ITEMS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "WATCH_FOLDERS": "", + "upgrade_now": "", + "renew_now": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "CHANGE_FOLDER": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "WEAK_DEVICE": "", + "drag_and_drop_hint": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "more_details": "", + "ml_search": "", + "ml_search_description": "", + "ml_search_footnote": "", + "indexing": "", + "processed": "", + "indexing_status_running": "", + "indexing_status_fetching": "", + "indexing_status_scheduled": "", + "indexing_status_done": "", + "ml_search_disable": "", + "ml_search_disable_confirm": "", + "ml_consent": "", + "ml_consent_title": "", + "ml_consent_description": "", + "ml_consent_confirmation": "", + "labs": "", + "YOURS": "", + "passphrase_strength_weak": "", + "passphrase_strength_moderate": "", + "passphrase_strength_strong": "", + "preferences": "", + "language": "", + "advanced": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "storage_unit": { + "b": "", + "kb": "", + "mb": "", + "gb": "", + "tb": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "MIGRATING_EXPORT": "", + "RENAMING_COLLECTION_FOLDERS": "", + "TRASHING_DELETED_FILES": "", + "TRASHING_DELETED_COLLECTIONS": "", + "CONTINUOUS_EXPORT": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "", + "delete_account_reason_label": "", + "delete_account_reason_placeholder": "", + "delete_reason": { + "missing_feature": "", + "behaviour": "", + "found_another_service": "", + "not_listed": "" + }, + "delete_account_feedback_label": "", + "delete_account_feedback_placeholder": "", + "delete_account_confirm_checkbox_label": "", + "delete_account_confirm": "", + "delete_account_confirm_message": "", + "feedback_required": "", + "feedback_required_found_another_service": "", + "RECOVER_TWO_FACTOR": "", + "at": "", + "AUTH_NEXT": "", + "AUTH_DOWNLOAD_MOBILE_APP": "", + "HIDDEN": "", + "HIDE": "", + "UNHIDE": "", + "UNHIDE_TO_COLLECTION": "", + "SORT_BY": "", + "NEWEST_FIRST": "", + "OLDEST_FIRST": "", + "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", + "SELECT_COLLECTION": "", + "PIN_ALBUM": "", + "UNPIN_ALBUM": "", + "DOWNLOAD_COMPLETE": "", + "DOWNLOADING_COLLECTION": "", + "DOWNLOAD_FAILED": "", + "DOWNLOAD_PROGRESS": "", + "CHRISTMAS": "", + "CHRISTMAS_EVE": "", + "NEW_YEAR": "", + "NEW_YEAR_EVE": "", + "IMAGE": "", + "VIDEO": "", + "LIVE_PHOTO": "", + "editor": { + "crop": "" + }, + "CONVERT": "", + "CONFIRM_EDITOR_CLOSE_MESSAGE": "", + "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", + "BRIGHTNESS": "", + "CONTRAST": "", + "SATURATION": "", + "BLUR": "", + "INVERT_COLORS": "", + "ASPECT_RATIO": "", + "SQUARE": "", + "ROTATE_LEFT": "", + "ROTATE_RIGHT": "", + "FLIP_VERTICALLY": "", + "FLIP_HORIZONTALLY": "", + "DOWNLOAD_EDITED": "", + "SAVE_A_COPY_TO_ENTE": "", + "RESTORE_ORIGINAL": "", + "TRANSFORM": "", + "COLORS": "", + "FLIP": "", + "ROTATION": "", + "RESET": "", + "PHOTO_EDITOR": "", + "FASTER_UPLOAD": "", + "FASTER_UPLOAD_DESCRIPTION": "", + "CAST_ALBUM_TO_TV": "", + "ENTER_CAST_PIN_CODE": "", + "PAIR_DEVICE_TO_TV": "", + "TV_NOT_FOUND": "", + "AUTO_CAST_PAIR": "", + "AUTO_CAST_PAIR_DESC": "", + "PAIR_WITH_PIN": "", + "CHOOSE_DEVICE_FROM_BROWSER": "", + "PAIR_WITH_PIN_DESC": "", + "VISIT_CAST_ENTE_IO": "", + "CAST_AUTO_PAIR_FAILED": "", + "FREEHAND": "", + "APPLY_CROP": "", + "PHOTO_EDIT_REQUIRED_TO_SAVE": "", + "passkeys": "", + "passkey_fetch_failed": "", + "manage_passkey": "", + "delete_passkey": "", + "delete_passkey_confirmation": "", + "rename_passkey": "", + "add_passkey": "", + "enter_passkey_name": "", + "passkeys_description": "", + "CREATED_AT": "", + "passkey_add_failed": "", + "passkey_login_failed": "", + "passkey_login_invalid_url": "", + "passkey_login_already_claimed_session": "", + "passkey_login_generic_error": "", + "passkey_login_credential_hint": "", + "passkeys_not_supported": "", + "try_again": "", + "check_status": "", + "passkey_login_instructions": "", + "passkey_login": "", + "passkey": "", + "passkey_verify_description": "", + "waiting_for_verification": "", + "verification_still_pending": "", + "passkey_verified": "", + "redirecting_back_to_app": "", + "redirect_close_instructions": "", + "redirect_again": "", + "autogenerated_first_album_name": "", + "autogenerated_default_album_name": "", + "developer_settings": "", + "server_endpoint": "", + "more_information": "", + "save": "" +} diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index ab63afd8ba..1dd8934a3c 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -33,16 +33,16 @@ "ENTER_ENC_PASSPHRASE": "Voer een wachtwoord in dat we kunnen gebruiken om je gegevens te versleutelen", "PASSPHRASE_DISCLAIMER": "We slaan je wachtwoord niet op, dus als je het vergeet, zullen we u niet kunnen helpen uw data te herstellen zonder een herstelcode.", "WELCOME_TO_ENTE_HEADING": "Welkom bij ", - "WELCOME_TO_ENTE_SUBHEADING": "Foto opslag en delen met end to end encryptie", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "Waar je beste foto's leven", - "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiecodes worden gegenereerd...", + "WELCOME_TO_ENTE_SUBHEADING": "End-to-end versleutelde foto-opslag en uitwisseling", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "De woonplaats van uw beste foto's", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "Encryptiesleutels genereren...", "PASSPHRASE_HINT": "Wachtwoord", "CONFIRM_PASSPHRASE": "Wachtwoord bevestigen", "REFERRAL_CODE_HINT": "Hoe hoorde je over Ente? (optioneel)", "REFERRAL_INFO": "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!", "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", "CREATE_COLLECTION": "Nieuw album", - "ENTER_ALBUM_NAME": "Album naam", + "ENTER_ALBUM_NAME": "Albumnaam", "CLOSE_OPTION": "Sluiten (Esc)", "ENTER_FILE_NAME": "Bestandsnaam", "CLOSE": "Sluiten", @@ -232,7 +232,7 @@ "PEOPLE": "Personen", "indexing_scheduled": "Indexering is gepland...", "indexing_photos": "Analyseren van foto's ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Indexen ophalen ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Mensen analyseren in {{nSyncedFiles, number}} photos...", "indexing_done": "{{nSyncedFiles, number}} foto's geanalyseerd", "UNIDENTIFIED_FACES": "Ongeïdentificeerde gezichten", @@ -485,14 +485,14 @@ "indexing": "Indexeren", "processed": "Verwerkt", "indexing_status_running": "Bezig", - "indexing_status_fetching": "", + "indexing_status_fetching": "Ophalen", "indexing_status_scheduled": "Gepland", "indexing_status_done": "Voltooid", "ml_search_disable": "Schakel machine learning uit", "ml_search_disable_confirm": "Wil je machine learning op al je apparaten uitschakelen?", "ml_consent": "Schakel machine learning in", "ml_consent_title": "Schakel machine learning in?", - "ml_consent_description": "", + "ml_consent_description": "

Als u machine learning inschakelt, zal Ente informatie zoals gezichtsgeometrie uit bestanden extraheren, inclusief degenen die met u gedeeld worden.

Dit gebeurt op uw apparaat, en alle gegenereerde biometrische informatie zal end-to-end versleuteld worden.

Klik hier voor meer details in ons privacybeleid met betrekking tot deze functie.

", "ml_consent_confirmation": "Ik begrijp het en wil machine learning inschakelen", "labs": "Lab's", "YOURS": "jouw", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 2bf6775c9a..40e8502988 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -503,7 +503,7 @@ "language": "Język", "advanced": "Zaawansowane", "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Nieprawidłowy katalog eksportu", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Wybrany katalog eksportu nie istnieje.

Proszę wybrać prawidłowy katalog.

", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Wybrany katalog eksportu nie istnieje.

Prosimy wybrać prawidłowy katalog.

", "SUBSCRIPTION_VERIFICATION_ERROR": "Weryfikacja subskrypcji nie powiodła się", "storage_unit": { "b": "B", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index c39ba9237a..7cb8e2e3ca 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -232,7 +232,7 @@ "PEOPLE": "Pessoas", "indexing_scheduled": "Indexação está programada...", "indexing_photos": "Indexando fotos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Obtendo índices ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indexando pessoas em {{nSyncedFiles, number}} fotos...", "indexing_done": "Foram indexadas {{nSyncedFiles, number}} fotos", "UNIDENTIFIED_FACES": "Rostos não identificados", @@ -485,14 +485,14 @@ "indexing": "Indexando", "processed": "Processado", "indexing_status_running": "Executando", - "indexing_status_fetching": "", + "indexing_status_fetching": "Obtendo", "indexing_status_scheduled": "Agendado", "indexing_status_done": "Concluído", "ml_search_disable": "Desativar aprendizado de máquina", "ml_search_disable_confirm": "Você deseja desativar o aprendizado de máquina em todos os seus dispositivos?", "ml_consent": "Habilitar aprendizado de máquina", "ml_consent_title": "Habilitar aprendizado de máquina?", - "ml_consent_description": "", + "ml_consent_description": "

Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos, inclusive aquelas compartilhadas com você.

Isso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.

Por favor, clique aqui para obter mais detalhes sobre esta funcionalidade em nossa política de privacidade

", "ml_consent_confirmation": "Eu entendo, e desejo habilitar o aprendizado de máquina", "labs": "Laboratórios", "YOURS": "seu", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 41f1c3d5a2..42cdf3e79a 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -137,7 +137,7 @@ "ERROR": "", "MESSAGE": "Meddelande", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "INSTALL_MOBILE_APP": "Installera vår Android eller iOS-app för att automatiskt säkerhetskopiera alla dina foton", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "Exportera data", @@ -196,8 +196,8 @@ "RENAME": "", "RENAME_FILE": "", "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "Radera album?", + "DELETE_COLLECTION": "Radera album", "DELETE_COLLECTION_MESSAGE": "", "DELETE_PHOTOS": "", "KEEP_PHOTOS": "", @@ -213,7 +213,7 @@ "NO_RESULTS": "Inga resultat hittades", "SEARCH_HINT": "", "SEARCH_TYPE": { - "COLLECTION": "", + "COLLECTION": "Album", "LOCATION": "", "CITY": "", "DATE": "Datum", @@ -223,11 +223,11 @@ "FILE_TYPE": "Filtyp", "CLIP": "" }, - "photos_count_zero": "", - "photos_count_one": "", + "photos_count_zero": "Inga minnen", + "photos_count_one": "1 minne", "photos_count": "", "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", + "ADD_TO_COLLECTION": "Lägg till i album", "SELECTED": "", "PEOPLE": "", "indexing_scheduled": "", @@ -260,7 +260,7 @@ "TWO_FACTOR": "", "TWO_FACTOR_AUTHENTICATION": "Tvåfaktorsautentisering", "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", + "ENTER_CODE_MANUALLY": "Ange koden manuellt", "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", "SCAN_QR_CODE": "", "ENABLE_TWO_FACTOR": "", @@ -318,7 +318,7 @@ "ARCHIVE_COLLECTION": "", "ARCHIVE_SECTION_NAME": "", "ALL_SECTION_NAME": "Alla", - "MOVE_TO_COLLECTION": "", + "MOVE_TO_COLLECTION": "Flytta till album", "UNARCHIVE": "", "UNARCHIVE_COLLECTION": "", "HIDE_COLLECTION": "", @@ -407,9 +407,9 @@ "SHARED_USING": "", "SHARING_REFERRAL_CODE": "", "LIVE": "", - "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD": "Inaktivera lösenordslås", "DISABLE_PASSWORD_MESSAGE": "", - "PASSWORD_LOCK": "", + "PASSWORD_LOCK": "Lösenordslås", "LOCK": "", "DOWNLOAD_UPLOAD_LOGS": "", "file": "Fil", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 9d585e7394..540b829e1f 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -98,7 +98,7 @@ "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "或者", + "OR": "还是", "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", "SESSION_EXPIRED": "会话已过期", @@ -628,7 +628,7 @@ "rename_passkey": "重命名通行密钥", "add_passkey": "添加通行密钥", "enter_passkey_name": "输入该通行密钥的名称", - "passkeys_description": "通行密钥是您 Ente 账户的现代、安全的第二因素。通行密钥使用设备上的生物识别认证,这既方便又安全。", + "passkeys_description": "通行密钥是您的 Ente 账户的现代、安全的双重认证方式。通行密钥使用设备上的生物识别认证或者是实体密钥,这既方便又安全。", "CREATED_AT": "创建于", "passkey_add_failed": "无法添加通行密钥", "passkey_login_failed": "通行密钥登录失败", From ebcec9bad9e04b442f37a656ca56a6330c2c823f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 10:53:10 +0530 Subject: [PATCH 0640/1179] [desktop] Fix link in dependencies docs Fixes https://github.com/ente-io/ente/issues/2884 --- desktop/docs/dependencies.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/desktop/docs/dependencies.md b/desktop/docs/dependencies.md index 9d830edda6..8cbf43c83d 100644 --- a/desktop/docs/dependencies.md +++ b/desktop/docs/dependencies.md @@ -23,8 +23,9 @@ a _renderer_ process. - The _renderer_ process is a regular web app that gets loaded into the embedded Chromium. When the main process starts, it creates a new "window" that shows this embedded Chromium. In our case, we build and bundle a static - export of the [Photos web app](../web/README.md) in the generated app. This - gets loaded by the embedded Chromium at runtime, acting as the app's UI. + export of the [Photos web app](../../web/README.md) in the generated desktop + app. This gets loaded by the embedded Chromium at runtime, acting as the + desktop app's UI. There is also a third environment that gets temporarily created: From d710ccae9b1f5a25959be32bcc830ef219583e05 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 10:57:12 +0530 Subject: [PATCH 0641/1179] Fix links Fixes https://github.com/ente-io/ente/issues/2885 --- docs/docs/auth/migration-guides/steam/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/auth/migration-guides/steam/index.md b/docs/docs/auth/migration-guides/steam/index.md index 1784c61a2b..650382bd34 100644 --- a/docs/docs/auth/migration-guides/steam/index.md +++ b/docs/docs/auth/migration-guides/steam/index.md @@ -10,10 +10,8 @@ description: Guide for importing from Steam Authenticator to Ente Auth > Steam Authenticator code is only supported after auth-v3.0.3, check the app's > version number before migration. -One way to migrate is to -[use this tool by dyc3](https://github.com/dyc3/steamguard-cli/releases/latest) -to simplify the process and skip directly to generating a qr code to Ente -Authenticator. +One way to migrate is to [use this tool by dyc3][releases] to simplify the +process and skip directly to generating a qr code to Ente Authenticator. ## Download/Install steamguard-cli @@ -75,3 +73,5 @@ Open Ente Auth, press the '+' button, select `Scan a QR code`, and scan the qr code. You should now have your steam code inside Ente Auth + +[releases]: https://github.com/dyc3/steamguard-cli/releases/latest From 1df05a8117e0066796c51260c1a3adab73b122fe Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 26 Aug 2024 01:04:06 +0000 Subject: [PATCH 0642/1179] New Crowdin translations by GitHub Action --- mobile/lib/l10n/intl_de.arb | 60 ++++++++++++++++++++++----------- mobile/lib/l10n/intl_pl.arb | 46 ++++++++++++++++--------- mobile/lib/l10n/intl_pt.arb | 67 ++++++++++++++++++++++--------------- 3 files changed, 110 insertions(+), 63 deletions(-) diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 32f16997ee..97160ae71f 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -273,6 +273,11 @@ "failedToApplyCode": "Der Code konnte nicht aktiviert werden", "enterReferralCode": "Gib den Weiterempfehlungs-Code ein", "codeAppliedPageTitle": "Code eingelöst", + "changeYourReferralCode": "Empfehlungscode ändern", + "change": "Ändern", + "unavailableReferralCode": "Entschuldigung, dieser Code ist nicht verfügbar.", + "codeChangeLimitReached": "Entschuldigung, du hast das Limit der Code-Änderungen erreicht.", + "onlyFamilyAdminCanChangeCode": "Bitte wende Dich an {familyAdminEmail}, um den Code zu ändern.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Eingelöst", "@claimed": { @@ -287,7 +292,7 @@ "inviteYourFriends": "Lade deine Freunde ein", "failedToFetchReferralDetails": "Die Weiterempfehlungs-Details können nicht abgerufen werden. Bitte versuche es später erneut.", "referralStep1": "1. Gib diesen Code an deine Freunde", - "referralStep2": "2. Du schließt ein bezahltes Abo ab", + "referralStep2": "2. Sie schließen ein bezahltes Abo ab", "referralStep3": "3. Ihr beide erhaltet {storageInGB} GB* kostenlos", "referralsAreCurrentlyPaused": "Einlösungen sind derzeit pausiert", "youCanAtMaxDoubleYourStorage": "* Du kannst deinen Speicher maximal verdoppeln", @@ -409,8 +414,13 @@ "photoGridSize": "Fotorastergröße", "manageDeviceStorage": "Gerätespeicher verwalten", "machineLearning": "Maschinelles Lernen", + "mlConsent": "Maschinelles Lernen aktivieren", + "mlConsentTitle": "Maschinelles Lernen aktivieren?", + "mlConsentDescription": "Wenn du das maschinelle Lernen aktivierst, wird Ente Informationen wie etwa Gesichtsgeometrie aus Dateien extrahieren, einschließlich derjenigen, die mit dir geteilt werden.\n\nDies geschieht auf deinem Gerät und alle erzeugten biometrischen Informationen werden Ende-zu-Ende-verschlüsselt.", + "mlConsentPrivacy": "Bitte klicke hier für weitere Details zu dieser Funktion in unserer Datenschutzerklärung", + "mlConsentConfirmation": "Ich verstehe und möchte das maschinelle Lernen aktivieren", "magicSearch": "Magische Suche", - "mlIndexingDescription": "Bitte beachte, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind.", + "mlIndexingDescription": "Bitte beachte, dass das maschinelle Lernen zu einem höheren Daten- und Akkuverbrauch führen wird, bis alle Elemente indiziert sind. Du kannst die Desktop-App für eine schnellere Indizierung verwenden, alle Ergebnisse werden automatisch synchronisiert.", "loadingModel": "Lade Modelle herunter...", "waitingForWifi": "Warte auf WLAN...", "status": "Status", @@ -1143,7 +1153,7 @@ "successfullyHid": "Erfolgreich versteckt", "successfullyUnhid": "Erfolgreich eingeblendet", "crashReporting": "Absturzbericht", - "enableMultiPartUpload": "Mehrteiliges Hochladen aktivieren", + "resumableUploads": "Fortsetzbares Hochladen", "addToHiddenAlbum": "Zum versteckten Album hinzufügen", "moveToHiddenAlbum": "Zu verstecktem Album verschieben", "fileTypes": "Dateitypen", @@ -1253,20 +1263,6 @@ "right": "Rechts", "whatsNew": "Neue Funktionen", "reviewSuggestions": "Vorschläge überprüfen", - "reenterPassword": "Passwort erneut eingeben", - "reenterPin": "PIN erneut eingeben", - "deviceLock": "Gerätsperre", - "pinLock": "PIN-Sperre", - "next": "Weiter", - "setNewPassword": "Neues Passwort festlegen", - "enterPin": "PIN eingeben", - "setNewPin": "Neue PIN festlegen", - "appLock": "App-Sperre", - "noSystemLockFound": "Keine Systemsperre gefunden", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfigurieren Sie bitte den Gerätepasscode oder die Bildschirmsperre in Ihren Systemeinstellungen.", - "tapToUnlock": "Zum Entsperren antippen", - "tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche", - "mlFunctions": "ML functions", "useAsCover": "Als Titelbild festlegen", "notPersonLabel": "Nicht {name}?", "@notPersonLabel": { @@ -1278,9 +1274,25 @@ } } }, + "enable": "Aktivieren", + "enabled": "Aktiviert", + "moreDetails": "Weitere Details", + "enableMLIndexingDesc": "Ente unterstützt maschinelles Lernen für Gesichtserkennung, magische Suche und andere erweiterte Suchfunktionen auf dem Gerät", + "magicSearchHint": "Die magische Suche erlaubt das Durchsuchen von Fotos nach ihrem Inhalt, z.B. 'Blumen', 'rotes Auto', 'Ausweisdokumente'", "panorama": "Panorama", + "reenterPassword": "Passwort erneut eingeben", + "reenterPin": "PIN erneut eingeben", + "deviceLock": "Gerätsperre", + "pinLock": "PIN-Sperre", + "next": "Weiter", + "setNewPassword": "Neues Passwort festlegen", + "enterPin": "PIN eingeben", + "setNewPin": "Neue PIN festlegen", + "appLock": "App-Sperre", + "noSystemLockFound": "Keine Systemsperre gefunden", + "tapToUnlock": "Zum Entsperren antippen", + "tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche", "videoInfo": "Video-Informationen", - "appLockDescription": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.", "autoLock": "Automatisches Sperren", "immediately": "Sofort", "autoLockFeatureDescription": "Zeit, nach der die App gesperrt wird, nachdem sie in den Hintergrund verschoben wurde", @@ -1294,6 +1306,14 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt.", "guestView": "Gastansicht", "guestViewEnablePreSteps": "Bitte richte einen Gerätepasscode oder eine Bildschirmsperre ein, um die Gastansicht zu nutzen.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_guest_view_title": "Gastansicht", + "cl_guest_view_description": "Du gibst dein Telefon aus der Hand, um Freunden Fotos zu zeigen? Keine Sorge, sie werden nicht zu weit blättern können. Die Gastansicht wird sie auf die von dir ausgewählten Fotos beschränken.", + "cl_guest_view_call_to_action": "Wähle Fotos aus und schau dir die \"Gastansicht\" an.", + "cl_panorama_viewer_title": "Panoramabetrachter", + "cl_panorama_viewer_description": "Wir haben Unterstützung für die Ansicht von Panoramafotos mit 360-Grad-Ansichten hinzugefügt. Dieses Erlebnis fesselt mit bewegungsbasierter Navigation!", + "cl_video_player_title": "Video-Player", + "cl_video_player_description": "Einführung eines neuen Video-Players mit besserer Wiedergabesteuerung und Unterstützung für HDR-Videos.", + "appLockDescriptions": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.", + "authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 3a8e9f7f06..3e124d3081 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -112,7 +112,7 @@ "verifyPassword": "Zweryfikuj hasło", "recoveryKey": "Klucz odzyskiwania", "recoveryKeyOnForgotPassword": "Jeśli zapomnisz hasła, jedynym sposobem odzyskania danych jest ten klucz.", - "recoveryKeySaveDescription": "Nie przechowujemy tego klucza, proszę, zapisz ten 24-słowny klucz w bezpiecznym miejscu.", + "recoveryKeySaveDescription": "Nie przechowujemy tego klucza, prosimy zapisać ten 24-słowny klucz w bezpiecznym miejscu.", "doThisLater": "Spróbuj później", "saveKey": "Zapisz klucz", "recoveryKeyCopiedToClipboard": "Klucz odzyskiwania został skopiowany do schowka", @@ -150,7 +150,7 @@ "tryAgain": "Spróbuj ponownie", "viewRecoveryKey": "Zobacz klucz odzyskiwania", "confirmRecoveryKey": "Potwierdź klucz odzyskiwania", - "recoveryKeyVerifyReason": "Twój klucz odzyskiwania to jedyny sposób na odzyskanie zdjęć, jeśli zapomnisz hasła. Klucz odzyskiwania można znaleźć w menu Ustawienia > Bezpieczeństwo.\n\nProszę wprowadzić klucz odzyskiwania tutaj, aby sprawdzić, czy został on poprawnie zapisany.", + "recoveryKeyVerifyReason": "Twój klucz odzyskiwania to jedyny sposób na odzyskanie zdjęć, jeśli zapomnisz hasła. Klucz odzyskiwania można znaleźć w menu Ustawienia > Bezpieczeństwo.\n\nProsimy wprowadzić swój klucz odzyskiwania tutaj, aby sprawdzić, czy został on poprawnie zapisany.", "confirmYourRecoveryKey": "Potwierdź klucz odzyskiwania", "addViewer": "Dodaj widza", "addCollaborator": "Dodaj współuczestnika", @@ -273,6 +273,11 @@ "failedToApplyCode": "Nie udało się zastosować kodu", "enterReferralCode": "Wprowadź kod polecenia", "codeAppliedPageTitle": "Kod został zastosowany", + "changeYourReferralCode": "Zmień swój kod polecający", + "change": "Zmień", + "unavailableReferralCode": "Przepraszamy, ten kod jest niedostępny.", + "codeChangeLimitReached": "Przepraszamy, osiągnięto limit zmian kodu.", + "onlyFamilyAdminCanChangeCode": "Skontaktuj się z {familyAdminEmail}, aby zmienić swój kod.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Odebrano", "@claimed": { @@ -409,8 +414,13 @@ "photoGridSize": "Rozmiar siatki zdjęć", "manageDeviceStorage": "Zarządzaj pamięcią urządzenia", "machineLearning": "Uczenie maszynowe", + "mlConsent": "Włącz uczenie maszynowe", + "mlConsentTitle": "Włączyć uczenie maszynowe?", + "mlConsentDescription": "Jeśli włączysz uczenie maszynowe, Ente wyodrębni informacje takie jak geometria twarzy z plików, w tym tych udostępnionych z Tobą.\n\nTo się stanie na Twoim urządzeniu i wygenerowane informacje biometryczne zostaną zaszyfrowane end-to-end.", + "mlConsentPrivacy": "Kliknij tutaj, aby uzyskać więcej informacji na temat tej funkcji w naszej polityce prywatności", + "mlConsentConfirmation": "Rozumiem i chcę włączyć uczenie maszynowe", "magicSearch": "Magiczne wyszukiwanie", - "mlIndexingDescription": "Pamiętaj, że uczenie maszynowe spowoduje większe zużycie przepustowości i baterii, dopóki wszystkie elementy zostaną zindeksowane.", + "mlIndexingDescription": "Pamiętaj, że uczenie maszynowe spowoduje większą przepustowość i zużycie baterii do czasu zindeksowania wszystkich elementów. Rozważ użycie aplikacji komputerowej do szybszego indeksowania, wszystkie wyniki zostaną automatycznie zsynchronizowane.", "loadingModel": "Pobieranie modeli...", "waitingForWifi": "Czekanie na WiFi...", "status": "Stan", @@ -648,7 +658,7 @@ "pleaseWaitForSometimeBeforeRetrying": "Prosimy poczekać chwilę przed ponowną próbą", "paymentFailedMessage": "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!", "youAreOnAFamilyPlan": "Jesteś w planie rodzinnym!", - "contactFamilyAdmin": "Proszę skontaktuj się z {familyAdminEmail}, by zarzadząć swoją subskrypcją", + "contactFamilyAdmin": "Prosimy skontaktować się z {familyAdminEmail}, by zarzadząć swoją subskrypcją", "leaveFamily": "Opuść rodzinę", "areYouSureThatYouWantToLeaveTheFamily": "Czy jesteś pewien/pewna, że chcesz opuścić plan rodzinny?", "leave": "Wyjdź", @@ -855,7 +865,7 @@ "totalSize": "Całkowity rozmiar", "longpressOnAnItemToViewInFullscreen": "Długo naciśnij element, aby wyświetlić go na pełnym ekranie", "decryptingVideo": "Odszyfrowywanie wideo...", - "authToViewYourMemories": "Proszę uwierzytelnić się, aby wyświetlić swoje wspomnienia", + "authToViewYourMemories": "Prosimy uwierzytelnić się, aby wyświetlić swoje wspomnienia", "unlock": "Odblokuj", "freeUpSpace": "Zwolnij miejsce", "freeUpSpaceSaving": "{count, plural, one {Można to usunąć z urządzenia, aby zwolnić {formattedSize}} other {Można je usunąć z urządzenia, aby zwolnić {formattedSize}}}", @@ -1099,11 +1109,11 @@ "@androidGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." }, - "iOSLockOut": "Uwierzytelnianie biometryczne jest wyłączone. Proszę zablokować i odblokować ekran, aby je włączyć.", + "iOSLockOut": "Uwierzytelnianie biometryczne jest wyłączone. Prosimy zablokować i odblokować ekran, aby je włączyć.", "@iOSLockOut": { "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." }, - "iOSGoToSettingsDescription": "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Proszę włączyć Touch ID lub Face ID na swoim telefonie.", + "iOSGoToSettingsDescription": "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Prosimy włączyć Touch ID lub Face ID na swoim telefonie.", "@iOSGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." }, @@ -1143,7 +1153,7 @@ "successfullyHid": "Pomyślnie ukryto", "successfullyUnhid": "Pomyślnie odkryto", "crashReporting": "Zgłaszanie awarii", - "enableMultiPartUpload": "Włącz przesyłanie wieloczęściowe", + "resumableUploads": "Przesyłania wznawialne", "addToHiddenAlbum": "Dodaj do ukrytego albumu", "moveToHiddenAlbum": "Przenieś do ukrytego albumu", "fileTypes": "Rodzaje plików", @@ -1264,6 +1274,11 @@ } } }, + "enable": "Włącz", + "enabled": "Włączone", + "moreDetails": "Więcej szczegółów", + "enableMLIndexingDesc": "Ente obsługuje uczenie maszynowe na urządzeniu dla rozpoznawania twarzy, wyszukiwania magicznego i innych zaawansowanych funkcji wyszukiwania", + "magicSearchHint": "Magiczne wyszukiwanie pozwala na wyszukiwanie zdjęć według ich zawartości, np. \"kwiat\", \"czerwony samochód\", \"dokumenty tożsamości\"", "panorama": "Panorama", "reenterPassword": "Wprowadź ponownie hasło", "reenterPin": "Wprowadź ponownie kod PIN", @@ -1275,11 +1290,9 @@ "setNewPin": "Ustaw nowy kod PIN", "appLock": "Blokada dostępu do aplikacji", "noSystemLockFound": "Nie znaleziono blokady systemowej", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", "tapToUnlock": "Naciśnij, aby odblokować", "tooManyIncorrectAttempts": "Zbyt wiele błędnych prób", "videoInfo": "Informacje Wideo", - "appLockDescription": "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem.", "autoLock": "Automatyczna blokada", "immediately": "Natychmiast", "autoLockFeatureDescription": "Czas, po którym aplikacja blokuje się po umieszczeniu jej w tle", @@ -1294,12 +1307,13 @@ "guestView": "Widok gościa", "guestViewEnablePreSteps": "Aby włączyć widok gościa, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu.", "cl_guest_view_title": "Widok Gościa", - "cl_guest_view_description": "Pokazujesz zdjęcia znajomemu? Nie martw się, że przesunie za daleko. Widok gościa zablokuje wybrane przez Ciebie zdjęcia.", - "cl_guest_view_call_to_action": "Wybierz zdjęcia i sprawdź \"Widok Gościa\".", + "cl_guest_view_description": "Przekazujesz swój telefon, aby pokazać zdjęcia przyjacielowi? Nie martw się, że przesuną się zbyt daleko. Widok gościa zablokuje ich w wybranych przez Ciebie zdjęciach.", + "cl_guest_view_call_to_action": "Wybierz zdjęcia i sprawdź \"Widok gościa\".", "cl_panorama_viewer_title": "Przeglądarka Panoramy", - "cl_panorama_viewer_description": "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!", + "cl_panorama_viewer_description": "Dodaliśmy wsparcie dla przeglądania zdjęć panoramy z widokami 360 stopni. Doświadczenie jest imersyjne z nawigacją opartą na ruchu!", "cl_video_player_title": "Odtwarzacz Wideo", - "cl_video_player_description": "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_video_player_description": "Wprowadzamy nowy odtwarzacz wideo z lepszym sterowaniem odtwarzania i obsługą wideo HDR.", + "appLockDescriptions": "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", + "authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz dostępu" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index b7fd30ea85..2c09c839c2 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -195,7 +195,7 @@ }, "linkExpiry": "Expiração do link", "linkExpired": "Expirado", - "linkEnabled": "Ativado", + "linkEnabled": "Habilitado", "linkNeverExpires": "Nunca", "expiredLinkInfo": "Este link expirou. Por favor, selecione um novo tempo de expiração ou desabilite a expiração do link.", "setAPassword": "Defina uma senha", @@ -273,6 +273,11 @@ "failedToApplyCode": "Falha ao aplicar o código", "enterReferralCode": "Insira o código de indicação", "codeAppliedPageTitle": "Código aplicado", + "changeYourReferralCode": "Alterar o código de indicação", + "change": "Alterar", + "unavailableReferralCode": "Desculpe, este código não está disponível.", + "codeChangeLimitReached": "Desculpe, você atingiu o limite de alterações de código.", + "onlyFamilyAdminCanChangeCode": "Entre em contato com {familyAdminEmail} para alterar o seu código.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Reivindicado", "@claimed": { @@ -350,7 +355,7 @@ "uncategorized": "Sem categoria", "videoSmallCase": "vídeo", "photoSmallCase": "foto", - "singleFileDeleteHighlight": "Ele será excluído de todos os álbuns.", + "singleFileDeleteHighlight": "Ele(a) será excluído(a) de todos os álbuns.", "singleFileInBothLocalAndRemote": "Este(a) {fileType} está tanto no Ente quanto no seu dispositivo.", "singleFileInRemoteOnly": "Este(a) {fileType} será excluído(a) do Ente.", "singleFileDeleteFromDevice": "Este(a) {fileType} será excluído(a) do seu dispositivo.", @@ -409,8 +414,13 @@ "photoGridSize": "Tamanho da grade de fotos", "manageDeviceStorage": "Gerenciar o armazenamento do dispositivo", "machineLearning": "Aprendizagem de máquina", + "mlConsent": "Habilitar aprendizado de máquina", + "mlConsentTitle": "Habilitar aprendizado de máquina?", + "mlConsentDescription": "Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos, inclusive aquelas compartilhadas com você. \n\nIsso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta.", + "mlConsentPrivacy": "Por favor, clique aqui para mais detalhes sobre este recurso em nossa política de privacidade", + "mlConsentConfirmation": "Eu entendo, e desejo habilitar o aprendizado de máquina", "magicSearch": "Busca mágica", - "mlIndexingDescription": "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados.", + "mlIndexingDescription": "Observe que o aprendizado de máquina resultará em uma largura de banda maior e no uso da bateria até que todos os itens sejam indexados. Considere usar o aplicativo para computador para uma indexação mais rápida, todos os resultados serão sincronizados automaticamente.", "loadingModel": "Fazendo download de modelos...", "waitingForWifi": "Esperando por Wi-Fi...", "status": "Estado", @@ -1143,7 +1153,7 @@ "successfullyHid": "Ocultado com sucesso", "successfullyUnhid": "Desocultado com sucesso", "crashReporting": "Relatório de falhas", - "enableMultiPartUpload": "Ativar envio de várias partes", + "resumableUploads": "Envios retomáveis", "addToHiddenAlbum": "Adicionar a álbum oculto", "moveToHiddenAlbum": "Mover para álbum oculto", "fileTypes": "Tipos de arquivo", @@ -1253,20 +1263,6 @@ "right": "Direita", "whatsNew": "O que há de novo", "reviewSuggestions": "Revisar sugestões", - "reenterPassword": "Reinserir senha", - "reenterPin": "Reinserir PIN", - "deviceLock": "Bloqueio do dispositivo", - "pinLock": "Bloqueio PIN", - "next": "Próximo", - "setNewPassword": "Defina nova senha", - "enterPin": "Insira o PIN", - "setNewPin": "Definir novo PIN", - "appLock": "Bloqueio de app", - "noSystemLockFound": "Nenhum bloqueio de sistema encontrado", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", - "tapToUnlock": "Toque para desbloquear", - "tooManyIncorrectAttempts": "Muitas tentativas incorretas", - "mlFunctions": "ML functions", "useAsCover": "Usar como capa", "notPersonLabel": "Não é {name}?", "@notPersonLabel": { @@ -1278,9 +1274,25 @@ } } }, + "enable": "Habilitar", + "enabled": "Habilitado", + "moreDetails": "Mais detalhes", + "enableMLIndexingDesc": "Ente suporta aprendizado de máquina no dispositivo para reconhecimento facial, busca mágica e outros recursos avançados de busca", + "magicSearchHint": "A busca mágica permite pesquisar fotos por seu conteúdo, por exemplo, 'carro', 'carro vermelho', 'Ferrari'", "panorama": "Panorama", + "reenterPassword": "Reinserir senha", + "reenterPin": "Reinserir PIN", + "deviceLock": "Bloqueio do dispositivo", + "pinLock": "Bloqueio PIN", + "next": "Próximo", + "setNewPassword": "Defina nova senha", + "enterPin": "Insira o PIN", + "setNewPin": "Definir novo PIN", + "appLock": "Bloqueio de app", + "noSystemLockFound": "Nenhum bloqueio de sistema encontrado", + "tapToUnlock": "Toque para desbloquear", + "tooManyIncorrectAttempts": "Muitas tentativas incorretas", "videoInfo": "Informação de Vídeo", - "appLockDescription": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.", "autoLock": "Bloqueio automático", "immediately": "Imediatamente", "autoLockFeatureDescription": "Tempo após o qual o app bloqueia depois de ser colocado em segundo plano", @@ -1294,13 +1306,14 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Isto removerá links públicos de todos os links rápidos selecionados.", "guestView": "Visão de convidado", "guestViewEnablePreSteps": "Para ativar a visão de convidado, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", - "cl_guest_view_title": "Modo Convidado", - "cl_guest_view_description": "Vai mostrar fotos a um amigo? Não se preocupe com ele deslizando demais. O modo convidado bloqueará as fotos que você selecionar.", - "cl_guest_view_call_to_action": "Selecione as fotos e experimente o \"Modo Convidado\".", - "cl_panorama_viewer_title": "Visualizador Panorâmico", - "cl_panorama_viewer_description": "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!", + "cl_guest_view_title": "Visão de Convidado", + "cl_guest_view_description": "Passar o telefone para mostrar fotos para um amigo? Não se preocupe com eles deslizando demais. A visualização de convidado irá bloqueá-los nas fotos que você selecionar.", + "cl_guest_view_call_to_action": "Selecione fotos e confira \"Visão de convidado\".", + "cl_panorama_viewer_title": "Visualizador de Panoramas", + "cl_panorama_viewer_description": "Adicionamos suporte para visualizar fotos panorama com visualização de 360 graus. A experiência é envolvida com a navegação baseada em movimentos!", "cl_video_player_title": "Reprodutor de Vídeo", - "cl_video_player_description": "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_video_player_description": "Apresentando um novo reprodutor de vídeo, com melhores controles de reprodução e suporte para vídeos HDR.", + "appLockDescriptions": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema.", + "authToViewPasskey": "Por favor, autentique-se para ver sua chave de acesso" } \ No newline at end of file From 93e2036cfd56de2bad22a73b3570bdb595b9e656 Mon Sep 17 00:00:00 2001 From: Brogio Date: Mon, 26 Aug 2024 07:47:14 +0200 Subject: [PATCH 0643/1179] Update referral.go to check for profanity in code (#2868) ## Description Checks if the code contains profanity ## Tests --- server/go.mod | 1 + server/pkg/controller/storagebonus/referral.go | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/server/go.mod b/server/go.mod index 9ca4a93871..31f766bde5 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,6 +5,7 @@ go 1.21 require ( firebase.google.com/go v3.13.0+incompatible github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb + github.com/TwiN/go-away v1.0.5 github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 github.com/awa/go-iap v1.3.16 github.com/aws/aws-sdk-go v1.34.13 diff --git a/server/pkg/controller/storagebonus/referral.go b/server/pkg/controller/storagebonus/referral.go index 9f61eac0d5..97838d9229 100644 --- a/server/pkg/controller/storagebonus/referral.go +++ b/server/pkg/controller/storagebonus/referral.go @@ -17,6 +17,7 @@ import ( enteTime "github.com/ente-io/museum/pkg/utils/time" "github.com/ente-io/stacktrace" "github.com/gin-gonic/gin" + "github.com/TwiN/go-away" ) const ( @@ -141,6 +142,12 @@ func (c *Controller) UpdateReferralCode(ctx *gin.Context, userID int64, code str if len(code) < 4 || len(code) > 20 { return stacktrace.Propagate(ente.NewBadRequestWithMessage("code length should be between 4 and 8"), "") } + + // Check if the code contains any offensive language using the go-away library + if goaway.IsProfane(code) { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("Referral code contains offensive language and cannot be used"), "") + } + err := c.StorageBonus.AddNewCode(ctx, userID, code, isAdminEdit) if err != nil { return stacktrace.Propagate(err, "failed to update referral code") From 0d33c68d22905355943b53402854e6c854c3a40d Mon Sep 17 00:00:00 2001 From: SpeeterYT <80942857+SpeeterYT@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:21:54 +0200 Subject: [PATCH 0644/1179] Added FritzBox to custom-icons.json Added FritzBox to custom-icons.json. It uses the same svg as myfritz, so its entry was extended insted of creating a new one --- .../custom-icons/_data/custom-icons.json | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 84978c1851..552d4d49c8 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -372,6 +372,30 @@ { "title": "MyFRITZ!Net", "slug": "myfritz" + "altNames": [ + "MyFRITZ!", + "FritzBox", + "Fritz!Box", + "FritzBox 7590", + "FritzBox 7590 AX", + "FritzBox 7530", + "FritzBox 7530 AX", + "FritzBox 4040", + "FritzBox 4060", + "FritzBox 5530 Fiber", + "FritzBox 6490 Cable", + "FritzBox 6590 Cable", + "FritzBox 6591 Cable", + "FritzBox 6660 Cable", + "FritzBox 6820 LTE", + "FritzBox 6850 LTE", + "FritzBox 6850 5G", + "FritzBox 6890 LTE", + "FritzBox 7583", + "FritzBox 7520", + "FritzBox 7490", + "FritzBox 7583" + ] }, { "title": "Name.com", From 34706eff464ff5b75d051c2cc0561502f5723e88 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:09:33 +0530 Subject: [PATCH 0645/1179] [server] Treat invalid attestation resp as badRequest --- server/pkg/repo/passkey/passkey.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/pkg/repo/passkey/passkey.go b/server/pkg/repo/passkey/passkey.go index 2a517e7bd0..52a908c928 100644 --- a/server/pkg/repo/passkey/passkey.go +++ b/server/pkg/repo/passkey/passkey.go @@ -328,6 +328,10 @@ func (r *Repository) FinishRegistration(user *ente.User, friendlyName string, re credential, err := r.webAuthnInstance.FinishRegistration(passkeyUser, *sessionData, req) if err != nil { + if strings.Contains(err.Error(), "Error parsing attestation response") { + err = stacktrace.Propagate(ente.NewBadRequestWithMessage(err.Error()), "") + return + } err = stacktrace.Propagate(err, "") return } From e7c6eec555db1d44ad71b8238d4a4c02c3432451 Mon Sep 17 00:00:00 2001 From: casualsailo Date: Sun, 25 Aug 2024 18:37:19 -0700 Subject: [PATCH 0646/1179] Add T-Mobile icon --- auth/assets/custom-icons/_data/custom-icons.json | 7 +++++++ auth/assets/custom-icons/icons/t-mobile.svg | 1 + 2 files changed, 8 insertions(+) create mode 100644 auth/assets/custom-icons/icons/t-mobile.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 552d4d49c8..3d0ed7d07d 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -698,6 +698,13 @@ "title": "Newton", "altNames": ["Newton Crypto"], "slug": "newton" + }, + { + "title": "T-Mobile ID", + "altNames": [ + "T-Mobile" + ], + "slug": "t-mobile" } ] } diff --git a/auth/assets/custom-icons/icons/t-mobile.svg b/auth/assets/custom-icons/icons/t-mobile.svg new file mode 100644 index 0000000000..5beb1f5aa2 --- /dev/null +++ b/auth/assets/custom-icons/icons/t-mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file From 25a1dbcfd0eb5611a7a0c076343b1394a74135c7 Mon Sep 17 00:00:00 2001 From: casualsailo Date: Sun, 25 Aug 2024 18:37:57 -0700 Subject: [PATCH 0647/1179] Add Wealthfront icon --- auth/assets/custom-icons/_data/custom-icons.json | 4 ++++ auth/assets/custom-icons/icons/wealthfront.svg | 1 + 2 files changed, 5 insertions(+) create mode 100644 auth/assets/custom-icons/icons/wealthfront.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 3d0ed7d07d..d2c0aeed02 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -705,6 +705,10 @@ "T-Mobile" ], "slug": "t-mobile" + }, + { + "title": "Wealthfront", + "slug": "wealthfront" } ] } diff --git a/auth/assets/custom-icons/icons/wealthfront.svg b/auth/assets/custom-icons/icons/wealthfront.svg new file mode 100644 index 0000000000..b406b44323 --- /dev/null +++ b/auth/assets/custom-icons/icons/wealthfront.svg @@ -0,0 +1 @@ + \ No newline at end of file From 4f7b100d7aa99a9c7a8dce887369ed19fb9e0727 Mon Sep 17 00:00:00 2001 From: casualsailo Date: Sun, 25 Aug 2024 18:38:19 -0700 Subject: [PATCH 0648/1179] Add BinanceUS icon --- auth/assets/custom-icons/_data/custom-icons.json | 7 +++++++ auth/assets/custom-icons/icons/binance_us.svg | 1 + 2 files changed, 8 insertions(+) create mode 100644 auth/assets/custom-icons/icons/binance_us.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index d2c0aeed02..a8db324b5b 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -709,6 +709,13 @@ { "title": "Wealthfront", "slug": "wealthfront" + }, + { + "title": "BinanceUS", + "altNames": [ + "Binance US" + ], + "slug": "binance_us" } ] } diff --git a/auth/assets/custom-icons/icons/binance_us.svg b/auth/assets/custom-icons/icons/binance_us.svg new file mode 100644 index 0000000000..eb04931ceb --- /dev/null +++ b/auth/assets/custom-icons/icons/binance_us.svg @@ -0,0 +1 @@ + \ No newline at end of file From a4420efd52a6586344e65e44c437a718d24df9f3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:56:02 +0530 Subject: [PATCH 0649/1179] [server] Fix go-away version --- server/go.mod | 6 +++--- server/go.sum | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/server/go.mod b/server/go.mod index 31f766bde5..e73bd9a031 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,7 +5,6 @@ go 1.21 require ( firebase.google.com/go v3.13.0+incompatible github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb - github.com/TwiN/go-away v1.0.5 github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 github.com/awa/go-iap v1.3.16 github.com/aws/aws-sdk-go v1.34.13 @@ -38,8 +37,8 @@ require ( github.com/ulule/limiter/v3 v3.8.0 github.com/zsais/go-gin-prometheus v0.1.0 golang.org/x/crypto v0.21.0 - golang.org/x/sync v0.1.0 - golang.org/x/text v0.14.0 + golang.org/x/sync v0.8.0 + golang.org/x/text v0.17.0 google.golang.org/api v0.114.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) @@ -47,6 +46,7 @@ require ( require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/longrunning v0.4.1 // indirect + github.com/TwiN/ v1.6.13 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/fxamacker/cbor/v2 v2.6.0 // indirect diff --git a/server/go.sum b/server/go.sum index ed9338a487..e591ffb109 100644 --- a/server/go.sum +++ b/server/go.sum @@ -68,6 +68,8 @@ github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb/go.mod h1:7 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/TwiN/go-away v1.6.13 h1:aB6l/FPXmA5ds+V7I9zdhxzpsLLUvVtEuS++iU/ZmgE= +github.com/TwiN/go-away v1.6.13/go.mod h1:MpvIC9Li3minq+CGgbgUDvQ9tDaeW35k5IXZrF9MVas= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -767,6 +769,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -845,6 +849,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 3b6c840a94660859e11af77d32223fb06d88ccd8 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 26 Aug 2024 01:16:49 +0000 Subject: [PATCH 0650/1179] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_ar.arb | 1 - auth/lib/l10n/arb/app_bg.arb | 345 ++++++++++++++++++++++++++++++++++- auth/lib/l10n/arb/app_de.arb | 1 - auth/lib/l10n/arb/app_el.arb | 1 - auth/lib/l10n/arb/app_es.arb | 38 +++- auth/lib/l10n/arb/app_et.arb | 4 + auth/lib/l10n/arb/app_fa.arb | 1 - auth/lib/l10n/arb/app_fi.arb | 1 - auth/lib/l10n/arb/app_fr.arb | 2 +- auth/lib/l10n/arb/app_he.arb | 1 - auth/lib/l10n/arb/app_it.arb | 2 +- auth/lib/l10n/arb/app_ja.arb | 28 ++- auth/lib/l10n/arb/app_km.arb | 108 +++++++++++ auth/lib/l10n/arb/app_nl.arb | 52 +++--- auth/lib/l10n/arb/app_pl.arb | 10 +- auth/lib/l10n/arb/app_pt.arb | 8 +- auth/lib/l10n/arb/app_ru.arb | 1 - auth/lib/l10n/arb/app_sk.arb | 1 - auth/lib/l10n/arb/app_ti.arb | 1 - auth/lib/l10n/arb/app_tr.arb | 29 ++- auth/lib/l10n/arb/app_uk.arb | 1 - auth/lib/l10n/arb/app_vi.arb | 18 +- auth/lib/l10n/arb/app_zh.arb | 2 +- 23 files changed, 592 insertions(+), 64 deletions(-) create mode 100644 auth/lib/l10n/arb/app_et.arb create mode 100644 auth/lib/l10n/arb/app_km.arb diff --git a/auth/lib/l10n/arb/app_ar.arb b/auth/lib/l10n/arb/app_ar.arb index db71268f8b..116876e663 100644 --- a/auth/lib/l10n/arb/app_ar.arb +++ b/auth/lib/l10n/arb/app_ar.arb @@ -182,7 +182,6 @@ "security": "الأمان", "lockscreen": "شاشة القفل", "authToChangeLockscreenSetting": "الرجاء المصادقة لتغيير إعدادات شاشة القفل", - "lockScreenEnablePreSteps": "لتمكين شاشة القفل، الرجاء إعداد رمز مرور الجهاز أو قفل الشاشة في إعدادات النظام الخاص بك.", "viewActiveSessions": "عرض الجلسات النشطة", "authToViewYourActiveSessions": "الرجاء المصادقة لعرض جلساتك النشطة", "searchHint": "بحث...", diff --git a/auth/lib/l10n/arb/app_bg.arb b/auth/lib/l10n/arb/app_bg.arb index 9e26dfeeb6..12730e7933 100644 --- a/auth/lib/l10n/arb/app_bg.arb +++ b/auth/lib/l10n/arb/app_bg.arb @@ -1 +1,344 @@ -{} \ No newline at end of file +{ + "account": "Профил", + "unlock": "Отключване", + "recoveryKey": "Ключ за възстановяване", + "counterAppBarTitle": "Брояч", + "@counterAppBarTitle": { + "description": "Text shown in the AppBar of the Counter Page" + }, + "onBoardingBody": "Архивирайте сигурно своите 2FA кодове", + "onBoardingGetStarted": "Първи стъпки", + "setupFirstAccount": "Настройте първия си акаунт", + "importScanQrCode": "Сканирайте QR код", + "qrCode": "QR код", + "importEnterSetupKey": "Въведете първия си код", + "importAccountPageTitle": "Въведете подробности за акаунта", + "secretCanNotBeEmpty": "Кодът не може да бъде празен", + "bothIssuerAndAccountCanNotBeEmpty": "И издателят, и акаунтът не могат да бъдат празни", + "incorrectDetails": "Неправилни данни", + "pleaseVerifyDetails": "Моля, проверете данните и опитайте отново", + "codeIssuerHint": "Издател", + "codeSecretKeyHint": "Код", + "codeAccountHint": "Профил (you@domain.com)", + "codeTagHint": "Етикет", + "accountKeyType": "Тип на кода", + "sessionExpired": "Сесията е изтекла", + "@sessionExpired": { + "description": "Title of the dialog when the users current session is invalid/expired" + }, + "pleaseLoginAgain": "Моля, впишете се отново", + "loggingOut": "Излизане от профила...", + "timeBasedKeyType": "Въз основа на времето (TOTP)", + "counterBasedKeyType": "Въз основа на брояч (HOTP)", + "saveAction": "Запазване", + "nextTotpTitle": "следващ", + "deleteCodeTitle": "Изтриване на кода?", + "deleteCodeMessage": "Сигурни ли сте, че искате да изтриете този код? Това действие е необратимо.", + "viewLogsAction": "Преглед на историята на действията", + "sendLogsDescription": "Това ще изпрати файлове с история на действията, за да ни помогне да отстраним проблема Ви. Въпреки че вземаме предпазни мерки, за да гарантираме, че чувствителната информация не се регистрира, препоръчваме Ви да прегледате тези файлове с история на действията, преди да ги споделите.", + "preparingLogsTitle": "Подготвяне на файловете с историята...", + "emailLogsTitle": "Имейл история", + "emailLogsMessage": "Моля изпратете файловете с историята до {email}", + "@emailLogsMessage": { + "placeholders": { + "email": { + "type": "String" + } + } + }, + "copyEmailAction": "Копиране на имейла", + "exportLogsAction": "Експорт на файловете с историята", + "reportABug": "Докладване на проблем", + "crashAndErrorReporting": "Отчитане на сривове и грешки", + "reportBug": "Докладване на проблем", + "emailUsMessage": "Моля, изпратете ни имейл на {email}", + "@emailUsMessage": { + "placeholders": { + "email": { + "type": "String" + } + } + }, + "contactSupport": "Свържете се с поддръжката", + "rateUsOnStore": "Оценете ни в {storeName}", + "blog": "Блог", + "merchandise": "Стоки", + "verifyPassword": "Потвърдете паролата", + "pleaseWait": "Моля изчакайте...", + "generatingEncryptionKeysTitle": "Генерират се ключове за шифроване...", + "recreatePassword": "Създайте отново парола", + "recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nВлезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).", + "useRecoveryKey": "Използвайте ключ за възстановяване", + "incorrectPasswordTitle": "Грешна парола", + "welcomeBack": "Добре дошли отново!", + "madeWithLoveAtPrefix": "направено с ❤️ от ", + "supportDevs": "Абонирайте се за ente, за да ни подкрепите", + "supportDiscount": "Използвайте промокод „AUTH“, за да получите 10% отстъпка през първата година", + "changeEmail": "Промяна на имейл", + "changePassword": "Промяна на парола", + "data": "Информация", + "importCodes": "Импортиране на кодове", + "importTypePlainText": "Обикновен текст", + "importTypeEnteEncrypted": "Ente Шифрован експорт", + "passwordForDecryptingExport": "Парола за дешифриране на експортирането", + "passwordEmptyError": "Паролата не може да бъде празна", + "importFromApp": "Импортиране на кодове от {appName}", + "importGoogleAuthGuide": "Експортирайте акаунтите си от Google Authenticator в QR код, като използвате опцията „Прехвърляне на акаунти“. След това сканирайте QR кодовете с друго устройство.\n\nСъвет: Можете да използвате уеб камерата на вашия лаптоп, за да направите снимка на QR кода.", + "importSelectJsonFile": "Изберете JSON файл", + "importSelectAppExport": "Изберете файл за експортиране на {appName}", + "importEnteEncGuide": "Изберете шифрования JSON файл, експортиран от Ente", + "importRaivoGuide": "Използвайте опцията „Експортиране на OTPs в Zip архив“ в настройките на Raivo.\n\nРазархивирайте zip файла и импортирайте JSON файла.", + "importBitwardenGuide": "Използвайте опцията „Експортиране на хранилище“ в Bitwarden Tools и импортирайте некриптирания JSON файл.", + "importAegisGuide": "Използвайте опцията „Експортиране на хранилището“ в настройките на Aegis.\n\nАко вашето хранилище е криптирано, ще трябва да въведете парола за хранилището, за да декриптирате хранилището.", + "import2FasGuide": "Използвайте опцията \"Настройки->Архивиране -Експортиране\" в 2FAS.\n\nАко резервното Ви копие е шифровано, ще трябва да въведете паролата, за да дешифрирате архива", + "importLastpassGuide": "Използвайте опцията „Прехвърляне на акаунти“ в настройките на Lastpass Authenticator и натиснете „Експортиране на акаунти във файл“. Импортирайте изтегления JSON.", + "exportCodes": "Експортиране на кодове", + "importLabel": "Импортиране", + "importInstruction": "Моля, изберете файл, който съдържа списък с вашите кодове в следния формат", + "importCodeDelimiterInfo": "Кодовете могат да бъдат разделени със запетая или нов ред", + "selectFile": "Избор на файл", + "emailVerificationToggle": "Потвърждение чрез имейл", + "emailVerificationEnableWarning": "За да избегнете загуба на достъп до акаунта си, не забравяйте да съхраните копие от Вашия имейл 2FA извън Ente Auth, преди да активирате потвърждението чрез имейл.", + "authToChangeEmailVerificationSetting": "Моля, удостоверете се, за да промените потвърждението чрез имейл", + "authToViewYourRecoveryKey": "Моля, удостоверете се, за да видите Вашия ключ за възстановяване", + "authToChangeYourEmail": "Моля, удостоверете се, за да промените своя имейл", + "authToChangeYourPassword": "Моля, удостоверете се, за да промените паролата си", + "authToViewSecrets": "Моля, удостоверете се, за да видите Вашите кодове", + "authToInitiateSignIn": "Моля, удостоверете се, за да започнете влизане за архивиране.", + "ok": "Ок", + "cancel": "Отказ", + "yes": "Да", + "no": "Не", + "email": "Имейл", + "support": "Поддръжка", + "general": "Общи", + "settings": "Настройки", + "copied": "Копирано", + "pleaseTryAgain": "Опитайте отново", + "existingUser": "Съществуващ потребител", + "newUser": "Нов в Ente", + "delete": "Изтриване", + "enterYourPasswordHint": "Въведете паролата си", + "forgotPassword": "Забравена парола", + "oops": "Опа", + "suggestFeatures": "Предложете функции", + "faq": "ЧЗВ", + "faq_q_1": "Колко сигурен е Auth?", + "faq_a_1": "Всички кодове, които архивирате чрез Auth, се съхраняват криптирани от край до край. Това означава, че само Вие имате достъп до Вашите кодове. Нашите приложения са с отворен код и нашата криптография е подложена на външен одит.", + "faq_q_2": "Мога ли да получа достъп до моите кодове на работния плот?", + "faq_a_2": "Можете да получите достъп до вашите кодове онлайн @ auth.ente.io.", + "faq_q_3": "Как мога да изтрия кодове?", + "faq_a_3": "Можете да изтриете код, като плъзнете наляво върху него.", + "faq_q_4": "Как мога да подкрепя този проект?", + "scan": "Сканиране", + "searchHint": "Търсене...", + "search": "Търсене", + "sorryUnableToGenCode": "За съжаление не може да се генерира код за {issuerName}", + "noResult": "Няма резултати", + "addCode": "Добавяне на код", + "scanAQrCode": "Скениране на QR код", + "enterDetailsManually": "Въведете подробности ръчно", + "edit": "Редактиране", + "copiedToClipboard": "Копирано в буферната памет", + "copiedNextToClipboard": "Следващият код е копиран в буферната памет", + "error": "Грешка", + "recoveryKeyCopiedToClipboard": "Ключът за възстановяване е копиран в буферната памет", + "recoveryKeyOnForgotPassword": "Ако забравите паролата си, единственият начин да възстановите данните си е с този ключ.", + "recoveryKeySaveDescription": "Ние не съхраняваме този ключ, моля, запазете този ключ от 24 думи на сигурно място.", + "doThisLater": "Направете това по-късно", + "saveKey": "Запазване на ключа", + "save": "Запазване", + "send": "Изпращане", + "saveOrSendDescription": "Искате ли да запазите това в хранилището си (папка за Изтегляния по подразбиране) или да го изпратите на други приложения?", + "saveOnlyDescription": "Искате ли да запазите това в хранилището си (папка за Изтегляния по подразбиране)?", + "back": "Назад", + "createAccount": "Създаване на акаунт", + "passwordStrength": "Сила на паролата: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "password": "Парола", + "signUpTerms": "Съгласявам се с условията за ползване и политиката за поверителност", + "privacyPolicyTitle": "Политика за поверителност", + "termsOfServicesTitle": "Условия", + "encryption": "Шифроване", + "setPasswordTitle": "Задаване на парола", + "changePasswordTitle": "Промяна на паролата", + "resetPasswordTitle": "Нулиране на паролата", + "encryptionKeys": "Ключове за шифроване", + "passwordWarning": "Ние не съхраняваме тази парола, така че ако я забравите, не можем да дешифрираме Вашите данни", + "enterPasswordToEncrypt": "Въведете парола, която да използваме за шифроване на Вашите данни", + "enterNewPasswordToEncrypt": "Въведете нова парола, която да използваме за шифроване на Вашите данни", + "passwordChangedSuccessfully": "Паролата е променена успешно", + "generatingEncryptionKeys": "Генериране на ключове за шифроване...", + "continueLabel": "Продължете", + "insecureDevice": "Несигурно устройство", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "За съжаление не можахме да генерираме защитени ключове на това устройство.\n\nМоля, регистрирайте се от друго устройство.", + "howItWorks": "Как работи", + "logout": "Изход", + "areYouSureYouWantToLogout": "Наистина ли искате да излезете от профила си?", + "yesLogout": "Да, излез", + "exit": "Изход", + "invalidKey": "Невалиден ключ", + "tryAgain": "Опитайте отново", + "confirm": "Потвърждаване", + "about": "Относно", + "privacy": "Поверителност", + "terms": "Условия", + "checkForUpdates": "Провери за актуализации", + "checkStatus": "Проверка на състоянието", + "downloadUpdate": "Изтегляне", + "updateAvailable": "Налична актуализация", + "update": "Актуализиране", + "checking": "Извършва се проверка...", + "warning": "Предупреждение", + "iUnderStand": "Разбрах", + "@iUnderStand": { + "description": "Text for the button to confirm the user understands the warning" + }, + "importSuccessTitle": "Ура!", + "sorry": "Съжаляваме", + "pendingSyncs": "Предупреждение", + "resendEmail": "Повторно изпращане на имейл", + "activeSessions": "Активни сесии", + "somethingWentWrongPleaseTryAgain": "Нещо се обърка, моля опитайте отново", + "terminate": "Прекратяване", + "thisDevice": "Това устройство", + "thisEmailIsAlreadyInUse": "Този имейл вече се използва", + "incorrectCode": "Неправилен код", + "authenticationFailedPleaseTryAgain": "Неуспешно удостоверяване, моля опитайте отново", + "authenticationSuccessful": "Успешно удостоверяване!", + "twofactorAuthenticationSuccessfullyReset": "Двуфакторното удостоверяване бе успешно нулирано", + "enterPassword": "Въведете парола", + "selectExportFormat": "Изберете формат за експортиране", + "encrypted": "Шифровано", + "plainText": "Обикновен текст", + "passwordToEncryptExport": "Парола за шифроване на експортирането", + "export": "Експортиране", + "confirmUpdatingkey": "Сигурни ли сте, че искате да актуализирате секретния ключ?", + "minimizeAppOnCopy": "Минимизиране на приложението при копиране", + "editCodeAuthMessage": "Удостоверете се, за да редактирате кода", + "deleteCodeAuthMessage": "Удостоверете се, за да изтриете кода", + "showQRAuthMessage": "Удостоверете се, за да покажете QR кода", + "confirmAccountDeleteTitle": "Потвърдете изтриването на акаунта", + "confirmAccountDeleteMessage": "Този акаунт е свързан с други приложения на Ente, ако използвате такива.\n\nВашите качени данни във всички приложения на Ente ще бъдат планирани за изтриване и акаунтът Ви ще бъде изтрит за постоянно.", + "androidBiometricHint": "Потвърждаване на самоличността", + "@androidBiometricHint": { + "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricNotRecognized": "Не е разпознат. Опитайте отново.", + "@androidBiometricNotRecognized": { + "description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricSuccess": "Успешно", + "@androidBiometricSuccess": { + "description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters." + }, + "androidCancelButton": "Отказ", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "androidSignInTitle": "Необходимо е удостоверяване", + "@androidSignInTitle": { + "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricRequiredTitle": "Изискват се биометрични данни", + "@androidBiometricRequiredTitle": { + "description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters." + }, + "androidDeviceCredentialsRequiredTitle": "Изискват се идентификационни данни за устройството", + "@androidDeviceCredentialsRequiredTitle": { + "description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters." + }, + "androidDeviceCredentialsSetupDescription": "Изискват се идентификационни данни за устройството", + "@androidDeviceCredentialsSetupDescription": { + "description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side." + }, + "goToSettings": "Отваряне на настройките", + "@goToSettings": { + "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." + }, + "androidGoToSettingsDescription": "Биометричното удостоверяване не е настроено на Вашето устройство. Отидете на „Настройки > Сигурност“, за да добавите биометрично удостоверяване.", + "@androidGoToSettingsDescription": { + "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." + }, + "iOSLockOut": "Биометричното удостоверяване е деактивирано. Моля, заключете и отключете екрана си, за да го активирате.", + "@iOSLockOut": { + "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." + }, + "iOSGoToSettingsDescription": "Биометричното удостоверяване не е настроено на Вашето устройство. Моля, активирайте Touch ID или Face ID на телефона си.", + "@iOSGoToSettingsDescription": { + "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." + }, + "iOSOkButton": "ОК", + "@iOSOkButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." + }, + "noInternetConnection": "Няма връзка с интернет", + "pleaseCheckYourInternetConnectionAndTryAgain": "Моля, проверете интернет връзката си и опитайте отново.", + "signOutFromOtherDevices": "Излизане от други устройства", + "signOutOtherBody": "Ако смятате, че някой може да знае паролата Ви, можете да принудите всички други устройства, използващи Вашия акаунт, да излязат.", + "signOutOtherDevices": "Излизане от други устройства", + "doNotSignOut": "Не излизайте", + "hearUsWhereTitle": "Как научихте за Ente? (по избор)", + "hearUsExplanation": "Ние не проследяваме инсталиранията на приложения. Ще помогне, ако ни кажете къде ни намерихте!", + "recoveryKeySaved": "Ключът за възстановяване е запазен в папка за Изтегляния!", + "waitingForBrowserRequest": "Изчакване на заявка от браузъра...", + "waitingForVerification": "Изчаква се потвърждение...", + "passkey": "Ключ за достъп (Passkey)", + "passKeyPendingVerification": "Потвърждението все още се изчаква", + "loginSessionExpired": "Сесията изтече", + "loginSessionExpiredDetails": "Вашата сесия изтече. Моля влезте отново.", + "developerSettingsWarning": "Сигурни ли сте, че искате да промените настройките за програмисти?", + "developerSettings": "Настройки за програмисти", + "serverEndpoint": "Крайна точка на сървъра", + "invalidEndpoint": "Невалидна крайна точка", + "invalidEndpointMessage": "За съжаление въведената от Вас крайна точка е невалидна. Моля, въведете валидна крайна точка и опитайте отново.", + "endpointUpdatedMessage": "Крайната точка е актуализирана успешно", + "customEndpoint": "Свързан към {endpoint}", + "pinText": "ПИН код", + "unpinText": "Откачане", + "pinnedCodeMessage": "{code} е закачен", + "unpinnedCodeMessage": "{code} е откачен", + "tags": "Етикети", + "createNewTag": "Създаване на етикет", + "tag": "Етикет", + "create": "Създаване", + "editTag": "Редакция на етикет", + "deleteTagTitle": "Изтриване на етикета?", + "deleteTagMessage": "Сигурни ли сте, че искате да изтриете този етикет? Това действие е необратимо.", + "somethingWentWrongParsingCode": "Не успяхме да обработим {x} кода.", + "updateNotAvailable": "Няма налична актуализация", + "viewRawCodes": "Вижте необработени/чисти кодове", + "rawCodes": "Необработени/Чисти кодове", + "rawCodeData": "Данни за необработен/чист код", + "appLock": "Заключване на приложението", + "noSystemLockFound": "Не е намерено заключване на системата", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "За да активирате заключването на приложението, моля, задайте парола за устройството или заключване на екрана в системните настройки.", + "autoLock": "Автоматично заключване", + "immediately": "Незабавно", + "reEnterPassword": "Въведете отново паролата", + "reEnterPin": "Въведете отново ПИН кода", + "next": "Следващ", + "tooManyIncorrectAttempts": "Твърде много неуспешни опити", + "tapToUnlock": "Докоснете, за да отключите", + "setNewPassword": "Задаване на нова парола", + "deviceLock": "Заключване на устройството", + "hideContent": "Скриване на съдържанието", + "hideContentDescriptionAndroid": "Скрива съдържанието на приложението в превключвателя на приложения и деактивира екранните снимки", + "hideContentDescriptioniOS": "Скрива съдържанието на приложението в превключвателя на приложения", + "autoLockFeatureDescription": "Време, след което приложението се заключва, след като е поставено на заден план", + "appLockDescription": "Изберете между заключен екран по подразбиране на Вашето устройство и персонализиран заключен екран с ПИН код или парола.", + "pinLock": "Заключване с ПИН код", + "enterPin": "Въведете ПИН код", + "setNewPin": "Задаване на нов ПИН код", + "importFailureDescNew": "Неуспешно обработване на избрания файл." +} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_de.arb b/auth/lib/l10n/arb/app_de.arb index 61f8b7eecf..4d67965b2c 100644 --- a/auth/lib/l10n/arb/app_de.arb +++ b/auth/lib/l10n/arb/app_de.arb @@ -182,7 +182,6 @@ "security": "Sicherheit", "lockscreen": "Sperrbildschirm", "authToChangeLockscreenSetting": "Bitte authentifizieren um die Einstellungen des Sperrbildschirms zu ändern", - "lockScreenEnablePreSteps": "Um den Sperrbildschirm zu aktivieren, konfigurieren sie ein Gerätekennwort oder Gerätesperre in ihren Systemeinstellungen.", "viewActiveSessions": "Aktive Sitzungen anzeigen", "authToViewYourActiveSessions": "Bitte authentifizieren um, die aktiven Sitzungen zu sehen", "searchHint": "Suchen...", diff --git a/auth/lib/l10n/arb/app_el.arb b/auth/lib/l10n/arb/app_el.arb index 0f2f8a4151..0bbe9b9b81 100644 --- a/auth/lib/l10n/arb/app_el.arb +++ b/auth/lib/l10n/arb/app_el.arb @@ -182,7 +182,6 @@ "security": "Ασφάλεια", "lockscreen": "Οθόνη κλειδώματος", "authToChangeLockscreenSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τις ρυθμίσεις οθόνης κλειδώματος", - "lockScreenEnablePreSteps": "Για να ενεργοποιήσετε την οθόνη κλειδώματος, παρακαλώ ορίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματός σας.", "viewActiveSessions": "Προβολή ενεργών συνεδριών", "authToViewYourActiveSessions": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τις ενεργές συνεδρίες σας", "searchHint": "Αναζήτηση...", diff --git a/auth/lib/l10n/arb/app_es.arb b/auth/lib/l10n/arb/app_es.arb index 32d0ca879d..5c4ef204f5 100644 --- a/auth/lib/l10n/arb/app_es.arb +++ b/auth/lib/l10n/arb/app_es.arb @@ -67,12 +67,12 @@ "pleaseWait": "Por favor, espere...", "generatingEncryptionKeysTitle": "Generando claves de encriptación...", "recreatePassword": "Recrear contraseña", - "recreatePasswordMessage": "El dispositivo actual no es lo suficientemente potente para verificar su contraseña, así que necesitamos regenerarlo una vez de una manera que funcione con todos los dispositivos. \n\nPor favor Inicie sesión usando su clave de recuperación y regenere su contraseña (puede volver a utilizar la misma si lo desea).", + "recreatePasswordMessage": "El dispositivo actual no es lo suficientemente potente para verificar su contraseña, así que necesitamos regenerarlo una vez de una manera que funcione con todos los dispositivos.\n\nPor favor Inicie sesión usando su clave de recuperación y regenere su contraseña (puede volver a utilizar la misma si lo desea).", "useRecoveryKey": "Usar clave de recuperación", "incorrectPasswordTitle": "Contraseña incorrecta", "welcomeBack": "¡Te damos la bienvenida otra vez!", "madeWithLoveAtPrefix": "hecho con ❤️ en ", - "supportDevs": "Suscríbase a ente para apoyar este proyecto.", + "supportDevs": "Suscríbase a ente para apoyar este proyecto", "supportDiscount": "Utiliza el cupón promocional \"AUTH\" para obtener un 10% de descuento en el primer año", "changeEmail": "Cambiar correo electrónico", "changePassword": "Cambiar contraseña", @@ -88,7 +88,7 @@ "importSelectAppExport": "Seleccione el archivo de exportación de {appName}", "importEnteEncGuide": "Seleccione el archivo JSON cifrado exportado desde Ente", "importRaivoGuide": "Utilice la opción \"Exportar códigos a un archivo de Zip\" en la configuración de Raivo.\n\nExtraiga el archivo zip e importe el archivo JSON.", - "importBitwardenGuide": "Use la opción \"Exportar caja fuerte\" dentro del menú Herramientas de Bitwarden e importe el fichero JSON no crifrado.", + "importBitwardenGuide": "Use la opción \"Exportar caja fuerte\" dentro del menú Herramientas de Bitwarden e importe el fichero JSON no cifrado.", "importAegisGuide": "Utilice la opción \"Exportar la bóveda\" en ajustes de Aegis.\n\nSi tu bóveda es cifrada, necesitara entrar contraseña de bóveda para descifrar la bóveda.", "import2FasGuide": "Use la opción \"Configuración→Copia de seguridad→Exportar\" en 2FAS\n\nSi su copia de seguridad está cifrada, necesitará introducir la contraseña para descifrarla", "importLastpassGuide": "Utilice la opción \"Transferir cuentas\" en la configuración del autenticador de Lastpass y pulse \"Exportar cuentas al archivo\". Importe el archivo JSON descargado.", @@ -176,13 +176,13 @@ "confirmPassword": "Confirmar contraseña", "close": "Cerrar", "oopsSomethingWentWrong": "Vaya, algo salió mal.", - "selectLanguage": "Seleccionar idioma", + "selectLanguage": "Selecciona el idioma", "language": "Idioma", "social": "Social", "security": "Seguridad", "lockscreen": "Pantalla de bloqueo", "authToChangeLockscreenSetting": "Por favor autentifíquese para cambiar la configuración de bloqueo de pantalla", - "lockScreenEnablePreSteps": "Para activar la pantalla de bloqueo, por favor configure la contraseña del dispositivo o el bloqueo de pantalla en los ajustes de sistema.", + "deviceLockEnablePreSteps": "Para activar el bloqueo de la aplicación, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.", "viewActiveSessions": "Ver sesiones activas", "authToViewYourActiveSessions": "Por favor, autentifíquese para ver sus sesiones activas", "searchHint": "Buscar...", @@ -274,7 +274,7 @@ "checkStatus": "Comprobar estado", "downloadUpdate": "Descargar", "criticalUpdateAvailable": "Actualización crítica disponible", - "updateAvailable": "Actualizacion disponible", + "updateAvailable": "Actualización disponible", "update": "Actualizar", "checking": "Comprobando...", "youAreOnTheLatestVersion": "Está usando la versión más reciente", @@ -442,5 +442,29 @@ "deleteTagTitle": "¿Eliminar etiqueta?", "deleteTagMessage": "¿Estás seguro de que quieres eliminar esta etiqueta? Esta acción es irreversible.", "somethingWentWrongParsingCode": "No se han podido analizar los códigos {x}.", - "updateNotAvailable": "Actualización no disponible" + "updateNotAvailable": "Actualización no disponible", + "viewRawCodes": "Ver códigos raw", + "rawCodes": "Códigos raw", + "rawCodeData": "Datos del código raw", + "appLock": "Bloqueo de aplicación", + "noSystemLockFound": "Bloqueo del sistema no encontrado", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para activar el bloqueo de la aplicación, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes del sistema.", + "autoLock": "Bloqueo automático", + "immediately": "De inmediato", + "reEnterPassword": "Reescribe tu contraseña", + "reEnterPin": "Reescribe tu PIN", + "next": "Siguiente", + "tooManyIncorrectAttempts": "Demasiados intentos incorrectos", + "tapToUnlock": "Toca para desbloquear", + "setNewPassword": "Establece una nueva contraseña", + "deviceLock": "Dispositivo bloqueado", + "hideContent": "Ocultar contenido", + "hideContentDescriptionAndroid": "Oculta el contenido de la aplicación en el seleccionador de aplicaciones y desactiva las capturas de pantalla", + "hideContentDescriptioniOS": "Ocultar el contenido de la aplicación en el seleccionador de aplicaciones", + "autoLockFeatureDescription": "Tiempo tras el cual la aplicación se bloquea después de ser colocada en segundo plano", + "appLockDescription": "Elija entre la pantalla de bloqueo por defecto de su dispositivo y una pantalla de bloqueo personalizada con un PIN o contraseña.", + "pinLock": "Bloquear pin", + "enterPin": "Ingresa el PIN", + "setNewPin": "Establecer nuevo PIN", + "importFailureDescNew": "No se pudo analizar el archivo seleccionado." } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_et.arb b/auth/lib/l10n/arb/app_et.arb new file mode 100644 index 0000000000..9a53d6796f --- /dev/null +++ b/auth/lib/l10n/arb/app_et.arb @@ -0,0 +1,4 @@ +{ + "loggingOut": "Väljalogimine...", + "useRecoveryKey": "Kasuta taastevõtit" +} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_fa.arb b/auth/lib/l10n/arb/app_fa.arb index aeebe348b4..7a6c734abc 100644 --- a/auth/lib/l10n/arb/app_fa.arb +++ b/auth/lib/l10n/arb/app_fa.arb @@ -133,7 +133,6 @@ "security": "امنیت", "lockscreen": "قفل صفحه", "authToChangeLockscreenSetting": "لطفا جهت تغییر تنظیمات قفل صفحه، اعتبارسنجی کنید", - "lockScreenEnablePreSteps": "جهت فعالسازی قفل صفحه، لطفا در تنظیمات سیستم خود یک رمز یا قفل صفحه را فعال کنید.", "viewActiveSessions": "نمایش نشست‌های فعال", "authToViewYourActiveSessions": "لطفا جهت نمایش نشست‌های فعال خود، اعتبارسنجی کنید", "searchHint": "جستجو...", diff --git a/auth/lib/l10n/arb/app_fi.arb b/auth/lib/l10n/arb/app_fi.arb index 4bf9706755..140f90c60a 100644 --- a/auth/lib/l10n/arb/app_fi.arb +++ b/auth/lib/l10n/arb/app_fi.arb @@ -149,7 +149,6 @@ "language": "Kieli", "security": "Turvallisuus", "lockscreen": "Lukitusnäyttö", - "lockScreenEnablePreSteps": "Aktivoi lukitusnäyttö ottamalla käyttöön laitteen salasana tai näytön lukitus järjestelmäasetuksissa.", "searchHint": "Etsi...", "search": "Etsi", "noResult": "Ei tuloksia", diff --git a/auth/lib/l10n/arb/app_fr.arb b/auth/lib/l10n/arb/app_fr.arb index bddd4982c4..1c411338ea 100644 --- a/auth/lib/l10n/arb/app_fr.arb +++ b/auth/lib/l10n/arb/app_fr.arb @@ -182,7 +182,7 @@ "security": "Sécurité", "lockscreen": "Ecran de vérouillage", "authToChangeLockscreenSetting": "Veuillez vous authentifier pour modifier les paramètres de l'écran de verrouillage", - "lockScreenEnablePreSteps": "Pour activer l'écran de verrouillage, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", + "deviceLockEnablePreSteps": "Pour activer l'écran de verrouillage, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", "viewActiveSessions": "Afficher les sessions actives", "authToViewYourActiveSessions": "Veuillez vous authentifier pour afficher vos sessions actives", "searchHint": "Rechercher...", diff --git a/auth/lib/l10n/arb/app_he.arb b/auth/lib/l10n/arb/app_he.arb index 96cdda9b52..6d18051290 100644 --- a/auth/lib/l10n/arb/app_he.arb +++ b/auth/lib/l10n/arb/app_he.arb @@ -168,7 +168,6 @@ "security": "אבטחה", "lockscreen": "מסך נעילה", "authToChangeLockscreenSetting": "אנא בצע אימות כדי לשנות את הגדרות מסך הנעילה", - "lockScreenEnablePreSteps": "כדי לאפשר את מסך הנעילה, אנא הגדר קוד גישה למכשיר או לנעילת מסך בהגדרות המערכת שלך.", "viewActiveSessions": "צפה בחיבורים פעילים", "authToViewYourActiveSessions": "אנא בצע איומת על מנת לראות את החיבורים הפעילים שלך", "searchHint": "חיפוש...", diff --git a/auth/lib/l10n/arb/app_it.arb b/auth/lib/l10n/arb/app_it.arb index a0a1f04523..5f55132e6b 100644 --- a/auth/lib/l10n/arb/app_it.arb +++ b/auth/lib/l10n/arb/app_it.arb @@ -182,7 +182,7 @@ "security": "Sicurezza", "lockscreen": "Schermata di blocco", "authToChangeLockscreenSetting": "Autenticati per modificare le impostazioni della schermata di blocco", - "lockScreenEnablePreSteps": "Per abilitare la schermata di blocco, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema.", + "deviceLockEnablePreSteps": "Per attivare il blocco del dispositivo, impostare il codice di accesso o il blocco dello schermo nelle impostazioni del sistema.", "viewActiveSessions": "Visualizza sessioni attive", "authToViewYourActiveSessions": "Autenticati per visualizzare le sessioni attive", "searchHint": "Cerca...", diff --git a/auth/lib/l10n/arb/app_ja.arb b/auth/lib/l10n/arb/app_ja.arb index 7137d9b8c1..863cbd0819 100644 --- a/auth/lib/l10n/arb/app_ja.arb +++ b/auth/lib/l10n/arb/app_ja.arb @@ -182,7 +182,7 @@ "security": "セキュリティ", "lockscreen": "画面のロック", "authToChangeLockscreenSetting": "画面のロックの設定を変更するためには認証が必要です", - "lockScreenEnablePreSteps": "画面のロックを有効にするためには、システム設定でデバイスのパスコードやスクリーンロックを設定してください。", + "deviceLockEnablePreSteps": "端末のロックを有効にするには、システム設定で端末のパスコードまたは画面ロックを設定してください。", "viewActiveSessions": "アクティブなセッションを表示", "authToViewYourActiveSessions": "アクティブなセッションを表示するためには認証が必要です", "searchHint": "検索...", @@ -442,5 +442,29 @@ "deleteTagTitle": "タグを削除しますか?", "deleteTagMessage": "このタグを削除してもよろしいですか?この操作は取り消しできません。", "somethingWentWrongParsingCode": "{x} のコードを解析できませんでした。", - "updateNotAvailable": "アップデートは利用できません" + "updateNotAvailable": "アップデートは利用できません", + "viewRawCodes": "生のコードを表示", + "rawCodes": "生のコード", + "rawCodeData": "生のコードデータ", + "appLock": "アプリのロック", + "noSystemLockFound": "システムロックが見つかりませんでした", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。", + "autoLock": "自動ロック", + "immediately": "すぐに", + "reEnterPassword": "パスワードを再入力してください", + "reEnterPin": "PINを再入力してください", + "next": "次へ", + "tooManyIncorrectAttempts": "間違った回数が多すぎます", + "tapToUnlock": "タップして解除", + "setNewPassword": "新しいパスワードを設定", + "deviceLock": "生体認証", + "hideContent": "内容を非表示", + "hideContentDescriptionAndroid": "アプリの内容を非表示にし、スクリーンショットを無効にします", + "hideContentDescriptioniOS": "アプリを切り替えた際に、アプリの内容を非表示にします", + "autoLockFeatureDescription": "アプリをバックグラウンドでロックするまでの時間", + "appLockDescription": "端末のデフォルトのロック画面と、PINまたはパスワードを使用したカスタムロック画面を選択します。", + "pinLock": "PIN", + "enterPin": "PINを入力してください", + "setNewPin": "新しいPINを設定", + "importFailureDescNew": "選択されたファイルを解析できませんでした。" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_km.arb b/auth/lib/l10n/arb/app_km.arb new file mode 100644 index 0000000000..835e91b42a --- /dev/null +++ b/auth/lib/l10n/arb/app_km.arb @@ -0,0 +1,108 @@ +{ + "account": "គណនី", + "unlock": "ដោះ​សោ", + "onBoardingGetStarted": "ចាប់ផ្ដើម", + "exportLogsAction": "នាំចេញកំណត់ហេតុ", + "reportBug": "រាយការណ៍បញ្ហា", + "contactSupport": "ទំនាក់ទំនងសេវា", + "verifyPassword": "ផ្ទៀងផ្ទាត់ពាក្យសម្ងាត់", + "data": "ទិន្នន័យ", + "importLabel": "នាំ​ចូល", + "selectFile": "ជ្រើស​ឯកសារ", + "ok": "យល់ព្រម", + "cancel": "បោះបង់", + "yes": "បាទ/ចាស", + "no": "ទេ", + "email": "អ៊ីម៉ែល", + "support": "ហៅជំនួយ", + "general": "ទូទៅ", + "settings": "ការកំណត់", + "copied": "បានចម្លង", + "pleaseTryAgain": "សូមសាកល្បងម្តងទៀត", + "forgotPassword": "ភ្លេចកូដសម្ងាត់", + "faq": "សំនួរ-ចម្លើយ", + "somethingWentWrongMessage": "មាន​អ្វីមួយ​មិន​ប្រក្រតី។ សូម​ព្យាយាម​ម្តង​ទៀត", + "scan": "ស្កេន", + "verify": "ផ្ទៀងផ្ទាត់", + "recover": "សង្គ្រោះមកវិញ", + "invalidQRCode": "កូដ QR មិនត្រឹមត្រូវ", + "enterEmailHint": "វាយបញ្ចូលអ៊ីម៉ែល​របស់អ្នក", + "invalidEmailTitle": "អ៊ីម៉ែលនេះមិនត្រឹមត្រូវទេ", + "createNewAccount": "បង្កើតគណនីថ្មី", + "weakStrength": "ខ្សោយ", + "strongStrength": "ខ្លាំង", + "moderateStrength": "មធ្យម", + "confirmPassword": "បញ្ជាក់ពាក្យសម្ងាត់", + "oopsSomethingWentWrong": "អុប! មានអ្វីមួយខុសប្រក្រតី", + "selectLanguage": "រើសភាសា", + "language": "ភាសា", + "social": "បណ្តាញសង្គម", + "security": "សុវត្ថិភាព", + "lockscreen": "អេក្រង់ចាក់សោ", + "search": "ស្វែងរក", + "noResult": "គ្មានលទ្ធផល", + "addCode": "បន្ថែមកូដ", + "scanAQrCode": "ស្កេនកូដ QR", + "edit": "កែ", + "error": "មានកំហុស", + "save": "រក្សាទុក", + "send": "ផ្ញើរចេញ", + "back": "ត្រលប់ក្រោយ", + "createAccount": "បង្កើតគណនី", + "passwordStrength": "កម្លាំងពាក្យសម្ងាត់: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "password": "ពាក្យសម្ងាត់", + "privacyPolicyTitle": "គោលការណ៍​ភាព​ឯកជន", + "resetPasswordTitle": "ផ្ដាស់ប្ដូរពាក្សសម្ងាត់", + "logInLabel": "ចូលគណនី", + "logout": "ចេញគណនី", + "exit": "ចាកចេញ", + "copyEmailAddress": "ចម្លង​អាសយដ្ឋាន​អ៊ីមែល", + "exportLogs": "នាំចេញកំណត់ហេតុ", + "about": "អំពី", + "privacy": "កម្មសិទ្ធិ​ឯកជន​", + "checkStatus": "ពិនិត្យស្ថានភាព", + "downloadUpdate": "ទាញយក", + "updateAvailable": "មានបុច្ចប្បន្នភាព", + "checking": "កំពុងត្រួតពិនិត្យ...", + "warning": "ព្រមាន", + "pendingSyncs": "ព្រមាន", + "resendEmail": "ផ្ញើអ៊ីមែលម្ដងទៀត", + "activeSessions": "សកម្មភាពគណនី", + "somethingWentWrongPleaseTryAgain": "មាន​អ្វីមួយ​មិន​ប្រក្រតី។ សូម​ព្យាយាម​ម្តង​ទៀត", + "terminateSession": "កាត់់ផ្តាច់សកម្មភាពគណនីនេះ?", + "terminate": "កាត់ផ្តាច់", + "thisDevice": "ទូរស័ព្ទនេះ", + "emailChangedTo": "អ៊ីម៉ែលត្រូវបានផ្លាស់ប្តូរទៅ{newEmail}", + "enterPassword": "វាយបញ្ចូល​ពាក្យ​សម្ងាត់", + "encrypted": "បាន​អ៊ីនគ្រីប", + "plainText": "អក្សរលខ្ខណៈធម្មតា", + "export": "ទាញចេញ", + "singIn": "ចូលគណនី", + "androidCancelButton": "បោះបង់", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "androidSignInTitle": "តម្រូវឱ្យមានការបញ្ជាក់ភាពត្រឹមត្រូវ", + "@androidSignInTitle": { + "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." + }, + "tags": "ស្លាក", + "create": "បង្កើត", + "deleteTagTitle": "លុបស្លាក", + "immediately": "ភ្លាមៗ", + "reEnterPassword": "បញ្ចូលពាក្យសម្ងាត់ម្តងទៀត", + "tapToUnlock": "ប៉ះដើម្បីដោះសោ", + "hideContent": "លាក់ពត័មាន", + "enterPin": "វាយបញ្ចូល​លេខ​កូដ PIN" +} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_nl.arb b/auth/lib/l10n/arb/app_nl.arb index a998025512..0827651750 100644 --- a/auth/lib/l10n/arb/app_nl.arb +++ b/auth/lib/l10n/arb/app_nl.arb @@ -6,20 +6,20 @@ "@counterAppBarTitle": { "description": "Text shown in the AppBar of the Counter Page" }, - "onBoardingBody": "Beveilig je 2FA codes", - "onBoardingGetStarted": "Begin", - "setupFirstAccount": "Maak je account aan", + "onBoardingBody": "Veilig een back-up maken voor uw 2FA-codes", + "onBoardingGetStarted": "Aan de slag", + "setupFirstAccount": "Maak uw eerste account aan", "importScanQrCode": "Scan een QR-code", "qrCode": "QR Code", "importEnterSetupKey": "Voer een toegangssleutel in", "importAccountPageTitle": "Accountgegevens invoeren", "secretCanNotBeEmpty": "Geheime code mag niet leeg zijn", - "bothIssuerAndAccountCanNotBeEmpty": "Uitgever en account kunnen niet beiden leeg zijn", + "bothIssuerAndAccountCanNotBeEmpty": "Zowel uitgever als account mogen niet leeg zijn", "incorrectDetails": "Onjuiste gegevens", - "pleaseVerifyDetails": "Controleer je gegevens en probeer het nog eens", + "pleaseVerifyDetails": "Controleer uw gegevens en probeer het opnieuw", "codeIssuerHint": "Uitgever", - "codeSecretKeyHint": "Geheime sleutel", - "codeAccountHint": "Account (jij@domein.nl)", + "codeSecretKeyHint": "Geheime Sleutel", + "codeAccountHint": "Account (u@domein.nl)", "codeTagHint": "Label", "accountKeyType": "Type sleutel", "sessionExpired": "Sessie verlopen", @@ -28,17 +28,17 @@ }, "pleaseLoginAgain": "Log opnieuw in", "loggingOut": "Bezig met uitloggen...", - "timeBasedKeyType": "Tijd gebaseerd (TOTP)", + "timeBasedKeyType": "Tijdgebaseerd (TOTP)", "counterBasedKeyType": "Teller gebaseerd (HOTP)", "saveAction": "Opslaan", "nextTotpTitle": "volgende", "deleteCodeTitle": "Code verwijderen?", - "deleteCodeMessage": "Weet je zeker dat je deze code wilt verwijderen? Deze actie is onomkeerbaar.", + "deleteCodeMessage": "Weet u zeker dat u deze code wilt verwijderen? Deze actie is onomkeerbaar.", "viewLogsAction": "Bekijk logs", - "sendLogsDescription": "Dit zal logs verzenden om ons te helpen uw probleem op te lossen. Hoewel we voorzorgsmaatregelen nemen om ervoor te zorgen dat gevoelige informatie niet wordt gedeeld, raden we je aan deze logs te bekijken voordat je ze deelt.", - "preparingLogsTitle": "Klaarmaken...", + "sendLogsDescription": "Hiermee zullen logs verzonden worden om ons te helpen uw probleem op te lossen. Hoewel we voorzorgsmaatregelen nemen om ervoor te zorgen dat gevoelige informatie niet wordt gelogd, raden we u aan deze logs te bekijken voordat u ze deelt.", + "preparingLogsTitle": "Logs aan het voorbereiden...", "emailLogsTitle": "E-mail logs", - "emailLogsMessage": "Verstuur de logs alsjeblieft naar {email}", + "emailLogsMessage": "Verstuur de logs naar {email}", "@emailLogsMessage": { "placeholders": { "email": { @@ -67,29 +67,29 @@ "pleaseWait": "Een ogenblik geduld...", "generatingEncryptionKeysTitle": "Encryptiesleutels genereren...", "recreatePassword": "Wachtwoord opnieuw instellen", - "recreatePasswordMessage": "Het huidige apparaat is niet krachtig genoeg om je wachtwoord te verifiëren, dus moeten we de code een keer opnieuw genereren op een manier die met alle apparaten werkt.\n\nLog in met behulp van uw herstelcode en genereer opnieuw uw wachtwoord (je kunt dezelfde indien gewenst opnieuw gebruiken).", + "recreatePasswordMessage": "Het huidige apparaat is niet krachtig genoeg om uw wachtwoord te verifiëren, dus moeten we het wachtwoord eenmalig opnieuw genereren op een manier die voor alle apparaten werkt. \n\nLog in met behulp van uw herstelcode en genereer uw wachtwoord opnieuw (indien gewenst kunt u deze hergebruiken).", "useRecoveryKey": "Herstelsleutel gebruiken", "incorrectPasswordTitle": "Onjuist wachtwoord", "welcomeBack": "Welkom terug!", - "madeWithLoveAtPrefix": "gemaakt met ❤️ door ", - "supportDevs": "Abonneer je op ente om dit project te steunen.", - "supportDiscount": "Gebruik couponcode \"AUTH\" om 10% korting te krijgen op het eerste jaar", + "madeWithLoveAtPrefix": "met ❤️ gemaakt door", + "supportDevs": "Abonneer u op ente om ons te steunen", + "supportDiscount": "Gebruik couponcode \"AUTH\" om het eerste jaar 10% korting te krijgen", "changeEmail": "E-mailadres wijzigen", "changePassword": "Wachtwoord wijzigen", "data": "Gegevens", "importCodes": "Codes importeren", - "importTypePlainText": "Kale tekst", - "importTypeEnteEncrypted": "Ente versleutelde export", - "passwordForDecryptingExport": "Wachtwoord voor het decoderen van export", + "importTypePlainText": "Onopgemaakte tekst", + "importTypeEnteEncrypted": "Ente-versleutelde export", + "passwordForDecryptingExport": "Wachtwoord voor ontsleuteling van export", "passwordEmptyError": "Wachtwoord kan niet leeg zijn", "importFromApp": "Importeer codes van {appName}", - "importGoogleAuthGuide": "Exporteer uw accounts van Google Authenticator naar een QR-code met behulp van de optie \"Transfer Accounts\". Met een ander apparaat scan je de QR-code.\n\nTip: Je kunt de webcam van je laptop gebruiken om een foto van de QR-code te maken.", - "importSelectJsonFile": "Selecteer JSON bestand", - "importSelectAppExport": "Selecteer {appName} exportbestand", + "importGoogleAuthGuide": "Exporteer uw accounts van Google Authenticator naar een QR-code met via de optie \"Accounts overzetten\". Vervolgens scant u met een ander apparaat de QR-code.\n\nTip: U kunt de webcam van uw laptop gebruiken om een foto van de QR-code te maken.", + "importSelectJsonFile": "Selecteer JSON-bestand", + "importSelectAppExport": "Selecteer exportbestand {appName}", "importEnteEncGuide": "Selecteer het versleutelde JSON-bestand dat vanuit ente geëxporteerd is", - "importRaivoGuide": "Gebruik de optie \"Export OTPs to Zip archive\" in Raivo's instellingen.\n\nPak het zip-bestand uit en importeer het JSON-bestand.", - "importBitwardenGuide": "Gebruik de optie \"Exporteer kluis\" binnen Bitwarden Tools en importeer het niet-versleutelde JSON-bestand.", - "importAegisGuide": "Gebruik de optie \"Exporteer de kluis\" in de instellingen van Aegis.\n\nAls uw kluis is versleuteld, moet u het wachtwoord invoeren om de kluis te ontsleutelen.", + "importRaivoGuide": "Gebruik de optie \"Exporteer OTPs naar Zip-archief\" in Raivo's instellingen.\n\nPak het zip-bestand uit en importeer het JSON-bestand.", + "importBitwardenGuide": "Gebruik de optie \"Exporteer kluis\" in Bitwarden Tools en importeer het niet-versleutelde JSON-bestand.", + "importAegisGuide": "Gebruik de optie \"Kluis exporteren\" in de instellingen van Aegis.\n\nIndien uw kluis versleuteld is, dient u hiervan het wachtwoord in te voeren om de kluis te ontsleutelen.", "import2FasGuide": "Gebruik de optie \"Instellingen->Backup -Export\" in 2FAS.\n\nAls uw back-up is versleuteld, moet u het wachtwoord invoeren om de back-up te ontsleutelen", "importLastpassGuide": "Gebruik de optie \"Transfer accounts\" binnen Lastpass Authenticator instellingen en klik op \"Export accounts to file\". Importeer het gedownloade JSON bestand.", "exportCodes": "Codes exporteren", @@ -182,7 +182,7 @@ "security": "Beveiliging", "lockscreen": "Vergrendelscherm", "authToChangeLockscreenSetting": "Graag verifiëren om de vergrendelscherm instellingen te wijzigen", - "lockScreenEnablePreSteps": "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", + "deviceLockEnablePreSteps": "Om toestelvergrendeling in te schakelen, stelt u de toegangscode van het apparaat of schermvergrendeling in uw systeeminstellingen in.", "viewActiveSessions": "Actieve sessies bekijken", "authToViewYourActiveSessions": "Graag verifiëren om uw actieve sessies te bekijken", "searchHint": "Zoeken...", diff --git a/auth/lib/l10n/arb/app_pl.arb b/auth/lib/l10n/arb/app_pl.arb index f7917109cc..87df8fec10 100644 --- a/auth/lib/l10n/arb/app_pl.arb +++ b/auth/lib/l10n/arb/app_pl.arb @@ -182,7 +182,7 @@ "security": "Bezpieczeństwo", "lockscreen": "Ekran blokady", "authToChangeLockscreenSetting": "Prosimy uwierzytelnić się, aby zmienić ustawienia ekranu blokady", - "lockScreenEnablePreSteps": "Aby włączyć ekran blokady, ustaw hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", + "deviceLockEnablePreSteps": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach Twojego systemu.", "viewActiveSessions": "Zobacz aktywne sesje", "authToViewYourActiveSessions": "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje", "searchHint": "Szukaj...", @@ -198,7 +198,7 @@ "error": "Błąd", "recoveryKeyCopiedToClipboard": "Klucz odzyskiwania został skopiowany do schowka", "recoveryKeyOnForgotPassword": "Jeśli zapomnisz hasła, jedynym sposobem na odzyskanie danych jest ten klucz.", - "recoveryKeySaveDescription": "Nie przechowujemy tego klucza, proszę zachować ten 24 wyrazowy klucz w bezpiecznym miejscu.", + "recoveryKeySaveDescription": "Nie przechowujemy tego klucza, prosimy zachować ten 24-słowny klucz w bezpiecznym miejscu.", "doThisLater": "Zrób to później", "saveKey": "Zapisz klucz", "save": "Zapisz", @@ -344,7 +344,7 @@ "signInToBackup": "Zaloguj się, aby wykonać kopię zapasową swoich kodów", "singIn": "Zaloguj się", "sigInBackupReminder": "Prosimy wyeksportować swoje kody, aby upewnić się, że masz kopię zapasową, z której możesz przywrócić swoje kody.", - "offlineModeWarning": "Wybrałeś kontynuację bez kopii zapasowych. Proszę wykonywać ręczne kopie zapasowe, aby upewnić się, że Twoje kody są bezpieczne.", + "offlineModeWarning": "Zdecydowano się kontynuować bez kopii zapasowych. Prosimy wykonywać ręczne kopie zapasowe, aby upewnić się, że Twoje kody są bezpieczne.", "showLargeIcons": "Pokaż duże ikony", "shouldHideCode": "Ukryj kody", "doubleTapToViewHiddenCode": "Możesz kliknąć dwukrotnie na wpis, aby wyświetlić kod", @@ -396,11 +396,11 @@ "@androidGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." }, - "iOSLockOut": "Uwierzytelnianie biometryczne jest wyłączone. Proszę zablokować i odblokować ekran, aby je włączyć.", + "iOSLockOut": "Uwierzytelnianie biometryczne jest wyłączone. Prosimy zablokować i odblokować ekran, aby je włączyć.", "@iOSLockOut": { "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." }, - "iOSGoToSettingsDescription": "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Proszę włączyć Touch ID lub Face ID na swoim telefonie.", + "iOSGoToSettingsDescription": "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Prosimy włączyć Touch ID lub Face ID na swoim telefonie.", "@iOSGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." }, diff --git a/auth/lib/l10n/arb/app_pt.arb b/auth/lib/l10n/arb/app_pt.arb index 399b6f09a5..68b79c5256 100644 --- a/auth/lib/l10n/arb/app_pt.arb +++ b/auth/lib/l10n/arb/app_pt.arb @@ -35,7 +35,7 @@ "deleteCodeTitle": "Apagar código?", "deleteCodeMessage": "Deseja mesmo excluir este código? Esta ação é irreversível.", "viewLogsAction": "Ver logs", - "sendLogsDescription": "Isto compartilhará seus logs para ajudar-nos depurar seu problema. Enquanto tomamos precauções para ter certeza que as informações sensíveis não estejam registradas, nós encorajamos você a visualizar esses logs antes de compartilhá-los.", + "sendLogsDescription": "Isto compartilhará seus dados para nos ajudarmos a resolver seu problema. Enquanto tomamos precauções para ter certeza que as informações sensíveis não estejam registradas, nós encorajamos você a visualizar esses dados antes de compartilhá-los.", "preparingLogsTitle": "Preparando logs...", "emailLogsTitle": "Logs (e-mail)", "emailLogsMessage": "Envie os logs para {email}", @@ -72,7 +72,7 @@ "incorrectPasswordTitle": "Senha incorreta", "welcomeBack": "Bem-vindo(a) de volta!", "madeWithLoveAtPrefix": "feito com ❤️ em ", - "supportDevs": "Inscreva-se no ente para apoiar este projeto.", + "supportDevs": "Inscreva-se no ente para nos apoiar", "supportDiscount": "Use o cupom \"AUTH\" para obter 10% de desconto no primeiro ano", "changeEmail": "Alterar e-mail", "changePassword": "Alterar senha", @@ -83,7 +83,7 @@ "passwordForDecryptingExport": "Senha para descriptografar a exportação", "passwordEmptyError": "A senha não pode estar vazia", "importFromApp": "Importar códigos do {appName}", - "importGoogleAuthGuide": "Exporte suas contas do Google Authenticator para um QR code usando a opção \"Transferir contas\". Então, usando outro dispositivo, escaneie o QR code.\n\nDica: Você pode usar a câmera do seu notebook para fotografar o QR code.", + "importGoogleAuthGuide": "Exporte suas contas do Google Authenticator para um QR code usando a opção \"Transferir contas\". Então, usando outro dispositivo, escaneie o QR code.\n\nDica: você pode usar a câmera do notebook para fotografar o QR code.", "importSelectJsonFile": "Selecionar arquivo JSON", "importSelectAppExport": "Selecione o arquivo de exportação do aplicativo {appName}", "importEnteEncGuide": "Selecione o arquivo JSON criptografado exportado do Ente", @@ -182,7 +182,7 @@ "security": "Segurança", "lockscreen": "Tela de bloqueio", "authToChangeLockscreenSetting": "Por favor, autentique-se para alterar a configuração da tela de bloqueio", - "lockScreenEnablePreSteps": "Para ativar o bloqueio de tela, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.", + "deviceLockEnablePreSteps": "Para ativar o bloqueio do dispositivo, configure a senha do dispositivo ou o bloqueio de tela nas configurações do seu sistema.", "viewActiveSessions": "Ver sessões ativas", "authToViewYourActiveSessions": "Por favor, autentique-se para ver as sessões ativas", "searchHint": "Buscar...", diff --git a/auth/lib/l10n/arb/app_ru.arb b/auth/lib/l10n/arb/app_ru.arb index 7ebecdc987..288eeec358 100644 --- a/auth/lib/l10n/arb/app_ru.arb +++ b/auth/lib/l10n/arb/app_ru.arb @@ -182,7 +182,6 @@ "security": "Безопасность", "lockscreen": "Экран блокировки", "authToChangeLockscreenSetting": "Пожалуйста, авторизуйтесь, чтобы изменить настройки экрана блокировки", - "lockScreenEnablePreSteps": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.", "viewActiveSessions": "Просмотр активных сессий", "authToViewYourActiveSessions": "Пожалуйста, авторизуйтесь для просмотра активных сессий", "searchHint": "Поиск...", diff --git a/auth/lib/l10n/arb/app_sk.arb b/auth/lib/l10n/arb/app_sk.arb index faf3913ac9..30729c7031 100644 --- a/auth/lib/l10n/arb/app_sk.arb +++ b/auth/lib/l10n/arb/app_sk.arb @@ -182,7 +182,6 @@ "security": "Zabezpečenie", "lockscreen": "Uzamknutie obrazovky", "authToChangeLockscreenSetting": "Pre zmenu nastavenia uzamknutia obrazovky sa musíte overiť", - "lockScreenEnablePreSteps": "Pre povolenie uzamknutia obrazovky, nastavte prístupový kód zariadenia alebo zámok obrazovky v nastaveniach systému.", "viewActiveSessions": "Zobraziť aktívne relácie", "authToViewYourActiveSessions": "Pre zobrazenie vašich aktívnych relácii sa musíte overiť", "searchHint": "Hľadať...", diff --git a/auth/lib/l10n/arb/app_ti.arb b/auth/lib/l10n/arb/app_ti.arb index d7adb4e80e..c1614b1e0f 100644 --- a/auth/lib/l10n/arb/app_ti.arb +++ b/auth/lib/l10n/arb/app_ti.arb @@ -174,7 +174,6 @@ "security": "ድሕንነት", "lockscreen": "ስክሪን ምዕጻው", "authToChangeLockscreenSetting": "Please authenticate to change lockscreen setting", - "lockScreenEnablePreSteps": "To enable lockscreen, please setup device passcode or screen lock in your system settings.", "viewActiveSessions": "View active sessions", "authToViewYourActiveSessions": "Please authenticate to view your active sessions", "searchHint": "Search...", diff --git a/auth/lib/l10n/arb/app_tr.arb b/auth/lib/l10n/arb/app_tr.arb index 6dae512ba4..92c5c075d2 100644 --- a/auth/lib/l10n/arb/app_tr.arb +++ b/auth/lib/l10n/arb/app_tr.arb @@ -6,10 +6,10 @@ "@counterAppBarTitle": { "description": "Text shown in the AppBar of the Counter Page" }, - "onBoardingBody": "2 faktörlü kimlik doğrulama kodlarınızı koruyun", + "onBoardingBody": "2 Faktörlü Kimlik Doğrulama kodlarınızı koruyun", "onBoardingGetStarted": "Başlayın", "setupFirstAccount": "İlk hesabınızı ekleyin", - "importScanQrCode": "Karekodu tara", + "importScanQrCode": "Karekod tara", "qrCode": "QR Kodu", "importEnterSetupKey": "Kurulum anahtarını giriniz", "importAccountPageTitle": "Hesap bilgilerinizi girin", @@ -182,7 +182,7 @@ "security": "Güvenlik", "lockscreen": "Kilit ekranı", "authToChangeLockscreenSetting": "Kilit ekranı ayarını değiştirmek için lütfen kimliğinizi doğrulayın", - "lockScreenEnablePreSteps": "Kilit ekranını aktif etmek için lütfen cihazın ayarlarından şifreyi ya da ekran kilidini ayarlayın.", + "deviceLockEnablePreSteps": "Cihaz kilidini etkinleştirmek için, lütfen cihaz şifresini veya ekran kilidini ayarlayın.", "viewActiveSessions": "Aktif oturumları görüntüle", "authToViewYourActiveSessions": "Aktif oturumlarınızı görüntülemek için lütfen kimliğinizi doğrulayın", "searchHint": "Ara...", @@ -445,5 +445,26 @@ "updateNotAvailable": "Güncelleme mevcut değil", "viewRawCodes": "Ham kodları gör", "rawCodes": "Ham kodlar", - "rawCodeData": "Ham kod verisi" + "rawCodeData": "Ham kod verisi", + "appLock": "Uygulama kilidi", + "noSystemLockFound": "Sistem kilidi bulunamadı", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Cihaz kilidini etkinleştirmek için, lütfen cihaz şifresini veya ekran kilidini ayarlayın.", + "autoLock": "Otomatik Kilit", + "immediately": "Hemen", + "reEnterPassword": "Şifrenizi tekrar girin", + "reEnterPin": "PIN'inizi tekrar girin", + "next": "Sonraki", + "tooManyIncorrectAttempts": "Çok fazla hatalı deneme", + "tapToUnlock": "Açmak için dokun", + "setNewPassword": "Yeni şifre belirle", + "deviceLock": "Cihaz kilidi", + "hideContent": "İçeriği gizle", + "hideContentDescriptionAndroid": "Uygulama değiştiricide bulunan uygulama içeriğini gizler ve ekran görüntülerini devre dışı bırakır", + "hideContentDescriptioniOS": "Uygulama değiştiricideki uygulama içeriğini gizler", + "autoLockFeatureDescription": "Uygulamayı arka plana attıktan sonra kilitlendiği süre", + "appLockDescription": "Cihazınızın varsayılan kilit ekranı ile PIN veya parola içeren özel bir kilit ekranı arasında seçim yapın.", + "pinLock": "Pin kilidi", + "enterPin": "PIN Girin", + "setNewPin": "Yeni PIN belirleyin", + "importFailureDescNew": "Seçilen dosya ayrıştırılamadı." } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_uk.arb b/auth/lib/l10n/arb/app_uk.arb index 906729d60d..3882509f5a 100644 --- a/auth/lib/l10n/arb/app_uk.arb +++ b/auth/lib/l10n/arb/app_uk.arb @@ -182,7 +182,6 @@ "security": "Безпека", "lockscreen": "Екран блокування", "authToChangeLockscreenSetting": "Будь ласка, авторизуйтесь для зміни налаштувань екрану блокування", - "lockScreenEnablePreSteps": "Для увімкнення екрана блокування, будь ласка, налаштуйте пароль пристрою або блокування екрана в системних налаштуваннях.", "viewActiveSessions": "Показати активні сеанси", "authToViewYourActiveSessions": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші активні сеанси", "searchHint": "Пошук...", diff --git a/auth/lib/l10n/arb/app_vi.arb b/auth/lib/l10n/arb/app_vi.arb index a8cccdbec5..672afa36c3 100644 --- a/auth/lib/l10n/arb/app_vi.arb +++ b/auth/lib/l10n/arb/app_vi.arb @@ -20,6 +20,7 @@ "codeIssuerHint": "Nhà phát hành", "codeSecretKeyHint": "Khóa bí mật", "codeAccountHint": "Tài khoản (bạn@miền.com)", + "codeTagHint": "Thẻ", "sessionExpired": "Phiên làm việc đã hết hạn", "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" @@ -77,12 +78,14 @@ "data": "Dữ liệu", "importCodes": "Nhập mã", "importTypePlainText": "Văn bản thuần", + "importTypeEnteEncrypted": "Xuất key đã được mã hóa", "passwordForDecryptingExport": "Mật khẩu để giải mã xuất", "passwordEmptyError": "Mật khẩu không thể để trống", "importFromApp": "Nhập mã từ {appName}", "importGoogleAuthGuide": "Xuất dữ liệu tài khoản của bạn từ Google Authenticator sang mã QR bằng tùy chọn \"Chuyển tài khoản\". Sau đó dùng thiết bị khác quét mã QR.", "importSelectJsonFile": "Chọn tệp JSON", "importSelectAppExport": "Chọn {appName} tệp dữ liệu xuất", + "importEnteEncGuide": "Chọn tệp JSON được mã hóa đã xuất từ ​​ente", "importRaivoGuide": "Sử dụng tùy chọn \"Xuất OTP sang lưu trữ Zip\" trong cài đặt của Raivo.", "importBitwardenGuide": "Sử dụng tùy chọn \"Xuất vault\" trong công cụ Bitwarden và nhập tệp JSON không được mã hóa.", "importAegisGuide": "Nếu vault của bạn được mã hóa, bạn sẽ cần nhập mật khẩu vault để giải mã vault.", @@ -111,18 +114,22 @@ "copied": "\u001dĐã sao chép", "pleaseTryAgain": "Vui lòng thử lại", "existingUser": "Người dùng hiện tại", + "newUser": "Mới tham gia Ente", "delete": "Xóa", "enterYourPasswordHint": "Nhập mật khẩu của bạn", "forgotPassword": "Quên mật khẩu", "oops": "Rất tiếc", "suggestFeatures": "Tính năng đề nghị", "faq": "Câu hỏi thường gặp", + "faq_q_1": "Mức độ an toàn của ente như thế nào?", + "faq_a_1": "Tất cả các mã bạn sao lưu qua ente đều được lưu trữ dưới dạng mã hóa đầu cuối. Điều này có nghĩa là chỉ bạn mới có thể truy cập mã của mình. Ứng dụng của chúng tôi là mã nguồn mở và data của chúng tôi đã được bảo mật hoàn toàn.", "faq_q_2": "Tôi có thể truy cập mã của mình trên máy tính không?", "faq_a_2": "Bạn có thể truy cập mã của mình trên web @ auth.ente.io.", "faq_q_3": "Làm cách nào để xóa mã?", "faq_a_3": "Bạn có thể xóa mã bằng cách vuốt sang trái vào mục đó.", "faq_q_4": "Tôi có thể hỗ trợ dự án này như thế nào?", "faq_a_4": "Bạn có thể hỗ trợ sự phát triển của dự án này bằng cách đăng ký ứng dụng Ảnh @ ente.io của chúng tôi.", + "faq_q_5": "Làm sao để tôi bật FaceID trong ente", "faq_a_5": "Bạn có thể bật khóa FaceID trong Cài đặt → Bảo mật → Màn hình khóa.", "somethingWentWrongMessage": "Phát hiện có lỗi, xin thử lại", "leaveFamily": "Rời khỏi gia đình", @@ -170,7 +177,6 @@ "security": "Bảo mật", "lockscreen": "Màn hình khoá", "authToChangeLockscreenSetting": "Vui lòng xác thực để thay đổi cài đặt màn hình khóa", - "lockScreenEnablePreSteps": "Để bật màn hình khóa, vui lòng thiết lập mật khẩu thiết bị hoặc khóa màn hình trong cài đặt hệ thống của bạn.", "viewActiveSessions": "Xem danh sách phiên làm việc hiện tại", "authToViewYourActiveSessions": "Vui lòng xác thực để xem danh sách phiên làm việc của bạn", "searchHint": "Tìm kiếm...", @@ -395,5 +401,13 @@ "signOutOtherDevices": "Đăng xuất khỏi các thiết bị khác", "doNotSignOut": "Không được đăng xuất", "hearUsWhereTitle": "Bạn biết đến Ente bằng cách nào? (không bắt buộc)", - "hearUsExplanation": "Chúng tôi không theo dõi lượt cài đặt ứng dụng. Sẽ rất hữu ích nếu bạn cho chúng tôi biết nơi bạn tìm thấy chúng tôi!" + "hearUsExplanation": "Chúng tôi không theo dõi lượt cài đặt ứng dụng. Sẽ rất hữu ích nếu bạn cho chúng tôi biết nơi bạn tìm thấy chúng tôi!", + "updateNotAvailable": "Cập nhật không khả dụng", + "viewRawCodes": "Xem mã nguồn", + "rawCodes": "Mã nguồn", + "setNewPassword": "Đặt lại mật khẩu", + "deviceLock": "Khóa thiết bị", + "pinLock": "Mã PIN", + "enterPin": "Nhập mã PIN", + "setNewPin": "Đổi mã PIN" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_zh.arb b/auth/lib/l10n/arb/app_zh.arb index dd093ea166..b20bf2dd38 100644 --- a/auth/lib/l10n/arb/app_zh.arb +++ b/auth/lib/l10n/arb/app_zh.arb @@ -182,7 +182,7 @@ "security": "安全", "lockscreen": "锁屏", "authToChangeLockscreenSetting": "请验证以更改锁屏设置", - "lockScreenEnablePreSteps": "要启用锁屏,请在系统设置中设置设备密码或屏幕锁定。", + "deviceLockEnablePreSteps": "要启用设备锁,请在系统设置中设置设备密码或屏幕锁。", "viewActiveSessions": "查看活动会话", "authToViewYourActiveSessions": "请验证以查看您的活动会话", "searchHint": "搜索...", From 1bcf2c92b44aaa02677ed5b00d9d68b394d0192a Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 24 Aug 2024 19:37:52 +0530 Subject: [PATCH 0651/1179] fix: scaling of text in code, etc --- auth/lib/onboarding/view/common/tag_chip.dart | 20 +++++--- auth/lib/ui/code_widget.dart | 46 ++++++++++--------- auth/lib/ui/home/speed_dial_label_widget.dart | 25 ++++++---- auth/pubspec.lock | 12 ++++- auth/pubspec.yaml | 1 + mobile/plugins/clip_ggml | 1 + 6 files changed, 65 insertions(+), 40 deletions(-) create mode 160000 mobile/plugins/clip_ggml diff --git a/auth/lib/onboarding/view/common/tag_chip.dart b/auth/lib/onboarding/view/common/tag_chip.dart index 7f71e68b84..613b463493 100644 --- a/auth/lib/onboarding/view/common/tag_chip.dart +++ b/auth/lib/onboarding/view/common/tag_chip.dart @@ -47,13 +47,19 @@ class TagChip extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: [ - Text( - label, - style: TextStyle( - color: state == TagChipState.selected || - Theme.of(context).brightness == Brightness.dark - ? Colors.white - : colorScheme.tagTextUnselectedColor, + MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: const TextScaler.linear(1), + ), + child: Text( + label, + style: TextStyle( + color: state == TagChipState.selected || + Theme.of(context).brightness == Brightness.dark + ? Colors.white + : colorScheme.tagTextUnselectedColor, + fontSize: 14, + ), ), ), if (state == TagChipState.selected && diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index cb8b274cad..a085c29db3 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'dart:ui' as ui; +import 'package:auto_size_text/auto_size_text.dart'; import 'package:clipboard/clipboard.dart'; import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/ente_theme_data.dart'; @@ -113,7 +114,7 @@ class _CodeWidgetState extends State { CodeTimerProgress( period: widget.code.period, ), - const SizedBox(height: 16), + const SizedBox(height: 16 + 12), Row( children: [ _shouldShowLargeIcon ? _getIcon() : const SizedBox.shrink(), @@ -129,7 +130,7 @@ class _CodeWidgetState extends State { ], ), const SizedBox( - height: 20, + height: 20 + 12, ), ], ), @@ -148,7 +149,6 @@ class _CodeWidgetState extends State { Widget clippedCard(AppLocalizations l10n) { return Container( - height: 132, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: Theme.of(context).colorScheme.codeCardBackgroundColor, @@ -331,14 +331,16 @@ class _CodeWidgetState extends State { builder: (context, value, child) { return Material( type: MaterialType.transparency, - child: Text( + child: AutoSizeText( _getFormattedCode(value), style: const TextStyle(fontSize: 24), + maxLines: 1, ), ); }, ), ), + const SizedBox(width: 8), widget.code.type.isTOTPCompatible ? GestureDetector( onTap: () { @@ -395,26 +397,28 @@ class _CodeWidgetState extends State { return Padding( padding: const EdgeInsets.only(left: 16, right: 16), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - safeDecode(widget.code.issuer).trim(), - style: Theme.of(context).textTheme.titleLarge, - ), - const SizedBox(height: 2), - Text( - safeDecode(widget.code.account).trim(), - style: Theme.of(context).textTheme.bodySmall?.copyWith( - fontSize: 12, - color: Colors.grey, - ), - ), - ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + safeDecode(widget.code.issuer).trim(), + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 2), + Text( + safeDecode(widget.code.account).trim(), + style: Theme.of(context).textTheme.bodySmall?.copyWith( + fontSize: 12, + color: Colors.grey, + ), + ), + ], + ), ), + const SizedBox(width: 8), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ diff --git a/auth/lib/ui/home/speed_dial_label_widget.dart b/auth/lib/ui/home/speed_dial_label_widget.dart index 4889ffb6a9..78bcfb154f 100644 --- a/auth/lib/ui/home/speed_dial_label_widget.dart +++ b/auth/lib/ui/home/speed_dial_label_widget.dart @@ -11,17 +11,22 @@ class SpeedDialLabelWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.all(4), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Theme.of(context).colorScheme.fabBackgroundColor, + return MediaQuery( + data: const MediaQueryData( + textScaler: TextScaler.linear(1), ), - child: Text( - label, - style: TextStyle( - color: Theme.of(context).colorScheme.fabForegroundColor, + child: Container( + margin: const EdgeInsets.all(4), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Theme.of(context).colorScheme.fabBackgroundColor, + ), + child: Text( + label, + style: TextStyle( + color: Theme.of(context).colorScheme.fabForegroundColor, + ), ), ), ); diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 5e425ae12f..914d5281a5 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -65,6 +65,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + auto_size_text: + dependency: "direct main" + description: + name: auto_size_text + sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" + url: "https://pub.dev" + source: hosted + version: "3.0.0" base32: dependency: "direct main" description: @@ -1707,10 +1715,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.4" + version: "14.2.5" watcher: dependency: transitive description: diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 8c7e28b873..5ec1a00636 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: adaptive_theme: ^3.1.0 # done app_links: ^3.5.0 archive: ^3.3.7 + auto_size_text: ^3.0.0 base32: ^2.1.3 bip39: ^1.0.6 #done bloc: ^8.1.2 diff --git a/mobile/plugins/clip_ggml b/mobile/plugins/clip_ggml new file mode 160000 index 0000000000..16c7daea5d --- /dev/null +++ b/mobile/plugins/clip_ggml @@ -0,0 +1 @@ +Subproject commit 16c7daea5d6b80235ac473f1a823b0ff44f5305e From ebc28fb83194bdc88ed64e4554b46499f9b5f2ad Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 24 Aug 2024 19:40:58 +0530 Subject: [PATCH 0652/1179] fix: unfold constants --- auth/lib/ui/code_widget.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index a085c29db3..4cd263be5a 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -114,7 +114,7 @@ class _CodeWidgetState extends State { CodeTimerProgress( period: widget.code.period, ), - const SizedBox(height: 16 + 12), + const SizedBox(height: 28), Row( children: [ _shouldShowLargeIcon ? _getIcon() : const SizedBox.shrink(), @@ -129,9 +129,7 @@ class _CodeWidgetState extends State { ), ], ), - const SizedBox( - height: 20 + 12, - ), + const SizedBox(height: 32), ], ), if (widget.code.isPinned) ...[ From f54a9429de4ec760e63d0455ae0748f47750307f Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 24 Aug 2024 19:42:22 +0530 Subject: [PATCH 0653/1179] chore: remove unwanted --- mobile/plugins/clip_ggml | 1 - 1 file changed, 1 deletion(-) delete mode 160000 mobile/plugins/clip_ggml diff --git a/mobile/plugins/clip_ggml b/mobile/plugins/clip_ggml deleted file mode 160000 index 16c7daea5d..0000000000 --- a/mobile/plugins/clip_ggml +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 16c7daea5d6b80235ac473f1a823b0ff44f5305e From 3a65f49ab3ce21d7fe2984adf4d16e88d70bdfc4 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 24 Aug 2024 19:45:42 +0530 Subject: [PATCH 0654/1179] chore: remove -pre from pubspec --- auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 5ec1a00636..4d9ae52d9a 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -72,7 +72,7 @@ dependencies: local_auth_android: ^1.0.37 local_auth_darwin: ^1.2.2 logging: ^1.0.1 - modal_bottom_sheet: ^3.0.0-pre + modal_bottom_sheet: ^3.0.0 move_to_background: ^1.0.2 otp: ^3.1.1 package_info_plus: ^4.1.0 From 9aefea66d2a2e2046f7e334ecf952aa9f1d8f82d Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sat, 24 Aug 2024 22:11:54 +0530 Subject: [PATCH 0655/1179] chore: update packages --- auth/ios/Podfile.lock | 31 ++-- auth/lib/ui/account/recovery_key_page.dart | 3 +- auth/lib/ui/home_page.dart | 2 +- .../Flutter/GeneratedPluginRegistrant.swift | 2 +- auth/pubspec.lock | 132 ++++++++++-------- auth/pubspec.yaml | 22 +-- 6 files changed, 102 insertions(+), 90 deletions(-) diff --git a/auth/ios/Podfile.lock b/auth/ios/Podfile.lock index 23d01f74c0..0f0fdac26e 100644 --- a/auth/ios/Podfile.lock +++ b/auth/ios/Podfile.lock @@ -1,9 +1,9 @@ PODS: - - app_links (0.0.1): + - app_links (0.0.2): - Flutter - connectivity_plus (0.0.1): - Flutter - - ReachabilitySwift + - FlutterMacOS - device_info_plus (0.0.1): - Flutter - DKImagePickerController/Core (4.3.9): @@ -82,15 +82,14 @@ PODS: - qr_code_scanner (0.2.0): - Flutter - MTBBarcodeScanner - - ReachabilitySwift (5.2.3) - SDWebImage (5.19.2): - SDWebImage/Core (= 5.19.2) - SDWebImage/Core (5.19.2) - - Sentry/HybridSDK (8.25.0) - - sentry_flutter (7.20.2): + - Sentry/HybridSDK (8.33.0) + - sentry_flutter (8.7.0): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.25.0) + - Sentry/HybridSDK (= 8.33.0) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -126,7 +125,7 @@ PODS: DEPENDENCIES: - app_links (from `.symlinks/plugins/app_links/ios`) - - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - file_saver (from `.symlinks/plugins/file_saver/ios`) @@ -159,7 +158,6 @@ SPEC REPOS: - DKPhotoGallery - MTBBarcodeScanner - OrderedSet - - ReachabilitySwift - SDWebImage - Sentry - sqlite3 @@ -170,7 +168,7 @@ EXTERNAL SOURCES: app_links: :path: ".symlinks/plugins/app_links/ios" connectivity_plus: - :path: ".symlinks/plugins/connectivity_plus/ios" + :path: ".symlinks/plugins/connectivity_plus/darwin" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" file_picker: @@ -223,12 +221,12 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: - app_links: e70ca16b4b0f88253b3b3660200d4a10b4ea9795 - connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d + app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0 + connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de + file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808 fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 @@ -243,15 +241,14 @@ SPEC CHECKSUMS: move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c - package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e - ReachabilitySwift: 7f151ff156cea1481a8411701195ac6a984f4979 SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a - Sentry: cd86fc55628f5b7c572cabe66cc8f95a9d2f165a - sentry_flutter: 0cf2507eb90ff7a6aa3304e900dd7f08edbbefdf - share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 + Sentry: 8560050221424aef0bebc8e31eedf00af80f90a6 + sentry_flutter: e26b861f744e5037a3faf9bf56603ec65d658a61 + share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sodium_libs: 1faae17af662384acbd13e41867a0008cd2e2318 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec diff --git a/auth/lib/ui/account/recovery_key_page.dart b/auth/lib/ui/account/recovery_key_page.dart index a74b2daeca..0422a9e2b8 100644 --- a/auth/lib/ui/account/recovery_key_page.dart +++ b/auth/lib/ui/account/recovery_key_page.dart @@ -314,8 +314,7 @@ class _RecoveryKeyPageState extends State { await _recoveryKeyFile.delete(); } _recoveryKeyFile.writeAsStringSync(recoveryKey); - // ignore: deprecated_member_use - await Share.shareFiles([_recoveryKeyFile.path]); + await Share.shareXFiles([XFile(_recoveryKeyFile.path)]); Future.delayed(const Duration(milliseconds: 500), () { if (mounted) { setState(() { diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index 155b4763f7..1e17947210 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -409,7 +409,7 @@ class _HomePageState extends State { final appLinks = AppLinks(); try { String? initialLink; - initialLink = await appLinks.getInitialAppLinkString(); + initialLink = await appLinks.getInitialLinkString(); // Parse the link and warn the user, if it is not correct, // but keep in mind it could be `null`. if (initialLink != null) { diff --git a/auth/macos/Flutter/GeneratedPluginRegistrant.swift b/auth/macos/Flutter/GeneratedPluginRegistrant.swift index 6c82e1dcac..5e814a187f 100644 --- a/auth/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/auth/macos/Flutter/GeneratedPluginRegistrant.swift @@ -30,7 +30,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) - ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FileSaverPlugin.register(with: registry.registrar(forPlugin: "FileSaverPlugin")) diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 914d5281a5..d60f56eecf 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -37,10 +37,34 @@ packages: dependency: "direct main" description: name: app_links - sha256: "3ced568a5d9e309e99af71285666f1f3117bddd0bd5b3317979dccc1a40cada4" + sha256: f04c3ca96426baba784c736a201926bd4145524c36a1b38942a351b033305e21 url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "6.2.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" archive: dependency: "direct main" description: @@ -237,18 +261,18 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "6.0.5" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "2.0.1" convert: dependency: "direct main" description: @@ -261,10 +285,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: @@ -342,10 +366,10 @@ packages: dependency: "direct main" description: name: email_validator - sha256: e9a90f27ab2b915a27d7f9c2a7ddda5dd752d6942616ee83529b686fc086221b + sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb url: "https://pub.dev" source: hosted - version: "2.1.17" + version: "3.0.0" ente_crypto_dart: dependency: "direct main" description: @@ -355,14 +379,6 @@ packages: url: "https://github.com/ente-io/ente_crypto_dart.git" source: git version: "1.0.0" - equatable: - dependency: transitive - description: - name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" - source: hosted - version: "2.0.5" event_bus: dependency: "direct main" description: @@ -415,18 +431,18 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "1bbf65dd997458a08b531042ec3794112a6c39c07c37ff22113d2e7e4f81d4e4" + sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "8.1.2" file_saver: dependency: "direct main" description: name: file_saver - sha256: d375b351e3331663abbaf99747abd72f159260c58fbbdbca9f926f02c01bdc48 + sha256: bdebc720e17b3e01aba59da69b6d47020a7e5ba7d5c75bd9194f9618d5f16ef4 url: "https://pub.dev" source: hosted - version: "0.2.13" + version: "0.2.12" fixnum: dependency: "direct main" description: @@ -468,10 +484,10 @@ packages: dependency: "direct main" description: name: flutter_context_menu - sha256: "9f220a8fa0290c68e38000d6d62a0dc4555d490c15a5bd856a6e6d255d81b8dc" + sha256: "4bc1dc30ae5aa705ed99ebbeb875898c6341a6d092397a566fecd5184b392380" url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.2.0" flutter_displaymode: dependency: "direct main" description: @@ -709,10 +725,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847" + sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc" url: "https://pub.dev" source: hosted - version: "8.2.6" + version: "8.2.8" freezed_annotation: dependency: transitive description: @@ -805,10 +821,10 @@ packages: dependency: "direct main" description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -901,10 +917,10 @@ packages: dependency: "direct dev" description: name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" local_auth: dependency: "direct main" description: @@ -1053,18 +1069,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" password_strength: dependency: "direct main" description: @@ -1269,34 +1285,34 @@ packages: dependency: "direct main" description: name: sentry - sha256: "57514bc72d441ffdc463f498d6886aa586a2494fa467a1eb9d649c28010d7ee3" + sha256: "0f787e27ff617e4f88f7074977240406a9c5509444bac64a4dfa5b3200fb5632" url: "https://pub.dev" source: hosted - version: "7.20.2" + version: "8.7.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "9723d58470ca43a360681ddd26abb71ca7b815f706bc8d3747afd054cf639ded" + sha256: fbbb47d72ccca48be25bf3c2ced6ab6e872991af3a0ba78e54be8d138f2e053f url: "https://pub.dev" source: hosted - version: "7.20.2" + version: "8.7.0" share_plus: dependency: "direct main" description: name: share_plus - sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + sha256: "468c43f285207c84bcabf5737f33b914ceb8eb38398b91e5e3ad1698d1b72a52" url: "https://pub.dev" source: hosted - version: "7.2.2" + version: "10.0.2" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" + sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "5.0.0" shared_preferences: dependency: "direct main" description: @@ -1341,10 +1357,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.2.1" shared_preferences_windows: dependency: transitive description: @@ -1459,10 +1475,10 @@ packages: dependency: "direct main" description: name: sqlite3 - sha256: b384f598b813b347c5a7e5ffad82cbaff1bec3d1561af267041e66f6f0899295 + sha256: "45f168ae2213201b54e09429ed0c593dc2c88c924a1488d6f9c523a255d567cb" url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.6" sqlite3_flutter_libs: dependency: "direct main" description: @@ -1659,18 +1675,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: @@ -1731,26 +1747,26 @@ packages: dependency: transitive description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "1.0.0" web_socket: dependency: transitive description: name: web_socket - sha256: "24301d8c293ce6fe327ffe6f59d8fd8834735f0ec36e4fd383ec7ff8a64aa078" + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: a2d56211ee4d35d9b344d9d4ce60f362e4f5d1aafb988302906bd732bc731276 + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" win32: dependency: "direct main" description: @@ -1771,10 +1787,10 @@ packages: dependency: "direct main" description: name: window_manager - sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" + sha256: ab8b2a7f97543d3db2b506c9d875e637149d48ee0c6a5cb5f5fd6e0dac463792 url: "https://pub.dev" source: hosted - version: "0.3.9" + version: "0.4.2" xdg_directories: dependency: transitive description: diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 4d9ae52d9a..3b49002a09 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: adaptive_theme: ^3.1.0 # done - app_links: ^3.5.0 + app_links: ^6.2.1 archive: ^3.3.7 auto_size_text: ^3.0.0 base32: ^2.1.3 @@ -17,7 +17,7 @@ dependencies: clipboard: ^0.1.3 collection: ^1.18.0 # dart confetti: ^0.7.0 - connectivity_plus: ^5.0.2 + connectivity_plus: ^6.0.5 convert: ^3.1.1 desktop_webview_window: git: @@ -27,7 +27,7 @@ dependencies: device_info_plus: ^9.1.1 dio: ^5.4.0 dotted_border: ^2.0.0+2 - email_validator: ^2.0.1 + email_validator: ^3.0.0 ente_crypto_dart: git: url: https://github.com/ente-io/ente_crypto_dart.git @@ -35,7 +35,7 @@ dependencies: expandable: ^5.0.1 expansion_tile_card: ^3.0.0 ffi: ^2.1.0 - file_picker: ^6.1.1 + file_picker: ^8.1.2 # https://github.com/incrediblezayed/file_saver/issues/86 file_saver: ^0.2.11 fixnum: ^1.1.0 @@ -44,7 +44,7 @@ dependencies: sdk: flutter flutter_animate: ^4.1.0 flutter_bloc: ^8.0.1 - flutter_context_menu: ^0.1.3 + flutter_context_menu: ^0.2.0 flutter_displaymode: ^0.6.0 flutter_email_sender: ^6.0.2 flutter_inappwebview: ^6.0.0 @@ -75,7 +75,7 @@ dependencies: modal_bottom_sheet: ^3.0.0 move_to_background: ^1.0.2 otp: ^3.1.1 - package_info_plus: ^4.1.0 + package_info_plus: ^8.0.2 password_strength: ^0.2.0 path: ^1.8.3 path_provider: ^2.0.11 @@ -85,9 +85,9 @@ dependencies: protobuf: ^3.0.0 qr_code_scanner: ^1.0.1 qr_flutter: ^4.1.0 - sentry: ^7.9.0 - sentry_flutter: ^7.9.0 - share_plus: ^7.2.1 + sentry: ^8.7.0 + sentry_flutter: ^8.7.0 + share_plus: ^10.0.2 shared_preferences: ^2.0.5 sqflite: git: @@ -104,7 +104,7 @@ dependencies: url_launcher: ^6.1.5 uuid: ^4.2.2 win32: ^5.1.1 - window_manager: ^0.3.9 + window_manager: ^0.4.2 dependency_overrides: flutter_secure_storage_linux: @@ -117,7 +117,7 @@ dev_dependencies: flutter_test: sdk: flutter json_serializable: ^6.2.0 - lints: ^3.0.0 + lints: ^4.0.0 mocktail: ^1.0.3 # The following section is specific to Flutter. From 95a7d9288dba4169dc519ee2e7f04c39ad4f2b65 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:34:38 +0530 Subject: [PATCH 0656/1179] [mob] Fixed typo --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 41aa799988..9db6d2d291 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -1644,7 +1644,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("View all EXIF data"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Large files"), "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "View files that are consuming the most amount of storage"), + "View files that are consuming the most amount of storage."), "viewLogs": MessageLookupByLibrary.simpleMessage("View logs"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("View recovery key"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index a95e8b035c..479a187c97 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -3602,10 +3602,10 @@ class S { ); } - /// `View files that are consuming the most amount of storage` + /// `View files that are consuming the most amount of storage.` String get viewLargeFilesDesc { return Intl.message( - 'View files that are consuming the most amount of storage', + 'View files that are consuming the most amount of storage.', name: 'viewLargeFilesDesc', desc: '', args: [], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index a09d80b36f..2bbf04897c 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -496,7 +496,7 @@ "removeDuplicates": "Remove duplicates", "removeDuplicatesDesc": "Review and remove files that are exact duplicates.", "viewLargeFiles": "Large files", - "viewLargeFilesDesc": "View files that are consuming the most amount of storage", + "viewLargeFilesDesc": "View files that are consuming the most amount of storage.", "noDuplicates": "✨ No duplicates", "youveNoDuplicateFilesThatCanBeCleared": "You've no duplicate files that can be cleared", "success": "Success", From 999de31233ec984174129927575bbb51673c1f44 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:21:32 +0530 Subject: [PATCH 0657/1179] [server] Fix go mod --- server/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/go.mod b/server/go.mod index e73bd9a031..ec7439a8f8 100644 --- a/server/go.mod +++ b/server/go.mod @@ -33,6 +33,7 @@ require ( github.com/spf13/viper v1.8.1 github.com/stretchr/testify v1.9.0 github.com/stripe/stripe-go/v72 v72.37.0 + github.com/TwiN'go-away v1.6.13 github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f github.com/ulule/limiter/v3 v3.8.0 github.com/zsais/go-gin-prometheus v0.1.0 @@ -46,7 +47,6 @@ require ( require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/longrunning v0.4.1 // indirect - github.com/TwiN/ v1.6.13 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/fxamacker/cbor/v2 v2.6.0 // indirect From f6dcda883510191ccf30d012f43e0d19fd0538d2 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 14:29:16 +0530 Subject: [PATCH 0658/1179] [doc] Update image in doc --- docs/docs/photos/features/cast/index.md | 2 +- .../photos/features/cast/tv-pairing-screen.png | Bin 0 -> 28700 bytes .../photos/features/cast/tv-pairing-screen.webp | Bin 54930 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/docs/photos/features/cast/tv-pairing-screen.png delete mode 100644 docs/docs/photos/features/cast/tv-pairing-screen.webp diff --git a/docs/docs/photos/features/cast/index.md b/docs/docs/photos/features/cast/index.md index ecd91cb7ce..f93b07cfa3 100644 --- a/docs/docs/photos/features/cast/index.md +++ b/docs/docs/photos/features/cast/index.md @@ -50,7 +50,7 @@ Chromecast TVs or any other internet-connected large screen devices.
-![Pairing screen](tv-pairing-screen.webp) +![Pairing screen](tv-pairing-screen.png)
diff --git a/docs/docs/photos/features/cast/tv-pairing-screen.png b/docs/docs/photos/features/cast/tv-pairing-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..aec1a201197cec22858483f999d7b73d4df56c92 GIT binary patch literal 28700 zcmd?R2T&B>wl6$@WI>|jEK!1hfPhF&5=C-ON)m<~hpgl%NJbDOs05KP!~v8X1SH2n zG6)O=6%~#C`YUBW^|GO3`SS80 zEbQ`f83zX^EG&$Lg@ufatfQl2W@d()n;V5f;o{y*fHN(b3UgzI-t-FyQ0kgF>Og z!ost&vs6@6ec!*Io}N}!6*xyYA08ea92}&jr~mx<)6LCIT3XstK|xGR+}+)so}L~C zgQ=^lgN@BiOic9j^gez1R9swaZ*QNOnHd)s7aSbSA+9(%IqBxR?Gc!$1O&J*(Ha525;o-!@M0t66JsFvmm6h@F@w~jewVgIyx2C=XdYk zbx~J~8bX;y7r%V@Qr5=zp*47KZ_hrf(aXz=i;Jtdxj8B-ba!_*v~$O`xVN#fQOhgd zA=!aJL2mJGR4iQ4sj2=Ai-UuMfz97NOw6xS(Xxxl-jkH# z;NZA#?k=WlOHR*X^YY`ZTeqAGJNx_lU%!5>m0LWJo>vqQR_EXlqN{7Kq$I*b42w?-ZVFC! z_f0Z13~LX27X2*L)*;)>OqQE;?|uFE;tFL$+cFy)c^L5si7w;+&((_gL5 z&R@5;E8E*k8yi1=t_}zb6T9!n2m(EuQ&*DL_n+IH5+>=8BfC~3lq9=BmL=Z(P@Jf} z1s??Zy{`?!0u}a2fIt;5!61<1AqfcdVT}O<%7Ng3I`~fUKw(^P5a{DW%&`9d!LWlG zGyJ>2QY47{1#Jk!g~<~YVrVU=0o=+lEYTQl?=e3QFx;+K>R`D2Q^Ugk%C>{JQJ(0J zZq4_cJMddTK{H(|LL%fnMxdbK-=f?=VoRd*l<={klZVbCAk43>T&`<2N)yj zV}2kQTN_}03V;#+)G*XPvi;XE`m5M~r|UBA0xRxaj7g0!8fjr%j8R+;<7a=2;-eVL zTVfRd=Z0DDPGJEYK%WaQDg~^=!714P98&(9xcfV{2iR^Y*#8zl-SPbqh6iYCqkB1Z z^J9mE8rDCDl)pOg{~33Qi&BMHAdnpGM0-6h{{e{}>%R)Qf0gI&boIvqbp7X$^54WA zZHtc_kUNCkDGzlaHeP0U`%i|R|0baRj%{lg!1mt)sD%I1wSb%dsu zcWf;?Nc8^6(DUB}RF50eD6nK%ukXO;uy3OAc>g_s`a8Bl%K+Pd3!vg~LWO&D5 zS1e*kB-OtIQ2)U6-vg+>vJIzk2Xy^+M5w>ZWv)`Fe+!^;|C&PmVf!yi*8UnX|H||# zZ@WrF|0T&9kc|Cj>i2iK%vIj@Zvhm*Hj*A>10t}#MX(%68bSBlOdgbZu;AuoKozEm zNrJC(C`<-EiV>9+lTA5dvZ)kIB2|aUSNkw|l_}=X9+P=hVh%+xiI^egFdLJDU0Dwx zhdySs+QjQ{KP371I_R=l92AuX4m<9X=yWUB*#yx18(b=8c4e&&f=o&U8Pq%m`t_Lv1@uLYbSh zEcZTq0sF9qc1g&o#Dc?qlfyxDoG`3IRS1rKIvTH!1xb?fXocbb{eUWPnZ5wCQ4;Cx z-tL{Y;{u6*5{=1{UjzEBS-7?;E8Yg zjjU2N;!J||=N|md)*;JX(e7h&9VYF?rGfE--#v5J^9evml2J!3TpO&{2>s8W>n+STQa!lB3r87wJg0CA|{TdBZBYE9#eNub(G_1QYx?#as+~SvClTVz;B} z_4xfES-M?}fO2&@?#|=e*F_|1#nz4X1l7OLPtB$1*{TPX)xAxB7E~)y)g}Apx6OXv zk<4bm>wL+P#WSB^sm+tc?Rm*A36Q@1GX+I|lMk%0dSO=xeB#bc5)fbnIZl}DwCI4Gx2l463ma{FsXNPT4^q_)C-nC4F0CR%g`spjq8_GjmtUjTaq^oR( zX+eN$VQboar80{&0u9qzz-+wfnMPJx@9CI96CYY#Iju=T_ z8E4X&@=)Bg3nw6Ypa_=&!N`ffHmEOV``-GRKU=@;IWts3~N!H;kxGavS#bchM3 zQLM@kmQ+-at(2A|F&+q52(0-mo?KEl{p7yB&_l{lJ1u$OG72)l%lMrQm!#u!Gsl52 zf+PX;FQoZ>@qCt6tH%WsGU*Dy9pY>}eZW^{0%g=$pSXS{5uc3YFiD0(Po`%!8s;Y4 zyXLCne#A6`id&zpQ#5J$<5RxrHGY$-K~Je}GdruR#3KJyF$@8O*!< zp}~R{ekP!*v2^^%0rul?&WuQt=SRgKOcYmBB~kUDBnHRQ{6Z#b(xxBU_W!|whYIg5 zPXfXr!)}uR89c!L^p(&yGkeT2<9R@)l7Okc&sxH)rZ!0aXl1u&F zidQCGwlfecC0c25;oYSAby7X8{dKTA>Po-z$vO32HdsD4JQuhhu!aLmhUk7uyd5s` z-0{$b8>cDjKiRDp8MOEN_0&^>)BxNpk4zk-<{NzAhuz>;RTX?d|A%`pt}nfvS?w<^ zm>JQqM9<06m8sB;)pCgEiPa&}@F|1kSS*kVu-eKyiWDL*IbbNNEMZWG4zPqZUyp<* z)9*v(VG8khpnFO{2%yfOmI`_f=n^3E!jcxWOa@@lz}TqVl5z!wv0T8E{UM z{2p4pSji5XrkaC7EMDXk@H>?R^jry@Zs#jc4i;d`O*`R>K~TR)Dof6a4utaCXgEK; zf=?mikGRu2`2-VhF4k71A1l2t@uRAB4Jd7XIT2)c6{;Qzw|vODO`~l(lrNchmx~#m zOpQE8!Jo|w3Gz9wzU*dv=46kmz48N3_l=YNCnbq@62744VT1H_&ISqPiNrYrSPk!48@f{+_Ll>R&K~xz`AvVC_U$!q|&MXoOcv_FKQ*;Y7Sd(n`?O~ z&8{<%ZTKI=tWEQIH3OR<8kVlz(rZZuK3gw9n5gUi#b1u8AKhjSE791i%ptXq66Lva ziMjBF9#hP(?(ucAuM<=0=~?RUaeS~bk+4JHwrQR=VmBsB_37Ed+YzX^z7N=5B2`M z?E5UU!t>~N;=j5pw(q_(AYu_Gyjmr`;2!qhIiXv1wCzd*+QKux7my{cgUPs_J|*%5&L%VO|f zH-cB2-hX`!1yeJ&+q5*KxLyQGV#z9@N!TrV@$PN7u8jgYF2z;@L9@Udo?ub%jnVh` zG2${V%-O8pk0PW3f1X`3TR*kl=m-@9g*gIo7pUe}#DJ~UsmC8?JVIekb*r+p|Ft=X9K*^5`ElTc8+X+NSoRIjb6UA<*^8#Kx0veI|a)u3t^&9y60coL!PZ4I7gHE!R zgt6rL(F(#QE!cG-n|Vf=yfayEn!5Zd-%bHBpiAOTGTPVK4EsQX5>6h2sG2s21z(N| zWbwe#w1NL(2Jpk?Gb7t(2=G^eSXaz~$>DKmJZmOoV&kB+kFzWzR}2Ex{0U`7jAUYm znW+MDFHRT;Lm<=M1wmM3H@YNN++MBD^Q{EEN4tr&-k#n}MK@UMLU7PeHr=dp;#NRO zmp`Xlen1-Mhn-s*%mpZ**_4}4wXc;Wiu9ZGXWbZ9^(KfIx@r4UAtgaBrbq(TFJS|Y zyTE!QTM^`ks6s8|?>+m{H*?zhX>G~NZFBdhPv1ReIAiZ>i>D6_yhXctIFtqMT1a_w zMN9ZDWEmMucYxlwm((lKi$ufhFQU;fVoviSw4sA@b~5-%+inoN~RIz6qGuP*0#j&xH`IIyu7)JACiVTMLyJg+Hgl_Kd(6N=I51tnTczg z3|r*0Q&bNqg|oEwBp>!bFL&y3^b@?b{fIk0GY5_p$Amd=bywt759&v*7Oez;^|wGKmemCEFDi*diW$1N;SIR1h&7v)pvhQV?Ts$M7jP$?rrAGDu|wj)5JBN^kMy~Ztmz<*xIcx9ehD0Avc--?I|6T&>5ca0}t?hex5`(Wj3yfWV~$6M^&z>WWOk*(Y1PCSAUUs&is z#ulIJ1a~Q%$9Z2S8=JB~bqx3YhhY2|XbhP2ma49Y`>#_H-BE3clXv|d$BDfXMhLzn z#D{V+td7*wQPyJumBiG*&e05oG&83=M{fr3mMveARU)<8#mM0!4akN3eb0g;0q;e5 zN~dW;{-rxPoUL+k)rBUT23Qr$`9(I~L-L7;jbOSF+^6Op9gNLP)HguOqrb1!^mX^5 z4*7G2Rbo&HggS+VY+<*YCJoFWk;0G}diV)eHZ8jy{>y5X_&QpR-7Z^ewd&$m=^ohc zgkufyWqSCt81mbuy#0=12|;hn98>1U_ilohdc^5yW^MKut3mIm1#C5REz`^=jIi@+ zLsdUyXtB-&^_eNn^C0t=6!cseX=xQ1kmn{!pJ$YNQBaU6#HI&&C#t*1$T=Q?Dxd$@ zgAz0yN*(jEP$Ba8^b)_m%riSrsi|Wx<;ru z6`Yx$eHcU?FWvDRpn%_~QNz=uw|`4dShIR2 z@vV~ObJH}3+VR_O=%*E8w_%%O3cqo=(%ALvX_1SpHUh{+TE%#~7BSd%HJxv8t&rN| z3@K^N9zQ#>esqI!OBW`11}?BKKOO?IA2x45|ZZ?wbV8ruD~9Uc2o+PFvlfNd{Lf8PLFA z#>8ceeqst-MM)30JI_CRT)5L$%6@iSc$>SNiToig*pmWTd5PjxhO1Nk@$k{Xjo2$ zw`ka- ze*~Sr*{%Nh$^sR+K77_>GwOewm?=O5hZbki5JUY7W3)VI4AOQohfN_2rUe&dpe25; zpFuP4kikWJbFV))lDoc9i4IQ+?(FAr7J8nSF=X|VcK=Q<6lS{eu;Au;70J+`_Uxg{ z(QXDTGElzr{^Cp-SMQ_{Gu*uG?8{Qyxl&>`7UShMqQ=~zv?`O1v59}IG3+*$s*=KI z%UXXje1VgTj^4`)44fOkm>YLmu%Y<6 z>0~4z;3|2Pe=^F;3TuM4bO=bW+QA4yH0KCRO{4QBcI7v6DdE1HCk5A^5(j*h$PB_= zxL^|rO+_xIcecJGB69M_i#z*(-;K^`(J zZUxCiu|JkxPS6nTyF31()Uv)c)KH0#|H9Z=ksQvp{|)K7(esP%Y)sgNDM|LQH07-4 z0#P$rrya%hnsIkAcVF42<^X*W)exivL2Z!Idl7nH$MV}v+G~*3w#7G8ciCC=T` ziJVZ{Fi?Y-wS4laX-(OLc**$fCJJkhiD>qq_(Z1V)tI6e6CMd!ucd4=W100T+9#PK zU61|u6r#UpPlTr62};_qAMwm>l`@No?JaymR_6Q3t^{p7OsPOUv2Vk9{*~Fj2j|P1 zZL(}a97d>?y_7P<%WP6kx5tm;o>YalaCA8ucFS`A1(R_6^Se=+ku9Ry3(yh?B?qY` zws8x=C-Nf>WG}1RkmuL3xq01Nod{m%6^L)8Y?7=L|&Qog8sauIky;kq&XaTC(6_~rp|2C???H2v#P z1N?>h_LN-1{H?L1dOlcL+OmJ5W{>3-pU0{Lc6M1Oa@hU>9q2_bYQxC=8OKph0>boy zbS^covlWl^9nFk#sErD4SlKukH!S(O_1l#5=s3iKAyL_g_?oXj@+T$}hmz{L zh(tmamjp#fctMvpe?GE`kbb#(CMt67sfw(21!=W8*MvU(wEXEas!t~op}w5)YwU#U z9&9|iFEQ?JYh=U8=am-7yi%^oci=8Be+gcjJl%Lc^dvkeRdHTk4Z=`w`^v|99;`A? zV63vfXS*LS@c7CK?69Dm4$iiuq334~qT@<=#s~$VG=oFN0UPFYH&J*R8HW&D5kcJ( z;VmquF_zz;T_82bf<)&SgedLW6jNlYrm9FBm%nq`%t!+7wcfr9lMTNV^A_h}d})|s zeN5e9cNU#*3v z$cwmrxl&2xwjbwYPTr4`b8>v$w$W2xTd-H9Q?Vt!teq-9k0i*H-HMLkS4Udlz37pc z?1}Hw)I*+!W!Zf*$TuRbqkE91?>XGn8nn_r^yHx2M+|W@AhcW8A_H6$kKk2be#E-)T-5+#>6vsV zQYOy4J$%H*~byW%_nDjw-HV|Y_yRdwpJ_!yOF!njk=>| zSmDmOl6!+-7_ZSl)P$AiCfS!^ai3CX(`pNzIgG=rfRTz~o2NK8aAKm)OQRR+yF^V3 zhs&MZJQ9x}I;F~14xCcTJ}aq}WfFoR!tFuXID9ZGj&W%ad7IoISzp8a;f(2}{05f4 z*1a?a*umz0YD??V`Mq?)12qS_rMYC7S>N`4Xrn-&~C@=O~Q|VK8~6yN^skG^mzQM z026#J09AZ#ScyyrGV-`)ic!B$w6FCIx6{|A)ia?O8aM~*JC&!oaR`sPpNJB+m%gb_ z>kMEa%~qxPa9nfTN2`#`v^_BM|$=)lVgZD0bJ_bDdQ*58((U9C9%Yw zB^hd=^B%mvL{$nln39V%+X{&+ zd`EZwen6_IU~9*Yi5_sJf-9>!0xr9q`+7%Jg$^!5CIqumO-AhAB#O>txg;Wr!#zov zHS9sbE^}$y*6X7+gS*DG5^|(qVp_e>((Yu$hZkKaS=v%K6MWjP$4@*E^5t!;;6{N! zB-u)&|Lof*5pGPV7_b{rw)TOPulOfoMUozK;4Zj*DFdS+NQZuvZxLdbu8ojPK#4Ob}PFi<%fiz;;ehfrVTRMt{ zF;l_YbH`TCsO+J^wZjGCtWIVDMXEAWbv4Jc6=k{m}N4pL43`n=oL> zxJbbqIvmo0eO11^D(csWPGZuD2tC@;rs{DC|kK~o$N-UHL+J-%PTy-?fn zSv8KxAtTl<3m>OmR2a`hZ34KM+ZtPq*mIbS3Lfbgg!j^XCVjshC5S3qja^Yn4yS9%a5<5x~k zHAG=pFTMKK!aNm5)Fs~!xKJgtw-Q($f2BS$us3CW#$l8~7u7fML2wWK)t6)1I|@mn z+Sgwe@`0wC!G8LrWZ`%t{SuB4U0SIdhEGysabp`av~sKN`!lg@<)Sxe`x`7 z2%#@1+Z5*(Q{O~QPvM}{Ji>f{S$?BL-qP`dpTjpo|HRDoL>&1hz+d1#HVH@u@|@6B z>?cBVpByO=k@Z9CbdxZC#KJYG->1(=zlp6omU+)O8rW$_z8ct#Xno=-a{8h+8Ik;C zNaU0)gIG>iz}mQF;5RnKD%S=RAY_^olNHW=Scb3_N5X$vE?*sjBG<8}lsT$%L<-n` z2(L)RE4)S7$FEnt-Llf;nd_7y<745_5|!br!zdn~NEQCTF6aMIpTN&NIHcy}sLyxX~WdmU@8PnEl`5Bkf=2ox!oqMHl>DCrA?4iTSVehnsA3*fc2t zxm+R5)7Yy)%-MW6x3pxkpyW@yF`*0q>7M2agJJm(m!MX+IC{8NU!JZJR5g4eHsN&X z^5y-FomCQ?g^>Egl9s_>llfKxK^5v`@Vhke`#<(KC=DHV40@BnCHe{I4BueRIhaG| zp)IMaKzAHMjEe8{!I{Vlg)$*n**a{E^!i8hJ!P{mh~IaiZK56G5errTisxz!yHM$M z6R>S52I<&jO05UHFLWC3e>}0tXkMKl1eSKY1RCDHo3nzSkc4m{wBL`k&j{r_-YVUM zxXgv_E?#O-+Aww?N6xy`XT^yu|o_K44bDY7*rhHF7)aP#|qzBED!LadO#V#Xzu z%qPo~soJ>~TOlTw*^Mssa}|Om9-TQ8XAS2|`rafgpt=5qkHTz&h0^!&=_l>{y2Y!1pnv74#t&8S8I0xHeq6Y z$YV>6F}fFzzg?r~3?WvPAcsc)k9NrJA=|ub8xC0VRO%cx>*TYkgvae7#|gm+}O9}9f~*n-qWD!jSdkL$VE@wG6^0z8?Tj}3~WiEq?DWm#M= zk{3LnkqWJ9LM9GUY(+_@>K081DOLx)dDfZL$`pju;@l3JM=}{tE^Q{^Utc0PqfrxZ zTW(5F+O!z8;A5|0kmZ1heo(vhMc1&e=;_4gF|CC?B{IN|pG}a%UO#SVbAVG1M%m7BubZxzemDr+INNF zCe?(UlxNBIqkTH|<62p~?VCFk8j)(F;Cfe@&@`Gd@qMlLKON4g^P8Gq3y`vT{1CV3 z$mX=8wQ?cw86ddh9_?0#cGK4Hl`ua`(u`gT?2&-TiN7#S6gGrNx3if!(q2E}n@aI9 zHQUN-+UWATDW;goomTFpp}$7iuZ)t@l~)LnjCu|{UaMzHtcNhs+_0ugT$L zejHz-D0k@Lx_T+{`8c%!ckP5oBHM{IH}vi44@}LkWJmd4yImIua<=lNoQv?Cm`w)z zdn}FZC`ZW0Qn?=x3aqUU_a!37| zC|@3Hzg=j?8-)j4pauE!MPWAgVqQ`3T7QIfs^8GFhzN3>D}4e=fN) zCE&jVV6n@ot%lsCbDs%py+2z&j22IzN?j>%$L^iZi;L=()|Gd@Q4}kZ5zc3HUi!I} zM6MgUUvfhWrt|SILDrk2M?x;>IXQf}S-p~|Ng8yV3{G*wPyIG4C|~k|j&5*SUn7Ko zH`V(%m-jS9{O-x;%v`8 zNu47J_r0vAA2u7VwW7Jq17;VF+yWzJRV9%A0rF%>0fOU=?Pe+AR3eA+>KB=rRC>lW zySvlGGxfnt$q5Vt-8~z>IwR2Np$=2W;9nO{>1ppD$xc!IR^H3@=nC&X>d^9hNZ73E zqUs|ho6QkST; zqK!J%g74`CE}+m+tJj9|gpT4{=C1d-i00B+2R1@IOjHyI>wQO>cKN+e%#T(X3fs>Q zvJ+zaw`cGEfG_<>ddDL>ctV}91W6egZlyi`96;6Zur_%0%enRZ0KVUii;SU@28%Ad z*9VzXGt0H_^7W!=Du6WH7n!N+@tz7qbhgDsfLZ5`wBLO1f)Wec5BSaxzts>6CV5xh zrq5jFUpkNIN}gzN?Oz(bjUUd z+Fg;=;D&Ew3HEl8#FOw=#JN$DTf~75#>x?_zpVx^|Bi-X!VBwfdnlEyn8Kkyl*fBWkFz+6ld_ti@}|Knl3e{IgWdO76kZO;F)$>nd|@&9!%%zrh^4w~dd z7KP0dm%(C)hmGyt8AfD&XA--VOzpFpWwZQIju+#?9yX|Q2vFL71JlT!jcIAe9M*{d zCP~2@IzGX)zKa5fqXQUAJiTg+$F#T)VGeH}Vfx&!I^Ho9L@YUWvk4Ty3h)1F#81j?SMVNGsV1i+HY2KNytX zHED^s*1^sdMV^KmM-_vw6Xu^4xOf6P3Z^rkY%j0E#tUei(sAPDhT%lZTv~y+W5L!* znHuL5S)MD>ZZmscSa}?V$#qZ7}036)O?K;kSi>C?xD6MGGBZMpX}Z( zV1Qu#t2}^->&!IvJyuvaM5jIzbL=*AhP@RFW`zgsDVLdx6-6f|B1}OtNRqXniniT! z7o{5v4Di=Y*OFp@G4Q!~?I!1|Q`N+U+yIr#|9u9EJ4y+cgE=exCmC7dLQa73d-8nG z$rxrX7*>}A*$4VDUZcbTdg<^p!IDQ7JumMx~=#|^cOdBQTAY~^Xb=7 z>MWq!>kJ!7(t#ta6&0mE)^?rb%L+Zb^xMy)Y@qVAGXJp2P~dvQU05F$Ay`8(t^Wn zVd;|$9`{-?ivzSu zh`o0&)Ow}Gs6lCLs#wp$HMxE!0=?w_@gfTliy0$USD~9oQ_Fl#r;)8^GNO4OS~HJ# z)CFaRCvMQpuTC(owlFW@I7BWp0*I2iLX>>+56RhvoAfG5->Km8q0fT-$l!sHT)vtw z+-0bn@cHi+7|&AwQR&ihmgb!u?}*a(oA6U4w}&FU%dZwG@ZyB_MO!!OsZ8rxq!bVV zcYvFL&dI)2eLqja>b>AC$xYHg!Z#AEjrSx^#9PB`dA$XQlBi4U-Yv6}E*{~FQ034o zzSClTqyJLSRR5!fZ<+Q;u9x;wG4toske&lU#0k^kZ%cbt%S>2PXU3xkF?!Ol`kKiQ zGWZ+xlv|!}?eBP*5CZTDL&rnFZ@{>-UTUw%_%Z@$%StLEJV@)q&lrR|*Z$R6(NJ<#=l~?3sL4hoNtWF>V zTIs0*nT|nJYtM7Tu&AOi6s|!6YpmT4MtQ20)DsW~kyz@!c5IbfN|2o*T*CUEid6_b?xhSv;?{e9A+=<1cAFV0LW(zNh7aM^VL z!7qTtY0oMTPWblHaFVU`B`w@E4SfMTMna_f{f$83Sn6x4`?FK+Z8YnlT_`-H1qZB5 z`&1c%!vjPBRvf}y+Vu_|0Ydd;gbb-5Kow{luecL?F!p>e=@!rV^2>Mf7rxj)XK5HU z7x~Y(Q1R5lpXiVQRo{D!*MJvtI*8I}%edBbKYv>ddiF{ZLw%a*aU`aJzE95f853=L zJ|&?>GUBztT$f)WnptX(?r+LJ97N|oG!BILRro4nOeb9?18DTebV^RU^aYUun5hAi zZJZdo4%*wqf1CUD1=2|!n0r|_7ly7Phbxw80kW4|StPY8STvG^@L@7yxO7qq!}hi0 zUIrRZmma_#9>u#ByPM4^DL;YdN)nY*W>+>hGqOpKmZ^1^|C|LzB1lCW?0Mex&)`jGkKsTf4bN{ff^>jycmnt+{2 z0jaTO_fAcg#Ox_#VP?RJr0Mdz+{i@w&#-8*4ExFdZBSe2zC)v4xjAHhJ{K(*1FnSu zq-O!E-74gKb~YMfa1*)OGVRmlSAlk`1|rU(BCxpSG#r18a+`D|Bfchaz>2$3x_~8q z1Ms96rLg=pYDOK;0^bzdj6pae7cVdZ0XGalAhCiBv<9&rJaEhuhNc(U>G!La{Dw>uRrop|Fd&&YVP$5&6904FC#R`%>`bDHyD&59 zF27SWvnG8Y2H1b}Ge1*)Z9pAE3x7k3v=D*eOX&Q>|C^v|--LWC@V@jnUjWam{tz+IN1fZY=I4z|(qB^acWdqek~^{}=nQA})J3RNB=*VY3U$ z34_`LF8srcF7MQ~nhJRMUgfJ#=t>3$ZU}%AFGTr#jZt`TYT&|tA%zq-EEfFR8j)l$ z7q@Z`*i>t82ZTRR$aoMLG{)`G$V%PWt&F2xqPMME?(I$l$xxCL>UPHwQs!npE`ihn zb~s3qWt&t52bI}Ziwj zVNb5hd>GP*Lj(D6IzE6cY~D}c^!G9P7A&_rSAtHD%EzGzHj{iz>g0f`VTS-EC05)9 zngvSKg2ps!)wNi}MDL?AFx{6D1HoI$5CHB2k!U=!aH?|pC$cW&aB5CXNEs~oUU2+; zA$vETA^A!!5JW@(S_HS?W2RFkX#+1GeZ}rUHI73YIiWOqDntYzpu!=KFOeKFdhs#^|X<8hn%t8M<#>MTDY5<4Yw&UihTl>uM%s3cH*}bX_Dgm zHyGd-sk`?6(B8IJq-t6`V!g;g@O*WiE0elk z_nld#>R+Uq;SE%TJxNcrMpg#*7r@R}r6=>Kp)j8<3~c^`<*atX+0b(SKL}2Vf2_u*_oQMCubf_m2kC$L}Ebq=Q-DvarX)o$JpWRP<=tLdKhq z6?>rVWkCN1f(1U$4PcAv%Eb>)+IeYQ9$faD-@8r?pG#Jqt4>`t)7UwFYFq0Q1Ec|R z+W_p@Q}{`W@BXeL-`5m`wLkclgwy30ZpMazTnVsZV&u|?XuMB0lw8`q@)$65bdtBF zA&}}TlOJB0obGGlx5MD@5K(i;k80=Mv?Rn^g)0*RX&PC0qXpd)Q4V>Dgl|MFfJgk$ z=zU`3d2*Yyp(|ek_PwNN!#-j(K`=2l^h8~%ktgEAoP|4ojG{!el>K<8ysi>9DJdSC zqFcswlTTC<_|T=?G=|3QVZYP!4gP5UP*N*xU_*F+g<(tnu2ew7_K@`=%BVgWCOu~c zk$q?g4~j$dK1K=v+fWL)+>N5KUW*Ww)3wG82P32fO28x-!40EfgLO;Xk-H+%6xcS1 z)%jsuh z!Dd#9{1IieAY@x>1x}+`$?ruy`Ggt4J$^;u7KQ?S>j)xq;@qt{@!KQF^m&t&->mo} zqn1e&)B<9xT$iVM61JSj? z-Ka>z4~Us(!YuV7k|Y={JFm3d8{zh%=@qkTPCzUg!BevhSI5LdtzJJz--LI#$ASy- zJ?1w_qH(+&j#r=SRHLZjBkc{w!M!)fokK+Dww?wvlV9-z$_mU~7R`Rqwk^foo-%Zk znp2afU%oK$7x4Ry!hu}60mxrLN<~}g@fk_lAJ&~^Sdx2>j-5>m;!S@0l}7>)LXuG3 zrU2>+x8j(A8)6K&&^VPxYMuSjPip{v5S;Efr7>Qb*dlx&=BzOA7~YE0Zc?L?0Z0R{ zCDpJ$@*Yqw+Uf+>0U9rkI=1MsAcgXct6jftg&I}9XDUzN9U$Jp!fkG4Wqe^~wo zN>Q<7pfFZE5d=t#s=T9}j>=wP-;3Nv0qHFY-0Fkv%$~-!7-6| zYqTHbopp+L2QD{7vi+)sjp->2Ye*vH|LarELNuxuNVY$==OadNtVQ8+@T32IW*T$G z>STYW+=ex-XzMGBNDmec8y1P&!)1ELMq+lToXnbFN(xrpOGcRNruPB+qIEs-n)HOZ z_rPS_mW}J`nH{JCQ}xjp2E1Gu!#pJpbNO>7GiOk{iF)kITo3BW)ft@L9KgM%J)^X+a)pDVW-7emWS46IJpZF2hbAvc=#4@Ov-Q~1!}+? zpV?_$yE@?;!VEG4W_&i&S_5ipzzi{vH~{VF#{z?x+M4*#8%paN01JbWR~Q`E zF7!h=0WN?XJ4y1^z@4q`5FJoqg$-2TR7qNv0;VY%f%K#~pox(=gy_D&dY9km$D=b< z3%m{iAh`h91FbNikH7)|$?*ZNIUfxFpB37x5AXd~#Z^$p|Ao(@{KK1!|JOfG2k82b zpSrU{Xop(Fe7=_?d;jZ)nv=PA!GtxG(urO4^1B+gR*^K5bGP;NDK(1bX1=A@Il3lt zMo8SExDXo29?$+dQ8-oDJ`x`^lAryx$xf#3q)MSK@c)LuHy#x7qz3IZ7KIqF$SY5q9j&JQyx+}s>n=S#vg2gQjWbwq z$yN_wn4q74o`g=XlV`_=AJ2Ix1dnFM(%eo8y_@gwuMeVVwlLhhe1VTWNR<5^xHK9+ zq~6S|Xi_2WI-+m&*37?NXp6|?Wq0cd;I%=Ukrs(~k@t*Z9qsFGJn;%N64jg`wd zQ-T^e()4h@+@}q%X-i1rmih6L4mT+~X-x5-IBA9Hg46Q3rUmxbtu*GHSB&0TE*aID zXQELq4FUD_;`ITx`3iWSaorLDnh(`~%@`usnba`T+5S5IS(bgBG4ig5qDb7dvPW0? zh-Eg*a`gPs1Ba*>{@S7ox@*efL8za!TTdQdd9$ZjR7d4!qLe~}ugkzPh!v+7e5I}E zSPP>@-$Zw5!3@|k_yMpIC2Ckm;b`@o#{=h>x4+jMy4=ZoYdDapY`4`9Bm$G}+0=q* zJEfRD%Vs%rw|J~9a-3{WkjjZsE0D>kBGygUW6iX?8!i5nk~biinxA*Tcf6=+2{9mu z$HBCBUyM20wtH(-*kMe~KZYj)qf)*(6>M=xD--@8N?0rr-}ds}b5g24j%GA(T*Q-k ziXe?4ooO7)g#dNp;{BgC4-e)n$pE-MY@m~*(wq3W^|R@UAK;gvZv48_&ey_LI_b{n zM{|@zdUR(8f`=j2>d=t$W1;}rVd}0$kmkDW;0?|jCL+h=;&O9{O62fxiU^gZta}ZM z0=E)I7w73?xtyHMjH0JYyWUtF7ks{Oer#BTtZ)y*o$~BBmzMy@kP8@S!}*||6HQIt z0~SNqUFW4zvq5HSX;ndQIkcgVLwpvJluRc3la!n`)6?u==T>~NBHi*swbhv|4Be@K z)lT}B^}6%2?@IAZd8}MXo^?*{D%uCn=m_?AxlOZjsxmi@m@JVn>c1hV)}vPwIFSN@ zY6Bh&bdzwu^d+$<~du_D0Qxbp8aRWQ!QOUKo1rW=kLAv6cnk01SYc zQxO|WYUn7Rn@l=J)HHWql7Zuoyk&kQkId9x?OpTQurazE_l7wb;jS6r>txXBMU#tf z_v$l+n^~L77V_PJQT(Bu2??+2ugvR(`YR%GZ@llCAA%O<;2IuQ z^pCoI9F8A(YN~PQjH5uPwpDzE0<#7~aO z4fGTFpyJh0BS{{(9_g~W7)X&+PJAs|N#hqHe^3A)Stw2KuicO#dooa33|moA?Qw9o?u~I~u0)J2HL1npk zXyesWj4s4VlRHcKgs<)Xjy%mkD zFn2sIRo2zafK5v>@^Wk*Vk!m6$K>URjPoAW-n{WO(tOxzRM%GTE#}f(!?Wuped3^r zCLoCj6^5qZz3Vz5gBw)Lt(%n490S<6`qD0FnXOmuR-uV{CzyNyB_C-nR}2*1gM(#p ze!3&Uso30w%SwH%W=oL;*2|XnNFh^1nf!`3^ZT_^qG$wCayzndEpW|aONE2Vx;4Xl z!kh@cG;U0Qkhl&}>ZP*IFnO!EYnMdQ-PXXDD`nGYF*O|?u7?cjhc*O4kY z`XYD5HK1Bp9h24nrj#ZiPWH@}#tOm`jm8&Qx6!G3<`ioATv$!7Zwf{%ynh~BPKUQs z584naNpCd-$+>?}F*%G~bF6kAv8MU=CDgMj9O9e-emEnhK5yc5HsrPQuttgVz#5}FJ#i`(WaE#jOfxBh)G%!l9QD&^V1i5t1(YDfTw9teo@7`98!bCLjVNsOS+xEG6(Mc(hw8Da1IK&I4?}Ihy zqp*(7kN3ASB>gXH&KPolZUdP!X!&m6^aWZtoTOlmLrl#M=vI?9#(O7TTa@IzK-P!> z7Jff(cJX(Gpf*&u;%`I9%4;ONi|AgAgzh_m(+|)4$j+Um7ylUHZt^VYst~z5NT7|w zD`VUkTev%x^GXf1K4-B6FZ<*NP^%8$-IyIBUPPY^9sI-ra>ojT)KG4OMHQwEs>jmG z@*;hI)}%4Jx#Uff9vv)kyICmp>ry?qMqKgiohS-n!nUBt;hmd?qV>C0y52cGlgm!B zngpk4+L+J#>QrHJz>C0v6I2e6${;Z5pSUQiWZust&6wk8hzBnrWnFH>p`VF23QzfJ z6ItQ*zK4li#&eMDqK`A&>q%tUn>hRj;_gQQ+&;u zB21kbIpKGACNrI>aSAxhOhWvz#54avsg+UH!NJuI&5uFn2$MzH%e;=Q?gQ*_m2HQ| zT<~bw)!Us&UGfs=$8PA2-asNE5vSHrqK5cMOcgS9umv@UtSmG%mGBGTc|OkfX)zj+ zn@)YcX!?$39Bt?QxwR^3ay=8NEX9YBRs!9kS=IW~hyxA29{0zucyONqkY^F1E^r!e+W=sAl*e z_nvt_raMs6*a{pBcW|+2wvV(59%emLH-yoZkX&c9#H#f@(ja8Z?hT%Hi1&CjOW3VNAU4g8}1pd5wg?90uN*DX5K42LF{Y>7($dKU78l0 z2S*IT-KV+woPeWG@M(^Ks#Fv4>fP^|zEpJT&{ka;9?zIKpbMJdWKS`%^=P!dN~1pU zo!+@c^u>THT|XpoOjbbzgkw!pPT^=38wGU^w)@SP(&)D8x;IJ%w{(gY*SNKzG*gG$ zN3we47aG>NC|fJI#%I!32LcO>uzdxd3t9$v$5@0;15N^`oG3|dTYKy|4(#eI1EmQd zX4grt5JO42P1|6Z=bGl?+1b02`!;=t zU#cQYj{b?;pMC5X%N(nF0=tjyn<+wLUPY}e)41h-K)zBV-mOI}YGs)B`(UlOXphTi zq&)>VT75*3)(xC$7-)hI=qsr0Jr!)*)EMM7et#%}n|2C1|flPkj8{m0%(c1rvXaA2& z248{bf8E#5IJ`SzQ2&6#yAuZWpKl;>zi=}A%S%ID-wf^d=PmeVoB=@G|Hq&3eFzf1 z5wsnzYn#~5R0ca@P}?{KK2sTder-sg+F0OJk-}>zfc+M zghAcH@KqAzU4bf9|MSDQzJ=M)AU?^^_|!51XxM#o4A>vs*yg^KR-(Nyz<&QX7Nn&3Q!9g7+T~pi2C zRiD2;KpzBxJ%pDB#Sahv5+C4Lz4+S3il6Q$K39dZya}ig#Ft-3ERImU&M)r(Cj;wM z-dM1Ah^7(n1k~WUKc=AEDc;|)WP`ZkR0zG*4QLk>+9pGHj`Yk9*I}_Z^b*A3Ax#Cc P?Ds8B+L{uKFa7a<4o(*q literal 0 HcmV?d00001 diff --git a/docs/docs/photos/features/cast/tv-pairing-screen.webp b/docs/docs/photos/features/cast/tv-pairing-screen.webp deleted file mode 100644 index 201fc088bbd48425eebabdb6a6c770ba5f0c7759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54930 zcmeFWV~{Rev?W^DW!EmdcGYo3RUeUR*t2eBWg6dR;R|_oxqmyUvu(kq5fV zo<%?}Anm&iaB%MS9{Y~J4Y2jq@^u2lUc3*lUEy{F4B^%e2k>r3lKZC`0E<#}b*>RD)B?;HP( zZwJ2^e^u_4Z`aSeTcM}cukiEc4F~|Z%9^Lcz^D6K_&C`=xtw{WGXdbd*`4l0^lSl! z{CqwtKR4j~u)p=*?MC?={gQl~-_c)omhi7~&isbHUcL{$AP!>>TiSXW{E)tD?q1&6 zUJ>qh^n0TG(7ruhbH0K;M_%RXWe@$rzoPH8H~B^Y0|0}Mnp>E&lo3D)z~{^2`{?`R zvt=P{)~^M?_d#+UwnBG zf&aF^{~Z>fra3H01`+Kv;KQ%}7^OQ{iV*L_gv-3hje2`uj_J?G=CU!dzh5bt%w}FE z{U?y@utv`nFu-P8Mo6c)U2EQe+D^Irhri~__r zJxViBr?QQH+adMn)mCZ>Zv5D@=B}|5VLdJHT#}z|MOP)eK;O+pjClGbh7g1Zqnae3 z*5JcPfcolKyFsGB>tE;p5}P%;aP{7oe?7l{^AGc(7lLp$K9v#ch98e;mt3c57kG}%z5mA4Yc zXM}OY6c(xj`b4(`i7SFqx%8DTWYTs~`X z-X5DIk{dzOi}6Veoj{IPZ_;WU{=c#;_1Khc`| z=S6#}mJBDN2b^I&__L~kM5D-4doBl!(B!6roa|ucUvz;%c-Lp9tC?-qJ>vG) zeD2j$e&-L4q=nA-di*{e#0JnK@Jc}hAL2mg@?a+qhJ0W*ZLUg1BFl2&9KQCduyam} zBnYVn28-eyoy~|DjU_^xz`!^lXiOlW3mxoEp>j{CWh_ah6;!eVg`olJt3^9$T`S@SQ-Txkm|MrUFa)yZ=3R$5W$(M8;z5oQcJ&Rp6I^A#dm@RpOg5rim ztASV+3ip0!pSHo)37i6jo_2;d@PEpNq|B{mxW)#b>hZSC{zauv>HhFBrp@H;RycNG z&vUV9+!l?}|3@^vzG7-z{ak>+!^MSfxW&%RmjD{ynTw^GUU;>a6PzO5-cRUh7S_89 zF0{tA#F-V|aowiraVZWNX1O&cOCFVYyc@7n;VZAI8bxNXh7+)Sl(5%b|Kk~C^4P47 zlQQZK|}Ji(@bdWpGCg}4$&3*{yW zC6e%OvBlw^-+1UV5QMnysK~KxW4c%=eYnY47&v!q8mLqzwR5W^brI*%JdFt30i<^2 zH!G;>%~(fTNy-MtBFlUGIs<R7rdUl}6H`}< zsy|#lFzBx~coi9ZLGR1-GX>@`k>qXOt@cJ|`Y+MY9juGc7ENalWWQM>{s!r**f=2T zC&B)8Q@M69G7|*S>G-}j(E6)URhNYwWMu6BLE*pCTEyS;m6{rg8raxWruAQi`#$!a zXR^}235QlFy`X2E!SE$U+H>23?hR)UBf9;$D{9r)Sab++SZ>e~(tnw-8e5`+|K02V zBgn1EV<9%1b%E8hUS%0@fxlz}uh1oLvQG*HbXc_ZWq;*BGg-y0lft|eg#K|t5$+}_ zRkAdpdWiKrJaC|wHFKN1&+&tl^x-!!`dXI#$C`-pO3(?CPApO1L&hHbA}2g85-bTN zf_aOY4`%A@dHm5`QH1*v6T_8TOzyA0>-DWVBOk$pY>2%bh`uuZlHO=XV8Xo)rUL(` zMA4|yjDl0*HBb?mVJMS_$uTgYo5Se-4*_DHWZDbDOa;uo25JtpTk9VcnnsTqb*d^i zou-w6dW1Cy!ncT1WUg<}_g^af|B_e1D7PPcXIVfVVFHVSuBc+X^#Tby&|+EYP6`%i~Vv#i8gVScj#@9_iTkEmDY{^$7o z&1xG3a&LgdYs9WtagduP@2*cjscl};vhL#P_YB$Bq)OTUA+OKD2($lebTG&v}c9q5OS{o8sb z=y@ja6FD& zfvpT4pObA%xXw_SaFc5Nsi;D`Ql{NNc*V6~R=+l%A#~#1Aibqqf6GBXx!DCv{O7a( zz^;t-%oF@v64o)G(&FTKN~}A9A5$qTHL~i4jQZe$ZiYh>vCuA)``ENw5#sYyQ%zHO z;X9Ct|7pR0SeLQYFHxy3+yJ-g&4)>cnrN)}X2k57BW2+&{~?}pD_sfDb@@#Q&(K~U z^{U%s{_2ZVLDLVC#V0%n8MC7R#Mvv>r;PdFDD?ew%ul6dbq4_Vks>5 zy$2*#)g2H-6#AdlCos>%Mrtfz_WvKIUT4Ym)cXi53cnLnJrk8B+Rnq7ZH2rUE+KUe zT6+QNY-)3zwL6-K`G}6&17RlIU}+o}e<;%MFFhKOvB5h&py$8<4-&0#g(Y1W+EnSX zwKH3$7f<6n8B~A|yuB85AnXKAL|#-#OHg|Ftm{uu0}uOe+7zVB8$vw%YCtR@0kTDF z^sasL;#@?}zkE(bEpgYd{#d`Xct z?A3?8pNCtwnh>(TKm|4gtv)zj30R~5zMB1CB1h66=o|2HweJ7dX2k!`15Z4!NSu^y z(*~%UpY^%($0Q1g&1Uxi=%6Z@o~zI}SDA(8o-n#hUS(+D2W?hAcWn)Ao~J&6|S7Uk=0Bf9nfkLbh1bwC{0)2oIS?y z>W|PtuJVX*7eeuL{AVp7<^U;x3?57@>rZ>da&ci{^kx0>593XGUy;?e7A|u7xZjUQ ztbxIrLT}vB12l01!pzw=S)>j$PWOwvw(TPMGA=-7W z`oq*6im-@cS^pIpZo< z(f#4Da!8%ZX1ugN>~_9Cr@`>ti_{D)2CiTUxi3|-fmzX~>e`EbP)E^i*x=2*qBNr4 z3+}`YupS7OFm;!w4=jyKv7_nm>a1Pv zIwN3wcv!Z>H2X5|xY}tAu=%Gv?*R5O7^!4-@{G!t&w;%`8qBYUfcyyiHOLihbt>vt zKTqKjVSV3C-O)iaKTibMwmX$C)G^T1yAsokIrNf)P-6XTnT+b3K~8~g6Z_faPT9=% z-diOjN;N6^G_n{u7bBsc58Q$FQ>sIXN25u|qk3A0LSm#v^Ba&$#Pu*uAo7OnPr8N@ zBD{yuu5o&gD2r&nm)iOX@%&4d6M%mf$IRWFXR0v=IP1r>YzYiIT0+WmoAh!=p&5rB zjluX_>VGu3`Rl*BoZ;qn)Cs8LGd z0Bk_z0hdl@juFG*qeBROD@I~P>L{YEEZ)6CDk}15*yRP>%56}jre+K;00g+}C51`GG)ccpc9efY!{78 zI(npi^=-nAO*QWd5mEXr@$o!8Iii;HJ**%a_{u>XM^Mg07pVOPyDZD|EYVrh`$n)p z?n0;7<@*aA^!CR;-g2s)(5!_6ZBQN12Dk3b9#7YP6%@mpF=fjNj4;8IplsDI1&$0{ z1KB~Fm=AU0?>R0Z?x6~(DEJfGHV*kwMFaM75Lb$A-2SM`zcYDlvgJS*!OErcVd;^bTTSZQ}7=v_30Uirw!_j*YLzT~o zeV3MrWp%}1R+~ETfnV+00`!b*O*1ZK{O2NMPHC9NOc&t)+#5fz@ubctqP$W}XuUElKL zM?oab2BoF6wB6E~Emu4nv{ZPf2TQGmW;Np6b~4JpZa#4-wGq#Xn`W(aUCKA)>JXFg z1`||v#y?r-eLQR?h}nSr*7X~eSPSt7dDbRk3G=-3x}EucLt{DN~U#}XI*h+lwJ%m~E<>AEf2HoR_UUK8k|Eu8wqPdt%o z`vm@!$e6K!3>B_9P%nzO(#jz!B?}PFqj@H7s8W5#?e9l$SIJbIh|Qv_rQha7N=qm$ zy^j-AUwsm^+>qfc6WAa$d}jXR7nFp;?8^oGHQt#g7^<*A4h9k~bdl8{Mwk?*fOFlz z3eF8_r=U|(U=Dj#h=Yd?2neBLFP@D#a70SzKv-EzL|qq^lI`@~ZQ_L;Al+cW^2 zVunDN%UL_igOY;>?)p0m%4O)9$a1zL30XCu!m7JJSqi^4h%U+6t_I8C4i6dHQK2rr z-*G<{lxuQnAobr=6N`T+1EG&zY_1Jn0wL`(0 zYuQ7aGil`E8?YbYu6@tlK)B;`L(b`RWy59Z>mX!#>cHSBZ~eq2?9ql3a*#Db;!h$cRPzM9-A8}yls_sN$!y8s0` zi(Y7hKO|A?-?;Eey(54V0Db4+VAJt{CagcEcs|b5a^Tguo|;@4C^JFYhl~xkklg zyqi=m+v^PJ%?8ti8A3h9YEN#Y>o&6h$aSlPB$^(Ov545hUBMjn7Dr9s?ltGHtC&R? zV!nfr{NC$1sLlqKiupa>Azb8#aJ9I+F1^&T%=@~o{UY420YvvyUt7v%&-SF zGI1tYq@IP8mj)^?Z>p($eZ#yet`~}`q1hq=<#;v0EiL=t3Z5&hX^qRR#^6Vdw%Cc= z?zABO+9o(uJf7WU*wo?*b9bWwsR>r^Q-HI=oct+eTPUb*p$~UX+bnaacR8Iw>dI&d z3Dk?K@u=^fm3+ci681G-o>Xo#(zedA!Nb+*V9(k8>1nI{7bSiKnanttAs;J`QfZa7 zAYh>F58m*p&z9&u0Bb$=a5w~nhIJP5PN>JTpmL^;k%+f~NX!FPwn&;hy*whDQ+X1I z>>mL;%}hA@y@^1ZW>N*V43X%DX&7m)!$hqp+3qcf0FTt^^A0hU;{$jJlOT|q$*H03 zs43(c3|23iYL|)zTp^1qcDuPLXcc7Y^5Y{b0`mQ6kZ6|!D4Fe-*ZV{Otv*lAO;!n7 z3Vw;Q+Nu^X>*%Hzu6o9~pe3)9CT5DCBpR0O43S~65wbBp1XBLZ=pch_ElHmIXR zf~}0|IkV}j9o(Kiy2IXqZ%0#;1G|)~t{gjc5$JKco*6k9vd3&I>kHYX!B!Mg|-Qh5|>;$Lzqp&x|R!|s<9g2gE z^(O;8Qc|`>!q%f=a*6HpQE@xO?{zF|rdo94SGNmpeK0QlThB|vDx1)LzligE3m19D zlkR|ghM)XQb^m}re$uD@s*_cIja?LtGLFDSJ@LxEIx3isQ_w2W1Mkl;^D{nTSMjKk zOwTILl3vT&r>1tow6JrZ`IBoD{sv45`lj*SnM@xisB2?$^25^>{mBjWCXjrh z&U*L2Ce^i{0^5-TeBw7vk$*9UjKif~ds#wM5fuGxO~LTaajO&$K5s}fD$)qXXZeIK zjEyVWi!*D-bBlR(agEZoWNXKy|dB;%B+U4$21?T?guGO}>nT z0O#5eH%uIJ& zrzSsl68gD&$PO3K9yVetuSw5wdJ|o~N;LV|)J>{)%5YxI*j*LHHIOkFuVB7XA-~kA z^qo3ry_qL&+paQ*25-;1H0w+Ahh(YvdtqzIf+&OTew`!R99D4~4bw;CD(b^{*ir6N zT0FWZTr=UPM*JF*D)(~rrZ%3L6;m#dzsdm5pM=^YY*Z>%k_YATcQ*RnVk)Smc1}<&6sLbFF-7B@#PCwx zo|-`KxuAulw6zavNwtUPwYQ`R43O^m_#vKcmhsBwe@@|QILyIA1a_2CJpfsf)mtm7 zfn>$K@MKW@zJ zoJdRTbqAvmwSNaJNWOG91mXZh0%#6$@M<4B-Hha>5Qw#&uW*MeEfNKbAGI}EfRe_x z$JJaW{yJHWQG-3j%9}0*iqNu1r1UXDHD%Vmc!EMZk;6ZJuyrKXwWHZFZ<^lDunT3SfF4qFYXi>46P!dHlwASf!Dw9 zsSAkpt0L<|SlVAjd!?xIXh^2mbSmb|4;cYZ{)VoRRM=;Y;+ZZNPgj@^%Lt#V0}*&I zQdD>sq9W78H98+n1Zs^@Yts{X3{j!Wcg4!4F+>QirV}#MrZIj7BMLeZk}F->aHQ7D zY?9Zd=nV}&3G?*s7dVU`?qEfQqt51|^z@DcW!RE^_guN(QNZ)N zg(J32YA-N~csBc-JAFhk6xpx|30M!G8jwA;X0ULP>%5uI<;fuiIg1*oM0=3} z<_bpa*c!KT#M)Po<|qyOp`U?!aRVf{MDd?}Tu^^nJy-SmL57~@Hnsj@++)JE4LakX zl&x7OTV_9T`i^w!g!0Rf&E2Jm`b~}qd1BtwUX?Qy*ZDY}v;wWSXf&utr~unis;pOi zCYP~{+<9Vi<$EtJyAVgy>U-nBkjUCE%>_Uf=5Vd?w>3gUPGUal%JDMif{;3jA(O?2 z!u7RQu*)Q0P)OqwlQo8b4A{HlhagasGyf6;7m)mht3sSR*hLWElLw64jSH3Ycp`BD z&Sg!=xv}*QlIiirN=MKFUI62O{~vJ-mFHXnzHpK0BR51o`jRF35}y2oZQ!8z z#wLXzUEwUsj%{Co87Ks5xlU&p)Z zaqXqXXkvuPhiAy3IH-Y47N-yH-0G+@12qOkUuHU0)>87>b+h2>dxT$Ew40iw^dffi z+#d-J_&j~B7*ZN(^o~Gkwula#>@8lO1*sGWK8>1fHNkNK8xx7&m>x`>q%1Gz$?Adl z_^%*^#oeoCwi@XXVLGG~5lnt19t~?yp!Y3$m55_r~af_j}(!(5w+CK_;h#ktk0DWM)y+%)34U0wdFoM2ZF4fqo{EHIq@ zj2-*7E9>k0am@iNsMY*+%d{2NP^0Z6xjs=}1kbmAn;fJRsZqRKz9=piXq_miypU)* zmMg0&Irlx~q;`fwCtWzptYLLUSnS5I;V61g)gy5V7g5l#lt`N9+PY=z1^|gThqott z>j;4M|9}mhuJ^0auBkwyKQCl# zbp08$1jaPUwntT*pMn=!GQmV-un5;7gO)b$ysZjYtttNCN_)|>D`@WW#}1wCZ0RcU zaH)DDQ=Rc*jbmsBUv7*RG^c( zMzWXhuO7@uLvvHcVLuc`+dpxA*M;QJEPznb62v`}rw~6v^iOSOdM~ zt$jNH$sNW5SEWRqt9Fa-uc#4Wffytl8VCM6r@RHU!uXRaz@rq-D4QwXX(nu-hAD7= znwwmz$H=T&1U{vv!jrf{5gye-_BJLvXUCj+9}wOQ))wubS2S00O{=lol87-;txigWYZ=D?KCDj7u}vJLuvo67j*b89aB|Dy&$G zC*5)`vVnDD)gN^T%wDP)Ybs(>uD@aUMoTv_mft-T%7{^y1}QOv&;ygG zFiyvYIwPYIt*e*aX~l#8S$iqs71Z_*z$_p8DKz_On)L zd+E1;XHAy-c%2Ce+X1e}r zTU(2a4aS;e1w`kBs4xWS9Q$Z6AJ0x3CUtpDj4YA=GGj=%VBpe2x8(qJ5A_3h1|e{* z=$KY$){|%GSM;vU{zZf92cEPQce3h07elG;DOUeme`%q?zT(OHO<;J%sJEuZqB0}1 zihwHuve#BtJvOeP)oQzN9OHX#0F8$$}axdQ0ehO;F z`h#0VTQqs0(=O+lWH2F`ioj4}_S#nyMwdKtMGxKPucQAa~)fvzt){QKl zk$9@8O?>IBH+O7&zD@-cbjSRbK*q7T#F~?oIDu5>%`~I%VO0gOC%CAznGKwOwdu{C zVl=4q$BuL+Inm&Usjy1%(5hL_-n6~|65U4L1rW&JBufR(swt~4MeXYMkvjbQw<-h~ z*v!Ek-HQ2_^=l#QVyY0aVzL!)zi>NED_jTd>kspb3Sv5cM)#bqY-UlZg62*Dgo)T) ztWI0*QGiiA3DO3g@!q-VC)OZeB$8|=@E&%QO|MdD-o(&j?6NtgH?N$w6Y}!gKIg>ebqFV`Y1^qSL}7|ckJ=7ojtFY_YKb`JwOSz1S)9Sx z={eB)^$?d>rw&*&ayz+Pg!|B0n9KRNNWysb>h^J7nfQU+mB8mKPp}m1wlS4@!}fnw zz38vxSVhS<&S#nlpxnRSN0`?f?dqnzRSqi!r*f z;Ih@|!x8gk!IEie5@iJMd@s7=*qEcPgqO-fk8gq-_sK2SY;t!XL&W~|mpe+)rv9@MfE(#t!dc58i@_-2(r#;q=F`W296A(HMX9R$EH zuzEM85z>!@$Q$Q*sPBZGJNz-oiA7p$1tR&MpO4423c z4U#)kX3Y{SfEcoC1SCXK^b{^Cfvw-(eyj8e7a{5Q31KS8QBCCM=@i4^!}>7oc)%w9 z>6U9Z#v}uh(Sphsl_W0D{C3AA!#U&ch2j}+j&pB@!mc?2+;%sJ zRXG&+w^3(Hc^Wkm;dZK)(Oej`LH?9jvj4d>Q!6EBFkbcV#FDQ&vs_$RUve=%$( zfejRA@JC=DSUW#4f}C&IHblQ(_4FF{=;k>nkcg1=8s$WI8eawdjhHy%AhACQs+^_m z7A{s2Bg?r?!8(DS@qytdU3gyC6;IYx@lA%_JgfQCJFKeM6F*$2&=!Q^9y=?>`mSiF zZ*meE$c75k$zN0Gefo1}G;i7}9P9BLV{wxw1!NNP#Jfsu`uQHgUj3o8%M70Fm`UkY9`EY-A*h-ZA zB!U&i7%BrQYG4dN7l9VJ`rg9&`jAtO9GHKeA{Cri@$(1WRx9e&MWdhL>Nx=P~ zw8Yd1xQE~^xwPW5TYLe=q+$fvT+W~?fX6_}La?!Am~o$T{Iq}KLWYa~Gz#L#AWIzu z&$C^{^nU`Np1?wN{+3)UY8k9dz?g!W^ zZwfnA&APAjWbMAAgCO^+2iKj)h3UmOCd17<*qlT1Wx=9k1y$kbY((O*Hgu@tA#`p% z5Tn{-e+rZLv)ZAJKYy>2V7aXI`?P?{RwjmNx7to_Ii;}jyh<}T{P;z}#95EM7(-e; z8iS&Q6vgwXJy@CQ7F=UHDb7?%<_r|3_lj5P)1x@jH1nexC6>#6uPQiO zad1#y{GHv?agpG3t*`GJ0wnce5yK| zxq)9H{!g`$Uf>2%x^Ykge%lLCzjt{5rk!?(U#zKjSG&3Q=KBgUtE8;)E+O7eS7o7( zEHT5(u^hj~^T)o+tR~EdQkY$_pRf;+8Q;;Q^K0w3;u({vbIUQQR)P{}CCQt^(iih4 zSSg;~O~E!n+;DI$Mj*f))jwihRnJ9dH4w5Xm25M_^BQ9H$s=QS1o#C6ke~I&RP>^Q zm*$I3U^_72c$93OdI!0O*Krq)x^p<$g;ElW11)few|Xp2wN$I4&_W0aaUukS zTaDd*;dS42Fn98St33%YTt<{(Yph+m_WOUH@b8oCpQ-54w|-_R7A@>W9LSJx0tP}9 zjjY6tN$no$#3ln7{i(IptG#r!Y`f00;pg69=Opp9k|Ye8)jbj}i?vm}B)~@tM1-Fi zC-rk&+XCqJ5l&dny69u-vFW)vRFE6sc?hq^wQJM%20 zO#EJ?`Gr*d<=|8vRWf^`EvI3WpcMaX*?@ZQ_iTCfhkH#xg+2C;p}w2noly-jK&gQ} za>CfDBfav~yE!_yq$F?*AP9;2713kn+89>q2I9+m{i)MWzCSUKuhEUId=8A7+rvHq zyC0Yh6IP9Z3grsWGLKOF-KWEKYF@`b86xO$zOdeh#B*K6AyLl%2tVG~7oS*XXuv(= z!DOaHSlI1chm&J?ZDcU|`@;%M>6%bD*_KHK8JF_``-1qyU0!EyFWZ6)fw4V6+f8WC z^u+Z#C2__UN?Wkm?0I@*9f9|UFI=AY(CE#rh`JUHM^C4hWRrFcHYKluTG1Dx>o1tt z9^pknR*J3BE%cNb4K>0L5!wS zrCCTnnAs2e6+AMcudgERE6m42&gvzEPw{hj`$KSFMaruo6@|79`BjN ze@8{&+~8kVdcF`&V3Kga2sIvs|J6}}U=Wv=w$MQl&Fjy^yw^^R+)B%J@uCsDO&;_i zY=1+;Enj!2ks5p+0;Q>PvTGx&si0|TN3L!QfSm!(Z&%WH|IWhKu1eolk~9v);H1=i+aY{ zDw#f!vuAk@M}i|ZF2u|7arNHn^xm=4sO2Q%;UxRUeYDaXU&IchJ?vDD|;!g`&?S-DL$4Z&;KnmaT3qNSL8_>T5QTs!tWB`n$kLgT`_YvbHxm7)^2G}6Z=$}7JNbcg}> zq~P`;R0xpZMFAY#>0131HP74u(vCtIK5!UJ_IS|uBw8of6@DG4?cfZ4Hk10xglsIb zdMYtykuw6MTHY9kjbbKKTkE&?B!B{>#Wg&QdiTNIVeYR&0JoypWiaj&7(b3i+JiM| zljyr#eBc7IaODq;IL7nh$)O^T2P-PR%ibiX`(E(i8%pGj=nDAwdV@b0IMqdX5Xk>HFoh*S4feMIn> z<0j)^K%|ET3Ky~5$>pm)F=hS5u&V^ro^_D#Wu`!;^?%Z=U+)Q-Pkkrlb<@V=V$$|0z-H^B%jVu$BPEACK#2uP z=^|CFal2pDl%QuAGtMNW@tab%W@OqGJ1+4r#_U@pIhBPmyjE^j26DUlPSm)9M7TB* zBE|z3)suelBX;9%bU&&{LTg^OoTL9n;(5?8_L!ahK()w4ss7~Ee%j0=3}NG0dv4TF zm5s?S$tQvkY%A$GI-~z?e?*S&NZwNwI$QKS`e2syesQ8hI4?CI&J4nCv$?;k*y`J) z#7FsScgHrrI-fAPEwmv*q+9JQTS-T^X(ZN;W}h9$Txol`X>ayme=Z{>8lu&fA`b5N zHwA^6u^&Sx;~7{$Dmhpsjse?P&4p4^`L+67ypN1jXd*-bT0NO4RzW{zFPU+L2aB8a zO-I&_4(BRBqy!DsmUoIcK&qgGm#8yzis)qTq;VbzTImLqAuuavu|5%%OiT2_Z_ESb zvCXO;g_Q|IqL|9@=bX2}g(1|=*40UQZ%@8o;efW2JDXv|`yZ_(sl1qCNy?I4m4=Jw zyBb#QB*YjW6dlZdIH?nMtCW7We7-(%NvH34t%f7to>fij$j6%#t@f9rAI}W#*;X}> zN)1q;gsx>7+>Fl^E=_2S-)Ty6MH!3UV#jGU-9yU*A!=xc9ca_EN(gBEbQ~P zIoXrU79-B8CJZK!4Z5c2X}X~~9Jc4pu-%iGC=yB{@5fC@A-S&!lo+GPy>GohjdATg zVy_spGM2S7LuqS?!?x&druDifJLWCUYuy6#^ro~UHq4BMRd>1Cr)aEPN|X@U z9MmHb8SI(5C6oy&q(VjSjF-DS4j$rWX}gv29M4gWH88PIn5d@d)`+WpFEno3uv80O zKsRRbW{yB!IJGu_ZY+(P+|eG+#UAr!`h#d4CNIV!QBbAL`1cVxTI^ot(N88V{3y_8 z*xjRbsjy+7Py!lK&dBOF;oy63N^|cSG?PPBrve$;b~~q5#$J-jBn%KAWJK&8&$yJz zOR$^Eqyr|fbY^q`J5sW_sahZfd*}DT{FNBv(v!K+nLBE1l1n^DKbO^Bv>jp2E%Og* zSennD@5p0ETET@^UwXGz^JsH;W^E3a95!{H^dIb^>+&tKeA!HpgU^$1$)xOm%$b2a z6CWQ)1e7IgDohJtg9EJ`gc5@iNK%IhNRF7W=rrAfI<~=E6o)s?Fc)VC^t=8lOE8F@ zw4P0=k(GNnM#)O!uRv}&OR(xznBVOYddtBH@kzOW$!c(u&D9R)NG(ttXP?`6lz&LOtJeOmjLOPFvdAT8g$Ov+f1GJ873j^c~dvZng}ya#qa8S1e}8K`Z$IM@mVhmh0s zr*FI*Pd(X_UqkmnS_gT9xin@1Y1oju_UEZJJgOQN6bD>?4{FM6+0$j3AC%ACYUDN6X|?}3itYPi9IRP<4XE{sE4z-96sef8elV1K`AQ9#&uu~c;+L}9 z6@M@(g%WQX)5#FEK&g7ghw!aaGAibMiO~wBh@R>dm`pZ@oZ>?x<)_CaiiUh(JaTZP z)~5OK>39ZWUzYrs4Q5}#*Lvlo#Lf{hsV7NRaim0ElrfNYDyZ(r?Gh&k^Pduxt?5=yR6wb_X@OZx9Avv zn$xmZL!2PV@2eJRhI}4&IdSwiaQ>B9W-g6|st&OZwwLrKCZowsfvL0%5{Ld9g}IyI zD(F_rKRpxPsQ$s305W$E<_8b{`0>yp5P88I-e`L(v*^+aQC;=J0U%3IZQDl_L7UaD z_SKg!?}86TEjf=c&CAc!w%y=ha(-{Q(8^>~L30FPBcLR?wTMaumL7_8m=jc*&*r2) zSYTT-rdt_L+W?Px0Blo4T)6qmi3~*(rkVfw4>za?zLV~9GmFM?RfhUD{+K^JW&{Ef zBmd1c`7)8@aXOCDz9GfFCw>*tD=qQLA635Gw|Gz}5TxVfy?jC?q{aTA z>JuTZ=F;v%)5rSZ+HEWzKfPkV9Rra%P*b(^<#nqA+bY{EmZk|$8^HQEBsbRccZ6>x zl)tAFVuWRl7W5X7PHH(?#FmP(27AK`!*oRTibB2EgLZ7S98XusWlFVhm-X0?$=RRnA)NvQl*5!srmX!Pl}z4=A)$m5T6 z>GSH-gl#(sm{tol!l^~~ZZVO0Pe9|y0X5hU)ZqT!={-6UE?a)>?35LMUXcnxlOs7XE2 zcferT9TrK`|L*BfQIoy4k=edvZR#O}pQO5lM3@V&N@ZH+qBt?3!am7y2peNX#YX85Y+lYng}S zcNit3sWuYM=DUwuev|rH%DN-!R`^}{f~#PCIcmqBnf<|{7r=aJ=(%Fhgl!BE>!{^j zvTsb?4e~?c>#2Ii$DBitkT3xuQMg@Dp6-z=OXSBu)ydK4MM~-NxoT&_Fd)|rJfU)s zHiR&QR}P52j#+?r<;Q4Gr6-GvD?K5@A;4ac+P-Fy?rtc9%1ebXJUdPvERkOunR_8B z$%A_$XV8L<4#O9LeqrerIZlBQRv3JPGh(W0_UaV3g2P%!1|irsO=u|*sNMGI(_q!; zPZAdQDS#!4^p;}43B$7+=Q4JML(XWZM@Fm1!bQ^D%o_k(o-jOVf1sS*L5-srO|uo3 zR}3;_1pBiR9%H+zZ5D6oT4mPE$Ipp%b*)5G?H=9k>|H~TmD>DD@F~a@za>Yadu+gk1EscNH9($X zxj2j>4X&EZe^{^iLmjU1l3-<{xumZM6+OU*D=^AhsUrdyy!FxjiNeT*l(`(M5ftwy zElGKg+!1QVAP{~PV|&^rA`^Lsk*EKeBvMb_0DdD&r@7(A@El_POsN^+NvI;793d}2 zBM2r~(yh?i_D4G2j;qmo1pW)zj6?HIqU`^&!xD>iNV>GE`FYo8*SA*dXA*|Be;M|g z%r76yfDtRaHeVDR*jV0oCwj_HmYt~EawG5#!b!PK3dC9iX6j`K9K|TqZHI1zmktC_ zkC77nxqGIRDU#r`Gie(gu4XzYO_NQPot&S`)6{l*UI-=>nY<^H%~Olei}sT@pt|m- zt(t!3T~1VK+w{nxfdkxx1wb$~<@}WG6KcCZPO$Hmts3Zxf}r}lnvRwSh|O}$nNrhl@XCwlOtq; z2KMz=I5u?rYlsXNC+(eL+!Ws4LqHH0NB3mIQ|@sINGQyAVg4s7Bp8?Rj#1&qv-})= zxR^R9zCq5XJbJdF(yWWH?h}>oGg*2ZcPTnElU?5LM%CsnGvkOuZ=7)Ax6WqFtp^PT z_D7USEh#JpYO``mRB3qF*2#tS4T99VS0&x?7#)!79LCyKiQc7pb!S`?gIW{+ewR}Q zteu${(_EVe-D|jXkNg101@!n@)U5rWPD-?Z9Bjz(l{?1_K*F8hT4&Dp#8`x~jv#q|!Ko zIBm0WuFwzDph>CiccfIqPzE-h5@I|ubhg3ik~8_-iwKw-Px`K&D$^ z{0+Tj;b}o>QszzJkQ^rOkU_o#irQ^>r84o`zU!T+$%G|*4cl-d=hel^J-4McGgwPJ z6VjM+O-ZtvbH<~;@>K655CgApIgS+`C_P$oppMxa*Qt7F{E@h?U+l?u-VHwEp6*15gWkP9FDV%z?6ZZz#N_G$!-?E>N}Z*RQTBDsMk&W z$3=^BnaHp;KI*P?S54Ba`7p*(i5QBFbzC(KY%WDT82vaz*pmf1M5}kiDrjl=LNnr7 z4XSi6?U}f-HY=YN$Ltpx- z#@Bl%Dl66SGWq{sIIf=~baU9c<1)^)teYOk5Vd!3Z|5^1!;H-R?V0;cs4>Y79s@ti{laz!{EVq|cjqfYme z0R9+0da&L{=%Jr;_)-6(RXPH*FXMn_9{ghaH)STBgZj^X~{GGZ=-Lk-ZqGxCZ(s zJ$q9#pEXQLx0ep}my6F4b%||(^x3Yp7Ou)|nRak3DtcZYvHY*BeS%juq_|bF_CJvX z8?+5d?Z32Qy-==YK?_x-1NLN#UoYk4+v5X^h-_l0<4prgU;Gel`KNQ<-~?(I*)~#@ zh=ALsHeUpd1%7FTYNKNp;-ik6H_?e!nHO*>ObT7P#>@!}Y@B*KpnCU_3JU=GBbpD- z+qPU8sG}M>G&kIG)9>cfw21k8Iu!GR~q1_e3W}Azr3HNeuo* znGN0FkZDW#|M*2s9^o&npqRhNZ0K#+2h5tslfb&sy?Y9|dEr3&rwHiF?N3Eyf?ePR zdb}P;lSY(y3Vz$=Ud^OIdRVb@tXo3bDMy)|DF2>mf(ee^wMwlA$uH=){skMEQlkh) zG6h{TpllvE0$2(?aoF%KM1#?!E-Kj~R?(XAe(9hk+B1Sw=}{cVQd05ll-3c#p0)FlRJoJhxt%k7Fqoc`9|O$JM^}H5?xjF#c&(#bZWD zl(u?7#9{mq(y@-zcu)%CZ1A1Q3FsmQ$Vpd;+i_(>UF;lI^yql6888b81{lw(2G(y* zvV=>sdqYwgj32b3DVJrC@MLQqc9LA58I>`5yQl1PX#RfMLO~rBfFOl%Oqn9>7nZ;M z`t?T4x!Z2h29WT_0gr3w-f=kYbY1Ul=iT0=Q$eB*$_U43c&D(Xaq*ofy63<=ye9P8 zNJxFCxknsh+aqv-J83sY{Fs2FfQt$vNjAq@o_%7R^IMS#-2MYxuBUs;U-#lvFek7* zZ>HO(igX+#LaL~)idQfwxvmpXjP#k_$%t~ zSroC+|H`cRvuF0+=s_i$oh|f)R8zTTsK0+sSocKqaXI%5T!9UmB|I>X zteDU`*U*Pn&@4B^DQn}MnwXf02_EJce*3{{X{esYb)fx z%q?kK)z*gyw=Ow~FOdatqt3SHTc5lxE>g>5V6{%6N8RfnLDqcOd<7A7xsEwI*7Su? zWDOB|qu727EMww=hb}Zdp>9hIcbC`z&&!Nw6`{(j0K#rS?@^i8jk~(06W$<0kSlng zu4|NjCiU#zyeWnFXVrK+at*rJ_uiaC}5s#$WkqZ|ysfu{jC4miN!J!pWm4tb_L( zk;&?MS4ym@F#zv=-8nQQ{>)&v%%2Lsa+QCMBwYQ#__C7&$#*673?3#WRFLa_~R?W8|-T%N%ZEnPpMMDNnoEsf@^te!@T zzLiJ26lM^`%RJgA20@1lwslN0I(CGy>qxo|T9dwy+gJK4cayFO3NCJg~ZOI8eM>p!g z-<+O@z-YhUDOz$qhyQwQ^0$xE&*QaR6ioNf1cfAnpZroIJreu$>HyP6GSB4Sl<$>o zc;pJmnspb0cqs$-Y)>9)FQa)GKfmPsDba4l@@!)D=!j$m5ARx^^&Vm|uy!h3zM5)ygjm z(6yE=#q>{0Jw@4tpk6yZ)%9P!m8oTU=wp8u2PCGTf5aR6VfcqUejOUwdrk}bV5r+! z7YEfm!UH7H1joj#=zS{v89?Fi=n*=b05hFsTABs{(girqQs52^f<$54fJv-ny3ObJ zjw=6S_j>law?}qIIZY6*4kV#>MoxC?v$#shB1Sn{Ks_`N32ONnp;EV{9si$cXy+?U zwP4)%t!kFhazmU;6FnH424bP$*1tAqU^9&(Wu~`L8Ds-gfJ!iPrtprWTqK{4#vFa9 z=0l^sX4u^YU~s2r(Gd>^_krLnxD_^-CP+(YANDbMlN_+kqx2U&MbIbXe{6PS&th63 zmaoM3LWx5G234ASFb#G?W#tq5S(qMu-QuPzuf4JTXk#wzl9Lz4!#Wkr9*BXjX2N5@ zjma}+9>ay=Dy8|9#Wp|>LlB$RN2HK+I`S$NJ7hPWt7baxI`8g5nw)_GBVd?8r>?Fz zn`>u7SXrM|eCWO60= zvUL$&(^_iUPv0r6YD!xcij z&*7vfRY*0U@l|2#^n7);D!Yj&VQJ%XT4TsAhqGW89Pfg;H!OwAv1M#x`}+U@00004 z@dryGCDs|{Z;w}iAUt4F0vVtPdC9_)Y_!CaG}XtSwp*zmIb@>N{E?F3?AquuDX2dH zZ)SR=ugW@D=K$C}O;A$dOFR87Otz$0yQ+MfoEi(U6 zL-4r%DlCp4vGla&V4oKt1SETcaqpVv*;n@{K3qd;GerQ@t2i9$MW-ukb0dsmT;#ExzvMpo((~dSPp4GH7_JA*7QHF2ftck=To@McNDgnRhpa2T9YFC&3 zc-v5RgOKZbuv3|gz`r}P!4~ijgUE%N}UO>@Fu((9)VSYzV=+m>ql6q)NLXhg~_q= zf3wAv4`Z^KilX5O*plb_PG`9smk_VU$pwQ23b5y&*$fOB?Lkwk=p?L;wxr97Of{(LlmMy5Uu zGNDqE{Ga@bfFyuo0&SdVwd7K!G)pj;m5jL^<|=-Z-)Pd{dke7BH}A|Q%EOnFZZ=H< zvA~l|+B50Q;$W^~%9O!s#-A%mV9ZR)k+aC+I$_?Rcol!kISJJD#Cx$S76eJ$GF*FN zVwUWLW86PN0zo17DywY|Uq|Hu?<8NuVlq!m$_P( zG`dXKCvyP_-vMe&vZHh!QUm_OcbL$8jOhOY&3@ z%|9E_o4A24Wi3fc;yn0-pkOW1UssGM!O(9l1;e5VBbC^Alf`;RA$8pTB0+V9{Pytd zg=)+%Tjw%PuiK&XLe0gHhKnSg)x&23OTODDg-Eod?SI; z+xq8X*iIH2+79CGunvY@G1%J~?pr7b0$6Tmk1@J^?MYMMEXOMd*&8pUOl_Gb%GpO= z+a`W+Ytxr5Qnib61&!VOcAl@ViA`(?4T=g9lfS?ZlI0EeP%A#$k9lv&;Q)*)s~-Qs@0moZlxngY zWtt>ATHVS&Xgvhb5EckyNZRpO{p-6)f?}lZw-n*s@YtDYB36%@%?&L$pCxu zhfsTIU~_kU<)EeW_D;?mun7LIhqyP4Arr7%DjGYgv{mZZ_YrozBr2EjH7|p5O~~2E zje`lux)CV zH~xOtT?2~53x`OGGGQpQYoQr*!*6n{yIm67yHRKwSVHb^-fmY=KF%>~37~oQ8=7fA zJ5SY%NiSJn?84V|CTB_@S7h+zbja!*KW-b!%-dme)Q2ZA1!BEm_9_h zWs)6*oS-&Rc^m_I;!niu&9stFWcNFMREKR*8fv=i?3#^Q>tB-&88jSQ`2lTK26zLL zjp;V++4F)xQbn7yBX%Q&j9pX`*zUkoh6FdSp~erCA+qD}4M)rX+CmLEiZm3WBn&Ez zYz-c(qX3#3ufYYKEL|UFF-G;TO^LJqPG4_Q{|v=FIexgPr*fW^SOznSrZ4+U(C1_v z8K6*0dYCpAW6SC(JB;}ugSmHHaeP>Uof;ZQ@A91L5V*qGO@|S(2Ufi)zG=CDBcsY5qrDKie;2==d2$rTfJrEN!VHv7l*>EWcwa8%0BUE-C`}lRvOL)O*(#-r)hxkuRT% zowD-t?MjaFLxJNFJY2ZK4Q*iiUwx0nL3_!iJWBHONEN246)H_))8(J|daV@nm2DKp zh0h`<14GIvHC9AAu3v!0K(EB4tuu@+C@R_{ft>!JjT+H%^KMxyowlGS@a|Zr{L0_Z z|D7A;LGua4v)cZv4jqj*K0QBH6#)LIjYxyTr|Q9uEFb6Cp?cEPIq^}?0%mAV%UzDo zwPz0tYM9^hvE+EVqvO8;T*V;lR%A#KPV+4HAT4R$oj+o#d34nQl{GhFTini{v2#(A z2(H>`LwlX;t6vu~gT9%<{v{gE$O-l2{XN7Hlp&H3TwB|wPswlr9!-fJI^cNXxxf4I z=z=W=FMz`YyRgkC7L_;%mm1Fh2q$Pc_jjgYMkJjd3tHf;hvP6toPWcLKvBxDLjiZj zy5XWklhAseU;mjt?}=|aHSduSB{QO)FrU_B@HBM(wH>*hL(7V$Ph2$%;NPqr^8EbI}kcvk!C;OYGH1q@gby9Q3cNlbmfPGW-vt^BOOEY4k;cnKT^F3cjehLiZ*I=fl@}> z#dasIz0giW;7RqozUt!aQ&rDxFY zOJ%fYK>z!a44Ezwp@J#A#+0^ec*2gtKfhmw5GwBR`Cx~x-qo!kHwnE&xecvcAvxt6 z`~aGBjXXP-Z`Mk0klgs;!c0KwAuc+2L5RolYob!)p%4Yj10Tv>rkV}EOTFO>Nz3%W z(QY~m&xzYsF^BJcKAFNdGOS@ERP`t$Z$P;G?>HXIGtwh!ssxbXPNxlBuaq}@ zFyN}5#Z=8Ft6BSP3=2JG)>C`i>4o)#T5J95^J4Y!o)XQ6okfp`p6W-eHN2%>gH!C4 zqU*yupbVL6If2yMxwz@g4gJDXn#o6tQDJYaWEl_{SF00mAe z`Xwv!5)N(78>fDntVk+RGc|pO+SIux2wvBDs&vxWpJCtl0Yrra;XC2o2RtkKXjMw z#yy*gYSb=f>#DJy3pgcDY9f+F-92`LhCKG5vjH&8K$I@5#PFW|&J2<~{*jAGor#X{ z`C7m=q@m}{I8!tzzg@h3qgv&v+6KzmHAoqq0YcW&i+F%)OwGv#I|4Ts-`;?1`>zZ`HAwwKX^|ZVPdCzBpE6!b<{hqIlt&Jq{ft?O0(5TI)NZjnIj>|9Q$g-(1tkIH=AL<=n!%vyeNpc5PhO&sie zaBpdb>xRM4cF<@gY7rP>!=)VwLrWThMkN)#J0K%F7YsV}Kp+gisNI!0_lMZVpKqQt z=3bFR7-qR5oO~7}2;3J0BqYq>C?vMu)hp|jT^tlu@!{#E$0en28Ut>xy|mxrCB_td z9QET9DVKxRsMrl{k(m@kit5JhJB6w?zs5T%%G=jT`XtSPc*p_%zZ;xG#iv0g%}eM2 zYeq`8f({Q@)5xD+Og-^OX5AGR*NF|0c)J~sd-4<;S17kl7W&|#`A?qsIN#O|5(Ir~ z!_y5k$nD6N?h3L3^Dqk0EBu>J{_uOTmo3>drBUroSP}W8K zqIn?f3ZK_hNFGdR$CiSn@Kr2IpMncu$5~SxcDn5ba*Y)f6=0%3PJQ}NbR%JjRB>~n zZRQk*(9Uj^2B-u}r?KQ-Q}yS(xR@wi=D;nGEV9gI=7rFL;>Y0A8Fx&8vkS<06?sk)WQJIpY-gScJJ^T= zIA2V>jSNSjt}J157ODCzU%JWJFwFuAJRq2{wy#@P6oM8o@Tk1kSpB#fokc*N^Ik|^ zXlDv`R*cyU{!df!W zU3WeD(bwS%>+qx*u|c9G!kI_)QRx%w>I;b1{-<4dp2lAe^x$ZXBCrtM!-n>8E&q(H z_evS>g=%gGSpL2=5V2Gtf2`|Bd9&;FU8**TKv#-Zy7!HB)qF@jQkrf};7{sSoM%c^ zS`~pupn4+%)FSBlVSX%Q&HxJON+K1LT|?jBTfXIB>s{Xd1%^iFro23Sg1`WcE0(11$7}i2zI&^Cf7a8CGBKU!b>ZmStv$M*t+rRPiEgP<1O7V zyks-7fc$f6!U=pY;xe*L#Vls}L>?6FNwd;my`TL?R60>1*gUQ$G3$AGoIS2>@SOO| z+**;~;nwW0E^(bAE)=^2oy-l^tOiuIoHsiAo5U5{9A@eJw7|-KPFWQEKZUsyQfFZu zN|-9b4Gq^#MTtxvi}ypC$}ln9pIlq=tl-oVhZcA5*8#UVS(KxP;X-e{H3%gI3BwEB zEjtGPwf~>_kuK_jXneo8PxHYSFuN#*lG&=Hlhs7a8P~*C@;2;zn4ZgcQ`LzocoI?{ z@r`W4ecWW-q0J~1k%I;Me*{M_0fKWsZKA5OX_7$)=Kh|#?dUiMpdfvF(hlD7XQnUP zE}3_hs#&)4d(|r&Y4P6@tqRdo9Kw>tm#dSkGt-u{6ConSAz zz?h0NwqSaJAvE#ZX8dE#G8(UE#MBzkkedUjG(PmGHBp(Zbp0o)Jhiik(1$Zn+`;Ht zq=TzJ#8&i>hhkH7r|BE;?$KqaBe6Nb+r7cBCHaHOf?~%l?k|napYiJy5b>Ze=z(-r zVn(W<=Hm{r_MW2;$VJ z2XKd5&Il;69B>Ohnq#J$Hd_*@U1DcH_6Ws?i=DWWi9r{~oIT0O@#2aa%H2>HD||bp zd)&J_g@Z_t$a?S1K+|82mRPm+>#)abPuEsof09LS&plMR9E1Z zth@~Zvhh>gvfJA=b8Ghibl;B216p)f( zoC)NlV4j9r^g5APa+#gj<=q$xzFM<1oDwpDm|xeg4^2SVz$}5o1N|j31lV zE43;+OH1milxfNW#^O(JM5kP{S#ozVN9|5nicb8BA!F#3BViIHc5Fq9bBvf>?mF&| zII$x%#;2m?NfPU+zG&vpoeD3ARV`8#*VEM<>hUYDv0wyAjzvQv`qaww;R6XAfUKJE zKTky;dWc7t~xAisCyeU$NXOe#Hf(g1g@2GI!MLi~8 zu9(lnDCf=^ULe1j)#Vf&i4@gL>dXLzeb9CPz-F%#w6GmM8zMrgW6PBj*{q2zaIM72 zKu6aLKu`7<&mrF90R>FeKTO;=f7D*iSGy- z->;;C)AJQeW(zuN-=>yU*%6&6pwJNot;ywUa*};ye8x^MBKI^tv|ccNrz{Q5`1T-D z$gehQu&8rg+e`Hy)%C(0ux+TXsPycarMZbyx19`;Ii?fP30bYpc==72MNUheInbpV zh)S(5)DB(yz26<=6j8o|w86mYR=-3Zx(4e`*dm7Q(etP~g^k;<1%d3OvTQI!Uj=== zjQ)lx2_r%05s`JD!jZlHv>l1A@SMZGZ-THw}dpXpE z%1g-HVj?Y)r^0bYRzM3|&6@3?jTl9V4W1qPsqn5l*rj414f4U$%L04m+b+a`QB$1z z#dM-2_Z+sm4at_QiLrEtlt0)UIDXG`lkfqcfX*mKO=cu1zHUwQ+w{S+T3aqE8x@8Enk#2Mf@)JA!~{Y71_B zUwB?%kwa9FQE$Gs9oIv8#LV29rq0@{0QsAww-c0@bC@*32phdf$X7t7?_f5GqB+Nj zK+;@)Z~J%HWn&cRnZOO?^1^rm#07O|VI7Jw9?{9%m?@RW_5fUhAuFAoCk;}!MQAb~ z*b|rT(a543%{-{q;@NI<(t#I8tBZS3P)G<%dEUqo#^&`x*Y1jVcm+>~$RjuYnd+BD z&QH#V5x?t8O(2*%TJkIoj0Y3y!|V4=^@CZRG%J%a->e4$;-XL~{sPqM#at9o)5Ma> z>e{fP+k&i}IcD2(EelueJP7~>5Lg`3Z-Nr!lMcyD`xlXI7R~KQ z-`18ZMIUcA=&F^TMfoqU7bU_=*VIwp3%pTmKca5&5Srg!gpSV%GakFrCg4mF5LMZW zzdaoW->@twX00$%8XSR3R7`AdBQYv_JTUEZ%I{tM_{V{!RKPp^^DQ+G69A;33!aB$ z{aQq_@7!NrP>Y!Z(ROGP*eaUl-DA2fYq&@zFdQLq`_6k2$P#MqR|NnSOn*D@7#hYxk*HO0Pun=6(I6V&n zaWE~`DIFqal?eB+P4i)`N>i0f%?bX(2~x}O=U}o+ywjqy+)hirj@Uj|n_*(gaKZyi znb~RqauUZDOIn92Gg3Qio%F&`tYWZhb|}V*k3moct*3_k-^kkS%*zETH`cuza0IL{ zsB%;1hI5Pr5ilceykZn68p0M(@twG9fOg5J^SEl6C=60wlxWu2_Zvk3HukFp;SMnk zV4V|+R=Mqif|iY*L_2t^ePy%9;*pn64N@3htmyhW*IyD5LA5p%&x94z@?efMA{vzz z8=@i;LZ+!6)B4%uFQFX@9rsBIhx_9T=ycn0M(y>0E#Li0kPkXIYAcKvALuQ0W4xr` zCUAbG0NayIJndc{ph^rPg$H~$mGC(PNlv+e;XiIGhg^};v>=pw08L`59wdDAFy;uEJ5CqeHQ)4tu1oS+LPjP}3=|q^;TQcmwj( z^uUweKIVDTa(DYfBD$qcm|3*_!ECGkZeU03V(W-ebo`_>?q`Tds*)O^1*Tiv)s9(`jvnLom~_7Gw{+;1z{_**Ro>COFs9ucx7r``%wqdt;0#f=MgC|@3cp0W zXYPARrcT1hGGpS9K%eQD+Tl0E&Lo!cD)9s%sv+6rv4j7O3j6hJ9_&%o(jaoVT2nK& z2zgNsC=-2BD1gc;5}Yo+xL;!n9wxMM8zBa>W>y1eeN>TKg+ zxLE}3I~0+)SHhJ1I*L>$70NsL&Wn28%ZDk@a{r(m*0EK4^NmQTE$nPjQVKTc>jay2wdZwWEM<}mhJ^WL1W(2;?Kw*j&Apmj0Xi=vJ`Rc;Y5=smBm9yf z6PQNT3|=7SUgliMKG&i*^2JfJipWKBXG@)WcDTGnrGECSf->oCKgyTI&k!*k@ue!) z4|TnNs?po9)q`DASs4u415Vd4lMGTeq%sJT0x zNP{z_P<8oUD&EIIbzJ|j+_L*&c1X}HUUT9TkJ|bzrD9L43cyq~zsmjGnzQa4*3g$B z2E4BGXG|l=1%zI&Y|z4ep=d{7I&2aA!Dsd&Q|9=fI1IyRqyp=kKs;b><(-xB2-=T= zUuU_6j)ASezeL}MgFz`%$Zv!aFpv>i)o^n9r90WtH(E%% zO`*cX3{GR_$;0i7ks|l_k?g45K1o}EO&B|f?PGxW9=B8 z2A;u##Gc4nh14aX40Kutyw-#gBZ0!a^XRklLEXn{ZPa(aNPmVC8K}gLNP*s+k}i(Z zEak8);0@dVm~(B_#$v-+KruMcgQSh|3%r98Mg8JUGf1^O-1S1vF01#Ldc3Q+_$E*5?d~chX%_ zn-Ujk2v)*|7^FfGm=0fFY&b^NMWFu^zZyRLch_c`Q0t=OldzGN;0`JEuv}NLndk)P zU{HGm>MmW92cR=;mJ(l#TP8(T+R@A>F^(PKDNg#W<#cyt1essQbY|$_kdy+XTq7nd z1GX9&n${lR5EO*WGAK!K^%yn!P8sca;Jt|vl+O(bvb5PQsdtTBU>A6N2cRHXE<+lQMI#_OWH7+Hj%T4`pD%ecuqC`> zHO)lZ_pa1|LqUJ=q z$JdJqgTZFPS)5g*EiGkzB9hlrf@CZt#6FQt^-t|`t#^ku7 z`rQ=fx#?uOr3Q{dE>!StKtVQ_ZU$UTG|%t)+l>Nl#KuTdRA6u6J#e5o2-#NYQJT9P>myhdzQ{&?Mv^03E=Ga z=T8j38~It&(jUj8W}t*1bN+yXXEQK^T}+IET3R;YfqtCcbC2J?WzADK&>WOldY2PI zRm)4K9>2H?h1gS@72BZ#1~>{wBJX&S{;$@Kx&Hy06?q;dAKP`|5j(T#%yZ872&;@f zI5(`o?r=pYFQ*yj^h=cMgv`E91-gGa9YU6N^J9b0Y4^9_+CAy~-_<~&d){e+HnqKx zRTETq&Cxz7>jI5&lPe~m+kDLWZpuYqt|v-r+vmL2@Xy__0Dv72iKpUmo|K)c%K@;A zqfIEu4Zv5Mbtc=mw>44s0kf>feHbC1*9HgF7290@f?QV-)=Be=E1X?f)u@j-8P$64P|R zg_lw}V?g+@JdT^MvgpJ_}alsQ!o>Ev>$ z2qWw!9qhR5KL}T!xI${bS}~X5fYPwpL;9M8;!-#C&CCDMVT#f)#R`By$PBn9v5uvt z7J7njF$t8-oHvmp8w5Y&dX=FyZugu-rQnq^!_fmx!EXD?rm1p4sCaSYPzz#qJO_;P zjK2uzsIOQXB`A4h)o?=KSRiFeSp%9n>Ss~Fv;=}+q(y8{k8!oV<1zh%5~uX711Kca zN&@RjP|eV3Gg>#S=(UPc|7AHih?DzEy=nU4AZwF)W?um~g zE{{(Gu#mb9JAx?X0m@`7yL(%@AIW_uuh|>(I<@D^#OFr)xf0^Ze9u(w`t?!2nM6`*xUB@L( zM*x<-cj|2jwqOt!<7bh-ZE*9IX5?dNlM^BnfNmKOY+8>=w;3&UG{$(W{)n=Bokd0rz0-$fP0GMeNukiTwwQ`P`q^KR&w%;hjsiTu@0`V z2vZg1nuI_Lo&wMXqD#}mv~AC%L;|@yo%6*3utpPqmgH01+#h|sOrML*rv_n(@m&G6 zRui=BreoNG-=yIeCm}%PaNjOSA|;vAoQ2P`TvhbV6m78a!){tNw710<+TxuGYg83w zi5fX+Pj-x@0RvswyKchzdk{-8cIak=nN^ldIOOFu=B%yuRV5~6rd2-PMWPHm;9_;< z+r}smT}rqXD|*7DJ=)~OQxF5PiH>~@YIRX3cJ{`@f<4sU66BGCJ?mE8 zxWCOm3)f2i_P2kD2#~)C|ELm(0)&{Z-Ibogz3qmlPxg2K0jn)O?NF}G1oxn5CvT^< zl3x$<=fzq$9dvc99*F(8u(4TL36_Fpi5iwz>O8QITys!mww`N1p==vQxaOB1s*#jy zzu+2d9;)m9tS#+~pa8@$?_Mzrd;)ZKe;}>mThQwDgFR2rV}1}SOQ7_kJPQ}=J}JG} z!Nd<>A)4ZmYEnOuf)Z5hT7I}N2)o_JWx}IAz|e<1OLm|h6S3xiUkX9m5n4F&;aq%m z3U4p$<3=>$*lIu*&;9w@5oKMIcNcaTBONp)f*wI}_z5;}7E%$?eJ@CN1&%yV0Kmq2 zpIUkl-@ zDlX&d8uol?+}3^j4G5=#_BpWYg6=p;R9QdL1XehvyCo^A|5>HX{v8mYK-XJ6^MLA{-<I_YVF9>AW3FDwIsIz(omq@7uANG)LmXkXYJ9dcm8f zBfD6WUGvQg5Q1}oYAAvIo+Yrb-twYOfE}4akIvfgAY5JGI;u*bv%p!FFC&5A38&a~YV4 zkNYF^XHH6T?Vr+Tz;%yFiYP3((tox|dEFpcqNo9_0v{sqPKVLSDt1yR6QO>+^O_%S zR?K@OjZuuCS?7BD^@&H_5*aF5Saj0^HC-Kavv@qTKVlm-#Xv~D8@G=C;8E*!=x=-tm<#H);(d%bKk8~q;DN=S)Qgreh8D91&7yIJJjZ_xn?rEc=e zJAMwK<3J=$mXBe!9{M_~yJc2UNR|UH|LN)%{R)Yu0A@g$zb@)tYqOSiw*_^)sAQ`!qrL1 za8$YXJcHNDLWA2uP^FIZQN-D$us7XS=Af(kKkmXikCrSFe4#-4`=v^vXMf#bcYOkAm2&4~8N$F1C^u5a-X;Uo7E;B0#d8whnn9}d)KH;Wt(Lj!2w0Os+D|MFi@M;f{!q) zqF6Co7}w#Z-}@T~(dfM|OQ$UkNpV}FG^;20IAIec6hZ)#uECI7W+L`2@Ouq3AQD-_Jh`>I`KD|u< z@k%a69B^Nvxk&epO%6rH_doOha3DdoBD!LJ@Vm_k7n(v1v?&OEWm!+M9fiC*D!v%0 z>wpY7vAbHjY#~f+5Am>6ScerO7sfl|eh93e7Vi1`F^Ply0$ zZ&-Eut@ZK{^kguiT=5F|5T^_m7UC^hzLUn}U=vcpsgVuhu1kkQ|0K0jtjP-wvEou7 zJ*Q3X++N+pj)p(!d5ICq54t9`+AN)o>UDSmrCO|s8o5+m>Hw&{TJmkZ1k$^Qm=Ngl z8vuD!+QD?>Ytd-(uOxr~wTV#1L4p3%Yd1(S9q*1Fp`XP{X6tq|j`ZIL&e}t)!e7iw z%P&1RzXGY9)SV*>HGhlyHygsi|Mk?gD_ZSxqOz896&Qwx<_zK$M8cQQ9OT7({ps7DQ>YtfQL!QVHY54KCBb(cR z^-D&TLC2DuRdJ!J30cx5G4Hk4u*Ec2V)fVGkA7RZOTB*a4%I;^3TK>1Tr>1=QPiHY za3}ebqIhn1BEYo+h1`9~&e!qh03dQag}$f~hFcM!1*|RlIyxqJ3Ltyfl9S3Wz%|hD z7J)BPXTJ_+<9D#3-4qf!uEHvfg8j@d-8=XV;Vj|tY1$c)5^Cp4M4;|uty7QCj@Xa- zWYBTf3gC8WpA}$Pe>b&KI`Ji!N%g0Y4R1%uS1n$*IZ_EgNroQ>P{!WS13?ts`F+d; z04@x<@h`7`V0FgxY`KfHqJ={XMd*$HAwNM8`(3Uun5@UmgZ841)KeI`-Ufz$D5nkP z`t>~k02(O57_KM0UTrltS?pt*d1gPz4{0lesGQl}p`9_E@q64qx-5sHGQmm)m#o^M zmu^#6MK)UaFfTeE(Ne1#ASrK-VKTYoP3>;MN+CL|7xT}`xMaq4)#sAHp6Z3Xa5j)o zKmu4W^T(vg-RAcSwgCN6R=A0CW_5aCML`H^(=ds0ttO^EI0t0iLV{cNNi-%3D6UfI4kFmu-CF3>N?diMA7W2k1Iw3RBDaskgY3ZsO;#T zVc|6h!Wk}skgRfmP{*_m>J@(F8u{u1)DfM@)+KK-7@KqHCt;y)_cC_oM7NMeqTARq z1UD5Z%i(ZwF6f?09cUB6q^!$ANlCSS|Fw%m3m~F(1vz$d2u;t7SwX`<{iG!38B{#O z1r~&p#oKIGuZ_jOF62qIFO)ntq&({m`?vv#v?E2P1*~ze>OA3+rRQOavrQ@4ib<23 zsn)g0u}%+ejb|x7n2o*kBl6{`J&}$IjLp1jb&hhV-+ewcE+>PZuhe--#4>(EnU$cX z-6TBHVx+{~8RN%{vdQqr{tCaN#aLVHb0~mIu+nh)yuU-icNy1FOwB+Qw>xPhwuy6 zNGoD=8%XWCll~KB)T`)S&ILxjQrfaC+c1VNaSl*OmBN$GB8>p{4;FPY2eGfG4M&XV z_ea3@h-U%B{4F>kW#2=q!U4y9UG!nBTXf78no4jV04V*NXCxAcd+2}w0HlaX=@~01 zWHU8Xr~m}4jiUen04XHwssI200C&fF(5h?Akj$=}G+;4~2g6UB$s`b1F_L^f%lt{t zWo+F-!M_^{NVLZ=EVq9*o6B%dm#@>%K3k_Lg@t%l{>OSgQ{22Xgv|`p@sP3d1B8b- z7a2pPzUUnkEubQSSMq&^JO$A$Xqha5VQ(ge=m5*lO?~z76Qjvgai;(LSb5`9MCuK< zLaVxp=y+_U5adJWvhu=3C(8-l^}Wq7MPM$e{-=aI>izJ)Ad^4Dx}$OJqn9+R=UQIWh*GB3~JF`paMUCzuM;g;ndU~l$ivB7_0mdr^d#b&2@GKUhk#l7j zWR?n^M?P{(Dzt2{vN?qNV&hb^tu>bpFt&)=o7Of4lDb+A$nlD^D+o zRaW8IqNwGYkQNX?#p-rD*xY^wTR+*`XKtTZ2pdc>h2WKZtvee!WUQ!+MK(d80NzOs z(tld7;<(05B3;bHHwcMQ%>gt30DPtV37I?-u9Oz@)||$qDLt%!$FcyggeR8E_oy#{ z^a3l?QK+eOTExyFb@laoGDl$e9U5{SsZ`>p{wRwkb*tHa#``)qPnt#JSB*mxFQin_ z@4h2fI8xGSOND+8Oi)S7@3fSEfzg#n?5&5TfA@#lZb8?D{2-(o2H3rSeR|}NH*lWG z`SjY7?X72jok&(8U%VJ0m4w@rqO4+h85%)g2+{%s;UXnzAjqfqUvh8`+)Bf63|z_r z!=_jcnujx+#=?XCr;ThgX$hn}kUMh_vaS5*6cSJ1 zwa#u@=GR-dvkO=dya7YCM%Vm3vM{d|WeAegzKl;kCrr3Ti7c)2T^w6WtERit{e&YZ zz2G!kj$}wH=`B&4*d_^+3>dpCaPTBo4yG}*@S1+s3`R2w*i3I=#6G6}#dta}@D+pl z6HEQj@j_~GVG!g^n5d^|a5Kv_(V#-LOFBpnCMGxRYq{eZG^sJfJXl-~QqYc_isXqi z%iD-6i$a(X6U+%$i}H87gy9gb;u-z0uN%{N;@Bamn_3tov!6%U;I|FW87FOmA5}bD znYCrTTBJx&7Ip^r$WVUafpRBZ6GaPUFWG_sKEp1)V_v=ULxdlODY3P#^*51jZR7|h z6q;aJ&VR=lxq`P!e5uTNj5oE!Q9W;pgu(f}u!6I}mnyMZ@n(Bpf~gl^Wl{swysa&c zYP~8Ja1Q8Fed*(-XLU+fs|HbJOey%^l%>Dfsrl~$V}e#{hc`Ct<$*lNbQ$LUMo#cU zf5Y4lYg_yM9B1wzFcp-?Ih=%Tn6}|dz0M7<1E=Ia9!RpBI4=lo7v@()hz}_KZz}o2 zqesp9<2}?3=??Ir2b~}6@v&SW$6?NMK+oGba&cp|&fw`}@UdZve<%Q%R82_s1$!#d zF~4Uc(wOj_bkI%^9pqJ;+E`=6=|=w@`v7zIpu?QULQ1_}Pr|{DCUC#B9NLm8fpP&c z<}Pjn)rt>VRBgAg0AD>%cQxu-9cK`24MroBqF#vWTI&^B1m*rbJM*YncTbmySgi{t zc`8h^wz{VmFwNK{G6jgLoHS2NBo-X*u|f^HN#IN1-4W}a%zLld%dwk^jjQO=cgDd0 zj3;rsYDP9SKbSu`NGwJF!w&FSaF(8Rtf@kXF>OisWh!_6fO0biE(V$6g4aiQMq#f* zbx$zBjDucYAEK6$*|HD?Xb5CM^6nn>Defgv=zpx-n7Z-bMHQXdkxR1idDb2eO3fb( zAM+CB5BZ#nUrIUEd=%197jB*_`lZ|CJMMJZNqbvp7;YBOW}Z}P4a3GD>_oiaAe<9s zmO{$W({(@NAMpQon)klv+DoWvsh+AGCEYpE7S$sk%3Re7+YEUKHE;G5*hjoK1kx8W zjN>ZDosy<#RZP5{I5QApJ!^3-6py$}Ls*jmmRObuRtns^S67AA$K?qR_6&KXdEnF! zIU9>2_!Op}W27^%`Y;+3msPyczU(!oPnHx=wZv!jzB`V3`U11Qg9Q3BV(jeBL{1IC z-(B_s+o(SM;g8lk2++D3%?YRCzt?`hCBBv?Wc1iS=WakqvZoO@-QiTQMGaZ0vYVrm zd%VaB3Xj?Dwh`fe(>{U!4+FHKKunghr6emYDie{uo0JJFJs;3^)grb);IL1@Cw1x( z-eY}T`pdcxjWZEvfngao`)p`I$yCY(-(aJtSxK61Tl4@9E|Nb!vRk~TE-A}zZ7f6` zR8d@yg>%NwcmGmLPegGR=T(i6-5z>sB z`O1Kn*v4Cs5&^}^h$6}U#!`W_eA3gGnQ@`VH?p9LjZr;ydi`7t(;3wa87!Ll-;~Q} z!4tP+tXO+v7qW?e3+bgj!;H>zZD$M-Oge%OTQW1;#`6Acg%&rI^LQV(;=*6196KpW zdv_7LzYDx#sx#GeXEU*MfQE`p63{xt7u=40ht*D>khwxc6i>Tp5CbVvCd0m=r*7XOE6{37DF#3A9?GyyHpZQFy+-=UZrM%lDE> ztjwA&<#mq7@5jsJnD91P@6p6u3d#oRkowO{Spm26+0M!hC^0SDmx;ZMDT%>>{mvvq$dn@9>l= zUDGG?xiu^|O zltRf_Jz2W|q2bFUf_3J1RU`Qzk&UVZ7BRk|ikE2Xa2D$6)trRFOivqe)E}D7C%QQM z4zt-G8pu1tE$(?M*mc+t&W+wD%0U}*M*5>V!YT7eV4iBOJq5X_$d097uy$0Z#SI-@^GX_nzyB_q8#D4Uq#1>N8qub+V+xKsS(wpRGIl1;^Y^Isi&0pQ zzV`=mbO>6mYO}Hj(+<`10Mikxpta^7#Zs2{=t?tMkO;6_rBeifeL#>249JqKq;j#Y+c<#(t+H(LzFJvO8!jhKLdJq z;1r&Vav|mZy!{Q(UjuX8B^DHm&%S~Nv%YF8vHT$>ybT11EGHd9eu)`VG;Ug~2l)*S zlv+^=+z}aBw=N}TSzxpGA2QZ_vCmg}u_q^G!&0YG_TkHQ?y<*xc3%5EpN+G8UJ{I= zzU@IbLd**{-oMFeX^rKw)X z*y7;CHz)^Z25_rT&#xh+n&SDYiNR`2bJnG@cXGo}#x(g$4*3$1+WN$e=jAC2sNfXmsWO7FfHcQEF(Urn#JUnfaot;C znJ6W*3>z6qA3e8ID9ET48a%J7))EOLzIR)>3?PXjrR-WOovVn|M@~G+V$=gq{sDQ} zu$Q1jBMfa1z0Lut0^qWxH;L|n{A9iKR;Wp3>zs8K@AIeAFo9;6nyvL@nDmG8k=`AJ z^#5zHEOMsX{)KwZ>Lf_@P+_dm^ulr`NOyycY|S*97b7Ta#oypp(wDPG)ya!^3`yot zMef{8HJ%vpLnIqMj%~kK(>pLl^r@ajYuwC}W>t^_U=NPtQrX$R7ybjYs`L4{06$uM7UlF&@2B{q*2LT< z;3Q!tayR~vY<@?hf;s%=S}6r7Z$MS>N8^M`X;cK;RL$$7J}z@m;%AMRQMnQRLrAV6m3!<;_@6 zhKf|w^7ZY~ks3UIl*eDK%vcUhF-e|wqZ&$CeTCF1bxZr1PXyh3+dF2#&w2Bhsgkl$ zVKqhxC%5i#$AaWiG{lJ#Tasp9Zq`I@<&D2xVrbj1(tBwV0`Dt3nWca?4XFKf$vf@4o@rHWY9Wly zl81a0rYsH!=mhIc)@3)NV9p&T&G{$Fw(z|6mO~@9zlfYnyA9$xn95LQRj+g+rFIAq z;?F2=o)S}5l;s59q$8k$*!DCj?Fm|w3pv0f@drLUPD17v$ZFJ$bWps+#oS^@koNwX zOfGr79Eh}^YzTn`W`5^@yLtFW88%syMjaMk?|7JaNuA5DNHYjd+j+g-kuQLR?uZ`8 zd_=2D%y$JQdhYZ&eydE1z^qctZdUGAvGlqvp3E2EBij-8QR2_`y!%&%NVpH_7fA__ zDWFf-5xp&X23^29PJMqV3pB8wew3KSfcGO1M|bj6TNCKNo$0?Th_q_3AcY#H@4vEI zf3tG9QsGGKqDelnf(7o9O+3ayVgr3{8W+~v!Z3PbYr4G730lseAv&x{pOV_asI2B^ zwa-W{{_k``IIz<|iuk5=ql}zb|3~yh0d0u;Lm>GT$Xl#DjEmMv<1T`gQ?St>ul0zW zRgLUa_}bB)dx{g{ULt0Jo=Fw6Nxzmq!!&h>c$rGn94Jc18Kg?qlE@ihMvUSp2NI!crs zNZt1{i<`vx1|S0}0-!3H0iKUlm2=zn)@*YyiL$CWibv!w%pGPL?uq z4FE`Rg34GJH`HoHwiHPR=3jD+-G&`E!G)rucLk%2a{W6lNdKPhm0z-Of-P)fl!$0? zXBgMo(GM1xzj)@_UgOpqNZ>v+4#uEltQ>X*dre;NnlJZgX-u%oAyREa63-O`JXMDf zNvz_q@Xqg)2wOK!Es(3$&B1HPlWrq1MTl|N5a6F@?tbBr533Jca#GW-V6U0evg?kc z^1qpyv9SVzS^4e>a8bPBYmb);jZWC0JuS z%DVv^CxVh;q7CtX%AmT-%$|+pp^2RR`S>ghr%;1=cXQHaS_vsiFlOgcGNvVpCxGwB z)rgMqTkwCWty?L&9vmy5|FYLU^?*pHPUi!`_N;BXUZ*c7mzAX`2Ww7_9>M^6XEyq>+i#W|-8;LjIEBE9{Tws0b z=B%%rXq0O9YBn|c@WP!jB$`yK!Tg59v$F62i+6nP6R=Wk z{mn6lynA|WYoL(Non!x(--Eh6AF8mMEqZ-j9veON#fB3Mj&QcB6~!j<+WJe1_fz-RRqPLN=WI;K#eu{U8SJ}R0s0`aDcX8M0TI}B`=5H4< zsYa$F(uj`!9b59s(`B1dubpaOG7k^nVt3`&{@fy2e~xDfc*p=}tx8c!1r#lyKW@c9!p6(iH;d`at`J?!auYWs%ugyR7Zd{gQ3vZ{h9emqD03}9buKRU63L=1ct`vr^P zvxUU@slBA%g+uB`%_P)-_UwLq@N%9KraJ$XLLUXjbB;?`SyXkPnl3&Z$AIqr(|$>9 zGIZ~cg_G05mJ3l7AEK`{zc$my(Pty4@0$3|u2H0T5ypm5<7{ z>zvzqfHBLIKrlOuX6Uhlvv1?jxrtoXg}Rz&hJ50GCozAEKHlPP&#g4$KxN2WLR5># z@oJb}hMx>kl6gP4OQQ~GQDSqF6CUxe>6yjXQ&LYN4$rn;*>YBuyhuB7Rlo6{Hn{@8 zEHrfaO>WFm57uQ`e-@&Gg4wK<#cJD;`F^9Q^Is)rGh}wdIcuTNW+xrqCs zWdV1)k;a_r0k}MR2l`^7Odyhk?V)S8DEheLni}P&Fz2tUP^}C3jTL`H(%^d%JPAYh z&GDYOEq)>crC`->s*z~#Gqj+QLygGS5qesN4vSv$sO*X5DDLa*gxlzJhlLJq;mNz| zA6HK$Tyw0i@0M{K=SPu?Lu!ju$zKiXxsQ2pJ|b~8#NycqHddKD3r$^u2X3)i!Bi7i zPZta^t3|$tSrgNiG$E+i_dq>x3IE$IMUHmk-mraT?f_O3o^eJ$HMS|&4{}gtVAVUL ziLn8qK`X6l@a3uVaZcM%(pO^hecA>$8RbKQLl2w*^1#LEV4idK)ep~a%phuZ-}qynv~1q8Nt zw)>SGli7V-2kwh(bn}TOd}-p_$EQM)STp+vJh0Sq4fYF!cm0zH3xpPMz8=If$Qq47 zmY!k463Wo$?~M1D<}7+y;H7FUrxekGA*%h)^IVq#-PbA~?7|eKeCx1I!~f}A(=$-6 zRK2FVbi!)9h@SEiu6#5fcdJR;fSiX_qmF}DVF@zWfxbU$D&*Vbo$Z-W+kpMP98)YF z@N2l%4=?Y4lG%f?k-F2mk^a<0lZ3k>!P=Hdc)bi4EkUVy;oYA}> zmL*ehvb@wihe-~#qh5ozK3LP>_CjY%`l{Yil_;wML>uCxnGbl)X>~w9>011 zW11$~H@?UVH$PZXVD8u8^#A~L?(@k3#1P$DUuaN{^uRDdv2>#a(Qs zwAnDsY;~9H=b`_BNZh5}i^M|TZPoHQMe2_%0J-&009?$ zan}mDrX#qq44DvhtRO$^ukEN8W)JZ$q4%#=#h|!?QiebP03BqjWSK=gsjUSR@{vx5 zRi=-UGY%okzBe;r#f}18iYS!rxNT^MUG!N>BP^RG%zQy$w%oh_l(L+T6ttF2KsR4X z74E8gkR#R4d2o?KnZg!g3*p}t{8g648m$0fBdMmo^{H0;HgkOaoTmG{XQvOR5^_A( zIE1XVE~xDt4yT+U*c(@=lfy9uV@^oS~yq_C#sE1&t)Y_6@&_7K?pt+}<(mL3$t=X8>I=(<7sunbdY^$uhd72hVZ~r#%F4KxqXUVhIyxZS58c2PN&+ z#@7#Qo_KWPUT+XXR@rT`4WY+zyAHC4`FqLA#d(QbDk##`F34$8={*@hq$!T8I!KO_ zv?Cq_5fY3+_lHIa9d^Gp(2ZCapk)ZGwclKh!n@ONYE=`G(8-fQG^1qSK9sikC}8K? zumZ+2A4U6?qOOFqrVKs1cM0*bh1IJEyj9|nSd={Ils*pYj=XgA>-41-#ODxc7W)#W$ z@}&*+HA=g+&f9CJTMPw$3H%G3dc+=hb8Fwt8@LX?gSte9=A#SQ0zHUJMcId;bKtxJ4X)e{O>w==Pm6Pf^g~{D2 zYdEQ8`)M_#)4J8ra!(u9?2C|;(HF;lyIb23UZJ$L<>R=L|5jUaoMX{3v%X(}%0tmx z3nI11C{B%yVx<*_@R{)Apr%GSS2;LBdtxb~rREIeOP&QQB`9l^#ojF;MYB?AxeDndC^91q_I4EO52Q-o!B#`=U>_y8;@p zFSQfGmDGMO%9{XMh>Q6u79N8dwcjD%JaCZp;6!$~Q79(RE*j&7t zL@P`$HkBm#%KZ?CDai}pVGMJKQoB|0gt#v-oWnfoih`4DiOjq0+G>m#yGsQtAvwrm z?v{||^FkqYU5`3l?)nLXgmltITLgMEz-sOr1OACZYBu?t{4WmEb^)J5erhXAw`Q(_ z{O*v$U)M&zLM2AKaMJdvBA-_$%*FJj9AZ|7{BwYHpW2Ft-x{%HRPm_TdoyeS)5bqC?qSLzUs01gpWqd=Mi>4 zj0N^5IN_~g_ayi-T~C)&aZz@JLz@V~EeY|rO$`RBOr0~da;z6szuzw*G7@$XdDLGPL;kafNgW2jrLqH-L(U~Fy4(Ndf^90=-KrXGNJ-V)81UhvvvF0btnJRSQy~ zLO7|SEzueJRP8Pr98PRL$@D>8KH82%Qjtr0?q27<4@-4w*>6y^LBK(I=rM90q52dgY+a?n7F!oM-16DE116UMOie@;nnKF6!Q1-1?jj4LQ`-38DKl z5Dx96h5w!j#?Q!QpFxs&TxSwcQJ{;5;Z*)~fTl>Wrf)4~ivxFHJl>HW%bkU{I}ce| zI=D}t`j^^HC@^T~bw-mqElUDpZX3&+zuTg$IZsJGad{vBPx&L*0!aK5O|hLH4;Zwu zo2Yb#or<03wrf??eHb21i?iRB5N2^oqr`oC=;6CaqBsG89<0gn>r2y!_}|e&=%R5W z@?{7mr4c3g?v`x@zzrScESt+SXV=AfM`l-|E%x2gFe7b^f%BgM(S92>1THl$_2Lqn z6UFrafW~3cFi~uWo9g7rMNsxRHWyXD=-gd5KCM6EB?R0OE;DB`&eYtZ#*W-I zBYAJEeR*Llmg`3J*uXJ4@?{yMLq^~;d4!h&4QRm&OBYR%cn+?T!#<^mh+WLfS$l0g z6GfS~$zm_%bnfMT)OOx4O;=jRtu=v)Gw>SQb?nbG_CeFyl??+It@(n6_jT!4_jm^jss z|L7X3&zJ%Mj7V5|)uJ?^*pdj1lDJ(HKrH*~Cuhnes`{G@kI&J2|D8s9@&fB|G$hQu zC<)5`r;xNQy`#tWztM8jK1?8hC>J?AXGCVvKJG-k$=89{glQzLIKm!;ud?*WUKpjj zvAd7IloD$bG4X6BWb#YTexVWVWa**@D3Cn9Uh5Zk`FebB=3Ca1^8t_E^!iCA2)hgB zLm)V~8$h-wPeCAJ5!Y1KkckH5K3*og3DJRg;9JQVvf64;{fyR0=wZiPT9Kbm+Ippu z3}Clq(De&l;Y+k?UM1YkiX)PEAG}mHfEq^=vE^m(JYC$!CSov+`bDd)7_Wm<5fKf) z$MV&&j}glbQA|Wg>Z?ja12>Pm=}vK{0OhZy!4?JP&d0Q!SJDJ5@|vZJDl)l{_)vTkCK z*bj!bKO^r-n~3imgQNQZCz#yY-^F;o>OE`gZM~k^GdMr-BHkf66)Dj9eq@FF4CS#+ zc}M?lSezYezAt+~eM9??tGlY0G-|2S@X)()q(L$U2Hm)6%50n~5z#_*Ll%Jm05f@@ zoU+z6xhn-&mf1l|ujabeMZDucX{-}#-}-jk87k7ZYy|IMoz`vEL)<^yrYBP9r{~s{ z@CO7(Ap3XxEVA$;Y(fgvow}?`yJnzk2Jj610ri;rW2iJ%WcRPF7%dJ5v%mY-NyU}Q z0aj+Ir?vd?-z%wad%Zf3+%A{2;11ZINKRjZt+(9hd6inhHVZ36t6LumEZzX4Jt2Xg z4l_2;juL6|;JZ5EGX`D4+~vFDBR6aVsF`rNv#s7(qr{!p$J)GWJwGqAFQsG$cdfm5ZAoxs;VLraHIFheZg#SU>_wd%A zw$el>X6sIz{|8(_Sl%Mz(b)1$RHkHn!}TpCJZiCLRkBc--NsTHLoD@;uoXW@m%n$#-L|FGCYj(p10g3#*uKsvBFrXw@DOk z&^4ft*8{V9r5Do+PqsIp8dALAFc$od0FdH>o*;{WRh0#b*Tazp&GLHP6{(UXi%hKd zpSe_Ly-Jhv*?*qwZD1JaaQq-gcgE?izGb68P&EJ|6Y0{f1al#e=)_!(Z2b3^i95R3PIp3KlzWBqI#nhE?N#R>g67_0X zIJ}nxACgV@0RwinKkh~ldku5DHmNORA^4B)j;!G!Md#C$=YuU^bBu_mqnW2aDJ`V| zDy5Y!s9kPzgh8kOw%0e@K84Cz*@|t$C{o~57dJdl{?e(bo$A*yIlaG>1|rcNjIS9S zanwzi=MN(e*L=MOO<^h9JLHFuND~j1?8$1e`TBcik<~_cb!eE*Ka{K$FsqMzhGBR6 z)>?y7e%|6kn3&~qSAYbnhIm@k0G@Zw+k5i_5gCUpW)Ec}m!L`auz}Sdx9+Jdo$A}T z2VD;Os&*gYLx`y`uBT!OnWT_CR{08e65r=<`6!C6i2OqSdE8XOg4xk%?J{0f|(gdXQ$z$2;g!^hfIVEzND7pwxWd;2jEd**CW%(l)fTEVMXc~v|wkj^U3g4#8p@h7Tt?K*0 zM?=I(-r70BgSjrxUhf0m(GuR?PkV$vzJ~5SKq?tHZjn%e$CP7uHt99+uB2r9mfxnB!Deh4G!e9yb(FDH`Br~4i$iL5S_wjJw5v5|MdVe8av$(IIYP`U6wgqb!Y z$)K^Ju;H;)gz;WPJp-~1eZs%-;wY?FN#a=_KQ$)_I+alYpIYv>C5G+E06bq(j_&ZX z3g^BLzI^iXJJOTBJLfIc)W^(=UZeW+00qt5vG0kD1b;NrEHTZ5DECpLl zt_RoGn3WV`h~pFr^Hs)uzHoEbQunu$-9eAXj`3Tp_W*%Z%Gf8@k6PWhgXsrHwokCo z>jc2Mi8zOg+uk_JcD$&&v4MAjkuE}DFh>PdM9qPwc4(I1%>P=-|GF5~Sf!v6l{(Vx z(){<$jH;2H)}JE|4`5aY&7X^OAi)W22mR1GCg{%ZX7;#SB(emo)5xPm>WDWcM9jym z@sF70hy8-r8?D5yu?w)P1nU3YlgoQ1JYJT(vTRJ#{6Wm9B3JsquF7kA_u$=JYNV2F z=710NMbo3wx5c>ZN@JO2_Rt<*@tSkfm(~x#BQ2jL`|I&hsd}j{H)-1#b}7mh13T|Z zHsFv{a=hc=QYP_r%IY+Qpwe968%C#h2Uwim)nf7SoX@V%73Ofi_#iyQG`3QR?jbK1 zKX9mB>YSS+?8=DRX7)*JC5AC$>e&Tcl=HjSi*{fS#VVmz60o_<{AWR{A|YS2z;Z$A z$}J?U&n*|VhkbGWbLN47g0&xpsovILlC{rky<>y7QvE4_n>N=}+SWUBNeXp6N;C>i z{~Mw|#ysqWr~~;9c7=}7)~|m#?JM3$|G|CZ0G0%K$X=91Fi<)&K5HY#Cex#>`06)= z2}!4W3F6`71k_tH({i!OBQJLj3QlnfwWk*zc#G{U#ky9i(pRw`@ATqo>~Zt48KJs% zG>{*)kwW*Jtp%(P*k`A^+DXqi5|M`_GoI%x;gP#5><_?J8m_VcvJM~?FGl2G!`1X$ zq_NLW+i{Ro1_XD4<>GKWPd(hE;J7p@e+HZsCbj*6XBzg(B%L@i9H&O^uzl)w-aM(DNA2fs(;G1`AO4^q`B@q|JYAJJ>I)Atu{NOY&x~>pGtIhek^TG+tyX^R;bNG0DHO z$qbJN(_s88Oz3Q*+r%@O&eygMXDBmYAnUt_q<3CU&VcCTsOBdQ8peSXAZhJ14->~? z%q;Ff$UR=t!IqRE$lIQQrbeUtVaCiTVXGhyH50FTYUB>n=QkqNbBfA-1Wzp=nh`)3 z3E%g-n$kG?7h>mT8eY(`2=pV$F4Xac#d>AZKoWmZM20qI{2gQbl%Ou8oo4?SD;Ny+ zijhubPq7q&d=^rFodw0>KXAe?B!0QO;+)h;kAE@(kGDqehbNtU3Dr(}!8df%rKvhw zLzndiVh2Zv-`9X_?uGe|YMMW5=TEByb=H{YgQC^aEp)VYXV8|QQyk}=;4$K{?#{?< zTdwv_d!LO8~hUIIzp^BxHngc08B> z02azmO4-2hHKP%(MreauyT>AuG`sg(RUpmCuy&>XqSKiorsw^3PaAs6O@#Vcu=Lx9 zY=QVoG#7L@-2$Rre*L1}8}ZxWnMI@+9mDimZ>A847Df7zrlm8RhUsOodn2l$NM1v* z2v?rcv^t44$wW?E`Ok40=gOJAe>}zA+K<82HEa=LOgxn_#cFxc|wCYVe)N+5-U?fM$)Vu_kE!~EUp-&a_Wx^b@uIr zr;KKE)B=G=GjcZ0NTxV{(Yf4u6BdCX@)mq|$1onr-kR%M>VbxOWsO0nt9$@|K;3lX zoAky@L&lNFwh$s`5&-1+Lf`TL2B>JzH$}6V+M1mM_V>Gjw&Cc}!*bM*(sj@%r1_^o z#_2aBB2m0}#YN;hK^-y`Qws8j*Q4#*QHf(sk;MS8y4(YMKK_#@38>{x;2&Poz}$_`qs@sQRUJqK-q1hQg2gYmf=Me*Y|c5M;DVLc*StR_ly^X5M5`BC-abNIr41-TgR4Gjo9HjOf4 z<7xII@rn%k-DSBZ zJeF(1RSR`Hjr9}pts73XN|InJw7w1g(+@zU92bl8ZNT!t* ziLiMo<%-$q&%;_DGp?y`Ekc{F`;LNKh@A;?r^*XR3p&&LDU0?hXQNp?^0b#c28gka z&_-*N$=fNuQQEVw+_ZKG3wL&<{@<5VAM!`HO>{~gQk%Z+v`aM*=dT=&{8&(vQMn4L zFg(;!s+X2_k{JkKq5(3>Z|8fILQF7wf) zH*u)$j1%w&CW_2#|(oQXcJ!P(;S2zPk)crzG70_q`T?tYQH!j z0_|nv7{c1CalKk@A185!TBAh03&d`Yy|*bFnu>`Y*7#&I%e1}elk<&F0=v{Rb)6t; zD<{_dFxyNw>?4tw$C(K$J+T8Y1Kf-q9Up)xGY})b6(`k1{p^j0he&jMEjRql3)Y!J!}4A^)~U*`KV znz*}8AJKN1j)mH+v*3sS9wR3eE!I)|6)EqTqud7bt#BfD6TOqa%q#g8%W}Dn+X=lG zRtQRzCDXNzdBt!>>W=k0>bn_iF4IWM1uqWVOdCG5@7^pfaMou=nGm`JR&Cq6$v|Ev z&_I;SRG$xpB&ZdOni#hxIP{Tdo&pXLh|v?ta1qk9d7nw3ru-PZr^#yW2K_}OZO5@WJVg}1NIkXb=kCphH_E52wZVSlDAI4D;MUysVEZ4DqZ5j!ymrR#{mE7POvJRjMEO zcJmnBMImEth@e0!Z7m`i@;*X@@BVs3@;1ow5o}eAf9t#{$=9H&_nTn>!WlSwV_NSY)Z5m}OVekA_ zs4FBAs(w?e5psjO3E;AbmXOg8cZm5kS-MB{!G~9bfoFhPkX$|OkW4p4X^SBZ zI)=P{EL*c~>D0toWEut0-vpir-sc zUc5ZiF9xU`{h@5nK^~2_qgLBGz|(fj)mXe;7qMI2rem)L8#(m3vYQX?tlCC!HQYZ& z9OO}^9>6G_bF)saKXTW9^B&%8>F^b9y>VtQgMgJ4r)V?`mM}3&<6s{6sLVGV@Npcj zz*XC?Ufdf4{dhLB*^x)06^*-9A~p1ILx4W`79?RYTt{QzW4=fKF#)cH z-|tq4sVk-qNm7d=I}YRk0DyCF<6$u*#voLW0~j6VM>c--xYw=$#tAw0Rrv=kGhODc z3TC5{vkFbuz?L%k2p)b2{C$5pVL@4<0Y*NKE1bEHJVsfa<@R>E$nQA&NlD62x7^pJ zi@GD`RoF~Wjwj$&;Lb|^N<>~AYTMcJ1!_YtZ>DoJCYOu}dt*v@ENw?o5(BxHlY@eX zbl7T8Kn9p|B7TsqLGKho4qd`G{;j#q4c}k>4cv@=%#B0rf$Jnu$QwYRDwdRK$#17A z{dW&tdDO8CPMm}>BDyOu-jpmkq;D{DkX<^$9U8(x`+^4B(UBn*R4mFwiW4d^BW^JB{-g;Wh zMKnr0Zw5C@e-|tEU^h&g6f1$msdx7t42}xHQu(@v-;g1IaaiJ(Fhb8%Oh;^h^Qi~P z`ESzd&)AJZTKO7B2PmtgN(I{aZ@{Lmm#X4#Q+5xWDnV)6>LM1xr=zfuE>pxK8ey zZ|Sjb5uLR-bC^8dmCUO#ED-7Vohww=CZav!4T~(lub0EmjLh_INKK2muA`H#`pW>? zr{6duiXkI8fyqZ$THz!Pm)4^*+!!wZ4a%rcUF{MC5nI;pW1*hb+Hjyc9c-+CrXUHn z*IYE*mni-mroiFh?$bMBXy<5^(428kB4S70pf$9H?~OvVVe5QvGfSn2Rx}>~DDw)N z?XvoIv#7 zwcBqx$=ruMQ+BzdygduYh``N1(Lr_uHnf=;9q`6pM6;=>6YcBiedOKG9)qC_&DvaU z4sP#TL%`{lO=3fNYDIQoNIO;F-r$dI1b8n+CMEuca5FWRo>t6B)80MqWby#aTeJ-3 zFD|%02L;j~>fopUL^ufG60bPfYvY6+eX|Rtff&x*8Li6fN!f}P`sfdxjdp+l0VFm7 zRv;+yosc4#!e#zI1HTgf{m3xbz%d2(PzWV;K2OM`F{DY&86#j`M%aE1@H!TQzf^sQ=pnJ9ZVW#jpleg?lQguAP z?I7$+<7}wh=ZB@T`S13;yVCVLtcv~CoeipdA~qYavk`d&z*!iwmh|CNUzhujy`3=E zC3F0Zy$Z?NGRkPDQZFM5Aa)8<-WZPfh|EagY_4sG-N0k+Ad_r(Dz2b&X{rO!BKiav0HE^db{zhyhidQhY1~{<0 zPa*2Tn^~>NSl8*`>{UTtsWTFL7ec$I&L^kQ&LKTIw*#n}(nP|ZA!XMlB#^|%B_=T;GFLiDd_845`S=0UFqMk#yIuUE39M4Xiv-oQ z>UWiX(^Y=R<6JirnqOo3ohH_-5Q0g4CKaOt#zk!U7(L@U=7QoVzESwp*`yKJi;Lzk zJK4$ET?oQ@gxPS>E-J~)JCzSDru3c2Ai}4%3Mfr)=D|wT&OlZM@-o}%bO0t$fV;a~s=vL&}*VjT%?r1OdJNNAYRVcT3 z#O|4tW*K9n-{O@um1+eUq(dz{!sbfop~Q0EMTdpa=SD+J!@+)k(Xr5t`%a`EW3oO zqpws9z(dqSKqg((x9q{c88Pz z0Iu0}IS8gnHh~Ol%zEUx=TJP!+)2yuKm=~0w@Hcas;}uoy2SO%<Tt z_@u)XS9}1+?0kcAdDU~#HQPBjaTI zuHRIXcBBS5XhVuyEFu^PQpp$~cj^jEvp@g=iwT-~s=@Ubk(ioHX@Vvpk9rlZ*?t>} zn8rZMKPjY}KLZ^KSFS$IC5CI=-%@p@S^jIWPt!cB-Z0gn1<?rlr8qxST zJ`Q6jjC{tei$dL(%z%ci(77OjRLK@oAZ_&uRm@%uZZoz_jtcp5od*ZW6hm{t!bF5s5;Mr$*2{wEdaS1fVGvGXtJQlUwl(T> zKA?Kte1%sKQ7&S9tKnV<4j&b@js?5V{$^j)*E_xdNn7hs;xH-82mADzlfi$7(D#UL z*&o1eSteUt=t^_oE*i6;e3eb-DtsOj&Qs@Q;&eEpC<|R0e<4?c)&u_lFaQ7m00642 BMD+jw From 661f93a1bc955fc5d89bc4f7dcc7d355cfdbb625 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 26 Aug 2024 14:47:23 +0530 Subject: [PATCH 0659/1179] [mob][photos] Fix safeArea issues on file viewer --- .../lib/ui/viewer/file/file_bottom_bar.dart | 76 ++++++++++--------- .../ui/viewer/file/video_widget_native.dart | 2 + 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/mobile/lib/ui/viewer/file/file_bottom_bar.dart b/mobile/lib/ui/viewer/file/file_bottom_bar.dart index 78d1836e9b..c233a8a79a 100644 --- a/mobile/lib/ui/viewer/file/file_bottom_bar.dart +++ b/mobile/lib/ui/viewer/file/file_bottom_bar.dart @@ -74,7 +74,7 @@ class FileBottomBarState extends State { } } - return SafeArea(child: _getBottomBar()); + return _getBottomBar(); } void safeRefresh() { @@ -204,42 +204,46 @@ class FileBottomBarState extends State { stops: const [0, 0.8, 1], ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - widget.file.caption?.isNotEmpty ?? false - ? Padding( - padding: const EdgeInsets.fromLTRB( - 16, - 12, - 16, - 0, - ), - child: GestureDetector( - onTap: () async { - await _displayDetails(widget.file); - await Future.delayed( - const Duration(milliseconds: 500), - ); //Waiting for some time till the caption gets updated in db if the user closes the bottom sheet without pressing 'done' - safeRefresh(); - }, - child: Text( - widget.file.caption!, - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: getEnteTextTheme(context) - .mini - .copyWith(color: textBaseDark), - textAlign: TextAlign.center, + child: SafeArea( + left: false, + right: false, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + widget.file.caption?.isNotEmpty ?? false + ? Padding( + padding: const EdgeInsets.fromLTRB( + 16, + 12, + 16, + 0, ), - ), - ) - : const SizedBox.shrink(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: children, - ), - ], + child: GestureDetector( + onTap: () async { + await _displayDetails(widget.file); + await Future.delayed( + const Duration(milliseconds: 500), + ); //Waiting for some time till the caption gets updated in db if the user closes the bottom sheet without pressing 'done' + safeRefresh(); + }, + child: Text( + widget.file.caption!, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: getEnteTextTheme(context) + .mini + .copyWith(color: textBaseDark), + textAlign: TextAlign.center, + ), + ), + ) + : const SizedBox.shrink(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: children, + ), + ], + ), ), ), ), diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 17e48d4dc8..46bcee41ba 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -233,6 +233,8 @@ class _VideoWidgetNativeState extends State right: 0, left: 0, child: SafeArea( + left: false, + right: false, child: Padding( padding: EdgeInsets.only( bottom: widget.isFromMemories ? 32 : 0, From 9de3bdcd03bb73590a5491859754df523a0ace89 Mon Sep 17 00:00:00 2001 From: Z13B Date: Mon, 26 Aug 2024 12:11:34 +0400 Subject: [PATCH 0660/1179] [auth] Added Bethesda Softworks icon --- auth/assets/custom-icons/_data/custom-icons.json | 5 +++++ auth/assets/custom-icons/icons/bethesda.svg | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 auth/assets/custom-icons/icons/bethesda.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index a8db324b5b..e484fc48dd 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -716,6 +716,11 @@ "Binance US" ], "slug": "binance_us" + }, + { + "title": "Bethesda Softworks", + "altNames": ["Bethesda"], + "slug": "bethesda" } ] } diff --git a/auth/assets/custom-icons/icons/bethesda.svg b/auth/assets/custom-icons/icons/bethesda.svg new file mode 100644 index 0000000000..dab2b90310 --- /dev/null +++ b/auth/assets/custom-icons/icons/bethesda.svg @@ -0,0 +1,3 @@ + + + From 9c503437b60b07f0f47b21af8660a650edf7e515 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 26 Aug 2024 15:07:35 +0530 Subject: [PATCH 0661/1179] [mob][photos] Fix UI regression --- mobile/lib/ui/viewer/file/file_bottom_bar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/ui/viewer/file/file_bottom_bar.dart b/mobile/lib/ui/viewer/file/file_bottom_bar.dart index c233a8a79a..91539b13e5 100644 --- a/mobile/lib/ui/viewer/file/file_bottom_bar.dart +++ b/mobile/lib/ui/viewer/file/file_bottom_bar.dart @@ -205,6 +205,7 @@ class FileBottomBarState extends State { ), ), child: SafeArea( + top: false, left: false, right: false, child: Column( From 572bca145aa7b37e451c0b6f319204aa13463591 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 26 Aug 2024 15:10:29 +0530 Subject: [PATCH 0662/1179] [mob][photos] Remove unnecessary safearea from top of video player controls --- mobile/lib/ui/viewer/file/video_widget_native.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 46bcee41ba..58e3367122 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -233,6 +233,7 @@ class _VideoWidgetNativeState extends State right: 0, left: 0, child: SafeArea( + top: false, left: false, right: false, child: Padding( From dec57863bd909b7b490cda5756f4053af825c99d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:17:08 +0530 Subject: [PATCH 0663/1179] [server] Fixed typo --- server/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/go.mod b/server/go.mod index ec7439a8f8..ad40901322 100644 --- a/server/go.mod +++ b/server/go.mod @@ -33,7 +33,7 @@ require ( github.com/spf13/viper v1.8.1 github.com/stretchr/testify v1.9.0 github.com/stripe/stripe-go/v72 v72.37.0 - github.com/TwiN'go-away v1.6.13 + github.com/TwiN/go-away v1.6.13 github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f github.com/ulule/limiter/v3 v3.8.0 github.com/zsais/go-gin-prometheus v0.1.0 From aa696e845733458af663f73327bb07ccdcdf8828 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 15:23:15 +0530 Subject: [PATCH 0664/1179] ente -> Ente --- docs/docs/auth/faq/index.md | 4 ++-- docs/docs/auth/migration-guides/export.md | 2 +- docs/docs/photos/features/cast/index.md | 2 +- docs/docs/photos/features/collect.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs/auth/faq/index.md b/docs/docs/auth/faq/index.md index a62e1e9ebb..6651ffeda9 100644 --- a/docs/docs/auth/faq/index.md +++ b/docs/docs/auth/faq/index.md @@ -39,9 +39,9 @@ Usually this discrepancy occurs because the time in your browser might be incorrect. In particular, multiple users who have reported that Firefox provides incorrect time when various privacy settings are enabled. -### Does ente Authenticator require an account? +### Does Ente Authenticator require an account? -Answer: No, ente Authenticator does not require an account. You can choose to +Answer: No, Ente Authenticator does not require an account. You can choose to use the app without backups if you prefer. ### Can I use the Ente 2FA app on multiple devices and sync them? diff --git a/docs/docs/auth/migration-guides/export.md b/docs/docs/auth/migration-guides/export.md index a66bea7b6b..bf55995435 100644 --- a/docs/docs/auth/migration-guides/export.md +++ b/docs/docs/auth/migration-guides/export.md @@ -65,7 +65,7 @@ using user provided password & kdf params. For encryption, we are using - **Ente Authenticator app**: You can directly import the codes in the Ente Authenticator app. - > Settings -> Data -> Import Codes -> ente Encrypted export. + > Settings -> Data -> Import Codes -> Ente Encrypted export. - **Decrypt using Ente CLI** : Download the latest version of [Ente CLI](https://github.com/ente-io/ente/releases?q=tag%3Acli-v0), and run diff --git a/docs/docs/photos/features/cast/index.md b/docs/docs/photos/features/cast/index.md index f93b07cfa3..8a19090bc7 100644 --- a/docs/docs/photos/features/cast/index.md +++ b/docs/docs/photos/features/cast/index.md @@ -11,7 +11,7 @@ Chromecast TVs or any other internet-connected large screen devices. ## Get Started -1. Open ente on the web or on your mobile device. +1. Open Ente on the web or on your mobile device. 2. Select the album you want to play on your large screen device. 3. Click "Play album on TV" in the album menu. diff --git a/docs/docs/photos/features/collect.md b/docs/docs/photos/features/collect.md index 7f08d8ce62..a7174347da 100644 --- a/docs/docs/photos/features/collect.md +++ b/docs/docs/photos/features/collect.md @@ -10,9 +10,9 @@ Collecting memories from events is now a breeze! - Whether it's a birthday party, vacation trip or wedding, easily share your album using a unique, secure, end-to-end encrypted link. - Introduce the 'collect photos' feature to your friends and family who can - contribute without an ente account. + contribute without an Ente account. - This allows them to effortlessly add, view, and download photos from the - link without an ente account. + link without an Ente account. - Also preserves metadata and photo quality. ## How to collect photos on mobile? From b18f7fbfad04b7bb74ce49bcf47e908ab38ebc2e Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 15:40:54 +0530 Subject: [PATCH 0665/1179] Remove extra space before comma --- web/packages/base/locales/en-US/translation.json | 6 +++--- web/packages/base/locales/fr-FR/translation.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index d19119ff1a..3adb4f3673 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -168,8 +168,8 @@ "storage_quota_exceeded": "Storage limit exceeded", "SUBSCRIPTION_PURCHASE_SUCCESS": "

We've received your payment

Your subscription is valid till {{date, date}}

", "SUBSCRIPTION_PURCHASE_CANCELLED": "Your purchase was canceled, please try again if you want to subscribe", - "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed , please try again", - "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed , please try again", + "SUBSCRIPTION_PURCHASE_FAILED": "Subscription purchase failed, please try again", + "SUBSCRIPTION_UPDATE_FAILED": "Subscription updated failed, please try again", "UPDATE_PAYMENT_METHOD_MESSAGE": "We are sorry, payment failed when we tried to charge your card, please update your payment method and try again", "STRIPE_AUTHENTICATION_FAILED": "We are unable to authenticate your payment method. please choose a different payment method and try again", "UPDATE_PAYMENT_METHOD": "Update payment method", @@ -207,7 +207,7 @@ "SHARING_BAD_REQUEST_ERROR": "Sharing album not allowed", "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Sharing is disabled for free accounts", "DOWNLOAD_COLLECTION": "Download album", - "CREATE_ALBUM_FAILED": "Failed to create album , please try again", + "CREATE_ALBUM_FAILED": "Failed to create album, please try again", "SEARCH": "Search", "SEARCH_RESULTS": "Search results", "NO_RESULTS": "No results found", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 5f498d9204..b315c99929 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -207,7 +207,7 @@ "SHARING_BAD_REQUEST_ERROR": "Partage d'album non autorisé", "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "Le partage est désactivé pour les comptes gratuits", "DOWNLOAD_COLLECTION": "Télécharger l'album", - "CREATE_ALBUM_FAILED": "Échec de création de l'album , veuillez réessayer", + "CREATE_ALBUM_FAILED": "Échec de création de l'album, veuillez réessayer", "SEARCH": "Recherche", "SEARCH_RESULTS": "Résultats de la recherche", "NO_RESULTS": "Aucun résultat trouvé", From 87567ad8ee83a88eec5c80bf77f39b7a7a885e89 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 26 Aug 2024 10:19:59 +0000 Subject: [PATCH 0666/1179] New Crowdin translations by GitHub Action --- web/packages/base/locales/pl-PL/translation.json | 2 +- web/packages/base/locales/ru-RU/translation.json | 6 +++--- web/packages/base/locales/zh-CN/translation.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 40e8502988..2bf6775c9a 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -503,7 +503,7 @@ "language": "Język", "advanced": "Zaawansowane", "EXPORT_DIRECTORY_DOES_NOT_EXIST": "Nieprawidłowy katalog eksportu", - "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Wybrany katalog eksportu nie istnieje.

Prosimy wybrać prawidłowy katalog.

", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "

Wybrany katalog eksportu nie istnieje.

Proszę wybrać prawidłowy katalog.

", "SUBSCRIPTION_VERIFICATION_ERROR": "Weryfikacja subskrypcji nie powiodła się", "storage_unit": { "b": "B", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index e53cc97a3f..f15cc4a8f0 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -232,7 +232,7 @@ "PEOPLE": "Люди", "indexing_scheduled": "Индексация запланирована...", "indexing_photos": "Индексирование фотографий ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Получение индексов ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Индексирование людей на {{nSyncedFiles, number}} фотографиях...", "indexing_done": "Проиндексировано {{nSyncedFiles, number}} фотографий", "UNIDENTIFIED_FACES": "Нераспознанные лица", @@ -328,7 +328,7 @@ "REMOVE": "Удалять", "YES_REMOVE": "Да, удалить", "REMOVE_FROM_COLLECTION": "Удалить из альбома", - "TRASH": "Мусор", + "TRASH": "Корзина", "MOVE_TO_TRASH": "Переместить в корзину", "TRASH_FILES_MESSAGE": "Выбранные файлы будут удалены из всех альбомов и перемещены в корзину.", "TRASH_FILE_MESSAGE": "Файл будет удален из всех альбомов и помещен в корзину.", @@ -507,7 +507,7 @@ "SUBSCRIPTION_VERIFICATION_ERROR": "Не удалось подтвердить подписку", "storage_unit": { "b": "B", - "kb": "БЗ", + "kb": "кб", "mb": "Мегабайт", "gb": "Гб", "tb": "Терабайт" diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 540b829e1f..6064de6295 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -98,7 +98,7 @@ "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "还是", + "OR": "或者", "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", "SESSION_EXPIRED": "会话已过期", From 0af37e8cbe60bb872cc28dd76f9521f540c59858 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:45:12 +0530 Subject: [PATCH 0667/1179] [mob] Generated strings --- mobile/lib/generated/intl/messages_de.dart | 188 ++++++++++++-------- mobile/lib/generated/intl/messages_en.dart | 138 +++++++-------- mobile/lib/generated/intl/messages_es.dart | 134 +++++++-------- mobile/lib/generated/intl/messages_fr.dart | 134 +++++++-------- mobile/lib/generated/intl/messages_it.dart | 130 +++++++------- mobile/lib/generated/intl/messages_nl.dart | 134 +++++++-------- mobile/lib/generated/intl/messages_pl.dart | 191 ++++++++++++--------- mobile/lib/generated/intl/messages_pt.dart | 188 +++++++++++--------- mobile/lib/generated/intl/messages_ru.dart | 136 +++++++-------- mobile/lib/generated/intl/messages_tr.dart | 132 +++++++------- mobile/lib/generated/intl/messages_zh.dart | 132 +++++++------- 11 files changed, 871 insertions(+), 766 deletions(-) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 5ab7d07eee..e005292385 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -129,92 +129,95 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Nicht ${name}?"; - static String m38(passwordStrengthValue) => + static String m38(familyAdminEmail) => + "Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern."; + + static String m39(passwordStrengthValue) => "Passwortstärke: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; - static String m40(endDate) => + static String m41(endDate) => "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; - static String m41(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; + static String m42(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; - static String m42(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; + static String m43(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; - static String m43(storeName) => "Bewerte uns auf ${storeName}"; + static String m44(storeName) => "Bewerte uns auf ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Ihr beide erhaltet ${storageInGB} GB* kostenlos"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt"; - static String m46(endDate) => "Erneuert am ${endDate}"; + static String m47(endDate) => "Erneuert am ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}"; - static String m48(count) => "${count} ausgewählt"; + static String m49(count) => "${count} ausgewählt"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} ausgewählt (${yourCount} von Ihnen)"; - static String m50(verificationID) => + static String m51(verificationID) => "Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Ente Weiterempfehlungs-Code: ${referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um ${referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Teile mit bestimmten Personen', one: 'Teilen mit 1 Person', other: 'Teilen mit ${numberOfPeople} Personen')}"; - static String m54(emailIDs) => "Geteilt mit ${emailIDs}"; - - static String m55(fileType) => - "Dieses ${fileType} wird von deinem Gerät gelöscht."; + static String m55(emailIDs) => "Geteilt mit ${emailIDs}"; static String m56(fileType) => + "Dieses ${fileType} wird von deinem Gerät gelöscht."; + + static String m57(fileType) => "Diese Datei ist sowohl in Ente als auch auf deinem Gerät."; - static String m57(fileType) => "Diese Datei wird von Ente gelöscht."; + static String m58(fileType) => "Diese Datei wird von Ente gelöscht."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} von ${totalAmount} ${totalStorageUnit} verwendet"; - static String m60(id) => + static String m61(id) => "Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support"; - static String m61(endDate) => "Dein Abo endet am ${endDate}"; + static String m62(endDate) => "Dein Abo endet am ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} Erinnerungsstücke gesichert"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Diese erhalten auch ${storageAmountInGB} GB"; - static String m64(email) => "Dies ist ${email}s Verifizierungs-ID"; + static String m65(email) => "Dies ist ${email}s Verifizierungs-ID"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 Tag', other: '${count} Tage')}"; - static String m66(endDate) => "Gültig bis ${endDate}"; + static String m67(endDate) => "Gültig bis ${endDate}"; - static String m67(email) => "Verifiziere ${email}"; + static String m68(email) => "Verifiziere ${email}"; - static String m68(email) => + static String m69(email) => "Wir haben eine E-Mail an ${email} gesendet"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: 'vor einem Jahr', other: 'vor ${count} Jahren')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Du hast ${storageSaved} erfolgreich freigegeben!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -313,7 +316,7 @@ class MessageLookup extends MessageLookupByLibrary { "Authentifizierung erforderlich"), "appLock": MessageLookupByLibrary.simpleMessage("App-Sperre"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Anwenden"), @@ -361,7 +364,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Bitte authentifizieren, um die Löschung des Kontos einzuleiten"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), + "Bitte authentifizieren, um deinen Passkey zu sehen"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Bitte authentifizieren, um die aktiven Sitzungen anzusehen"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -430,6 +433,7 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "Besuche cast.ente.io auf dem Gerät, das du verbinden möchtest.\n\nGib den unten angegebenen Code ein, um das Album auf deinem Fernseher abzuspielen."), "centerPoint": MessageLookupByLibrary.simpleMessage("Mittelpunkt"), + "change": MessageLookupByLibrary.simpleMessage("Ändern"), "changeEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse ändern"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( @@ -440,6 +444,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Passwort ändern"), "changePermissions": MessageLookupByLibrary.simpleMessage("Berechtigungen ändern?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Empfehlungscode ändern"), "checkForUpdates": MessageLookupByLibrary.simpleMessage( "Nach Aktualisierungen suchen"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( @@ -447,6 +453,20 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Status überprüfen"), "checking": MessageLookupByLibrary.simpleMessage("Wird geprüft..."), + "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( + "Wähle Fotos aus und schau dir die \"Gastansicht\" an."), + "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( + "Du gibst dein Telefon aus der Hand, um Freunden Fotos zu zeigen? Keine Sorge, sie werden nicht zu weit blättern können. Die Gastansicht wird sie auf die von dir ausgewählten Fotos beschränken."), + "cl_guest_view_title": + MessageLookupByLibrary.simpleMessage("Gastansicht"), + "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( + "Wir haben Unterstützung für die Ansicht von Panoramafotos mit 360-Grad-Ansichten hinzugefügt. Dieses Erlebnis fesselt mit bewegungsbasierter Navigation!"), + "cl_panorama_viewer_title": + MessageLookupByLibrary.simpleMessage("Panoramabetrachter"), + "cl_video_player_description": MessageLookupByLibrary.simpleMessage( + "Einführung eines neuen Video-Players mit besserer Wiedergabesteuerung und Unterstützung für HDR-Videos."), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Video-Player"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"), "claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"), @@ -470,6 +490,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Fortschritt beim Clustering"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Code eingelöst"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Entschuldigung, du hast das Limit der Code-Änderungen erreicht."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Code in Zwischenablage kopiert"), "codeUsedByYou": @@ -682,9 +704,13 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Leeren"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Papierkorb leeren?"), + "enable": MessageLookupByLibrary.simpleMessage("Aktivieren"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente unterstützt maschinelles Lernen für Gesichtserkennung, magische Suche und andere erweiterte Suchfunktionen auf dem Gerät"), "enableMaps": MessageLookupByLibrary.simpleMessage("Karten aktivieren"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Dies zeigt Ihre Fotos auf einer Weltkarte.\n\nDiese Karte wird von OpenStreetMap gehostet und die genauen Standorte Ihrer Fotos werden niemals geteilt.\n\nSie können diese Funktion jederzeit in den Einstellungen deaktivieren."), + "enabled": MessageLookupByLibrary.simpleMessage("Aktiviert"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Verschlüssele Sicherung …"), "encryption": MessageLookupByLibrary.simpleMessage("Verschlüsselung"), @@ -987,6 +1013,8 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Maschinelles Lernen"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magische Suche"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "Die magische Suche erlaubt das Durchsuchen von Fotos nach ihrem Inhalt, z.B. \'Blumen\', \'rotes Auto\', \'Ausweisdokumente\'"), "manage": MessageLookupByLibrary.simpleMessage("Verwalten"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage("Gerätespeicher verwalten"), @@ -1004,8 +1032,18 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlConsent": MessageLookupByLibrary.simpleMessage( + "Maschinelles Lernen aktivieren"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Ich verstehe und möchte das maschinelle Lernen aktivieren"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Wenn du das maschinelle Lernen aktivierst, wird Ente Informationen wie etwa Gesichtsgeometrie aus Dateien extrahieren, einschließlich derjenigen, die mit dir geteilt werden.\n\nDies geschieht auf deinem Gerät und alle erzeugten biometrischen Informationen werden Ende-zu-Ende-verschlüsselt."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Bitte klicke hier für weitere Details zu dieser Funktion in unserer Datenschutzerklärung"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage( + "Maschinelles Lernen aktivieren?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Bitte beachte, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind."), + "Bitte beachte, dass das maschinelle Lernen zu einem höheren Daten- und Akkuverbrauch führen wird, bis alle Elemente indiziert sind. Du kannst die Desktop-App für eine schnellere Indizierung verwenden, alle Ergebnisse werden automatisch synchronisiert."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobil, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Mittel"), @@ -1014,6 +1052,7 @@ class MessageLookup extends MessageLookupByLibrary { "Ändere deine Suchanfrage oder suche nach"), "moments": MessageLookupByLibrary.simpleMessage("Momente"), "monthly": MessageLookupByLibrary.simpleMessage("Monatlich"), + "moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"), "moveItem": m35, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Zum Album verschieben"), @@ -1078,6 +1117,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"), "onEnte": MessageLookupByLibrary.simpleMessage( "Auf ente"), + "onlyFamilyAdminCanChangeCode": m38, "oops": MessageLookupByLibrary.simpleMessage("Hoppla"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Hoppla, die Änderungen konnten nicht gespeichert werden"), @@ -1106,7 +1146,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Passwort erfolgreich geändert"), "passwordLock": MessageLookupByLibrary.simpleMessage("Passwort Sperre"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Die Berechnung der Stärke des Passworts basiert auf dessen Länge, den verwendeten Zeichen, und ob es in den 10.000 am häufigsten verwendeten Passwörtern vorkommt"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1117,7 +1157,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"), "pendingSync": @@ -1146,7 +1186,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Album auf dem Fernseher wiedergeben"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore Abo"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1158,14 +1198,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Bitte erteile die nötigen Berechtigungen"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Bitte wähle die zu entfernenden schnellen Links"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1201,7 +1241,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"), "rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"), "rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"), @@ -1237,8 +1277,8 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Gib diesen Code an deine Freunde"), "referralStep2": MessageLookupByLibrary.simpleMessage( - "2. Du schließt ein bezahltes Abo ab"), - "referralStep3": m44, + "2. Sie schließen ein bezahltes Abo ab"), + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Einlösungen sind derzeit pausiert"), @@ -1266,7 +1306,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"), "removePublicLink": @@ -1284,7 +1324,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement erneuern"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "resendEmail": @@ -1300,6 +1340,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album wiederherstellen"), "restoringFiles": MessageLookupByLibrary.simpleMessage( "Dateien werden wiederhergestellt..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Fortsetzbares Hochladen"), "retry": MessageLookupByLibrary.simpleMessage("Erneut versuchen"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Bitte überprüfe und lösche die Elemente, die du für Duplikate hältst."), @@ -1354,7 +1396,7 @@ class MessageLookup extends MessageLookupByLibrary { "Gruppiere Fotos, die innerhalb des Radius eines bestimmten Fotos aufgenommen wurden"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "selectALocation": MessageLookupByLibrary.simpleMessage("Standort auswählen"), @@ -1381,8 +1423,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Absenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"), "sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"), @@ -1410,16 +1452,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Teile mit ausgewählten Personen"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Mit Nicht-Ente-Benutzern teilen"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Teile dein erstes Album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1430,7 +1472,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Neue geteilte Fotos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Erhalte Benachrichtigungen, wenn jemand ein Foto zu einem gemeinsam genutzten Album hinzufügt, dem du angehörst"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Mit mir geteilt"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Mit dir geteilt"), @@ -1445,11 +1487,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Andere Geräte abmelden"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ich stimme den Nutzungsbedingungen und der Datenschutzerklärung zu"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Es wird aus allen Alben gelöscht."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Überspringen"), "social": MessageLookupByLibrary.simpleMessage("Social Media"), "someItemsAreInBothEnteAndYourDevice": @@ -1495,13 +1537,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Speicherplatz"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Familie"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Sie"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Speichergrenze überschritten"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Stark"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Abonnieren"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Sieht aus, als sei dein Abonnement abgelaufen. Bitte abonniere, um das Teilen zu aktivieren."), @@ -1518,7 +1560,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronisiere …"), @@ -1549,7 +1591,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Diese Elemente werden von deinem Gerät gelöscht."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Sie werden aus allen Alben gelöscht."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1565,7 +1607,7 @@ class MessageLookup extends MessageLookupByLibrary { "Diese E-Mail-Adresse wird bereits verwendet"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Dieses Bild hat keine Exif-Daten"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dies ist deine Verifizierungs-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1578,7 +1620,7 @@ class MessageLookup extends MessageLookupByLibrary { "Hiermit werden die öffentlichen Links aller ausgewählten schnellen Links entfernt."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( - "Um die App-Sperre zu aktivieren, konfigurieren Sie bitte den Gerätepasscode oder die Bildschirmsperre in Ihren Systemeinstellungen."), + "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage("Foto oder Video verstecken"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( @@ -1590,7 +1632,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("Gesamt"), "totalSize": MessageLookupByLibrary.simpleMessage("Gesamtgröße"), "trash": MessageLookupByLibrary.simpleMessage("Papierkorb"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Schneiden"), "tryAgain": MessageLookupByLibrary.simpleMessage("Erneut versuchen"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1614,6 +1656,8 @@ class MessageLookup extends MessageLookupByLibrary { "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album dearchivieren"), "unarchiving": MessageLookupByLibrary.simpleMessage("Dearchiviere …"), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Entschuldigung, dieser Code ist nicht verfügbar."), "uncategorized": MessageLookupByLibrary.simpleMessage("Unkategorisiert"), "unhide": MessageLookupByLibrary.simpleMessage("Einblenden"), @@ -1647,7 +1691,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ausgewähltes Foto verwenden"), "usedSpace": MessageLookupByLibrary.simpleMessage("Belegter Speicherplatz"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut"), @@ -1656,7 +1700,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse verifizieren"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Passkey verifizieren"), @@ -1694,13 +1738,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Wir unterstützen keine Bearbeitung von Fotos und Alben, die du noch nicht besitzt"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Schwach"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Willkommen zurück!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Neue Funktionen"), "yearly": MessageLookupByLibrary.simpleMessage("Jährlich"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, kündigen"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1730,7 +1774,7 @@ class MessageLookup extends MessageLookupByLibrary { "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Du hast keine archivierten Elemente."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Dein Benutzerkonto wurde gelöscht"), "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 9db6d2d291..1559ecc898 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -127,95 +127,95 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Not ${name}?"; - static String m71(familyAdminEmail) => + static String m38(familyAdminEmail) => "Please contact ${familyAdminEmail} to change your code."; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Please talk to ${providerName} support if you were charged"; - static String m40(endDate) => + static String m41(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m41(toEmail) => "Please email us at ${toEmail}"; + static String m42(toEmail) => "Please email us at ${toEmail}"; - static String m42(toEmail) => "Please send the logs to \n${toEmail}"; + static String m43(toEmail) => "Please send the logs to \n${toEmail}"; - static String m43(storeName) => "Rate us on ${storeName}"; + static String m44(storeName) => "Rate us on ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album"; - static String m46(endDate) => "Subscription renews on ${endDate}"; + static String m47(endDate) => "Subscription renews on ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} result found', other: '${count} results found')}"; - static String m48(count) => "${count} selected"; + static String m49(count) => "${count} selected"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} selected (${yourCount} yours)"; - static String m50(verificationID) => + static String m51(verificationID) => "Here\'s my verification ID: ${verificationID} for ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Share with specific people', one: 'Shared with 1 person', other: 'Shared with ${numberOfPeople} people')}"; - static String m54(emailIDs) => "Shared with ${emailIDs}"; - - static String m55(fileType) => - "This ${fileType} will be deleted from your device."; + static String m55(emailIDs) => "Shared with ${emailIDs}"; static String m56(fileType) => + "This ${fileType} will be deleted from your device."; + + static String m57(fileType) => "This ${fileType} is in both Ente and your device."; - static String m57(fileType) => "This ${fileType} will be deleted from Ente."; + static String m58(fileType) => "This ${fileType} will be deleted from Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} of ${totalAmount} ${totalStorageUnit} used"; - static String m60(id) => + static String m61(id) => "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m61(endDate) => + static String m62(endDate) => "Your subscription will be cancelled on ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} memories preserved"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "They also get ${storageAmountInGB} GB"; - static String m64(email) => "This is ${email}\'s Verification ID"; + static String m65(email) => "This is ${email}\'s Verification ID"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 day', other: '${count} days')}"; - static String m66(endDate) => "Valid till ${endDate}"; + static String m67(endDate) => "Valid till ${endDate}"; - static String m67(email) => "Verify ${email}"; + static String m68(email) => "Verify ${email}"; - static String m68(email) => "We have sent a mail to ${email}"; + static String m69(email) => "We have sent a mail to ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} year ago', other: '${count} years ago')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "You have successfully freed up ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -1072,7 +1072,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), - "onlyFamilyAdminCanChangeCode": m71, + "onlyFamilyAdminCanChangeCode": m38, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("Oops, could not save edits"), @@ -1100,7 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Password changed successfully"), "passwordLock": MessageLookupByLibrary.simpleMessage("Password lock"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1110,7 +1110,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Payment failed"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Unfortunately your payment failed. Please contact support and we\'ll help you out!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Pending items"), "pendingSync": MessageLookupByLibrary.simpleMessage("Pending sync"), "people": MessageLookupByLibrary.simpleMessage("People"), @@ -1136,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("Pin album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Play album on TV"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore subscription"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1148,14 +1148,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Please contact support if the problem persists"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Please grant permissions"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Please login again"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Please try again"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1190,7 +1190,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Raise ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Rate the app"), "rateUs": MessageLookupByLibrary.simpleMessage("Rate us"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Recover"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), @@ -1224,7 +1224,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Give this code to your friends"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. They sign up for a paid plan"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), @@ -1250,7 +1250,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remove link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remove participant"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1268,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rename file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renew subscription"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Report a bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Report bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Resend email"), @@ -1336,7 +1336,7 @@ class MessageLookup extends MessageLookupByLibrary { "Group photos that are taken within some radius of a photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invite people, and you\'ll see all photos shared by them here"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Security"), "selectALocation": MessageLookupByLibrary.simpleMessage("Select a location"), @@ -1363,8 +1363,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Selected items will be deleted from all albums and moved to trash."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Send"), "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), @@ -1391,16 +1391,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Share an album now"), "shareLink": MessageLookupByLibrary.simpleMessage("Share link"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Share only with the people you want"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Share your first album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1411,7 +1411,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("New shared photos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Receive notifications when someone adds a photo to a shared album that you\'re a part of"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Shared with me"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Shared with you"), @@ -1425,11 +1425,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sign out other devices"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "I agree to the terms of service and privacy policy"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "It will be deleted from all albums."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Skip"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1471,13 +1471,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Storage"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Family"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("You"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Storage limit exceeded"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Strong"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Subscribe"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Looks like your subscription has expired. Please subscribe to enable sharing."), @@ -1494,7 +1494,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggest features"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Sync stopped"), "syncing": MessageLookupByLibrary.simpleMessage("Syncing..."), "systemTheme": MessageLookupByLibrary.simpleMessage("System"), @@ -1521,7 +1521,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "These items will be deleted from your device."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "They will be deleted from all albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1537,7 +1537,7 @@ class MessageLookup extends MessageLookupByLibrary { "This email is already in use"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("This image has no exif data"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "This is your Verification ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1561,7 +1561,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Total size"), "trash": MessageLookupByLibrary.simpleMessage("Trash"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Trim"), "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1617,7 +1617,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Use selected photo"), "usedSpace": MessageLookupByLibrary.simpleMessage("Used space"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verification failed, please try again"), @@ -1625,7 +1625,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verification ID"), "verify": MessageLookupByLibrary.simpleMessage("Verify"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verify email"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verify"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verify passkey"), "verifyPassword": @@ -1660,12 +1660,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "We don\'t support editing photos and albums that you don\'t own yet"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Weak"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Welcome back!"), "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), "yearly": MessageLookupByLibrary.simpleMessage("Yearly"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Yes"), "yesCancel": MessageLookupByLibrary.simpleMessage("Yes, cancel"), "yesConvertToViewer": @@ -1695,7 +1695,7 @@ class MessageLookup extends MessageLookupByLibrary { "You cannot share with yourself"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "You don\'t have any archived items."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Your account has been deleted"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 8aca561096..f057cefd5f 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -129,93 +129,93 @@ class MessageLookup extends MessageLookupByLibrary { static String m36(albumName) => "Movido exitosamente a ${albumName}"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Seguridad de la contraseña : ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Por favor, habla con el soporte de ${providerName} si se te cobró"; - static String m40(endDate) => + static String m41(endDate) => "Prueba gratuita válida hasta ${endDate}.\nPuedes elegir un plan de pago después."; - static String m41(toEmail) => + static String m42(toEmail) => "Por favor, envíanos un correo electrónico a ${toEmail}"; - static String m42(toEmail) => "Por favor, envía los registros a ${toEmail}"; + static String m43(toEmail) => "Por favor, envía los registros a ${toEmail}"; - static String m43(storeName) => "Califícanos en ${storeName}"; + static String m44(storeName) => "Califícanos en ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Ambos obtienen ${storageInGB} GB* gratis"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} será eliminado de este álbum compartido\n\nCualquier foto añadida por ellos también será eliminada del álbum"; - static String m46(endDate) => "La suscripción se renueva el ${endDate}"; + static String m47(endDate) => "La suscripción se renueva el ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultados encontrados')}"; - static String m48(count) => "${count} seleccionados"; + static String m49(count) => "${count} seleccionados"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} seleccionados (${yourCount} tuyos)"; - static String m50(verificationID) => + static String m51(verificationID) => "Aquí está mi ID de verificación: ${verificationID} para ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hola, ¿puedes confirmar que esta es tu ID de verificación ente.io: ${verificationID}?"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Código de referido de Ente: ${referralCode} \n\nAñádelo en Ajustes → General → Referidos para obtener ${referralStorageInGB} GB gratis tras comprar un plan de pago.\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Compartir con personas específicas', one: 'Compartido con 1 persona', other: 'Compartido con ${numberOfPeople} personas')}"; - static String m54(emailIDs) => "Compartido con ${emailIDs}"; - - static String m55(fileType) => - "Este ${fileType} se eliminará de tu dispositivo."; + static String m55(emailIDs) => "Compartido con ${emailIDs}"; static String m56(fileType) => + "Este ${fileType} se eliminará de tu dispositivo."; + + static String m57(fileType) => "Este ${fileType} está tanto en Ente como en tu dispositivo."; - static String m57(fileType) => "Este ${fileType} será eliminado de Ente."; + static String m58(fileType) => "Este ${fileType} será eliminado de Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usados"; - static String m60(id) => + static String m61(id) => "Tu ${id} ya está vinculada a otra cuenta de Ente.\nSi deseas utilizar tu ${id} con esta cuenta, ponte en contacto con nuestro servicio de asistencia\'\'"; - static String m61(endDate) => "Tu suscripción se cancelará el ${endDate}"; + static String m62(endDate) => "Tu suscripción se cancelará el ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} recuerdos conservados"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "También obtienen ${storageAmountInGB} GB"; - static String m64(email) => "Este es el ID de verificación de ${email}"; + static String m65(email) => "Este es el ID de verificación de ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 día', other: '${count} días')}"; - static String m66(endDate) => "Válido hasta ${endDate}"; + static String m67(endDate) => "Válido hasta ${endDate}"; - static String m67(email) => "Verificar ${email}"; + static String m68(email) => "Verificar ${email}"; - static String m68(email) => + static String m69(email) => "Hemos enviado un correo a ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} año atrás', other: '${count} años atrás')}"; - static String m70(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; + static String m71(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -1124,7 +1124,7 @@ class MessageLookup extends MessageLookupByLibrary { "Contraseña cambiada correctamente"), "passwordLock": MessageLookupByLibrary.simpleMessage("Bloqueo por contraseña"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1134,7 +1134,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Pago fallido"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Lamentablemente tu pago falló. Por favor, ¡contacta con el soporte técnico y te ayudaremos!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementos pendientes"), "pendingSync": @@ -1163,7 +1163,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproducir álbum en TV"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Suscripción en la PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1175,14 +1175,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contacta a soporte técnico si el problema persiste"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Por favor, concede permiso"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, vuelve a iniciar sesión"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inténtalo nuevamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1219,7 +1219,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Evalúa la aplicación"), "rateUs": MessageLookupByLibrary.simpleMessage("Califícanos"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar cuenta"), @@ -1254,7 +1254,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Dale este código a tus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Se inscriben a un plan pagado"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Referidos"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Las referencias están actualmente en pausa"), @@ -1281,7 +1281,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Eliminar enlace"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Quitar participante"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Eliminar etiqueta de persona"), "removePublicLink": @@ -1299,7 +1299,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renombrar archivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar suscripción"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar un error"), "reportBug": MessageLookupByLibrary.simpleMessage("Reportar error"), "resendEmail": @@ -1370,7 +1370,7 @@ class MessageLookup extends MessageLookupByLibrary { "Agrupar las fotos que se tomaron cerca de la localización de una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita a gente y verás todas las fotos compartidas aquí"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleccionar una ubicación"), @@ -1399,8 +1399,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar correo electrónico"), @@ -1431,16 +1431,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartir un álbum ahora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartir enlace"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Comparte sólo con la gente que quieres"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Descarga Ente para que podamos compartir fácilmente fotos y videos en calidad original.\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartir con usuarios fuera de Ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Comparte tu primer álbum"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1452,7 +1452,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuevas fotos compartidas"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recibir notificaciones cuando alguien agrega una foto a un álbum compartido contigo"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Compartido conmigo"), "sharedWithYou": @@ -1468,11 +1468,11 @@ class MessageLookup extends MessageLookupByLibrary { "Cerrar la sesión de otros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Estoy de acuerdo con los términos del servicio y la política de privacidad"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Se borrará de todos los álbumes."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Omitir"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1517,13 +1517,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Almacenamiento"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Familia"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Usted"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Límite de datos excedido"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Segura"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Suscribirse"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Parece que tu suscripción ha caducado. Por favor, suscríbete para habilitar el compartir."), @@ -1540,7 +1540,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir una característica"), "support": MessageLookupByLibrary.simpleMessage("Soporte"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronización detenida"), "syncing": MessageLookupByLibrary.simpleMessage("Sincronizando..."), @@ -1569,7 +1569,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Estos elementos se eliminarán de tu dispositivo."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Se borrarán de todos los álbumes."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1585,7 +1585,7 @@ class MessageLookup extends MessageLookupByLibrary { "Este correo electrónico ya está en uso"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Esta imagen no tiene datos exif"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Esta es tu ID de verificación"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1609,7 +1609,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamaño total"), "trash": MessageLookupByLibrary.simpleMessage("Papelera"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Recortar"), "tryAgain": MessageLookupByLibrary.simpleMessage("Inténtalo de nuevo"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1664,7 +1664,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usar foto seleccionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espacio usado"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificación fallida, por favor inténtalo de nuevo"), @@ -1673,7 +1673,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Verificar correo electrónico"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar clave de acceso"), @@ -1710,13 +1710,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "No admitimos la edición de fotos y álbumes que aún no son tuyos"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Poco segura"), "welcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Qué hay de nuevo"), "yearly": MessageLookupByLibrary.simpleMessage("Anualmente"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Sí"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sí, cancelar"), "yesConvertToViewer": @@ -1746,7 +1746,7 @@ class MessageLookup extends MessageLookupByLibrary { "No puedes compartir contigo mismo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "No tienes ningún elemento archivado."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Tu cuenta ha sido eliminada"), "yourMap": MessageLookupByLibrary.simpleMessage("Tu mapa"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 1416686d47..4b70fe3fc5 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -120,92 +120,92 @@ class MessageLookup extends MessageLookupByLibrary { static String m36(albumName) => "Déplacé avec succès vers ${albumName}"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Veuillez contacter le support ${providerName} si vous avez été facturé"; - static String m40(endDate) => + static String m41(endDate) => "Essai gratuit valable jusqu\'à ${endDate}.\nVous pouvez choisir un plan payant par la suite."; - static String m41(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; + static String m42(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; - static String m42(toEmail) => "Envoyez les logs à ${toEmail}"; + static String m43(toEmail) => "Envoyez les logs à ${toEmail}"; - static String m43(storeName) => "Notez-nous sur ${storeName}"; + static String m44(storeName) => "Notez-nous sur ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Vous recevez tous les deux ${storageInGB} GB* gratuits"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l\'album"; - static String m46(endDate) => "Renouvellement le ${endDate}"; + static String m47(endDate) => "Renouvellement le ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} résultat trouvé', other: '${count} résultats trouvés')}"; - static String m48(count) => "${count} sélectionné(s)"; + static String m49(count) => "${count} sélectionné(s)"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} sélectionné(s) (${yourCount} à vous)"; - static String m50(verificationID) => + static String m51(verificationID) => "Voici mon ID de vérification : ${verificationID} pour ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hé, pouvez-vous confirmer qu\'il s\'agit de votre ID de vérification ente.io : ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "code de parrainage ente : ${referralCode} \n\nAppliquez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Partagez avec des personnes spécifiques', one: 'Partagé avec 1 personne', other: 'Partagé avec ${numberOfPeople} des gens')}"; - static String m54(emailIDs) => "Partagé avec ${emailIDs}"; - - static String m55(fileType) => - "Elle ${fileType} sera supprimée de votre appareil."; + static String m55(emailIDs) => "Partagé avec ${emailIDs}"; static String m56(fileType) => + "Elle ${fileType} sera supprimée de votre appareil."; + + static String m57(fileType) => "Cette ${fileType} est à la fois sur ente et sur votre appareil."; - static String m57(fileType) => "Ce ${fileType} sera supprimé de ente."; + static String m58(fileType) => "Ce ${fileType} sera supprimé de ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} Go"; + static String m59(storageAmountInGB) => "${storageAmountInGB} Go"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} sur ${totalAmount} ${totalStorageUnit} utilisé"; - static String m60(id) => + static String m61(id) => "Votre ${id} est déjà lié à un autre compte ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; - static String m61(endDate) => "Votre abonnement sera annulé le ${endDate}"; + static String m62(endDate) => "Votre abonnement sera annulé le ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} souvenirs préservés"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Ils obtiennent aussi ${storageAmountInGB} Go"; - static String m64(email) => "Ceci est l\'ID de vérification de ${email}"; + static String m65(email) => "Ceci est l\'ID de vérification de ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '0 jour', one: '1 jour', other: '${count} jours')}"; - static String m66(endDate) => "Valable jusqu\'au ${endDate}"; + static String m67(endDate) => "Valable jusqu\'au ${endDate}"; - static String m67(email) => "Vérifier ${email}"; + static String m68(email) => "Vérifier ${email}"; - static String m68(email) => + static String m69(email) => "Nous avons envoyé un e-mail à ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: 'il y a ${count} an', other: 'il y a ${count} ans')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Vous avez libéré ${storageSaved} avec succès !"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -1034,7 +1034,7 @@ class MessageLookup extends MessageLookupByLibrary { "Le mot de passe a été modifié"), "passwordLock": MessageLookupByLibrary.simpleMessage("Mot de passe verrou"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1043,7 +1043,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Détails de paiement"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Échec du paiement"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingSync": MessageLookupByLibrary.simpleMessage("Synchronisation en attente"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( @@ -1067,7 +1067,7 @@ class MessageLookup extends MessageLookupByLibrary { "Sélectionner le point central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Épingler l\'album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abonnement au PlayStore"), "pleaseContactSupportAndWeWillBeHappyToHelp": @@ -1076,14 +1076,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Merci de contacter l\'assistance si cette erreur persiste"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Veuillez accorder la permission"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Veuillez vous reconnecter"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Veuillez réessayer"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1119,7 +1119,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Évaluer l\'application"), "rateUs": MessageLookupByLibrary.simpleMessage("Évaluez-nous"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Récupérer"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Récupérer un compte"), @@ -1153,7 +1153,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Donnez ce code à vos amis"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ils s\'inscrivent à une offre payante"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Parrainages"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Les recommandations sont actuellement en pause"), @@ -1179,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Supprimer le participant"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1199,7 +1199,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Renommer le fichier"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renouveler l’abonnement"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "resendEmail": @@ -1265,7 +1265,7 @@ class MessageLookup extends MessageLookupByLibrary { "Grouper les photos qui sont prises dans un certain angle d\'une photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invitez des gens, et vous verrez ici toutes les photos qu\'ils partagent"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "selectALocation": MessageLookupByLibrary.simpleMessage("Select a location"), @@ -1294,8 +1294,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Envoyer"), "sendEmail": MessageLookupByLibrary.simpleMessage("Envoyer un e-mail"), "sendInvite": @@ -1324,16 +1324,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage( "Partagez un album maintenant"), "shareLink": MessageLookupByLibrary.simpleMessage("Partager le lien"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Partager uniquement avec les personnes que vous voulez"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Téléchargez ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Partager avec des utilisateurs non-ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Partagez votre premier album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1344,7 +1344,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nouvelles photos partagées"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recevoir des notifications quand quelqu\'un ajoute une photo à un album partagé dont vous faites partie"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Partagés avec moi"), "sharedWithYou": @@ -1354,11 +1354,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Montrer les souvenirs"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "J\'accepte les conditions d\'utilisation et la politique de confidentialité"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Elle sera supprimée de tous les albums."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Ignorer"), "social": MessageLookupByLibrary.simpleMessage("Réseaux Sociaux"), "someItemsAreInBothEnteAndYourDevice": @@ -1398,14 +1398,14 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Stockage"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Famille"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Vous"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Limite de stockage atteinte"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Securité forte"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("S\'abonner"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Il semble que votre abonnement ait expiré. Veuillez vous abonner pour activer le partage."), @@ -1422,7 +1422,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage( "Suggérer des fonctionnalités"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisation arrêtée ?"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1452,7 +1452,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Ces éléments seront supprimés de votre appareil."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ils seront supprimés de tous les albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1468,7 +1468,7 @@ class MessageLookup extends MessageLookupByLibrary { "Cette adresse mail est déjà utilisé"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Cette image n\'a pas de données exif"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ceci est votre ID de vérification"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1492,7 +1492,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Activez la sauvegarde pour télécharger automatiquement les fichiers ajoutés à ce dossier de l\'appareil sur ente."), @@ -1550,7 +1550,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( "Utiliser la photo sélectionnée"), "usedSpace": MessageLookupByLibrary.simpleMessage("Mémoire utilisée"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "La vérification a échouée, veuillez réessayer"), @@ -1559,7 +1559,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Vérifier le mot de passe"), @@ -1588,11 +1588,11 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Nous ne prenons pas en charge l\'édition des photos et des albums que vous ne possédez pas encore"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Securité Faible"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bienvenue !"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Oui"), "yesCancel": MessageLookupByLibrary.simpleMessage("Oui, annuler"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1623,7 +1623,7 @@ class MessageLookup extends MessageLookupByLibrary { "Vous ne pouvez pas partager avec vous-même"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Vous n\'avez aucun élément archivé."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Votre compte a été supprimé"), "yourMap": MessageLookupByLibrary.simpleMessage("Votre carte"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 914c7315c6..e66ac02bc7 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -118,89 +118,89 @@ class MessageLookup extends MessageLookupByLibrary { static String m36(albumName) => "Spostato con successo su ${albumName}"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; - static String m40(endDate) => + static String m41(endDate) => "Prova gratuita valida fino al ${endDate}.\nPuoi scegliere un piano a pagamento in seguito."; - static String m41(toEmail) => "Per favore invia un\'email a ${toEmail}"; + static String m42(toEmail) => "Per favore invia un\'email a ${toEmail}"; - static String m42(toEmail) => "Invia i log a \n${toEmail}"; + static String m43(toEmail) => "Invia i log a \n${toEmail}"; - static String m43(storeName) => "Valutaci su ${storeName}"; + static String m44(storeName) => "Valutaci su ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Ottenete entrambi ${storageInGB} GB* gratis"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall\'utente verrà rimossa dall\'album"; - static String m46(endDate) => "Si rinnova il ${endDate}"; + static String m47(endDate) => "Si rinnova il ${endDate}"; - static String m48(count) => "${count} selezionati"; + static String m49(count) => "${count} selezionati"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} selezionato (${yourCount} tuoi)"; - static String m50(verificationID) => + static String m51(verificationID) => "Ecco il mio ID di verifica: ${verificationID} per ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "ente referral code: ${referralCode} \n\nApplicalo in Impostazioni → Generale → Referral per ottenere ${referralStorageInGB} GB gratis dopo la registrazione di un piano a pagamento\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; - static String m54(emailIDs) => "Condiviso con ${emailIDs}"; - - static String m55(fileType) => - "Questo ${fileType} verrà eliminato dal tuo dispositivo."; + static String m55(emailIDs) => "Condiviso con ${emailIDs}"; static String m56(fileType) => + "Questo ${fileType} verrà eliminato dal tuo dispositivo."; + + static String m57(fileType) => "Questo ${fileType} è sia su ente che sul tuo dispositivo."; - static String m57(fileType) => "Questo ${fileType} verrà eliminato su ente."; + static String m58(fileType) => "Questo ${fileType} verrà eliminato su ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; - static String m60(id) => + static String m61(id) => "Il tuo ${id} è già collegato ad un altro account ente.\nSe desideri utilizzare il tuo ${id} con questo account, contatta il nostro supporto\'\'"; - static String m61(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; + static String m62(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} ricordi conservati"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Anche loro riceveranno ${storageAmountInGB} GB"; - static String m64(email) => "Questo è l\'ID di verifica di ${email}"; + static String m65(email) => "Questo è l\'ID di verifica di ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 giorno', other: '${count} giorni')}"; - static String m66(endDate) => "Valido fino al ${endDate}"; + static String m67(endDate) => "Valido fino al ${endDate}"; - static String m67(email) => "Verifica ${email}"; + static String m68(email) => "Verifica ${email}"; - static String m68(email) => + static String m69(email) => "Abbiamo inviato una mail a ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} anno fa', other: '${count} anni fa')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Hai liberato con successo ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -1001,7 +1001,7 @@ class MessageLookup extends MessageLookupByLibrary { "Password modificata con successo"), "passwordLock": MessageLookupByLibrary.simpleMessage("Blocco con password"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1010,7 +1010,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dettagli di Pagamento"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingSync": MessageLookupByLibrary.simpleMessage("Sincronizzazione in sospeso"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( @@ -1031,7 +1031,7 @@ class MessageLookup extends MessageLookupByLibrary { "Selezionare il punto centrale"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fissa l\'album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), "pleaseContactSupportAndWeWillBeHappyToHelp": @@ -1040,14 +1040,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Riprova. Se il problema persiste, ti invitiamo a contattare l\'assistenza"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( @@ -1081,7 +1081,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Invia ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Valuta l\'app"), "rateUs": MessageLookupByLibrary.simpleMessage("Lascia una recensione"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Recupera"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recupera account"), @@ -1116,7 +1116,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Condividi questo codice con i tuoi amici"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Si iscrivono per un piano a pagamento"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Invita un Amico"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "I referral code sono attualmente in pausa"), @@ -1140,7 +1140,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1158,7 +1158,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rinomina file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Rinnova abbonamento"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Rinvia email"), @@ -1224,8 +1224,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Invia"), "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), @@ -1252,16 +1252,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Condividi un album"), "shareLink": MessageLookupByLibrary.simpleMessage("Condividi link"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Scarica ente in modo da poter facilmente condividere foto e video senza perdita di qualità\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Condividi con utenti che non hanno un account ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1272,7 +1272,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuove foto condivise"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ricevi notifiche quando qualcuno aggiunge una foto a un album condiviso, di cui fai parte"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Condivisi con me"), "sharedWithYou": @@ -1282,11 +1282,11 @@ class MessageLookup extends MessageLookupByLibrary { "showMemories": MessageLookupByLibrary.simpleMessage("Mostra ricordi"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Accetto i termini di servizio e la politica sulla privacy"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1327,13 +1327,13 @@ class MessageLookup extends MessageLookupByLibrary { "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Famiglia"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Tu"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Limite d\'archiviazione superato"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Sembra che il tuo abbonamento sia scaduto. Iscriviti per abilitare la condivisione."), @@ -1350,7 +1350,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggerisci una funzionalità"), "support": MessageLookupByLibrary.simpleMessage("Assistenza"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronizzazione interrotta"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1380,7 +1380,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Questi file verranno eliminati dal tuo dispositivo."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Verranno eliminati da tutti gli album."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1397,7 +1397,7 @@ class MessageLookup extends MessageLookupByLibrary { "Questo indirizzo email è già registrato"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Questa immagine non ha dati EXIF"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Questo è il tuo ID di verifica"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1421,7 +1421,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("totale"), "totalSize": MessageLookupByLibrary.simpleMessage("Dimensioni totali"), "trash": MessageLookupByLibrary.simpleMessage("Cestino"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "tryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Attiva il backup per caricare automaticamente i file aggiunti in questa cartella del dispositivo su ente."), @@ -1478,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usa la foto selezionata"), "usedSpace": MessageLookupByLibrary.simpleMessage("Spazio utilizzato"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifica fallita, per favore prova di nuovo"), @@ -1486,7 +1486,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID di verifica"), "verify": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Verifica password"), @@ -1513,11 +1513,11 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Non puoi modificare foto e album che non possiedi"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Debole"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bentornato/a!"), "yearly": MessageLookupByLibrary.simpleMessage("Annuale"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Si"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sì, cancella"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1547,7 +1547,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non puoi condividere con te stesso"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Non hai nulla di archiviato."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 9ea99ef92c..58088301a8 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -129,94 +129,94 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Niet ${name}?"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Wachtwoord sterkte: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Praat met ${providerName} klantenservice als u in rekening bent gebracht"; - static String m40(endDate) => + static String m41(endDate) => "Gratis proefperiode geldig tot ${endDate}.\nU kunt naderhand een betaald abonnement kiezen."; - static String m41(toEmail) => "Stuur ons een e-mail op ${toEmail}"; + static String m42(toEmail) => "Stuur ons een e-mail op ${toEmail}"; - static String m42(toEmail) => + static String m43(toEmail) => "Verstuur de logboeken alstublieft naar ${toEmail}"; - static String m43(storeName) => "Beoordeel ons op ${storeName}"; + static String m44(storeName) => "Beoordeel ons op ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "Jullie krijgen allebei ${storageInGB} GB* gratis"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} zal worden verwijderd uit dit gedeelde album\n\nAlle door hen toegevoegde foto\'s worden ook uit het album verwijderd"; - static String m46(endDate) => "Wordt verlengd op ${endDate}"; + static String m47(endDate) => "Wordt verlengd op ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} resultaat gevonden', other: '${count} resultaten gevonden')}"; - static String m48(count) => "${count} geselecteerd"; + static String m49(count) => "${count} geselecteerd"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} geselecteerd (${yourCount} van jou)"; - static String m50(verificationID) => + static String m51(verificationID) => "Hier is mijn verificatie-ID: ${verificationID} voor ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hey, kunt u bevestigen dat dit uw ente.io verificatie-ID is: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Ente verwijzingscode: ${referralCode} \n\nPas het toe bij Instellingen → Algemeen → Verwijzingen om ${referralStorageInGB} GB gratis te krijgen nadat je je hebt aangemeld voor een betaald abonnement\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Deel met specifieke mensen', one: 'Gedeeld met 1 persoon', other: 'Gedeeld met ${numberOfPeople} mensen')}"; - static String m54(emailIDs) => "Gedeeld met ${emailIDs}"; - - static String m55(fileType) => - "Deze ${fileType} zal worden verwijderd van jouw apparaat."; + static String m55(emailIDs) => "Gedeeld met ${emailIDs}"; static String m56(fileType) => - "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + "Deze ${fileType} zal worden verwijderd van jouw apparaat."; static String m57(fileType) => + "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + + static String m58(fileType) => "Deze ${fileType} zal worden verwijderd uit Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} van ${totalAmount} ${totalStorageUnit} gebruikt"; - static String m60(id) => + static String m61(id) => "Jouw ${id} is al aan een ander Ente account gekoppeld.\nAls je jouw ${id} wilt gebruiken met dit account, neem dan contact op met onze klantenservice"; - static String m61(endDate) => "Uw abonnement loopt af op ${endDate}"; + static String m62(endDate) => "Uw abonnement loopt af op ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} herinneringen bewaard"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Zij krijgen ook ${storageAmountInGB} GB"; - static String m64(email) => "Dit is de verificatie-ID van ${email}"; + static String m65(email) => "Dit is de verificatie-ID van ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagen')}"; - static String m66(endDate) => "Geldig tot ${endDate}"; + static String m67(endDate) => "Geldig tot ${endDate}"; - static String m67(email) => "Verifieer ${email}"; + static String m68(email) => "Verifieer ${email}"; - static String m68(email) => + static String m69(email) => "We hebben een e-mail gestuurd naar ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} jaar geleden', other: '${count} jaar geleden')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Je hebt ${storageSaved} succesvol vrijgemaakt!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -1120,7 +1120,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Wachtwoord succesvol aangepast"), "passwordLock": MessageLookupByLibrary.simpleMessage("Wachtwoord slot"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "De wachtwoordsterkte wordt berekend aan de hand van de lengte van het wachtwoord, de gebruikte tekens en of het wachtwoord al dan niet in de top 10.000 van meest gebruikte wachtwoorden staat"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1131,7 +1131,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Betaling mislukt"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Helaas is je betaling mislukt. Neem contact op met support zodat we je kunnen helpen!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Bestanden in behandeling"), "pendingSync": MessageLookupByLibrary.simpleMessage( @@ -1161,7 +1161,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN vergrendeling"), "playOnTv": MessageLookupByLibrary.simpleMessage("Album afspelen op TV"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore abonnement"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1173,14 +1173,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Neem contact op met klantenservice als het probleem aanhoudt"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Geef alstublieft toestemming"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Log opnieuw in"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Probeer het nog eens"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1215,7 +1215,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Meld probleem"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Beoordeel de app"), "rateUs": MessageLookupByLibrary.simpleMessage("Beoordeel ons"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Herstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Account herstellen"), @@ -1250,7 +1250,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Geef deze code aan je vrienden"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ze registreren voor een betaald plan"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Referenties"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Verwijzingen zijn momenteel gepauzeerd"), @@ -1278,7 +1278,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Verwijder link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Deelnemer verwijderen"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Verwijder persoonslabel"), "removePublicLink": @@ -1298,7 +1298,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bestandsnaam wijzigen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement verlengen"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Een fout melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fout melden"), "resendEmail": @@ -1367,7 +1367,7 @@ class MessageLookup extends MessageLookupByLibrary { "Foto\'s groeperen die in een bepaalde straal van een foto worden genomen"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecteer een locatie"), @@ -1394,8 +1394,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Verzenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-mail versturen"), "sendInvite": @@ -1425,16 +1425,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Deel nu een album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link delen"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Deel alleen met de mensen die u wilt"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente zodat we gemakkelijk foto\'s en video\'s in originele kwaliteit kunnen delen\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Delen met niet-Ente gebruikers"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Deel jouw eerste album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1445,7 +1445,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nieuwe gedeelde foto\'s"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ontvang meldingen wanneer iemand een foto toevoegt aan een gedeeld album waar je deel van uitmaakt"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Gedeeld met mij"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Gedeeld met jou"), @@ -1460,11 +1460,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Log uit op andere apparaten"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Het wordt uit alle albums verwijderd."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Overslaan"), "social": MessageLookupByLibrary.simpleMessage("Sociale media"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( @@ -1506,13 +1506,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Opslagruimte"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Familie"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Jij"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Opslaglimiet overschreden"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Sterk"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Abonneer"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat je abonnement is verlopen. Abonneer om delen mogelijk te maken."), @@ -1529,7 +1529,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Features voorstellen"), "support": MessageLookupByLibrary.simpleMessage("Ondersteuning"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisatie gestopt"), "syncing": MessageLookupByLibrary.simpleMessage("Synchroniseren..."), @@ -1559,7 +1559,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Deze bestanden zullen worden verwijderd van uw apparaat."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ze zullen uit alle albums worden verwijderd."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1575,7 +1575,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dit e-mailadres is al in gebruik"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Deze foto heeft geen exif gegevens"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Dit is uw verificatie-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1600,7 +1600,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("totaal"), "totalSize": MessageLookupByLibrary.simpleMessage("Totale grootte"), "trash": MessageLookupByLibrary.simpleMessage("Prullenbak"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Knippen"), "tryAgain": MessageLookupByLibrary.simpleMessage("Probeer opnieuw"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1658,7 +1658,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gebruik geselecteerde foto"), "usedSpace": MessageLookupByLibrary.simpleMessage("Gebruikte ruimte"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificatie mislukt, probeer het opnieuw"), @@ -1666,7 +1666,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie ID"), "verify": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bevestig e-mail"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Bevestig passkey"), @@ -1704,12 +1704,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "We ondersteunen het bewerken van foto\'s en albums waar je niet de eigenaar van bent nog niet"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Zwak"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Welkom terug!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Nieuw"), "yearly": MessageLookupByLibrary.simpleMessage("Jaarlijks"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, opzeggen"), "yesConvertToViewer": @@ -1739,7 +1739,7 @@ class MessageLookup extends MessageLookupByLibrary { "Je kunt niet met jezelf delen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "U heeft geen gearchiveerde bestanden."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Je account is verwijderd"), "yourMap": MessageLookupByLibrary.simpleMessage("Jouw kaart"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 0da7816b14..5d80b3aaa2 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -61,7 +61,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m12(albumName) => "Utworzono link współpracy dla ${albumName}"; static String m13(familyAdminEmail) => - "Proszę skontaktuj się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; + "Prosimy skontaktować się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; static String m14(provider) => "Skontaktuj się z nami pod adresem support@ente.io, aby zarządzać subskrypcją ${provider}."; @@ -128,94 +128,97 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Nie ${name}?"; - static String m38(passwordStrengthValue) => + static String m38(familyAdminEmail) => + "Skontaktuj się z ${familyAdminEmail}, aby zmienić swój kod."; + + static String m39(passwordStrengthValue) => "Siła hasła: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; - static String m40(endDate) => + static String m41(endDate) => "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; - static String m41(toEmail) => + static String m42(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; - static String m42(toEmail) => "Prosimy wysłać logi do ${toEmail}"; + static String m43(toEmail) => "Prosimy wysłać logi do ${toEmail}"; - static String m43(storeName) => "Oceń nas na ${storeName}"; + static String m44(storeName) => "Oceń nas na ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Oboje otrzymujecie ${storageInGB} GB* za darmo"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu"; - static String m46(endDate) => "Subskrypcja odnowi się ${endDate}"; + static String m47(endDate) => "Subskrypcja odnowi się ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: 'Znaleziono ${count} wynik', few: 'Znaleziono ${count} wyniki', other: 'Znaleziono ${count} wyników')}"; - static String m48(count) => "Wybrano ${count}"; + static String m49(count) => "Wybrano ${count}"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "Wybrano ${count} (twoich ${yourCount})"; - static String m50(verificationID) => + static String m51(verificationID) => "Oto mój identyfikator weryfikacyjny: ${verificationID} dla ente.io."; - static String m51(verificationID) => + static String m52(verificationID) => "Hej, czy możesz potwierdzić, że to jest Twój identyfikator weryfikacyjny ente.io: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Kod polecający: ${referralCode} \n\nZastosuj go w: Ustawienia → Ogólne → Polecanie, aby otrzymać ${referralStorageInGB} GB za darmo po zarejestrowaniu się w płatnym planie\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Udostępnione określonym osobom', one: 'Udostępnione 1 osobie', other: 'Udostępnione ${numberOfPeople} osobom')}"; - static String m54(emailIDs) => "Udostępnione z ${emailIDs}"; - - static String m55(fileType) => - "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; + static String m55(emailIDs) => "Udostępnione z ${emailIDs}"; static String m56(fileType) => + "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; + + static String m57(fileType) => "Ten ${fileType} jest zarówno w Ente, jak i na twoim urządzeniu."; - static String m57(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; + static String m58(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "Użyto ${usedAmount} ${usedStorageUnit} z ${totalAmount} ${totalStorageUnit}"; - static String m60(id) => + static String m61(id) => "Twoje ${id} jest już połączony z innym kontem Ente.\nJeśli chcesz użyć swojego ${id} za pomocą tego konta, skontaktuj się z naszym wsparciem technicznym"; - static String m61(endDate) => + static String m62(endDate) => "Twoja subskrypcja zostanie anulowana dnia ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "Zachowano ${completed}/${total} wspomnień"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Oni również otrzymują ${storageAmountInGB} GB"; - static String m64(email) => "To jest identyfikator weryfikacyjny ${email}"; + static String m65(email) => "To jest identyfikator weryfikacyjny ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '${count} dzień', few: '${count} dni', other: '${count} dni')}"; - static String m66(endDate) => "Ważne do ${endDate}"; + static String m67(endDate) => "Ważne do ${endDate}"; - static String m67(email) => "Zweryfikuj ${email}"; + static String m68(email) => "Zweryfikuj ${email}"; - static String m68(email) => + static String m69(email) => "Wysłaliśmy wiadomość na adres ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m70(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; + static String m71(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -311,7 +314,7 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage( "Blokada dostępu do aplikacji"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Zastosuj"), @@ -358,13 +361,13 @@ class MessageLookup extends MessageLookupByLibrary { "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby zainicjować usuwanie konta"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), + "Prosimy uwierzytelnić się, aby wyświetlić swój klucz dostępu"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby wyświetlić swoje aktywne sesje"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby wyświetlić ukryte pliki"), "authToViewYourMemories": MessageLookupByLibrary.simpleMessage( - "Proszę uwierzytelnić się, aby wyświetlić swoje wspomnienia"), + "Prosimy uwierzytelnić się, aby wyświetlić swoje wspomnienia"), "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Prosimy uwierzytelnić się, aby wyświetlić swój klucz odzyskiwania"), "authenticating": @@ -429,6 +432,7 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "Odwiedź cast.ente.io na urządzeniu, które chcesz sparować.\n\nWprowadź poniższy kod, aby odtworzyć album na telewizorze."), "centerPoint": MessageLookupByLibrary.simpleMessage("Punkt środkowy"), + "change": MessageLookupByLibrary.simpleMessage("Zmień"), "changeEmail": MessageLookupByLibrary.simpleMessage("Zmień adres e-mail"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( @@ -438,6 +442,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zmień hasło"), "changePermissions": MessageLookupByLibrary.simpleMessage("Zmień uprawnienia?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Zmień swój kod polecający"), "checkForUpdates": MessageLookupByLibrary.simpleMessage( "Sprawdź dostępne aktualizacje"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( @@ -445,17 +451,17 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Sprawdź stan"), "checking": MessageLookupByLibrary.simpleMessage("Sprawdzanie..."), "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Wybierz zdjęcia i sprawdź \"Widok Gościa\"."), + "Wybierz zdjęcia i sprawdź \"Widok gościa\"."), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Pokazujesz zdjęcia znajomemu? Nie martw się, że przesunie za daleko. Widok gościa zablokuje wybrane przez Ciebie zdjęcia."), + "Przekazujesz swój telefon, aby pokazać zdjęcia przyjacielowi? Nie martw się, że przesuną się zbyt daleko. Widok gościa zablokuje ich w wybranych przez Ciebie zdjęciach."), "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("Widok Gościa"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Dodaliśmy obsługę zdjęć panoramicznych z widokiem 360 stopni. Doświadczenie jest immersyjne z nawigacją opartą na ruchu!"), + "Dodaliśmy wsparcie dla przeglądania zdjęć panoramy z widokami 360 stopni. Doświadczenie jest imersyjne z nawigacją opartą na ruchu!"), "cl_panorama_viewer_title": MessageLookupByLibrary.simpleMessage("Przeglądarka Panoramy"), "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Przedstawiamy nowy odtwarzacz wideo z lepszymi kontrolkami odtwarzania i wsparciem dla wideo HDR."), + "Wprowadzamy nowy odtwarzacz wideo z lepszym sterowaniem odtwarzania i obsługą wideo HDR."), "cl_video_player_title": MessageLookupByLibrary.simpleMessage("Odtwarzacz Wideo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( @@ -482,6 +488,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Postęp tworzenia klastrów"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Kod został zastosowany"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Przepraszamy, osiągnięto limit zmian kodu."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Kod został skopiowany do schowka"), "codeUsedByYou": @@ -688,9 +696,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wyślij mailem logi"), "empty": MessageLookupByLibrary.simpleMessage("Opróżnij"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Opróżnić kosz?"), + "enable": MessageLookupByLibrary.simpleMessage("Włącz"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente obsługuje uczenie maszynowe na urządzeniu dla rozpoznawania twarzy, wyszukiwania magicznego i innych zaawansowanych funkcji wyszukiwania"), "enableMaps": MessageLookupByLibrary.simpleMessage("Włącz mapy"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "To pokaże Twoje zdjęcia na mapie świata.\n\nTa mapa jest hostowana przez Open Street Map, a dokładne lokalizacje Twoich zdjęć nigdy nie są udostępniane.\n\nMożesz wyłączyć tę funkcję w każdej chwili w ustawieniach."), + "enabled": MessageLookupByLibrary.simpleMessage("Włączone"), "encryptingBackup": MessageLookupByLibrary.simpleMessage( "Szyfrowanie kopii zapasowej..."), "encryption": MessageLookupByLibrary.simpleMessage("Szyfrowanie"), @@ -855,9 +867,9 @@ class MessageLookup extends MessageLookupByLibrary { "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( "Poproś ich o przytrzymanie swojego adresu e-mail na ekranie ustawień i sprawdzenie, czy identyfikatory na obu urządzeniach są zgodne."), "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Proszę włączyć Touch ID lub Face ID na swoim telefonie."), + "Uwierzytelnianie biometryczne nie jest skonfigurowane na Twoim urządzeniu. Prosimy włączyć Touch ID lub Face ID na swoim telefonie."), "iOSLockOut": MessageLookupByLibrary.simpleMessage( - "Uwierzytelnianie biometryczne jest wyłączone. Proszę zablokować i odblokować ekran, aby je włączyć."), + "Uwierzytelnianie biometryczne jest wyłączone. Prosimy zablokować i odblokować ekran, aby je włączyć."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignoruj"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( @@ -994,6 +1006,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Uczenie maszynowe"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magiczne wyszukiwanie"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "Magiczne wyszukiwanie pozwala na wyszukiwanie zdjęć według ich zawartości, np. \"kwiat\", \"czerwony samochód\", \"dokumenty tożsamości\""), "manage": MessageLookupByLibrary.simpleMessage("Zarządzaj"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Zarządzaj pamięcią urządzenia"), @@ -1011,8 +1025,18 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Sklep"), + "mlConsent": + MessageLookupByLibrary.simpleMessage("Włącz uczenie maszynowe"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Rozumiem i chcę włączyć uczenie maszynowe"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Jeśli włączysz uczenie maszynowe, Ente wyodrębni informacje takie jak geometria twarzy z plików, w tym tych udostępnionych z Tobą.\n\nTo się stanie na Twoim urządzeniu i wygenerowane informacje biometryczne zostaną zaszyfrowane end-to-end."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Kliknij tutaj, aby uzyskać więcej informacji na temat tej funkcji w naszej polityce prywatności"), + "mlConsentTitle": + MessageLookupByLibrary.simpleMessage("Włączyć uczenie maszynowe?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Pamiętaj, że uczenie maszynowe spowoduje większe zużycie przepustowości i baterii, dopóki wszystkie elementy zostaną zindeksowane."), + "Pamiętaj, że uczenie maszynowe spowoduje większą przepustowość i zużycie baterii do czasu zindeksowania wszystkich elementów. Rozważ użycie aplikacji komputerowej do szybszego indeksowania, wszystkie wyniki zostaną automatycznie zsynchronizowane."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage( "Aplikacja Mobilna, Strona Internetowa, Aplikacja Komputerowa"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Umiarkowane"), @@ -1021,6 +1045,8 @@ class MessageLookup extends MessageLookupByLibrary { "Zmodyfikuj zapytanie lub spróbuj wyszukać"), "moments": MessageLookupByLibrary.simpleMessage("Momenty"), "monthly": MessageLookupByLibrary.simpleMessage("Miesięcznie"), + "moreDetails": + MessageLookupByLibrary.simpleMessage("Więcej szczegółów"), "moveItem": m35, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do albumu"), @@ -1084,6 +1110,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), "onEnte": MessageLookupByLibrary.simpleMessage("W ente"), + "onlyFamilyAdminCanChangeCode": m38, "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ups, nie udało się zapisać zmian"), @@ -1112,7 +1139,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Hasło zostało pomyślnie zmienione"), "passwordLock": MessageLookupByLibrary.simpleMessage("Blokada hasłem"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Siła hasła jest obliczana, biorąc pod uwagę długość hasła, użyte znaki, i czy hasło pojawi się w 10 000 najczęściej używanych haseł"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1123,7 +1150,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Płatność się nie powiodła"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Oczekujące elementy"), "pendingSync": @@ -1152,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Odtwórz album na telewizorze"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1164,14 +1191,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Prosimy wybrać szybkie linki do usunięcia"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1206,7 +1233,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Zgłoś"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Oceń aplikację"), "rateUs": MessageLookupByLibrary.simpleMessage("Oceń nas"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Odzyskaj"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Odzyskaj konto"), @@ -1218,13 +1245,13 @@ class MessageLookup extends MessageLookupByLibrary { "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( "Jeśli zapomnisz hasła, jedynym sposobem odzyskania danych jest ten klucz."), "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( - "Nie przechowujemy tego klucza, proszę, zapisz ten 24-słowny klucz w bezpiecznym miejscu."), + "Nie przechowujemy tego klucza, prosimy zapisać ten 24-słowny klucz w bezpiecznym miejscu."), "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( "Znakomicie! Klucz odzyskiwania jest prawidłowy. Dziękujemy za weryfikację.\n\nPamiętaj, aby bezpiecznie przechowywać kopię zapasową klucza odzyskiwania."), "recoveryKeyVerified": MessageLookupByLibrary.simpleMessage( "Klucz odzyskiwania zweryfikowany"), "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( - "Twój klucz odzyskiwania to jedyny sposób na odzyskanie zdjęć, jeśli zapomnisz hasła. Klucz odzyskiwania można znaleźć w menu Ustawienia > Bezpieczeństwo.\n\nProszę wprowadzić klucz odzyskiwania tutaj, aby sprawdzić, czy został on poprawnie zapisany."), + "Twój klucz odzyskiwania to jedyny sposób na odzyskanie zdjęć, jeśli zapomnisz hasła. Klucz odzyskiwania można znaleźć w menu Ustawienia > Bezpieczeństwo.\n\nProsimy wprowadzić swój klucz odzyskiwania tutaj, aby sprawdzić, czy został on poprawnie zapisany."), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("Odzyskano pomyślnie!"), "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( @@ -1242,7 +1269,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Przekaż ten kod swoim znajomym"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. Wykupują płatny plan"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Polecenia"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), @@ -1268,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Usuń link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Usuń użytkownika"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Usuń etykietę osoby"), "removePublicLink": @@ -1287,7 +1314,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Zmień nazwę pliku"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Odnów subskrypcję"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "reportBug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "resendEmail": @@ -1303,6 +1330,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Przywróć do albumu"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Przywracanie plików..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Przesyłania wznawialne"), "retry": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Przejrzyj i usuń elementy, które uważasz, że są duplikatami."), @@ -1356,7 +1385,7 @@ class MessageLookup extends MessageLookupByLibrary { "Grupuj zdjęcia zrobione w promieniu zdjęcia"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "selectALocation": MessageLookupByLibrary.simpleMessage("Wybierz lokalizację"), @@ -1382,8 +1411,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Wybrane elementy zostaną usunięte ze wszystkich albumów i przeniesione do kosza."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Wyślij"), "sendEmail": MessageLookupByLibrary.simpleMessage("Wyślij e-mail"), "sendInvite": @@ -1410,16 +1439,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Udostępnij teraz album"), "shareLink": MessageLookupByLibrary.simpleMessage("Udostępnij link"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Udostępnij tylko ludziom, którym chcesz"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Pobierz Ente, abyśmy mogli łatwo udostępniać zdjęcia i wideo w oryginalnej jakości\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Udostępnij użytkownikom bez konta Ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Udostępnij swój pierwszy album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1432,7 +1461,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nowe udostępnione zdjęcia"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Otrzymuj powiadomienia, gdy ktoś doda zdjęcie do udostępnionego albumu, którego jesteś częścią"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Udostępnione ze mną"), "sharedWithYou": @@ -1448,11 +1477,11 @@ class MessageLookup extends MessageLookupByLibrary { "Wyloguj z pozostałych urządzeń"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Akceptuję warunki korzystania z usługi i politykę prywatności"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "To zostanie usunięte ze wszystkich albumów."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Pomiń"), "social": MessageLookupByLibrary.simpleMessage("Społeczność"), "someItemsAreInBothEnteAndYourDevice": @@ -1497,13 +1526,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Pamięć"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Rodzina"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Ty"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Przekroczono limit pamięci"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Silne"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Subskrybuj"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że Twoja subskrypcja wygasła. Subskrybuj, aby włączyć udostępnianie."), @@ -1520,7 +1549,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Zaproponuj funkcje"), "support": MessageLookupByLibrary.simpleMessage("Wsparcie techniczne"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronizacja zatrzymana"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronizowanie..."), @@ -1551,7 +1580,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Te elementy zostaną usunięte z Twojego urządzenia."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Zostaną one usunięte ze wszystkich albumów."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1567,7 +1596,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ten e-mail jest już używany"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Ten obraz nie posiada danych exif"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "To jest Twój Identyfikator Weryfikacji"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1591,7 +1620,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("ogółem"), "totalSize": MessageLookupByLibrary.simpleMessage("Całkowity rozmiar"), "trash": MessageLookupByLibrary.simpleMessage("Kosz"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Przytnij"), "tryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1618,6 +1647,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Przywróć album z archiwum"), "unarchiving": MessageLookupByLibrary.simpleMessage("Usuwanie z archiwum..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Przepraszamy, ten kod jest niedostępny."), "uncategorized": MessageLookupByLibrary.simpleMessage("Bez kategorii"), "unhide": MessageLookupByLibrary.simpleMessage("Odkryj"), "unhideToAlbum": @@ -1649,7 +1680,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Weryfikacja nie powiodła się, spróbuj ponownie"), @@ -1658,7 +1689,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Zweryfikuj adres e-mail"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Zweryfikuj klucz dostępu"), @@ -1695,12 +1726,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Nie wspieramy edycji zdjęć i albumów, których jeszcze nie posiadasz"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Słabe"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Co nowego"), "yearly": MessageLookupByLibrary.simpleMessage("Rocznie"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), "yesConvertToViewer": @@ -1730,7 +1761,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nie możesz udostępnić samemu sobie"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych zarchiwizowanych elementów."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Twoje konto zostało usunięte"), "yourMap": MessageLookupByLibrary.simpleMessage("Twoja mapa"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index dc6578d6b7..af88659609 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -128,92 +128,95 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Não é ${name}?"; - static String m38(passwordStrengthValue) => + static String m38(familyAdminEmail) => + "Entre em contato com ${familyAdminEmail} para alterar o seu código."; + + static String m39(passwordStrengthValue) => "Segurança da senha: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Por favor, fale com o suporte ${providerName} se você foi cobrado"; - static String m40(endDate) => + static String m41(endDate) => "Teste gratuito válido até ${endDate}.\nVocê pode escolher um plano pago depois."; - static String m41(toEmail) => + static String m42(toEmail) => "Por favor, envie-nos um e-mail para ${toEmail}"; - static String m42(toEmail) => "Por favor, envie os logs para \n${toEmail}"; + static String m43(toEmail) => "Por favor, envie os logs para \n${toEmail}"; - static String m43(storeName) => "Avalie-nos em ${storeName}"; + static String m44(storeName) => "Avalie-nos em ${storeName}"; - static String m44(storageInGB) => "3. Ambos ganham ${storageInGB} GB* grátis"; + static String m45(storageInGB) => "3. Ambos ganham ${storageInGB} GB* grátis"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} será removido deste álbum compartilhado\n\nQuaisquer fotos adicionadas por eles também serão removidas do álbum"; - static String m46(endDate) => "Renovação de assinatura em ${endDate}"; + static String m47(endDate) => "Renovação de assinatura em ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultado encontrado')}"; - static String m48(count) => "${count} Selecionados"; + static String m49(count) => "${count} Selecionados"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "${count} Selecionado (${yourCount} seus)"; - static String m50(verificationID) => + static String m51(verificationID) => "Aqui está meu ID de verificação para o Ente.io: ${verificationID}"; - static String m51(verificationID) => + static String m52(verificationID) => "Ei, você pode confirmar que este é seu ID de verificação do Ente.io? ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Código de indicação do Ente: ${referralCode} \n\nAplique em Configurações → Geral → Indicações para obter ${referralStorageInGB} GB gratuitamente após a sua inscrição em um plano pago\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Compartilhe com pessoas específicas', one: 'Compartilhado com 1 pessoa', other: 'Compartilhado com ${numberOfPeople} pessoas')}"; - static String m54(emailIDs) => "Compartilhado com ${emailIDs}"; - - static String m55(fileType) => - "Este(a) ${fileType} será excluído(a) do seu dispositivo."; + static String m55(emailIDs) => "Compartilhado com ${emailIDs}"; static String m56(fileType) => - "Este(a) ${fileType} está tanto no Ente quanto no seu dispositivo."; + "Este(a) ${fileType} será excluído(a) do seu dispositivo."; static String m57(fileType) => + "Este(a) ${fileType} está tanto no Ente quanto no seu dispositivo."; + + static String m58(fileType) => "Este(a) ${fileType} será excluído(a) do Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usado"; - static String m60(id) => + static String m61(id) => "Seu ${id} já está vinculado a outra conta Ente.\nSe você gostaria de usar seu ${id} com esta conta, por favor contate nosso suporte\'\'"; - static String m61(endDate) => "Sua assinatura será cancelada em ${endDate}"; + static String m62(endDate) => "Sua assinatura será cancelada em ${endDate}"; - static String m62(completed, total) => + static String m63(completed, total) => "${completed}/${total} memórias preservadas"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Eles também recebem ${storageAmountInGB} GB"; - static String m64(email) => "Este é o ID de verificação de ${email}"; + static String m65(email) => "Este é o ID de verificação de ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 dia', other: '${count} dias')}"; - static String m66(endDate) => "Válido até ${endDate}"; + static String m67(endDate) => "Válido até ${endDate}"; - static String m67(email) => "Verificar ${email}"; + static String m68(email) => "Verificar ${email}"; - static String m68(email) => "Enviamos um e-mail à ${email}"; + static String m69(email) => "Enviamos um e-mail à ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} anos atrás', other: '${count} anos atrás')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Você liberou ${storageSaved} com sucesso!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -310,7 +313,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Autenticação necessária"), "appLock": MessageLookupByLibrary.simpleMessage("Bloqueio de app"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha."), "appVersion": m7, "appleId": MessageLookupByLibrary.simpleMessage("ID da Apple"), "apply": MessageLookupByLibrary.simpleMessage("Aplicar"), @@ -358,7 +361,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Por favor, autentique-se para iniciar a exclusão de conta"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), + "Por favor, autentique-se para ver sua chave de acesso"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Por favor, autentique-se para ver as sessões ativas"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -427,6 +430,7 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "Visite cast.ente.io no dispositivo que você deseja parear.\n\ndigite o código abaixo para reproduzir o álbum em sua TV."), "centerPoint": MessageLookupByLibrary.simpleMessage("Ponto central"), + "change": MessageLookupByLibrary.simpleMessage("Alterar"), "changeEmail": MessageLookupByLibrary.simpleMessage("Mudar e-mail"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Alterar o local dos itens selecionados?"), @@ -436,6 +440,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Alterar senha"), "changePermissions": MessageLookupByLibrary.simpleMessage("Alterar permissões?"), + "changeYourReferralCode": MessageLookupByLibrary.simpleMessage( + "Alterar o código de indicação"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Verificar por atualizações"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( @@ -443,17 +449,17 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Verificar status"), "checking": MessageLookupByLibrary.simpleMessage("Verificando..."), "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Selecione as fotos e experimente o \"Modo Convidado\"."), + "Selecione fotos e confira \"Visão de convidado\"."), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Vai mostrar fotos a um amigo? Não se preocupe com ele deslizando demais. O modo convidado bloqueará as fotos que você selecionar."), + "Passar o telefone para mostrar fotos para um amigo? Não se preocupe com eles deslizando demais. A visualização de convidado irá bloqueá-los nas fotos que você selecionar."), "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Modo Convidado"), + MessageLookupByLibrary.simpleMessage("Visão de Convidado"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Adicionamos suporte para visualização de fotos panorâmicas com visão de 360 graus. A experiência é imersiva com navegação baseada em movimento!"), + "Adicionamos suporte para visualizar fotos panorama com visualização de 360 graus. A experiência é envolvida com a navegação baseada em movimentos!"), "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visualizador Panorâmico"), + MessageLookupByLibrary.simpleMessage("Visualizador de Panoramas"), "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Apresentando um novo reprodutor de vídeo com controles de reprodução aprimorados e suporte para vídeos HDR."), + "Apresentando um novo reprodutor de vídeo, com melhores controles de reprodução e suporte para vídeos HDR."), "cl_video_player_title": MessageLookupByLibrary.simpleMessage("Reprodutor de Vídeo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( @@ -479,6 +485,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Progresso de agrupamento"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Código aplicado"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Desculpe, você atingiu o limite de alterações de código."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Código copiado para a área de transferência"), "codeUsedByYou": @@ -689,9 +697,13 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Esvaziar"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), + "enable": MessageLookupByLibrary.simpleMessage("Habilitar"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente suporta aprendizado de máquina no dispositivo para reconhecimento facial, busca mágica e outros recursos avançados de busca"), "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar Mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), + "enabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Criptografando backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Criptografia"), @@ -927,7 +939,7 @@ class MessageLookup extends MessageLookupByLibrary { "Link copiado para a área de transferência"), "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Limite do dispositivo"), - "linkEnabled": MessageLookupByLibrary.simpleMessage("Ativado"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expirado"), "linkExpiresOn": m33, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiração do link"), @@ -992,6 +1004,8 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Aprendizagem de máquina"), "magicSearch": MessageLookupByLibrary.simpleMessage("Busca mágica"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "A busca mágica permite pesquisar fotos por seu conteúdo, por exemplo, \'carro\', \'carro vermelho\', \'Ferrari\'"), "manage": MessageLookupByLibrary.simpleMessage("Gerenciar"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Gerenciar o armazenamento do dispositivo"), @@ -1009,8 +1023,18 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m34, "merchandise": MessageLookupByLibrary.simpleMessage("Produtos"), + "mlConsent": MessageLookupByLibrary.simpleMessage( + "Habilitar aprendizado de máquina"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Eu entendo, e desejo habilitar o aprendizado de máquina"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Se você habilitar o reconhecimento facial, o aplicativo extrairá a geometria do rosto de suas fotos, inclusive aquelas compartilhadas com você. \n\nIsso ocorrerá em seu dispositivo, e quaisquer dados biométricos gerados serão criptografados de ponta a ponta."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Por favor, clique aqui para mais detalhes sobre este recurso em nossa política de privacidade"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage( + "Habilitar aprendizado de máquina?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados."), + "Observe que o aprendizado de máquina resultará em uma largura de banda maior e no uso da bateria até que todos os itens sejam indexados. Considere usar o aplicativo para computador para uma indexação mais rápida, todos os resultados serão sincronizados automaticamente."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderada"), @@ -1019,6 +1043,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modifique sua consulta ou tente procurar por"), "moments": MessageLookupByLibrary.simpleMessage("Momentos"), "monthly": MessageLookupByLibrary.simpleMessage("Mensal"), + "moreDetails": MessageLookupByLibrary.simpleMessage("Mais detalhes"), "moveItem": m35, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover para álbum"), "moveToHiddenAlbum": @@ -1081,6 +1106,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("No dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Em ente"), + "onlyFamilyAdminCanChangeCode": m38, "oops": MessageLookupByLibrary.simpleMessage("Opa"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ops, não foi possível salvar edições"), @@ -1110,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Senha alterada com sucesso"), "passwordLock": MessageLookupByLibrary.simpleMessage("Bloqueio por senha"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Força da senha é calculada considerando o comprimento da senha, caracteres usados, e se a senha aparece ou não nas 10.000 senhas mais usadas"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1121,7 +1147,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Falha no pagamento"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Infelizmente o seu pagamento falhou. Entre em contato com o suporte e nós ajudaremos você!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Itens pendentes"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sincronização pendente"), @@ -1149,7 +1175,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Bloqueio PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproduzir álbum na TV"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Assinatura da PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1161,14 +1187,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contate o suporte se o problema persistir"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Por favor, conceda as permissões"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inicie sessão novamente"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Selecione links rápidos para remover"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Por favor, tente novamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1205,7 +1231,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Avalie o aplicativo"), "rateUs": MessageLookupByLibrary.simpleMessage("Avalie-nos"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar conta"), @@ -1240,7 +1266,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Dê este código aos seus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscrevem em um plano pago"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Indicações"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Indicações estão atualmente pausadas"), @@ -1266,7 +1292,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remover link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remover participante"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remover etiqueta da pessoa"), "removePublicLink": @@ -1284,7 +1310,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renomear arquivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar assinatura"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar um problema"), "reportBug": @@ -1301,6 +1327,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Restaurar para álbum"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Restaurando arquivos..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Envios retomáveis"), "retry": MessageLookupByLibrary.simpleMessage("Tentar novamente"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Por favor, reveja e exclua os itens que você acredita serem duplicados."), @@ -1356,7 +1384,7 @@ class MessageLookup extends MessageLookupByLibrary { "Fotos de grupo que estão sendo tiradas em algum raio da foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Convide pessoas e você verá todas as fotos compartilhadas por elas aqui"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Segurança"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecionar um local"), @@ -1384,8 +1412,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Os itens selecionados serão excluídos de todos os álbuns e movidos para a lixeira."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar e-mail"), "sendInvite": MessageLookupByLibrary.simpleMessage("Enviar convite"), @@ -1414,16 +1442,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartilhar um álbum agora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartilhar link"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Compartilhar apenas com as pessoas que você quiser"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartilhar com usuários não-Ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Compartilhar seu primeiro álbum"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1436,7 +1464,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Novas fotos compartilhadas"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Receber notificações quando alguém adicionar uma foto em um álbum compartilhado que você faz parte"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Compartilhado comigo"), "sharedWithYou": @@ -1452,11 +1480,11 @@ class MessageLookup extends MessageLookupByLibrary { "Encerrar sessão em outros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Eu concordo com os termos de serviço e a política de privacidade"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( - "Ele será excluído de todos os álbuns."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "Ele(a) será excluído(a) de todos os álbuns."), + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Pular"), "social": MessageLookupByLibrary.simpleMessage("Redes sociais"), "someItemsAreInBothEnteAndYourDevice": @@ -1501,13 +1529,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Armazenamento"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Família"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Você"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Limite de armazenamento excedido"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Assinar"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Parece que sua assinatura expirou. Por favor inscreva-se para ativar o compartilhamento."), @@ -1524,7 +1552,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir recurso"), "support": MessageLookupByLibrary.simpleMessage("Suporte"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronização interrompida"), "syncing": MessageLookupByLibrary.simpleMessage("Sincronizando..."), @@ -1553,7 +1581,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Estes itens serão excluídos do seu dispositivo."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Eles serão excluídos de todos os álbuns."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1569,7 +1597,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Este e-mail já está em uso"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Esta imagem não tem dados exif"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Este é o seu ID de verificação"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1582,7 +1610,7 @@ class MessageLookup extends MessageLookupByLibrary { "Isto removerá links públicos de todos os links rápidos selecionados."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( - "Para ativar o bloqueio de app, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo."), + "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Para ocultar uma foto ou vídeo"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( @@ -1593,7 +1621,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamanho total"), "trash": MessageLookupByLibrary.simpleMessage("Lixeira"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Cortar"), "tryAgain": MessageLookupByLibrary.simpleMessage("Tente novamente"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1617,6 +1645,8 @@ class MessageLookup extends MessageLookupByLibrary { "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Desarquivar álbum"), "unarchiving": MessageLookupByLibrary.simpleMessage("Desarquivando..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Desculpe, este código não está disponível."), "uncategorized": MessageLookupByLibrary.simpleMessage("Sem categoria"), "unhide": MessageLookupByLibrary.simpleMessage("Reexibir"), "unhideToAlbum": @@ -1648,7 +1678,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Utilizar foto selecionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espaço em uso"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Falha na verificação, por favor, tente novamente"), @@ -1656,7 +1686,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID de Verificação"), "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verificar e-mail"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar chave de acesso"), @@ -1695,13 +1725,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Não suportamos a edição de fotos e álbuns que você ainda não possui"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Fraca"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bem-vindo de volta!"), "whatsNew": MessageLookupByLibrary.simpleMessage("O que há de novo"), "yearly": MessageLookupByLibrary.simpleMessage("Anual"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Sim"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sim, cancelar"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1732,7 +1762,7 @@ class MessageLookup extends MessageLookupByLibrary { "Você não pode compartilhar consigo mesmo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Você não tem nenhum item arquivado."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Sua conta foi excluída"), "yourMap": MessageLookupByLibrary.simpleMessage("Seu mapa"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 138d6848c8..b62f043922 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -127,90 +127,90 @@ class MessageLookup extends MessageLookupByLibrary { static String m36(albumName) => "Успешно перемещено в ${albumName}"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Мощность пароля: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Если с вас сняли оплату, обратитесь в службу поддержки ${providerName}"; - static String m40(endDate) => + static String m41(endDate) => "Бесплатный пробный период до ${endDate}.\nПосле, вы сможете выбрать платный план."; - static String m41(toEmail) => "Пожалуйста, напишите нам на ${toEmail}"; + static String m42(toEmail) => "Пожалуйста, напишите нам на ${toEmail}"; - static String m42(toEmail) => "Пожалуйста, отправьте логи на \n${toEmail}"; + static String m43(toEmail) => "Пожалуйста, отправьте логи на \n${toEmail}"; - static String m43(storeName) => "Оцените нас в ${storeName}"; + static String m44(storeName) => "Оцените нас в ${storeName}"; - static String m44(storageInGB) => + static String m45(storageInGB) => "3. Вы оба получаете ${storageInGB} Гигабайт* бесплатно"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} будет удален из этого общего альбома\n\nВсе добавленные им фотографии также будут удалены из альбома"; - static String m46(endDate) => "Обновление подписки на ${endDate}"; + static String m47(endDate) => "Обновление подписки на ${endDate}"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} результат найден', other: '${count} результатов найдено')}"; - static String m48(count) => "${count} выбрано"; + static String m49(count) => "${count} выбрано"; - static String m49(count, yourCount) => "${count} выбрано (${yourCount} ваши)"; - - static String m50(verificationID) => - "Вот мой проверочный ID: ${verificationID} для ente.io."; + static String m50(count, yourCount) => "${count} выбрано (${yourCount} ваши)"; static String m51(verificationID) => + "Вот мой проверочный ID: ${verificationID} для ente.io."; + + static String m52(verificationID) => "Эй, вы можете подтвердить, что это ваш идентификатор подтверждения ente.io: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Реферальный код Ente: ${referralCode} \n\nПримените его в разделе «Настройки» → «Основные» → «Рефералы», чтобы получить ${referralStorageInGB} Гигабайт бесплатно после того как вы подпишетесь на платный план"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Поделится с конкретными людьми', one: 'Поделено с 1 человеком', other: 'Поделено с ${numberOfPeople} людьми')}"; - static String m54(emailIDs) => "Поделиться с ${emailIDs}"; - - static String m55(fileType) => - "Это ${fileType} будет удалено с вашего устройства."; + static String m55(emailIDs) => "Поделиться с ${emailIDs}"; static String m56(fileType) => + "Это ${fileType} будет удалено с вашего устройства."; + + static String m57(fileType) => "Этот ${fileType} есть и в Ente, и на вашем устройстве."; - static String m57(fileType) => "Этот ${fileType} будет удалён из Ente."; + static String m58(fileType) => "Этот ${fileType} будет удалён из Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} Гигабайт"; + static String m59(storageAmountInGB) => "${storageAmountInGB} Гигабайт"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} из ${totalAmount} ${totalStorageUnit} использовано"; - static String m60(id) => + static String m61(id) => "Ваш ${id} уже связан с другой учетной записью Ente.\nЕсли вы хотите использовать ${id} с этой учетной записью, пожалуйста, свяжитесь с нашей службой поддержки"; - static String m61(endDate) => "Ваша подписка будет отменена ${endDate}"; + static String m62(endDate) => "Ваша подписка будет отменена ${endDate}"; - static String m62(completed, total) => "${completed}/${total} сохранено"; + static String m63(completed, total) => "${completed}/${total} сохранено"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Они тоже получат ${storageAmountInGB} Гигабайт"; - static String m64(email) => + static String m65(email) => "Этот идентификатор подтверждения пользователя ${email}"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1 день', other: '${count} дней')}"; - static String m66(endDate) => "Действителен по ${endDate}"; + static String m67(endDate) => "Действителен по ${endDate}"; - static String m67(email) => "Подтвердить ${email}"; + static String m68(email) => "Подтвердить ${email}"; - static String m68(email) => "Мы отправили письмо на ${email}"; + static String m69(email) => "Мы отправили письмо на ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} год назад', other: '${count} лет назад')}"; - static String m70(storageSaved) => "Вы успешно освободили ${storageSaved}!"; + static String m71(storageSaved) => "Вы успешно освободили ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -1109,7 +1109,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Пароль успешно изменён"), "passwordLock": MessageLookupByLibrary.simpleMessage("Блокировка паролем"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1119,7 +1119,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Сбой платежа"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "К сожалению, ваш платеж не был выполнен. Пожалуйста, свяжитесь со службой поддержки, и мы вам поможем!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Отложенные элементы"), "pendingSync": @@ -1148,7 +1148,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Воспроизвести альбом на ТВ"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Подписка на PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1160,14 +1160,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Если проблема не устранена, обратитесь в службу поддержки"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Предоставьте разрешение"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Пожалуйста, войдите снова"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Пожалуйста, попробуйте ещё раз"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1204,7 +1204,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Оценить приложение"), "rateUs": MessageLookupByLibrary.simpleMessage("Оцените нас"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Восстановить"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Восстановить аккаунт"), @@ -1239,7 +1239,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Дайте этот код своим друзьям"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Они подписываются на платный план"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Рефералы"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Рефералы в настоящее время приостановлены"), @@ -1266,7 +1266,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Удалить ссылку"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Исключить участника"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Удалить метку человека"), "removePublicLink": @@ -1286,7 +1286,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Переименовать файл"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Продлить подписку"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Сообщить об ошибке"), "reportBug": MessageLookupByLibrary.simpleMessage("Сообщить об ошибке"), @@ -1354,7 +1354,7 @@ class MessageLookup extends MessageLookupByLibrary { "Групповые фотографии, сделанные в некотором радиусе от фотографии"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Пригласите людей, и вы увидите все фотографии, которыми они поделились здесь"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Безопасность"), "selectALocation": MessageLookupByLibrary.simpleMessage("Выбрать место"), @@ -1380,8 +1380,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Выбранные элементы будут удалены из всех альбомов и перемещены в корзину."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Отправить"), "sendEmail": MessageLookupByLibrary.simpleMessage( "Отправить электронное письмо"), @@ -1413,16 +1413,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Поделиться альбомом сейчас"), "shareLink": MessageLookupByLibrary.simpleMessage("Поделиться ссылкой"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Поделитесь только с теми людьми, с которыми вы хотите"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Скачай Ente, чтобы мы могли легко поделиться фотографиями и видео без сжатия\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Поделится с пользователями без Ente"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Поделиться первым альбомом"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1433,7 +1433,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Новые общие фотографии"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Получать уведомления, когда кто-то добавляет фото в общий альбом, в котором вы состоите"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Поделиться со мной"), "sharedWithYou": @@ -1449,11 +1449,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Выйти из других устройств"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Я согласен с условиями предоставления услуг и политикой конфиденциальности"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Он будет удален из всех альбомов."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Пропустить"), "social": MessageLookupByLibrary.simpleMessage("Соцсети"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( @@ -1497,13 +1497,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Хранилище"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Семья"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Вы"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Превышен предел хранения"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Сильный"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Подписаться"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Похоже, ваша подписка истекла. Пожалуйста, подпишитесь, чтобы включить функцию общего доступа."), @@ -1520,7 +1520,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Предложить идею"), "support": MessageLookupByLibrary.simpleMessage("Поддержка"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Синхронизация остановлена"), "syncing": MessageLookupByLibrary.simpleMessage("Синхронизация..."), @@ -1550,7 +1550,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Эти элементы будут удалено с вашего устройства."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Они будут удален из всех альбомов."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1566,7 +1566,7 @@ class MessageLookup extends MessageLookupByLibrary { "Этот адрес электронной почты уже используется"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Это изображение не имеет exif данных"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Это ваш идентификатор подтверждения"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1590,7 +1590,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("всего"), "totalSize": MessageLookupByLibrary.simpleMessage("Общий размер"), "trash": MessageLookupByLibrary.simpleMessage("Корзина"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Сократить"), "tryAgain": MessageLookupByLibrary.simpleMessage("Попробовать снова"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1645,7 +1645,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Использовать выбранное фото"), "usedSpace": MessageLookupByLibrary.simpleMessage("Использовано места"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Проверка не удалась, попробуйте еще раз"), @@ -1654,7 +1654,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Подтвердить"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Подтвердить электронную почту"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Подтверждение"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Подтвердить ключ"), @@ -1690,12 +1690,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Мы не можем поддержать редактирование фотографий и альбомов, которыми вы не владеете"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Слабый"), "welcomeBack": MessageLookupByLibrary.simpleMessage("С возвращением!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Что нового"), "yearly": MessageLookupByLibrary.simpleMessage("Ежегодно"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Да"), "yesCancel": MessageLookupByLibrary.simpleMessage("Да, отменить"), "yesConvertToViewer": @@ -1725,7 +1725,7 @@ class MessageLookup extends MessageLookupByLibrary { "Вы не можете поделиться с самим собой"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "У вас нет архивных элементов."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Ваша учетная запись была удалена"), "yourMap": MessageLookupByLibrary.simpleMessage("Ваша карта"), diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 7216e9500e..28813655f0 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -129,91 +129,91 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "Not ${name}?"; - static String m38(passwordStrengthValue) => + static String m39(passwordStrengthValue) => "Şifrenin güçlülük seviyesi: ${passwordStrengthValue}"; - static String m39(providerName) => + static String m40(providerName) => "Sizden ücret alındıysa lütfen ${providerName} destek ekibiyle görüşün"; - static String m40(endDate) => + static String m41(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m41(toEmail) => "Lütfen bize ${toEmail} adresinden ulaşın"; + static String m42(toEmail) => "Lütfen bize ${toEmail} adresinden ulaşın"; - static String m42(toEmail) => + static String m43(toEmail) => "Lütfen günlükleri şu adrese gönderin\n${toEmail}"; - static String m43(storeName) => "Bizi ${storeName} üzerinden değerlendirin"; + static String m44(storeName) => "Bizi ${storeName} üzerinden değerlendirin"; - static String m44(storageInGB) => "3. Hepimiz ${storageInGB} GB* bedava alın"; + static String m45(storageInGB) => "3. Hepimiz ${storageInGB} GB* bedava alın"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} bu paylaşılan albümden kaldırılacaktır\n\nOnlar tarafından eklenen tüm fotoğraflar da albümden kaldırılacaktır"; - static String m46(endDate) => "Abonelik ${endDate} tarihinde yenilenir"; + static String m47(endDate) => "Abonelik ${endDate} tarihinde yenilenir"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, one: '${count} yıl önce', other: '${count} yıl önce')}"; - static String m48(count) => "${count} seçildi"; + static String m49(count) => "${count} seçildi"; - static String m49(count, yourCount) => + static String m50(count, yourCount) => "Seçilenler: ${count} (${yourCount} sizin seçiminiz)"; - static String m50(verificationID) => + static String m51(verificationID) => "İşte ente.io için doğrulama kimliğim: ${verificationID}."; - static String m51(verificationID) => + static String m52(verificationID) => "Merhaba, bu ente.io doğrulama kimliğinizin doğruluğunu onaylayabilir misiniz: ${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Belirli kişilerle paylaş', one: '1 kişiyle paylaşıldı', other: '${numberOfPeople} kişiyle paylaşıldı')}"; - static String m54(emailIDs) => "${emailIDs} ile paylaşıldı"; + static String m55(emailIDs) => "${emailIDs} ile paylaşıldı"; - static String m55(fileType) => "Bu ${fileType}, cihazınızdan silinecek."; + static String m56(fileType) => "Bu ${fileType}, cihazınızdan silinecek."; - static String m56(fileType) => + static String m57(fileType) => "This ${fileType} is in both Ente and your device."; - static String m57(fileType) => "This ${fileType} will be deleted from Ente."; + static String m58(fileType) => "This ${fileType} will be deleted from Ente."; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit} kullanıldı"; - static String m60(id) => + static String m61(id) => "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m61(endDate) => + static String m62(endDate) => "Aboneliğiniz ${endDate} tarihinde iptal edilecektir"; - static String m62(completed, total) => "${completed}/${total} anı korundu"; + static String m63(completed, total) => "${completed}/${total} anı korundu"; - static String m63(storageAmountInGB) => + static String m64(storageAmountInGB) => "Aynı zamanda ${storageAmountInGB} GB alıyorlar"; - static String m64(email) => "Bu, ${email}\'in Doğrulama Kimliği"; + static String m65(email) => "Bu, ${email}\'in Doğrulama Kimliği"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: 'gün', one: '1 gün', other: '${count} gün')}"; - static String m66(endDate) => "${endDate} tarihine kadar geçerli"; + static String m67(endDate) => "${endDate} tarihine kadar geçerli"; - static String m67(email) => "${email} doğrula"; + static String m68(email) => "${email} doğrula"; - static String m68(email) => + static String m69(email) => "E-postayı ${email} adresine gönderdik"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} yıl önce', other: '${count} yıl önce')}"; - static String m70(storageSaved) => + static String m71(storageSaved) => "Başarılı bir şekilde ${storageSaved} alanını boşalttınız!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -1104,7 +1104,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Şifreniz başarılı bir şekilde değiştirildi"), "passwordLock": MessageLookupByLibrary.simpleMessage("Sifre kilidi"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1115,7 +1115,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ödeme başarısız oldu"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Maalesef ödemeniz başarısız oldu. Lütfen destekle iletişime geçin, size yardımcı olacağız!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("Bekleyen Öğeler"), "pendingSync": MessageLookupByLibrary.simpleMessage("Senkronizasyon bekleniyor"), @@ -1142,7 +1142,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("Albümü sabitle"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Albümü TV\'de oynat"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore aboneliği"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1154,14 +1154,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bu hata devam ederse lütfen desteğe başvurun"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Lütfen izin ver"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Lütfen tekrar giriş yapın"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Lütfen tekrar deneyiniz"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1198,7 +1198,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Uygulamaya puan verin"), "rateUs": MessageLookupByLibrary.simpleMessage("Bizi değerlendirin"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("Kurtarma"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Hesabı kurtar"), "recoverButton": MessageLookupByLibrary.simpleMessage("Kurtar"), @@ -1232,7 +1232,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Bu kodu arkadaşlarınıza verin"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ücretli bir plan için kaydolsunlar"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("Referanslar"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Davetler şu anda durmuş durumda"), @@ -1259,7 +1259,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Linki kaldır"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Katılımcıyı kaldır"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1279,7 +1279,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dosyayı yeniden adlandır"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonelik yenileme"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("Hatayı bildir"), "reportBug": MessageLookupByLibrary.simpleMessage("Hata bildir"), "resendEmail": @@ -1346,7 +1346,7 @@ class MessageLookup extends MessageLookupByLibrary { "Bir fotoğrafın belli bir yarıçapında çekilen fotoğrafları gruplandırın"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "İnsanları davet ettiğinizde onların paylaştığı tüm fotoğrafları burada göreceksiniz"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("Güvenlik"), "selectALocation": MessageLookupByLibrary.simpleMessage("Bir konum seçin"), @@ -1373,8 +1373,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Seçilen öğeler tüm albümlerden silinecek ve çöp kutusuna taşınacak."), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("Gönder"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-posta gönder"), "sendInvite": MessageLookupByLibrary.simpleMessage("Davet kodu gönder"), @@ -1402,16 +1402,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Şimdi bir albüm paylaşın"), "shareLink": MessageLookupByLibrary.simpleMessage("Linki paylaş"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Yalnızca istediğiniz kişilerle paylaşın"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("İlk albümünüzü paylaşın"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1423,7 +1423,7 @@ class MessageLookup extends MessageLookupByLibrary { "Paylaşılan fotoğrafları ekle"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Birisi sizin de parçası olduğunuz paylaşılan bir albüme fotoğraf eklediğinde bildirim alın"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Benimle paylaşılan"), "sharedWithYou": @@ -1438,11 +1438,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Diğer cihazlardan çıkış yap"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Hizmet Şartları\'nı ve Gizlilik Politikası\'nı kabul ediyorum"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("Tüm albümlerden silinecek."), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Geç"), "social": MessageLookupByLibrary.simpleMessage("Sosyal Medya"), "someItemsAreInBothEnteAndYourDevice": @@ -1486,13 +1486,13 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("Depolama"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Aile"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Sen"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Depolama sınırı aşıldı"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Güçlü"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Abone ol"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Aboneliğinizin süresi dolmuş gibi görünüyor. Paylaşımı etkinleştirmek için lütfen abone olun."), @@ -1509,7 +1509,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Özellik önerin"), "support": MessageLookupByLibrary.simpleMessage("Destek"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("Senkronizasyon durduruldu"), "syncing": MessageLookupByLibrary.simpleMessage("Eşitleniyor..."), @@ -1538,7 +1538,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Bu öğeler cihazınızdan silinecektir."), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage("Tüm albümlerden silinecek."), "thisActionCannotBeUndone": @@ -1554,7 +1554,7 @@ class MessageLookup extends MessageLookupByLibrary { "Bu e-posta zaten kullanılıyor"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("Bu görselde exif verisi yok"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Doğrulama kimliğiniz"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1579,7 +1579,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Toplam boyut"), "trash": MessageLookupByLibrary.simpleMessage("Cöp kutusu"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("Trim"), "tryAgain": MessageLookupByLibrary.simpleMessage("Tekrar deneyiniz"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1635,7 +1635,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Seçilen fotoğrafı kullan"), "usedSpace": MessageLookupByLibrary.simpleMessage("Kullanılan alan"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Doğrulama başarısız oldu, lütfen tekrar deneyin"), @@ -1644,7 +1644,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Doğrula"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-posta adresini doğrulayın"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Doğrula"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Şifrenizi doğrulayın"), @@ -1680,13 +1680,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Henüz sahibi olmadığınız fotoğraf ve albümlerin düzenlenmesini desteklemiyoruz"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Zayıf"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Tekrardan hoşgeldin!"), "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), "yearly": MessageLookupByLibrary.simpleMessage("Yıllık"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Evet"), "yesCancel": MessageLookupByLibrary.simpleMessage("Evet, iptal et"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1717,7 +1717,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Kendinizle paylaşamazsınız"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("Arşivlenmiş öğeniz yok."), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Hesabınız silindi"), "yourMap": MessageLookupByLibrary.simpleMessage("Haritalarınız"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 4629433319..793ab08d5c 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -122,81 +122,81 @@ class MessageLookup extends MessageLookupByLibrary { static String m37(name) => "不是 ${name}?"; - static String m38(passwordStrengthValue) => "密码强度: ${passwordStrengthValue}"; + static String m39(passwordStrengthValue) => "密码强度: ${passwordStrengthValue}"; - static String m39(providerName) => "如果您被收取费用,请用英语与 ${providerName} 的客服聊天"; + static String m40(providerName) => "如果您被收取费用,请用英语与 ${providerName} 的客服聊天"; - static String m40(endDate) => "免费试用有效期至 ${endDate}。\n在此之后您可以选择付费计划。"; + static String m41(endDate) => "免费试用有效期至 ${endDate}。\n在此之后您可以选择付费计划。"; - static String m41(toEmail) => "请给我们发送电子邮件至 ${toEmail}"; + static String m42(toEmail) => "请给我们发送电子邮件至 ${toEmail}"; - static String m42(toEmail) => "请将日志发送至 \n${toEmail}"; + static String m43(toEmail) => "请将日志发送至 \n${toEmail}"; - static String m43(storeName) => "在 ${storeName} 上给我们评分"; + static String m44(storeName) => "在 ${storeName} 上给我们评分"; - static String m44(storageInGB) => "3. 你和朋友都将免费获得 ${storageInGB} GB*"; + static String m45(storageInGB) => "3. 你和朋友都将免费获得 ${storageInGB} GB*"; - static String m45(userEmail) => + static String m46(userEmail) => "${userEmail} 将从这个共享相册中删除\n\nTA们添加的任何照片也将从相册中删除"; - static String m46(endDate) => "在 ${endDate} 前续费"; + static String m47(endDate) => "在 ${endDate} 前续费"; - static String m47(count) => + static String m48(count) => "${Intl.plural(count, other: '已找到 ${count} 个结果')}"; - static String m48(count) => "已选择 ${count} 个"; + static String m49(count) => "已选择 ${count} 个"; - static String m49(count, yourCount) => "选择了 ${count} 个 (您的 ${yourCount} 个)"; + static String m50(count, yourCount) => "选择了 ${count} 个 (您的 ${yourCount} 个)"; - static String m50(verificationID) => "这是我的ente.io 的验证 ID: ${verificationID}。"; + static String m51(verificationID) => "这是我的ente.io 的验证 ID: ${verificationID}。"; - static String m51(verificationID) => + static String m52(verificationID) => "嘿,你能确认这是你的 ente.io 验证 ID吗:${verificationID}"; - static String m52(referralCode, referralStorageInGB) => + static String m53(referralCode, referralStorageInGB) => "Ente 推荐代码:${referralCode}\n\n在 \"设置\"→\"通用\"→\"推荐 \"中应用它,即可在注册付费计划后免费获得 ${referralStorageInGB} GB 存储空间\n\nhttps://ente.io"; - static String m53(numberOfPeople) => + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '与特定人员共享', one: '与 1 人共享', other: '与 ${numberOfPeople} 人共享')}"; - static String m54(emailIDs) => "与 ${emailIDs} 共享"; + static String m55(emailIDs) => "与 ${emailIDs} 共享"; - static String m55(fileType) => "此 ${fileType} 将从您的设备中删除。"; + static String m56(fileType) => "此 ${fileType} 将从您的设备中删除。"; - static String m56(fileType) => "${fileType} 已同时存在于 Ente 和您的设备中。"; + static String m57(fileType) => "${fileType} 已同时存在于 Ente 和您的设备中。"; - static String m57(fileType) => "${fileType} 将从 Ente 中删除。"; + static String m58(fileType) => "${fileType} 将从 Ente 中删除。"; - static String m58(storageAmountInGB) => "${storageAmountInGB} GB"; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m59( + static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "已使用 ${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit}"; - static String m60(id) => + static String m61(id) => "您的 ${id} 已链接到另一个 Ente 账户。\n如果您想在此账户中使用您的 ${id} ,请联系我们的支持人员"; - static String m61(endDate) => "您的订阅将于 ${endDate} 取消"; + static String m62(endDate) => "您的订阅将于 ${endDate} 取消"; - static String m62(completed, total) => "已保存的回忆 ${completed}/共 ${total}"; + static String m63(completed, total) => "已保存的回忆 ${completed}/共 ${total}"; - static String m63(storageAmountInGB) => "他们也会获得 ${storageAmountInGB} GB"; + static String m64(storageAmountInGB) => "他们也会获得 ${storageAmountInGB} GB"; - static String m64(email) => "这是 ${email} 的验证ID"; + static String m65(email) => "这是 ${email} 的验证ID"; - static String m65(count) => + static String m66(count) => "${Intl.plural(count, zero: '', one: '1天', other: '${count} 天')}"; - static String m66(endDate) => "有效期至 ${endDate}"; + static String m67(endDate) => "有效期至 ${endDate}"; - static String m67(email) => "验证 ${email}"; + static String m68(email) => "验证 ${email}"; - static String m68(email) => "我们已经发送邮件到 ${email}"; + static String m69(email) => "我们已经发送邮件到 ${email}"; - static String m69(count) => + static String m70(count) => "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; - static String m70(storageSaved) => "您已成功释放了 ${storageSaved}!"; + static String m71(storageSaved) => "您已成功释放了 ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -915,7 +915,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage("密码修改成功"), "passwordLock": MessageLookupByLibrary.simpleMessage("密码锁"), - "passwordStrength": m38, + "passwordStrength": m39, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "密码强度的计算考虑了密码的长度、使用的字符以及密码是否出现在最常用的 10,000 个密码中"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -924,7 +924,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("支付失败"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "不幸的是,您的付款失败。请联系支持人员,我们将为您提供帮助!"), - "paymentFailedTalkToProvider": m39, + "paymentFailedTalkToProvider": m40, "pendingItems": MessageLookupByLibrary.simpleMessage("待处理项目"), "pendingSync": MessageLookupByLibrary.simpleMessage("正在等待同步"), "people": MessageLookupByLibrary.simpleMessage("人物"), @@ -944,7 +944,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("置顶相册"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN 锁定"), "playOnTv": MessageLookupByLibrary.simpleMessage("在电视上播放相册"), - "playStoreFreeTrialValidTill": m40, + "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore 订阅"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -954,12 +954,12 @@ class MessageLookup extends MessageLookupByLibrary { "请用英语联系 support@ente.io ,我们将乐意提供帮助!"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage("如果问题仍然存在,请联系支持"), - "pleaseEmailUsAt": m41, + "pleaseEmailUsAt": m42, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("请授予权限"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("请重新登录"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage("请选择要删除的快速链接"), - "pleaseSendTheLogsTo": m42, + "pleaseSendTheLogsTo": m43, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("请重试"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage("请验证您输入的代码"), @@ -985,7 +985,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("提升工单"), "rateTheApp": MessageLookupByLibrary.simpleMessage("为此应用评分"), "rateUs": MessageLookupByLibrary.simpleMessage("给我们评分"), - "rateUsOnStore": m43, + "rateUsOnStore": m44, "recover": MessageLookupByLibrary.simpleMessage("恢复"), "recoverAccount": MessageLookupByLibrary.simpleMessage("恢复账户"), "recoverButton": MessageLookupByLibrary.simpleMessage("恢复"), @@ -1012,7 +1012,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("把我们推荐给你的朋友然后获得延长一倍的订阅计划"), "referralStep1": MessageLookupByLibrary.simpleMessage("1. 将此代码提供给您的朋友"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 他们注册一个付费计划"), - "referralStep3": m44, + "referralStep3": m45, "referrals": MessageLookupByLibrary.simpleMessage("推荐"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("推荐已暂停"), @@ -1033,7 +1033,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeFromFavorite": MessageLookupByLibrary.simpleMessage("从收藏中移除"), "removeLink": MessageLookupByLibrary.simpleMessage("移除链接"), "removeParticipant": MessageLookupByLibrary.simpleMessage("移除参与者"), - "removeParticipantBody": m45, + "removeParticipantBody": m46, "removePersonLabel": MessageLookupByLibrary.simpleMessage("移除人物标签"), "removePublicLink": MessageLookupByLibrary.simpleMessage("删除公开链接"), "removePublicLinks": MessageLookupByLibrary.simpleMessage("删除公开链接"), @@ -1046,7 +1046,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameAlbum": MessageLookupByLibrary.simpleMessage("重命名相册"), "renameFile": MessageLookupByLibrary.simpleMessage("重命名文件"), "renewSubscription": MessageLookupByLibrary.simpleMessage("续费订阅"), - "renewsOn": m46, + "renewsOn": m47, "reportABug": MessageLookupByLibrary.simpleMessage("报告错误"), "reportBug": MessageLookupByLibrary.simpleMessage("报告错误"), "resendEmail": MessageLookupByLibrary.simpleMessage("重新发送电子邮件"), @@ -1098,7 +1098,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("在照片的一定半径内拍摄的几组照片"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("邀请他人,您将在此看到他们分享的所有照片"), - "searchResultCount": m47, + "searchResultCount": m48, "security": MessageLookupByLibrary.simpleMessage("安全"), "selectALocation": MessageLookupByLibrary.simpleMessage("选择一个位置"), "selectALocationFirst": @@ -1118,8 +1118,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("所选文件夹将被加密并备份"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage("所选项目将从所有相册中删除并移动到回收站。"), - "selectedPhotos": m48, - "selectedPhotosWithYours": m49, + "selectedPhotos": m49, + "selectedPhotosWithYours": m50, "send": MessageLookupByLibrary.simpleMessage("发送"), "sendEmail": MessageLookupByLibrary.simpleMessage("发送电子邮件"), "sendInvite": MessageLookupByLibrary.simpleMessage("发送邀请"), @@ -1141,16 +1141,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("打开相册并点击右上角的分享按钮进行分享"), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("立即分享相册"), "shareLink": MessageLookupByLibrary.simpleMessage("分享链接"), - "shareMyVerificationID": m50, + "shareMyVerificationID": m51, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("仅与您想要的人分享"), - "shareTextConfirmOthersVerificationID": m51, + "shareTextConfirmOthersVerificationID": m52, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage("下载 Ente,让我们轻松共享高质量的原始照片和视频"), - "shareTextReferralCode": m52, + "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("与非 Ente 用户共享"), - "shareWithPeopleSectionTitle": m53, + "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("分享您的第一个相册"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1161,7 +1161,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("新共享的照片"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage("当有人将照片添加到您所属的共享相册时收到通知"), - "sharedWith": m54, + "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("与我共享"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("已与您共享"), "sharing": MessageLookupByLibrary.simpleMessage("正在分享..."), @@ -1173,11 +1173,11 @@ class MessageLookup extends MessageLookupByLibrary { "signOutOtherDevices": MessageLookupByLibrary.simpleMessage("登出其他设备"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "我同意 服务条款隐私政策"), - "singleFileDeleteFromDevice": m55, + "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("它将从所有相册中删除。"), - "singleFileInBothLocalAndRemote": m56, - "singleFileInRemoteOnly": m57, + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("跳过"), "social": MessageLookupByLibrary.simpleMessage("社交"), "someItemsAreInBothEnteAndYourDevice": @@ -1210,12 +1210,12 @@ class MessageLookup extends MessageLookupByLibrary { "storage": MessageLookupByLibrary.simpleMessage("存储空间"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("家庭"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("您"), - "storageInGB": m58, + "storageInGB": m59, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("已超出存储限制"), - "storageUsageInfo": m59, + "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("强"), - "subAlreadyLinkedErrMessage": m60, - "subWillBeCancelledOn": m61, + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("订阅"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage("您的订阅似乎已过期。请订阅以启用分享。"), @@ -1228,7 +1228,7 @@ class MessageLookup extends MessageLookupByLibrary { "successfullyUnhid": MessageLookupByLibrary.simpleMessage("已成功取消隐藏"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("建议新功能"), "support": MessageLookupByLibrary.simpleMessage("支持"), - "syncProgress": m62, + "syncProgress": m63, "syncStopped": MessageLookupByLibrary.simpleMessage("同步已停止"), "syncing": MessageLookupByLibrary.simpleMessage("正在同步···"), "systemTheme": MessageLookupByLibrary.simpleMessage("适应系统"), @@ -1252,7 +1252,7 @@ class MessageLookup extends MessageLookupByLibrary { "theme": MessageLookupByLibrary.simpleMessage("主题"), "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage("这些项目将从您的设备中删除。"), - "theyAlsoGetXGb": m63, + "theyAlsoGetXGb": m64, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage("他们将从所有相册中删除。"), "thisActionCannotBeUndone": @@ -1266,7 +1266,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("这个邮箱地址已经被使用"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("此图像没有Exif 数据"), - "thisIsPersonVerificationId": m64, + "thisIsPersonVerificationId": m65, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("这是您的验证 ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1286,7 +1286,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("总计"), "totalSize": MessageLookupByLibrary.simpleMessage("总大小"), "trash": MessageLookupByLibrary.simpleMessage("回收站"), - "trashDaysLeft": m65, + "trashDaysLeft": m66, "trim": MessageLookupByLibrary.simpleMessage("修剪"), "tryAgain": MessageLookupByLibrary.simpleMessage("请再试一次"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1331,13 +1331,13 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("使用恢复密钥"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("使用所选照片"), "usedSpace": MessageLookupByLibrary.simpleMessage("已用空间"), - "validTill": m66, + "validTill": m67, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage("验证失败,请重试"), "verificationId": MessageLookupByLibrary.simpleMessage("验证 ID"), "verify": MessageLookupByLibrary.simpleMessage("验证"), "verifyEmail": MessageLookupByLibrary.simpleMessage("验证电子邮件"), - "verifyEmailID": m67, + "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("验证"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("验证通行密钥"), "verifyPassword": MessageLookupByLibrary.simpleMessage("验证密码"), @@ -1365,12 +1365,12 @@ class MessageLookup extends MessageLookupByLibrary { "weAreOpenSource": MessageLookupByLibrary.simpleMessage("我们是开源的 !"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage("我们不支持编辑您尚未拥有的照片和相册"), - "weHaveSendEmailTo": m68, + "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("弱"), "welcomeBack": MessageLookupByLibrary.simpleMessage("欢迎回来!"), "whatsNew": MessageLookupByLibrary.simpleMessage("更新日志"), "yearly": MessageLookupByLibrary.simpleMessage("每年"), - "yearsAgo": m69, + "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("是"), "yesCancel": MessageLookupByLibrary.simpleMessage("是的,取消"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage("是的,转换为查看者"), @@ -1396,7 +1396,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("莫开玩笑,您不能与自己分享"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("您没有任何存档的项目。"), - "youHaveSuccessfullyFreedUp": m70, + "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("您的账户已删除"), "yourMap": MessageLookupByLibrary.simpleMessage("您的地图"), From a10972319bc3da048ea8346325d4de8ccd5212ac Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:57:43 +0530 Subject: [PATCH 0668/1179] [mob] Potential fix for notification order --- mobile/lib/main.dart | 2 ++ mobile/lib/services/notification_service.dart | 8 +++++--- mobile/lib/ui/tabs/home_widget.dart | 12 ++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index bf02a5c018..09126649df 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -40,6 +40,7 @@ import 'package:photos/services/machine_learning/ml_service.dart'; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; import "package:photos/services/magic_cache_service.dart"; import 'package:photos/services/memories_service.dart'; +import "package:photos/services/notification_service.dart"; import 'package:photos/services/push_service.dart'; import 'package:photos/services/remote_sync_service.dart'; import 'package:photos/services/search_service.dart'; @@ -209,6 +210,7 @@ Future _init(bool isBackground, {String via = ''}) async { await _logFGHeartBeatInfo(); _logger.info("_logFGHeartBeatInfo done"); unawaited(_scheduleHeartBeat(preferences, isBackground)); + NotificationService.instance.init(preferences); AppLifecycleService.instance.init(preferences); if (isBackground) { AppLifecycleService.instance.onAppInBackground('init via: $via'); diff --git a/mobile/lib/services/notification_service.dart b/mobile/lib/services/notification_service.dart index c860f427f8..b99c3bcb0f 100644 --- a/mobile/lib/services/notification_service.dart +++ b/mobile/lib/services/notification_service.dart @@ -20,13 +20,15 @@ class NotificationService { FlutterLocalNotificationsPlugin(); final _logger = Logger("NotificationService"); - Future init( + void init(SharedPreferences preferences) { + _preferences = preferences; + } + + Future initialize( void Function( NotificationResponse notificationResponse, ) onNotificationTapped, - SharedPreferences preferences, ) async { - _preferences = preferences; const androidSettings = AndroidInitializationSettings('notification_icon'); const iosSettings = DarwinInitializationSettings( requestAlertPermission: false, diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index dd31dbeda6..1cd4312ffe 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -57,7 +57,6 @@ import 'package:photos/ui/viewer/search_tab/search_tab.dart'; import 'package:photos/utils/dialog_util.dart'; import "package:photos/utils/navigation_util.dart"; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import "package:shared_preferences/shared_preferences.dart"; import 'package:uni_links/uni_links.dart'; class HomeWidget extends StatefulWidget { @@ -105,6 +104,7 @@ class _HomeWidgetState extends State { @override void initState() { _logger.info("Building initstate"); + super.initState(); _tabChangedEventSubscription = Bus.instance.on().listen((event) { _selectedTabIndex = event.selectedIndex; @@ -221,13 +221,9 @@ class _HomeWidgetState extends State { }, ), ); - - SharedPreferences.getInstance().then((preferences) { - NotificationService.instance - .init(_onDidReceiveNotificationResponse, preferences); - }); - - super.initState(); + NotificationService.instance + .initialize(_onDidReceiveNotificationResponse) + .ignore(); } Future _autoLogoutAlert() async { From 3dd9be921aed8657f40e17e2762848d8f25bccf1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:58:48 +0530 Subject: [PATCH 0669/1179] [mob] Bump version v0.9.29 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 66fcf99443..b7c6cd4dc2 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.28+928 +version: 0.9.29+929 publish_to: none environment: From b258c3a6b72b7b07f03e5730fb8a86aa981f4992 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:10:07 +0530 Subject: [PATCH 0670/1179] [server] Remove slow req logging --- server/pkg/controller/filedata/controller.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/server/pkg/controller/filedata/controller.go b/server/pkg/controller/filedata/controller.go index 98b08e47d6..2be4ebb04c 100644 --- a/server/pkg/controller/filedata/controller.go +++ b/server/pkg/controller/filedata/controller.go @@ -17,7 +17,6 @@ import ( "github.com/ente-io/museum/pkg/utils/network" "github.com/ente-io/museum/pkg/utils/s3config" "github.com/ente-io/stacktrace" - "github.com/gin-contrib/requestid" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" "strings" @@ -77,9 +76,6 @@ func New(repo *fileDataRepo.Repository, } func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataRequest) error { - startTime := gTime.Now() - opStartTime := gTime.Now() - logFields := log.Fields{} if err := req.Validate(); err != nil { return stacktrace.Propagate(err, "validation failed") } @@ -88,8 +84,6 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR if err != nil { return stacktrace.Propagate(err, "") } - logFields["validationTime"] = gTime.Since(opStartTime).Milliseconds() - opStartTime = gTime.Now() if req.Type != ente.MlData && req.Type != ente.PreviewVideo { return stacktrace.Propagate(ente.NewBadRequestWithMessage("unsupported object type "+string(req.Type)), "") } @@ -118,8 +112,6 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR log.Error(uploadErr) return stacktrace.Propagate(uploadErr, "") } - logFields["uploadTime"] = gTime.Since(opStartTime).Milliseconds() - opStartTime = gTime.Now() row := fileData.Row{ FileID: req.FileID, @@ -132,14 +124,6 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR if err != nil { return stacktrace.Propagate(err, "") } - logFields["dbInsertTime"] = gTime.Since(opStartTime).Milliseconds() - // log if total time is more than 2 seconds - if gTime.Since(startTime) > 2*gTime.Second { - logFields["totalTime"] = gTime.Since(startTime).Milliseconds() - logFields["req_id"] = requestid.Get(ctx) - logFields["fileID"] = req.FileID - log.WithFields(logFields).Warn("slow request") - } return nil } From 924bee53e85207e2618d1c2ae218e1edffd7b92d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:17:53 +0530 Subject: [PATCH 0671/1179] [server] Upload fileData in async manner --- server/pkg/controller/filedata/controller.go | 39 +++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/server/pkg/controller/filedata/controller.go b/server/pkg/controller/filedata/controller.go index 2be4ebb04c..1c8465d870 100644 --- a/server/pkg/controller/filedata/controller.go +++ b/server/pkg/controller/filedata/controller.go @@ -106,25 +106,28 @@ func (c *Controller) InsertOrUpdate(ctx *gin.Context, req *fileData.PutFileDataR DecryptionHeader: *req.DecryptionHeader, Client: network.GetClientInfo(ctx), } + // Start a goroutine to handle the upload and insert operations + go func() { + logger := log.WithField("objectKey", objectKey).WithField("fileID", req.FileID).WithField("type", req.Type) + size, uploadErr := c.uploadObject(obj, objectKey, bucketID) + if uploadErr != nil { + logger.WithError(uploadErr).Error("upload failed") + return + } - size, uploadErr := c.uploadObject(obj, objectKey, bucketID) - if uploadErr != nil { - log.Error(uploadErr) - return stacktrace.Propagate(uploadErr, "") - } - - row := fileData.Row{ - FileID: req.FileID, - Type: req.Type, - UserID: fileOwnerID, - Size: size, - LatestBucket: bucketID, - } - err = c.Repo.InsertOrUpdate(ctx, row) - if err != nil { - return stacktrace.Propagate(err, "") - } - + row := fileData.Row{ + FileID: req.FileID, + Type: req.Type, + UserID: fileOwnerID, + Size: size, + LatestBucket: bucketID, + } + dbInsertErr := c.Repo.InsertOrUpdate(context.Background(), row) + if dbInsertErr != nil { + logger.WithError(dbInsertErr).Error("insert or update failed") + return + } + }() return nil } From 1f05ae268f5ab3f4493cca1d74902f39579cdc03 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 26 Aug 2024 16:04:32 +0200 Subject: [PATCH 0672/1179] [mob][photos] updated onnxruntime without android binary --- mobile/pubspec.lock | 6 +++--- mobile/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index cb234fe33a..7388ae92f2 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1667,11 +1667,11 @@ packages: dependency: "direct main" description: path: "." - ref: ente_onnxruntime - resolved-ref: fb9393e36013790938b5bc995a4dca15fed3c944 + ref: ios_only + resolved-ref: "70e163745e082b81235d7330b9d5e8c110ed68e4" url: "https://github.com/ente-io/onnxruntime.git" source: git - version: "1.1.0" + version: "1.4.1" open_mail_app: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b7c6cd4dc2..df11aca679 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -131,7 +131,7 @@ dependencies: onnxruntime: git: url: https://github.com/ente-io/onnxruntime.git - ref: ente_onnxruntime + ref: ios_only open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 From e98e8833e66af2c040108d5a000628d600d025dc Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 26 Aug 2024 16:15:49 +0200 Subject: [PATCH 0673/1179] [mob][photos] Clip logs --- .../semantic_search/clip/clip_image_encoder.dart | 4 +++- .../semantic_search/semantic_search_service.dart | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index ac1d9e20da..1b6e8a9ebe 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -55,7 +55,9 @@ class ClipImageEncoder extends MlModel { final embedding = (outputs[0]?.value as List>)[0]; inputOrt.release(); runOptions.release(); - outputs.forEach((element) => element?.release()); + for (var element in outputs) { + element?.release(); + } normalizeEmbedding(embedding); w.stopWithLog("done"); return embedding; diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index a7c846c29c..3c06bfc31d 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -303,6 +303,7 @@ class SemanticSearchService { ByteData imageByteData, int clipImageAddress, ) async { + final startTime = DateTime.now(); final embedding = await ClipImageEncoder.predict( image, imageByteData, @@ -311,6 +312,9 @@ class SemanticSearchService { final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); + dev.log('Finished running ClipImage for $enteFileID in ' + '${DateTime.now().difference(startTime).inMilliseconds} ms'); + return clipResult; } } From c0e64499626a4f08c5e182475bf184c17b11ed1d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 20:00:14 +0530 Subject: [PATCH 0674/1179] [desktop] Fix video upload when metadata extraction fails e.g. on Intel macOS. Regression introduced in 1.7.3, specifically 862495c29e2092c778a724df33397f6e313688fc. --- .../src/services/upload/uploadService.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index e8e907c3f1..8e7cd747e9 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -750,7 +750,7 @@ const extractImageOrVideoMetadata = async ( const fileName = uploadItemFileName(uploadItem); const { fileType } = fileTypeInfo; - let parsedMetadata: ParsedMetadata; + let parsedMetadata: ParsedMetadata | undefined; if (fileType == FileType.image) { parsedMetadata = await tryExtractImageMetadata( uploadItem, @@ -782,7 +782,7 @@ const extractImageOrVideoMetadata = async ( let creationTime: number; if (parsedMetadataJSON?.creationTime) { creationTime = parsedMetadataJSON.creationTime; - } else if (parsedMetadata.creationDate) { + } else if (parsedMetadata?.creationDate) { const { dateTime, offset, timestamp } = parsedMetadata.creationDate; creationTime = timestamp; publicMagicMetadata.dateTime = dateTime; @@ -800,15 +800,17 @@ const extractImageOrVideoMetadata = async ( hash, }; - const location = parsedMetadataJSON?.location ?? parsedMetadata.location; + const location = parsedMetadataJSON?.location ?? parsedMetadata?.location; if (location) { metadata.latitude = location.latitude; metadata.longitude = location.longitude; } - const { width: w, height: h } = parsedMetadata; - if (w) publicMagicMetadata.w = w; - if (h) publicMagicMetadata.h = h; + if (parsedMetadata) { + const { width: w, height: h } = parsedMetadata; + if (w) publicMagicMetadata.w = w; + if (h) publicMagicMetadata.h = h; + } return { metadata, publicMagicMetadata }; }; @@ -883,7 +885,7 @@ export const uploadItemCreationDate = async ( if (parsedMetadataJSON?.creationTime) return parsedMetadataJSON?.creationTime; - let parsedMetadata: ParsedMetadata; + let parsedMetadata: ParsedMetadata | undefined; if (fileType == FileType.image) { parsedMetadata = await tryExtractImageMetadata(uploadItem, undefined); } else if (fileType == FileType.video) { @@ -892,7 +894,7 @@ export const uploadItemCreationDate = async ( throw new Error(`Unexpected file type ${fileType} for ${uploadItem}`); } - return parsedMetadata.creationDate?.timestamp; + return parsedMetadata?.creationDate?.timestamp; }; /** From fc4429925b87022f99e27199802fec78ce16147f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 20:12:21 +0530 Subject: [PATCH 0675/1179] Fix lint issues --- .../PhotoViewer/ImageEditorOverlay/TransformMenu.tsx | 4 +++- .../Search/SearchBar/searchInput/valueContainerWithIcon.tsx | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx index d72278ef03..424e5e9086 100644 --- a/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx +++ b/web/apps/photos/src/components/PhotoViewer/ImageEditorOverlay/TransformMenu.tsx @@ -299,7 +299,9 @@ const TransformMenu = () => { > } + startIcon={ + + } onClick={createFlipCanvasHandler("vertical")} label={t("FLIP_VERTICALLY")} /> diff --git a/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx b/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx index 177d02b729..de9558777b 100644 --- a/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx +++ b/web/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx @@ -33,7 +33,11 @@ export const ValueContainerWithIcon: SelectComponents< >["ValueContainer"] = (props) => ( - theme.colors.stroke.muted}> + theme.colors.stroke.muted} + > {getIconByType(props.getValue()[0]?.type)} {props.children} From 0121643558335b79513b3affc61ee9a21c370ad6 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 26 Aug 2024 16:53:01 +0200 Subject: [PATCH 0676/1179] [mob][photos] Log format of decoding error --- mobile/lib/services/machine_learning/ml_service.dart | 5 ++--- mobile/lib/utils/image_ml_util.dart | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 5a562b710b..ef428f3946 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -477,10 +477,9 @@ class MLService { ); acceptedIssue = true; } - if (errorString - .contains('InvalidImageFormatException: Error decoding image')) { + if (errorString.contains('InvalidImageFormatException')) { _logger.severe( - 'InvalidImageFormatException while processing image with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', e, s, ); diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 6e44f1430f..ee259dd8af 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -35,7 +35,7 @@ Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { await HeifConverter.convert(imagePath, format: 'jpg'); if (jpgPath == null) { _logger.severe('Error converting $format to jpg:', e, s); - throw Exception('InvalidImageFormatException: Error decoding image'); + throw Exception('InvalidImageFormatException: Error decoding image of format $format'); } final imageData = await File(jpgPath).readAsBytes(); final image = await decodeImageFromData(imageData); @@ -43,11 +43,11 @@ Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { return (image, imageByteData); } else { _logger.severe( - 'Error decoding image of format ${imagePath.split('.').last}:', + 'Error decoding image of format $format:', e, s, ); - throw Exception('InvalidImageFormatException: Error decoding image'); + throw Exception('InvalidImageFormatException: Error decoding image of format $format'); } } } From 15dc823109946024d16b65b5da7c3bf2a08478f9 Mon Sep 17 00:00:00 2001 From: Tanguy <98350888+Eseltwift@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:01:34 +0200 Subject: [PATCH 0677/1179] [auth] Add & change icons (#2954) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add G2A icon. - Update Teleport icon. - Add `mix-blend-mode:difference` to SVGs containing white/black parts to make them visible in both dark and light themes, while preserving the brand guideline (GitHub, Ubisoft, Mistral, Filen). **On Android Studio emulators, this `mix-blend-mode` can appear glitched, but it works fine (verified on iPhone).** ## Type of Change - [x] 🖼️ New icon - [ ] ✨ New feature (non-breaking change which adds functionality) - [ ] 🛠️ Bug fix (non-breaking change which fixes an issue) - [ ] ❌ Breaking change (fix or feature that would cause existing functionality to change) - [x] 🧹 Code refactor - [ ] ✅ Build configuration change - [ ] 📝 Documentation - [ ] 🗑️ Chore --- .../custom-icons/_data/custom-icons.json | 25 +++++++++++-------- auth/assets/custom-icons/icons/filen.svg | 4 ++- auth/assets/custom-icons/icons/g2a.svg | 12 +++++++++ auth/assets/custom-icons/icons/github.svg | 6 ++++- auth/assets/custom-icons/icons/mistral.svg | 21 ++++++++++------ auth/assets/custom-icons/icons/teleport.svg | 5 ++-- auth/assets/custom-icons/icons/ubisoft.svg | 6 +++-- 7 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 auth/assets/custom-icons/icons/g2a.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index e484fc48dd..a04cb2b857 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -1,6 +1,7 @@ { "icons": [ - { "title": "1xBet" + { + "title": "1xBet" }, { "title": "3Commas" @@ -194,16 +195,17 @@ "title": "Estateguru" }, { - "title": "Filen", - "hex": "858585" + "title": "Filen" }, { "title": "Firefox", "slug": "mozilla" }, { - "title": "GitHub", - "hex": "000000" + "title": "G2A" + }, + { + "title": "GitHub" }, { "title": "GitLab" @@ -371,7 +373,7 @@ }, { "title": "MyFRITZ!Net", - "slug": "myfritz" + "slug": "myfritz", "altNames": [ "MyFRITZ!", "FritzBox", @@ -435,7 +437,8 @@ "openobserve ai" ] }, - { "title": "okx", + { + "title": "okx", "hex": "000000" }, { "title": "Parsec" @@ -621,8 +624,7 @@ ] }, { - "title": "Ubisoft", - "hex": "4285f4" + "title": "Ubisoft" }, { "title": "Ubuntu One", @@ -680,8 +682,9 @@ ], "slug": "Yandex" }, - { "title": "yahoo" }, - + { + "title": "yahoo" + }, { "title": "YNAB", "altNames": [ diff --git a/auth/assets/custom-icons/icons/filen.svg b/auth/assets/custom-icons/icons/filen.svg index 08e87d6ca3..96b5922865 100644 --- a/auth/assets/custom-icons/icons/filen.svg +++ b/auth/assets/custom-icons/icons/filen.svg @@ -1,3 +1,5 @@ - + + + diff --git a/auth/assets/custom-icons/icons/g2a.svg b/auth/assets/custom-icons/icons/g2a.svg new file mode 100644 index 0000000000..822b7e4a07 --- /dev/null +++ b/auth/assets/custom-icons/icons/g2a.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/github.svg b/auth/assets/custom-icons/icons/github.svg index 538ec5bf2a..0d37d278e1 100644 --- a/auth/assets/custom-icons/icons/github.svg +++ b/auth/assets/custom-icons/icons/github.svg @@ -1 +1,5 @@ -GitHub \ No newline at end of file + + + + + diff --git a/auth/assets/custom-icons/icons/mistral.svg b/auth/assets/custom-icons/icons/mistral.svg index 1b42719f26..1a6cd7fc03 100644 --- a/auth/assets/custom-icons/icons/mistral.svg +++ b/auth/assets/custom-icons/icons/mistral.svg @@ -1,8 +1,15 @@ - - - - - - - + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/teleport.svg b/auth/assets/custom-icons/icons/teleport.svg index 8b0ce64156..2d0de2479f 100644 --- a/auth/assets/custom-icons/icons/teleport.svg +++ b/auth/assets/custom-icons/icons/teleport.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/auth/assets/custom-icons/icons/ubisoft.svg b/auth/assets/custom-icons/icons/ubisoft.svg index fc17aec2ca..8c3b4d6c2f 100644 --- a/auth/assets/custom-icons/icons/ubisoft.svg +++ b/auth/assets/custom-icons/icons/ubisoft.svg @@ -1,3 +1,5 @@ - - + + + + From f40257e21d2affeb9e63d32f074f340d80d4a2c6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 21:16:11 +0530 Subject: [PATCH 0678/1179] [docs] Move preserving folder structure into its own subsection --- docs/docs/photos/features/albums.md | 44 +++++++++++++++++++++- docs/docs/photos/features/watch-folders.md | 24 ++---------- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/docs/docs/photos/features/albums.md b/docs/docs/photos/features/albums.md index c368e6cdfe..47156e5052 100644 --- a/docs/docs/photos/features/albums.md +++ b/docs/docs/photos/features/albums.md @@ -5,8 +5,48 @@ description: Using albums in Ente Photos # Albums -Make the most of your albums and personalize them to your preferences with these -simple yet effective features. +## Preserving folder structure + +When you upload photos and videos into Ente using the desktop app - whether by +dragging and dropping a folder or zip file (or selecting it in the "Upload" +selector), or by setting up a [folder watch](/photos/features/watch-folders) - +the app will provide you various options. + +### Uploading files or a folder without nesting + +If you are trying to just upload some files, then the app will provide you a +selector where you can choose to (a) uploads all the files to an existing Ente +album, or (b) create a new album. + +Similarly, if you upload a folder without any nested folders, than the app will +ask if you want to upload them to an existing Ente album, or create a new album. + +The app will also try to intelligently determine the name of the new album. + +### Uploading a nested folder + +If the folder you're trying to upload has nesting and you select the option to +create a new album, you will see two options - **A single album** and **Separate +albums**. + +- **Single album** will create a new Ente album with the same name as the + folder's name, and will then sync all the changes in the folder (and any + nested folders) to this single album. + +- **Separate albums** will create separate albums for each nested folder of + the selected folder, and will then sync the changes in each nested folder + separately. + +- For example, suppose you have a folder name `Photos` on your computer, and + inside that folder you have two nested folders named `New Year` and + `Summer`. In the single album mode, the app will create an Ente album named + "Photos" and put all the files from both `New Year` and `Summer` there. In + the separate album mode, the app will create two Ente albums, "New Year" and + "Summer", each only containing the respective files. + +- In separate album mode, only nested folders that have at least one file will + result in the creation of a new album – empty folders (or folders that only + contain other folders) will be ignored. ## Rename album diff --git a/docs/docs/photos/features/watch-folders.md b/docs/docs/photos/features/watch-folders.md index 10b0460957..94392c09e3 100644 --- a/docs/docs/photos/features/watch-folders.md +++ b/docs/docs/photos/features/watch-folders.md @@ -30,29 +30,11 @@ allows you to automate backups to ente's cloud. drag and drop the folder here. 3. If the folder has nesting, you will see two options - **A single album** and - **Separate albums**. - - - **Single album** will create a new Ente album with the same name as the - folder's name, and will then sync all the changes in the folder (and any - nested folders) to this single album. - - - **Separate albums** will create separate albums for each nested folder of - the selected folder, and will then sync the changes in each nested folder - separately. - - - For example, suppose you have a folder name `Photos` on your computer, and - inside that folder you have two nested folders named `New Year` and - `Summer`. In the single album mode, the app will create an Ente album - named "Photos" and put all the files from both `New Year` and `Summer` - there. In the separate album mode, the app will create two Ente albums, - "New Year" and "Summer", each only containing the respective files. - - - In separate album mode, only nested folders that have at least one file - will result in the creation of a new album – empty folders (or folders - that only contain other folders) will be ignored. + **Separate albums**. This work similarly to the + [options you see when you drag and drop a folder with nested folders](/photos/features/albums#preserving-folder-structure). 4. After choosing any of the above options, the folder will be initially synced - to ente's cloud and monitored for any changes. You can now close the dialog + to Ente's cloud and monitored for any changes. You can now close the dialog and the sync will continue in background. 5. When the app is syncing in the background it'll show a small progress status From ef7dfd5054cd4366b912f16f5cef8330443d7a19 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 21:19:15 +0530 Subject: [PATCH 0679/1179] Clarify nested --- docs/docs/photos/features/albums.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/docs/photos/features/albums.md b/docs/docs/photos/features/albums.md index 47156e5052..2163efde38 100644 --- a/docs/docs/photos/features/albums.md +++ b/docs/docs/photos/features/albums.md @@ -48,6 +48,12 @@ albums**. result in the creation of a new album – empty folders (or folders that only contain other folders) will be ignored. +> [!NOTE] +> +> Ente albums cannot be nested currently. That is, in the **separate album** +> mode described above, Ente will create a separate album for each nested +> folder, but these Ente albums themselves will not be nested. + ## Rename album Personalize your albums by giving them a meaningful name. From 4c1a2b88a2cab581517a5d0f11d4b9a2b80b5995 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 21:32:05 +0530 Subject: [PATCH 0680/1179] [docs] Remove stale question about magic search Not sure if this distinction is relevant anymore. --- docs/docs/photos/faq/general.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/docs/photos/faq/general.md b/docs/docs/photos/faq/general.md index b95b7c1d9d..db8fd18c4e 100644 --- a/docs/docs/photos/faq/general.md +++ b/docs/docs/photos/faq/general.md @@ -98,13 +98,6 @@ Yes, when you drag and drop the folder onto the desktop app, the app will detect the multiple folders and prompt you to choose whether you want to create a single album or separate albums for each folder. -## What is the difference between **Magic** and **Content** search results on the desktop? - -**Magic** is where you can search for long queries. Like, "baby in red dress", -or "dog playing at the beach". - -**Content** is where you can search for single-words. Like, "car" or "pizza". - ## How do I identify which files experienced upload issues within the desktop app? Check the sections within the upload progress bar for "Failed Uploads," "Ignored From 7485c4a02f648f9ed15fef1754ecedd47a64714f Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 21:36:15 +0530 Subject: [PATCH 0681/1179] [docs] Update answer --- docs/docs/photos/faq/general.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/photos/faq/general.md b/docs/docs/photos/faq/general.md index b95b7c1d9d..5c3045b6fa 100644 --- a/docs/docs/photos/faq/general.md +++ b/docs/docs/photos/faq/general.md @@ -82,9 +82,9 @@ in Ente will be similar to the original file sizes you have. ## Can I add photos from a shared album to albums that I created in Ente? -Currently, Ente does not support adding photos from a shared album to your -personal albums. If you want to include photos from a shared album in your own -albums, you will need to ask the owner of the photos to add them to your album. +On Ente's mobile apps, you can add photos from an album that's shared with you, +into one of your own albums. This will create a copy of the item that you fully +own, and will count against your storage quota. ## How do I ensure that the Ente desktop app stays up to date on my system? From fd4026f27af5c688ac9e80bb3127068702f68ff9 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 21:43:25 +0530 Subject: [PATCH 0682/1179] [doc] Update information about lost password + recovery key --- docs/docs/photos/faq/security-and-privacy.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/docs/photos/faq/security-and-privacy.md b/docs/docs/photos/faq/security-and-privacy.md index 51839e0325..306f167483 100644 --- a/docs/docs/photos/faq/security-and-privacy.md +++ b/docs/docs/photos/faq/security-and-privacy.md @@ -57,11 +57,15 @@ in the unlikely event of a server breach, your data remains protected. ### What happens if I forget my password? -You can reset your password using your recovery key. This key is a randomly -generated string provided to you during account creation. Store it securely, as -it's your lifeline if you forget your password. If you lose both your password -and recovery key, we cannot recover your account or data due to our -zero-knowledge architecture. +You can reset your password using your recovery key that was provided to you +during account creation. Please store this key securely, as it's your lifeline +if you forget your password. + +If you lose both your password and recovery key, we cannot recover your account +or data due to our end-to-end encrypted architecture. + +If you wish to delete your account in such scenarios, please reach out to +support@ente.io and we will help you out. ### Can I change my password? From 8813b0cf1c0458c7f2c94f59c289964ffb4828c7 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 26 Aug 2024 21:50:04 +0530 Subject: [PATCH 0683/1179] [meta] Run PRs lint checks for pull requests from external forks Currently, for PRs opened by external contributors, the various lint checks don't run (sometimes causing code that fails basic lint checks to be committed to main). From my current understanding (I find the docs around this confusing), we need to instead use the "pull_request" target. Refs: * https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request * https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/ Note that even then, we will need a manual step to approve running the lints for first time contributors. Which is fine, at least we'll see the option, unlike right now where they just can't be run until the code hits main. --- .github/workflows/auth-lint.yml | 5 ++--- .github/workflows/desktop-lint.yml | 5 ++--- .github/workflows/docs-verify-build.yml | 5 ++--- .github/workflows/infra-lint-staff.yml | 5 ++--- .github/workflows/mobile-lint.yml | 5 ++--- .github/workflows/server-lint.yml | 5 ++--- .github/workflows/web-lint.yml | 5 ++--- 7 files changed, 14 insertions(+), 21 deletions(-) diff --git a/.github/workflows/auth-lint.yml b/.github/workflows/auth-lint.yml index b3b302a32e..4518c542da 100644 --- a/.github/workflows/auth-lint.yml +++ b/.github/workflows/auth-lint.yml @@ -1,9 +1,8 @@ name: "Lint (auth)" on: - # Run on every push to a branch other than main that changes auth/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes auth/ + pull_request: paths: - "auth/**" - ".github/workflows/auth-lint.yml" diff --git a/.github/workflows/desktop-lint.yml b/.github/workflows/desktop-lint.yml index d1cfda884d..0c24a081ff 100644 --- a/.github/workflows/desktop-lint.yml +++ b/.github/workflows/desktop-lint.yml @@ -1,9 +1,8 @@ name: "Lint (desktop)" on: - # Run on every push to a branch other than main that changes desktop/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes desktop/ + pull_request: paths: - "desktop/**" - ".github/workflows/desktop-lint.yml" diff --git a/.github/workflows/docs-verify-build.yml b/.github/workflows/docs-verify-build.yml index addb52a059..e07f9f973f 100644 --- a/.github/workflows/docs-verify-build.yml +++ b/.github/workflows/docs-verify-build.yml @@ -4,9 +4,8 @@ name: "Verify build (docs)" # succeeding before we merge the PR into main. on: - # Run on every push to a branch other than main that changes docs/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes docs/ + pull_request: paths: - "docs/**" - ".github/workflows/docs-verify-build.yml" diff --git a/.github/workflows/infra-lint-staff.yml b/.github/workflows/infra-lint-staff.yml index 5c2894281e..3f3612bd04 100644 --- a/.github/workflows/infra-lint-staff.yml +++ b/.github/workflows/infra-lint-staff.yml @@ -1,9 +1,8 @@ name: "Lint (staff)" on: - # Run on every push to a branch other than main that changes infra/staff/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes infra/staff/ + pull_request: paths: - "infra/staff/**" - ".github/workflows/infra-deploy-staff.yml" diff --git a/.github/workflows/mobile-lint.yml b/.github/workflows/mobile-lint.yml index 59bfcbbf67..0a57c0b30b 100644 --- a/.github/workflows/mobile-lint.yml +++ b/.github/workflows/mobile-lint.yml @@ -1,9 +1,8 @@ name: "Lint (mobile)" on: - # Run on every push to a branch other than main that changes mobile/ - push: - branches-ignore: [main, f-droid] + # Run on every pull request (open or push to it) that changes mobile/ + pull_request: paths: - "mobile/**" - ".github/workflows/mobile-lint.yml" diff --git a/.github/workflows/server-lint.yml b/.github/workflows/server-lint.yml index 3b0cbc855f..2f126899ff 100644 --- a/.github/workflows/server-lint.yml +++ b/.github/workflows/server-lint.yml @@ -1,9 +1,8 @@ name: "Lint (server)" on: - # Run on every push to a branch other than main that changes server/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes server/ + pull_request: paths: - "server/**" - ".github/workflows/server-lint.yml" diff --git a/.github/workflows/web-lint.yml b/.github/workflows/web-lint.yml index 7f5d270029..c64463384c 100644 --- a/.github/workflows/web-lint.yml +++ b/.github/workflows/web-lint.yml @@ -1,9 +1,8 @@ name: "Lint (web)" on: - # Run on every push to a branch other than main that changes web/ - push: - branches-ignore: [main] + # Run on every pull request (open or push to it) that changes web/ + pull_request: paths: - "web/**" - ".github/workflows/web-lint.yml" From 58575a2dc75df1826a01f9dcbd132bf4dce91c46 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:25:33 +0530 Subject: [PATCH 0684/1179] [mob] Update version v0.9.30 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index df11aca679..b13a3237f0 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.29+929 +version: 0.9.30+930 publish_to: none environment: From 2f0cef6ab9d8593607fe1c4d594271ff99b7413e Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Mon, 26 Aug 2024 22:32:44 +0530 Subject: [PATCH 0685/1179] [docs] Add FAQ --- docs/docs/photos/faq/subscription.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/docs/photos/faq/subscription.md b/docs/docs/photos/faq/subscription.md index 56724fe3eb..99302437aa 100644 --- a/docs/docs/photos/faq/subscription.md +++ b/docs/docs/photos/faq/subscription.md @@ -137,6 +137,29 @@ upgrade to the 200 GB yearly plan, then The same applies to monthly plans. +## What happens when I downgrade my plan? + +Your new plan will go into effect immediately. Any extra amount you have paid +will be credited to your account. This credit will be discounted from your +future invoices. + +For example, if you are half way through the year on the 200 GB yearly plan, and +downgrade to the 50 GB yearly plan, then + +- The new 50 GB yearly plan will go into effect immediately. + +- We will calculate a credit by subtracting half the price of the 50 GB plan + from half the price of the 200 GB plan. This will be credited to your + account. + +- This credited amount will be discounted from your next invoice, which will + be due in half a year. + +The same applies to monthly plans. + +If you prefer to have this credit refunded to your original payment method, +please contact support@ente.io, and we'll assist you. + ## Is there an x GB plan? We have experimented quite a bit and have found it hard to design a single From 8f5f1a22ee1563c32a117d8b45491d198e35f80c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 26 Aug 2024 20:28:42 +0530 Subject: [PATCH 0686/1179] [auth] Fix Aegis import without group --- auth/lib/ui/settings/data/import/aegis_import.dart | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/auth/lib/ui/settings/data/import/aegis_import.dart b/auth/lib/ui/settings/data/import/aegis_import.dart index 2360adb723..cf2567ebe4 100644 --- a/auth/lib/ui/settings/data/import/aegis_import.dart +++ b/auth/lib/ui/settings/data/import/aegis_import.dart @@ -129,8 +129,10 @@ Future _processAegisExportFile( } final Map groupIDToName = {}; try { - for (var item in aegisDB?['groups']) { - groupIDToName[item['uuid']] = item['name']; + if (aegisDB?['groups'] != null) { + for (var item in aegisDB?['groups']) { + groupIDToName[item['uuid']] = item['name']; + } } } catch (e) { Logger("AegisImport").warning("Failed to parse groups", e); @@ -149,9 +151,11 @@ Future _processAegisExportFile( var digits = item['info']['digits']; var counter = item['info']['counter']; - for (var group in item['groups']) { - if (groupIDToName.containsKey(group)) { - tags.add(groupIDToName[group]!); + if (item['groups'] != null) { + for (var group in item['groups']) { + if (groupIDToName.containsKey(group)) { + tags.add(groupIDToName[group]!); + } } } // Build the OTP URL From 248d8e09a9384fb4dafc599f58d98300023a0ade Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 09:46:53 +0530 Subject: [PATCH 0687/1179] [desktop] Create ffmpeg universal binaries for macOS Tested locally, still need to run it as a GitHub action to verify that it is working as intended. Refs: - https://www.npmjs.com/package/ffmpeg-static#electron--other-cross-platform-packaging-tools - https://github.com/eugeneware/ffmpeg-static/issues/35 - https://github.com/eugeneware/ffmpeg-static/issues/136 --- desktop/.github/workflows/desktop-release.yml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index c8fccdaf7f..02ab7c7e65 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -60,6 +60,31 @@ jobs: - name: Install dependencies run: yarn install + - name: Create universal ffmpeg binaries for macOS + if: startsWith(matrix.os, 'ubuntu') + # Currently, the ffmpeg-static binaries are not universal (Not + # their fault, we thank them for their useful package, the issue + # is that there don't seem to be well known upstream sources that + # provide a universal binary). + # + # As a workaround, we invoke ffmpeg-static twice to download both + # the Intel and ARM binaries, and combine them into a single + # universal binary using lipo. + # + # Note that the yarn install will run again, as part of the + # "build:ci" step, so we're relying on ffmpeg-static install.js's + # behaviour of not overwriting the existing file named `ffmpeg`. + run: | + rm -f node_modules/ffmpeg-static/ffmpeg + npm rebuild --arch=arm64 -f ffmpeg-static + mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg-arm64 + npm rebuild --arch=x64 -f ffmpeg-static + mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg-x64 + cd node_modules/ffmpeg-static/ + lipo -create ffmpeg-arm64 ffmpeg-x64 -output ffmpeg + rm ffmpeg-arm64 ffmpeg-x64 + file ffmpeg # print what we ended up with + - name: Install libarchive-tools for pacman build if: startsWith(matrix.os, 'ubuntu') # See: From 706bb122731c8aceab72882e1423086a667716cd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:00:06 +0530 Subject: [PATCH 0688/1179] [server] Log slow replication --- server/pkg/controller/replication3.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server/pkg/controller/replication3.go b/server/pkg/controller/replication3.go index bacb2b4f99..2154ed553d 100644 --- a/server/pkg/controller/replication3.go +++ b/server/pkg/controller/replication3.go @@ -26,6 +26,11 @@ import ( "github.com/spf13/viper" ) +const ( + slowUploadThreshold = 2 * time.Second + slowSpeedThreshold = 0.5 // MB/s +) + // ReplicationController3 oversees version 3 of our object replication. // // The user's encrypted data starts off in 1 hot storage (Backblaze "b2"). This @@ -423,6 +428,7 @@ type UploadInput struct { // Upload, verify and then update the DB to mark replication to dest. func (c *ReplicationController3) replicateFile(in *UploadInput, dest *UploadDestination, dbUpdateCopies func() error) error { + start := time.Now() logger := in.Logger.WithFields(log.Fields{ "destination": dest.Label, "bucket": *dest.Bucket, @@ -438,6 +444,19 @@ func (c *ReplicationController3) replicateFile(in *UploadInput, dest *UploadDest if err != nil { return failure(stacktrace.Propagate(err, "Failed to upload object")) } + // log if time taken is more than 2 seconds and speed is less than .5MB/s + if dest.Label == "wasabi" && time.Since(start) > slowUploadThreshold { + elapsed := time.Since(start) + uploadSpeedMBps := float64(in.ExpectedSize) / (elapsed.Seconds() * 1024 * 1024) + + if uploadSpeedMBps < slowSpeedThreshold { + logger.WithFields(log.Fields{ + "sizeBytes": in.ExpectedSize, + "speedMBps": uploadSpeedMBps, + "elapsedSecs": elapsed.Seconds(), + }).Infof("Slow replication upload to %s: %.2f seconds, speed: %.2f MB/s", dest.Label, elapsed.Seconds(), uploadSpeedMBps) + } + } err = c.verifyUploadedFileSize(in, dest) if err != nil { From c1327fd8aa313b571ec62b978976a371be972cda Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 10:02:45 +0530 Subject: [PATCH 0689/1179] [desktop] Fix action Fix for https://github.com/ente-io/ente/pull/2965 --- desktop/.github/workflows/desktop-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index 02ab7c7e65..61465ac5a9 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -61,7 +61,7 @@ jobs: run: yarn install - name: Create universal ffmpeg binaries for macOS - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'macos') # Currently, the ffmpeg-static binaries are not universal (Not # their fault, we thank them for their useful package, the issue # is that there don't seem to be well known upstream sources that From 65497862eadddcd0c5e87c73532761864c667da7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:48:56 +0530 Subject: [PATCH 0690/1179] [server] Remove unused endpoint --- server/cmd/museum/main.go | 1 - server/pkg/api/user.go | 14 +-------- server/pkg/controller/user/user_details.go | 35 ---------------------- 3 files changed, 1 insertion(+), 49 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 0536871755..3391b43ecc 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -483,7 +483,6 @@ func main() { privateAPI.GET("/users/payment-token", userHandler.GetPaymentToken) privateAPI.GET("/users/families-token", userHandler.GetFamiliesToken) privateAPI.GET("/users/accounts-token", userHandler.GetAccountsToken) - privateAPI.GET("/users/details", userHandler.GetDetails) privateAPI.GET("/users/details/v2", userHandler.GetDetailsV2) privateAPI.POST("/users/change-email", userHandler.ChangeEmail) privateAPI.GET("/users/sessions", userHandler.GetActiveSessions) diff --git a/server/pkg/api/user.go b/server/pkg/api/user.go index 51a3516975..c02fce36c7 100644 --- a/server/pkg/api/user.go +++ b/server/pkg/api/user.go @@ -54,18 +54,6 @@ func (h *UserHandler) Logout(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } -// GetDetails returns details about the requesting user -func (h *UserHandler) GetDetails(c *gin.Context) { - details, err := h.UserController.GetDetails(c) - if err != nil { - handler.Error(c, stacktrace.Propagate(err, "")) - return - } - c.JSON(http.StatusOK, gin.H{ - "details": details, - }) -} - // GetDetailsV2 returns details about the requesting user func (h *UserHandler) GetDetailsV2(c *gin.Context) { userID := auth.GetUserID(c.Request.Header) @@ -188,7 +176,7 @@ func (h *UserHandler) GetSessionValidityV2(c *gin.Context) { keyAttributes, err := h.UserController.GetAttributes(userID) if err == nil { c.JSON(http.StatusOK, gin.H{ - "hasSetKeys": true, + "hasSetKeys": true, "keyAttributes": keyAttributes, }) } else { diff --git a/server/pkg/controller/user/user_details.go b/server/pkg/controller/user/user_details.go index 08d3ad016c..cce7ef1392 100644 --- a/server/pkg/controller/user/user_details.go +++ b/server/pkg/controller/user/user_details.go @@ -4,7 +4,6 @@ import ( "github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente/details" bonus "github.com/ente-io/museum/ente/storagebonus" - "github.com/ente-io/museum/pkg/utils/auth" "github.com/ente-io/museum/pkg/utils/recover" "github.com/ente-io/museum/pkg/utils/time" "github.com/ente-io/stacktrace" @@ -12,40 +11,6 @@ import ( "golang.org/x/sync/errgroup" ) -func (c *UserController) GetDetails(ctx *gin.Context) (details.UserDetailsResponse, error) { - - enteApp := ctx.MustGet("app").(ente.App) - - userID := auth.GetUserID(ctx.Request.Header) - user, err := c.UserRepo.Get(userID) - if err != nil { - return details.UserDetailsResponse{}, stacktrace.Propagate(err, "") - } - usage, err := c.FileRepo.GetUsage(userID) - if err != nil { - return details.UserDetailsResponse{}, stacktrace.Propagate(err, "") - } - fileCount, err := c.FileRepo.GetFileCountForUser(userID, enteApp) - if err != nil { - return details.UserDetailsResponse{}, stacktrace.Propagate(err, "") - } - sharedCollectionsCount, err := c.CollectionRepo.GetSharedCollectionsCount(userID) - if err != nil { - return details.UserDetailsResponse{}, stacktrace.Propagate(err, "") - } - subscription, err := c.BillingController.GetSubscription(ctx, userID) - if err != nil { - return details.UserDetailsResponse{}, stacktrace.Propagate(err, "") - } - return details.UserDetailsResponse{ - Email: user.Email, - Usage: usage, - FileCount: &fileCount, - SharedCollectionsCount: &sharedCollectionsCount, - Subscription: subscription, - }, nil -} - func (c *UserController) getUserFileCountWithCache(userID int64, app ente.App) (int64, error) { // Check if the value is present in the cache if count, ok := c.UserCache.GetFileCount(userID, app); ok { From 7129b2822b7d829c35ac14c3f055cd26d73da3a4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 10:40:18 +0530 Subject: [PATCH 0691/1179] [desktop] Fix macOS universal binaries The previous approach worked, but we ran into some other issues Uncaught Exception: Error: Cannot find module 'ajv/dist/compile/codegen' Require stack: - /Applications/ente.app/Contents/Resources/app.asar/node_modules/ajv-formats/dist/limit.js As an alternative, try to use the yarn equivalent(-ish). --- desktop/.github/workflows/desktop-release.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index 61465ac5a9..5590083a20 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -76,14 +76,13 @@ jobs: # behaviour of not overwriting the existing file named `ffmpeg`. run: | rm -f node_modules/ffmpeg-static/ffmpeg - npm rebuild --arch=arm64 -f ffmpeg-static - mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg-arm64 - npm rebuild --arch=x64 -f ffmpeg-static - mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg-x64 - cd node_modules/ffmpeg-static/ - lipo -create ffmpeg-arm64 ffmpeg-x64 -output ffmpeg + npm_config_arch=arm64 yarn add --check-files ffmpeg-static + mv node_modules/ffmpeg-static/ffmpeg ffmpeg-arm64 + npm_config_arch=x64 yarn add --check-files ffmpeg-static + mv node_modules/ffmpeg-static/ffmpeg ffmpeg-x64 + lipo -create ffmpeg-arm64 ffmpeg-x64 -output node_modules/ffmpeg-static/ffmpeg rm ffmpeg-arm64 ffmpeg-x64 - file ffmpeg # print what we ended up with + file node_modules/ffmpeg-static/ffmpeg # print what we ended up with - name: Install libarchive-tools for pacman build if: startsWith(matrix.os, 'ubuntu') From f67516f696098eab6d89db2143a165d24176ee01 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:56:56 +0530 Subject: [PATCH 0692/1179] [server] Remove duplicate code --- server/pkg/controller/user/user_details.go | 23 +--------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/server/pkg/controller/user/user_details.go b/server/pkg/controller/user/user_details.go index cce7ef1392..703b8fb2f5 100644 --- a/server/pkg/controller/user/user_details.go +++ b/server/pkg/controller/user/user_details.go @@ -11,27 +11,6 @@ import ( "golang.org/x/sync/errgroup" ) -func (c *UserController) getUserFileCountWithCache(userID int64, app ente.App) (int64, error) { - // Check if the value is present in the cache - if count, ok := c.UserCache.GetFileCount(userID, app); ok { - // Cache hit, update the cache asynchronously - go func() { - _, _ = c.getUserCountAndUpdateCache(userID, app) - }() - return count, nil - } - return c.getUserCountAndUpdateCache(userID, app) -} - -func (c *UserController) getUserCountAndUpdateCache(userID int64, app ente.App) (int64, error) { - count, err := c.FileRepo.GetFileCountForUser(userID, app) - if err != nil { - return 0, stacktrace.Propagate(err, "") - } - c.UserCache.SetFileCount(userID, count, app) - return count, nil -} - func (c *UserController) GetDetailsV2(ctx *gin.Context, userID int64, fetchMemoryCount bool, app ente.App) (details.UserDetailsResponse, error) { g := new(errgroup.Group) @@ -86,7 +65,7 @@ func (c *UserController) GetDetailsV2(ctx *gin.Context, userID int64, fetchMemor if fetchMemoryCount { g.Go(func() error { - fCount, err := c.getUserFileCountWithCache(userID, app) + fCount, err := c.UserCacheController.GetUserFileCountWithCache(userID, app) if err == nil { fileCount = fCount } From 9334540e1ee4273c5af5296b0b80ade90a1c41a4 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:14:34 +0530 Subject: [PATCH 0693/1179] [server] Rename --- server/pkg/api/admin.go | 6 +++--- server/pkg/controller/offer/offer.go | 2 +- server/pkg/repo/storagebonus/bf_addon.go | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index f1006a1d6b..82e550f5c1 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -473,11 +473,11 @@ func (h *AdminHandler) UpdateBFDeal(c *gin.Context) { var err error switch r.Action { case ente.ADD: - err = h.StorageBonusRepo.InsertBFBonus(c, r.UserID, validTill, storage) + err = h.StorageBonusRepo.InsertAddOnBonus(c, r.UserID, validTill, storage) case ente.UPDATE: - err = h.StorageBonusRepo.UpdateBFBonus(c, r.UserID, validTill, storage) + err = h.StorageBonusRepo.UpdateAddOnBonus(c, r.UserID, validTill, storage) case ente.REMOVE: - _, err = h.StorageBonusRepo.RemoveBFBonus(c, r.UserID) + _, err = h.StorageBonusRepo.RemoveAddOnBonus(c, r.UserID) } if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/controller/offer/offer.go b/server/pkg/controller/offer/offer.go index 44f1bce587..81b78d206f 100644 --- a/server/pkg/controller/offer/offer.go +++ b/server/pkg/controller/offer/offer.go @@ -105,7 +105,7 @@ func (c *OfferController) ApplyOffer(email string, productID string) error { } } - err = c.StorageBonusRepo.InsertBFBonus(context.Background(), userID, validTill, offerToBeApplied.Storage) + err = c.StorageBonusRepo.InsertAddOnBonus(context.Background(), userID, validTill, offerToBeApplied.Storage) if err != nil { c.DiscordController.Notify("Error inserting bonus") return stacktrace.Propagate(err, "") diff --git a/server/pkg/repo/storagebonus/bf_addon.go b/server/pkg/repo/storagebonus/bf_addon.go index 876d4b0b63..25b69add09 100644 --- a/server/pkg/repo/storagebonus/bf_addon.go +++ b/server/pkg/repo/storagebonus/bf_addon.go @@ -6,7 +6,7 @@ import ( "github.com/ente-io/museum/ente/storagebonus" ) -func (r *Repository) InsertBFBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { +func (r *Repository) InsertAddOnBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) _, err := r.DB.ExecContext(ctx, "INSERT INTO storage_bonus (bonus_id, user_id, storage, type, valid_till) VALUES ($1, $2, $3, $4, $5)", bonusID, userID, storage, storagebonus.AddOnBf2023, validTill) if err != nil { @@ -15,7 +15,7 @@ func (r *Repository) InsertBFBonus(ctx context.Context, userID int64, validTill return nil } -func (r *Repository) RemoveBFBonus(ctx context.Context, userID int64) (int64, error) { +func (r *Repository) RemoveAddOnBonus(ctx context.Context, userID int64) (int64, error) { bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) res, err := r.DB.ExecContext(ctx, "DELETE FROM storage_bonus WHERE bonus_id = $1", bonusID) if err != nil { @@ -24,7 +24,7 @@ func (r *Repository) RemoveBFBonus(ctx context.Context, userID int64) (int64, er return res.RowsAffected() } -func (r *Repository) UpdateBFBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { +func (r *Repository) UpdateAddOnBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) _, err := r.DB.ExecContext(ctx, "UPDATE storage_bonus SET storage = $1, valid_till = $2 WHERE bonus_id = $3", storage, validTill, bonusID) if err != nil { From e0eda79a919e0486f0f4458721ee5f2075aef53b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:20:27 +0530 Subject: [PATCH 0694/1179] [server] Refactor --- server/pkg/api/admin.go | 7 ++++--- server/pkg/controller/offer/offer.go | 3 ++- server/pkg/repo/storagebonus/bf_addon.go | 12 ++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 82e550f5c1..53be188779 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -10,6 +10,7 @@ import ( "github.com/ente-io/museum/pkg/controller/family" + bonusEntity "github.com/ente-io/museum/ente/storagebonus" "github.com/ente-io/museum/pkg/repo/storagebonus" gTime "time" @@ -473,11 +474,11 @@ func (h *AdminHandler) UpdateBFDeal(c *gin.Context) { var err error switch r.Action { case ente.ADD: - err = h.StorageBonusRepo.InsertAddOnBonus(c, r.UserID, validTill, storage) + err = h.StorageBonusRepo.InsertAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID, validTill, storage) case ente.UPDATE: - err = h.StorageBonusRepo.UpdateAddOnBonus(c, r.UserID, validTill, storage) + err = h.StorageBonusRepo.UpdateAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID, validTill, storage) case ente.REMOVE: - _, err = h.StorageBonusRepo.RemoveAddOnBonus(c, r.UserID) + _, err = h.StorageBonusRepo.RemoveAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID) } if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/controller/offer/offer.go b/server/pkg/controller/offer/offer.go index 81b78d206f..65679f0906 100644 --- a/server/pkg/controller/offer/offer.go +++ b/server/pkg/controller/offer/offer.go @@ -10,6 +10,7 @@ import ( "github.com/ente-io/museum/pkg/controller/usercache" "github.com/ente-io/museum/ente" + storeageBonusEntity "github.com/ente-io/museum/ente/storagebonus" "github.com/ente-io/museum/pkg/controller/discord" "github.com/ente-io/museum/pkg/repo" "github.com/ente-io/museum/pkg/repo/storagebonus" @@ -105,7 +106,7 @@ func (c *OfferController) ApplyOffer(email string, productID string) error { } } - err = c.StorageBonusRepo.InsertAddOnBonus(context.Background(), userID, validTill, offerToBeApplied.Storage) + err = c.StorageBonusRepo.InsertAddOnBonus(context.Background(), storeageBonusEntity.AddOnBf2023, userID, validTill, offerToBeApplied.Storage) if err != nil { c.DiscordController.Notify("Error inserting bonus") return stacktrace.Propagate(err, "") diff --git a/server/pkg/repo/storagebonus/bf_addon.go b/server/pkg/repo/storagebonus/bf_addon.go index 25b69add09..a057025486 100644 --- a/server/pkg/repo/storagebonus/bf_addon.go +++ b/server/pkg/repo/storagebonus/bf_addon.go @@ -6,8 +6,8 @@ import ( "github.com/ente-io/museum/ente/storagebonus" ) -func (r *Repository) InsertAddOnBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { - bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) +func (r *Repository) InsertAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error { + bonusID := fmt.Sprintf("%s-%d", bonusType, userID) _, err := r.DB.ExecContext(ctx, "INSERT INTO storage_bonus (bonus_id, user_id, storage, type, valid_till) VALUES ($1, $2, $3, $4, $5)", bonusID, userID, storage, storagebonus.AddOnBf2023, validTill) if err != nil { return err @@ -15,8 +15,8 @@ func (r *Repository) InsertAddOnBonus(ctx context.Context, userID int64, validTi return nil } -func (r *Repository) RemoveAddOnBonus(ctx context.Context, userID int64) (int64, error) { - bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) +func (r *Repository) RemoveAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64) (int64, error) { + bonusID := fmt.Sprintf("%s-%d", bonusType, userID) res, err := r.DB.ExecContext(ctx, "DELETE FROM storage_bonus WHERE bonus_id = $1", bonusID) if err != nil { return 0, err @@ -24,8 +24,8 @@ func (r *Repository) RemoveAddOnBonus(ctx context.Context, userID int64) (int64, return res.RowsAffected() } -func (r *Repository) UpdateAddOnBonus(ctx context.Context, userID int64, validTill int64, storage int64) error { - bonusID := fmt.Sprintf("%s-%d", storagebonus.AddOnBf2023, userID) +func (r *Repository) UpdateAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error { + bonusID := fmt.Sprintf("%s-%d", bonusType, userID) _, err := r.DB.ExecContext(ctx, "UPDATE storage_bonus SET storage = $1, valid_till = $2 WHERE bonus_id = $3", storage, validTill, bonusID) if err != nil { return err From bf7f1d43c0a5190854b8b5c6766791c1f0a01260 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:26:59 +0530 Subject: [PATCH 0695/1179] [server] Update endpoint --- server/cmd/museum/main.go | 2 +- server/ente/admin.go | 8 ++++---- server/pkg/api/admin.go | 4 ++-- server/pkg/repo/storagebonus/bf_addon.go | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 3391b43ecc..c9144a30b9 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -653,7 +653,7 @@ func main() { adminAPI.POST("/emails-from-hashes", adminHandler.GetEmailsFromHashes) adminAPI.PUT("/user/subscription", adminHandler.UpdateSubscription) adminAPI.POST("/queue/re-queue", adminHandler.ReQueueItem) - adminAPI.POST("/user/bf-2013", adminHandler.UpdateBFDeal) + adminAPI.POST("/user/bonus", adminHandler.UpdateBonus) adminAPI.POST("/job/clear-orphan-objects", adminHandler.ClearOrphanObjects) userEntityController := &userEntityCtrl.Controller{Repo: userEntityRepo} diff --git a/server/ente/admin.go b/server/ente/admin.go index 828173be7f..75ab9f3b53 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -86,7 +86,7 @@ const ( UPDATE AddOnAction = "UPDATE" ) -type UpdateBlackFridayDeal struct { +type SupportUpdateBonus struct { Action AddOnAction `json:"action" binding:"required"` UserID int64 `json:"userID" binding:"required"` Year int `json:"year"` @@ -96,15 +96,15 @@ type UpdateBlackFridayDeal struct { Minute int64 `json:"minute"` } -func (u UpdateBlackFridayDeal) UpdateLog() string { +func (u SupportUpdateBonus) UpdateLog() string { if u.Testing { - return fmt.Sprintf("BF_UPDATE_TESTING: %s, storageInMB: %d, minute: %d", u.Action, u.StorageInMB, u.Minute) + return fmt.Sprintf("SupportUpdateBonus: %s, storageInMB: %d, minute: %d", u.Action, u.StorageInMB, u.Minute) } else { return fmt.Sprintf("BF_UPDATE: %s, storageInGB: %d, year: %d", u.Action, u.StorageInGB, u.Year) } } -func (u UpdateBlackFridayDeal) Validate() error { +func (u SupportUpdateBonus) Validate() error { if u.Action == ADD || u.Action == UPDATE { if u.Testing { if u.StorageInMB == 0 && u.Minute == 0 { diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 53be188779..6e301df7e1 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -452,8 +452,8 @@ func (h *AdminHandler) ReQueueItem(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } -func (h *AdminHandler) UpdateBFDeal(c *gin.Context) { - var r ente.UpdateBlackFridayDeal +func (h *AdminHandler) UpdateBonus(c *gin.Context) { + var r ente.SupportUpdateBonus if err := c.ShouldBindJSON(&r); err != nil { handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Bad request")) return diff --git a/server/pkg/repo/storagebonus/bf_addon.go b/server/pkg/repo/storagebonus/bf_addon.go index a057025486..edaca9b52b 100644 --- a/server/pkg/repo/storagebonus/bf_addon.go +++ b/server/pkg/repo/storagebonus/bf_addon.go @@ -7,6 +7,9 @@ import ( ) func (r *Repository) InsertAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error { + if err := _validate(bonusType); err != nil { + return err + } bonusID := fmt.Sprintf("%s-%d", bonusType, userID) _, err := r.DB.ExecContext(ctx, "INSERT INTO storage_bonus (bonus_id, user_id, storage, type, valid_till) VALUES ($1, $2, $3, $4, $5)", bonusID, userID, storage, storagebonus.AddOnBf2023, validTill) if err != nil { @@ -16,6 +19,9 @@ func (r *Repository) InsertAddOnBonus(ctx context.Context, bonusType storagebonu } func (r *Repository) RemoveAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64) (int64, error) { + if err := _validate(bonusType); err != nil { + return 0, err + } bonusID := fmt.Sprintf("%s-%d", bonusType, userID) res, err := r.DB.ExecContext(ctx, "DELETE FROM storage_bonus WHERE bonus_id = $1", bonusID) if err != nil { @@ -25,6 +31,9 @@ func (r *Repository) RemoveAddOnBonus(ctx context.Context, bonusType storagebonu } func (r *Repository) UpdateAddOnBonus(ctx context.Context, bonusType storagebonus.BonusType, userID int64, validTill int64, storage int64) error { + if err := _validate(bonusType); err != nil { + return err + } bonusID := fmt.Sprintf("%s-%d", bonusType, userID) _, err := r.DB.ExecContext(ctx, "UPDATE storage_bonus SET storage = $1, valid_till = $2 WHERE bonus_id = $3", storage, validTill, bonusID) if err != nil { @@ -32,3 +41,10 @@ func (r *Repository) UpdateAddOnBonus(ctx context.Context, bonusType storagebonu } return nil } + +func _validate(bonusType storagebonus.BonusType) error { + if bonusType == storagebonus.AddOnBf2023 || bonusType == storagebonus.AddOnSupport { + return nil + } + return fmt.Errorf("invalid bonus type: %s", bonusType) +} From 0925f7f0a2f3c848bd79c3cc8031ebab0f238f61 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:32:48 +0530 Subject: [PATCH 0696/1179] [server] Allow adding support bonus --- server/ente/admin.go | 14 ++++++++++++-- server/ente/storagebonus/storge_bonus.go | 15 +++++++++++++++ server/pkg/api/admin.go | 7 ++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/server/ente/admin.go b/server/ente/admin.go index 75ab9f3b53..3990635324 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -87,6 +87,7 @@ const ( ) type SupportUpdateBonus struct { + BonusType string `json:"bonusType" binding:"required"` Action AddOnAction `json:"action" binding:"required"` UserID int64 `json:"userID" binding:"required"` Year int `json:"year"` @@ -105,17 +106,26 @@ func (u SupportUpdateBonus) UpdateLog() string { } func (u SupportUpdateBonus) Validate() error { + isSupportBonus := u.BonusType == "ADD_ON_SUPPORT" + if u.BonusType != "ADD_ON_SUPPORT" && u.BonusType != "ADD_ON_BF_2023" { + return errors.New("invalid bonus type") + } if u.Action == ADD || u.Action == UPDATE { if u.Testing { if u.StorageInMB == 0 && u.Minute == 0 { return errors.New("invalid input, set in MB and minute for test") } } else { - if u.StorageInGB != 100 && u.StorageInGB != 2000 && u.StorageInGB != 500 { + if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 500 { return errors.New("invalid input for deal, only 100, 500, 2000 allowed") } - if u.Year != 3 && u.Year != 5 { + if isSupportBonus { + if u.Year == 0 || u.Year > 100 { + return errors.New("invalid input for year, only 1-100") + } + } else if u.Year != 3 && u.Year != 5 { return errors.New("invalid input for year, only 3 or 5") + } } } diff --git a/server/ente/storagebonus/storge_bonus.go b/server/ente/storagebonus/storge_bonus.go index 9a876fb4d7..6ea63386a0 100644 --- a/server/ente/storagebonus/storge_bonus.go +++ b/server/ente/storagebonus/storge_bonus.go @@ -34,6 +34,21 @@ func (t BonusType) ExtendsExpiry() bool { } } +func BonusFromType(bonusType string) BonusType { + switch bonusType { + case "REFERRAL": + return Referral + case "SIGN_UP": + return SignUp + case "ADD_ON_SUPPORT": + return AddOnSupport + case "ADD_ON_BF_2023": + return AddOnBf2023 + default: + return "" + } +} + // RestrictToDoublingStorage returns true if the bonus type restricts the doubling of storage. // This indicates, the usable bonus storage should not exceed the current plan storage. // Note: Current plan storage includes both base subscription and storage bonus that can ExtendsExpiry diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 6e301df7e1..92786c3d28 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -472,13 +472,14 @@ func (h *AdminHandler) UpdateBonus(c *gin.Context) { validTill = gTime.Now().AddDate(r.Year, 0, 0).UnixMicro() } var err error + bonusType := bonusEntity.BonusType(r.BonusType) switch r.Action { case ente.ADD: - err = h.StorageBonusRepo.InsertAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID, validTill, storage) + err = h.StorageBonusRepo.InsertAddOnBonus(c, bonusType, r.UserID, validTill, storage) case ente.UPDATE: - err = h.StorageBonusRepo.UpdateAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID, validTill, storage) + err = h.StorageBonusRepo.UpdateAddOnBonus(c, bonusType, r.UserID, validTill, storage) case ente.REMOVE: - _, err = h.StorageBonusRepo.RemoveAddOnBonus(c, bonusEntity.AddOnBf2023, r.UserID) + _, err = h.StorageBonusRepo.RemoveAddOnBonus(c, bonusType, r.UserID) } if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) From a5b289d290bcbb62a67651688a00f55babeab70e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:36:26 +0530 Subject: [PATCH 0697/1179] [server] Allow 200,1TB, & 2TB --- server/ente/admin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/ente/admin.go b/server/ente/admin.go index 3990635324..0085ae95d8 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -116,8 +116,8 @@ func (u SupportUpdateBonus) Validate() error { return errors.New("invalid input, set in MB and minute for test") } } else { - if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 500 { - return errors.New("invalid input for deal, only 100, 500, 2000 allowed") + if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 1000 { + return errors.New("invalid input for deal, only 200, 1000, 2000 allowed") } if isSupportBonus { if u.Year == 0 || u.Year > 100 { From 571d721925a3cf3c4f8f5244795347d33e21f1e8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 11:42:39 +0530 Subject: [PATCH 0698/1179] [desktop] Fix broken nightly builds due to ajv I'm not sure why it started happening now. Earlier I thought it was because of this - https://github.com/ente-io/ente/pull/2969 - but that was a red-herring (I think!), instead this likely got triggered because of https://github.com/ente-io/action-electron-builder/commit/eff78a1d33bdab4c54ede0e5cdc71e0c2cf803e2. This change fixed the issue locally, will see if it works on CI too. Workaround from: https://github.com/ajv-validator/ajv/issues/2443#issuecomment-2147026958 --- desktop/docs/dependencies.md | 4 ++++ desktop/package.json | 1 + desktop/yarn.lock | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/desktop/docs/dependencies.md b/desktop/docs/dependencies.md index 8cbf43c83d..7b11a79256 100644 --- a/desktop/docs/dependencies.md +++ b/desktop/docs/dependencies.md @@ -95,6 +95,10 @@ Some extra ones specific to the code here are: for allowing us to set environment variables in a way that also works on Windows. +- We don't need `ajv`, but it is a transitive dependency which breaks the + build if we let its version be resolved via the yarn resolution mechanism. + Taking a direct dependency on it is the easiest workaround for now. + ## Functionality ### Format conversion diff --git a/desktop/package.json b/desktop/package.json index 1a33272037..84fe052bb8 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -45,6 +45,7 @@ "@types/auto-launch": "^5.0.5", "@types/eslint__js": "^8.42.3", "@types/ffmpeg-static": "^3.0.3", + "ajv": "^8.17.1", "concurrently": "^8.2.2", "cross-env": "^7.0.3", "electron": "^30.4.0", diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 376d2c3527..1ea4bf759b 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -531,7 +531,7 @@ ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.3: +ajv@^8.0.0, ajv@^8.17.1, ajv@^8.6.3: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== From e32facf3e63d376cd53ca1cea4eb6e165bc69e94 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:01:00 +0530 Subject: [PATCH 0699/1179] [server] Refresh fileCount only if trash or usage changed --- server/cmd/museum/main.go | 4 ++- server/ente/cache/user_data_cache.go | 14 ++++++--- server/pkg/controller/usercache/controller.go | 2 ++ server/pkg/controller/usercache/count.go | 29 +++++++++++++++---- server/pkg/repo/trash.go | 10 +++++++ 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 3391b43ecc..2d60a970e9 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -188,7 +188,9 @@ func main() { } userCache := cache2.NewUserCache() - userCacheCtrl := &usercache.Controller{UserCache: userCache, FileRepo: fileRepo, StoreBonusRepo: storagBonusRepo} + userCacheCtrl := &usercache.Controller{UserCache: userCache, FileRepo: fileRepo, + UsageRepo: usageRepo, TrashRepo: trashRepo, + StoreBonusRepo: storagBonusRepo} offerController := offer.NewOfferController(*userRepo, discordController, storagBonusRepo, userCacheCtrl) plans := billing.GetPlans() defaultPlan := billing.GetDefaultPlans(plans) diff --git a/server/ente/cache/user_data_cache.go b/server/ente/cache/user_data_cache.go index 45308f0663..c202d7dd7c 100644 --- a/server/ente/cache/user_data_cache.go +++ b/server/ente/cache/user_data_cache.go @@ -10,20 +10,26 @@ import ( // UserCache struct holds can be used to fileCount various entities for user. type UserCache struct { mu sync.Mutex - fileCache map[string]int64 + fileCache map[string]*FileCountCache bonusCache map[int64]*storagebonus.ActiveStorageBonus } +type FileCountCache struct { + Count int64 + TrashUpdatedAt int64 + Usage int64 +} + // NewUserCache creates a new instance of the UserCache struct. func NewUserCache() *UserCache { return &UserCache{ - fileCache: make(map[string]int64), + fileCache: make(map[string]*FileCountCache), bonusCache: make(map[int64]*storagebonus.ActiveStorageBonus), } } // SetFileCount updates the fileCount with the given userID and fileCount. -func (c *UserCache) SetFileCount(userID, fileCount int64, app ente.App) { +func (c *UserCache) SetFileCount(userID int64, fileCount *FileCountCache, app ente.App) { c.mu.Lock() defer c.mu.Unlock() c.fileCache[cacheKey(userID, app)] = fileCount @@ -44,7 +50,7 @@ func (c *UserCache) GetBonus(userID int64) (*storagebonus.ActiveStorageBonus, bo // GetFileCount retrieves the file count from the fileCount for the given userID. // It returns the file count and a boolean indicating if the value was found. -func (c *UserCache) GetFileCount(userID int64, app ente.App) (int64, bool) { +func (c *UserCache) GetFileCount(userID int64, app ente.App) (*FileCountCache, bool) { c.mu.Lock() defer c.mu.Unlock() count, ok := c.fileCache[cacheKey(userID, app)] diff --git a/server/pkg/controller/usercache/controller.go b/server/pkg/controller/usercache/controller.go index b6645653cd..efce2d11bd 100644 --- a/server/pkg/controller/usercache/controller.go +++ b/server/pkg/controller/usercache/controller.go @@ -14,6 +14,8 @@ import ( // Avoid adding any direct dependencies to the other controller. type Controller struct { FileRepo *repo.FileRepository + UsageRepo *repo.UsageRepository + TrashRepo *repo.TrashRepository StoreBonusRepo *storagebonus.Repository UserCache *cache.UserCache } diff --git a/server/pkg/controller/usercache/count.go b/server/pkg/controller/usercache/count.go index a0f3bb0435..22b5b512ca 100644 --- a/server/pkg/controller/usercache/count.go +++ b/server/pkg/controller/usercache/count.go @@ -2,7 +2,9 @@ package usercache import ( "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/ente/cache" "github.com/ente-io/stacktrace" + "github.com/sirupsen/logrus" ) func (c *Controller) GetUserFileCountWithCache(userID int64, app ente.App) (int64, error) { @@ -10,18 +12,35 @@ func (c *Controller) GetUserFileCountWithCache(userID int64, app ente.App) (int6 if count, ok := c.UserCache.GetFileCount(userID, app); ok { // Cache hit, update the cache asynchronously go func() { - _, _ = c.getUserCountAndUpdateCache(userID, app) + _, _ = c.getUserCountAndUpdateCache(userID, app, count) }() - return count, nil + return count.Count, nil } - return c.getUserCountAndUpdateCache(userID, app) + return c.getUserCountAndUpdateCache(userID, app, nil) } -func (c *Controller) getUserCountAndUpdateCache(userID int64, app ente.App) (int64, error) { +func (c *Controller) getUserCountAndUpdateCache(userID int64, app ente.App, oldCache *cache.FileCountCache) (int64, error) { + usage, err := c.UsageRepo.GetUsage(userID) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + trashUpdatedAt, err := c.TrashRepo.GetTrashUpdatedAt(userID) + if err != nil { + return 0, stacktrace.Propagate(err, "") + } + if oldCache != nil && oldCache.Usage == usage && oldCache.TrashUpdatedAt == trashUpdatedAt { + logrus.Debugf("Cache hit for user %d", userID) + return oldCache.Count, nil + } count, err := c.FileRepo.GetFileCountForUser(userID, app) if err != nil { return 0, stacktrace.Propagate(err, "") } - c.UserCache.SetFileCount(userID, count, app) + cntCache := &cache.FileCountCache{ + Count: count, + Usage: usage, + TrashUpdatedAt: trashUpdatedAt, + } + c.UserCache.SetFileCount(userID, cntCache, app) return count, nil } diff --git a/server/pkg/repo/trash.go b/server/pkg/repo/trash.go index 3d1cac2bd5..5218caf55d 100644 --- a/server/pkg/repo/trash.go +++ b/server/pkg/repo/trash.go @@ -422,6 +422,16 @@ func (t *TrashRepository) EmptyTrash(ctx context.Context, userID int64, lastUpda return t.QueueRepo.InsertItem(ctx, TrashEmptyQueue, itemID) } +func (t *TrashRepository) GetTrashUpdatedAt(userID int64) (int64, error) { + row := t.DB.QueryRow(`SELECT max(updated_at) FROM trash WHERE user_id = $1`, userID) + var updatedAt int64 + err := row.Scan(&updatedAt) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil + } + return updatedAt, stacktrace.Propagate(err, "") +} + func convertRowsToTrash(rows *sql.Rows) ([]ente.Trash, error) { defer rows.Close() trashFiles := make([]ente.Trash, 0) From 4ecc64e478e1203fd4147381d9d708bdf06254ac Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:34:36 +0530 Subject: [PATCH 0700/1179] [server] Handle case when no entry exists in trash --- server/pkg/repo/trash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/repo/trash.go b/server/pkg/repo/trash.go index 5218caf55d..1c6ab6b45f 100644 --- a/server/pkg/repo/trash.go +++ b/server/pkg/repo/trash.go @@ -423,7 +423,7 @@ func (t *TrashRepository) EmptyTrash(ctx context.Context, userID int64, lastUpda } func (t *TrashRepository) GetTrashUpdatedAt(userID int64) (int64, error) { - row := t.DB.QueryRow(`SELECT max(updated_at) FROM trash WHERE user_id = $1`, userID) + row := t.DB.QueryRow(`SELECT coalesce(max(updated_at),0) FROM trash WHERE user_id = $1`, userID) var updatedAt int64 err := row.Scan(&updatedAt) if errors.Is(err, sql.ErrNoRows) { From 80b86189d08af6d20dc5c4b057069ab1fc39453d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 12:39:51 +0530 Subject: [PATCH 0701/1179] Update the docs around ffmpeg on Intel macOS --- .../docs/photos/troubleshooting/thumbnails.md | 5 +++++ .../src/services/upload/uploadService.ts | 19 ++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/docs/photos/troubleshooting/thumbnails.md b/docs/docs/photos/troubleshooting/thumbnails.md index f26319c2e5..b4627f648b 100644 --- a/docs/docs/photos/troubleshooting/thumbnails.md +++ b/docs/docs/photos/troubleshooting/thumbnails.md @@ -22,6 +22,11 @@ canvas. ## Desktop +> [!NOTE] +> +> This issue has been fixed in the latest beta releases, and the fix will be +> also out in the next release, 1.7.4. + The only known case where thumbnails might be missing on desktop is when uploading **videos** during a Google Takeout or watched folder sync on **Intel macOS** machines. This is because the bundled ffmpeg that we use does not work diff --git a/web/apps/photos/src/services/upload/uploadService.ts b/web/apps/photos/src/services/upload/uploadService.ts index 8e7cd747e9..54239e334e 100644 --- a/web/apps/photos/src/services/upload/uploadService.ts +++ b/web/apps/photos/src/services/upload/uploadService.ts @@ -1108,22 +1108,19 @@ const withThumbnail = async ( // // We can only get here when we're running in our desktop app (since // only that works with non-File uploadItems), and the thumbnail - // generation failed. The scenarios are: + // generation failed. // - // 1. We're trying to generate an image thumbnail on Windows or on - // ARM64 Linux. This won't be possible since the bundled - // imagemagick doesn't yet support these OS/arch combinations. - // - // 2. We're trying to generate a video thumbnail on Intel macOS. - // This won't be possible since the bundled ffmpeg doesn't - // support Rosetta. - // - // 3. Some other arbitrary exception happened. + // The only know scenario is when we're trying to generate an image + // thumbnail on Windows or on ARM64 Linux, or are trying to + // generated the thumbnail for an HEIC file on Linux. This won't be + // possible since the bundled imagemagick doesn't yet support these + // OS/arch combinations. // // The fallback in this case involves reading the entire stream into // memory, and passing that data across the IPC boundary in a single // go (i.e. not in a streaming manner). This is risky for videos of - // unbounded sizes, so we can only apply this fallback for images. + // unbounded sizes, and since anyways we are not expected to come + // here for videos, soo we only apply this fallback for images. if (fileTypeInfo.fileType == FileType.image) { const data = await readEntireStream(fileStream.stream); From f3860a077e86a11316e4b683c35f9f3df2474d72 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 12:44:07 +0530 Subject: [PATCH 0702/1179] [desktop] Use latest version of our updated fork of the electron-builder action So that it refs this commit https://github.com/ente-io/action-electron-builder/commit/eff78a1d33bdab4c54ede0e5cdc71e0c2cf803e2 --- desktop/.github/workflows/desktop-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index 5590083a20..192bb50194 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -91,7 +91,7 @@ jobs: run: sudo apt-get install libarchive-tools - name: Build - uses: ente-io/action-electron-builder@v1.0.0 + uses: ente-io/action-electron-builder with: package_root: desktop build_script_name: build:ci From 13dea41c97bdce993c5168aac722bf023d25a144 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 12:54:55 +0530 Subject: [PATCH 0703/1179] [desktop] Specify an action version Apparently, specifying something after the @ is necessary. Without this, the action stopped working. --- desktop/.github/workflows/desktop-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index 192bb50194..fbaac39546 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -91,7 +91,7 @@ jobs: run: sudo apt-get install libarchive-tools - name: Build - uses: ente-io/action-electron-builder + uses: ente-io/action-electron-builder@eff78a1d33bdab4c54ede0e5cdc71e0c2cf803e2 with: package_root: desktop build_script_name: build:ci From 375260d701ce6b4a516882420c511dae74e59909 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 27 Aug 2024 10:05:31 +0200 Subject: [PATCH 0704/1179] [mob][photos] Better logging for image retrieval --- mobile/lib/utils/ml_util.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 13fb1474c7..cb9ab5d630 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -299,7 +299,8 @@ Future getImagePathForML(EnteFile enteFile) async { final stopwatch = Stopwatch()..start(); File? file; - if (enteFile.fileType == FileType.video) { + final bool isVideo = enteFile.fileType == FileType.video; + if (isVideo) { try { file = await getThumbnailForUploadedFile(enteFile); } on PlatformException catch (e, s) { @@ -328,8 +329,8 @@ Future getImagePathForML(EnteFile enteFile) async { ); if (imagePath == null) { - _logger.warning( - "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null", + _logger.severe( + "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null (isVideo: $isVideo)", ); throw CouldNotRetrieveAnyFileData(); } From d299f94518675f391f281557d17e81b11af8b032 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 27 Aug 2024 10:11:12 +0200 Subject: [PATCH 0705/1179] [mob][photos] More logs --- mobile/lib/utils/thumbnail_util.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/utils/thumbnail_util.dart b/mobile/lib/utils/thumbnail_util.dart index cd67345659..06b26c9be6 100644 --- a/mobile/lib/utils/thumbnail_util.dart +++ b/mobile/lib/utils/thumbnail_util.dart @@ -47,6 +47,7 @@ Future getThumbnail(EnteFile file) async { Future getThumbnailForUploadedFile(EnteFile file) async { final cachedThumbnail = cachedThumbnailPath(file); if (await cachedThumbnail.exists()) { + _logger.info("Thumbnail already exists for ${file.uploadedFileID}"); return cachedThumbnail; } final thumbnail = await getThumbnail(file); @@ -55,8 +56,10 @@ Future getThumbnailForUploadedFile(EnteFile file) async { if (!await cachedThumbnail.exists()) { await cachedThumbnail.writeAsBytes(thumbnail, flush: true); } + _logger.info("Thumbnail obtained for ${file.uploadedFileID}"); return cachedThumbnail; } + _logger.severe("Failed to get thumbnail for ${file.uploadedFileID}"); return null; } From ef01223d9dce24282fdbe0b8540a3720db63e8d2 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 13:49:28 +0530 Subject: [PATCH 0706/1179] [mob][photos] update flutter version in README.md --- mobile/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/README.md b/mobile/README.md index 418338759e..bd937f4ed2 100644 --- a/mobile/README.md +++ b/mobile/README.md @@ -46,7 +46,7 @@ You can alternatively install the build from PlayStore or F-Droid. ## 🧑‍💻 Building from source -1. [Install Flutter v3.22.2](https://flutter.dev/docs/get-started/install). +1. [Install Flutter v3.24.0](https://flutter.dev/docs/get-started/install). 2. Pull in all submodules with `git submodule update --init --recursive` From 7718da93a5cabfa988123cf709091b05ee6aaa38 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 27 Aug 2024 10:23:15 +0200 Subject: [PATCH 0707/1179] [mob][photos] Logs --- mobile/lib/services/machine_learning/ml_service.dart | 2 +- mobile/lib/utils/ml_util.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index ef428f3946..e3e41c73d2 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -495,7 +495,7 @@ class MLService { return true; } _logger.severe( - "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID}. Not storing any results locally, which means it will be automatically retried later.", + "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID} and format ${instruction.file.displayName.split('.').last} (${instruction.file.fileType}). Not storing any results locally, which means it will be automatically retried later.", e, s, ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index cb9ab5d630..e07740acba 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -330,7 +330,7 @@ Future getImagePathForML(EnteFile enteFile) async { if (imagePath == null) { _logger.severe( - "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} since its file path is null (isVideo: $isVideo)", + "Failed to get any data for enteFile with uploadedFileID ${enteFile.uploadedFileID} and format ${enteFile.displayName.split('.').last} and size ${enteFile.fileSize} since its file path is null (isVideo: $isVideo)", ); throw CouldNotRetrieveAnyFileData(); } From 2450dcf4c2e3949028b1d423c926d5708f9f84d6 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 27 Aug 2024 07:11:11 +0000 Subject: [PATCH 0708/1179] New Crowdin translations by GitHub Action --- mobile/fastlane/metadata/ios/da/keywords.txt | 1 + mobile/fastlane/metadata/ios/da/name.txt | 1 + mobile/lib/l10n/intl_pl.arb | 2 +- mobile/lib/l10n/intl_pt.arb | 4 +- mobile/lib/l10n/intl_zh.arb | 63 ++++++++++++-------- 5 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 mobile/fastlane/metadata/ios/da/keywords.txt create mode 100644 mobile/fastlane/metadata/ios/da/name.txt diff --git a/mobile/fastlane/metadata/ios/da/keywords.txt b/mobile/fastlane/metadata/ios/da/keywords.txt new file mode 100644 index 0000000000..e436784418 --- /dev/null +++ b/mobile/fastlane/metadata/ios/da/keywords.txt @@ -0,0 +1 @@ +fotos,fotografi,familie, privatliv, sky,backup,videoer,foto,kryptering,lager,album,alternativ diff --git a/mobile/fastlane/metadata/ios/da/name.txt b/mobile/fastlane/metadata/ios/da/name.txt new file mode 100644 index 0000000000..3a991c4abc --- /dev/null +++ b/mobile/fastlane/metadata/ios/da/name.txt @@ -0,0 +1 @@ +Ente Photos diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 3e124d3081..7be752f684 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -496,7 +496,7 @@ "removeDuplicates": "Usuń duplikaty", "removeDuplicatesDesc": "Przejrzyj i usuń pliki, które są dokładnymi duplikatami.", "viewLargeFiles": "Duże pliki", - "viewLargeFilesDesc": "Wyświetl pliki zużywające największą ilość pamięci", + "viewLargeFilesDesc": "Wyświetl pliki zużywające największą ilość pamięci.", "noDuplicates": "✨ Brak duplikatów", "youveNoDuplicateFilesThatCanBeCleared": "Nie masz duplikatów plików, które mogą być wyczyszczone", "success": "Sukces", diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 2c09c839c2..0ca1ce69cd 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -496,7 +496,7 @@ "removeDuplicates": "Excluir duplicados", "removeDuplicatesDesc": "Revise e remova arquivos que sejam duplicatas exatas.", "viewLargeFiles": "Arquivos grandes", - "viewLargeFilesDesc": "Ver arquivos que estão consumindo mais espaço de armazenamento", + "viewLargeFilesDesc": "Ver arquivos que estão consumindo mais espaço de armazenamento.", "noDuplicates": "✨ Sem duplicados", "youveNoDuplicateFilesThatCanBeCleared": "Você não tem arquivos duplicados que possam ser limpos", "success": "Bem-sucedido", @@ -1151,7 +1151,7 @@ "hiding": "Ocultando...", "unhiding": "Reexibindo...", "successfullyHid": "Ocultado com sucesso", - "successfullyUnhid": "Desocultado com sucesso", + "successfullyUnhid": "Reexibido com sucesso", "crashReporting": "Relatório de falhas", "resumableUploads": "Envios retomáveis", "addToHiddenAlbum": "Adicionar a álbum oculto", diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index be97d070f4..abb3a223ae 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -273,6 +273,11 @@ "failedToApplyCode": "无法使用此代码", "enterReferralCode": "输入推荐代码", "codeAppliedPageTitle": "代码已应用", + "changeYourReferralCode": "更改您的推荐代码", + "change": "更改", + "unavailableReferralCode": "抱歉,此代码不可用。", + "codeChangeLimitReached": "抱歉,您已达到代码更改的限制。", + "onlyFamilyAdminCanChangeCode": "请联系{familyAdminEmail} 以更改您的代码。", "storageInGB": "{storageAmountInGB} GB", "claimed": "已领取", "@claimed": { @@ -409,8 +414,13 @@ "photoGridSize": "照片网格大小", "manageDeviceStorage": "管理设备存储", "machineLearning": "机器学习", + "mlConsent": "启用机器学习", + "mlConsentTitle": "要启用机器学习吗?", + "mlConsentDescription": "如果您启用机器学习,Ente 将从文件(包括与您共享的文件)中提取面部几何形状等信息。\n\n这将在您的设备上进行,并且任何生成的生物特征信息都将被端到端加密。", + "mlConsentPrivacy": "请点击此处查看我们隐私政策中有关此功能的更多详细信息", + "mlConsentConfirmation": "我了解了,并希望启用机器学习", "magicSearch": "魔法搜索", - "mlIndexingDescription": "请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。", + "mlIndexingDescription": "请注意,机器学习会导致带宽和电池使用量增加,直到所有项目都被索引。请考虑使用桌面应用程序来加快索引速度,所有结果都将自动同步。", "loadingModel": "正在下载模型...", "waitingForWifi": "正在等待 WiFi...", "status": "状态", @@ -486,7 +496,7 @@ "removeDuplicates": "移除重复内容", "removeDuplicatesDesc": "检查并删除完全重复的文件。", "viewLargeFiles": "大文件", - "viewLargeFilesDesc": "查看占用存储空间最多的文件", + "viewLargeFilesDesc": "查看占用存储空间最多的文件。", "noDuplicates": "✨ 没有重复内容", "youveNoDuplicateFilesThatCanBeCleared": "您没有可以被清除的重复文件", "success": "成功", @@ -1143,7 +1153,7 @@ "successfullyHid": "已成功隐藏", "successfullyUnhid": "已成功取消隐藏", "crashReporting": "上报崩溃", - "enableMultiPartUpload": "启用分片上传", + "resumableUploads": "可续传上传", "addToHiddenAlbum": "添加到隐藏相册", "moveToHiddenAlbum": "移至隐藏相册", "fileTypes": "文件类型", @@ -1253,20 +1263,6 @@ "right": "向右", "whatsNew": "更新日志", "reviewSuggestions": "查看建议", - "reenterPassword": "再次输入密码", - "reenterPin": "再次输入 PIN 码", - "deviceLock": "设备锁", - "pinLock": "PIN 锁定", - "next": "下一步", - "setNewPassword": "设置新密码", - "enterPin": "输入 PIN 码", - "setNewPin": "设置新 PIN 码", - "appLock": "应用锁", - "noSystemLockFound": "未找到系统锁", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。", - "tapToUnlock": "点击解锁", - "tooManyIncorrectAttempts": "错误尝试次数过多", - "mlFunctions": "ML functions", "useAsCover": "用作封面", "notPersonLabel": "不是 {name}?", "@notPersonLabel": { @@ -1278,9 +1274,25 @@ } } }, + "enable": "启用", + "enabled": "已启用", + "moreDetails": "更多详情", + "enableMLIndexingDesc": "Ente 支持设备上的机器学习,实现人脸识别、魔法搜索和其他高级搜索功能", + "magicSearchHint": "魔法搜索允许按内容搜索照片,例如“lower'”、“red car”、“identity documents”", "panorama": "全景", + "reenterPassword": "再次输入密码", + "reenterPin": "再次输入 PIN 码", + "deviceLock": "设备锁", + "pinLock": "PIN 锁定", + "next": "下一步", + "setNewPassword": "设置新密码", + "enterPin": "输入 PIN 码", + "setNewPin": "设置新 PIN 码", + "appLock": "应用锁", + "noSystemLockFound": "未找到系统锁", + "tapToUnlock": "点击解锁", + "tooManyIncorrectAttempts": "错误尝试次数过多", "videoInfo": "视频详情", - "appLockDescription": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。", "autoLock": "自动锁定", "immediately": "立即", "autoLockFeatureDescription": "应用程序进入后台后锁定的时间", @@ -1295,12 +1307,13 @@ "guestView": "访客视图", "guestViewEnablePreSteps": "要启用访客视图,请在系统设置中设置设备密码或屏幕锁。", "cl_guest_view_title": "访客视图", - "cl_guest_view_description": "要把手机递给朋友看照片?别担心他们滑动太远。访客视图将锁定您选择的照片。", - "cl_guest_view_call_to_action": "选择照片并查看\"访客视图\"。", - "cl_panorama_viewer_title": "全景查看器", - "cl_panorama_viewer_description": "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!", + "cl_guest_view_description": "把手机交给朋友看照片?不用担心 Ta 们滑动屏幕乱看照片。访客视图会将 Ta 们锁定在您选择的照片中。", + "cl_guest_view_call_to_action": "选择照片并使用“访客视图”。", + "cl_panorama_viewer_title": "全景图查看器", + "cl_panorama_viewer_description": "我们添加了对 360 度全景照片的支持。通过基于动作的导航,用户可获得身临其境的体验!", "cl_video_player_title": "视频播放器", - "cl_video_player_description": "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_video_player_description": "推出全新的视频播放器,提供更好的播放控制并添加了对 HDR 视频的支持。", + "appLockDescriptions": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁。", + "authToViewPasskey": "请验证身份以查看您的通行密钥" } \ No newline at end of file From 6c5dd38dbf0fd073eb20196275c1aaf22c8dcdfa Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 14:06:50 +0530 Subject: [PATCH 0709/1179] [mob][photos] Update flutter version to 3.24.1 in README.md --- mobile/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/README.md b/mobile/README.md index bd937f4ed2..9e3ed475f4 100644 --- a/mobile/README.md +++ b/mobile/README.md @@ -46,7 +46,7 @@ You can alternatively install the build from PlayStore or F-Droid. ## 🧑‍💻 Building from source -1. [Install Flutter v3.24.0](https://flutter.dev/docs/get-started/install). +1. [Install Flutter v3.24.1](https://flutter.dev/docs/get-started/install). 2. Pull in all submodules with `git submodule update --init --recursive` From 55b4ce83262d26497633340ade22b739ddc9d770 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 14:09:27 +0530 Subject: [PATCH 0710/1179] [mob][photos] Update flutter version in github workflows --- .github/workflows/mobile-internal-release.yml | 2 +- .github/workflows/mobile-lint.yml | 2 +- .github/workflows/mobile-release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/mobile-internal-release.yml b/.github/workflows/mobile-internal-release.yml index 2eb9979bf9..a05fdcc236 100644 --- a/.github/workflows/mobile-internal-release.yml +++ b/.github/workflows/mobile-internal-release.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: # Allow manually running the action env: - FLUTTER_VERSION: "3.22.2" + FLUTTER_VERSION: "3.24.1" jobs: build: diff --git a/.github/workflows/mobile-lint.yml b/.github/workflows/mobile-lint.yml index 0a57c0b30b..27a3303294 100644 --- a/.github/workflows/mobile-lint.yml +++ b/.github/workflows/mobile-lint.yml @@ -9,7 +9,7 @@ on: env: - FLUTTER_VERSION: "3.22.2" + FLUTTER_VERSION: "3.24.1" jobs: lint: diff --git a/.github/workflows/mobile-release.yml b/.github/workflows/mobile-release.yml index 363f232c80..e1d5998387 100644 --- a/.github/workflows/mobile-release.yml +++ b/.github/workflows/mobile-release.yml @@ -9,7 +9,7 @@ on: - "photos-v*" env: - FLUTTER_VERSION: "3.22.2" + FLUTTER_VERSION: "3.24.1" jobs: build: From b1f3b440f7ab74ac6533d5f0a8cc995df0be0296 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 14:18:17 +0530 Subject: [PATCH 0711/1179] [mob][photos] changes in pubspec.lock --- mobile/pubspec.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 7388ae92f2..0223bc5236 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1297,18 +1297,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -1441,10 +1441,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" media_extension: dependency: "direct main" description: @@ -1529,10 +1529,10 @@ packages: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mgrs_dart: dependency: transitive description: @@ -1901,10 +1901,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -2410,26 +2410,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.25.2" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.4" timezone: dependency: transitive description: @@ -2708,10 +2708,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" volume_controller: dependency: transitive description: From 4278e9c47441532c94e212a9a643b2ae999633fc Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:34:26 +0530 Subject: [PATCH 0712/1179] [mob]Remove dst from crowdin template --- mobile/crowdin.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/crowdin.yml b/mobile/crowdin.yml index 27c72a52b0..7bacd35953 100644 --- a/mobile/crowdin.yml +++ b/mobile/crowdin.yml @@ -4,7 +4,6 @@ preserve_hierarchy: true files: - source: /lib/l10n/intl_en.arb translation: /lib/l10n/intl_%two_letters_code%.arb - dest: /%original_file_name% type: arb - source: /fastlane/metadata/playstore/en-US/*.txt translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name% From ac3061a23204e89e1bfabf76bc4d987d9dcb0b84 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:41:58 +0530 Subject: [PATCH 0713/1179] Revert "[mob]Remove dst from crowdin template" This reverts commit 4278e9c47441532c94e212a9a643b2ae999633fc. --- mobile/crowdin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/crowdin.yml b/mobile/crowdin.yml index 7bacd35953..27c72a52b0 100644 --- a/mobile/crowdin.yml +++ b/mobile/crowdin.yml @@ -4,6 +4,7 @@ preserve_hierarchy: true files: - source: /lib/l10n/intl_en.arb translation: /lib/l10n/intl_%two_letters_code%.arb + dest: /%original_file_name% type: arb - source: /fastlane/metadata/playstore/en-US/*.txt translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name% From 9b82ba22a33a48af94cb1e8f4b1a112e1ed69d62 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 27 Aug 2024 11:41:59 +0200 Subject: [PATCH 0714/1179] [mob][photos] Remove last tflite remnants --- mobile/.gitignore | 1 - mobile/docs/dev.md | 21 +-------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/mobile/.gitignore b/mobile/.gitignore index b6ee5c6161..452efa9a2c 100644 --- a/mobile/.gitignore +++ b/mobile/.gitignore @@ -40,4 +40,3 @@ android/.settings/ .env fastlane/report.xml -TensorFlowLiteC.framework diff --git a/mobile/docs/dev.md b/mobile/docs/dev.md index e13ffe2c9e..53a7c25ad6 100644 --- a/mobile/docs/dev.md +++ b/mobile/docs/dev.md @@ -12,23 +12,4 @@ cd ios && pod install && cd .. ```sh sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch -``` - -#### Error (Xcode): Framework not found TensorFlowLiteC - -Copy tflite package from pub.dev to pub.dartlang.org - -```sh -cp -r ~/.pub-cache/hosted/pub.dev/tflite_flutter-0.9.1 ~/.pub-cache/hosted/pub.dartlang.org/tflite_flutter-0.9.1 -``` - -Run setup.sh -```bash -./setup.sh -``` - -Install the pod again - -```bash -cd ios && pod install && cd .. -``` +``` \ No newline at end of file From 8044bd75dfc03a084a2f9a150824e6e880f927cc Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Tue, 27 Aug 2024 12:09:51 +0200 Subject: [PATCH 0715/1179] [mob][photos] stop annoying analyzer emphasis --- mobile/lib/services/user_service.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/user_service.dart b/mobile/lib/services/user_service.dart index 4c20429b08..03e8646a83 100644 --- a/mobile/lib/services/user_service.dart +++ b/mobile/lib/services/user_service.dart @@ -610,7 +610,7 @@ class UserService { SetupSRPResponse.fromJson(response.data); final serverB = SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + // ignore: unused_local_variable, need to calculate secret to get M1 final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); // ignore: unused_local_variable @@ -696,7 +696,7 @@ class UserService { final String srpB = createSessionResponse.data["srpB"]; final serverB = SRP6Util.decodeBigInt(base64Decode(srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + // ignore: unused_local_variable, need to calculate secret to get M1, final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); final response = await _dio.post( From cba69a84d3882f77fba7ffdf870e9f44b4370d26 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:39:41 +0530 Subject: [PATCH 0716/1179] [mob] Skip exporting untranslated strings for store listing --- mobile/crowdin.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mobile/crowdin.yml b/mobile/crowdin.yml index 27c72a52b0..fca358689a 100644 --- a/mobile/crowdin.yml +++ b/mobile/crowdin.yml @@ -6,15 +6,19 @@ files: translation: /lib/l10n/intl_%two_letters_code%.arb dest: /%original_file_name% type: arb + skip_untranslated_files: false - source: /fastlane/metadata/playstore/en-US/*.txt translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name% dest: /playstore/%original_file_name% type: txt + skip_untranslated_files: true - source: /fastlane/metadata/android/en-US/*.txt translation: /fastlane/metadata/android/%two_letters_code%/%original_file_name% dest: /fdroid/%original_file_name% type: txt + skip_untranslated_files: true - source: /fastlane/metadata/ios/en-US/*.txt translation: /fastlane/metadata/ios/%two_letters_code%/%original_file_name% dest: /appstore/%original_file_name% type: txt + skip_untranslated_files: true From 5e05e50049c465725769c8556252d3621b671811 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:46:43 +0530 Subject: [PATCH 0717/1179] [mob] Fix lint --- mobile/lib/services/user_service.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/user_service.dart b/mobile/lib/services/user_service.dart index 4c20429b08..fca3fbcff5 100644 --- a/mobile/lib/services/user_service.dart +++ b/mobile/lib/services/user_service.dart @@ -610,7 +610,8 @@ class UserService { SetupSRPResponse.fromJson(response.data); final serverB = SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + + // ignore: unused_local_variable final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); // ignore: unused_local_variable @@ -696,7 +697,7 @@ class UserService { final String srpB = createSessionResponse.data["srpB"]; final serverB = SRP6Util.decodeBigInt(base64Decode(srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + // ignore: unused_local_variable final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); final response = await _dio.post( From b9f8f55a30fd6a13de54657f53d746ea7227e441 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:57:58 +0530 Subject: [PATCH 0718/1179] [mob] Upgrade crowdin config --- .github/workflows/mobile-crowdin-sync.yml | 1 - mobile/crowdin.yml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mobile-crowdin-sync.yml b/.github/workflows/mobile-crowdin-sync.yml index 5f8da62b4d..39062cd6f5 100644 --- a/.github/workflows/mobile-crowdin-sync.yml +++ b/.github/workflows/mobile-crowdin-sync.yml @@ -26,7 +26,6 @@ jobs: download_translations: true localization_branch_name: translations/mobile create_pull_request: true - skip_untranslated_strings: true pull_request_title: "[mobile] New translations" pull_request_body: "New translations from [Crowdin](https://crowdin.com/project/ente-photos-app)" pull_request_base_branch_name: "main" diff --git a/mobile/crowdin.yml b/mobile/crowdin.yml index fca358689a..c478a5ded7 100644 --- a/mobile/crowdin.yml +++ b/mobile/crowdin.yml @@ -6,6 +6,7 @@ files: translation: /lib/l10n/intl_%two_letters_code%.arb dest: /%original_file_name% type: arb + skip_untranslated_strings: false skip_untranslated_files: false - source: /fastlane/metadata/playstore/en-US/*.txt translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name% From c2a5f85a02857d45a711d63c1dd97a2d0a15660e Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 16:02:10 +0530 Subject: [PATCH 0719/1179] [mob] Skip untranslated strings --- mobile/crowdin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/crowdin.yml b/mobile/crowdin.yml index c478a5ded7..efe5e4de50 100644 --- a/mobile/crowdin.yml +++ b/mobile/crowdin.yml @@ -6,7 +6,7 @@ files: translation: /lib/l10n/intl_%two_letters_code%.arb dest: /%original_file_name% type: arb - skip_untranslated_strings: false + skip_untranslated_strings: true skip_untranslated_files: false - source: /fastlane/metadata/playstore/en-US/*.txt translation: /fastlane/metadata/playstore/%two_letters_code%/%original_file_name% From 4649561886015e463a1df6243bd1b0fd747e732b Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 27 Aug 2024 10:33:54 +0000 Subject: [PATCH 0720/1179] New Crowdin translations by GitHub Action --- mobile/lib/l10n/intl_ar.arb | 27 + mobile/lib/l10n/intl_bg.arb | 3 + mobile/lib/l10n/intl_ca.arb | 3 + mobile/lib/l10n/intl_cs.arb | 60 +- mobile/lib/l10n/intl_da.arb | 89 +++ mobile/lib/l10n/intl_de.arb | 1 - mobile/lib/l10n/intl_el.arb | 4 + mobile/lib/l10n/intl_es.arb | 85 ++- mobile/lib/l10n/intl_et.arb | 3 + mobile/lib/l10n/intl_fa.arb | 312 ++++++++++ mobile/lib/l10n/intl_fr.arb | 284 ++++++---- mobile/lib/l10n/intl_gu.arb | 3 + mobile/lib/l10n/intl_he.arb | 823 +++++++++++++++++++++++++++ mobile/lib/l10n/intl_hi.arb | 53 ++ mobile/lib/l10n/intl_id.arb | 1069 +++++++++++++++++++++++++++++++++++ mobile/lib/l10n/intl_it.arb | 134 ++--- mobile/lib/l10n/intl_ja.arb | 3 + mobile/lib/l10n/intl_km.arb | 3 + mobile/lib/l10n/intl_ko.arb | 73 +-- mobile/lib/l10n/intl_nl.arb | 84 +-- mobile/lib/l10n/intl_no.arb | 420 ++++++++++++-- mobile/lib/l10n/intl_ru.arb | 86 +-- mobile/lib/l10n/intl_sv.arb | 427 ++++++++++++++ mobile/lib/l10n/intl_te.arb | 3 + mobile/lib/l10n/intl_th.arb | 301 ++++++++++ mobile/lib/l10n/intl_ti.arb | 3 + mobile/lib/l10n/intl_tr.arb | 134 +---- 27 files changed, 3860 insertions(+), 630 deletions(-) create mode 100644 mobile/lib/l10n/intl_ar.arb create mode 100644 mobile/lib/l10n/intl_bg.arb create mode 100644 mobile/lib/l10n/intl_ca.arb create mode 100644 mobile/lib/l10n/intl_da.arb create mode 100644 mobile/lib/l10n/intl_el.arb create mode 100644 mobile/lib/l10n/intl_et.arb create mode 100644 mobile/lib/l10n/intl_fa.arb create mode 100644 mobile/lib/l10n/intl_gu.arb create mode 100644 mobile/lib/l10n/intl_he.arb create mode 100644 mobile/lib/l10n/intl_hi.arb create mode 100644 mobile/lib/l10n/intl_id.arb create mode 100644 mobile/lib/l10n/intl_ja.arb create mode 100644 mobile/lib/l10n/intl_km.arb create mode 100644 mobile/lib/l10n/intl_sv.arb create mode 100644 mobile/lib/l10n/intl_te.arb create mode 100644 mobile/lib/l10n/intl_th.arb create mode 100644 mobile/lib/l10n/intl_ti.arb diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb new file mode 100644 index 0000000000..86273581a6 --- /dev/null +++ b/mobile/lib/l10n/intl_ar.arb @@ -0,0 +1,27 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "أدخل عنوان بريدك الإلكتروني", + "accountWelcomeBack": "مرحبًا مجددًا!", + "email": "البريد الإلكتروني", + "cancel": "إلغاء", + "verify": "التحقّق", + "invalidEmailAddress": "عنوان البريد الإلكتروني غير صالح", + "thisWillLogYouOutOfThisDevice": "سيؤدي هذا إلى تسجيل خروجك من هذا الجهاز!", + "thisWillLogYouOutOfTheFollowingDevice": "سيؤدي هذا إلى تسجيل خروجك من الجهاز التالي:", + "terminateSession": "إنهاء الجلسة؟", + "terminate": "إنهاء", + "thisDevice": "هذا الجهاز", + "recoverButton": "استرداد", + "recoverySuccessful": "نجح الاسترداد!", + "decrypting": "فك التشفير...", + "incorrectRecoveryKeyTitle": "مفتاح الاسترداد غير صحيح", + "incorrectRecoveryKeyBody": "مفتاح الاسترداد الذي أدخلته غير صحيح", + "forgotPassword": "نسيت كلمة المرور", + "enterYourRecoveryKey": "أدخل رمز الاسترداد", + "noRecoveryKey": "ما من مفتاح استرداد؟", + "sorry": "المعذرة", + "noRecoveryKeyNoDecryption": "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية", + "verifyEmail": "التحقق من البريد الإلكتروني", + "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", + "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية." +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_bg.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_ca.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index 49563ff49d..c8494661c6 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -1,61 +1,3 @@ { - "addToHiddenAlbum": "Add to hidden album", - "moveToHiddenAlbum": "Move to hidden album", - "fileTypes": "File types", - "deleteConfirmDialogBody": "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.", - "yourMap": "Your map", - "modifyYourQueryOrTrySearchingFor": "Modify your query, or try searching for", - "contacts": "Contacts", - "editLocation": "Edit location", - "selectALocation": "Select a location", - "selectALocationFirst": "Select a location first", - "changeLocationOfSelectedItems": "Change location of selected items?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", - "joinDiscord": "Join Discord", - "locations": "Locations", - "descriptions": "Descriptions", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "passwordLock": "Password lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "@@locale ": "en" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb new file mode 100644 index 0000000000..49c26657f9 --- /dev/null +++ b/mobile/lib/l10n/intl_da.arb @@ -0,0 +1,89 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "Indtast din email adresse", + "accountWelcomeBack": "Velkommen tilbage!", + "email": "Email", + "cancel": "Annuller", + "verify": "Bekræft", + "invalidEmailAddress": "Ugyldig email adresse", + "enterValidEmail": "Indtast venligst en gyldig email adresse.", + "deleteAccount": "Slet konto", + "askDeleteReason": "Hvad er hovedårsagen til, at du sletter din konto?", + "deleteAccountFeedbackPrompt": "Vi er kede af at du forlader os. Forklar venligst hvorfor, så vi kan forbedre os.", + "feedback": "Feedback", + "kindlyHelpUsWithThisInformation": "Hjælp os venligst med disse oplysninger", + "confirmDeletePrompt": "Ja, jeg ønsker at slette denne konto og alle dens data permanent.", + "confirmAccountDeletion": "Bekræft Sletning Af Konto", + "deleteAccountPermanentlyButton": "Slet konto permanent", + "yourAccountHasBeenDeleted": "Din konto er blevet slettet", + "selectReason": "Vælg årsag", + "deleteReason1": "Der mangler en vigtig funktion, som jeg har brug for", + "deleteReason3": "Jeg fandt en anden tjeneste, som jeg syntes bedre om", + "deleteReason4": "Min grund er ikke angivet", + "sendEmail": "Send email", + "deleteRequestSLAText": "Din anmodning vil blive behandlet inden for 72 timer.", + "deleteEmailRequest": "Send venligst en email til account-deletion@ente.io fra din registrerede email adresse.", + "ok": "Ok", + "createAccount": "Opret konto", + "createNewAccount": "Opret en ny konto", + "password": "Adgangskode", + "confirmPassword": "Bekræft adgangskode", + "activeSessions": "Aktive sessioner", + "oops": "Ups", + "somethingWentWrongPleaseTryAgain": "Noget gik galt, prøv venligst igen", + "thisWillLogYouOutOfThisDevice": "Dette vil logge dig ud af denne enhed!", + "thisWillLogYouOutOfTheFollowingDevice": "Dette vil logge dig ud af følgende enhed:", + "terminateSession": "Afslut session?", + "incorrectRecoveryKeyBody": "Den gendannelsesnøgle du indtastede er forkert", + "forgotPassword": "Glemt adgangskode", + "incorrectPasswordTitle": "Forkert adgangskode", + "copypasteThisCodentoYourAuthenticatorApp": "Kopiér denne kode\ntil din autentificeringsapp", + "scanThisBarcodeWithnyourAuthenticatorApp": "Skan denne QR-kode med godkendelses-appen", + "manage": "Administrér", + "shareTextConfirmOthersVerificationID": "Hey, kan du bekræfte, at dette er dit ente.io verifikation ID: {verificationID}", + "subscribe": "Abonner", + "memoryCount": "{count, plural, zero{ingen minder} one{{formattedCount} minde} other{{formattedCount} minder}}", + "@memoryCount": { + "description": "The text to display the number of memories", + "type": "text", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedCount": { + "type": "String", + "example": "11.513, 11,511" + } + } + }, + "selectedPhotos": "{count} valgt", + "@selectedPhotos": { + "description": "Display the number of selected photos", + "type": "text", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } + }, + "mlIndexingDescription": "Bemærk venligst, at maskinindlæring vil resultere i en højere båndbredde og batteriforbrug, indtil alle elementer er indekseret. Overvej at bruge desktop app til hurtigere indeksering, vil alle resultater blive synkroniseret automatisk.", + "backedUpFolders": "Sikkerhedskopierede mapper", + "couldNotUpdateSubscription": "Abonnementet kunne ikke opdateres.", + "pleaseContactSupportAndWeWillBeHappyToHelp": "Kontakt support@ente.io og vi vil være glade for at hjælpe!", + "loggingOut": "Logger ud...", + "invite": "Inviter", + "fileSavedToGallery": "Fil gemt i galleri", + "renameFile": "Omdøb fil", + "moments": "Øjeblikke", + "familyPlanPortalTitle": "Familie", + "viewAddOnButton": "Vis tilføjelser", + "addOnPageSubtitle": "Oplysninger om tilføjelser", + "searchHint1": "Hurtig, søgning på enheden", + "findPeopleByName": "Find folk hurtigt ved navn", + "longPressAnEmailToVerifyEndToEndEncryption": "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen.", + "developerSettingsWarning": "Er du sikker på, at du vil ændre udviklerindstillingerne?", + "next": "Næste", + "enterPin": "Indtast PIN" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 97160ae71f..aa50482f8d 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -496,7 +496,6 @@ "removeDuplicates": "Duplikate entfernen", "removeDuplicatesDesc": "Überprüfe und lösche Dateien, die exakte Duplikate sind.", "viewLargeFiles": "Große Dateien", - "viewLargeFilesDesc": "Dateien anzeigen, die den meisten Speicherplatz belegen", "noDuplicates": "✨ Keine Duplikate", "youveNoDuplicateFilesThatCanBeCleared": "Du hast keine Duplikate, die gelöscht werden können", "success": "Abgeschlossen", diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb new file mode 100644 index 0000000000..ce8b1a1a54 --- /dev/null +++ b/mobile/lib/l10n/intl_el.arb @@ -0,0 +1,4 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 8b6bef5acc..238f61095f 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "Escribe tu correo electrónico", "accountWelcomeBack": "¡Bienvenido de nuevo!", "email": "Correo electrónico", @@ -12,7 +13,7 @@ "feedback": "Sugerencias", "kindlyHelpUsWithThisInformation": "Por favor ayúdanos con esta información", "confirmDeletePrompt": "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos.", - "confirmAccountDeletion": "Corfirmar borrado de cuenta", + "confirmAccountDeletion": "Confirmar borrado de cuenta", "deleteAccountPermanentlyButton": "Eliminar cuenta permanentemente", "yourAccountHasBeenDeleted": "Tu cuenta ha sido eliminada", "selectReason": "Seleccionar motivo", @@ -73,7 +74,7 @@ "weakStrength": "Poco segura", "strongStrength": "Segura", "moderateStrength": "Moderada", - "passwordStrength": "Seguridad de la contraseña : {passwordStrengthValue}", + "passwordStrength": "Seguridad de la contraseña: {passwordStrengthValue}", "@passwordStrength": { "description": "Text to indicate the password strength", "placeholders": { @@ -409,7 +410,6 @@ "manageDeviceStorage": "Administrar almacenamiento del dispositivo", "machineLearning": "Aprendizaje automático", "magicSearch": "Búsqueda mágica", - "mlIndexingDescription": "Por favor, ten en cuenta que el aprendizaje automático resultará en un mayor ancho de banda y uso de batería hasta que todos los elementos sean indexados.", "loadingModel": "Descargando modelos...", "waitingForWifi": "Esperando WiFi...", "status": "Estado", @@ -485,7 +485,6 @@ "removeDuplicates": "Eliminar duplicados", "removeDuplicatesDesc": "Revisar y eliminar archivos que son duplicados exactos.", "viewLargeFiles": "Archivos grandes", - "viewLargeFilesDesc": "Ver archivos que consumen la mayor cantidad de almacenamiento", "noDuplicates": "✨ Sin duplicados", "youveNoDuplicateFilesThatCanBeCleared": "No tienes archivos duplicados que puedan ser borrados", "success": "Éxito", @@ -739,7 +738,7 @@ "unhide": "Dejar de ocultar", "unarchive": "Desarchivar", "favorite": "Favorito", - "removeFromFavorite": "Quitar de favoritos", + "removeFromFavorite": "Remover desde favoritos", "shareLink": "Compartir enlace", "createCollage": "Crear un collage", "saveCollage": "Guardar collage", @@ -1251,42 +1250,42 @@ "right": "Derecha", "whatsNew": "Qué hay de nuevo", "reviewSuggestions": "Revisar sugerencias", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Vista de Invitado", - "cl_guest_view_description": "¿Vas a mostrar fotos a un amigo? No te preocupes por si desliza demasiado. La vista de invitado bloqueará las fotos que selecciones.", - "cl_guest_view_call_to_action": "Selecciona fotos y prueba la \"Vista de Invitado\".", - "cl_panorama_viewer_title": "Visor Panorámico", - "cl_panorama_viewer_description": "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!", - "cl_video_player_title": "Reproductor de Video", - "cl_video_player_description": "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "useAsCover": "Usar como cubierta", + "notPersonLabel": "¿No es {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "panorama": "Panorama", + "reenterPassword": "Rescribe tu contraseña", + "reenterPin": "Rescribe tu PIN", + "deviceLock": "Dispositivo Bloqueado", + "pinLock": "PIN Bloqueado", + "next": "Siguiente", + "setNewPassword": "Ingresa tu nueva contraseña", + "enterPin": "Ingresa tu contraseña", + "setNewPin": "Ingresa tu nuevo PIN", + "appLock": "Aplicación bloqueada", + "noSystemLockFound": "Bloqueo de sistema no encontrado", + "tapToUnlock": "Toca para desbloquear", + "tooManyIncorrectAttempts": "Demasiados intentos incorrectos", + "videoInfo": "Información de video", + "autoLock": "Autobloqueo", + "immediately": "Inmediatamente", + "autoLockFeatureDescription": "Tiempo después de que la aplicación esté en segundo plano", + "hideContent": "Ocultar contenido", + "hideContentDescriptionAndroid": "Oculta el contenido de la aplicación en el selector de aplicaciones y desactivar capturas de pantalla", + "hideContentDescriptionIos": "Ocultar el contenido de la aplicación en el selector de aplicaciones", + "passwordStrengthInfo": "La intensidad de la contraseña se calcula teniendo en cuenta la longitud de la contraseña, los caracteres utilizados, y si la contraseña aparece o no en el top 10,000 de contraseñas más usadas", + "noQuickLinksSelected": "No se han seleccionado enlaces rápidos", + "pleaseSelectQuickLinksToRemove": "Por favor, selecciona enlaces rápidos para eliminar", + "removePublicLinks": "Eliminar enlaces públicos", + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Esto eliminará los enlaces públicos de todos los enlaces rápidos seleccionados.", + "guestView": "Vista de invitado", + "guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_et.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb new file mode 100644 index 0000000000..d5dbe63862 --- /dev/null +++ b/mobile/lib/l10n/intl_fa.arb @@ -0,0 +1,312 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "آدرس ایمیل خود را وارد کنید", + "accountWelcomeBack": "خوش آمدید!", + "email": "ایمیل", + "cancel": "لغو", + "verify": "تایید", + "invalidEmailAddress": "آدرس ایمیل معتبر نیست", + "enterValidEmail": "لطفا یک ایمیل معتبر وارد کنید.", + "deleteAccount": "حذف حساب کاربری", + "askDeleteReason": "دلیل اصلی که حساب کاربری‌تان را حذف می‌کنید، چیست؟", + "deleteAccountFeedbackPrompt": "ما متاسفیم که می‌بینیم شما می‌روید. لطفا نظرات خود را برای کمک به بهبود ما به اشتراک بگذارید.", + "feedback": "بازخورد", + "kindlyHelpUsWithThisInformation": "لطفا با این اطلاعات به ما کمک کنید", + "confirmDeletePrompt": "بله، من می‌خواهم برای همیشه این حساب کاربری و تمام اطلاعات آن را حذف کنم.", + "confirmAccountDeletion": "تایید حذف حساب کاربری", + "deleteAccountPermanentlyButton": "حذف دائمی حساب کاربری", + "yourAccountHasBeenDeleted": "حساب کاربری شما حذف شده است", + "selectReason": "انتخاب دلیل", + "deleteReason1": "یک ویژگی کلیدی که به آن نیاز دارم، وجود ندارد", + "deleteReason2": "برنامه یا یک ویژگی خاص آنطور که من فکر می‌کنم، عمل نمی‌کند", + "deleteReason3": "سرویس دیگری پیدا کردم که بهتر می‌پسندم", + "deleteReason4": "دلیل من ذکر نشده است", + "sendEmail": "ارسال ایمیل", + "deleteRequestSLAText": "درخواست شما ظرف مدت ۷۲ ساعت پردازش خواهد شد.", + "deleteEmailRequest": "لطفا یک ایمیل به account-deletion@ente.io از آدرس ایمیل ثبت شده خود ارسال کنید.", + "entePhotosPerm": "Ente برای نگه‌داری عکس‌های شما به دسترسی نیاز دارد", + "ok": "تایید", + "createAccount": "ایجاد حساب کاربری", + "createNewAccount": "ایجاد حساب کاربری جدید", + "password": "رمز عبور", + "confirmPassword": "تایید رمز عبور", + "activeSessions": "دستگاه‌های فعال", + "oops": "اوه", + "somethingWentWrongPleaseTryAgain": "مشکلی پیش آمده، لطفا دوباره تلاش کنید", + "thisWillLogYouOutOfThisDevice": "این کار شما را از این دستگاه خارج می‌کند!", + "thisWillLogYouOutOfTheFollowingDevice": "با این کار شما از دستگاه زیر خارج می‌شوید:", + "terminateSession": "خروچ دستگاه؟", + "terminate": "خروج", + "thisDevice": "این دستگاه", + "recoverButton": "بازیابی", + "recoverySuccessful": "بازیابی موفقیت آمیز بود!", + "decrypting": "در حال رمزگشایی...", + "incorrectRecoveryKeyTitle": "کلید بازیابی درست نیست", + "incorrectRecoveryKeyBody": "کلید بازیابی که وارد کردید درست نیست", + "forgotPassword": "رمز عبور را فراموش کرده‌اید", + "enterYourRecoveryKey": "کلید بازیابی خود را وارد کنید", + "noRecoveryKey": "کلید بازیابی ندارید؟", + "sorry": "متاسفیم", + "noRecoveryKeyNoDecryption": "با توجه به ماهیت پروتکل رمزگذاری سرتاسر ما، اطلاعات شما بدون رمز عبور یا کلید بازیابی شما قابل رمزگشایی نیست", + "verifyEmail": "تایید ایمیل", + "toResetVerifyEmail": "برای تنظیم مجدد رمز عبور، لطفا ابتدا ایمیل خود را تایید کنید.", + "checkInboxAndSpamFolder": "لطفا صندوق ورودی (و هرزنامه) خود را برای تایید کامل بررسی کنید", + "tapToEnterCode": "برای وارد کردن کد ضربه بزنید", + "resendEmail": "ارسال مجدد ایمیل", + "weHaveSendEmailTo": "ما یک ایمیل به {email} ارسال کرده‌ایم", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "تنظیم رمز عبور", + "changePasswordTitle": "تغییر رمز عبور", + "resetPasswordTitle": "بازنشانی رمز عبور", + "encryptionKeys": "کلیدهای رمزنگاری", + "passwordWarning": "ما این رمز عبور را ذخیره نمی‌کنیم، بنابراین اگر فراموش کنید، نمی‌توانیم اطلاعات شما را رمزگشایی کنیم", + "enterPasswordToEncrypt": "رمز عبوری را وارد کنید که بتوانیم از آن برای رمزگذاری اطلاعات شما استفاده کنیم", + "enterNewPasswordToEncrypt": "رمز عبور جدیدی را وارد کنید که بتوانیم از آن برای رمزگذاری اطلاعات شما استفاده کنیم", + "weakStrength": "ضعیف", + "strongStrength": "قوی", + "moderateStrength": "متوسط", + "passwordStrength": "قدرت رمز عبور: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "رمز عبور با موفقیت تغییر کرد", + "generatingEncryptionKeys": "در حال تولید کلیدهای رمزگذاری...", + "pleaseWait": "لطفا صبر کنید...", + "continueLabel": "ادامه", + "insecureDevice": "دستگاه ناامن", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "با عرض پوزش، ما نمی‌توانیم کلیدهای امن را در این دستگاه تولید کنیم.\n\nلطفا از دستگاه دیگری ثبت نام کنید.", + "howItWorks": "چگونه کار می‌کند", + "encryption": "رمزگذاری", + "ackPasswordLostWarning": "من درک می‌کنم که اگر رمز عبور خود را گم کنم، ممکن است اطلاعات خود را از دست بدهم، زیرا اطلاعات من رمزگذاری سرتاسر شده است.", + "privacyPolicyTitle": "سیاست حفظ حریم خصوصی", + "termsOfServicesTitle": "شرایط و مقررات", + "signUpTerms": "من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم", + "logInLabel": "ورود", + "loginTerms": "با کلیک بر روی ورود به سیستم، من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم", + "changeEmail": "تغییر ایمیل", + "enterYourPassword": "رمز عبور خود را وارد کنید", + "welcomeBack": "خوش آمدید!", + "contactSupport": "ارتباط با پشتیبانی", + "incorrectPasswordTitle": "رمز عبور درست نیست", + "pleaseTryAgain": "لطفا دوباره تلاش کنید", + "recreatePasswordTitle": "بازتولید رمز عبور", + "useRecoveryKey": "از کلید بازیابی استفاده کنید", + "recreatePasswordBody": "دستگاه فعلی به اندازه کافی قدرتمند نیست تا رمز عبور شما را تایید کند، اما ما می‌توانیم به گونه‌ای بازسازی کنیم که با تمام دستگاه‌ها کار کند.\n\nلطفا با استفاده از کلید بازیابی خود وارد شوید و رمز عبور خود را دوباره ایجاد کنید (در صورت تمایل می‌توانید دوباره از همان رمز عبور استفاده کنید).", + "verifyPassword": "تایید رمز عبور", + "recoveryKey": "کلید بازیابی", + "recoveryKeyOnForgotPassword": "اگر رمز عبور خود را فراموش کردید، تنها راهی که می‌توانید اطلاعات خود را بازیابی کنید با این کلید است.", + "recoveryKeySaveDescription": "ما این کلید را ذخیره نمی‌کنیم، لطفا این کلید ۲۴ کلمه‌ای را در مکانی امن ذخیره کنید.", + "doThisLater": "بعداً انجام شود", + "saveKey": "ذخیره کلید", + "recoveryKeyCopiedToClipboard": "کلید بازیابی در کلیپ‌بورد کپی شد", + "recoverAccount": "بازیابی حساب کاربری", + "recover": "بازیابی", + "dropSupportEmail": "لطفا یک ایمیل از آدرس ایمیلی که ثبت نام کردید به {supportEmail} ارسال کنید", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "confirm": "تایید", + "invalidKey": "کلید نامعتبر", + "tryAgain": "دوباره امتحان کنید", + "viewRecoveryKey": "نمایش کلید بازیابی", + "confirmRecoveryKey": "تایید کلید بازیابی", + "confirmYourRecoveryKey": "کلید بازیابی خود را تایید کنید", + "addViewer": "افزودن بیننده", + "addCollaborator": "افزودن همکار", + "addANewEmail": "افزودن ایمیل جدید", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "همکاران می‌توانند عکس‌ها و ویدیوها را به آلبوم اشتراک گذاری شده اضافه کنند.", + "enterEmail": "ایمیل را وارد کنید", + "you": "شما", + "collaborator": "همکار", + "addMore": "افزودن بیشتر", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "viewer": "بیننده", + "manage": "مدیریت", + "addedAs": "اضافه شده به عنوان", + "yesConvertToViewer": "بله، تبدیل به بیننده شود", + "allowAddingPhotos": "اجازه اضافه کردن عکس", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowAddPhotosDescription": "به افراد که این پیوند را دارند، اجازه دهید عکس‌ها را به آلبوم اشتراک گذاری شده اضافه کنند.", + "lockButtonLabel": "قفل", + "enterPassword": "رمز عبور را وارد کنید", + "removeLink": "حذف پیوند", + "manageLink": "مدیریت پیوند", + "albumUpdated": "آلبوم به‌روز شد", + "never": "هرگز", + "custom": "سفارشی", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "manageParticipants": "مدیریت", + "collabLinkSectionDescription": "پیوندی ایجاد کنید تا به افراد اجازه دهید بدون نیاز به برنامه یا حساب کاربری Ente عکس‌ها را در آلبوم اشتراک گذاشته شده شما اضافه و مشاهده کنند. برای جمع‌آوری عکس‌های رویداد عالی است.", + "verifyEmailID": "تایید {email}", + "shareTextRecommendUsingEnte": "Ente را دانلود کنید تا بتوانید به راحتی عکس‌ها و ویدیوهای با کیفیت اصلی را به اشتراک بگذارید\n\nhttps://ente.io", + "details": "جزئیات", + "faq": "سوالات متداول", + "archive": "بایگانی", + "uncategorized": "دسته‌بندی نشده", + "videoSmallCase": "ویدیو", + "photoSmallCase": "عکس", + "status": "وضعیت", + "selectFoldersForBackup": "پوشه‌ها را برای پشتیبان گیری انتخاب کنید", + "selectedFoldersWillBeEncryptedAndBackedUp": "پوشه‌های انتخاب شده، رمزگذاری شده و از آنها نسخه پشتیبان تهیه می‌شود", + "unselectAll": "لغو انتخاب همه", + "selectAll": "انتخاب همه", + "skip": "رد کردن", + "updatingFolderSelection": "در حال به‌روزرسانی گزینش پوشه...", + "about": "درباره ما", + "weAreOpenSource": "ما متن‌باز هستیم!", + "privacy": "حریم خصوصی", + "terms": "شرایط و مقررات", + "checkForUpdates": "بررسی برای به‌روزرسانی", + "checkStatus": "بررسی وضعیت", + "checking": "در حال بررسی...", + "youAreOnTheLatestVersion": "شما در حال استفاده از آخرین نسخه هستید", + "account": "حساب کاربری", + "manageSubscription": "مدیریت اشتراک", + "logout": "خروج", + "areYouSureYouWantToLogout": "آیا برای خارج شدن مطمئن هستید؟", + "yesLogout": "بله، خارج می‌شوم", + "aNewVersionOfEnteIsAvailable": "نسخه جدید Ente در دسترس است.", + "update": "به‌روزرسانی", + "installManually": "نصب دستی", + "criticalUpdateAvailable": "به‌روزرسانی حیاتی در دسترس است", + "updateAvailable": "به‌رورزرسانی در دسترس است", + "ignoreUpdate": "نادیده گرفتن", + "downloading": "در حال دانلود...", + "cannotDeleteSharedFiles": "پرونده‌های به اشتراک گذاشته شده را نمی‌توان حذف کرد", + "theDownloadCouldNotBeCompleted": "دانلود کامل نشد", + "retry": "سعی مجدد", + "backedUpFolders": "پوشه‌های پشتیبان گیری شده", + "backup": "پشتیبان گیری", + "familyPlans": "برنامه‌های خانوادگی", + "notifications": "آگاه‌سازی‌ها", + "sharedPhotoNotifications": "عکس‌های جدید به اشتراک گذاشته شده", + "sharedPhotoNotificationsExplanation": "هنگامی که شخصی عکسی را به آلبوم مشترکی که شما بخشی از آن هستید اضافه می‌کند، آگاه‌سازی دریافت می‌کنید", + "advanced": "پیشرفته", + "general": "عمومی", + "security": "امنیت", + "viewActiveSessions": "مشاهده دستگاه‌های فعال", + "authToViewYourActiveSessions": "لطفاً برای مشاهده دستگاه‌های فعال خود احراز هویت کنید", + "no": "خیر", + "yes": "بله", + "social": "شبکه اجتماعی", + "rateUsOnStore": "به ما در {storeName} امتیاز دهید", + "blog": "وبلاگ", + "merchandise": "کالا", + "twitter": "توییتر", + "mastodon": "ماستودون", + "matrix": "ماتریس", + "discord": "دیسکورد", + "reddit": "ردیت", + "support": "پشتیبانی", + "theme": "تم", + "lightTheme": "روشن", + "darkTheme": "تیره", + "systemTheme": "سیستم", + "manageFamily": "مدیریت خانواده", + "send": "ارسال", + "youAreOnAFamilyPlan": "شما در یک برنامه خانوادگی هستید!", + "startBackup": "شروع پشتیبان گیری", + "grantFullAccessPrompt": "لطفا اجازه دسترسی به تمام عکس‌ها را در تنظیمات برنامه بدهید", + "existingUser": "کاربر موجود", + "privateBackups": "پشتیبان گیری خصوصی", + "forYourMemories": "برای خاطرات شما", + "endtoendEncryptedByDefault": "به صورت پیش‌فرض رمزگذاری سرتاسر", + "safelyStored": "به طور ایمن", + "atAFalloutShelter": "در یک پناهگاه ذخیره می‌شود", + "designedToOutlive": "طراحی شده تا بیشتر زنده بماند", + "available": "در دسترس", + "everywhere": "همه جا", + "androidIosWebDesktop": "اندروید، آی‌اواس، وب، رایانه رومیزی", + "newToEnte": "کاربر جدید Ente", + "pleaseLoginAgain": "لطفا دوباره وارد شوید", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente فقط در صورتی می‌تواند پرونده‌ها را رمزگذاری و نگه‌داری کند که به آن‌ها دسترسی داشته باشید", + "pleaseGrantPermissions": "لطفا دسترسی بدهید", + "grantPermission": "دسترسی دادن", + "privateSharing": "اشتراک گذاری خصوصی", + "shareOnlyWithThePeopleYouWant": "فقط با افرادی که می‌خواهید به اشتراک بگذارید", + "usePublicLinksForPeopleNotOnEnte": "استفاده از پیوندهای عمومی برای افرادی که در Ente نیستند", + "allowPeopleToAddPhotos": "به افراد اجازه دهید عکس اضافه کنند", + "loggingOut": "در حال خروج...", + "deleteAll": "حذف همه", + "renameAlbum": "تغییر نام آلبوم", + "convertToAlbum": "تبدیل به آلبوم", + "sortAlbumsBy": "مرتب‌سازی براساس", + "sortNewestFirst": "ایتدا جدیدترین", + "sortOldestFirst": "ایتدا قدیمی‌ترین", + "rename": "تغییر نام", + "verifying": "در حال تایید...", + "renameFile": "تغییر نام پرونده", + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "به نظر می‌رسد مشکلی وجود دارد. لطفا بعد از مدتی دوباره تلاش کنید. اگر همچنان با خطا مواجه می‌شوید، لطفا با تیم پشتیبانی ما ارتباط برقرار کنید.", + "error": "خطا", + "tempErrorContactSupportIfPersists": "به نظر می‌رسد مشکلی وجود دارد. لطفا بعد از مدتی دوباره تلاش کنید. اگر همچنان با خطا مواجه می‌شوید، لطفا با تیم پشتیبانی ما ارتباط برقرار کنید.", + "preparingLogs": "در حال آماده‌سازی لاگ‌ها...", + "didYouKnow": "آیا می‌دانستید؟", + "loadMessage2": "ما تا کنون بیش از ۳۰ میلیون خاطره را حفظ کرده‌ایم", + "color": "رنگ", + "dayToday": "امروز", + "dayYesterday": "دیروز", + "storage": "حافظه ذخیره‌سازی", + "storageBreakupFamily": "خانوادگی", + "storageBreakupYou": "شما", + "@storageBreakupYou": { + "description": "Label to indicate how much storage you are using when you are part of a family plan" + }, + "storageUsageInfo": "{usedAmount} {usedStorageUnit} از {totalAmount} {totalStorageUnit} استفاده شده", + "@storageUsageInfo": { + "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" + }, + "availableStorageSpace": "{freeAmount} {storageUnit} رایگان", + "appVersion": "نسخه: {versionValue}", + "verifyIDLabel": "تایید", + "fileInfoAddDescHint": "افزودن توضیحات...", + "editLocationTagTitle": "ویرایش مکان", + "familyPlanPortalTitle": "خانوادگی", + "androidBiometricHint": "تایید هویت", + "@androidBiometricHint": { + "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricSuccess": "موفقیت", + "@androidBiometricSuccess": { + "description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters." + }, + "androidCancelButton": "لغو", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "fileTypes": "انواع پرونده", + "hearUsWhereTitle": "از کجا در مورد Ente شنیدی؟ (اختیاری)", + "hearUsExplanation": "ما نصب برنامه را ردیابی نمی‌کنیم. اگر بگویید کجا ما را پیدا کردید، به ما کمک می‌کند!", + "developerSettings": "تنظیمات توسعه‌دهنده", + "search": "جستجو", + "whatsNew": "تغییرات جدید", + "reviewSuggestions": "مرور پیشنهادها" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 5d9188b80c..8f4b1e375e 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "Entrez votre adresse e-mail", "accountWelcomeBack": "Bienvenue !", "email": "E-mail", @@ -8,7 +9,7 @@ "enterValidEmail": "Veuillez entrer une adresse email valide.", "deleteAccount": "Supprimer le compte", "askDeleteReason": "Quelle est la principale raison pour laquelle vous supprimez votre compte ?", - "deleteAccountFeedbackPrompt": "Nous sommes désolés de vous voir partir. S'il vous plaît partagez vos commentaires pour nous aider à améliorer le service.", + "deleteAccountFeedbackPrompt": "Nous sommes désolés de vous voir partir. N'hésitez pas à partager vos commentaires pour nous aider à améliorer le service.", "feedback": "Commentaires", "kindlyHelpUsWithThisInformation": "Merci de nous aider avec cette information", "confirmDeletePrompt": "Oui, je veux supprimer définitivement ce compte et toutes ses données.", @@ -23,7 +24,7 @@ "sendEmail": "Envoyer un e-mail", "deleteRequestSLAText": "Votre demande sera traitée sous 72 heures.", "deleteEmailRequest": "Veuillez envoyer un e-mail à account-deletion@ente.io à partir de votre adresse e-mail enregistrée.", - "entePhotosPerm": "ente a besoin d'une autorisation pour préserver vos photos", + "entePhotosPerm": "Ente a besoin d'une autorisation pour préserver vos photos", "ok": "Ok", "createAccount": "Créer un compte", "createNewAccount": "Créer un nouveau compte", @@ -44,7 +45,7 @@ "incorrectRecoveryKeyBody": "La clé de secours que vous avez entrée est incorrecte", "forgotPassword": "Mot de passe oublié", "enterYourRecoveryKey": "Entrez votre clé de récupération", - "noRecoveryKey": "Aucune clé de récupération?", + "noRecoveryKey": "Aucune clé de récupération ?", "sorry": "Désolé", "noRecoveryKeyNoDecryption": "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent pas être déchiffré sans votre mot de passe ou clé de récupération", "verifyEmail": "Vérifier l'email", @@ -71,8 +72,8 @@ "enterPasswordToEncrypt": "Entrez un mot de passe que nous pouvons utiliser pour chiffrer vos données", "enterNewPasswordToEncrypt": "Entrez un nouveau mot de passe que nous pouvons utiliser pour chiffrer vos données", "weakStrength": "Securité Faible", - "strongStrength": "Securité forte", - "moderateStrength": "Sécurité moyenne", + "strongStrength": "Forte", + "moderateStrength": "Moyen", "passwordStrength": "Sécurité du mot de passe : {passwordStrengthValue}", "@passwordStrength": { "description": "Text to indicate the password strength", @@ -136,7 +137,7 @@ "scanThisBarcodeWithnyourAuthenticatorApp": "Scannez ce code-barres avec\nvotre application d'authentification", "enterThe6digitCodeFromnyourAuthenticatorApp": "Entrez le code à 6 chiffres de\nvotre application d'authentification", "confirm": "Confirmer", - "setupComplete": "Configuration fini", + "setupComplete": "Configuration terminée", "saveYourRecoveryKeyIfYouHaventAlready": "Enregistrez votre clé de récupération si vous ne l'avez pas déjà fait", "thisCanBeUsedToRecoverYourAccountIfYou": "Cela peut être utilisé pour récupérer votre compte si vous perdez votre deuxième facteur", "twofactorAuthenticationPageTitle": "Authentification à deux facteurs", @@ -144,7 +145,7 @@ "verifyingRecoveryKey": "Vérification de la clé de récupération...", "recoveryKeyVerified": "Clé de récupération vérifiée", "recoveryKeySuccessBody": "Génial ! Votre clé de récupération est valide. Merci de votre vérification.\n\nN'oubliez pas de garder votre clé de récupération sauvegardée.", - "invalidRecoveryKey": "La clé de récupération que vous avez saisie n'est pas valide. Veuillez vous assurer qu'elle ", + "invalidRecoveryKey": "La clé de récupération que vous avez saisie n'est pas valide. Veuillez vérifier qu'elle contient 24 caractères et qu'ils sont correctement orthographiés.\n\nSi vous avez saisi un ancien code de récupération, veuillez vérifier qu'il contient 64 caractères et qu'ils sont correctement orthographiés.", "invalidKey": "Clé invalide", "tryAgain": "Réessayer", "viewRecoveryKey": "Voir la clé de récupération", @@ -163,12 +164,12 @@ }, "you": "Vous", "collaborator": "Collaborateur", - "addMore": "Ajouter Plus", + "addMore": "Ajouter", "@addMore": { "description": "Button text to add more collaborators/viewers" }, "viewer": "Observateur", - "remove": "Enlever", + "remove": "Supprimer", "removeParticipant": "Supprimer le participant", "@removeParticipant": { "description": "menuSectionTitle for removing a participant" @@ -177,7 +178,7 @@ "addedAs": "Ajouté comme", "changePermissions": "Modifier les permissions ?", "yesConvertToViewer": "Oui, convertir en observateur", - "cannotAddMorePhotosAfterBecomingViewer": "{user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourrait toujours supprimer les photos existantes ajoutées par eux", + "cannotAddMorePhotosAfterBecomingViewer": "{user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourra toujours supprimer les photos existantes ajoutées par eux", "allowAddingPhotos": "Autoriser l'ajout de photos", "@allowAddingPhotos": { "description": "Switch button to enable uploading photos to a public link" @@ -185,7 +186,7 @@ "allowAddPhotosDescription": "Autoriser les personnes avec le lien à ajouter des photos à l'album partagé.", "passwordLock": "Mot de passe verrou", "disableDownloadWarningTitle": "Veuillez remarquer", - "disableDownloadWarningBody": "Les téléspectateurs peuvent toujours prendre des captures d'écran ou enregistrer une copie de vos photos en utilisant des outils externes", + "disableDownloadWarningBody": "Les observateurs peuvent toujours prendre des captures d'écran ou enregistrer une copie de vos photos en utilisant des outils externes", "allowDownloads": "Autoriser les téléchargements", "linkDeviceLimit": "Limite d'appareil", "noDeviceLimit": "Aucune", @@ -225,17 +226,17 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Créez un lien pour permettre aux gens d'ajouter et de voir des photos dans votre album partagé sans avoir besoin d'une application ente ou d'un compte. Idéal pour collecter des photos d'événement.", + "collabLinkSectionDescription": "Créez un lien pour permettre aux gens d'ajouter et de voir des photos dans votre album partagé sans avoir besoin d'une application ente ou d'un compte. Idéal pour récupérer des photos d'événement.", "collectPhotos": "Récupérer les photos", "collaborativeLink": "Lien collaboratif", - "shareWithNonenteUsers": "Partager avec des utilisateurs non-ente", + "shareWithNonenteUsers": "Partager avec des utilisateurs non-Ente", "createPublicLink": "Créer un lien public", "sendLink": "Envoyer le lien", "copyLink": "Copier le lien", "linkHasExpired": "Le lien a expiré", "publicLinkEnabled": "Lien public activé", "shareALink": "Partager le lien", - "sharedAlbumSectionDescription": "Créez des albums partagés et collaboratifs avec d'autres utilisateurs de ente, y compris des utilisateurs sur des plans gratuits.", + "sharedAlbumSectionDescription": "Créez des albums partagés et collaboratifs avec d'autres utilisateurs de Ente, y compris des utilisateurs ayant des plans gratuits.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Partagez avec des personnes spécifiques} =1 {Partagé avec 1 personne} other {Partagé avec {numberOfPeople} des gens}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +260,12 @@ }, "verificationId": "ID de vérification", "verifyEmailID": "Vérifier {email}", - "emailNoEnteAccount": "{email} n'a pas de compte ente.\n\nEnvoyez une invitation pour partager des photos.", + "emailNoEnteAccount": "{email} n'a pas de compte Ente.\n\nEnvoyez une invitation pour partager des photos.", "shareMyVerificationID": "Voici mon ID de vérification : {verificationID} pour ente.io.", "shareTextConfirmOthersVerificationID": "Hé, pouvez-vous confirmer qu'il s'agit de votre ID de vérification ente.io : {verificationID}", "somethingWentWrong": "Un problème est survenu", "sendInvite": "Envoyer Invitations", - "shareTextRecommendUsingEnte": "Téléchargez ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io", + "shareTextRecommendUsingEnte": "Téléchargez Ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io", "done": "Terminé", "applyCodeTitle": "Utiliser le code", "enterCodeDescription": "Entrez le code fourni par votre ami pour réclamer de l'espace de stockage gratuit pour vous deux", @@ -272,6 +273,10 @@ "failedToApplyCode": "Impossible d'appliquer le code", "enterReferralCode": "Entrez le code de parrainage", "codeAppliedPageTitle": "Code appliqué", + "changeYourReferralCode": "Modifier votre code de parrainage", + "change": "Modifier", + "unavailableReferralCode": "Désolé, ce code n'est pas disponible.", + "codeChangeLimitReached": "Désolé, vous avez atteint la limite de changements de code.", "storageInGB": "{storageAmountInGB} Go", "claimed": "Réclamée", "@claimed": { @@ -281,7 +286,7 @@ "claimMore": "Réclamez plus !", "theyAlsoGetXGb": "Ils obtiennent aussi {storageAmountInGB} Go", "freeStorageOnReferralSuccess": "{storageAmountInGB} Go chaque fois que quelqu'un s'inscrit à une offre payante et applique votre code", - "shareTextReferralCode": "code de parrainage ente : {referralCode} \n\nAppliquez le dans Paramètres → Général → Références pour obtenir {referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io", + "shareTextReferralCode": "Code de parrainage Ente : {referralCode} \n\nValidez le dans Paramètres → Général → Références pour obtenir {referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io", "claimFreeStorage": "Réclamer le stockage gratuit", "inviteYourFriends": "Invite tes ami(e)s", "failedToFetchReferralDetails": "Impossible de récupérer les détails du parrainage. Veuillez réessayer plus tard.", @@ -304,6 +309,7 @@ } }, "faq": "FAQ", + "help": "Aide", "oopsSomethingWentWrong": "Oups, une erreur est arrivée", "peopleUsingYourCode": "Personnes utilisant votre code", "eligible": "éligible", @@ -333,7 +339,7 @@ "removeParticipantBody": "{userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l'album", "keepPhotos": "Conserver les photos", "deletePhotos": "Supprimer des photos", - "inviteToEnte": "Inviter à ente", + "inviteToEnte": "Inviter à rejoindre Ente", "removePublicLink": "Supprimer le lien public", "disableLinkMessage": "Cela supprimera le lien public pour accéder à \"{albumName}\".", "sharing": "Partage...", @@ -350,9 +356,9 @@ "photoSmallCase": "photo", "singleFileDeleteHighlight": "Elle sera supprimée de tous les albums.", "singleFileInBothLocalAndRemote": "Cette {fileType} est à la fois sur ente et sur votre appareil.", - "singleFileInRemoteOnly": "Ce {fileType} sera supprimé de ente.", + "singleFileInRemoteOnly": "Cette {fileType} sera supprimée de l'Ente.", "singleFileDeleteFromDevice": "Elle {fileType} sera supprimée de votre appareil.", - "deleteFromEnte": "Supprimer de ente", + "deleteFromEnte": "Supprimé de Ente", "yesDelete": "Oui, supprimer", "movedToTrash": "Déplacé dans la corbeille", "deleteFromDevice": "Supprimer de l'appareil", @@ -406,6 +412,14 @@ }, "photoGridSize": "Taille de la grille photo", "manageDeviceStorage": "Gérer le stockage de l'appareil", + "machineLearning": "Apprentissage automatique", + "magicSearch": "Recherche magique", + "loadingModel": "Téléchargement des modèles...", + "waitingForWifi": "En attente de connexion Wi-Fi...", + "status": "État", + "indexedItems": "Éléments indexés", + "pendingItems": "Éléments en attente", + "clearIndexes": "Effacer les index", "selectFoldersForBackup": "Sélectionner les dossiers à sauvegarder", "selectedFoldersWillBeEncryptedAndBackedUp": "Les dossiers sélectionnés seront cryptés et sauvegardés", "unselectAll": "Désélectionner tout", @@ -441,6 +455,7 @@ "privacy": "Confidentialité", "terms": "Conditions", "checkForUpdates": "Vérifier les mises à jour", + "checkStatus": "Vérifier le statut", "checking": "Vérification...", "youAreOnTheLatestVersion": "Vous êtes sur la dernière version", "account": "Compte", @@ -455,7 +470,7 @@ "authToInitiateAccountDeletion": "Veuillez vous authentifier pour débuter la suppression du compte", "areYouSureYouWantToLogout": "Voulez-vous vraiment vous déconnecter ?", "yesLogout": "Oui, se déconnecter", - "aNewVersionOfEnteIsAvailable": "Une nouvelle version de ente est disponible.", + "aNewVersionOfEnteIsAvailable": "Une nouvelle version de Ente est disponible.", "update": "Mise à jour", "installManually": "Installation manuelle", "criticalUpdateAvailable": "Mise à jour critique disponible", @@ -468,9 +483,12 @@ "backedUpFolders": "Dossiers sauvegardés", "backup": "Sauvegarde", "freeUpDeviceSpace": "Libérer de l'espace sur l'appareil", + "freeUpDeviceSpaceDesc": "Économisez de l'espace sur votre appareil en effaçant les fichiers qui ont déjà été sauvegardés.", "allClear": "✨ Tout est effacé", "noDeviceThatCanBeDeleted": "Vous n'avez pas de fichiers sur cet appareil qui peuvent être supprimés", "removeDuplicates": "Supprimer les doublons", + "removeDuplicatesDesc": "Examiner et supprimer les fichiers qui sont des doublons exacts.", + "viewLargeFiles": "Fichiers volumineux", "noDuplicates": "✨ Aucun doublon", "youveNoDuplicateFilesThatCanBeCleared": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", "success": "Succès", @@ -515,7 +533,7 @@ "authToViewYourRecoveryKey": "Veuillez vous authentifier pour afficher votre clé de récupération", "twofactor": "Double authentification", "authToConfigureTwofactorAuthentication": "Veuillez vous authentifier pour configurer l'authentification à deux facteurs", - "lockscreen": "Ecran de vérouillage", + "lockscreen": "Écran de verrouillage", "authToChangeLockscreenSetting": "Veuillez vous authentifier pour modifier les paramètres de l'écran de verrouillage", "viewActiveSessions": "Afficher les sessions actives", "authToViewYourActiveSessions": "Veuillez vous authentifier pour voir vos sessions actives", @@ -543,11 +561,11 @@ "systemTheme": "Système", "freeTrial": "Essai gratuit", "selectYourPlan": "Sélectionner votre offre", - "enteSubscriptionPitch": "ente conserve vos souvenirs, donc ils sont toujours disponibles pour vous, même si vous perdez votre appareil.", + "enteSubscriptionPitch": "Ente conserve vos souvenirs, ils sont donc toujours disponibles pour vous, même si vous perdez votre appareil.", "enteSubscriptionShareWithFamily": "Vous pouvez également ajouter votre famille à votre forfait.", "currentUsageIs": "L'utilisation actuelle est ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": { "0": "Current usage is 1.2 GB" }, @@ -557,6 +575,7 @@ "renewsOn": "Renouvellement le {endDate}", "freeTrialValidTill": "Essai gratuit valide jusqu’au {endDate}", "validTill": "Valable jusqu'au {endDate}", + "addOnValidTill": "Votre extension de {storageAmount} est valable jusqu'au {endDate}", "playStoreFreeTrialValidTill": "Essai gratuit valable jusqu'à {endDate}.\nVous pouvez choisir un plan payant par la suite.", "subWillBeCancelledOn": "Votre abonnement sera annulé le {endDate}", "subscription": "Abonnement", @@ -608,7 +627,7 @@ "appleId": "Apple ID", "playstoreSubscription": "Abonnement au PlayStore", "appstoreSubscription": "Abonnement à l'AppStore", - "subAlreadyLinkedErrMessage": "Votre {id} est déjà lié à un autre compte ente.\nSi vous souhaitez utiliser votre {id} avec ce compte, veuillez contacter notre support", + "subAlreadyLinkedErrMessage": "Votre {id} est déjà lié à un autre compte Ente.\nSi vous souhaitez utiliser votre {id} avec ce compte, veuillez contacter notre support", "visitWebToManage": "Veuillez visiter web.ente.io pour gérer votre abonnement", "couldNotUpdateSubscription": "Impossible de mettre à jour l’abonnement", "pleaseContactSupportAndWeWillBeHappyToHelp": "Veuillez contacter support@ente.io et nous serons heureux de vous aider!", @@ -629,7 +648,7 @@ "thankYou": "Merci", "failedToVerifyPaymentStatus": "Échec de la vérification du statut du paiement", "pleaseWaitForSometimeBeforeRetrying": "Veuillez attendre quelque temps avant de réessayer", - "paymentFailedWithReason": "Malheureusement, votre paiement a échoué pour {reason}", + "paymentFailedMessage": "Malheureusement votre paiement a échoué. Veuillez contacter le support et nous vous aiderons !", "youAreOnAFamilyPlan": "Vous êtes sur un plan familial !", "contactFamilyAdmin": "Veuillez contacter {familyAdminEmail} pour gérer votre abonnement", "leaveFamily": "Quitter le plan familial", @@ -653,9 +672,9 @@ "everywhere": "partout", "androidIosWebDesktop": "Android, iOS, Web, Ordinateur", "mobileWebDesktop": "Mobile, Web, Ordinateur", - "newToEnte": "Nouveau sur ente", + "newToEnte": "Nouveau à Ente", "pleaseLoginAgain": "Veuillez vous reconnecter", - "devAccountChanged": "Le compte développeur que nous utilisons pour publier ente sur l'App Store a changé. Pour cette raison, vous devrez vous connecter à nouveau.\n\nNous nous excusons pour la gêne occasionnée, mais cela était inévitable.", + "autoLogoutMessage": "En raison d'un problème technique, vous avez été déconnecté. Veuillez nous excuser pour le désagrément.", "yourSubscriptionHasExpired": "Votre abonnement a expiré", "storageLimitExceeded": "Limite de stockage atteinte", "upgrade": "Améliorer", @@ -666,12 +685,12 @@ }, "backupFailed": "Échec de la sauvegarde", "couldNotBackUpTryLater": "Nous n'avons pas pu sauvegarder vos données.\nNous allons réessayer plus tard.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente peut chiffrer et conserver des fichiers que si vous leur accordez l'accès", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente peut chiffrer et conserver des fichiers que si vous leur accordez l'accès", "pleaseGrantPermissions": "Veuillez accorder la permission", "grantPermission": "Accorder la permission", "privateSharing": "Partage privé", "shareOnlyWithThePeopleYouWant": "Partager uniquement avec les personnes que vous voulez", - "usePublicLinksForPeopleNotOnEnte": "Utiliser des liens publics pour les personnes qui ne sont pas sur ente", + "usePublicLinksForPeopleNotOnEnte": "Utiliser des liens publics pour les personnes qui ne sont pas sur Ente", "allowPeopleToAddPhotos": "Autoriser les personnes à ajouter des photos", "shareAnAlbumNow": "Partagez un album maintenant", "collectEventPhotos": "Collecter des photos de l'événement", @@ -683,7 +702,7 @@ }, "onDevice": "Sur l'appareil", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "Sur ente", @@ -694,6 +713,21 @@ "deleteEmptyAlbumsWithQuestionMark": "Supprimer les albums vides ?", "deleteAlbumsDialogBody": "Ceci supprimera tous les albums vides. Ceci est utile lorsque vous voulez réduire l'encombrement dans votre liste d'albums.", "deleteProgress": "Suppression de {currentlyDeleting} / {totalCount}", + "genericProgress": "Traitement en cours {currentlyProcessing} / {totalCount}", + "@genericProgress": { + "description": "Generic progress text to display when processing multiple items", + "type": "text", + "placeholders": { + "currentlyProcessing": { + "example": "1", + "type": "int" + }, + "totalCount": { + "example": "10", + "type": "int" + } + } + }, "permanentlyDelete": "Supprimer définitivement", "canOnlyCreateLinkForFilesOwnedByYou": "Ne peut créer de lien que pour les fichiers que vous possédez", "publicLinkCreated": "Lien public créé", @@ -714,7 +748,7 @@ "saveCollage": "Enregistrer le collage", "collageSaved": "Collage sauvegardé dans la galerie", "collageLayout": "Disposition", - "addToEnte": "Ajouter à ente", + "addToEnte": "Ajouter à Ente", "addToAlbum": "Ajouter à l'album", "delete": "Supprimer", "hide": "Masquer", @@ -779,10 +813,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Les photos ajoutées par vous seront retirées de l'album", "youveNoFilesInThisAlbumThatCanBeDeleted": "Vous n'avez pas de fichiers dans cet album qui peuvent être supprimés", "youDontHaveAnyArchivedItems": "Vous n'avez aucun élément archivé.", - "ignoredFolderUploadReason": "Certains fichiers de cet album sont ignorés parce qu'ils avaient été précédemment supprimés de ente.", + "ignoredFolderUploadReason": "Certains fichiers de cet album sont ignorés parce qu'ils avaient été précédemment supprimés de Ente.", "resetIgnoredFiles": "Réinitialiser les fichiers ignorés", - "deviceFilesAutoUploading": "Les fichiers ajoutés à cet album seront automatiquement téléchargés sur ente.", - "turnOnBackupForAutoUpload": "Activez la sauvegarde pour télécharger automatiquement les fichiers ajoutés à ce dossier de l'appareil sur ente.", + "deviceFilesAutoUploading": "Les fichiers ajoutés à cet album seront automatiquement téléchargés sur Ente.", + "turnOnBackupForAutoUpload": "Activez la sauvegarde pour charger automatiquement sur Ente les fichiers ajoutés à ce dossier de l'appareil.", "noHiddenPhotosOrVideos": "Aucune photo ou vidéo cachée", "toHideAPhotoOrVideo": "Cacher une photo ou une vidéo", "openTheItem": "• Ouvrir l'élément", @@ -808,6 +842,7 @@ "close": "Fermer", "setAs": "Définir comme", "fileSavedToGallery": "Fichier enregistré dans la galerie", + "filesSavedToGallery": "Fichiers enregistrés dans la galerie", "fileFailedToSaveToGallery": "Échec de l'enregistrement dans la galerie", "download": "Télécharger", "pressAndHoldToPlayVideo": "Appuyez et maintenez enfoncé pour lire la vidéo", @@ -820,7 +855,6 @@ "clubByFileName": "Grouper par nom de fichier", "count": "Total", "totalSize": "Taille totale", - "time": "Date et heure", "longpressOnAnItemToViewInFullscreen": "Appuyez longuement sur un élément pour le voir en plein écran", "decryptingVideo": "Déchiffrement de la vidéo...", "authToViewYourMemories": "Veuillez vous authentifier pour voir vos souvenirs", @@ -897,10 +931,10 @@ "description": "Text to tell user how many memories have been preserved", "placeholders": { "completed": { - "type": "int" + "type": "String" }, "total": { - "type": "int" + "type": "String" } } }, @@ -911,21 +945,23 @@ "renameFile": "Renommer le fichier", "enterFileName": "Entrez le nom du fichier", "filesDeleted": "Fichiers supprimés", - "selectedFilesAreNotOnEnte": "Les fichiers sélectionnés ne sont pas sur ente", + "selectedFilesAreNotOnEnte": "Les fichiers sélectionnés ne sont pas sur Ente", "thisActionCannotBeUndone": "Cette action ne peut pas être annulée", "emptyTrash": "Vider la corbeille ?", "permDeleteWarning": "Tous les éléments de la corbeille seront définitivement supprimés\n\nCette action ne peut pas être annulée", - "empty": "Vide", + "empty": "Vider", "couldNotFreeUpSpace": "Impossible de libérer de l'espace", "permanentlyDeleteFromDevice": "Supprimer définitivement de l'appareil ?", "someOfTheFilesYouAreTryingToDeleteAre": "Certains des fichiers que vous essayez de supprimer ne sont disponibles que sur votre appareil et ne peuvent pas être récupérés s'ils sont supprimés", "theyWillBeDeletedFromAllAlbums": "Ils seront supprimés de tous les albums.", - "someItemsAreInBothEnteAndYourDevice": "Certains éléments sont à la fois dans ente et votre appareil.", + "someItemsAreInBothEnteAndYourDevice": "Certains éléments sont à la fois sur Ente et votre appareil.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille.", "theseItemsWillBeDeletedFromYourDevice": "Ces éléments seront supprimés de votre appareil.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Il semble qu'une erreur s'est produite. Veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter notre équipe d'assistance.", "error": "Erreur", "tempErrorContactSupportIfPersists": "Il semble qu'une erreur s'est produite. Veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter notre équipe d'assistance.", + "networkHostLookUpErr": "Impossible de se connecter à Ente, veuillez vérifier vos paramètres réseau et contacter le support si l'erreur persiste.", + "networkConnectionRefusedErr": "Impossible de se connecter à Ente, veuillez réessayer après un certain temps. Si l'erreur persiste, veuillez contacter le support.", "cachedData": "Données mises en cache", "clearCaches": "Nettoyer le cache", "remoteImages": "Images distantes", @@ -958,7 +994,7 @@ "fileTypesAndNames": "Types et noms de fichiers", "location": "Emplacement", "moments": "Souvenirs", - "searchFaceEmptySection": "Trouver toutes les photos d'une personne", + "searchFaceEmptySection": "Les personnes seront affichées ici une fois l'indexation terminée", "searchDatesEmptySection": "Recherche par date, mois ou année", "searchLocationEmptySection": "Grouper les photos qui sont prises dans un certain angle d'une photo", "searchPeopleEmptySection": "Invitez des gens, et vous verrez ici toutes les photos qu'ils partagent", @@ -1013,7 +1049,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "availableStorageSpace": "{freeAmount} {storageUnit} libre", + "availableStorageSpace": "{freeAmount} {storageUnit} gratuit", "appVersion": "Version : {versionValue}", "verifyIDLabel": "Vérifier", "fileInfoAddDescHint": "Ajouter une description...", @@ -1102,7 +1138,7 @@ "noAlbumsSharedByYouYet": "Aucun album que vous avez partagé", "sharedWithYou": "Partagé avec vous", "sharedByYou": "Partagé par vous", - "inviteYourFriendsToEnte": "Invitez vos amis sur ente", + "inviteYourFriendsToEnte": "Invitez vos amis sur Ente", "failedToDownloadVideo": "Échec du téléchargement de la vidéo", "hiding": "Masquage en cours...", "unhiding": "Démasquage en cours...", @@ -1112,7 +1148,7 @@ "addToHiddenAlbum": "Ajouter à un album masqué", "moveToHiddenAlbum": "Déplacer vers un album masqué", "fileTypes": "Types de fichiers", - "deleteConfirmDialogBody": "Ce compte est lié à d'autres applications ente, si vous en utilisez une.\\n\\nVos données téléchargées, dans toutes les applications ente, seront planifiées pour suppression, et votre compte sera définitivement supprimé.", + "deleteConfirmDialogBody": "Ce compte est lié à d'autres applications Ente, si vous en utilisez une. Vos données téléchargées, dans toutes les applications ente, seront planifiées pour suppression, et votre compte sera définitivement supprimé.", "hearUsWhereTitle": "Comment avez-vous entendu parler de Ente? (facultatif)", "hearUsExplanation": "Nous ne suivons pas les installations d'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !", "viewAddOnButton": "Afficher les modules complémentaires", @@ -1142,68 +1178,112 @@ } }, "faces": "Visages", + "people": "Personnes", "contents": "Contenus", "addNew": "Ajouter un nouveau", "@addNew": { "description": "Text to add a new item (location tag, album, caption etc)" }, "contacts": "Contacts", - "editLocation": "Edit location", - "selectALocation": "Select a location", - "selectALocationFirst": "Select a location first", - "changeLocationOfSelectedItems": "Change location of selected items?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", - "joinDiscord": "Join Discord", - "locations": "Locations", + "noInternetConnection": "Aucune connexion internet", + "pleaseCheckYourInternetConnectionAndTryAgain": "S'il vous plaît, vérifiez votre connexion à internet et réessayez.", + "signOutFromOtherDevices": "Se déconnecter d'autres appareils", + "signOutOtherBody": "Si vous pensez que quelqu'un peut connaître votre mot de passe, vous pouvez forcer tous les autres appareils utilisant votre compte à se déconnecter.", + "signOutOtherDevices": "Déconnecter les autres appareils", + "doNotSignOut": "Ne pas se déconnecter", + "editLocation": "Modifier l’emplacement", + "selectALocation": "Sélectionnez un emplacement", + "selectALocationFirst": "Sélectionnez d'abord un emplacement", + "changeLocationOfSelectedItems": "Changer l'emplacement des éléments sélectionnés ?", + "editsToLocationWillOnlyBeSeenWithinEnte": "Les modifications de l'emplacement ne seront visibles que dans Ente", + "cleanUncategorized": "Effacer les éléments non classés", + "cleanUncategorizedDescription": "Supprimer tous les fichiers non-catégorisés étant présents dans d'autres albums", + "waitingForVerification": "En attente de vérification...", + "passkey": "Code d'accès", + "passkeyAuthTitle": "Vérification du code d'accès", + "passKeyPendingVerification": "La vérification est toujours en attente", + "loginSessionExpired": "Session expirée", + "loginSessionExpiredDetails": "Votre session a expiré. Veuillez vous reconnecter.", + "verifyPasskey": "Vérifier le code d'accès", + "playOnTv": "Lire l'album sur la TV", + "pair": "Associer", + "deviceNotFound": "Appareil non trouvé", + "castInstruction": "Visitez cast.ente.io sur l'appareil que vous voulez associer.\n\nEntrez le code ci-dessous pour lire l'album sur votre TV.", + "deviceCodeHint": "Saisissez le code", + "joinDiscord": "Rejoindre Discord", + "locations": "Emplacements", "descriptions": "Descriptions", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Vue Invité", - "cl_guest_view_description": "Vous montrez des photos à un ami ? Pas de souci, il ne pourra pas trop faire défiler. La vue invité verrouille les photos que vous sélectionnez.", - "cl_guest_view_call_to_action": "Sélectionnez des photos et essayez la \"Vue Invité\".", - "cl_panorama_viewer_title": "Visionneuse Panorama", - "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec une navigation basée sur le mouvement !", - "cl_video_player_title": "Lecteur Vidéo", - "cl_video_player_description": "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "addAName": "Ajouter un nom", + "findPeopleByName": "Trouver des personnes rapidement par leur nom", + "addViewers": "{count, plural, zero {Ajouter un lecteur} one {Ajouter un lecteur} other {Ajouter des lecteurs}}", + "addCollaborators": "{count, plural, zero {Ajouter un coauteur} one {Ajouter un coauteur} other {Ajouter des coauteurs}}", + "longPressAnEmailToVerifyEndToEndEncryption": "Appuyez longuement sur un e-mail pour vérifier le chiffrement de bout en bout.", + "developerSettingsWarning": "Êtes-vous sûr de vouloir modifier les paramètres du développeur ?", + "developerSettings": "Paramètres du développeur", + "serverEndpoint": "Point de terminaison serveur", + "invalidEndpoint": "Point de terminaison non valide", + "invalidEndpointMessage": "Désolé, le point de terminaison que vous avez entré n'est pas valide. Veuillez en entrer un valide puis réessayez.", + "endpointUpdatedMessage": "Point de terminaison mis à jour avec succès", + "customEndpoint": "Connecté à {endpoint}", + "createCollaborativeLink": "Créer un lien collaboratif", + "search": "Rechercher", + "enterPersonName": "Entrez le nom d'une personne", + "removePersonLabel": "Supprimer le libellé d'une personne", + "autoPairDesc": "L'appairage automatique ne fonctionne qu'avec les appareils qui prennent en charge Chromecast.", + "manualPairDesc": "L'appairage avec le code PIN fonctionne avec n'importe quel écran sur lequel vous souhaitez voir votre album.", + "connectToDevice": "Connexion à l'appareil", + "autoCastDialogBody": "Vous verrez ici les appareils Cast disponibles.", + "autoCastiOSPermission": "Assurez-vous que les autorisations de réseau local sont activées pour l'application Ente Photos, dans les paramètres.", + "noDeviceFound": "Aucun appareil trouvé", + "stopCastingTitle": "Arrêter la diffusion", + "stopCastingBody": "Voulez-vous arrêter la diffusion ?", + "castIPMismatchTitle": "Échec de la diffusion de l'album", + "castIPMismatchBody": "Veuillez vous assurer que vous êtes sur le même réseau que la TV.", + "pairingComplete": "Appairage terminé", + "savingEdits": "Enregistrement des modifications...", + "autoPair": "Appairage automatique", + "pairWithPin": "Appairer avec le code PIN", + "faceRecognition": "Reconnaissance faciale", + "foundFaces": "Visages trouvés", + "clusteringProgress": "Progression du regroupement", + "indexingIsPaused": "L'indexation est en pause. Elle reprendra automatiquement lorsque l'appareil sera prêt.", + "rotate": "Pivoter", + "left": "Gauche", + "right": "Droite", + "whatsNew": "Nouveautés", + "reviewSuggestions": "Consulter les suggestions", + "useAsCover": "Utiliser comme couverture", + "panorama": "Panorama", + "reenterPassword": "Ressaisir le mot de passe", + "reenterPin": "Ressaisir le code PIN", + "deviceLock": "Verrouillage de l'appareil", + "pinLock": "Verrouillage du code PIN", + "next": "Suivant", + "setNewPassword": "Définir un nouveau mot de passe", + "enterPin": "Saisir le code PIN", + "setNewPin": "Définir un nouveau code PIN", + "appLock": "Verrouillage d'applications", + "noSystemLockFound": "Aucun verrou système trouvé", + "tapToUnlock": "Appuyer pour déverrouiller", + "tooManyIncorrectAttempts": "Trop de tentatives incorrectes", + "videoInfo": "Informations vidéo", + "autoLock": "Verrouillage automatique", + "immediately": "Immédiatement", + "autoLockFeatureDescription": "Délai après lequel l'application se verrouille une fois qu'elle a été mise en arrière-plan", + "hideContent": "Masquer le contenu", + "hideContentDescriptionAndroid": "Masque le contenu de l'application dans le sélecteur d'applications et désactive les captures d'écran", + "hideContentDescriptionIos": "Masque le contenu de l'application dans le sélecteur d'application", + "passwordStrengthInfo": "La force du mot de passe est calculée en tenant compte de la longueur du mot de passe, des caractères utilisés et du fait que le mot de passe figure ou non parmi les 10 000 mots de passe les plus utilisés", + "noQuickLinksSelected": "Aucun lien rapide sélectionné", + "pleaseSelectQuickLinksToRemove": "Veuillez sélectionner les liens rapides à supprimer", + "removePublicLinks": "Supprimer les liens publics", + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Ceci supprimera les liens publics de tous les liens rapides sélectionnés.", + "cl_guest_view_title": "Vue invité", + "cl_guest_view_description": "Montrer des photos à un ami en les transmettant sur votre téléphone ? Ne vous inquiétez pas si vous les faites glisser trop loin.\nLa vue \"invité\" les verrouillera dans les photos que vous avez sélectionnées.", + "cl_guest_view_call_to_action": "Sélectionnez les photos et fixez les en \"Vue Invité\".", + "cl_panorama_viewer_title": "Visionneuse en panorama", + "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec la navigation basée sur les mouvements !", + "cl_video_player_title": "Lecteur vidéo", + "cl_video_player_description": "Intégration d'un nouveau lecteur vidéo, avec de meilleurs contrôles de lecture et la prise en charge des vidéos HDR.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_gu.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb new file mode 100644 index 0000000000..ad713b19d7 --- /dev/null +++ b/mobile/lib/l10n/intl_he.arb @@ -0,0 +1,823 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "הכנס את כתובת הדוא״ל שלך", + "accountWelcomeBack": "ברוך שובך!", + "email": "דוא\"ל", + "cancel": "בטל", + "verify": "אמת", + "invalidEmailAddress": "כתובת דוא״ל לא תקינה", + "enterValidEmail": "אנא הכנס כתובת דוא\"ל חוקית.", + "deleteAccount": "מחק חשבון", + "askDeleteReason": "מה הסיבה העיקרית שבגללה אתה מוחק את החשבון שלך?", + "deleteAccountFeedbackPrompt": "אנחנו מצטערים לראות שאתה עוזב. אנא תחלוק את המשוב שלך כדי לעזור לנו להשתפר.", + "feedback": "משוב", + "kindlyHelpUsWithThisInformation": "אנא עזור לנו עם המידע הזה", + "confirmDeletePrompt": "כן, אני רוצה למחוק לצמיתות את החשבון הזה וכל המידע שלו.", + "confirmAccountDeletion": "אשר את מחיקת החשבון", + "deleteAccountPermanentlyButton": "מחק את החשבון לצמיתות", + "yourAccountHasBeenDeleted": "החשבון שלך נמחק", + "selectReason": "בחר סיבה", + "deleteReason1": "חסר מאפיין מרכזי שאני צריך", + "deleteReason2": "היישומון או מאפיין מסוים לא מתנהג כמו שאני חושב שהוא צריך", + "deleteReason3": "מצאתי שירות אחר שאני יותר מחבב", + "deleteReason4": "הסיבה שלי לא כלולה", + "sendEmail": "שלח דוא\"ל", + "deleteRequestSLAText": "הבקשה שלך תועבד תוך 72 שעות.", + "deleteEmailRequest": "אנא תשלח דוא\"ל לaccount-deletion@ente.io מהכתובת דוא\"ל שנרשמת איתה.", + "entePhotosPerm": "Ente צריך הרשאות על מנת לשמור את התמונות שלך", + "ok": "אוקיי", + "createAccount": "צור חשבון", + "createNewAccount": "צור חשבון חדש", + "password": "סיסמא", + "confirmPassword": "אמת סיסמא", + "activeSessions": "חיבורים פעילים", + "oops": "אופס", + "somethingWentWrongPleaseTryAgain": "משהו השתבש, אנא נסה שנית", + "thisWillLogYouOutOfThisDevice": "זה ינתק אותך במכשיר זה!", + "thisWillLogYouOutOfTheFollowingDevice": "זה ינתק אותך מהמכשיר הבא:", + "terminateSession": "סיים חיבור?", + "terminate": "סיים", + "thisDevice": "מכשיר זה", + "recoverButton": "שחזר", + "recoverySuccessful": "השחזור עבר בהצלחה!", + "decrypting": "מפענח...", + "incorrectRecoveryKeyTitle": "מפתח שחזור שגוי", + "incorrectRecoveryKeyBody": "המפתח שחזור שהזנת שגוי", + "forgotPassword": "שכחתי סיסמה", + "enterYourRecoveryKey": "הזן את מפתח השחזור שלך", + "noRecoveryKey": "אין מפתח שחזור?", + "sorry": "מצטער", + "noRecoveryKeyNoDecryption": "בשל טבע הפרוטוקול של ההצפנת קצה-אל-קצה שלנו, אין אפשרות לפענח את הנתונים שלך בלי הסיסמה או מפתח השחזור שלך", + "verifyEmail": "אימות דוא\"ל", + "toResetVerifyEmail": "כדי לאפס את הסיסמא שלך, אנא אמת את האימייל שלך קודם.", + "checkInboxAndSpamFolder": "אנא בדוק את תיבת הדואר שלך (והספאם) כדי להשלים את האימות", + "tapToEnterCode": "הקש כדי להזין את הקוד", + "resendEmail": "שלח דוא\"ל מחדש", + "weHaveSendEmailTo": "שלחנו דוא\"ל ל{email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "הגדר סיסמא", + "changePasswordTitle": "שנה סיסמה", + "resetPasswordTitle": "איפוס סיסמה", + "encryptionKeys": "מפתחות ההצפנה", + "passwordWarning": "אנחנו לא שומרים את הסיסמא הזו, לכן אם אתה שוכח אותה, אנחנו לא יכולים לפענח את המידע שלך", + "enterPasswordToEncrypt": "הזן סיסמא כדי שנוכל לפענח את המידע שלך", + "enterNewPasswordToEncrypt": "הזן סיסמא חדשה שנוכל להשתמש בה כדי להצפין את המידע שלך", + "weakStrength": "חלשה", + "strongStrength": "חזקה", + "moderateStrength": "מתונה", + "passwordStrength": "חוזק הסיסמא: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "הססמה הוחלפה בהצלחה", + "generatingEncryptionKeys": "יוצר מפתחות הצפנה...", + "pleaseWait": "אנא המתן...", + "continueLabel": "המשך", + "insecureDevice": "מכשיר בלתי מאובטח", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "אנחנו מצטערים, לא הצלחנו ליצור מפתחות מאובטחים על מכשיר זה.\n\nאנא הירשם ממכשיר אחר.", + "howItWorks": "איך זה עובד", + "encryption": "הצפנה", + "ackPasswordLostWarning": "אני מבין שאם אאבד את הסיסמא, אני עלול לאבד את המידע שלי מכיוון שהמידע שלי מוצפן מקצה אל קצה.", + "privacyPolicyTitle": "מדיניות פרטיות", + "termsOfServicesTitle": "תנאים", + "signUpTerms": "אני מסכים לתנאי שירות ולמדיניות הפרטיות", + "logInLabel": "התחבר", + "loginTerms": "על ידי לחיצה על התחברות, אני מסכים לתנאי שירות ולמדיניות הפרטיות", + "changeEmail": "שנה דוא\"ל", + "enterYourPassword": "הכנס סיסמא", + "welcomeBack": "ברוך שובך!", + "contactSupport": "צור קשר עם התמיכה", + "incorrectPasswordTitle": "סיסמא לא נכונה", + "pleaseTryAgain": "אנא נסה שנית", + "recreatePasswordTitle": "צור סיסמא מחדש", + "useRecoveryKey": "השתמש במפתח שחזור", + "recreatePasswordBody": "המכשיר הנוכחי אינו חזק מספיק כדי לאמת את הסיסמא שלך, אבל אנחנו יכולים ליצור בצורה שתעבוד עם כל המכשירים.\n\nאנא התחבר בעזרת המפתח שחזור שלך וצור מחדש את הסיסמא שלך (אתה יכול להשתמש באותה אחת אם אתה רוצה).", + "verifyPassword": "אמת סיסמא", + "recoveryKey": "מפתח שחזור", + "recoveryKeyOnForgotPassword": "אם אתה שוכח את הסיסמא שלך, הדרך היחידה שתוכל לשחזר את המידע שלך היא עם המפתח הזה.", + "recoveryKeySaveDescription": "אנחנו לא מאחסנים את המפתח הזה, אנא שמור את המפתח 24 מילים הזה במקום בטוח.", + "doThisLater": "מאוחר יותר", + "saveKey": "שמור מפתח", + "recoveryKeyCopiedToClipboard": "מפתח השחזור הועתק ללוח", + "recoverAccount": "שחזר חשבון", + "recover": "שחזר", + "dropSupportEmail": "אנא תשלח דוא\"ל ל{supportEmail} מהכתובת דוא\"ל שנרשמת איתה", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "twofactorSetup": "אימות דו-שלבי", + "enterCode": "הזן קוד", + "scanCode": "סרוק קוד", + "codeCopiedToClipboard": "הקוד הועתק ללוח", + "copypasteThisCodentoYourAuthenticatorApp": "תעתיק ותדביק את הקוד הזה\nלאפליקציית האימות שלך", + "tapToCopy": "הקש כדי להעתיק", + "scanThisBarcodeWithnyourAuthenticatorApp": "סרוק את הברקוד הזה\nבעזרת אפליקציית האימות שלך", + "enterThe6digitCodeFromnyourAuthenticatorApp": "הכנס את הקוד בעל 6 ספרות מתוך\nאפליקציית האימות שלך", + "confirm": "אשר", + "setupComplete": "ההתקנה הושלמה", + "saveYourRecoveryKeyIfYouHaventAlready": "שמור את מפתח השחזור שלך אם לא שמרת כבר", + "thisCanBeUsedToRecoverYourAccountIfYou": "זה יכול לשמש לשחזור החשבון שלך במקרה ותאבד את הגורם השני", + "twofactorAuthenticationPageTitle": "אימות דו-גורמי", + "lostDevice": "איבדת את המכשיר?", + "verifyingRecoveryKey": "מוודא את מפתח השחזור...", + "recoveryKeyVerified": "מפתח השחזור אומת", + "recoveryKeySuccessBody": "נהדר! מפתח השחזור תקין. אנחנו מודים לך על האימות.\n\nאנא תזכור לגבות את מפתח השחזור שלך באופן בטוח.", + "invalidRecoveryKey": "מפתח השחזור שהזמנת אינו תקין. אנא וודא שהוא מכיל 24 מילים, ותבדוק את האיות של כל אחת.\n\nאם הכנסת קוד שחזור ישן, וודא שהוא בעל 64 אותיות, ותבדוק כל אחת מהן.", + "invalidKey": "מפתח לא חוקי", + "tryAgain": "נסה שוב", + "viewRecoveryKey": "צפה במפתח השחזור", + "confirmRecoveryKey": "אמת את מפתח השחזור", + "recoveryKeyVerifyReason": "מפתח השחזור שלך הוא הדרך היחידה לשחזר את התמונות שלך במקרה ותשכח את הסיסמא שלך. אתה יכול למצוא את מפתח השחזור שלך ב-הגדרות > אבטחה.\n\nאנא הכנס את מפתח השחזור שלך כאן על מנת לוודא ששמרת אותו כשורה.", + "confirmYourRecoveryKey": "אמת את מפתח השחזור", + "addViewer": "הוסף צופה", + "addCollaborator": "הוסף משתף פעולה", + "addANewEmail": "הוסף דוא\"ל חדש", + "orPickAnExistingOne": "או בחר באחד קיים", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "משתפי פעולה יכולים להוסיף תמונות וסרטונים לאלבום המשותף.", + "enterEmail": "הזן דוא\"ל", + "albumOwner": "בעלים", + "@albumOwner": { + "description": "Role of the album owner" + }, + "you": "אתה", + "collaborator": "משתף פעולה", + "addMore": "הוסף עוד", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "viewer": "צפיין", + "remove": "הסר", + "removeParticipant": "הסר משתתף", + "@removeParticipant": { + "description": "menuSectionTitle for removing a participant" + }, + "manage": "נהל", + "addedAs": "הוסף בתור", + "changePermissions": "שנה הרשאה?", + "yesConvertToViewer": "כן, המר לצפיין", + "cannotAddMorePhotosAfterBecomingViewer": "{user} לא יוכל להוסיף עוד תמונות לאלבום זה\n\nהם עדיין יכולו להסיר תמונות קיימות שנוספו על ידיהם", + "allowAddingPhotos": "אפשר הוספת תמונות", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowAddPhotosDescription": "בנוסף אפשר לאנשים עם הלינק להוסיף תמונות לאלבום המשותף.", + "passwordLock": "נעילת סיסמא", + "disableDownloadWarningTitle": "שים לב", + "disableDownloadWarningBody": "צופים יכולים עדיין לקחת צילומי מסך או לשמור עותק של התמונות שלך בעזרת כלים חיצוניים", + "allowDownloads": "אפשר הורדות", + "linkDeviceLimit": "מגבלת כמות מכשירים", + "noDeviceLimit": "אין", + "@noDeviceLimit": { + "description": "Text to indicate that there is limit on number of devices" + }, + "linkExpiry": "תאריך תפוגה ללינק", + "linkExpired": "פג תוקף", + "linkEnabled": "מאופשר", + "linkNeverExpires": "לעולם לא", + "expiredLinkInfo": "פג תוקף הקישור. אנא בחר בתאריך תפוגה חדש או השבת את תאריך התפוגה של הקישור.", + "setAPassword": "הגדר סיסמה", + "lockButtonLabel": "נעל", + "enterPassword": "הזן את הסיסמה", + "removeLink": "הסרת קישור", + "manageLink": "ניהול קישור", + "linkExpiresOn": "תוקף הקישור יפוג ב-{expiryTime}", + "albumUpdated": "האלבום עודכן", + "never": "לעולם לא", + "custom": "מותאם אישית", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "after1Hour": "אחרי שעה 1", + "after1Day": "אחרי יום 1", + "after1Week": "אחרי שבוע 1", + "after1Month": "אחרי חודש 1", + "after1Year": "אחרי שנה 1", + "manageParticipants": "נהל", + "albumParticipantsCount": "{count, plural, one {} two {{count} משתתפים} many {{count} משתתפים}=0 {אין משתתפים} =1 {1 משתתף} other {{count} משתתפים}}", + "@albumParticipantsCount": { + "placeholders": { + "count": { + "type": "int", + "example": "5" + } + }, + "description": "Number of participants in an album, including the album owner." + }, + "collabLinkSectionDescription": "צור קישור על מנת לאפשר לאנשים להוסיף ולצפות בתמונות באלבום ששיתפת בלי צורך באפליקציית ente או חשבון. נהדר לאיסוף תמונות של אירועים.", + "collectPhotos": "אסוף תמונות", + "collaborativeLink": "קישור לשיתוף פעולה", + "shareWithNonenteUsers": "שתף עם משתמשים שהם לא של ente", + "createPublicLink": "צור קישור ציבורי", + "sendLink": "שלח קישור", + "copyLink": "העתק קישור", + "linkHasExpired": "הקישור פג תוקף", + "publicLinkEnabled": "לינק ציבורי אופשר", + "shareALink": "שתף קישור", + "sharedAlbumSectionDescription": "צור אלבומים הניתנים לשיתוף ושיתוף פעולה עם משתמשי ente אחרים, כולל משתמשים בתוכניות החינמיות.", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {} two {שותף עם {numberOfPeople} אנשים} many {שותף עם {numberOfPeople} אנשים}=0 {שתף עם אנשים ספציפיים} =1 {שותף עם איש 1} other {שותף עם {numberOfPeople} אנשים}}", + "@shareWithPeopleSectionTitle": { + "placeholders": { + "numberOfPeople": { + "type": "int", + "example": "2" + } + } + }, + "thisIsYourVerificationId": "זה מזהה האימות שלך", + "someoneSharingAlbumsWithYouShouldSeeTheSameId": "מי שמשתף איתך אלבומים יוכל לראות את אותו המזהה במכשיר שלהם.", + "howToViewShareeVerificationID": "אנא בקש מהם ללחוץ לחיצה ארוכה על הכתובת אימייל שלהם בעמוד ההגדרות, וודא שהמזההים בשני המכשירים תואמים.", + "thisIsPersonVerificationId": "זה מזהה האימות של {email}", + "@thisIsPersonVerificationId": { + "placeholders": { + "email": { + "type": "String", + "example": "someone@ente.io" + } + } + }, + "verificationId": "מזהה אימות", + "verifyEmailID": "אמת {email}", + "emailNoEnteAccount": "לא נמצא חשבון ente ל-{email}.\n\nשלח להם הזמנה על מנת לשתף תמונות.", + "shareMyVerificationID": "הנה מזהה האימות שלי: {verificationID} עבור ente.io.", + "shareTextConfirmOthersVerificationID": "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: {verificationID}", + "somethingWentWrong": "משהו השתבש", + "sendInvite": "שלח הזמנה", + "shareTextRecommendUsingEnte": "הורד את ente על מנת שנוכל לשתף תמונות וסרטונים באיכות המקור באופן קל\n\nhttps://ente.io", + "done": "בוצע", + "applyCodeTitle": "החל קוד", + "enterCodeDescription": "הכנס את הקוד שנמסר לך מחברך בשביל לקבל מקום אחסון בחינם עבורך ועבורו", + "apply": "החל", + "failedToApplyCode": "נכשל בהחלת הקוד", + "enterReferralCode": "הזן קוד הפניה", + "codeAppliedPageTitle": "הקוד הוחל", + "storageInGB": "{storageAmountInGB} GB", + "claimed": "נתבע", + "@claimed": { + "description": "Used to indicate storage claimed, like 10GB Claimed" + }, + "details": "פרטים", + "claimMore": "תבע עוד!", + "theyAlsoGetXGb": "הם גם יקבלו {storageAmountInGB} GB", + "freeStorageOnReferralSuccess": "{storageAmountInGB} GB כל פעם שמישהו נרשם עבור תוכנית בתשלום ומחיל את הקוד שלך", + "claimFreeStorage": "תבע מקום אחסון בחינם", + "inviteYourFriends": "הזמן את חברייך", + "failedToFetchReferralDetails": "אחזור פרטי ההפניה נכשל. אנא נסה שוב מאוחר יותר.", + "referralStep1": "1. תמסור את הקוד הזה לחברייך", + "referralStep2": "2. הם נרשמים עבור תוכנית בתשלום", + "referralStep3": "3. שניכים מקבלים {storageInGB} GB* בחינם", + "referralsAreCurrentlyPaused": "הפניות כרגע מושהות", + "youCanAtMaxDoubleYourStorage": "* אתה יכול במקסימום להכפיל את מקום האחסון שלך", + "claimedStorageSoFar": "{isFamilyMember, select, true {קיבלת {storageAmountInGb} GB עד כה} false {קיבלת {storageAmountInGb} GB עד כה} other {קיבלת {storageAmountInGb} GB עד כה!}}", + "@claimedStorageSoFar": { + "placeholders": { + "isFamilyMember": { + "type": "String", + "example": "true" + }, + "storageAmountInGb": { + "type": "int", + "example": "10" + } + } + }, + "faq": "שאלות נפוצות", + "oopsSomethingWentWrong": "אופס, משהו השתבש", + "peopleUsingYourCode": "אנשים משתמשים בקוד שלך", + "eligible": "זכאי", + "total": "סך הכל", + "codeUsedByYou": "הקוד שומש על ידיך", + "freeStorageClaimed": "מקום אחסון בחינם נתבע", + "freeStorageUsable": "מקום אחסון שמיש", + "usableReferralStorageInfo": "כמות האחסון השמישה שלך מוגבלת בתוכנית הנוכחית. אחסון עודף יהפוך שוב לשמיש אחרי שתשדרג את התוכנית שלך.", + "removeFromAlbumTitle": "הסר מהאלבום?", + "removeFromAlbum": "הסר מהאלבום", + "itemsWillBeRemovedFromAlbum": "הפריטים שנבחרו יוסרו מהאלבום הזה", + "removeShareItemsWarning": "חלק מהפריטים שאתה מסיר הוספו על ידי אנשים אחרים, ואתה תאבד גישה אליהם", + "addingToFavorites": "מוסיף למועדפים...", + "removingFromFavorites": "מסיר מהמועדפים...", + "sorryCouldNotAddToFavorites": "סליחה, לא ניתן להוסיף למועדפים!", + "sorryCouldNotRemoveFromFavorites": "סליחה, לא ניתן להסיר מהמועדפים!", + "subscribeToEnableSharing": "נראה שהמנוי שלך עומד לפוג. אנא הירשם כדי לאפשר שיתוף.", + "subscribe": "הרשם", + "canOnlyRemoveFilesOwnedByYou": "יכול להסיר רק קבצים שבבעלותך", + "deleteSharedAlbum": "מחק את האלבום המשותף?", + "deleteAlbum": "מחק אלבום", + "deleteAlbumDialog": "גם להסיר תמונות (וסרטונים) שנמצאים באלבום הזה מכל שאר האלבומים שהם שייכים אליהם?", + "deleteSharedAlbumDialogBody": "האלבום הזה יימחק עבור כולם\n\nאתה תאבד גישה לתמונות משותפות באלבום הזה שבבעלות של אחרים", + "yesRemove": "כן, הסר", + "creatingLink": "יוצר קישור...", + "removeWithQuestionMark": "הסר?", + "removeParticipantBody": "{userEmail} יוסר מהאלבום המשותף הזה\n\nגם תמונות שנוספו על ידיהם יוסרו מהאלבום", + "keepPhotos": "השאר תמונות", + "deletePhotos": "מחק תמונות", + "removePublicLink": "הסר לינק ציבורי", + "disableLinkMessage": "זה יסיר את הלינק הפומבי שדרכו ניתן לגשת ל\"{albumName}\".", + "sharing": "משתף...", + "youCannotShareWithYourself": "אתה לא יכול לשתף עם עצמך", + "archive": "שמירה בארכיון", + "createAlbumActionHint": "לחץ לחיצה ארוכה על מנת לבחור תמונות ולחץ על + על מנת ליצור אלבום", + "importing": "מייבא....", + "failedToLoadAlbums": "נכשל בטעינת האלבומים", + "hidden": "מוסתר", + "authToViewYourHiddenFiles": "אנא התאמת על מנת לראות את הקבצים החבויים שלך", + "trash": "אשפה", + "uncategorized": "ללא קטגוריה", + "videoSmallCase": "וידאו", + "photoSmallCase": "תמונה", + "singleFileDeleteHighlight": "זה יימחק מכל האלבומים.", + "singleFileDeleteFromDevice": "{fileType} יימחק מהמכשיר שלך.", + "yesDelete": "כן, מחק", + "movedToTrash": "הועבר לאשפה", + "deleteFromDevice": "מחק מהמכשיר", + "deleteFromBoth": "מחק משניהם", + "newAlbum": "אלבום חדש", + "albums": "אלבומים", + "memoryCount": "{count, plural, one{{formattedCount} זכרון} two {{formattedCount} זכרונות} many {{formattedCount} זכרונות} other{{formattedCount} זכרונות}}", + "@memoryCount": { + "description": "The text to display the number of memories", + "type": "text", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedCount": { + "type": "String", + "example": "11.513, 11,511" + } + } + }, + "selectedPhotos": "{count} נבחרו", + "@selectedPhotos": { + "description": "Display the number of selected photos", + "type": "text", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } + }, + "selectedPhotosWithYours": "{count} נבחרו ({yourCount} שלך)", + "@selectedPhotosWithYours": { + "description": "Display the number of selected photos, including the number of selected photos owned by the user", + "type": "text", + "placeholders": { + "count": { + "example": "12", + "type": "int" + }, + "yourCount": { + "example": "2", + "type": "int" + } + } + }, + "advancedSettings": "מתקדם", + "@advancedSettings": { + "description": "The text to display in the advanced settings section" + }, + "photoGridSize": "גודל לוח של התמונה", + "manageDeviceStorage": "נהל את מקום אחסון המכשיר", + "selectFoldersForBackup": "בחר תיקיות לגיבוי", + "selectedFoldersWillBeEncryptedAndBackedUp": "התיקיות שנבחרו יוצפנו ויגובו", + "unselectAll": "בטל בחירה של הכל", + "selectAll": "בחר הכל", + "skip": "דלג", + "updatingFolderSelection": "מעדכן את בחירת התיקיות...", + "itemCount": "{count, plural, one{{count} פריט} two {{count} פריטים} many {{count} פריטים} other{{count} פריטים}}", + "deleteItemCount": "{count, plural, one {} two {מחק {count} פריטים} many {מחק {count} פריטים}=1 {מחק {count} פריט} other {מחק {count} פריטים}}", + "duplicateItemsGroup": "{count} קבצים, כל אחד {formattedSize}", + "@duplicateItemsGroup": { + "description": "Display the number of duplicate files and their size", + "type": "text", + "placeholders": { + "count": { + "example": "12", + "type": "int" + }, + "formattedSize": { + "example": "2.3 MB", + "type": "String" + } + } + }, + "showMemories": "הצג זכרונות", + "yearsAgo": "{count, plural, one{לפני {count} שנה} two {לפני {count} שנים} many {לפני {count} שנים} other{לפני {count} שנים}}", + "backupSettings": "הגדרות גיבוי", + "backupOverMobileData": "גבה על רשת סלולרית", + "backupVideos": "גבה סרטונים", + "disableAutoLock": "השבת נעילה אוטומטית", + "about": "אודות", + "weAreOpenSource": "הקוד שלנו פתוח!", + "privacy": "פרטיות", + "terms": "תנאים", + "checkForUpdates": "בדוק עדכונים", + "checking": "בודק...", + "youAreOnTheLatestVersion": "אתה על הגרסא הכי עדכנית", + "account": "חשבון", + "manageSubscription": "נהל מנוי", + "authToChangeYourEmail": "אנא אנא התאמת על מנת לשנות את הדוא\"ל שלך", + "changePassword": "שנה סיסמה", + "authToChangeYourPassword": "אנא התאמת על מנת לשנות את הסיסמא שלך", + "emailVerificationToggle": "אימות מייל", + "authToChangeEmailVerificationSetting": "אנא התאמת על מנת לשנות את הדוא\"ל שלך", + "exportYourData": "ייצוא הנתונים שלך", + "logout": "התנתק", + "authToInitiateAccountDeletion": "אנא התאמת על מנת להתחיל את מחיקת החשבון שלך", + "areYouSureYouWantToLogout": "אתה בטוח שאתה רוצה להתנתק?", + "yesLogout": "כן, התנתק", + "update": "עדכן", + "installManually": "התקן באופן ידני", + "criticalUpdateAvailable": "עדכון חשוב זמין", + "updateAvailable": "עדכון זמין", + "ignoreUpdate": "התעלם", + "downloading": "מוריד...", + "cannotDeleteSharedFiles": "לא ניתן למחוק את הקבצים המשותפים", + "theDownloadCouldNotBeCompleted": "לא ניתן להשלים את ההורדה", + "retry": "נסה שוב", + "backedUpFolders": "תיקיות שגובו", + "backup": "גיבוי", + "freeUpDeviceSpace": "פנה אחסון במכשיר", + "allClear": "✨ הכל נוקה", + "noDeviceThatCanBeDeleted": "אין לך קבצים במכשיר הזה שניתן למחוק אותם", + "removeDuplicates": "הסר כפילויות", + "noDuplicates": "✨ אין כפילויות", + "youveNoDuplicateFilesThatCanBeCleared": "אין לך קבצים כפולים שניתן לנקות אותם", + "success": "הצלחה", + "rateUs": "דרג אותנו", + "remindToEmptyDeviceTrash": "גם נקה \"נמחק לאחרונה\" מ-\"הגדרות\" -> \"אחסון\" על מנת לקבל המקום אחסון שהתפנה", + "youHaveSuccessfullyFreedUp": "הצלחת לפנות {storageSaved}!", + "@youHaveSuccessfullyFreedUp": { + "description": "The text to display when the user has successfully freed up storage", + "type": "text", + "placeholders": { + "storageSaved": { + "example": "1.2 GB", + "type": "String" + } + } + }, + "remindToEmptyEnteTrash": "גם נקה את ה-\"אשפה\" שלך על מנת לקבל את המקום אחסון שהתפנה", + "sparkleSuccess": "✨ הצלחה", + "familyPlans": "תוכניות משפחה", + "referrals": "הפניות", + "notifications": "התראות", + "sharedPhotoNotifications": "אלבומים משותפים חדשים", + "sharedPhotoNotificationsExplanation": "קבל התראות כשמישהו מוסיף תמונה לאלבום משותף שאתה חלק ממנו", + "advanced": "מתקדם", + "general": "כללי", + "security": "אבטחה", + "authToViewYourRecoveryKey": "אנא התאמת על מנת לראות את מפתח השחזור שלך", + "twofactor": "דו-גורמי", + "authToConfigureTwofactorAuthentication": "אנא התאמת כדי להגדיר את האימות הדו-גורמי", + "lockscreen": "מסך נעילה", + "authToChangeLockscreenSetting": "אנא התאמת כדי לשנות את הגדרות מסך הנעילה", + "viewActiveSessions": "צפה בחיבורים פעילים", + "authToViewYourActiveSessions": "אנא התאמת על מנת לראות את החיבורים הפעילים שלך", + "disableTwofactor": "השבת דו-גורמי", + "confirm2FADisable": "האם אתה בטוח שאתה רוצה להשבית את האימות הדו-גורמי?", + "no": "לא", + "yes": "כן", + "social": "חברתי", + "rateUsOnStore": "דרג אותנו ב-{storeName}", + "blog": "בלוג", + "merchandise": "סחורה", + "twitter": "Twitter", + "mastodon": "Mastodon", + "matrix": "Matrix", + "discord": "Discord", + "reddit": "Reddit", + "yourStorageDetailsCouldNotBeFetched": "לא ניתן לאחזר את פרטי מקום האחסון", + "reportABug": "דווח על באג", + "reportBug": "דווח על באג", + "suggestFeatures": "הציעו מאפיינים", + "support": "תמיכה", + "theme": "ערכת נושא", + "lightTheme": "בהיר", + "darkTheme": "כהה", + "systemTheme": "מערכת", + "freeTrial": "ניסיון חינמי", + "selectYourPlan": "בחר תוכנית", + "enteSubscriptionShareWithFamily": "אפשר להוסיף גם את המשפחה שלך לתוכנית.", + "currentUsageIs": "השימוש במקום האחסון כרגע הוא ", + "@currentUsageIs": { + "description": "This text is followed by storage usage", + "examples": { + "0": "Current usage is 1.2 GB" + }, + "type": "text" + }, + "faqs": "שאלות נפוצות", + "freeTrialValidTill": "ניסיון חינם בתוקף עד ל-{endDate}", + "subWillBeCancelledOn": "המנוי שלך יבוטל ב-{endDate}", + "subscription": "מנוי", + "paymentDetails": "פרטי תשלום", + "manageFamily": "נהל משפחה", + "contactToManageSubscription": "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי {provider}.", + "renewSubscription": "חדש מנוי", + "cancelSubscription": "בטל מנוי", + "areYouSureYouWantToRenew": "אתה בטוח שאתה רוצה לחדש?", + "yesRenew": "כן, חדש", + "areYouSureYouWantToCancel": "אתה בטוח שאתה רוצה לבטל?", + "yesCancel": "כן, בטל", + "failedToRenew": "החידוש נכשל", + "failedToCancel": "הביטול נכשל", + "twoMonthsFreeOnYearlyPlans": "חודשיים בחינם בתוכניות שנתיות", + "monthly": "חודשי", + "@monthly": { + "description": "The text to display for monthly plans", + "type": "text" + }, + "yearly": "שנתי", + "@yearly": { + "description": "The text to display for yearly plans", + "type": "text" + }, + "confirmPlanChange": "אשר שינוי תוכנית", + "areYouSureYouWantToChangeYourPlan": "אתה בטוח שאתה רוצה לשנות את התוכנית שלך?", + "youCannotDowngradeToThisPlan": "אתה לא יכול לשנמך לתוכנית הזו", + "cancelOtherSubscription": "אנא בטל את המנוי הקיים מ-{paymentProvider} קודם", + "@cancelOtherSubscription": { + "description": "The text to display when the user has an existing subscription from a different payment provider", + "type": "text", + "placeholders": { + "paymentProvider": { + "example": "Apple", + "type": "String" + } + } + }, + "optionalAsShortAsYouLike": "אופציונלי, קצר ככל שתרצה...", + "send": "שלח", + "askCancelReason": "המנוי שלך בוטל. תרצה לשתף את הסיבה?", + "thankYouForSubscribing": "תודה שנרשמת!", + "yourPurchaseWasSuccessful": "התשלום שלך עבר בהצלחה", + "yourPlanWasSuccessfullyUpgraded": "התוכנית שלך שודרגה בהצלחה", + "yourPlanWasSuccessfullyDowngraded": "התוכנית שלך שונמכה בהצלחה", + "yourSubscriptionWasUpdatedSuccessfully": "המנוי שלך עודכן בהצלחה", + "googlePlayId": "Google Play ID", + "appleId": "Apple ID", + "playstoreSubscription": "מנוי PlayStore", + "appstoreSubscription": "מנוי AppStore", + "visitWebToManage": "אנא בקר ב-web.ente.io על מנת לנהל את המנוי שלך", + "couldNotUpdateSubscription": "לא ניתן לעדכן את המנוי", + "pleaseContactSupportAndWeWillBeHappyToHelp": "אנא צור קשר עם support@ente.io ואנחנו נשמח לעזור!", + "paymentFailed": "התשלום נכשל", + "paymentFailedTalkToProvider": "אנא דבר עם התמיכה של {providerName} אם אתה חוייבת", + "@paymentFailedTalkToProvider": { + "description": "The text to display when the payment failed", + "type": "text", + "placeholders": { + "providerName": { + "example": "AppStore|PlayStore", + "type": "String" + } + } + }, + "continueOnFreeTrial": "המשך עם ניסיון חינמי", + "areYouSureYouWantToExit": "האם אתה בטוח שברצונך לצאת?", + "thankYou": "תודה", + "failedToVerifyPaymentStatus": "נכשל באימות סטטוס התשלום", + "pleaseWaitForSometimeBeforeRetrying": "אנא חכה מעט לפני שאתה מנסה שוב", + "youAreOnAFamilyPlan": "אתה על תוכנית משפחתית!", + "contactFamilyAdmin": "אנא צור קשר עם {familyAdminEmail} על מנת לנהל את המנוי שלך", + "leaveFamily": "עזוב משפחה", + "areYouSureThatYouWantToLeaveTheFamily": "אתה בטוח שאתה רוצה לעזוב את התוכנית המשפתחית?", + "leave": "עזוב", + "rateTheApp": "דרג את האפליקציה", + "startBackup": "התחל גיבוי", + "noPhotosAreBeingBackedUpRightNow": "אף תמונה אינה נמצאת בתהליך גיבוי כרגע", + "preserveMore": "שמור עוד", + "grantFullAccessPrompt": "נא לתת גישה לכל התמונות בתוך ההגדרות של הטלפון", + "openSettings": "פתח הגדרות", + "selectMorePhotos": "בחר תמונות נוספות", + "existingUser": "משתמש קיים", + "privateBackups": "גיבויים פרטיים", + "forYourMemories": "עבור הזכורונות שלך", + "endtoendEncryptedByDefault": "מוצפן מקצה אל קצה כברירת מחדל", + "safelyStored": "נשמר באופן בטוח", + "atAFalloutShelter": "במקלט גרעיני", + "designedToOutlive": "עוצב על מנת לשרוד", + "available": "זמין", + "everywhere": "בכל מקום", + "androidIosWebDesktop": "Android, iOS, דפדפן, שולחן עבודה", + "mobileWebDesktop": "פלאפון, דפדפן, שולחן עבודה", + "pleaseLoginAgain": "אנא התחבר שוב", + "yourSubscriptionHasExpired": "פג תוקף המנוי שלך", + "storageLimitExceeded": "גבול מקום האחסון נחרג", + "upgrade": "שדרג", + "raiseTicket": "צור ticket", + "@raiseTicket": { + "description": "Button text for raising a support tickets in case of unhandled errors during backup", + "type": "text" + }, + "backupFailed": "הגיבוי נכשל", + "couldNotBackUpTryLater": "לא יכולנו לגבות את המידע שלך.\nאנא נסה שוב מאוחר יותר.", + "pleaseGrantPermissions": "נא הענק את ההרשאות", + "grantPermission": "הענק הרשאה", + "privateSharing": "שיתוף פרטי", + "shareOnlyWithThePeopleYouWant": "שתף רק אם אנשים שאתה בוחר", + "allowPeopleToAddPhotos": "תן לאנשים להוסיף תמונות", + "shareAnAlbumNow": "שתף אלבום עכשיו", + "collectEventPhotos": "אסף תמונות מאירוע", + "sessionExpired": "פג תוקף החיבור", + "loggingOut": "מתנתק...", + "@onDevice": { + "description": "The text displayed above folders/albums stored on device", + "type": "text" + }, + "onDevice": "על המכשיר", + "@onEnte": { + "description": "The text displayed above albums backed up to Ente", + "type": "text" + }, + "onEnte": "באנטע", + "name": "שם", + "newest": "החדש ביותר", + "lastUpdated": "עדכון אחרון", + "deleteEmptyAlbums": "למחוק אלבומים ריקים", + "deleteEmptyAlbumsWithQuestionMark": "למחוק אלבומים ריקים?", + "deleteAlbumsDialogBody": "זה ימחק את כל האלבומים הריקים. זה שימושי כשאתה רוצה להפחית את כמות האי סדר ברשימת האלבומים שלך.", + "deleteProgress": "מוחק {currentlyDeleting} / {totalCount}", + "permanentlyDelete": "למחוק לצמיתות?", + "canOnlyCreateLinkForFilesOwnedByYou": "ניתן אך ורק ליצור קישור לקבצים שאתה בבעולתם", + "publicLinkCreated": "קישור ציבורי נוצר", + "youCanManageYourLinksInTheShareTab": "אתה יכול לנהת את הקישורים שלך בלשונית שיתוף.", + "linkCopiedToClipboard": "הקישור הועתק ללוח", + "restore": "שחזר", + "@restore": { + "description": "Display text for an action which triggers a restore of item from trash", + "type": "text" + }, + "moveToAlbum": "הזז לאלבום", + "unhide": "בטל הסתרה", + "unarchive": "הוצאה מארכיון", + "favorite": "מועדף", + "shareLink": "שתף קישור", + "createCollage": "צור קולז", + "saveCollage": "שמור קולז", + "collageSaved": "הקולז נשמר לגלריה", + "collageLayout": "פריסה", + "addToAlbum": "הוסף לאלבום", + "delete": "מחק", + "hide": "הסתר", + "share": "שתף", + "unhideToAlbum": "בטל הסתרה בחזרה לאלבום", + "restoreToAlbum": "שחזר לאלבום", + "moveItem": "{count, plural, one {הזז פריט} two {הזז פריטים} many {הזז פריטים} other {הזז פריטים}}", + "@moveItem": { + "description": "Page title while moving one or more items to an album" + }, + "addItem": "{count, plural, one {הוסף פריט} two {הוסף פריטים} many {הוסף פריטים} other {הוסף פריטים}}", + "@addItem": { + "description": "Page title while adding one or more items to album" + }, + "createOrSelectAlbum": "צור או בחר אלבום", + "selectAlbum": "בחר אלבום", + "searchByAlbumNameHint": "שם האלבום", + "albumTitle": "כותרת האלבום", + "enterAlbumName": "הזן שם אלבום", + "restoringFiles": "משחזר קבצים...", + "movingFilesToAlbum": "מעביר קבצים לאלבום...", + "unhidingFilesToAlbum": "מבטל הסתרת הקבצים לאלבום", + "canNotUploadToAlbumsOwnedByOthers": "לא ניתן להעלות לאלבומים שבבעלות אחרים", + "uploadingFilesToAlbum": "מעלה קבצים לאלבום...", + "invite": "הזמן", + "shareYourFirstAlbum": "שתף את האלבום הראשון שלך", + "sharedWith": "הושתף ע\"י {emailIDs}", + "sharedWithMe": "שותף איתי", + "sharedByMe": "שותף על ידי", + "deleteAll": "מחק הכל", + "setCover": "הגדר כרקע", + "@setCover": { + "description": "Text to set cover photo for an album" + }, + "sortAlbumsBy": "מיין לפי", + "sortOldestFirst": "הישן ביותר קודם", + "rename": "שנה שם", + "leaveSharedAlbum": "לעזוב את האלבום המשותף?", + "leaveAlbum": "צא מהאלבום", + "click": "• לחץ", + "exif": "EXIF", + "noResults": "אין תוצאות", + "close": "סגור", + "setAs": "הגדר בתור", + "fileSavedToGallery": "הקובץ נשמר לגלריה", + "fileFailedToSaveToGallery": "נכשל בעת שמירת הקובץ לגלריה", + "download": "הורד", + "pressAndHoldToPlayVideo": "לחץ והחזק על מנת להריץ את הסרטון", + "pressAndHoldToPlayVideoDetailed": "לחץ והחזק על התמונה על מנת להריץ את הסרטון", + "downloadFailed": "ההורדה נכשלה", + "deduplicateFiles": "הסר קבצים כפולים", + "deselectAll": "בטל בחירה של הכל", + "reviewDeduplicateItems": "אנא בחן והסר את הפריטים שאתה מאמין שהם כפלים.", + "clubByCaptureTime": "קבץ לפי זמן הצילום", + "clubByFileName": "קבץ לפי שם הקובץ", + "count": "כמות", + "totalSize": "גודל כולל", + "longpressOnAnItemToViewInFullscreen": "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא", + "decryptingVideo": "מפענח את הסרטון...", + "authToViewYourMemories": "אנא אמת על מנת לצפות בזכרונות שלך", + "unlock": "ביטול נעילה", + "freeUpSpace": "פנה מקום", + "allMemoriesPreserved": "כל הזכרונות נשמרו", + "syncing": "מסנכרן...", + "syncProgress": "{completed}/{total} זכרונות נשמרו", + "@syncProgress": { + "description": "Text to tell user how many memories have been preserved", + "placeholders": { + "completed": { + "type": "String" + }, + "total": { + "type": "String" + } + } + }, + "renameFile": "שנה שם הקובץ", + "empty": "ריק", + "error": "שגיאה", + "cachedData": "נתונים מוטמנים", + "viewLogs": "צפייה בלוגים", + "preparingLogs": "מכין לוגים...", + "exportLogs": "ייצוא לוגים", + "dismiss": "התעלם", + "location": "מקום", + "language": "שפה", + "kiloMeterUnit": "ק\"מ", + "addLocationButton": "הוסף", + "radius": "רדיוס", + "save": "שמור", + "edit": "ערוך", + "rotateLeft": "סובב שמאלה", + "flip": "הפוך", + "saveCopy": "שמירת עותק", + "light": "אור", + "color": "צבע", + "saving": "שומר...", + "distanceInKMUnit": "ק\"מ", + "@distanceInKMUnit": { + "description": "Unit for distance in km" + }, + "dayToday": "היום", + "dayYesterday": "אתמול", + "storage": "אחסון", + "usedSpace": "מקום בשימוש", + "storageBreakupFamily": "משפחה", + "storageBreakupYou": "אתה", + "@storageBreakupYou": { + "description": "Label to indicate how much storage you are using when you are part of a family plan" + }, + "verifyIDLabel": "אמת", + "setLabel": "הגדר", + "@setLabel": { + "description": "Label of confirm button to add a new custom radius to the radius selector of a location tag" + }, + "setRadius": "הגדר רדיוס", + "familyPlanPortalTitle": "משפחה", + "androidBiometricSuccess": "הצלחה", + "@androidBiometricSuccess": { + "description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters." + }, + "androidCancelButton": "בטל", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "iOSOkButton": "אישור", + "@iOSOkButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." + }, + "map": "מפה", + "@map": { + "description": "Label for the map view" + }, + "maps": "מפות", + "addPhotos": "הוסף תמונות", + "create": "צור", + "viewAll": "הצג הכל", + "hiding": "מחביא..." +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb new file mode 100644 index 0000000000..35f1e866b4 --- /dev/null +++ b/mobile/lib/l10n/intl_hi.arb @@ -0,0 +1,53 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "अपना ईमेल ऐड्रेस डालें", + "accountWelcomeBack": "आपका पुनः स्वागत है", + "email": "ईमेल", + "cancel": "रद्द करें", + "verify": "सत्यापित करें", + "invalidEmailAddress": "अमान्य ईमेल ऐड्रेस", + "enterValidEmail": "कृपया वैद्य ईमेल ऐड्रेस डालें", + "deleteAccount": "अकाउंट डिलीट करें", + "askDeleteReason": "आपका अकाउंट हटाने का मुख्य कारण क्या है?", + "deleteAccountFeedbackPrompt": "आपको जाता हुए देख कर हमें खेद है। कृपया हमें बेहतर बनने में सहायता के लिए अपनी प्रतिक्रिया साझा करें।", + "feedback": "प्रतिपुष्टि", + "kindlyHelpUsWithThisInformation": "कृपया हमें इस जानकारी के लिए सहायता करें", + "confirmDeletePrompt": "हां, मैं इस अकाउंट और इसके सभी डेटा को स्थायी रूप से हटाना चाहता/चाहती हूं।", + "confirmAccountDeletion": "अकाउंट डिलीट करने की पुष्टि करें", + "deleteAccountPermanentlyButton": "अकाउंट स्थायी रूप से डिलीट करें", + "yourAccountHasBeenDeleted": "आपका अकाउंट डिलीट कर दिया गया है", + "selectReason": "कारण चुनें", + "deleteReason1": "इसमें एक मुख्य विशेषता गायब है जिसकी मुझे आवश्यकता है", + "deleteReason2": "यह ऐप या इसका कोई एक फीचर मेरे विचारानुसार काम नहीं करता है", + "deleteReason3": "मुझे कहीं और कोई दूरी सेवा मिली जो मुझे बेहतर लगी", + "deleteReason4": "मेरा कारण इस लिस्ट में नहीं है", + "sendEmail": "ईमेल भेजें", + "deleteRequestSLAText": "आपका अनुरोध 72 घंटों के भीतर संसाधित किया जाएगा।", + "deleteEmailRequest": "कृपया account-deletion@ente.io पर अपने पंजीकृत ईमेल एड्रेस से ईमेल भेजें।", + "entePhotosPerm": "Ente को आपकी तस्वीरों को संरक्षित करने के लिए अनुमति की आवश्यकता है", + "ok": "ठीक है", + "createAccount": "अकाउंट बनायें", + "createNewAccount": "नया अकाउंट बनाएँ", + "password": "पासवर्ड", + "confirmPassword": "पासवर्ड की पुष्टि करें", + "activeSessions": "एक्टिव सेशन", + "oops": "ओह!", + "somethingWentWrongPleaseTryAgain": "कुछ गड़बड़ हुई है। कृपया दोबारा प्रयास करें।", + "thisWillLogYouOutOfThisDevice": "इससे आप इस डिवाइस से लॉग आउट हो जाएँगे!", + "thisWillLogYouOutOfTheFollowingDevice": "इससे आप इन डिवाइसों से लॉग आउट हो जाएँगे:", + "terminateSession": "सेशन रद्द करें?", + "terminate": "रद्द करें", + "thisDevice": "यह डिवाइस", + "recoverButton": "पुनः प्राप्त", + "recoverySuccessful": "रिकवरी सफल हुई!", + "decrypting": "डिक्रिप्ट हो रहा है...", + "incorrectRecoveryKeyTitle": "रिकवरी कुंजी ग़लत है", + "incorrectRecoveryKeyBody": "आपके द्वारा दर्ज रिकवरी कुंजी ग़लत है", + "forgotPassword": "पासवर्ड भूल गए", + "enterYourRecoveryKey": "अपनी रिकवरी कुंजी दर्ज करें", + "noRecoveryKey": "रिकवरी कुंजी नहीं है?", + "sorry": "क्षमा करें!", + "noRecoveryKeyNoDecryption": "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है", + "verifyEmail": "ईमेल सत्यापित करें", + "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb new file mode 100644 index 0000000000..0768a2d798 --- /dev/null +++ b/mobile/lib/l10n/intl_id.arb @@ -0,0 +1,1069 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "Masukkan alamat email kamu", + "accountWelcomeBack": "Selamat datang kembali!", + "email": "Email", + "cancel": "Batal", + "verify": "Verifikasi", + "invalidEmailAddress": "Alamat email tidak sah", + "enterValidEmail": "Harap masukkan alamat email yang sah.", + "deleteAccount": "Hapus akun", + "askDeleteReason": "Apa alasan utama kamu dalam menghapus akun?", + "deleteAccountFeedbackPrompt": "Kami sedih kamu pergi. Silakan bagikan masukanmu agar kami bisa jadi lebih baik.", + "feedback": "Masukan", + "kindlyHelpUsWithThisInformation": "Harap bantu kami dengan informasi ini", + "confirmDeletePrompt": "Ya, saya ingin menghapus akun ini dan seluruh data yang terkait secara permanen.", + "confirmAccountDeletion": "Konfirmasi Penghapusan Akun", + "deleteAccountPermanentlyButton": "Hapus Akun Secara Permanen", + "yourAccountHasBeenDeleted": "Akunmu telah dihapus", + "selectReason": "Pilih alasan", + "deleteReason1": "Fitur penting yang saya perlukan tidak ada", + "deleteReason2": "App ini atau fitur tertentu tidak bekerja sesuai harapan saya", + "deleteReason3": "Saya menemukan layanan lain yang lebih baik", + "deleteReason4": "Alasan saya tidak ada di daftar", + "sendEmail": "Kirim email", + "deleteRequestSLAText": "Permintaan kamu akan diproses dalam waktu 72 jam.", + "deleteEmailRequest": "Silakan kirim email ke account-deletion@ente.io dari alamat email kamu yang terdaftar.", + "entePhotosPerm": "Ente memerlukan izin untuk menyimpan fotomu", + "ok": "Oke", + "createAccount": "Buat akun", + "createNewAccount": "Buat akun baru", + "password": "Sandi", + "confirmPassword": "Konfirmasi sandi", + "activeSessions": "Sesi aktif", + "oops": "Aduh", + "somethingWentWrongPleaseTryAgain": "Terjadi kesalahan, silakan coba lagi", + "thisWillLogYouOutOfThisDevice": "Ini akan mengeluarkan akunmu dari perangkat ini!", + "thisWillLogYouOutOfTheFollowingDevice": "Ini akan mengeluarkan akunmu dari perangkat berikut:", + "terminateSession": "Akhiri sesi?", + "terminate": "Akhiri", + "thisDevice": "Perangkat ini", + "recoverButton": "Pulihkan", + "recoverySuccessful": "Pemulihan berhasil!", + "decrypting": "Mendekripsi...", + "incorrectRecoveryKeyTitle": "Kunci pemulihan salah", + "incorrectRecoveryKeyBody": "Kunci pemulihan yang kamu masukkan salah", + "forgotPassword": "Lupa sandi", + "enterYourRecoveryKey": "Masukkan kunci pemulihan kamu", + "noRecoveryKey": "Tidak punya kunci pemulihan?", + "sorry": "Maaf", + "noRecoveryKeyNoDecryption": "Karena sifat protokol enkripsi ujung ke ujung kami, data kamu tidak dapat didekripsi tanpa sandi atau kunci pemulihan kamu", + "verifyEmail": "Verifikasi email", + "toResetVerifyEmail": "Untuk mengatur ulang sandimu, harap verifikasi email kamu terlebih dahulu.", + "checkInboxAndSpamFolder": "Silakan periksa kotak masuk (serta kotak spam) untuk menyelesaikan verifikasi", + "tapToEnterCode": "Ketuk untuk masukkan kode", + "resendEmail": "Kirim ulang email", + "weHaveSendEmailTo": "Kami telah mengirimkan email ke {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "Buat kata sandi", + "changePasswordTitle": "Ubah sandi", + "resetPasswordTitle": "Atur ulang kata sandi", + "encryptionKeys": "Kunci enkripsi", + "passwordWarning": "Kami tidak menyimpan sandi ini, jadi jika kamu melupakannya, kami tidak akan bisa mendekripsi data kamu", + "enterPasswordToEncrypt": "Masukkan sandi yang bisa kami gunakan untuk mengenkripsi data kamu", + "enterNewPasswordToEncrypt": "Masukkan sandi baru yang bisa kami gunakan untuk mengenkripsi data kamu", + "weakStrength": "Lemah", + "strongStrength": "Kuat", + "moderateStrength": "Sedang", + "passwordStrength": "Keamanan sandi: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "Sandi berhasil diubah", + "generatingEncryptionKeys": "Menghasilkan kunci enkripsi...", + "pleaseWait": "Harap tunggu...", + "continueLabel": "Lanjut", + "insecureDevice": "Perangkat tidak aman", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Maaf, kami tidak dapat menghasilkan kunci yang aman di perangkat ini.\n\nHarap mendaftar dengan perangkat lain.", + "howItWorks": "Cara kerjanya", + "encryption": "Enkripsi", + "ackPasswordLostWarning": "Saya mengerti bahwa jika saya lupa sandi saya, data saya bisa hilang karena dienkripsi dari ujung ke ujung.", + "privacyPolicyTitle": "Kebijakan Privasi", + "termsOfServicesTitle": "Ketentuan", + "signUpTerms": "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente", + "logInLabel": "Masuk akun", + "loginTerms": "Dengan mengklik masuk akun, saya menyetujui ketentuan layanan dan kebijakan privasi Ente", + "changeEmail": "Ubah email", + "enterYourPassword": "Masukkan sandi kamu", + "welcomeBack": "Selamat datang kembali!", + "contactSupport": "Hubungi dukungan", + "incorrectPasswordTitle": "Sandi salah", + "pleaseTryAgain": "Silakan coba lagi", + "recreatePasswordTitle": "Buat kembali kata sandi", + "useRecoveryKey": "Gunakan kunci pemulihan", + "recreatePasswordBody": "Perangkat ini tidak cukup kuat untuk memverifikasi kata sandi kamu, tapi kami dapat membuat ulang kata sandi kamu sehingga dapat digunakan di semua perangkat.\n\nSilahkan masuk menggunakan kunci pemulihan dan buat ulang kata sandi kamu (Kamu dapat menggunakan kata sandi yang sama lagi jika mau).", + "verifyPassword": "Verifikasi sandi", + "recoveryKey": "Kunci pemulihan", + "recoveryKeyOnForgotPassword": "Saat kamu lupa sandi, satu-satunya cara untuk memulihkan data kamu adalah dengan kunci ini.", + "recoveryKeySaveDescription": "Kami tidak menyimpan kunci ini, jadi harap simpan kunci yang berisi 24 kata ini dengan aman.", + "doThisLater": "Lakukan lain kali", + "saveKey": "Simpan kunci", + "recoveryKeyCopiedToClipboard": "Kunci pemulihan tersalin ke papan klip", + "recoverAccount": "Pulihkan akun", + "recover": "Pulihkan", + "dropSupportEmail": "Silakan kirimkan email ke {supportEmail} dari alamat email terdaftar kamu", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "twofactorSetup": "Penyiapan autentikasi dua langkah", + "enterCode": "Masukkan kode", + "scanCode": "Pindai kode", + "codeCopiedToClipboard": "Kode tersalin ke papan klip", + "copypasteThisCodentoYourAuthenticatorApp": "Salin lalu tempel kode ini\ndi app autentikator kamu", + "tapToCopy": "ketuk untuk salin", + "scanThisBarcodeWithnyourAuthenticatorApp": "Pindai barcode ini dengan\napp autentikator kamu", + "enterThe6digitCodeFromnyourAuthenticatorApp": "Masukkan kode 6 angka dari\napp autentikator kamu", + "confirm": "Konfirmasi", + "setupComplete": "Penyiapan selesai", + "saveYourRecoveryKeyIfYouHaventAlready": "Jika belum, simpan kunci pemulihan kamu", + "thisCanBeUsedToRecoverYourAccountIfYou": "Ini dapat digunakan untuk memulihkan akun kamu jika kehilangan faktor kedua kamu", + "twofactorAuthenticationPageTitle": "Autentikasi dua langkah", + "lostDevice": "Perangkat hilang?", + "verifyingRecoveryKey": "Memverifikasi kunci pemulihan...", + "recoveryKeyVerified": "Kunci pemulihan terverifikasi", + "recoveryKeySuccessBody": "Bagus! Kunci pemulihan kamu sah. Terima kasih telah melakukan verifikasi.\n\nHarap simpan selalu kunci pemulihan kamu dengan aman.", + "invalidRecoveryKey": "Kunci pemulihan yang kamu masukkan tidak sah. Pastikan kunci tersebut berisi 24 kata, dan teliti ejaan masing-masing kata.\n\nJika kamu memasukkan kode pemulihan lama, pastikan kode tersebut berisi 64 karakter, dan teliti setiap karakter yang ada.", + "invalidKey": "Kunci tidak sah", + "tryAgain": "Coba lagi", + "viewRecoveryKey": "Lihat kunci pemulihan", + "confirmRecoveryKey": "Konfirmasi kunci pemulihan", + "recoveryKeyVerifyReason": "Kunci pemulihan kamu adalah satu-satunya cara untuk memulihkan foto-foto kamu jika kamu lupa kata sandi. Kamu bisa lihat kunci pemulihan kamu di Pengaturan > Keamanan.\n\nHarap masukkan kunci pemulihan kamu di sini untuk memastikan bahwa kamu telah menyimpannya dengan baik.", + "confirmYourRecoveryKey": "Konfirmasi kunci pemulihan kamu", + "addViewer": "Tambahkan pemirsa", + "addCollaborator": "Tambah kolaborator", + "addANewEmail": "Tambah email baru", + "orPickAnExistingOne": "Atau pilih yang sudah ada", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Kolaborator bisa menambahkan foto dan video ke album bersama ini.", + "enterEmail": "Masukkan email", + "albumOwner": "Pemilik", + "@albumOwner": { + "description": "Role of the album owner" + }, + "you": "Kamu", + "collaborator": "Kolaborator", + "addMore": "Tambah lagi", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "viewer": "Pemirsa", + "remove": "Hapus", + "removeParticipant": "Hapus peserta", + "@removeParticipant": { + "description": "menuSectionTitle for removing a participant" + }, + "manage": "Atur", + "addedAs": "Ditambahkan sebagai", + "changePermissions": "Ubah izin?", + "yesConvertToViewer": "Ya, ubah ke pemirsa", + "cannotAddMorePhotosAfterBecomingViewer": "{user} tidak akan dapat menambahkan foto lagi di album ini\n\nMereka masih dapat menghapus foto yang sudah ada yang ditambahkan oleh mereka", + "allowAddingPhotos": "Izinkan menambah foto", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowAddPhotosDescription": "Izinkan orang yang memiliki link untuk menambahkan foto ke album berbagi ini.", + "passwordLock": "Kunci dengan sandi", + "disableDownloadWarningTitle": "Harap dicatat", + "disableDownloadWarningBody": "Orang yang melihat masih bisa mengambil tangkapan layar atau menyalin foto kamu menggunakan alat eksternal", + "allowDownloads": "Izinkan pengunduhan", + "linkDeviceLimit": "Batas perangkat", + "noDeviceLimit": "Tidak ada", + "@noDeviceLimit": { + "description": "Text to indicate that there is limit on number of devices" + }, + "linkExpiry": "Waktu kedaluwarsa link", + "linkExpired": "Kedaluwarsa", + "linkEnabled": "Aktif", + "linkNeverExpires": "Tidak pernah", + "expiredLinkInfo": "Link ini telah kedaluwarsa. Silakan pilih waktu kedaluwarsa baru atau nonaktifkan waktu kedaluwarsa.", + "setAPassword": "Atur sandi", + "lockButtonLabel": "Kunci", + "enterPassword": "Masukkan sandi", + "removeLink": "Hapus link", + "manageLink": "Atur link", + "linkExpiresOn": "Link akan kedaluwarsa pada {expiryTime}", + "albumUpdated": "Album diperbarui", + "never": "Tidak pernah", + "custom": "Kustom", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "after1Hour": "Setelah 1 jam", + "after1Day": "Setelah 1 hari", + "after1Week": "Setelah 1 minggu", + "after1Month": "Setelah 1 bulan", + "after1Year": "Setelah 1 tahun", + "manageParticipants": "Atur", + "albumParticipantsCount": "{count, plural, =0 {0 Peserta} =1 {1 Peserta} other {{count} Peserta}}", + "@albumParticipantsCount": { + "placeholders": { + "count": { + "type": "int", + "example": "5" + } + }, + "description": "Number of participants in an album, including the album owner." + }, + "collabLinkSectionDescription": "Buat link untuk memungkinkan orang lain menambahkan dan melihat foto yang ada pada album bersama kamu tanpa memerlukan app atau akun Ente. Ideal untuk mengumpulkan foto pada suatu acara.", + "collectPhotos": "Kumpulkan foto", + "collaborativeLink": "Link kolaborasi", + "shareWithNonenteUsers": "Bagikan ke pengguna non-Ente", + "createPublicLink": "Buat link publik", + "sendLink": "Kirim link", + "copyLink": "Salin link", + "linkHasExpired": "Link telah kedaluwarsa", + "publicLinkEnabled": "Link publik aktif", + "shareALink": "Bagikan link", + "sharedAlbumSectionDescription": "Buat album bersama dan kolaborasi dengan pengguna Ente lain, termasuk pengguna paket gratis.", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Bagikan dengan orang tertentu} =1 {Berbagi dengan 1 orang} other {Berbagi dengan {numberOfPeople} orang}}", + "@shareWithPeopleSectionTitle": { + "placeholders": { + "numberOfPeople": { + "type": "int", + "example": "2" + } + } + }, + "thisIsYourVerificationId": "Ini adalah ID Verifikasi kamu", + "someoneSharingAlbumsWithYouShouldSeeTheSameId": "Orang yang membagikan album denganmu bisa melihat ID yang sama di perangkat mereka.", + "howToViewShareeVerificationID": "Silakan minta dia untuk menekan lama alamat email-nya di layar pengaturan, dan pastikan bahwa ID di perangkatnya sama.", + "thisIsPersonVerificationId": "Ini adalah ID Verifikasi milik {email}", + "@thisIsPersonVerificationId": { + "placeholders": { + "email": { + "type": "String", + "example": "someone@ente.io" + } + } + }, + "verificationId": "ID Verifikasi", + "verifyEmailID": "Verifikasi {email}", + "emailNoEnteAccount": "{email} tidak punya akun Ente.\n\nUndang dia untuk berbagi foto.", + "shareMyVerificationID": "Ini ID Verifikasi saya di ente.io: {verificationID}.", + "shareTextConfirmOthersVerificationID": "Halo, bisakah kamu pastikan bahwa ini adalah ID Verifikasi ente.io milikmu: {verificationID}", + "somethingWentWrong": "Terjadi kesalahan", + "sendInvite": "Kirim undangan", + "shareTextRecommendUsingEnte": "Unduh Ente agar kita bisa berbagi foto dan video kualitas asli dengan mudah\n\nhttps://ente.io", + "done": "Selesai", + "applyCodeTitle": "Terapkan kode", + "enterCodeDescription": "Masukkan kode yang diberikan temanmu untuk memperoleh kuota gratis untuk kalian berdua", + "apply": "Terapkan", + "failedToApplyCode": "Gagal menerapkan kode", + "enterReferralCode": "Masukkan kode rujukan", + "codeAppliedPageTitle": "Kode diterapkan", + "changeYourReferralCode": "Ganti kode rujukan kamu", + "change": "Ganti", + "unavailableReferralCode": "Maaf, kode ini tidak tersedia.", + "codeChangeLimitReached": "Maaf, anda telah mencapai batas rubah kode.", + "onlyFamilyAdminCanChangeCode": "Harap hubungi {familyAdminEmail} untuk mengubah kode kamu.", + "storageInGB": "{storageAmountInGB} GB", + "claimed": "Diperoleh", + "@claimed": { + "description": "Used to indicate storage claimed, like 10GB Claimed" + }, + "details": "Rincian", + "claimMore": "Peroleh lebih banyak!", + "theyAlsoGetXGb": "Ia juga mendapat {storageAmountInGB} GB", + "freeStorageOnReferralSuccess": "{storageAmountInGB} GB setiap kali orang mendaftar dengan paket berbayar lalu menerapkan kode milikmu", + "shareTextReferralCode": "Kode rujukan Ente: {referralCode} \n\nTerapkan pada Pengaturan → Umum → Rujukan untuk mendapatkan {referralStorageInGB} GB gratis setelah kamu mendaftar paket berbayar\n\nhttps://ente.io", + "claimFreeStorage": "Peroleh kuota gratis", + "inviteYourFriends": "Undang teman-temanmu", + "failedToFetchReferralDetails": "Tidak dapat mengambil kode rujukan. Harap ulang lagi nanti.", + "referralStep1": "1. Berikan kode ini ke teman kamu", + "referralStep2": "2. Ia perlu daftar ke paket berbayar", + "referralStep3": "3. Kalian berdua mendapat {storageInGB} GB* gratis", + "referralsAreCurrentlyPaused": "Rujukan sedang dijeda", + "youCanAtMaxDoubleYourStorage": "* Maksimal dua kali lipat dari kuota penyimpananmu", + "claimedStorageSoFar": "{isFamilyMember, select, true {Keluargamu saat ini telah memperoleh {storageAmountInGb} GB} false {Kamu saat ini telah memperoleh {storageAmountInGb} GB} other {Kamu saat ini telah memperoleh {storageAmountInGb} GB!}}", + "@claimedStorageSoFar": { + "placeholders": { + "isFamilyMember": { + "type": "String", + "example": "true" + }, + "storageAmountInGb": { + "type": "int", + "example": "10" + } + } + }, + "faq": "Tanya Jawab Umum", + "help": "Bantuan", + "oopsSomethingWentWrong": "Aduh, terjadi kesalahan", + "peopleUsingYourCode": "Orang yang telah menggunakan kodemu", + "eligible": "memenuhi syarat", + "total": "jumlah total", + "codeUsedByYou": "Kode yang telah kamu gunakan", + "freeStorageClaimed": "Kuota gratis diperoleh", + "freeStorageUsable": "Kuota gratis yang dapat digunakan", + "usableReferralStorageInfo": "Kuota yang dapat digunakan dibatasi oleh paket kamu saat ini. Kelebihan kuota yang diklaim, akan secara otomatis dapat digunakan saat kamu meningkatkan paket kamu.", + "removeFromAlbumTitle": "Hapus dari album?", + "removeFromAlbum": "Hapus dari album", + "itemsWillBeRemovedFromAlbum": "Item yang dipilih akan dihapus dari album ini", + "removeShareItemsWarning": "Beberapa item yang kamu hapus ditambahkan oleh orang lain, dan kamu akan kehilangan akses ke item tersebut", + "addingToFavorites": "Menambahkan ke favorit...", + "removingFromFavorites": "Menghapus dari favorit...", + "sorryCouldNotAddToFavorites": "Maaf, tidak dapat menambahkan ke favorit!", + "sorryCouldNotRemoveFromFavorites": "Maaf, tidak dapat menghapus dari favorit!", + "subscribeToEnableSharing": "Langgananmu telah berakhir. Silakan langganan kembali untuk berbagi.", + "subscribe": "Berlangganan", + "canOnlyRemoveFilesOwnedByYou": "Hanya dapat menghapus berkas yang dimiliki oleh mu", + "deleteSharedAlbum": "Hapus album bersama?", + "deleteAlbum": "Hapus album", + "deleteAlbumDialog": "Hapus foto (dan video) yang ada dalam album ini dari semua album lain yang juga menampungnya?", + "deleteSharedAlbumDialogBody": "Album ini akan di hapus untuk semua\n\nKamu akan kehilangan akses ke foto yang di bagikan dalam album ini yang di miliki oleh pengguna lain", + "yesRemove": "Ya, hapus", + "creatingLink": "Membuat link...", + "removeWithQuestionMark": "Hapus?", + "removeParticipantBody": "{userEmail} akan dikeluarkan dari album berbagi ini\n\nSemua foto yang ia tambahkan juga akan dihapus dari album ini", + "keepPhotos": "Simpan foto", + "deletePhotos": "Hapus foto", + "inviteToEnte": "Undang ke Ente", + "removePublicLink": "Hapus link publik", + "disableLinkMessage": "Ini akan menghapus link publik yang digunakan untuk mengakses \"{albumName}\".", + "sharing": "Membagikan...", + "youCannotShareWithYourself": "Kamu tidak bisa berbagi dengan dirimu sendiri", + "archive": "Arsip", + "createAlbumActionHint": "Tekan dan tahan foto lalu klik + untuk membuat album baru", + "importing": "Mengimpor....", + "failedToLoadAlbums": "Gagal memuat album", + "hidden": "Tersembunyi", + "authToViewYourHiddenFiles": "Harap autentikasi untuk melihat file tersembunyi kamu", + "trash": "Sampah", + "uncategorized": "Tak Berkategori", + "videoSmallCase": "video", + "photoSmallCase": "foto", + "singleFileDeleteHighlight": "Ia akan dihapus dari semua album.", + "singleFileInBothLocalAndRemote": "{fileType} ini tersimpan di Ente dan juga di perangkat ini.", + "singleFileInRemoteOnly": "{fileType} ini akan dihapus dari Ente.", + "singleFileDeleteFromDevice": "{fileType} ini akan dihapus dari perangkat ini.", + "deleteFromEnte": "Hapus dari Ente", + "yesDelete": "Ya, hapus", + "movedToTrash": "Pindah ke sampah", + "deleteFromDevice": "Hapus dari perangkat ini", + "deleteFromBoth": "Hapus dari keduanya", + "newAlbum": "Album baru", + "albums": "Album", + "memoryCount": "{count, plural, zero{tanpa kenangan} one{{formattedCount} kenangan} other{{formattedCount} kenangan}}", + "@memoryCount": { + "description": "The text to display the number of memories", + "type": "text", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedCount": { + "type": "String", + "example": "11.513, 11,511" + } + } + }, + "selectedPhotos": "{count} terpilih", + "@selectedPhotos": { + "description": "Display the number of selected photos", + "type": "text", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } + }, + "selectedPhotosWithYours": "{count} dipilih ({yourCount} milikmu)", + "@selectedPhotosWithYours": { + "description": "Display the number of selected photos, including the number of selected photos owned by the user", + "type": "text", + "placeholders": { + "count": { + "example": "12", + "type": "int" + }, + "yourCount": { + "example": "2", + "type": "int" + } + } + }, + "advancedSettings": "Lanjutan", + "@advancedSettings": { + "description": "The text to display in the advanced settings section" + }, + "photoGridSize": "Ukuran kotak foto", + "manageDeviceStorage": "Atur penyimpanan perangkat", + "machineLearning": "Pemelajaran mesin", + "mlConsent": "Aktifkan pemelajaran mesin", + "mlConsentTitle": "Aktifkan pemelajaran mesin?", + "mlConsentDescription": "Jika kamu mengaktifkan pemelajaran mesin, maka Ente akan mengambil informasi seperti geometri wajah dari berkas, termasuk berkas yg dibagikan kepada mu.\n\nIni akan dilakukan pada perangkat kamu, dan setiap informasi geometrik yang di buat akan ter enskripsi ujung ke ujung.", + "mlConsentPrivacy": "Klik di sini untuk detail lebih lanjut tentang fitur ini pada kebijakan privasi kami", + "mlConsentConfirmation": "Saya memahami, dan bersedia mengaktifkan pemelajaran mesin", + "magicSearch": "Penelusuran ajaib", + "mlIndexingDescription": "Harap diperhatikan bahwa pemelajaran mesin dapat meningkatkan penggunaan data dan baterai perangkat hingga seluruh items terindeks kan. Dianjurkan menggunakan aplikasi dekstop untuk pengindeksan lebih cepat, seluruh hasil akan tersinkronkan secara otomatis.", + "loadingModel": "Mengunduh model...", + "waitingForWifi": "Menunggu WiFi...", + "status": "Status", + "indexedItems": "Item terindeks", + "pendingItems": "Item menunggu", + "selectFoldersForBackup": "Pilih folder yang perlu dicadangkan", + "selectedFoldersWillBeEncryptedAndBackedUp": "Folder yang terpilih akan dienkripsi dan dicadangkan", + "unselectAll": "Batalkan semua pilihan", + "selectAll": "Pilih semua", + "skip": "Lewati", + "updatingFolderSelection": "Memperbaharui pilihan folder...", + "itemCount": "{count, plural, other{{count} item}}", + "deleteItemCount": "{count, plural, =1 {Hapus {count} item} other {Hapus {count} item}}", + "showMemories": "Lihat kenangan", + "yearsAgo": "{count, plural, other{{count} tahun lalu}}", + "backupSettings": "Pengaturan pencadangan", + "backupOverMobileData": "Cadangkan dengan data seluler", + "backupVideos": "Cadangkan video", + "disableAutoLock": "Nonaktifkan kunci otomatis", + "privacy": "Privasi", + "terms": "Ketentuan", + "checking": "Memeriksa...", + "youAreOnTheLatestVersion": "Kamu menggunakan versi terbaru", + "account": "Akun", + "manageSubscription": "Atur langganan", + "authToChangeYourEmail": "Harap autentikasi untuk mengubah email kamu", + "changePassword": "Ubah sandi", + "authToChangeYourPassword": "Harap autentikasi untuk mengubah sandi kamu", + "emailVerificationToggle": "Verifikasi email", + "authToChangeEmailVerificationSetting": "Harap autentikasi untuk mengatur verifikasi email", + "exportYourData": "Ekspor data kamu", + "logout": "Keluar akun", + "authToInitiateAccountDeletion": "Harap autentikasi untuk mulai penghapusan akun", + "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar akun?", + "yesLogout": "Ya, keluar", + "aNewVersionOfEnteIsAvailable": "Versi baru dari Ente telah tersedia.", + "update": "Perbarui", + "criticalUpdateAvailable": "Pembaruan penting tersedia", + "updateAvailable": "Pembaruan tersedia", + "ignoreUpdate": "Abaikan", + "downloading": "Mengunduh...", + "retry": "Coba lagi", + "backedUpFolders": "Folder yang dicadangkan", + "backup": "Pencadangan", + "freeUpDeviceSpace": "Bersihkan penyimpanan perangkat", + "freeUpDeviceSpaceDesc": "Hemat ruang penyimpanan di perangkatmu dengan membersihkan file yang sudah tercadangkan.", + "allClear": "✨ Sudah bersih", + "noDeviceThatCanBeDeleted": "Tidak ada file yang perlu dihapus dari perangkat ini", + "removeDuplicates": "Hapus duplikat", + "removeDuplicatesDesc": "Lihat dan hapus file yang sama persis.", + "viewLargeFiles": "File berukuran besar", + "noDuplicates": "✨ Tak ada file duplikat", + "success": "Berhasil", + "youHaveSuccessfullyFreedUp": "Kamu telah berhasil membersihkan {storageSaved}!", + "@youHaveSuccessfullyFreedUp": { + "description": "The text to display when the user has successfully freed up storage", + "type": "text", + "placeholders": { + "storageSaved": { + "example": "1.2 GB", + "type": "String" + } + } + }, + "sparkleSuccess": "✨ Berhasil", + "duplicateFileCountWithStorageSaved": "Kamu telah menghapus {count, plural, other{{count} file duplikat}} dan membersihkan ({storageSaved}!)", + "@duplicateFileCountWithStorageSaved": { + "description": "The text to display when the user has successfully cleaned up duplicate files", + "type": "text", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "storageSaved": { + "example": "1.2 GB", + "type": "String" + } + } + }, + "familyPlans": "Paket keluarga", + "notifications": "Notifikasi", + "sharedPhotoNotifications": "Foto terbagi baru", + "advanced": "Lanjutan", + "general": "Umum", + "security": "Keamanan", + "authToViewYourRecoveryKey": "Harap autentikasi untuk melihat kunci pemulihan kamu", + "twofactor": "Autentikasi dua langkah", + "authToConfigureTwofactorAuthentication": "Harap autentikasi untuk mengatur autentikasi dua langkah", + "viewActiveSessions": "Lihat sesi aktif", + "authToViewYourActiveSessions": "Harap autentikasi untuk melihat sesi aktif kamu", + "disableTwofactor": "Nonaktifkan autentikasi dua langkah", + "confirm2FADisable": "Apakah kamu yakin ingin menonaktifkan autentikasi dua langkah?", + "no": "Tidak", + "yes": "Ya", + "social": "Sosial", + "rateUsOnStore": "Beri nilai di {storeName}", + "blog": "Blog", + "twitter": "Twitter", + "mastodon": "Mastodon", + "matrix": "Matrix", + "discord": "Discord", + "reddit": "Reddit", + "yourStorageDetailsCouldNotBeFetched": "Rincian penyimpananmu tidak dapat dimuat", + "reportABug": "Laporkan bug", + "reportBug": "Laporkan bug", + "suggestFeatures": "Sarankan fitur", + "support": "Dukungan", + "theme": "Tema", + "lightTheme": "Cerah", + "darkTheme": "Gelap", + "systemTheme": "Sistem", + "freeTrial": "Percobaan gratis", + "selectYourPlan": "Pilih paket kamu", + "enteSubscriptionPitch": "Ente memelihara kenanganmu, sehingga ia selalu tersedia untukmu, bahkan jika kamu kehilangan perangkatmu.", + "enteSubscriptionShareWithFamily": "Anggota keluargamu juga bisa ditambahkan ke paketmu.", + "currentUsageIs": "Pemakaian saat ini sebesar ", + "@currentUsageIs": { + "description": "This text is followed by storage usage", + "examples": { + "0": "Current usage is 1.2 GB" + }, + "type": "text" + }, + "faqs": "Tanya Jawab Umum", + "renewsOn": "Langganan akan diperpanjang pada {endDate}", + "freeTrialValidTill": "Percobaan gratis berlaku hingga {endDate}", + "validTill": "Berlaku hingga {endDate}", + "playStoreFreeTrialValidTill": "Percobaan gratis berlaku hingga {endDate}.\nKamu dapat memilih paket berbayar setelahnya.", + "subWillBeCancelledOn": "Langganan kamu akan dibatalkan pada {endDate}", + "subscription": "Langganan", + "paymentDetails": "Rincian pembayaran", + "manageFamily": "Atur Keluarga", + "contactToManageSubscription": "Silakan hubungi kami di support@ente.io untuk mengatur langganan {provider} kamu.", + "renewSubscription": "Perpanjang langganan", + "cancelSubscription": "Batalkan langganan", + "areYouSureYouWantToRenew": "Apakah kamu yakin ingin memperpanjang?", + "yesRenew": "Ya, Perpanjang", + "areYouSureYouWantToCancel": "Apakah kamu yakin ingin membatalkan?", + "yesCancel": "Ya, batalkan", + "failedToRenew": "Gagal memperpanjang", + "failedToCancel": "Gagal membatalkan", + "twoMonthsFreeOnYearlyPlans": "2 bulan gratis dengan paket tahunan", + "monthly": "Bulanan", + "@monthly": { + "description": "The text to display for monthly plans", + "type": "text" + }, + "yearly": "Tahunan", + "@yearly": { + "description": "The text to display for yearly plans", + "type": "text" + }, + "confirmPlanChange": "Konfirmasi perubahan paket", + "areYouSureYouWantToChangeYourPlan": "Apakah kamu yakin ingin mengubah paket kamu?", + "optionalAsShortAsYouLike": "Opsional, pendek pun tak apa...", + "send": "Kirim", + "askCancelReason": "Langganan kamu telah dibatalkan. Apakah kamu ingin membagikan alasannya?", + "thankYouForSubscribing": "Terima kasih telah berlangganan!", + "yourPurchaseWasSuccessful": "Pembelianmu berhasil", + "yourSubscriptionWasUpdatedSuccessfully": "Langgananmu telah berhasil diperbarui", + "googlePlayId": "ID Google Play", + "appleId": "ID Apple", + "subAlreadyLinkedErrMessage": "{id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan {id} kamu untuk akun ini, silahkan hubungi tim bantuan kami", + "visitWebToManage": "Silakan buka web.ente.io untuk mengatur langgananmu", + "pleaseContactSupportAndWeWillBeHappyToHelp": "Silakan hubungi support@ente.io dan kami akan dengan senang hati membantu!", + "paymentFailed": "Pembayaran gagal", + "continueOnFreeTrial": "Lanjut dengan percobaan gratis", + "areYouSureYouWantToExit": "Apakah kamu yakin ingin keluar?", + "thankYou": "Terima kasih", + "failedToVerifyPaymentStatus": "Gagal memeriksa status pembayaran", + "pleaseWaitForSometimeBeforeRetrying": "Harap tunggu beberapa saat sebelum mencoba lagi", + "paymentFailedMessage": "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!", + "youAreOnAFamilyPlan": "Kamu menggunakan paket keluarga!", + "contactFamilyAdmin": "Silakan hubungi {familyAdminEmail} untuk mengatur langgananmu", + "leaveFamily": "Tinggalkan keluarga", + "areYouSureThatYouWantToLeaveTheFamily": "Apakah kamu yakin ingin meninggalkan paket keluarga ini?", + "leave": "Tinggalkan", + "rateTheApp": "Nilai app ini", + "startBackup": "Mulai pencadangan", + "grantFullAccessPrompt": "Harap berikan akses ke semua foto di app Pengaturan", + "openSettings": "Buka Pengaturan", + "existingUser": "Masuk", + "privateBackups": "Cadangan pribadi", + "forYourMemories": "untuk kenanganmu", + "endtoendEncryptedByDefault": "Dirancang dengan enkripsi ujung ke ujung", + "safelyStored": "Tersimpan aman", + "atAFalloutShelter": "di tempat pengungsian", + "designedToOutlive": "Dibuat untuk melestarikan", + "available": "Tersedia", + "everywhere": "di mana saja", + "androidIosWebDesktop": "Android, iOS, Web, Desktop", + "mobileWebDesktop": "Seluler, Web, Desktop", + "pleaseLoginAgain": "Silakan masuk akun lagi", + "autoLogoutMessage": "Akibat kesalahan teknis, kamu telah keluar dari akunmu. Kami mohon maaf atas ketidaknyamanannya.", + "yourSubscriptionHasExpired": "Langgananmu telah berakhir", + "backupFailed": "Pencadangan gagal", + "couldNotBackUpTryLater": "Kami tidak dapat mencadangkan data kamu.\nKami akan coba lagi nanti.", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente hanya dapat mengenkripsi dan menyimpan file jika kamu berikan izin", + "pleaseGrantPermissions": "Harap berikan izin", + "grantPermission": "Berikan izin", + "shareOnlyWithThePeopleYouWant": "Bagikan hanya dengan orang yang kamu inginkan", + "usePublicLinksForPeopleNotOnEnte": "Bagikan link publik ke orang yang tidak menggunakan Ente", + "allowPeopleToAddPhotos": "Izinkan orang lain menambahkan foto", + "shareAnAlbumNow": "Bagikan album sekarang", + "collectEventPhotos": "Kumpulkan foto acara", + "loggingOut": "Mengeluarkan akun...", + "@onDevice": { + "description": "The text displayed above folders/albums stored on device", + "type": "text" + }, + "onDevice": "Di perangkat ini", + "@onEnte": { + "description": "The text displayed above albums backed up to Ente", + "type": "text" + }, + "onEnte": "Di ente", + "deleteEmptyAlbums": "Hapus album kosong", + "deleteEmptyAlbumsWithQuestionMark": "Hapus album yang kosong?", + "deleteProgress": "Menghapus {currentlyDeleting} / {totalCount}", + "genericProgress": "Memproses {currentlyProcessing} / {totalCount}", + "@genericProgress": { + "description": "Generic progress text to display when processing multiple items", + "type": "text", + "placeholders": { + "currentlyProcessing": { + "example": "1", + "type": "int" + }, + "totalCount": { + "example": "10", + "type": "int" + } + } + }, + "permanentlyDelete": "Hapus secara permanen", + "publicLinkCreated": "Link publik dibuat", + "youCanManageYourLinksInTheShareTab": "Kamu bisa atur link yang telah kamu buat di tab berbagi.", + "linkCopiedToClipboard": "Link tersalin ke papan klip", + "restore": "Pulihkan", + "@restore": { + "description": "Display text for an action which triggers a restore of item from trash", + "type": "text" + }, + "unarchive": "Keluarkan dari arsip", + "shareLink": "Bagikan link", + "addToEnte": "Tambah ke Ente", + "addToAlbum": "Tambah ke album", + "delete": "Hapus", + "hide": "Sembunyikan", + "share": "Bagikan", + "moveItem": "{count, plural, other {Pindahkan item}}", + "@moveItem": { + "description": "Page title while moving one or more items to an album" + }, + "addItem": "{count, plural, other {Tambahkan item}}", + "@addItem": { + "description": "Page title while adding one or more items to album" + }, + "createOrSelectAlbum": "Buat atau pilih album", + "selectAlbum": "Pilih album", + "searchByAlbumNameHint": "Nama album", + "albumTitle": "Judul album", + "enterAlbumName": "Masukkan nama album", + "restoringFiles": "Memulihkan file...", + "movingFilesToAlbum": "Memindahkan file ke album...", + "uploadingFilesToAlbum": "Mengunggah file ke album...", + "addedSuccessfullyTo": "Berhasil ditambahkan ke {albumName}", + "movedSuccessfullyTo": "Berhasil dipindahkan ke {albumName}", + "thisAlbumAlreadyHDACollaborativeLink": "Link kolaborasi untuk album ini sudah terbuat", + "collaborativeLinkCreatedFor": "Link kolaborasi terbuat untuk {albumName}", + "invite": "Undang", + "shareYourFirstAlbum": "Bagikan album pertamamu", + "sharedWith": "Dibagikan dengan {emailIDs}", + "sharedWithMe": "Dibagikan dengan saya", + "sharedByMe": "Dibagikan oleh saya", + "doubleYourStorage": "Gandakan kuota kamu", + "shareAlbumHint": "Buka album lalu ketuk tombol bagikan di sudut kanan atas untuk berbagi.", + "trashDaysLeft": "{count, plural, =0 {} =1 {1 hari} other {{count} hari}}", + "@trashDaysLeft": { + "description": "Text to indicate number of days remaining before permanent deletion", + "placeholders": { + "count": { + "example": "1|2|3", + "type": "int" + } + } + }, + "deleteAll": "Hapus Semua", + "renameAlbum": "Ubah nama album", + "convertToAlbum": "Ubah menjadi album", + "setCover": "Ubah sampul", + "@setCover": { + "description": "Text to set cover photo for an album" + }, + "sortAlbumsBy": "Urut berdasarkan", + "sortNewestFirst": "Terbaru dulu", + "sortOldestFirst": "Terlama dulu", + "rename": "Ubah nama", + "leaveSharedAlbum": "Tinggalkan album bersama?", + "leaveAlbum": "Tinggalkan album", + "photosAddedByYouWillBeRemovedFromTheAlbum": "Foto yang telah kamu tambahkan akan dihapus dari album ini", + "youDontHaveAnyArchivedItems": "Kamu tidak memiliki item di arsip.", + "ignoredFolderUploadReason": "Sejumlah file di album ini tidak terunggah karena telah dihapus sebelumnya dari Ente.", + "deviceFilesAutoUploading": "File yang ditambahkan ke album perangkat ini akan diunggah ke Ente secara otomatis.", + "turnOnBackupForAutoUpload": "Aktifkan pencadangan untuk mengunggah file yang ditambahkan ke folder ini ke Ente secara otomatis.", + "noHiddenPhotosOrVideos": "Tidak ada foto atau video tersembunyi", + "toHideAPhotoOrVideo": "Untuk menyembunyikan foto atau video", + "openTheItem": "• Buka item-nya", + "click": "• Click", + "nothingToSeeHere": "Tidak ada apa-apa di sini! 👀", + "unarchiveAlbum": "Keluarkan album dari arsip", + "archiveAlbum": "Arsipkan album", + "calculating": "Menghitung...", + "pleaseWaitDeletingAlbum": "Harap tunggu, sedang menghapus album", + "searchByExamples": "• Nama album (cth. \"Kamera\")\n• Jenis file (cth. \"Video\", \".gif\")\n• Tahun atau bulan (cth. \"2022\", \"Januari\")\n• Musim liburan (cth. \"Natal\")\n• Keterangan foto (cth. “#seru”)", + "noResultsFound": "Tidak ditemukan hasil", + "addedBy": "Ditambahkan oleh {emailOrName}", + "loadingExifData": "Memuat data EXIF...", + "viewAllExifData": "Lihat seluruh data EXIF", + "noExifData": "Tidak ada data EXIF", + "thisImageHasNoExifData": "Gambar ini tidak memiliki data exif", + "exif": "EXIF", + "noResults": "Tidak ada hasil", + "failedToFetchOriginalForEdit": "Gagal memuat file asli untuk mengedit", + "close": "Tutup", + "setAs": "Pasang sebagai", + "fileSavedToGallery": "File tersimpan ke galeri", + "filesSavedToGallery": "File tersimpan ke galeri", + "fileFailedToSaveToGallery": "Gagal menyimpan file ke galeri", + "download": "Unduh", + "pressAndHoldToPlayVideo": "Tekan dan tahan untuk memutar video", + "pressAndHoldToPlayVideoDetailed": "Tekan dan tahan gambar untuk memutar video", + "downloadFailed": "Gagal mengunduh", + "reviewDeduplicateItems": "Silakan lihat dan hapus item yang merupakan duplikat.", + "count": "Jumlah", + "decryptingVideo": "Mendekripsi video...", + "authToViewYourMemories": "Harap autentikasi untuk melihat kenanganmu", + "unlock": "Buka", + "freeUpSpace": "Bersihkan ruang", + "freeUpSpaceSaving": "{count, plural, other {File tersebut bisa dihapus dari perangkat ini untuk membersihkan {formattedSize}}}", + "filesBackedUpInAlbum": "{count, plural, other {{formattedNumber} file}} dalam album ini telah berhasil dicadangkan", + "@filesBackedUpInAlbum": { + "description": "Text to tell user how many files have been backed up in the album", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedNumber": { + "content": "{formattedNumber}", + "example": "1,000", + "type": "String" + } + } + }, + "filesBackedUpFromDevice": "{count, plural, other {{formattedNumber} file}} di perangkat ini telah berhasil dicadangkan", + "@filesBackedUpFromDevice": { + "description": "Text to tell user how many files have been backed up from this device", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedNumber": { + "content": "{formattedNumber}", + "example": "1,000", + "type": "String" + } + } + }, + "@freeUpSpaceSaving": { + "description": "Text to tell user how much space they can free up by deleting items from the device" + }, + "freeUpAccessPostDelete": "Kamu masih bisa mengakses {count, plural, other {filenya}} di Ente selama kamu masih berlangganan", + "@freeUpAccessPostDelete": { + "placeholders": { + "count": { + "example": "1", + "type": "int" + } + } + }, + "freeUpAmount": "Bersihkan {sizeInMBorGB}", + "thisEmailIsAlreadyInUse": "Email ini telah digunakan", + "incorrectCode": "Kode salah", + "authenticationFailedPleaseTryAgain": "Autentikasi gagal, silakan coba lagi", + "verificationFailedPleaseTryAgain": "Verifikasi gagal, silakan coba lagi", + "authenticationSuccessful": "Autentikasi berhasil!", + "incorrectRecoveryKey": "Kunci pemulihan salah", + "theRecoveryKeyYouEnteredIsIncorrect": "Kunci pemulihan yang kamu masukkan salah", + "twofactorAuthenticationSuccessfullyReset": "Autentikasi dua langkah berhasil direset", + "pleaseVerifyTheCodeYouHaveEntered": "Harap periksa kode yang kamu masukkan", + "pleaseContactSupportIfTheProblemPersists": "Silakan hubungi tim bantuan jika masalah terus terjadi", + "twofactorAuthenticationHasBeenDisabled": "Autentikasi dua langkah telah dinonaktifkan", + "sorryTheCodeYouveEnteredIsIncorrect": "Maaf, kode yang kamu masukkan salah", + "yourVerificationCodeHasExpired": "Kode verifikasi kamu telah kedaluwarsa", + "emailChangedTo": "Email diubah menjadi {newEmail}", + "disablingTwofactorAuthentication": "Menonaktifkan autentikasi dua langkah...", + "allMemoriesPreserved": "Semua kenangan terpelihara", + "loadingGallery": "Memuat galeri...", + "syncing": "Menyinkronkan...", + "encryptingBackup": "Mengenkripsi cadangan...", + "syncStopped": "Sinkronisasi terhenti", + "archiving": "Mengarsipkan...", + "unarchiving": "Mengeluarkan dari arsip...", + "successfullyArchived": "Berhasil diarsipkan", + "successfullyUnarchived": "Berhasil dikeluarkan dari arsip", + "renameFile": "Ubah nama file", + "enterFileName": "Masukkan nama file", + "filesDeleted": "File terhapus", + "selectedFilesAreNotOnEnte": "File terpilih tidak tersimpan di Ente", + "thisActionCannotBeUndone": "Tindakan ini tidak dapat dibatalkan", + "emptyTrash": "Kosongkan sampah?", + "permDeleteWarning": "Semua item di sampah akan dihapus secara permanen\n\nTindakan ini tidak dapat dibatalkan", + "empty": "Kosongkan", + "couldNotFreeUpSpace": "Tidak dapat membersihkan ruang", + "permanentlyDeleteFromDevice": "Hapus dari perangkat secara permanen?", + "someItemsAreInBothEnteAndYourDevice": "Sejumlah item tersimpan di Ente serta di perangkat ini.", + "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Item terpilih akan dihapus dari semua album dan dipindahkan ke sampah.", + "theseItemsWillBeDeletedFromYourDevice": "Item ini akan dihapus dari perangkat ini.", + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami.", + "error": "Kesalahan", + "tempErrorContactSupportIfPersists": "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami.", + "networkHostLookUpErr": "Tidak dapat terhubung dengan Ente, harap periksa pengaturan jaringan kamu dan hubungi dukungan jika masalah berlanjut.", + "networkConnectionRefusedErr": "Tidak dapat terhubung dengan Ente, silakan coba lagi setelah beberapa saat. Jika masalah berlanjut, harap hubungi dukungan.", + "cachedData": "Data cache", + "todaysLogs": "Log hari ini", + "viewLogs": "Lihat log", + "preparingLogs": "Menyiapkan log...", + "pleaseSendTheLogsTo": "Silakan kirim log-nya ke \n{toEmail}", + "copyEmailAddress": "Salin alamat email", + "exportLogs": "Ekspor log", + "pleaseEmailUsAt": "Silakan kirimi kami email di {toEmail}", + "didYouKnow": "Tahukah kamu?", + "loadingMessage": "Memuat fotomu...", + "loadMessage1": "Kamu bisa membagikan langgananmu dengan keluarga", + "loadMessage2": "Kami telah memelihara lebih dari 30 juta kenangan saat ini", + "loadMessage3": "Kami menyimpan 3 salinan dari data kamu, salah satunya di tempat pengungsian bawah tanah", + "loadMessage7": "App seluler kami berjalan di latar belakang untuk mengenkripsi dan mencadangkan foto yang kamu potret", + "loadMessage8": "web.ente.io menyediakan alat pengunggah yang bagus", + "loadMessage9": "Kami menggunakan Xchacha20Poly1305 untuk mengenkripsi data-mu dengan aman", + "photoDescriptions": "Keterangan foto", + "fileTypesAndNames": "Nama dan jenis file", + "moments": "Momen", + "searchFaceEmptySection": "Orang akan ditampilkan di sini setelah pengindeksan selesai", + "searchDatesEmptySection": "Telusuri dengan tanggal, bulan, atau tahun", + "searchAlbumsEmptySection": "Album", + "searchFileTypesAndNamesEmptySection": "Nama dan jenis file", + "searchCaptionEmptySection": "Tambah keterangan seperti \"#trip\" pada info foto agar mudah ditemukan di sini", + "language": "Bahasa", + "selectLanguage": "Pilih Bahasa", + "locationName": "Nama tempat", + "addLocation": "Tambah tempat", + "groupNearbyPhotos": "Kelompokkan foto yang berdekatan", + "kiloMeterUnit": "km", + "addLocationButton": "Tambah", + "radius": "Radius", + "save": "Simpan", + "useSelectedPhoto": "Gunakan foto terpilih", + "edit": "Edit", + "rotateLeft": "Putar ke kiri", + "flip": "Balik", + "rotateRight": "Putar ke kanan", + "light": "Cahaya", + "color": "Warna", + "yesDiscardChanges": "Ya, buang perubahan", + "doYouWantToDiscardTheEditsYouHaveMade": "Apakah kamu ingin membuang edit yang telah kamu buat?", + "saving": "Menyimpan...", + "editsSaved": "Perubahan tersimpan", + "oopsCouldNotSaveEdits": "Aduh, tidak dapat menyimpan perubahan", + "distanceInKMUnit": "km", + "@distanceInKMUnit": { + "description": "Unit for distance in km" + }, + "dayToday": "Hari Ini", + "dayYesterday": "Kemarin", + "storage": "Penyimpanan", + "storageBreakupFamily": "Keluarga", + "storageBreakupYou": "Kamu", + "@storageBreakupYou": { + "description": "Label to indicate how much storage you are using when you are part of a family plan" + }, + "storageUsageInfo": "{usedAmount} {usedStorageUnit} dari {totalAmount} {totalStorageUnit} terpakai", + "@storageUsageInfo": { + "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" + }, + "availableStorageSpace": "{freeAmount} {storageUnit} tersedia", + "appVersion": "Versi: {versionValue}", + "fileInfoAddDescHint": "Tambahkan keterangan...", + "editLocationTagTitle": "Edit lokasi", + "familyPlanPortalTitle": "Keluarga", + "familyPlanOverview": "Tambahkan 5 anggota keluarga ke paket kamu tanpa perlu bayar lebih.\n\nSetiap anggota mendapat ruang pribadi mereka sendiri, dan tidak dapat melihat file orang lain kecuali dibagikan.\n\nPaket keluarga tersedia bagi pelanggan yang memiliki langganan berbayar Ente.\n\nLangganan sekarang untuk mulai!", + "androidBiometricHint": "Verifikasi identitas", + "@androidBiometricHint": { + "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricNotRecognized": "Tidak dikenal. Coba lagi.", + "@androidBiometricNotRecognized": { + "description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricSuccess": "Berhasil", + "@androidBiometricSuccess": { + "description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters." + }, + "androidCancelButton": "Batal", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "androidSignInTitle": "Autentikasi diperlukan", + "@androidSignInTitle": { + "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." + }, + "androidBiometricRequiredTitle": "Biometrik diperlukan", + "@androidBiometricRequiredTitle": { + "description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters." + }, + "goToSettings": "Buka pengaturan", + "@goToSettings": { + "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." + }, + "androidGoToSettingsDescription": "Autentikasi biometrik belum aktif di perangkatmu. Buka 'Setelan > Keamanan' untuk mengaktifkan autentikasi biometrik.", + "@androidGoToSettingsDescription": { + "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." + }, + "iOSGoToSettingsDescription": "Autentikasi biometrik belum aktif di perangkatmu. Silakan aktifkan Touch ID atau Face ID pada ponselmu.", + "@iOSGoToSettingsDescription": { + "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." + }, + "iOSOkButton": "OK", + "@iOSOkButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." + }, + "openstreetmapContributors": "Kontributor OpenStreetMap", + "hostedAtOsmFrance": "Dihosting oleh OSM France", + "map": "Peta", + "@map": { + "description": "Label for the map view" + }, + "maps": "Peta", + "enableMaps": "Aktifkan Peta", + "selectItemsToAdd": "Pilih item untuk ditambahkan", + "addSelected": "Tambahkan yang dipilih", + "addFromDevice": "Tambahkan dari perangkat", + "addPhotos": "Tambah foto", + "noPhotosFoundHere": "Tidak ada foto di sini", + "zoomOutToSeePhotos": "Perkecil peta untuk melihat foto lainnya", + "create": "Buat", + "viewAll": "Lihat semua", + "nothingSharedWithYouYet": "Belum ada yang dibagikan denganmu", + "noAlbumsSharedByYouYet": "Belum ada album yang kamu bagikan", + "sharedWithYou": "Dibagikan dengan kamu", + "sharedByYou": "Dibagikan oleh kamu", + "inviteYourFriendsToEnte": "Undang temanmu ke Ente", + "failedToDownloadVideo": "Gagal mengunduh video", + "hiding": "Menyembunyikan...", + "successfullyHid": "Berhasil disembunyikan", + "crashReporting": "Pelaporan crash", + "addToHiddenAlbum": "Tambah ke album tersembunyi", + "moveToHiddenAlbum": "Pindahkan ke album tersembunyi", + "fileTypes": "Jenis file", + "hearUsWhereTitle": "Dari mana Anda menemukan Ente? (opsional)", + "yourMap": "Peta kamu", + "blackFridaySale": "Penawaran Black Friday", + "upto50OffUntil4thDec": "Potongan hingga 50%, sampai 4 Des.", + "photos": "Foto", + "videos": "Video", + "searchHint2": "Tanggal, keterangan foto", + "searchHint3": "Album, nama dan jenis file", + "searchHint5": "Segera tiba: Penelusuran wajah & ajaib ✨", + "searchResultCount": "{count, plural, other{{count} hasil ditemukan}}", + "@searchResultCount": { + "description": "Text to tell user how many results were found for their search query", + "placeholders": { + "count": { + "example": "1|2|3", + "type": "int" + } + } + }, + "faces": "Wajah", + "people": "Orang", + "contacts": "Kontak", + "noInternetConnection": "Tidak ada koneksi internet", + "pleaseCheckYourInternetConnectionAndTryAgain": "Silakan periksa koneksi internet kamu, lalu coba lagi.", + "signOutFromOtherDevices": "Keluarkan akun dari perangkat lain", + "signOutOtherBody": "Jika kamu merasa ada yang mengetahui sandimu, kamu bisa mengeluarkan akunmu secara paksa dari perangkat lain.", + "signOutOtherDevices": "Keluar di perangkat lain", + "doNotSignOut": "Jangan keluarkan akun", + "editLocation": "Edit lokasi", + "selectALocation": "Pilih lokasi", + "selectALocationFirst": "Pilih lokasi terlebih dahulu", + "changeLocationOfSelectedItems": "Ubah lokasi pada item terpilih?", + "editsToLocationWillOnlyBeSeenWithinEnte": "Perubahan lokasi hanya akan terlihat di Ente", + "waitingForVerification": "Menunggu verifikasi...", + "passkey": "Passkey", + "passkeyAuthTitle": "Verifikasi passkey", + "loginSessionExpired": "Sesi berakhir", + "loginSessionExpiredDetails": "Sesi kamu telah berakhir. Silakan masuk akun kembali.", + "verifyPasskey": "Verifikasi passkey", + "playOnTv": "Putar album di TV", + "pair": "Tautkan", + "deviceNotFound": "Perangkat tidak ditemukan", + "castInstruction": "Buka cast.ente.io pada perangkat yang ingin kamu tautkan.\n\nMasukkan kode yang ditampilkan untuk memutar album di TV.", + "deviceCodeHint": "Masukkan kode", + "joinDiscord": "Bergabung ke Discord", + "descriptions": "Keterangan", + "addAName": "Tambahkan nama", + "findPeopleByName": "Telusuri orang dengan mudah menggunakan nama", + "addCollaborators": "{count, plural, other {Tambahkan kolaborator}}", + "longPressAnEmailToVerifyEndToEndEncryption": "Tekan dan tahan email untuk membuktikan enkripsi ujung ke ujung.", + "developerSettingsWarning": "Apakah kamu yakin ingin mengubah pengaturan pengembang?", + "developerSettings": "Pengaturan pengembang", + "serverEndpoint": "Endpoint server", + "invalidEndpoint": "Endpoint tidak sah", + "invalidEndpointMessage": "Maaf, endpoint yang kamu masukkan tidak sah. Harap masukkan endpoint yang sah dan coba lagi.", + "endpointUpdatedMessage": "Endpoint berhasil diubah", + "customEndpoint": "Terhubung ke {endpoint}", + "createCollaborativeLink": "Buat link kolaborasi", + "search": "Telusuri", + "enterPersonName": "Masukkan nama orang", + "removePersonLabel": "Hapus label orang", + "autoPairDesc": "Taut otomatis hanya tersedia di perangkat yang mendukung Chromecast.", + "manualPairDesc": "Tautkan dengan PIN berfungsi di layar mana pun yang kamu inginkan.", + "connectToDevice": "Hubungkan ke perangkat", + "autoCastDialogBody": "Perangkat Cast yang tersedia akan ditampilkan di sini.", + "autoCastiOSPermission": "Pastikan izin Jaringan Lokal untuk app Ente Foto aktif di Pengaturan.", + "noDeviceFound": "Tidak ditemukan perangkat", + "stopCastingTitle": "Hentikan transmisi", + "stopCastingBody": "Apakah kamu ingin menghentikan transmisi?", + "castIPMismatchTitle": "Gagal mentransmisikan album", + "castIPMismatchBody": "Harap pastikan kamu berada pada jaringan yang sama dengan TV-nya.", + "pairingComplete": "Penautan berhasil", + "savingEdits": "Menyimpan edit...", + "autoPair": "Taut otomatis", + "pairWithPin": "Tautkan dengan PIN", + "faceRecognition": "Pengenalan wajah", + "foundFaces": "Wajah yang ditemukan", + "indexingIsPaused": "Proses indeks dijeda, dan akan otomatis dilanjutkan saat perangkat siap.", + "trim": "Pangkas", + "crop": "Potong", + "rotate": "Putar", + "left": "Kiri", + "right": "Kanan", + "whatsNew": "Hal yang baru" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index f7116668e6..ac66ecca17 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "Inserisci il tuo indirizzo email", "accountWelcomeBack": "Bentornato!", "email": "Email", @@ -23,7 +24,6 @@ "sendEmail": "Invia email", "deleteRequestSLAText": "La tua richiesta verrà elaborata entro 72 ore.", "deleteEmailRequest": "Invia un'email a account-deletion@ente.io dal tuo indirizzo email registrato.", - "entePhotosPerm": "ente necessita del permesso per preservare le tue foto", "ok": "Ok", "createAccount": "Crea account", "createNewAccount": "Crea un nuovo account", @@ -225,17 +225,14 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un'applicazione o di un account ente. Ottimo per raccogliere foto di un evento.", "collectPhotos": "Raccogli le foto", "collaborativeLink": "Link collaborativo", - "shareWithNonenteUsers": "Condividi con utenti che non hanno un account ente", "createPublicLink": "Crea link pubblico", "sendLink": "Invia link", "copyLink": "Copia link", "linkHasExpired": "Il link è scaduto", "publicLinkEnabled": "Link pubblico abilitato", "shareALink": "Condividi un link", - "sharedAlbumSectionDescription": "Crea album condivisi e collaborativi con altri utenti ente, inclusi utenti su piani gratuiti.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Condividi con persone specifiche} =1 {Condividi con una persona} other {Condividi con {numberOfPeople} persone}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +256,10 @@ }, "verificationId": "ID di verifica", "verifyEmailID": "Verifica {email}", - "emailNoEnteAccount": "{email} non ha un account su ente.\n\nInvia un invito per condividere foto.", "shareMyVerificationID": "Ecco il mio ID di verifica: {verificationID} per ente.io.", "shareTextConfirmOthersVerificationID": "Hey, puoi confermare che questo è il tuo ID di verifica: {verificationID} su ente.io", "somethingWentWrong": "Qualcosa è andato storto", "sendInvite": "Invita", - "shareTextRecommendUsingEnte": "Scarica ente in modo da poter facilmente condividere foto e video senza perdita di qualità\n\nhttps://ente.io", "done": "Completato", "applyCodeTitle": "Applica codice", "enterCodeDescription": "Inserisci il codice fornito dal tuo amico per richiedere spazio gratuito per entrambi", @@ -281,7 +276,6 @@ "claimMore": "Richiedine di più!", "theyAlsoGetXGb": "Anche loro riceveranno {storageAmountInGB} GB", "freeStorageOnReferralSuccess": "{storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice", - "shareTextReferralCode": "ente referral code: {referralCode} \n\nApplicalo in Impostazioni → Generale → Referral per ottenere {referralStorageInGB} GB gratis dopo la registrazione di un piano a pagamento\n\nhttps://ente.io", "claimFreeStorage": "Richiedi spazio gratuito", "inviteYourFriends": "Invita i tuoi amici", "failedToFetchReferralDetails": "Impossibile recuperare i dettagli. Per favore, riprova più tardi.", @@ -333,7 +327,6 @@ "removeParticipantBody": "{userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall'utente verrà rimossa dall'album", "keepPhotos": "Mantieni foto", "deletePhotos": "Elimina foto", - "inviteToEnte": "Invita su ente", "removePublicLink": "Rimuovi link pubblico", "disableLinkMessage": "Questo rimuoverà il link pubblico per accedere a \"{albumName}\".", "sharing": "Condivisione in corso...", @@ -349,10 +342,7 @@ "videoSmallCase": "video", "photoSmallCase": "foto", "singleFileDeleteHighlight": "Verrà eliminato da tutti gli album.", - "singleFileInBothLocalAndRemote": "Questo {fileType} è sia su ente che sul tuo dispositivo.", - "singleFileInRemoteOnly": "Questo {fileType} verrà eliminato su ente.", "singleFileDeleteFromDevice": "Questo {fileType} verrà eliminato dal tuo dispositivo.", - "deleteFromEnte": "Elimina da ente", "yesDelete": "Sì, elimina", "movedToTrash": "Spostato nel cestino", "deleteFromDevice": "Elimina dal dispositivo", @@ -406,6 +396,11 @@ }, "photoGridSize": "Dimensione griglia foto", "manageDeviceStorage": "Gestisci memoria dispositivo", + "waitingForWifi": "In attesa del WiFi...", + "status": "Stato", + "indexedItems": "Elementi indicizzati", + "pendingItems": "Elementi in sospeso", + "clearIndexes": "Cancella indici", "selectFoldersForBackup": "Seleziona cartelle per il backup", "selectedFoldersWillBeEncryptedAndBackedUp": "Le cartelle selezionate verranno crittografate e salvate su ente", "unselectAll": "Deseleziona tutto", @@ -435,7 +430,6 @@ "backupOverMobileData": "Backup su dati mobili", "backupVideos": "Backup dei video", "disableAutoLock": "Disabilita blocco automatico", - "deviceLockExplanation": "Disabilita il blocco schermo del dispositivo quando ente è in primo piano e c'è un backup in corso. Questo normalmente non è necessario, ma può aiutare durante grossi caricamenti e le importazioni iniziali di grandi librerie si completano più velocemente.", "about": "Info", "weAreOpenSource": "Siamo open source!", "privacy": "Privacy", @@ -455,7 +449,6 @@ "authToInitiateAccountDeletion": "Autenticati per avviare l'eliminazione dell'account", "areYouSureYouWantToLogout": "Sei sicuro di volerti disconnettere?", "yesLogout": "Sì, disconnetti", - "aNewVersionOfEnteIsAvailable": "Una nuova versione di ente è disponibile.", "update": "Aggiorna", "installManually": "Installa manualmente", "criticalUpdateAvailable": "Un aggiornamento importante è disponibile", @@ -543,11 +536,10 @@ "systemTheme": "Sistema", "freeTrial": "Prova gratuita", "selectYourPlan": "Seleziona un piano", - "enteSubscriptionPitch": "ente conserva i tuoi ricordi, in modo che siano sempre a disposizione, anche se perdi il dispositivo.", "enteSubscriptionShareWithFamily": "Aggiungi la tua famiglia al tuo piano.", "currentUsageIs": "Spazio attualmente utilizzato ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": { "0": "Current usage is 1.2 GB" }, @@ -557,7 +549,6 @@ "renewsOn": "Si rinnova il {endDate}", "freeTrialValidTill": "La prova gratuita termina il {endDate}", "validTill": "Valido fino al {endDate}", - "playStoreFreeTrialValidTill": "Prova gratuita valida fino al {endDate}.\nPuoi scegliere un piano a pagamento in seguito.", "subWillBeCancelledOn": "L'abbonamento verrà cancellato il {endDate}", "subscription": "Abbonamento", "paymentDetails": "Dettagli di Pagamento", @@ -608,7 +599,6 @@ "appleId": "Apple ID", "playstoreSubscription": "Abbonamento su PlayStore", "appstoreSubscription": "abbonamento AppStore", - "subAlreadyLinkedErrMessage": "Il tuo {id} è già collegato ad un altro account ente.\nSe desideri utilizzare il tuo {id} con questo account, contatta il nostro supporto''", "visitWebToManage": "Visita web.ente.io per gestire il tuo abbonamento", "couldNotUpdateSubscription": "Impossibile aggiornare l'abbonamento", "pleaseContactSupportAndWeWillBeHappyToHelp": "Contatta support@ente.io e saremo felici di aiutarti!", @@ -629,7 +619,6 @@ "thankYou": "Grazie", "failedToVerifyPaymentStatus": "Impossibile verificare lo stato del pagamento", "pleaseWaitForSometimeBeforeRetrying": "Riprova tra qualche minuto", - "paymentFailedWithReason": "Purtroppo il tuo pagamento non è riuscito a causa di {reason}", "youAreOnAFamilyPlan": "Sei un utente con piano famiglia!", "contactFamilyAdmin": "Contatta {familyAdminEmail} per gestire il tuo abbonamento", "leaveFamily": "Abbandona il piano famiglia", @@ -653,9 +642,7 @@ "everywhere": "ovunque", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Mobile, Web, Desktop", - "newToEnte": "Nuovo utente", "pleaseLoginAgain": "Effettua nuovamente l'accesso", - "devAccountChanged": "L'account sviluppatore che utilizziamo per pubblicare ente su App Store è cambiato. Per questo motivo dovrai effettuare nuovamente il login.\n\nCi dispiace per il disagio, ma era inevitabile.", "yourSubscriptionHasExpired": "Il tuo abbonamento è scaduto", "storageLimitExceeded": "Limite d'archiviazione superato", "upgrade": "Acquista altro spazio", @@ -666,12 +653,10 @@ }, "backupFailed": "Backup fallito", "couldNotBackUpTryLater": "Impossibile eseguire il backup dei tuoi dati.\nRiproveremo più tardi.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente può criptare e preservare i file solo se concedi l'accesso alle foto e ai video", "pleaseGrantPermissions": "Concedi i permessi", "grantPermission": "Concedi il permesso", "privateSharing": "Condivisioni private", "shareOnlyWithThePeopleYouWant": "Condividi solo con le persone che vuoi", - "usePublicLinksForPeopleNotOnEnte": "Usa link pubblici per persone non registrate su ente", "allowPeopleToAddPhotos": "Permetti alle persone di aggiungere foto", "shareAnAlbumNow": "Condividi un album", "collectEventPhotos": "Raccogli le foto di un evento", @@ -683,7 +668,7 @@ }, "onDevice": "Sul dispositivo", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "Su ente", @@ -708,13 +693,11 @@ "unhide": "Mostra", "unarchive": "Rimuovi dall'archivio", "favorite": "Preferito", - "removeFromFavorite": "Rimuovi dai preferiti", "shareLink": "Condividi link", "createCollage": "Crea un collage", "saveCollage": "Salva il collage", "collageSaved": "Collage salvato nella galleria", "collageLayout": "Disposizione", - "addToEnte": "Aggiungi su ente", "addToAlbum": "Aggiungi all'album", "delete": "Cancella", "hide": "Nascondi", @@ -779,10 +762,7 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Le foto aggiunte da te verranno rimosse dall'album", "youveNoFilesInThisAlbumThatCanBeDeleted": "Non hai file in questo album che possono essere eliminati", "youDontHaveAnyArchivedItems": "Non hai nulla di archiviato.", - "ignoredFolderUploadReason": "Alcuni file in questo album vengono ignorati dal caricamento perché erano stati precedentemente cancellati da ente.", "resetIgnoredFiles": "Ripristina i file ignorati", - "deviceFilesAutoUploading": "I file aggiunti in questa cartella del dispositivo verranno automaticamente caricati su ente.", - "turnOnBackupForAutoUpload": "Attiva il backup per caricare automaticamente i file aggiunti in questa cartella del dispositivo su ente.", "noHiddenPhotosOrVideos": "Nessuna foto o video nascosti", "toHideAPhotoOrVideo": "Per nascondere una foto o un video", "openTheItem": "• Apri la foto o il video", @@ -820,7 +800,6 @@ "clubByFileName": "Unisci per nome file", "count": "Conteggio", "totalSize": "Dimensioni totali", - "time": "Ora", "longpressOnAnItemToViewInFullscreen": "Premi a lungo su un elemento per visualizzarlo a schermo intero", "decryptingVideo": "Decifratura video...", "authToViewYourMemories": "Autenticati per visualizzare le tue foto", @@ -897,10 +876,10 @@ "description": "Text to tell user how many memories have been preserved", "placeholders": { "completed": { - "type": "int" + "type": "String" }, "total": { - "type": "int" + "type": "String" } } }, @@ -911,7 +890,6 @@ "renameFile": "Rinomina file", "enterFileName": "Inserisci un nome per il file", "filesDeleted": "File eliminati", - "selectedFilesAreNotOnEnte": "I file selezionati non sono su ente", "thisActionCannotBeUndone": "Questa azione non può essere annullata", "emptyTrash": "Vuoi svuotare il cestino?", "permDeleteWarning": "Tutti gli elementi nel cestino verranno eliminati definitivamente\n\nQuesta azione non può essere annullata", @@ -920,12 +898,13 @@ "permanentlyDeleteFromDevice": "Eliminare definitivamente dal dispositivo?", "someOfTheFilesYouAreTryingToDeleteAre": "Alcuni dei file che si sta tentando di eliminare sono disponibili solo sul dispositivo e non possono essere recuperati se cancellati", "theyWillBeDeletedFromAllAlbums": "Verranno eliminati da tutti gli album.", - "someItemsAreInBothEnteAndYourDevice": "Alcuni elementi sono sia su ente che sul tuo dispositivo.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino.", "theseItemsWillBeDeletedFromYourDevice": "Questi file verranno eliminati dal tuo dispositivo.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Sembra che qualcosa sia andato storto. Riprova tra un po'. Se l'errore persiste, contatta il nostro team di supporto.", "error": "Errore", "tempErrorContactSupportIfPersists": "Sembra che qualcosa sia andato storto. Riprova tra un po'. Se l'errore persiste, contatta il nostro team di supporto.", + "networkHostLookUpErr": "Impossibile connettersi a Ente, controlla le impostazioni di rete e contatta l'assistenza se l'errore persiste.", + "networkConnectionRefusedErr": "Impossibile connettersi a Ente, riprova tra un po' di tempo. Se l'errore persiste, contatta l'assistenza.", "cachedData": "Dati nella cache", "clearCaches": "Svuota cache", "remoteImages": "Immagini remote", @@ -954,12 +933,16 @@ "loadMessage7": "Le nostre app per smartphone vengono eseguite in background per crittografare e eseguire il backup di qualsiasi nuova foto o video", "loadMessage8": "web.ente.io ha un uploader intuitivo", "loadMessage9": "Usiamo Xchacha20Poly1305 per crittografare in modo sicuro i tuoi dati", + "location": "Luogo", + "searchDatesEmptySection": "Ricerca per data, mese o anno", + "searchLocationEmptySection": "Raggruppa foto scattate entro un certo raggio da una foto", + "searchPeopleEmptySection": "Invita persone e vedrai qui tutte le foto condivise da loro", + "searchAlbumsEmptySection": "Album", "language": "Lingua", "selectLanguage": "Seleziona una lingua", "locationName": "Nome della località", "addLocation": "Aggiungi luogo", "groupNearbyPhotos": "Raggruppa foto nelle vicinanze", - "location": "Luogo", "kiloMeterUnit": "km", "addLocationButton": "Aggiungi", "radius": "Raggio", @@ -1003,7 +986,6 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "availableStorageSpace": "{freeAmount} {storageUnit} liberi", "appVersion": "Versione: {versionValue}", "verifyIDLabel": "Verifica", "fileInfoAddDescHint": "Aggiungi descrizione...", @@ -1014,7 +996,6 @@ }, "setRadius": "Imposta raggio", "familyPlanPortalTitle": "Famiglia", - "familyPlanOverview": "Aggiungi 5 membri della famiglia al tuo piano esistente senza pagare extra.\n\nOgni membro ottiene il proprio spazio privato e non può vedere i file dell'altro a meno che non siano condivisi.\n\nI piani familiari sono disponibili per i clienti che hanno un abbonamento ente a pagamento.\n\nIscriviti ora per iniziare!", "androidBiometricHint": "Verifica l'identità", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1092,7 +1073,6 @@ "noAlbumsSharedByYouYet": "Ancora nessun album condiviso da te", "sharedWithYou": "Condivise con te", "sharedByYou": "Condivise da te", - "inviteYourFriendsToEnte": "Invita i tuoi amici a ente", "failedToDownloadVideo": "Download del video non riuscito", "hiding": "Nascondendo...", "unhiding": "Rimuovendo dal nascondiglio...", @@ -1101,71 +1081,27 @@ "crashReporting": "Segnalazione di crash", "addToHiddenAlbum": "Aggiungi ad album nascosto", "moveToHiddenAlbum": "Sposta in album nascosto", - "deleteConfirmDialogBody": "Questo account è collegato ad altre app di ente, se ne utilizzi.\\n\\nI tuoi dati caricati, su tutte le app di ente, saranno pianificati per la cancellazione e il tuo account verrà eliminato definitivamente.", "hearUsWhereTitle": "Come hai sentito parlare di Ente? (opzionale)", "hearUsExplanation": "Non teniamo traccia del numero di installazioni dell'app. Sarebbe utile se ci dicesse dove ci ha trovato!", "viewAddOnButton": "Visualizza componenti aggiuntivi", "addOns": "Componenti aggiuntivi", "addOnPageSubtitle": "Dettagli dei componenti aggiuntivi", - "yourMap": "Your map", - "modifyYourQueryOrTrySearchingFor": "Modify your query, or try searching for", - "contacts": "Contacts", - "editLocation": "Edit location", - "selectALocation": "Select a location", - "selectALocationFirst": "Select a location first", - "changeLocationOfSelectedItems": "Change location of selected items?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", - "joinDiscord": "Join Discord", - "locations": "Locations", - "descriptions": "Descriptions", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Vista Ospite", - "cl_guest_view_description": "Mostri le foto a un amico? Non preoccuparti che scorrano troppo lontano. La vista ospite bloccherà le foto che selezioni.", - "cl_guest_view_call_to_action": "Seleziona le foto e prova la \"Vista Ospite\".", - "cl_panorama_viewer_title": "Visualizzatore Panoramico", - "cl_panorama_viewer_description": "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L'esperienza è immersiva con la navigazione basata sul movimento!", - "cl_video_player_title": "Lettore Video", - "cl_video_player_description": "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "searchHint3": "Album, nomi di file e tipi", + "searchHint4": "Luogo", + "addNew": "Aggiungi nuovo", + "@addNew": { + "description": "Text to add a new item (location tag, album, caption etc)" + }, + "contacts": "Contatti", + "noInternetConnection": "Nessuna connessione internet", + "pleaseCheckYourInternetConnectionAndTryAgain": "Si prega di verificare la propria connessione Internet e riprovare.", + "signOutFromOtherDevices": "Esci dagli altri dispositivi", + "signOutOtherBody": "Se pensi che qualcuno possa conoscere la tua password, puoi forzare tutti gli altri dispositivi che usano il tuo account ad uscire.", + "signOutOtherDevices": "Esci dagli altri dispositivi", + "doNotSignOut": "Non uscire", + "editLocation": "Modifica luogo", + "selectALocation": "Seleziona un luogo", + "selectALocationFirst": "Scegli prima una posizione", + "changeLocationOfSelectedItems": "Cambiare la posizione degli elementi selezionati?", + "editsToLocationWillOnlyBeSeenWithinEnte": "Le modifiche alla posizione saranno visibili solo all'interno di Ente" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_ja.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_km.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 49563ff49d..06c81195f7 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -1,61 +1,16 @@ { - "addToHiddenAlbum": "Add to hidden album", - "moveToHiddenAlbum": "Move to hidden album", - "fileTypes": "File types", - "deleteConfirmDialogBody": "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.", - "yourMap": "Your map", - "modifyYourQueryOrTrySearchingFor": "Modify your query, or try searching for", - "contacts": "Contacts", - "editLocation": "Edit location", - "selectALocation": "Select a location", - "selectALocationFirst": "Select a location first", - "changeLocationOfSelectedItems": "Change location of selected items?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", - "joinDiscord": "Join Discord", - "locations": "Locations", - "descriptions": "Descriptions", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "passwordLock": "Password lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "@@locale ": "en", + "enterYourEmailAddress": "이메일을 입력하세요", + "accountWelcomeBack": "다시 오신 것을 환영합니다!", + "email": "이메일", + "cancel": "닫기", + "verify": "인증", + "invalidEmailAddress": "잘못된 이메일 주소", + "enterValidEmail": "올바른 이메일 주소를 입력하세요.", + "deleteAccount": "계정 삭제", + "askDeleteReason": "계정을 삭제하는 가장 큰 이유가 무엇인가요?", + "feedback": "피드백", + "confirmAccountDeletion": "계정 삭제 확인", + "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", + "yourAccountHasBeenDeleted": "계정이 삭제되었습니다." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 8acd3f01cb..62dc45e844 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -273,6 +273,11 @@ "failedToApplyCode": "Code toepassen mislukt", "enterReferralCode": "Voer verwijzingscode in", "codeAppliedPageTitle": "Code toegepast", + "changeYourReferralCode": "Wijzig uw verwijzingscode", + "change": "Wijzigen", + "unavailableReferralCode": "Deze code is helaas niet beschikbaar.", + "codeChangeLimitReached": "Sorry, u heeft de limiet van het aantal codewijzigingen bereikt.", + "onlyFamilyAdminCanChangeCode": "Neem contact op met {familyAdminEmail} om uw code te wijzigen.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Geclaimd", "@claimed": { @@ -409,8 +414,13 @@ "photoGridSize": "Foto raster grootte", "manageDeviceStorage": "Apparaatopslag beheren", "machineLearning": "Machine Learning", + "mlConsent": "Schakel machine learning in", + "mlConsentTitle": "Machine learning inschakelen?", + "mlConsentDescription": "Als u machine learning inschakelt, zal Ente informatie zoals gezichtsgeometrie uit bestanden extraheren, inclusief degenen die met u gedeeld worden.\n\nDit gebeurt op uw apparaat, en alle gegenereerde biometrische informatie zal end-to-end versleuteld worden.", + "mlConsentPrivacy": "Klik hier voor meer details over deze functie in ons privacybeleid.", + "mlConsentConfirmation": "Ik begrijp het, en wil machine learning inschakelen", "magicSearch": "Magische zoekfunctie", - "mlIndexingDescription": "Houd er rekening mee dat dit zal resulteren in een hoger internet- en batterijverbruik totdat alle items zijn geïndexeerd.", + "mlIndexingDescription": "Houd er rekening mee dat machine learning zal leiden tot hoger bandbreedte- en batterijgebruik totdat alle items geïndexeerd zijn. Overweeg het gebruik van de desktop app voor snellere indexering. Alle resultaten worden automatisch gesynchroniseerd.", "loadingModel": "Modellen downloaden...", "waitingForWifi": "Wachten op WiFi...", "status": "Status", @@ -486,7 +496,6 @@ "removeDuplicates": "Duplicaten verwijderen", "removeDuplicatesDesc": "Controleer en verwijder bestanden die exacte kopieën zijn.", "viewLargeFiles": "Grote bestanden", - "viewLargeFilesDesc": "Bekijk bestanden die de meeste opslagruimte verbruiken", "noDuplicates": "✨ Geen duplicaten", "youveNoDuplicateFilesThatCanBeCleared": "Je hebt geen dubbele bestanden die kunnen worden gewist", "success": "Succes", @@ -740,7 +749,7 @@ "unhide": "Zichtbaar maken", "unarchive": "Uit archief halen", "favorite": "Toevoegen aan favorieten", - "removeFromFavorite": "Verwijderen uit favorieten", + "removeFromFavorite": "Verwijder van favorieten", "shareLink": "Link delen", "createCollage": "Creëer collage", "saveCollage": "Sla collage op", @@ -1143,6 +1152,7 @@ "successfullyHid": "Succesvol verborgen", "successfullyUnhid": "Met succes zichtbaar gemaakt", "crashReporting": "Crash rapportering", + "resumableUploads": "Hervatbare uploads", "addToHiddenAlbum": "Toevoegen aan verborgen album", "moveToHiddenAlbum": "Verplaatsen naar verborgen album", "fileTypes": "Bestandstype", @@ -1238,28 +1248,13 @@ "castIPMismatchTitle": "Album casten mislukt", "castIPMismatchBody": "Zorg ervoor dat je op hetzelfde netwerk zit als de tv.", "pairingComplete": "Koppeling voltooid", - "faceRecognition": "Gezichtsherkenning", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Gezichten gevonden", - "clusteringProgress": "Voortgang clusteren", - "indexingIsPaused": "Indexeren is gepauzeerd. Het zal automatisch hervatten wanneer het apparaat klaar is.", - "reenterPassword": "Wachtwoord opnieuw invoeren", - "reenterPin": "PIN opnieuw invoeren", - "deviceLock": "Apparaat vergrendeld", - "pinLock": "PIN vergrendeling", - "next": "Volgende", - "setNewPassword": "Nieuw wachtwoord instellen", - "enterPin": "PIN invoeren", - "setNewPin": "Nieuwe PIN instellen", - "appLock": "App-vergrendeling", - "noSystemLockFound": "Geen systeemvergrendeling gevonden", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", - "tapToUnlock": "Tik om te ontgrendelen", - "tooManyIncorrectAttempts": "Te veel onjuiste pogingen", - "mlFunctions": "ML functions", "savingEdits": "Bewerken opslaan...", "autoPair": "Automatisch koppelen", "pairWithPin": "Koppelen met PIN", + "faceRecognition": "Gezichtsherkenning", + "foundFaces": "Gezichten gevonden", + "clusteringProgress": "Voortgang clusteren", + "indexingIsPaused": "Indexeren is gepauzeerd. Het zal automatisch hervatten wanneer het apparaat klaar is.", "trim": "Knippen", "crop": "Bijsnijden", "rotate": "Roteren", @@ -1278,10 +1273,25 @@ } } }, + "enable": "Inschakelen", + "enabled": "Ingeschakeld", + "moreDetails": "Meer details", + "enableMLIndexingDesc": "Ente ondersteunt on-device machine learning voor gezichtsherkenning, magisch zoeken en andere geavanceerde zoekfuncties", + "magicSearchHint": "Magisch zoeken maakt het mogelijk om foto's op hun inhoud worden gezocht, bijvoorbeeld \"bloem\", \"rode auto\", \"identiteitsdocumenten\"", "panorama": "Panorama", + "reenterPassword": "Wachtwoord opnieuw invoeren", + "reenterPin": "PIN opnieuw invoeren", + "deviceLock": "Apparaat vergrendeld", + "pinLock": "PIN vergrendeling", + "next": "Volgende", + "setNewPassword": "Nieuw wachtwoord instellen", + "enterPin": "PIN invoeren", + "setNewPin": "Nieuwe PIN instellen", + "appLock": "App-vergrendeling", + "noSystemLockFound": "Geen systeemvergrendeling gevonden", + "tapToUnlock": "Tik om te ontgrendelen", + "tooManyIncorrectAttempts": "Te veel onjuiste pogingen", "videoInfo": "Video-info", - "appLockDescription": "Kies tussen het standaard vergrendelingsscherm van uw apparaat en een aangepast vergrendelingsscherm met een pincode of wachtwoord.", - "swipeLockEnablePreSteps": "Om swipe-vergrendeling in te schakelen, stelt u de toegangscode van het apparaat of schermvergrendeling in uw systeeminstellingen in.", "autoLock": "Automatische vergrendeling", "immediately": "Onmiddellijk", "autoLockFeatureDescription": "Tijd waarna de app wordt vergrendeld wanneer deze in achtergrond-modus is gezet", @@ -1289,19 +1299,19 @@ "hideContentDescriptionAndroid": "Verbergt app-inhoud in de app-schakelaar en schakelt schermopnamen uit", "hideContentDescriptionIos": "Verbergt de inhoud van de app in de app-schakelaar", "passwordStrengthInfo": "De wachtwoordsterkte wordt berekend aan de hand van de lengte van het wachtwoord, de gebruikte tekens en of het wachtwoord al dan niet in de top 10.000 van meest gebruikte wachtwoorden staat", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", + "noQuickLinksSelected": "Geen snelle links geselecteerd", + "pleaseSelectQuickLinksToRemove": "Selecteer snelle links om te verwijderen", + "removePublicLinks": "Verwijder publieke link", + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Hiermee worden openbare links van alle geselecteerde snelle links verwijderd.", + "guestView": "Gasten weergave", + "guestViewEnablePreSteps": "Om gasten weergave in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", "cl_guest_view_title": "Gastweergave", - "cl_guest_view_description": "Geef je je telefoon aan een vriend om foto's te laten zien? Maak je geen zorgen dat ze te ver swipen. Gastweergave vergrendelt ze op de foto's die je selecteert.", - "cl_guest_view_call_to_action": "Selecteer foto's en bekijk de \"Gastweergave\".", - "cl_panorama_viewer_title": "Panorama Viewer", - "cl_panorama_viewer_description": "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto's met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!", + "cl_guest_view_description": "Geeft u een vriend uw telefoon om foto's te laten zien? Maakt u zich geen zorgen dat ze te ver swipen. Gastweergave zal diegene beperken tot de foto's die u selecteert.", + "cl_guest_view_call_to_action": "Selecteer foto's en bekijk \"Gastweergave\".", + "cl_panorama_viewer_title": "Panoramakijker", + "cl_panorama_viewer_description": "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto's met 360 graden weergave. De ervaring is immersief met op beweging gebaseerde navigatie!", "cl_video_player_title": "Videospeler", - "cl_video_player_description": "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video's.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_video_player_description": "Een verfrissende nieuwe videospeler, met betere afspeelknoppen en ondersteuning voor HDR-video's.", + "appLockDescriptions": "Kies tussen het standaard vergrendelscherm van uw apparaat en een aangepast vergrendelscherm met een pincode of wachtwoord.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index f22ec4f7d0..9bf690cd30 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "Skriv inn e-postadressen din", "accountWelcomeBack": "Velkommen tilbake!", "email": "E-post", @@ -13,63 +14,364 @@ "kindlyHelpUsWithThisInformation": "Vær vennlig og hjelp oss med denne informasjonen", "confirmDeletePrompt": "Ja, jeg ønsker å slette denne kontoen og all dataen dens permanent.", "confirmAccountDeletion": "Bekreft sletting av konto", - "addToHiddenAlbum": "Add to hidden album", - "moveToHiddenAlbum": "Move to hidden album", - "fileTypes": "File types", - "deleteConfirmDialogBody": "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted.", - "yourMap": "Your map", - "modifyYourQueryOrTrySearchingFor": "Modify your query, or try searching for", - "contacts": "Contacts", - "editLocation": "Edit location", - "selectALocation": "Select a location", - "selectALocationFirst": "Select a location first", - "changeLocationOfSelectedItems": "Change location of selected items?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", - "joinDiscord": "Join Discord", - "locations": "Locations", - "descriptions": "Descriptions", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "passwordLock": "Password lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "deleteAccountPermanentlyButton": "Slett bruker for altid", + "yourAccountHasBeenDeleted": "Brukeren din har blitt slettet", + "selectReason": "Velg grunn", + "deleteReason1": "Det mangler en hovedfunksjon jeg trenger", + "deleteReason2": "Appen, eller en bestemt funksjon, fungerer ikke slik jeg tror den skal", + "deleteReason3": "Jeg fant en annen tjeneste jeg liker bedre", + "deleteReason4": "Grunnen min er ikke listet", + "sendEmail": "Send e-post", + "deleteRequestSLAText": "Forespørselen din vil bli behandlet innen 72 timer.", + "deleteEmailRequest": "Vennligst send en e-post til account-deletion@ente.io fra din registrerte e-postadresse.", + "entePhotosPerm": "Ente trenger tillatelse for å bevare bildene dine", + "ok": "Ok", + "createAccount": "Opprett konto", + "createNewAccount": "Opprett ny konto", + "password": "Passord", + "confirmPassword": "Bekreft passordet", + "activeSessions": "Aktive økter", + "oops": "Oisann", + "somethingWentWrongPleaseTryAgain": "Noe gikk galt. Vennligst prøv igjen", + "thisWillLogYouOutOfThisDevice": "Dette vil logge deg ut av denne enheten!", + "thisWillLogYouOutOfTheFollowingDevice": "Dette vil logge deg ut av følgende enhet:", + "terminateSession": "Avslutte økten?", + "terminate": "Avslutte", + "thisDevice": "Denne enheten", + "recoverButton": "Gjenopprett", + "recoverySuccessful": "Gjenopprettingen var vellykket!", + "decrypting": "Dekrypterer...", + "incorrectRecoveryKeyTitle": "Feil gjenopprettingsnøkkel", + "incorrectRecoveryKeyBody": "Gjennopprettingsnøkkelen du skrev inn er feil", + "forgotPassword": "Glemt passord", + "enterYourRecoveryKey": "Skriv inn din gjenopprettingsnøkkel", + "noRecoveryKey": "Ingen gjenopprettingsnøkkel?", + "sorry": "Beklager", + "noRecoveryKeyNoDecryption": "Grunnet vår type ente-til-ende-krypteringsprotokoll kan ikke dine data dekrypteres uten passordet ditt eller gjenopprettingsnøkkelen din", + "verifyEmail": "Bekreft e-postadresse", + "toResetVerifyEmail": "For å tilbakestille passordet ditt, vennligt bekreft e-posten din først.", + "checkInboxAndSpamFolder": "Sjekk innboksen din (og spam) for å fullføre verifikasjonen", + "tapToEnterCode": "Trykk for å angi kode", + "resendEmail": "Send e-posten på nytt", + "weHaveSendEmailTo": "Vi har sendt en e-post til {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "Lag et passord", + "changePasswordTitle": "Bytt passord", + "resetPasswordTitle": "Tilbakestill passord", + "encryptionKeys": "Krypteringsnøkkel", + "passwordWarning": "Vi lagrer ikke dette passordet, så hvis du glemmer det, kan vi ikke dekryptere dataene dine", + "enterPasswordToEncrypt": "Angi et passord vi kan bruke til å kryptere dataene dine", + "enterNewPasswordToEncrypt": "Angi et nytt passord vi kan bruke til å kryptere dataene dine", + "weakStrength": "Svakt", + "strongStrength": "Sterkt", + "moderateStrength": "Moderat", + "passwordStrength": "Passordstyrke: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "Passordet ble endret", + "generatingEncryptionKeys": "Genererer krypteringsnøkler...", + "pleaseWait": "Vennligst vent...", + "continueLabel": "Fortsett", + "insecureDevice": "Usikker enhet", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Beklager, vi kunne ikke generere sikre nøkler på denne enheten.\n\nvennligst registrer deg fra en annen enhet.", + "howItWorks": "Hvordan det fungerer", + "encryption": "Kryptering", + "ackPasswordLostWarning": "Jeg forstår at dersom jeg mister passordet mitt, kan jeg miste dataen min, siden daten er ende-til-ende-kryptert.", + "privacyPolicyTitle": "Personvernserklæring", + "termsOfServicesTitle": "Vilkår", + "signUpTerms": "Jeg godtar bruksvilkårene og personvernreglene", + "logInLabel": "Logg inn", + "loginTerms": "Ved å klikke Logg inn, godtar jeg brukervilkårene og personvernreglene", + "changeEmail": "Endre e-postadresse", + "enterYourPassword": "Angi passordet ditt", + "welcomeBack": "Velkommen tilbake!", + "contactSupport": "Kontakt kundestøtte", + "incorrectPasswordTitle": "Feil passord", + "pleaseTryAgain": "Vennligst prøv igjen", + "recreatePasswordTitle": "Gjenopprett passord", + "useRecoveryKey": "Bruk gjenopprettingsnøkkel", + "recreatePasswordBody": "Den gjeldende enheten er ikke kraftig nok til å verifisere passordet ditt, men vi kan regenerere på en måte som fungerer på alle enheter.\n\nVennligst logg inn med gjenopprettingsnøkkelen og regenerer passordet (du kan bruke den samme igjen om du vil).", + "verifyPassword": "Bekreft passord", + "recoveryKey": "Gjenopprettingsnøkkel", + "recoveryKeyOnForgotPassword": "Hvis du glemmer passordet ditt er den eneste måten du kan gjenopprette dataene dine på med denne nøkkelen.", + "recoveryKeySaveDescription": "Vi lagrer ikke denne nøkkelen, vennligst lagre denne 24-ords nøkkelen på et trygt sted.", + "doThisLater": "Gjør dette senere", + "saveKey": "Lagre nøkkel", + "recoveryKeyCopiedToClipboard": "Gjenopprettingsnøkkel kopiert til utklippstavlen", + "recoverAccount": "Gjenopprett konto", + "recover": "Gjenopprett", + "dropSupportEmail": "Vennligst send en e-post til {supportEmail} fra din registrerte e-postadresse", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "twofactorSetup": "Oppsett av to-faktor", + "enterCode": "Angi kode", + "scanCode": "Skann kode", + "codeCopiedToClipboard": "Kode kopiert til utklippstavlen", + "copypasteThisCodentoYourAuthenticatorApp": "Kopier og lim inn denne koden\ntil autentiseringsappen din", + "tapToCopy": "trykk for å kopiere", + "scanThisBarcodeWithnyourAuthenticatorApp": "Skann denne strekkoden med\nautentiseringsappen din", + "enterThe6digitCodeFromnyourAuthenticatorApp": "Skriv inn den 6-sifrede koden fra\ndin autentiseringsapp", + "confirm": "Bekreft", + "setupComplete": "Oppsett fullført", + "saveYourRecoveryKeyIfYouHaventAlready": "Lagre gjenopprettingsnøkkelen hvis du ikke allerede har gjort det", + "thisCanBeUsedToRecoverYourAccountIfYou": "Dette kan brukes til å gjenopprette kontoen din hvis du mister din andre faktor", + "twofactorAuthenticationPageTitle": "Tofaktorautentisering", + "lostDevice": "Mistet enhet?", + "verifyingRecoveryKey": "Verifiserer gjenopprettingsnøkkel...", + "recoveryKeyVerified": "Gjenopprettingsnøkkel bekreftet", + "recoveryKeySuccessBody": "Flott! Din gjenopprettingsnøkkel er gyldig. Takk for bekreftelsen.\n\nVennligst husk å holde gjenopprettingsnøkkelen din trygt sikkerhetskopiert.", + "invalidRecoveryKey": "Gjenopprettingsnøkkelen du har skrevet inn er ikke gyldig. Kontroller at den inneholder 24 ord og kontroller stavemåten av hvert ord.\n\nHvis du har angitt en eldre gjenopprettingskode, må du kontrollere at den er 64 tegn lang, og kontrollere hvert av dem.", + "invalidKey": "Ugyldig nøkkel", + "tryAgain": "Prøv igjen", + "viewRecoveryKey": "Vis gjenopprettingsnøkkel", + "confirmRecoveryKey": "Bekreft gjenopprettingsnøkkel", + "recoveryKeyVerifyReason": "Gjenopprettings nøkkelen er den eneste måten å gjenopprette bildene dine hvis du glemmer passordet ditt. Du kan finne gjenopprettingsnøkkelen din i Innstillinger > Sikkerhet.\n\nVennligst skriv inn gjenopprettingsnøkkelen din her for å bekrefte at du har lagret den riktig.", + "confirmYourRecoveryKey": "Bekreft din gjenopprettingsnøkkel", + "addViewer": "Legg til seer", + "addCollaborator": "Legg til samarbeidspartner", + "addANewEmail": "Legg til ny e-post", + "orPickAnExistingOne": "Eller velg en eksisterende", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Samarbeidspartnere kan legge til bilder og videoer i det delte albumet.", + "enterEmail": "Skriv inn e-post", + "albumOwner": "Eier", + "@albumOwner": { + "description": "Role of the album owner" + }, + "you": "Deg", + "collaborator": "Samarbeidspartner", + "addMore": "Legg til flere", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "viewer": "Seer", + "remove": "Fjern", + "removeParticipant": "Fjern deltaker", + "@removeParticipant": { + "description": "menuSectionTitle for removing a participant" + }, + "manage": "Administrer", + "addedAs": "Lagt til som", + "changePermissions": "Endre tillatelser?", + "yesConvertToViewer": "Ja, konverter til seer", + "cannotAddMorePhotosAfterBecomingViewer": "{user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem", + "allowAddingPhotos": "Tillat å legge til bilder", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowAddPhotosDescription": "Tillat folk med lenken å også legge til bilder til det delte albumet.", + "passwordLock": "Passordlås", + "disableDownloadWarningTitle": "Vær oppmerksom på", + "disableDownloadWarningBody": "Seere kan fremdeles ta skjermbilder eller lagre en kopi av bildene dine ved bruk av eksterne verktøy", + "allowDownloads": "Tillat nedlastinger", + "linkDeviceLimit": "Enhetsgrense", + "noDeviceLimit": "Ingen", + "@noDeviceLimit": { + "description": "Text to indicate that there is limit on number of devices" + }, + "linkExpiry": "Lenkeutløp", + "linkExpired": "Utløpt", + "linkEnabled": "Aktivert", + "linkNeverExpires": "Aldri", + "expiredLinkInfo": "Denne lenken er utløpt. Vennligst velg en ny utløpstid eller deaktiver lenkeutløp.", + "setAPassword": "Lag et passord", + "lockButtonLabel": "Lås", + "enterPassword": "Angi passord", + "removeLink": "Fjern lenke", + "manageLink": "Administrer lenke", + "linkExpiresOn": "Lenken utløper på {expiryTime}", + "albumUpdated": "Album oppdatert", + "never": "Aldri", + "custom": "Egendefinert", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "after1Hour": "Etter 1 time", + "after1Day": "Etter 1 dag", + "after1Week": "Etter 1 uke", + "after1Month": "Etter 1 måned", + "after1Year": "Etter 1 år", + "manageParticipants": "Administrer", + "albumParticipantsCount": "{count, plural, one {}=0 {Ingen deltakere} =1 {1 Deltaker} other {{count} Deltakere}}", + "@albumParticipantsCount": { + "placeholders": { + "count": { + "type": "int", + "example": "5" + } + }, + "description": "Number of participants in an album, including the album owner." + }, + "collectPhotos": "Samle bilder", + "collaborativeLink": "Samarbeidslenke", + "createPublicLink": "Opprett offentlig lenke", + "sendLink": "Send lenke", + "copyLink": "Kopier lenke", + "linkHasExpired": "Lenken har utløpt", + "publicLinkEnabled": "Offentlig lenke aktivert", + "shareALink": "Del en lenke", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {}=0 {Del med bestemte personer} =1 {Delt med 1 person} other {Delt med {numberOfPeople} personer}}", + "@shareWithPeopleSectionTitle": { + "placeholders": { + "numberOfPeople": { + "type": "int", + "example": "2" + } + } + }, + "thisIsYourVerificationId": "Dette er din bekreftelses-ID", + "someoneSharingAlbumsWithYouShouldSeeTheSameId": "Folk som deler album med deg bør se den samme ID-en på deres enhet.", + "howToViewShareeVerificationID": "Vennligst be dem om å trykke og holde inne på e-postadressen sin på innstillingsskjermen, og bekreft at ID-ene på begge enhetene er like.", + "thisIsPersonVerificationId": "Dette er {email} sin verifiserings-ID", + "@thisIsPersonVerificationId": { + "placeholders": { + "email": { + "type": "String", + "example": "someone@ente.io" + } + } + }, + "verificationId": "Verifiserings-ID", + "verifyEmailID": "Verifiser {email}", + "shareMyVerificationID": "Her er min verifiserings-ID: {verificationID} for ente.io.", + "shareTextConfirmOthersVerificationID": "Hei, kan du bekrefte at dette er din ente.io verifiserings-ID: {verificationID}", + "somethingWentWrong": "Noe gikk galt", + "sendInvite": "Send invitasjon", + "done": "Ferdig", + "enterCodeDescription": "Angi koden fra vennen din for å få gratis lagringsplass for dere begge", + "apply": "Anvend", + "enterReferralCode": "Angi vervekode", + "keepPhotos": "Behold Bilder", + "deletePhotos": "Slett bilder", + "removePublicLink": "Fjern offentlig lenke", + "disableLinkMessage": "Dette fjerner den offentlige lenken for tilgang til \"{albumName}\".", + "sharing": "Deler...", + "youCannotShareWithYourself": "Du kan ikke dele med deg selv", + "createAlbumActionHint": "Trykk og holde inne for å velge bilder, og trykk på + for å lage et album", + "importing": "Importerer....", + "failedToLoadAlbums": "Kunne ikke laste inn album", + "hidden": "Skjult", + "authToViewYourHiddenFiles": "Vennligst autentiser deg for å se dine skjulte filer", + "trash": "Papirkurv", + "uncategorized": "Ukategorisert", + "videoSmallCase": "video", + "photoSmallCase": "bilde", + "singleFileDeleteHighlight": "Den vil bli slettet fra alle album.", + "yesDelete": "Ja, slett", + "movedToTrash": "Flyttet til papirkurven", + "deleteFromDevice": "Slett fra enhet", + "deleteFromBoth": "Slett fra begge", + "newAlbum": "Nytt album", + "albums": "Album", + "memoryCount": "{count, plural, zero{ingen minner} one{{formattedCount} minne} other{{formattedCount} minner}}", + "@memoryCount": { + "description": "The text to display the number of memories", + "type": "text", + "placeholders": { + "count": { + "example": "1", + "type": "int" + }, + "formattedCount": { + "type": "String", + "example": "11.513, 11,511" + } + } + }, + "selectedPhotos": "{count} valgt", + "@selectedPhotos": { + "description": "Display the number of selected photos", + "type": "text", + "placeholders": { + "count": { + "example": "5", + "type": "int" + } + } + }, + "selectedPhotosWithYours": "{count} valgt ({yourCount} dine)", + "@selectedPhotosWithYours": { + "description": "Display the number of selected photos, including the number of selected photos owned by the user", + "type": "text", + "placeholders": { + "count": { + "example": "12", + "type": "int" + }, + "yourCount": { + "example": "2", + "type": "int" + } + } + }, + "advancedSettings": "Avansert", + "@advancedSettings": { + "description": "The text to display in the advanced settings section" + }, + "photoGridSize": "Bilderutenettstørrelse", + "manageDeviceStorage": "Behandle enhetslagring", + "machineLearning": "Maskinlæring", + "magicSearch": "Magisk søk", + "status": "Status", + "indexedItems": "Indekserte elementer", + "pendingItems": "Ventende elementer", + "clearIndexes": "Tøm indekser", + "selectFoldersForBackup": "Velg mapper for sikkerhetskopiering", + "selectedFoldersWillBeEncryptedAndBackedUp": "Valgte mapper vil bli kryptert og sikkerhetskopiert", + "unselectAll": "Velg bort alle", + "selectAll": "Velg alle", + "skip": "Hopp over", + "updatingFolderSelection": "Oppdaterer mappevalg...", + "itemCount": "{count, plural, one{{count} element} other{{count} elementer}}", + "deleteItemCount": "{count, plural, =1 {Slett {count} element} other {Slett {count} elementer}}", + "duplicateItemsGroup": "{count} filer, {formattedSize} hver", + "@duplicateItemsGroup": { + "description": "Display the number of duplicate files and their size", + "type": "text", + "placeholders": { + "count": { + "example": "12", + "type": "int" + }, + "formattedSize": { + "example": "2.3 MB", + "type": "String" + } + } + }, + "remindToEmptyEnteTrash": "Du kan også tømme \"Papirkurven\" for å få den frigjorte lagringsplassen", + "sparkleSuccess": "✨ Suksess", + "familyPlans": "Familieabonnementer", + "referrals": "Vervinger", + "notifications": "Varslinger", + "sharedPhotoNotifications": "Nye delte bilder", + "sharedPhotoNotificationsExplanation": "Motta varsler når noen legger til et bilde i et delt album som du er en del av", + "advanced": "Avansert", + "general": "Generelt", + "security": "Sikkerhet", + "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index fead2aae50..2bf2d4efc1 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "Введите свою электронную почту", "accountWelcomeBack": "С возвращением!", "email": "Электронная почта", @@ -272,6 +273,8 @@ "failedToApplyCode": "Не удалось применить код", "enterReferralCode": "Введите реферальный код", "codeAppliedPageTitle": "Код применён", + "changeYourReferralCode": "Изменить ваш реферальный код", + "change": "Изменить", "storageInGB": "{storageAmountInGB} Гигабайт", "claimed": "Получено", "@claimed": { @@ -409,7 +412,6 @@ "manageDeviceStorage": "Управление хранилищем устройства", "machineLearning": "Machine learning", "magicSearch": "Волшебный поиск", - "mlIndexingDescription": "Пожалуйста, обратите внимание, что машинное обучение приведет к увеличению затрат интернета и энергопотребления до тех пор, пока не будут индексированы все элементы.", "loadingModel": "Загрузка моделей...", "waitingForWifi": "Ожидание WiFi...", "status": "Статус", @@ -485,7 +487,6 @@ "removeDuplicates": "Удаление дубликатов", "removeDuplicatesDesc": "Просмотрите и удалите точные дубликаты.", "viewLargeFiles": "Большие файлы", - "viewLargeFilesDesc": "Просмотр файлов, которые потребляют наибольшее количество памяти", "noDuplicates": "✨ Дубликатов нет", "youveNoDuplicateFilesThatCanBeCleared": "У вас нет дубликатов файлов, которые можно очистить", "success": "Успешно", @@ -1250,42 +1251,49 @@ "left": "Влево", "right": "Вправо", "whatsNew": "Что нового", - "reenterPassword": "Re-enter password", - "mlFunctions": "ML functions", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Режим гостя", - "cl_guest_view_description": "Показываете фото другу? Не переживайте, что он листнет слишком далеко. Режим гостя заблокирует те фото, которые вы выбрали.", - "cl_guest_view_call_to_action": "Выберите фото и попробуйте \"Режим гостя\".", + "reviewSuggestions": "Посмотреть предложения", + "useAsCover": "Использовать для обложки", + "notPersonLabel": "Не {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "enable": "Включить", + "enabled": "Включено", + "moreDetails": "Подробнее", + "panorama": "Панорама", + "reenterPassword": "Подтвердите пароль", + "reenterPin": "Введите PIN-код ещё раз", + "deviceLock": "Блокировка устройства", + "pinLock": "Блокировка PIN-кодом", + "next": "Далее", + "setNewPassword": "Задать новый пароль", + "enterPin": "Введите PIN", + "setNewPin": "Установите новый PIN", + "appLock": "Блокировка приложения", + "noSystemLockFound": "Системная блокировка не найдена", + "tapToUnlock": "Нажмите для разблокировки", + "tooManyIncorrectAttempts": "Слишком много неудачных попыток", + "videoInfo": "Информация о видео", + "autoLock": "Автоблокировка", + "immediately": "Немедленно", + "autoLockFeatureDescription": "Время в фоне, после которого приложение блокируется", + "hideContent": "Скрыть содержимое", + "hideContentDescriptionAndroid": "Скрывает содержимое приложения в переключателе приложений и отключает скриншоты", + "hideContentDescriptionIos": "Скрывает содержимое приложения в переключателе приложений", + "passwordStrengthInfo": "Надежность пароля рассчитывается с учетом длины пароля, используемых символов, и появлением пароля в 10 000 наиболее используемых", + "noQuickLinksSelected": "Не выбрано быстрых ссылок", + "pleaseSelectQuickLinksToRemove": "Пожалуйста, выберите быстрые ссылки для удаления", + "removePublicLinks": "Удалить публичные ссылки", + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Это удалит публичные ссылки на все выбранные быстрые ссылки.", + "guestView": "Гостевой вид", + "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", + "cl_guest_view_title": "Гостевой вид", "cl_panorama_viewer_title": "Просмотр Панорамы", - "cl_panorama_viewer_description": "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!", - "cl_video_player_title": "Видеоплеер", - "cl_video_player_description": "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "cl_video_player_title": "Видеоплеер" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb new file mode 100644 index 0000000000..3c51f175e0 --- /dev/null +++ b/mobile/lib/l10n/intl_sv.arb @@ -0,0 +1,427 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "Ange din e-postadress", + "accountWelcomeBack": "Välkommen tillbaka!", + "email": "E-post", + "cancel": "Avbryt", + "verify": "Bekräfta", + "invalidEmailAddress": "Ogiltig e-postadress", + "enterValidEmail": "Ange en giltig e-postadress.", + "deleteAccount": "Radera konto", + "askDeleteReason": "Vad är den främsta anledningen till att du raderar ditt konto?", + "deleteAccountFeedbackPrompt": "Vi är ledsna att se dig lämna oss. Vänligen dela dina synpunkter för att hjälpa oss att förbättra.", + "feedback": "Feedback", + "kindlyHelpUsWithThisInformation": "Vänligen hjälp oss med denna information", + "confirmDeletePrompt": "Ja, jag vill ta bort detta konto och all data permanent.", + "confirmAccountDeletion": "Bekräfta radering av konto", + "deleteAccountPermanentlyButton": "Radera kontot permanent", + "yourAccountHasBeenDeleted": "Ditt konto har raderats", + "selectReason": "Välj anledning", + "deleteReason1": "Det saknas en viktig funktion som jag behöver", + "deleteReason2": "Appen eller en viss funktion beter sig inte som jag tycker det ska", + "deleteReason3": "Jag hittade en annan tjänst som jag gillar bättre", + "deleteReason4": "Min orsak finns inte med", + "sendEmail": "Skicka e-post", + "deleteRequestSLAText": "Din begäran kommer att hanteras inom 72 timmar.", + "deleteEmailRequest": "Vänligen skicka ett e-postmeddelande till account-deletion@ente.io från din registrerade e-postadress.", + "entePhotosPerm": "Ente behöver tillåtelse att bevara dina foton", + "ok": "OK", + "createAccount": "Skapa konto", + "createNewAccount": "Skapa nytt konto", + "password": "Lösenord", + "confirmPassword": "Bekräfta lösenord", + "activeSessions": "Aktiva sessioner", + "oops": "Hoppsan", + "somethingWentWrongPleaseTryAgain": "Något gick fel, vänligen försök igen", + "thisWillLogYouOutOfThisDevice": "Detta kommer att logga ut dig från denna enhet!", + "thisWillLogYouOutOfTheFollowingDevice": "Detta kommer att logga ut dig från följande enhet:", + "terminateSession": "Avsluta sessionen?", + "terminate": "Avsluta", + "thisDevice": "Den här enheten", + "recoverButton": "Återställ", + "recoverySuccessful": "Återställning lyckades!", + "decrypting": "Dekrypterar...", + "incorrectRecoveryKeyTitle": "Felaktig återställningsnyckel", + "incorrectRecoveryKeyBody": "Återställningsnyckeln du angav är felaktig", + "forgotPassword": "Glömt lösenord", + "enterYourRecoveryKey": "Ange din återställningsnyckel", + "noRecoveryKey": "Ingen återställningsnyckel?", + "sorry": "Förlåt", + "noRecoveryKeyNoDecryption": "På grund av vårt punkt-till-punkt-krypteringssystem så kan dina data inte avkrypteras utan ditt lösenord eller återställningsnyckel", + "verifyEmail": "Bekräfta e-postadress", + "toResetVerifyEmail": "För att återställa ditt lösenord måste du först bekräfta din e-postadress.", + "checkInboxAndSpamFolder": "Kontrollera din inkorg (och skräppost) för att slutföra verifieringen", + "tapToEnterCode": "Tryck för att ange kod", + "resendEmail": "Skicka e-postmeddelandet igen", + "weHaveSendEmailTo": "Vi har skickat ett e-postmeddelande till {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "Välj lösenord", + "changePasswordTitle": "Ändra lösenord", + "resetPasswordTitle": "Återställ lösenord", + "encryptionKeys": "Krypteringsnycklar", + "passwordWarning": "Vi lagrar inte detta lösenord, så om du glömmer bort det, kan vi inte dekryptera dina data", + "enterPasswordToEncrypt": "Ange ett lösenord som vi kan använda för att kryptera din data", + "enterNewPasswordToEncrypt": "Ange ett nytt lösenord som vi kan använda för att kryptera din data", + "weakStrength": "Svagt", + "strongStrength": "Starkt", + "moderateStrength": "Måttligt", + "passwordStrength": "Lösenordsstyrka: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "Lösenordet har ändrats", + "generatingEncryptionKeys": "Skapar krypteringsnycklar...", + "pleaseWait": "Var god vänta...", + "continueLabel": "Fortsätt", + "insecureDevice": "Osäker enhet", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Tyvärr, vi kunde inte generera säkra nycklar på den här enheten.\n\nVänligen registrera dig från en annan enhet.", + "howItWorks": "Så här fungerar det", + "encryption": "Kryptering", + "ackPasswordLostWarning": "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är end-to-end-krypterad.", + "privacyPolicyTitle": "Integritetspolicy", + "termsOfServicesTitle": "Villkor", + "signUpTerms": "Jag samtycker till användarvillkoren och integritetspolicyn", + "logInLabel": "Logga in", + "loginTerms": "Genom att klicka på logga in godkänner jag användarvillkoren och våran integritetspolicy", + "changeEmail": "Ändra e-postadress", + "enterYourPassword": "Ange ditt lösenord", + "welcomeBack": "Välkommen tillbaka!", + "contactSupport": "Kontakta support", + "incorrectPasswordTitle": "Felaktigt lösenord", + "pleaseTryAgain": "Försök igen", + "recreatePasswordTitle": "Återskapa lösenord", + "useRecoveryKey": "Använd återställningsnyckel", + "recreatePasswordBody": "Denna enhet är inte tillräckligt kraftfull för att verifiera ditt lösenord, men vi kan återskapa det på ett sätt som fungerar med alla enheter.\n\nLogga in med din återställningsnyckel och återskapa ditt lösenord (du kan använda samma igen om du vill).", + "verifyPassword": "Bekräfta lösenord", + "recoveryKey": "Återställningsnyckel", + "recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.", + "recoveryKeySaveDescription": "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ords nyckel på en säker plats.", + "doThisLater": "Gör detta senare", + "saveKey": "Spara nyckel", + "recoveryKeyCopiedToClipboard": "Återställningsnyckel kopierad till urklipp", + "recoverAccount": "Återställ konto", + "recover": "Återställ", + "dropSupportEmail": "Vänligen skicka ett e-postmeddelande till {supportEmail} från din registrerade e-postadress", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "twofactorSetup": "Tvåfaktorskonfiguration", + "enterCode": "Ange kod", + "scanCode": "Skanna kod", + "codeCopiedToClipboard": "Koden har kopierats till urklipp", + "copypasteThisCodentoYourAuthenticatorApp": "Kopiera-klistra in den här koden\ntill din autentiseringsapp", + "tapToCopy": "tryck för att kopiera", + "scanThisBarcodeWithnyourAuthenticatorApp": "Skanna denna streckkod med\ndin autentiseringsapp", + "enterThe6digitCodeFromnyourAuthenticatorApp": "Ange den 6-siffriga koden från din autentiseringsapp", + "confirm": "Bekräfta", + "setupComplete": "Konfiguration slutförd", + "saveYourRecoveryKeyIfYouHaventAlready": "Spara din återställningsnyckel om du inte redan har gjort det", + "thisCanBeUsedToRecoverYourAccountIfYou": "Detta kan användas för att återställa ditt konto om du förlorar din andra faktor", + "twofactorAuthenticationPageTitle": "Tvåfaktorsautentisering", + "lostDevice": "Förlorad enhet?", + "verifyingRecoveryKey": "Verifierar återställningsnyckel...", + "recoveryKeyVerified": "Återställningsnyckel verifierad", + "recoveryKeySuccessBody": "Grymt! Din återställningsnyckel är giltig. Tack för att du verifierade.\n\nKom ihåg att hålla din återställningsnyckel säker med backups.", + "invalidRecoveryKey": "Återställningsnyckeln du angav är inte giltig. Kontrollera att den innehåller 24 ord och kontrollera stavningen av varje ord.\n\nOm du har angett en äldre återställnings kod, se till att den är 64 tecken lång, och kontrollera var och en av bokstäverna.", + "invalidKey": "Ogiltig nyckel", + "tryAgain": "Försök igen", + "viewRecoveryKey": "Visa återställningsnyckel", + "confirmRecoveryKey": "Bekräfta återställningsnyckel", + "recoveryKeyVerifyReason": "Din återställningsnyckel är det enda sättet att återställa dina foton om du glömmer ditt lösenord. Du hittar din återställningsnyckel i Inställningar > Säkerhet.\n\nAnge din återställningsnyckel här för att verifiera att du har sparat den ordentligt.", + "confirmYourRecoveryKey": "Bekräfta din återställningsnyckel", + "addViewer": "Lägg till bildvy", + "addCollaborator": "Lägg till samarbetspartner", + "addANewEmail": "Lägg till en ny e-postadress", + "orPickAnExistingOne": "Eller välj en befintlig", + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": "Samarbetspartner kan lägga till foton och videor till det delade albumet.", + "enterEmail": "Ange e-post", + "albumOwner": "Ägare", + "@albumOwner": { + "description": "Role of the album owner" + }, + "you": "Du", + "collaborator": "Samarbetspartner", + "addMore": "Lägg till fler", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "viewer": "Bildvy", + "remove": "Ta bort", + "removeParticipant": "Ta bort användaren", + "@removeParticipant": { + "description": "menuSectionTitle for removing a participant" + }, + "manage": "Hantera", + "addedAs": "Lades till som", + "changePermissions": "Ändra behörighet?", + "yesConvertToViewer": "Ja, konvertera till bildvy", + "cannotAddMorePhotosAfterBecomingViewer": "{user} kommer inte att kunna lägga till fler foton till detta album\n\nDe kommer fortfarande att kunna ta bort befintliga foton som lagts till av dem", + "allowAddingPhotos": "Tillåt lägga till foton", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowAddPhotosDescription": "Tillåt personer med länken att även lägga till foton i det delade albumet.", + "passwordLock": "Lösenordskydd", + "disableDownloadWarningTitle": "Vänligen notera:", + "disableDownloadWarningBody": "Besökare kan fortfarande ta skärmdumpar eller spara en kopia av dina foton med hjälp av externa verktyg", + "allowDownloads": "Tillåt nedladdningar", + "linkDeviceLimit": "Enhetsgräns", + "noDeviceLimit": "Ingen", + "@noDeviceLimit": { + "description": "Text to indicate that there is limit on number of devices" + }, + "linkExpiry": "Länken upphör", + "linkExpired": "Upphört", + "linkEnabled": "Aktiverat", + "linkNeverExpires": "Aldrig", + "expiredLinkInfo": "Denna länk har upphört att gälla. Välj ett nytt datum eller inaktivera tidsbegränsningen.", + "setAPassword": "Ange ett lösenord", + "lockButtonLabel": "Lås", + "enterPassword": "Ange lösenord", + "removeLink": "Radera länk", + "manageLink": "Hantera länk", + "linkExpiresOn": "Länken upphör att gälla {expiryTime}", + "albumUpdated": "Album uppdaterat", + "never": "Aldrig", + "custom": "Anpassad", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "after1Hour": "Om en timme", + "after1Day": "Om en dag", + "after1Week": "Om en vecka", + "after1Month": "Om en månad", + "after1Year": "Om ett år", + "manageParticipants": "Hantera", + "albumParticipantsCount": "{count, plural, =0 {Inga deltagare} =1 {1 deltagare} other {{count} deltagare}}", + "@albumParticipantsCount": { + "placeholders": { + "count": { + "type": "int", + "example": "5" + } + }, + "description": "Number of participants in an album, including the album owner." + }, + "collabLinkSectionDescription": "Skapa en länk så att personer kan lägga till och visa foton i ditt delade album utan att behöva en Ente app eller konto. Perfekt för att samla in bilder från evenemang.", + "collectPhotos": "Samla in foton", + "collaborativeLink": "Samarbetslänk", + "shareWithNonenteUsers": "Dela med icke-Ente användare", + "createPublicLink": "Skapa offentlig länk", + "sendLink": "Skicka länk", + "copyLink": "Kopiera länk", + "linkHasExpired": "Länk har upphört att gälla", + "publicLinkEnabled": "Offentlig länk aktiverad", + "shareALink": "Dela en länk", + "sharedAlbumSectionDescription": "Skapa delade och samarbetande album med andra Ente användare, inklusive användare med gratisnivån.", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {}=0 {Dela med specifika personer} =1 {Delad med en person} other {Delad med {numberOfPeople} personer}}", + "@shareWithPeopleSectionTitle": { + "placeholders": { + "numberOfPeople": { + "type": "int", + "example": "2" + } + } + }, + "thisIsYourVerificationId": "Detta är ditt verifierings-ID", + "someoneSharingAlbumsWithYouShouldSeeTheSameId": "Någon som delar album med dig bör se samma ID på deras enhet.", + "howToViewShareeVerificationID": "Be dem att långtrycka på sin e-postadress på inställningsskärmen och verifiera att ID:n på båda enheterna matchar.", + "thisIsPersonVerificationId": "Detta är {email}s verifierings-ID", + "@thisIsPersonVerificationId": { + "placeholders": { + "email": { + "type": "String", + "example": "someone@ente.io" + } + } + }, + "verificationId": "Verifierings-ID", + "verifyEmailID": "Bekräfta {email}", + "emailNoEnteAccount": "{email} har inte ett Ente-konto.\n\nSkicka dem en inbjudan för att dela bilder.", + "shareMyVerificationID": "Här är mitt verifierings-ID: {verificationID} för ente.io.", + "shareTextConfirmOthersVerificationID": "Hallå, kan du bekräfta att detta är ditt ente.io verifierings-ID: {verificationID}", + "somethingWentWrong": "Något gick fel", + "sendInvite": "Skicka inbjudan", + "shareTextRecommendUsingEnte": "Ladda ner Ente så att vi enkelt kan dela bilder och videor med originell kvalitet\n\nhttps://ente.io", + "done": "Klar", + "applyCodeTitle": "Använd kod", + "enterCodeDescription": "Ange koden som din vän har angett för att få gratis lagring för er båda", + "apply": "Verkställ", + "failedToApplyCode": "Det gick inte att använda koden", + "enterReferralCode": "Ange hänvisningskod", + "codeAppliedPageTitle": "Kod tillämpad", + "change": "Ändra", + "onlyFamilyAdminCanChangeCode": "Kontakta {familyAdminEmail} för att ändra din kod.", + "storageInGB": "{storageAmountInGB} GB", + "claimed": "Nyttjad", + "@claimed": { + "description": "Used to indicate storage claimed, like 10GB Claimed" + }, + "inviteYourFriends": "Bjud in dina vänner", + "subscribe": "Prenumerera", + "trash": "Papperskorg", + "photoSmallCase": "foto", + "yesDelete": "Ja, radera", + "deleteFromDevice": "Radera från enhet", + "newAlbum": "Nytt album", + "albums": "Album", + "mlConsent": "Aktivera maskininlärning", + "mlConsentTitle": "Aktivera maskininlärning?", + "status": "Status", + "itemCount": "{count, plural, one{{count} objekt} other{{count} objekt}}", + "deleteItemCount": "{count, plural, =1 {Radera {count} objekt} other {Radera {count} objekt}}", + "yearsAgo": "{count, plural, one{{count} år sedan} other{{count} år sedan}}", + "about": "Om", + "terms": "Villkor", + "account": "Konto", + "manageSubscription": "Hantera prenumeration", + "changePassword": "Ändra lösenord", + "exportYourData": "Exportera din data", + "logout": "Logga ut", + "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", + "yesLogout": "Ja, logga ut", + "aNewVersionOfEnteIsAvailable": "En ny version av Ente är tillgänglig.", + "update": "Uppdatera", + "ignoreUpdate": "Ignorera", + "retry": "Försök igen", + "viewActiveSessions": "Visa aktiva sessioner", + "no": "Nej", + "yes": "Ja", + "rateUsOnStore": "Betygsätt oss på {storeName}", + "blog": "Blogg", + "twitter": "Twitter", + "mastodon": "Mastodon", + "matrix": "Matrix", + "discord": "Discord", + "reddit": "Reddit", + "theme": "Tema", + "lightTheme": "Ljust", + "darkTheme": "Mörkt", + "subscription": "Prenumeration", + "renewSubscription": "Förnya prenumeration", + "yesRenew": "Ja, förnya", + "yesCancel": "Ja, avbryt", + "send": "Skicka", + "thankYou": "Tack", + "leave": "Lämna", + "pleaseLoginAgain": "Logga in igen", + "upgrade": "Uppgradera", + "name": "Namn", + "moveToAlbum": "Flytta till album", + "shareLink": "Dela länk", + "delete": "Radera", + "share": "Dela", + "moveItem": "{count, plural, one {Flytta objekt} other {Flytta objekt}}", + "@moveItem": { + "description": "Page title while moving one or more items to an album" + }, + "trashDaysLeft": "{count, plural, =0 {} =1 {1 dag} other {{count} dagar}}", + "@trashDaysLeft": { + "description": "Text to indicate number of days remaining before permanent deletion", + "placeholders": { + "count": { + "example": "1|2|3", + "type": "int" + } + } + }, + "deleteAll": "Radera alla", + "sortAlbumsBy": "Sortera efter", + "noResultsFound": "Inga resultat hittades", + "noExifData": "Ingen EXIF-data", + "exif": "EXIF", + "noResults": "Inga resultat", + "close": "Stäng", + "incorrectRecoveryKey": "Felaktig återställningsnyckel", + "theRecoveryKeyYouEnteredIsIncorrect": "Återställningsnyckeln du angav är felaktig", + "viewLogs": "Visa loggar", + "copyEmailAddress": "Kopiera e-postadress", + "language": "Språk", + "selectLanguage": "Välj språk", + "kiloMeterUnit": "km", + "addLocationButton": "Lägg till", + "save": "Spara", + "resetToDefault": "Återställ till standard", + "@resetToDefault": { + "description": "Button text to reset cover photo to default" + }, + "edit": "Redigera", + "color": "Färg", + "storageBreakupYou": "Du", + "@storageBreakupYou": { + "description": "Label to indicate how much storage you are using when you are part of a family plan" + }, + "availableStorageSpace": "{freeAmount} {storageUnit} gratis", + "appVersion": "Version: {versionValue}", + "fileInfoAddDescHint": "Lägg till en beskrivning...", + "androidCancelButton": "Avbryt", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "goToSettings": "Gå till inställningar", + "@goToSettings": { + "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." + }, + "iOSOkButton": "OK", + "@iOSOkButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." + }, + "create": "Skapa", + "viewAll": "Visa alla", + "inviteYourFriendsToEnte": "Bjud in dina vänner till Ente", + "fileTypes": "Filtyper", + "searchResultCount": "{count, plural, one{{count} resultat hittades} other{{count} resultat hittades}}", + "@searchResultCount": { + "description": "Text to tell user how many results were found for their search query", + "placeholders": { + "count": { + "example": "1|2|3", + "type": "int" + } + } + }, + "contacts": "Kontakter", + "noInternetConnection": "Ingen internetanslutning", + "pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.", + "loginSessionExpiredDetails": "Din session har upphört. Logga in igen.", + "search": "Sök", + "whatsNew": "Nyheter", + "useAsCover": "Använd som omslag", + "notPersonLabel": "Inte {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "next": "Nästa", + "guestView": "Gästvy", + "cl_guest_view_title": "Gästvy", + "cl_video_player_title": "Videospelare" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_te.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb new file mode 100644 index 0000000000..9d6b4c0801 --- /dev/null +++ b/mobile/lib/l10n/intl_th.arb @@ -0,0 +1,301 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "ใส่ที่อยู่อีเมลของคุณ", + "accountWelcomeBack": "ยินดีต้อนรับกลับมา!", + "email": "อีเมล", + "cancel": "ยกเลิก", + "verify": "ยืนยัน", + "invalidEmailAddress": "ที่อยู่อีเมลไม่ถูกต้อง", + "enterValidEmail": "โปรดใส่ที่อยู่อีเมลที่ถูกต้อง", + "deleteAccount": "ลบบัญชี", + "askDeleteReason": "เหตุผลหลักที่คุณลบบัญชีคืออะไร?", + "deleteAccountFeedbackPrompt": "เราเสียใจที่เห็นคุณไป โปรดแบ่งปันความคิดเห็นของคุณเพื่อช่วยให้เราปรับปรุง", + "feedback": "ความคิดเห็น", + "kindlyHelpUsWithThisInformation": "กรุณาช่วยเราด้วยข้อมูลนี้", + "confirmDeletePrompt": "ใช่ ฉันต้องการลบบัญชีนี้และข้อมูลที่เกี่ยวข้องทั้งหมดแบบถาวร", + "confirmAccountDeletion": "ยืนยันการลบบัญชี", + "deleteAccountPermanentlyButton": "ลบบัญชีถาวร", + "yourAccountHasBeenDeleted": "บัญชีของคุณถูกลบแล้ว", + "selectReason": "เลือกเหตุผล", + "deleteReason1": "ขาดคุณสมบัติสำคัญที่ฉันต้องการ", + "deleteReason2": "ตัวแอปหรือคุณสมบัติบางอย่างไม่ทำงานเหมือนที่ฉันคิดว่าควรจะเป็น", + "deleteReason3": "ฉันเจอบริการอื่นที่ฉันชอบมากกว่า", + "deleteReason4": "เหตุผลของฉันไม่มีระบุไว้", + "sendEmail": "ส่งอีเมล", + "deleteRequestSLAText": "คำขอของคุณจะได้รับการดำเนินการภายใน 72 ชั่วโมง", + "deleteEmailRequest": "กรุณาส่งอีเมลไปที่ account-deletion@ente.io จากที่อยู่อีเมลที่คุณลงทะเบียนไว้", + "ok": "ตกลง", + "createAccount": "สร้างบัญชี", + "createNewAccount": "สร้างบัญชีใหม่", + "password": "รหัสผ่าน", + "confirmPassword": "ยืนยันรหัสผ่าน", + "activeSessions": "เซสชันที่ใช้งานอยู่", + "oops": "อ๊ะ", + "somethingWentWrongPleaseTryAgain": "มีบางอย่างผิดพลาด โปรดลองอีกครั้ง", + "thisDevice": "อุปกรณ์นี้", + "recoverButton": "กู้คืน", + "recoverySuccessful": "กู้คืนสำเร็จ!", + "decrypting": "กำลังถอดรหัส...", + "incorrectRecoveryKeyTitle": "คีย์การกู้คืนไม่ถูกต้อง", + "incorrectRecoveryKeyBody": "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง", + "forgotPassword": "ลืมรหัสผ่าน", + "enterYourRecoveryKey": "ป้อนคีย์การกู้คืน", + "noRecoveryKey": "ไม่มีคีย์การกู้คืน?", + "sorry": "ขออภัย", + "noRecoveryKeyNoDecryption": "เนื่องจากลักษณะของโปรโตคอลการเข้ารหัสตั้งแต่ต้นทางถึงปลายทางของเรา ข้อมูลของคุณจึงไม่สามารถถอดรหัสได้หากไม่มีรหัสผ่านหรือคีย์การกู้คืน", + "verifyEmail": "ยืนยันอีเมล", + "toResetVerifyEmail": "เพื่อรีเซ็ตรหัสผ่านของคุณ โปรดยืนยันอีเมลของคุณก่อน", + "checkInboxAndSpamFolder": "โปรดตรวจสอบกล่องจดหมาย (และสแปม) ของคุณ เพื่อยืนยันให้เสร็จสิ้น", + "tapToEnterCode": "แตะเพื่อป้อนรหัส", + "resendEmail": "ส่งอีเมลอีกครั้ง", + "weHaveSendEmailTo": "เราได้ส่งจดหมายไปยัง {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, + "setPasswordTitle": "ตั้งรหัสผ่าน", + "changePasswordTitle": "เปลี่ยนรหัสผ่าน", + "resetPasswordTitle": "รีเซ็ตรหัสผ่าน", + "passwordWarning": "เราไม่จัดเก็บรหัสผ่านนี้ ดังนั้นหากคุณลืม เราจะไม่สามารถถอดรหัสข้อมูลของคุณ", + "enterPasswordToEncrypt": "ใส่รหัสผ่านที่เราสามารถใช้เพื่อเข้ารหัสข้อมูลของคุณ", + "enterNewPasswordToEncrypt": "ใส่รหัสผ่านใหม่ที่เราสามารถใช้เพื่อเข้ารหัสข้อมูลของคุณ", + "weakStrength": "อ่อน", + "strongStrength": "แข็งแรง", + "moderateStrength": "ปานกลาง", + "passwordStrength": "ความแข็งแรงของรหัสผ่าน: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, + "passwordChangedSuccessfully": "เปลี่ยนรหัสผ่านสำเร็จ", + "pleaseWait": "กรุณารอสักครู่...", + "continueLabel": "ดำเนินการต่อ", + "insecureDevice": "อุปกรณ์ไม่ปลอดภัย", + "howItWorks": "วิธีการทำงาน", + "encryption": "การเข้ารหัส", + "ackPasswordLostWarning": "ฉันเข้าใจว่าหากฉันทำรหัสผ่านหาย ข้อมูลของฉันอาจสูญหายเนื่องจากข้อมูลของฉันมีการเข้ารหัสจากต้นทางถึงปลายทาง", + "privacyPolicyTitle": "นโยบายความเป็นส่วนตัว", + "termsOfServicesTitle": "เงื่อนไข", + "signUpTerms": "ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว", + "logInLabel": "เข้าสู่ระบบ", + "loginTerms": "โดยการคลิกเข้าสู่ระบบ ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว", + "changeEmail": "เปลี่ยนอีเมล", + "enterYourPassword": "ใส่รหัสผ่านของคุณ", + "welcomeBack": "ยินดีต้อนรับกลับมา!", + "contactSupport": "ติดต่อฝ่ายสนับสนุน", + "incorrectPasswordTitle": "รหัสผ่านไม่ถูกต้อง", + "pleaseTryAgain": "กรุณาลองอีกครั้ง", + "recreatePasswordTitle": "สร้างรหัสผ่านใหม่", + "useRecoveryKey": "ใช้คีย์การกู้คืน", + "recreatePasswordBody": "อุปกรณ์ปัจจุบันไม่ทรงพลังพอที่จะยืนยันรหัสผ่านของคุณ แต่เราสามารถสร้างใหม่ในลักษณะที่ใช้ได้กับอุปกรณ์ทั้งหมดได้\n\nกรุณาเข้าสู่ระบบโดยใช้คีย์การกู้คืนของคุณและสร้างรหัสผ่านใหม่ (คุณสามารถใช้รหัสเดิมอีกครั้งได้หากต้องการ)", + "verifyPassword": "ยืนยันรหัสผ่าน", + "recoveryKey": "คีย์การกู้คืน", + "recoveryKeyOnForgotPassword": "หากคุณลืมรหัสผ่าน วิธีเดียวที่คุณสามารถกู้คืนข้อมูลของคุณได้คือการใช้คีย์นี้", + "recoveryKeySaveDescription": "เราไม่จัดเก็บคีย์นี้ โปรดบันทึกคีย์ 24 คำนี้ไว้ในที่ที่ปลอดภัย", + "doThisLater": "ทำในภายหลัง", + "saveKey": "บันทึกคีย์", + "recoveryKeyCopiedToClipboard": "คัดลอกคีย์การกู้คืนไปยังคลิปบอร์ดแล้ว", + "recoverAccount": "กู้คืนบัญชี", + "recover": "กู้คืน", + "dropSupportEmail": "กรุณาส่งอีเมลไปที่ {supportEmail} จากที่อยู่อีเมลที่คุณลงทะเบียนไว้", + "@dropSupportEmail": { + "placeholders": { + "supportEmail": { + "description": "The support email address", + "type": "String", + "example": "support@ente.io" + } + } + }, + "twofactorSetup": "การตั้งค่าสองปัจจัย", + "enterCode": "ป้อนรหัส", + "scanCode": "สแกนรหัส", + "codeCopiedToClipboard": "คัดลอกรหัสไปยังคลิปบอร์ดแล้ว", + "tapToCopy": "แตะเพื่อคัดลอก", + "confirm": "ยืนยัน", + "setupComplete": "ตั้งค่าเสร็จสมบูรณ์", + "saveYourRecoveryKeyIfYouHaventAlready": "บันทึกคีย์การกู้คืนของคุณหากคุณยังไม่ได้ทำ", + "verifyingRecoveryKey": "กำลังยืนยันคีย์การกู้คืน...", + "recoveryKeyVerified": "ยืนยันคีย์การกู้คืนแล้ว", + "recoveryKeySuccessBody": "ยอดเยี่ยม! คีย์การกู้คืนของคุณถูกต้อง ขอบคุณสำหรับการยืนยัน\n\nโปรดอย่าลืมสำรองคีย์การกู้คืนของคุณไว้อย่างปลอดภัย", + "invalidRecoveryKey": "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง โปรดตรวจสอบให้แน่ใจว่ามี 24 คำ และตรวจสอบการสะกดของแต่ละคำ\n\nหากคุณป้อนรหัสกู้คืนที่เก่ากว่า ตรวจสอบให้แน่ใจว่ามีความยาว 64 ตัวอักษร และตรวจสอบแต่ละตัวอักษร", + "invalidKey": "รหัสไม่ถูกต้อง", + "tryAgain": "ลองอีกครั้ง", + "viewRecoveryKey": "ดูคีย์การกู้คืน", + "confirmRecoveryKey": "ยืนยันคีย์การกู้คืน", + "recoveryKeyVerifyReason": "คีย์การกู้คืนเป็นวิธีเดียวที่จะกู้คืนรูปภาพของคุณหากคุณลืมรหัสผ่าน คุณสามารถหาคีย์การกู้คืนของคุณได้ในการตั้งค่า > ความปลอดภัย\n\nโปรดป้อนคีย์การกู้คืนของคุณที่นี่เพื่อยืนยันว่าคุณได้บันทึกไว้อย่างถูกต้อง", + "confirmYourRecoveryKey": "ยืนยันคีย์การกู้คืนของคุณ", + "addViewer": "เพิ่มผู้ชม", + "addCollaborator": "เพิ่มผู้ทำงานร่วมกัน", + "addANewEmail": "เพิ่มอีเมลใหม่", + "orPickAnExistingOne": "หรือเลือกที่มีอยู่แล้ว", + "enterEmail": "ใส่อีเมล", + "albumOwner": "เจ้าของ", + "@albumOwner": { + "description": "Role of the album owner" + }, + "you": "คุณ", + "addMore": "เพิ่มอีก", + "@addMore": { + "description": "Button text to add more collaborators/viewers" + }, + "allowAddingPhotos": "อนุญาตให้เพิ่มรูปภาพ", + "@allowAddingPhotos": { + "description": "Switch button to enable uploading photos to a public link" + }, + "allowDownloads": "อนุญาตให้ดาวน์โหลด", + "custom": "กำหนดเอง", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "after1Hour": "หลังจาก 1 ชั่วโมง", + "after1Day": "หลังจาก 1 วัน", + "after1Week": "หลังจาก 1 สัปดาห์", + "after1Month": "หลังจาก 1 เดือน", + "after1Year": "หลังจาก 1 ปี", + "manageParticipants": "จัดการ", + "collectPhotos": "รวบรวมรูปภาพ", + "createPublicLink": "สร้างลิงก์สาธารณะ", + "sendLink": "ส่งลิงก์", + "copyLink": "คัดลอกลิงก์", + "linkHasExpired": "ลิงก์หมดอายุแล้ว", + "publicLinkEnabled": "เปิดใช้ลิงก์สาธารณะแล้ว", + "shareALink": "แชร์​ลิงก์", + "apply": "นำไปใช้", + "faq": "คำถามที่พบบ่อย", + "oopsSomethingWentWrong": "อ๊ะ มีบางอย่างผิดพลาด", + "peopleUsingYourCode": "ผู้คนที่ใช้รหัสของคุณ", + "eligible": "มีสิทธิ์", + "total": "รวม", + "importing": "กำลังนำเข้า....", + "trash": "ถังขยะ", + "uncategorized": "ไม่มีหมวดหมู่", + "videoSmallCase": "วิดีโอ", + "photoSmallCase": "รูปภาพ", + "waitingForWifi": "กำลังรอ WiFi...", + "status": "สถานะ", + "unselectAll": "ไม่เลือกทั้งหมด", + "selectAll": "เลือกทั้งหมด", + "skip": "ข้าม", + "itemCount": "{count, plural, other{{count} รายการ}}", + "deleteItemCount": "{count, plural, =1 {ลบ {count} รายการ} other {ลบ {count} รายการ}}", + "authToViewYourRecoveryKey": "โปรดตรวจสอบสิทธิ์เพื่อดูคีย์การกู้คืนของคุณ", + "lightTheme": "สว่าง", + "darkTheme": "มืด", + "systemTheme": "ระบบ", + "freeTrial": "ทดลองใช้ฟรี", + "@onEnte": { + "description": "The text displayed above albums backed up to Ente", + "type": "text" + }, + "onEnte": "บน ente", + "name": "ชื่อ", + "newest": "ใหม่สุด", + "lastUpdated": "อัปเดตล่าสุด", + "deleteEmptyAlbums": "ลบอัลบั้มที่ว่างเปล่า", + "deleteEmptyAlbumsWithQuestionMark": "ลบอัลบั้มที่ว่างเปล่าหรือไม่?", + "deleteProgress": "กำลังลบ {currentlyDeleting} / {totalCount}", + "genericProgress": "กำลังประมวลผล {currentlyProcessing} / {totalCount}", + "@genericProgress": { + "description": "Generic progress text to display when processing multiple items", + "type": "text", + "placeholders": { + "currentlyProcessing": { + "example": "1", + "type": "int" + }, + "totalCount": { + "example": "10", + "type": "int" + } + } + }, + "permanentlyDelete": "ลบอย่างถาวร", + "canOnlyCreateLinkForFilesOwnedByYou": "สามารถสร้างลิงก์ได้เฉพาะไฟล์ที่คุณเป็นเจ้าของ", + "publicLinkCreated": "สร้างลิงก์สาธารณะแล้ว", + "youCanManageYourLinksInTheShareTab": "คุณสามารถจัดการลิงก์ของคุณได้ในแท็บแชร์", + "linkCopiedToClipboard": "คัดลอกลิงก์ไปยังคลิปบอร์ดแล้ว", + "restore": " กู้คืน", + "@restore": { + "description": "Display text for an action which triggers a restore of item from trash", + "type": "text" + }, + "moveToAlbum": "ย้ายไปยังอัลบั้ม", + "unhide": "เลิกซ่อน", + "unarchive": "เลิกเก็บถาวร", + "favorite": "ชื่นชอบ", + "shareLink": "แชร์​ลิงก์", + "addToAlbum": "เพิ่มไปยังอัลบั้ม", + "delete": "ลบ", + "hide": "ซ่อน", + "share": "แชร์", + "unhideToAlbum": "เลิกซ่อนไปยังอัลบั้ม", + "restoreToAlbum": "กู้คืนไปยังอัลบั้ม", + "moveItem": "{count, plural, other {ย้ายรายการ}}", + "@moveItem": { + "description": "Page title while moving one or more items to an album" + }, + "addItem": "{count, plural, other {เพิ่มรายการ}}", + "@addItem": { + "description": "Page title while adding one or more items to album" + }, + "incorrectRecoveryKey": "คีย์การกู้คืนไม่ถูกต้อง", + "theRecoveryKeyYouEnteredIsIncorrect": "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง", + "syncing": "กำลังซิงค์...", + "syncStopped": "หยุดการซิงค์แล้ว", + "loadMessage9": "เราใช้ Xchacha20Poly1305 เพื่อเข้ารหัสข้อมูลของคุณอย่างปลอดภัย", + "save": "บันทึก", + "edit": "แก้ไข", + "saveCopy": "บันทึกสำเนา", + "color": "สี", + "storageBreakupFamily": "ครอบครัว", + "storageBreakupYou": "คุณ", + "@storageBreakupYou": { + "description": "Label to indicate how much storage you are using when you are part of a family plan" + }, + "storageUsageInfo": "ใช้ไป {usedAmount} {usedStorageUnit} จาก {totalAmount} {totalStorageUnit}", + "@storageUsageInfo": { + "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" + }, + "appVersion": "รุ่น: {versionValue}", + "verifyIDLabel": "ยืนยัน", + "fileInfoAddDescHint": "เพิ่มคำอธิบาย...", + "editLocationTagTitle": "แก้ไขตำแหน่ง", + "androidBiometricSuccess": "สำเร็จ", + "@androidBiometricSuccess": { + "description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters." + }, + "androidCancelButton": "ยกเลิก", + "@androidCancelButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." + }, + "goToSettings": "ไปที่การตั้งค่า", + "@goToSettings": { + "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." + }, + "iOSOkButton": "ตกลง", + "@iOSOkButton": { + "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." + }, + "openstreetmapContributors": "ผู้มีส่วนร่วม OpenStreetMap", + "hostedAtOsmFrance": "โฮสต์ที่ OSM ฝรั่งเศส", + "map": "แผนที่", + "@map": { + "description": "Label for the map view" + }, + "maps": "แผนที่", + "enableMaps": "เปิดใช้งานแผนที่" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_ti.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index ffd6ec0f7c..a51913a120 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1,4 +1,5 @@ { + "@@locale ": "en", "enterYourEmailAddress": "E-posta adresinizi girin", "accountWelcomeBack": "Tekrar hoş geldiniz!", "email": "E-Posta", @@ -23,7 +24,6 @@ "sendEmail": "E-posta gönder", "deleteRequestSLAText": "İsteğiniz 72 saat içinde gerçekleştirilecek.", "deleteEmailRequest": "Lütfen kayıtlı e-posta adresinizden account-deletion@ente.io'a e-posta gönderiniz.", - "entePhotosPerm": "Ente needs permission to preserve your photos", "ok": "Tamam", "createAccount": "Hesap oluşturun", "createNewAccount": "Yeni bir hesap oluşturun", @@ -225,17 +225,14 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos.", "collectPhotos": "Fotoğrafları topla", "collaborativeLink": "Organizasyon bağlantısı", - "shareWithNonenteUsers": "Share with non-Ente users", "createPublicLink": "Herkese açık link oluştur", "sendLink": "Link gönder", "copyLink": "Linki kopyala", "linkHasExpired": "Bağlantının süresi dolmuş", "publicLinkEnabled": "Herkese açık bağlantı aktive edildi", "shareALink": "Linki paylaş", - "sharedAlbumSectionDescription": "Create shared and collaborative albums with other Ente users, including users on free plans.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Belirli kişilerle paylaş} =1 {1 kişiyle paylaşıldı} other {{numberOfPeople} kişiyle paylaşıldı}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +256,10 @@ }, "verificationId": "Doğrulama kimliği", "verifyEmailID": "{email} doğrula", - "emailNoEnteAccount": "{email} does not have an Ente account.\n\nSend them an invite to share photos.", "shareMyVerificationID": "İşte ente.io için doğrulama kimliğim: {verificationID}.", "shareTextConfirmOthersVerificationID": "Merhaba, bu ente.io doğrulama kimliğinizin doğruluğunu onaylayabilir misiniz: {verificationID}", "somethingWentWrong": "Bazı şeyler yanlış gitti", "sendInvite": "Davet kodu gönder", - "shareTextRecommendUsingEnte": "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io", "done": "Bitti", "applyCodeTitle": "Kodu girin", "enterCodeDescription": "Arkadaşınız tarafından sağlanan kodu girerek hem sizin hem de arkadaşınızın ücretsiz depolamayı talep etmek için girin", @@ -281,7 +276,6 @@ "claimMore": "Arttır!", "theyAlsoGetXGb": "Aynı zamanda {storageAmountInGB} GB alıyorlar", "freeStorageOnReferralSuccess": "Birisinin davet kodunuzu uygulayıp ücretli hesap açtığı her seferede {storageAmountInGB} GB", - "shareTextReferralCode": "Ente referral code: {referralCode} \n\nApply it in Settings → General → Referrals to get {referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io", "claimFreeStorage": "Bedava alan talep edin", "inviteYourFriends": "Arkadaşlarını davet et", "failedToFetchReferralDetails": "Davet ayrıntıları çekilemedi. Iütfen daha sonra deneyin.", @@ -334,7 +328,6 @@ "removeParticipantBody": "{userEmail} bu paylaşılan albümden kaldırılacaktır\n\nOnlar tarafından eklenen tüm fotoğraflar da albümden kaldırılacaktır", "keepPhotos": "Fotoğrafları sakla", "deletePhotos": "Fotoğrafları sil", - "inviteToEnte": "Invite to Ente", "removePublicLink": "Herkese açık link oluştur", "disableLinkMessage": "Bu, \"{albumName}\"e erişim için olan genel bağlantıyı kaldıracaktır.", "sharing": "Paylaşılıyor...", @@ -350,10 +343,7 @@ "videoSmallCase": "video", "photoSmallCase": "fotoğraf", "singleFileDeleteHighlight": "Tüm albümlerden silinecek.", - "singleFileInBothLocalAndRemote": "This {fileType} is in both Ente and your device.", - "singleFileInRemoteOnly": "This {fileType} will be deleted from Ente.", "singleFileDeleteFromDevice": "Bu {fileType}, cihazınızdan silinecek.", - "deleteFromEnte": "Delete from Ente", "yesDelete": "Evet, sil", "movedToTrash": "Cöp kutusuna taşı", "deleteFromDevice": "Cihazınızdan silin", @@ -409,7 +399,6 @@ "manageDeviceStorage": "Cihaz depolamasını yönet", "machineLearning": "Makine öğrenimi", "magicSearch": "Sihirli arama", - "mlIndexingDescription": "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.", "loadingModel": "Modeller indiriliyor...", "waitingForWifi": "WiFi bekleniyor...", "status": "Durum", @@ -445,13 +434,11 @@ "backupOverMobileData": "Mobil veri ile yedekle", "backupVideos": "Videolari yedekle", "disableAutoLock": "Otomatik kilidi devre dışı bırak", - "deviceLockExplanation": "Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.", "about": "Hakkında", "weAreOpenSource": "Biz açık kaynağız!", "privacy": "Gizlilik", "terms": "Şartlar", "checkForUpdates": "Güncellemeleri kontol et", - "checkStatus": "Check status", "checking": "Kontrol ediliyor...", "youAreOnTheLatestVersion": "En son sürüme sahipsiniz", "account": "Hesap", @@ -466,7 +453,6 @@ "authToInitiateAccountDeletion": "Hesap silme işlemini başlatmak için lütfen kimlik doğrulaması yapın", "areYouSureYouWantToLogout": "Çıkış yapmak istediğinize emin misiniz?", "yesLogout": "Evet, oturumu kapat", - "aNewVersionOfEnteIsAvailable": "A new version of Ente is available.", "update": "Güncelle", "installManually": "Manuel kurulum", "criticalUpdateAvailable": "Kritik güncelleme mevcut", @@ -479,13 +465,9 @@ "backedUpFolders": "Yedeklenmiş klasörler", "backup": "Yedekle", "freeUpDeviceSpace": "Cihaz alanını boşaltın", - "freeUpDeviceSpaceDesc": "Save space on your device by clearing files that have been already backed up.", "allClear": "✨ Tamamen temizle", "noDeviceThatCanBeDeleted": "Bu cihazda silinebilecek hiçbir dosyanız yok", "removeDuplicates": "Yinelenenleri kaldır", - "removeDuplicatesDesc": "Review and remove files that are exact duplicates.", - "viewLargeFiles": "Large files", - "viewLargeFilesDesc": "View files that are consuming the most amount of storage", "noDuplicates": "Yinelenenleri kaldır", "youveNoDuplicateFilesThatCanBeCleared": "Temizlenebilecek yinelenen dosyalarınız yok", "success": "Başarılı", @@ -558,7 +540,6 @@ "systemTheme": "Sistem", "freeTrial": "Ücretsiz deneme", "selectYourPlan": "Planınızı seçin", - "enteSubscriptionPitch": "Ente preserves your memories, so they're always available to you, even if you lose your device.", "enteSubscriptionShareWithFamily": "Aileniz de planınıza eklenebilir.", "currentUsageIs": "Güncel kullanımınız ", "@currentUsageIs": { @@ -573,7 +554,6 @@ "freeTrialValidTill": "Ücretsiz deneme {endDate} sona erir", "validTill": "{endDate} tarihine kadar geçerli", "addOnValidTill": "{storageAmount} eklentiniz {endDate} tarihine kadar geçerlidir", - "playStoreFreeTrialValidTill": "Free trial valid till {endDate}.\nYou can choose a paid plan afterwards.", "subWillBeCancelledOn": "Aboneliğiniz {endDate} tarihinde iptal edilecektir", "subscription": "Abonelik", "paymentDetails": "Ödeme detayları", @@ -624,7 +604,6 @@ "appleId": "Apple kimliği", "playstoreSubscription": "PlayStore aboneliği", "appstoreSubscription": "PlayStore aboneliği", - "subAlreadyLinkedErrMessage": "Your {id} is already linked to another Ente account.\nIf you would like to use your {id} with this account, please contact our support''", "visitWebToManage": "Aboneliğinizi yönetmek için lütfen web.ente.io adresini ziyaret edin", "couldNotUpdateSubscription": "Abonelikler kaydedilemedi", "pleaseContactSupportAndWeWillBeHappyToHelp": "Lütfen support@ente.io ile iletişime geçin; size yardımcı olmaktan memnuniyet duyarız!", @@ -669,9 +648,7 @@ "everywhere": "her yerde", "androidIosWebDesktop": "Android, iOS, Web, Masaüstü", "mobileWebDesktop": "Mobil, Web, Masaüstü", - "newToEnte": "New to Ente", "pleaseLoginAgain": "Lütfen tekrar giriş yapın", - "autoLogoutMessage": "Due to technical glitch, you have been logged out. Our apologies for the inconvenience.", "yourSubscriptionHasExpired": "Aboneliğinizin süresi doldu", "storageLimitExceeded": "Depolama sınırı aşıldı", "upgrade": "Yükselt", @@ -682,12 +659,10 @@ }, "backupFailed": "Yedekleme başarısız oldu", "couldNotBackUpTryLater": "Verilerinizi yedekleyemedik.\nDaha sonra tekrar deneyeceğiz.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente can encrypt and preserve files only if you grant access to them", "pleaseGrantPermissions": "Lütfen izin ver", "grantPermission": "İzinleri değiştir", "privateSharing": "Özel paylaşım", "shareOnlyWithThePeopleYouWant": "Yalnızca istediğiniz kişilerle paylaşın", - "usePublicLinksForPeopleNotOnEnte": "Use public links for people not on Ente", "allowPeopleToAddPhotos": "Kullanıcıların fotoğraf eklemesine izin ver", "shareAnAlbumNow": "Şimdi bir albüm paylaşın", "collectEventPhotos": "Etkinlik fotoğraflarını topla", @@ -739,13 +714,11 @@ "unhide": "Gizleme", "unarchive": "Arşivden cıkar", "favorite": "Favori", - "removeFromFavorite": "Favorilerimden kaldır", "shareLink": "Linki paylaş", "createCollage": "Kolaj oluştur", "saveCollage": "Kolajı kaydet", "collageSaved": "Kolajınız galeriye kaydedildi", "collageLayout": "Düzen", - "addToEnte": "Add to Ente", "addToAlbum": "Albüme ekle", "delete": "Sil", "hide": "Gizle", @@ -810,10 +783,7 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Eklediğiniz fotoğraflar albümden kaldırılacak", "youveNoFilesInThisAlbumThatCanBeDeleted": "Bu cihazda silinebilecek hiçbir dosyanız yok", "youDontHaveAnyArchivedItems": "Arşivlenmiş öğeniz yok.", - "ignoredFolderUploadReason": "Some files in this album are ignored from upload because they had previously been deleted from Ente.", "resetIgnoredFiles": "Yok sayılan dosyaları sıfırla", - "deviceFilesAutoUploading": "Files added to this device album will automatically get uploaded to Ente.", - "turnOnBackupForAutoUpload": "Turn on backup to automatically upload files added to this device folder to Ente.", "noHiddenPhotosOrVideos": "Gizli fotoğraf veya video yok", "toHideAPhotoOrVideo": "Bir fotoğrafı veya videoyu gizlemek için", "openTheItem": "• Öğeyi açın", @@ -839,7 +809,6 @@ "close": "Kapat", "setAs": "Şu şekilde ayarla", "fileSavedToGallery": "Video galeriye kaydedildi", - "filesSavedToGallery": "Files saved to gallery", "fileFailedToSaveToGallery": "Dosya galeriye kaydedilemedi", "download": "İndir", "pressAndHoldToPlayVideo": "Videoları yönetmek için basılı tutun", @@ -891,15 +860,6 @@ "@freeUpSpaceSaving": { "description": "Text to tell user how much space they can free up by deleting items from the device" }, - "freeUpAccessPostDelete": "You can still access {count, plural, one {it} other {them}} on Ente as long as you have an active subscription", - "@freeUpAccessPostDelete": { - "placeholders": { - "count": { - "example": "1", - "type": "int" - } - } - }, "freeUpAmount": "{sizeInMBorGB} yer açın", "thisEmailIsAlreadyInUse": "Bu e-posta zaten kullanılıyor", "incorrectCode": "Yanlış kod", @@ -942,7 +902,6 @@ "renameFile": "Dosyayı yeniden adlandır", "enterFileName": "Dosya adını girin", "filesDeleted": "Dosyalar silinmiş", - "selectedFilesAreNotOnEnte": "Selected files are not on Ente", "thisActionCannotBeUndone": "Bu eylem geri alınamaz", "emptyTrash": "Çöp kutusu boşaltılsın mı?", "permDeleteWarning": "Çöp kutusundaki tüm öğeler kalıcı olarak silinecek\n\nBu işlem geri alınamaz", @@ -951,7 +910,6 @@ "permanentlyDeleteFromDevice": "Cihazdan kalıcı olarak silinsin mi?", "someOfTheFilesYouAreTryingToDeleteAre": "Silmeye çalıştığınız dosyalardan bazıları yalnızca cihazınızda mevcuttur ve silindiği takdirde kurtarılamaz", "theyWillBeDeletedFromAllAlbums": "Tüm albümlerden silinecek.", - "someItemsAreInBothEnteAndYourDevice": "Some items are in both Ente and your device.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Seçilen öğeler tüm albümlerden silinecek ve çöp kutusuna taşınacak.", "theseItemsWillBeDeletedFromYourDevice": "Bu öğeler cihazınızdan silinecektir.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Bir şeyler ters gitmiş gibi görünüyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse, lütfen destek ekibimizle iletişime geçin.", @@ -991,7 +949,6 @@ "fileTypesAndNames": "Dosya türleri ve adları", "location": "Konum", "moments": "Anlar", - "searchFaceEmptySection": "People will be shown here once indexing is done", "searchDatesEmptySection": "Tarihe, aya veya yıla göre arama yapın", "searchLocationEmptySection": "Bir fotoğrafın belli bir yarıçapında çekilen fotoğrafları gruplandırın", "searchPeopleEmptySection": "İnsanları davet ettiğinizde onların paylaştığı tüm fotoğrafları burada göreceksiniz", @@ -1046,7 +1003,6 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "availableStorageSpace": "{freeAmount} {storageUnit} free", "appVersion": "Sürüm: {versionValue}", "verifyIDLabel": "Doğrula", "fileInfoAddDescHint": "Bir açıklama ekle...", @@ -1057,7 +1013,6 @@ }, "setRadius": "Yarıçapı ayarla", "familyPlanPortalTitle": "Aile", - "familyPlanOverview": "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other's files unless they're shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!", "androidBiometricHint": "Kimliği doğrula", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1135,7 +1090,6 @@ "noAlbumsSharedByYouYet": "Henüz paylaştığınız albüm yok", "sharedWithYou": "Sizinle paylaşıldı", "sharedByYou": "Paylaştıklarınız", - "inviteYourFriendsToEnte": "Invite your friends to Ente", "failedToDownloadVideo": "Video indirilemedi", "hiding": "Gizleniyor...", "unhiding": "Gösteriliyor...", @@ -1145,7 +1099,6 @@ "addToHiddenAlbum": "Gizli albüme ekle", "moveToHiddenAlbum": "Gizli albüme ekle", "fileTypes": "Dosya türü", - "deleteConfirmDialogBody": "This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted.", "hearUsWhereTitle": "Ente'yi nereden duydunuz? (opsiyonel)", "hearUsExplanation": "Biz uygulama kurulumlarını takip etmiyoruz. Bizi nereden duyduğunuzdan bahsetmeniz bize çok yardımcı olacak!", "viewAddOnButton": "Eklentileri görüntüle", @@ -1175,7 +1128,6 @@ } }, "faces": "Yüzler", - "people": "People", "contents": "İçerikler", "addNew": "Yeni ekle", "@addNew": { @@ -1198,9 +1150,6 @@ "waitingForVerification": "Doğrulama bekleniyor...", "passkey": "Parola Anahtarı", "passkeyAuthTitle": "Geçiş anahtarı doğrulaması", - "passKeyPendingVerification": "Verification is still pending", - "loginSessionExpired": "Session expired", - "loginSessionExpiredDetails": "Your session has expired. Please login again.", "verifyPasskey": "Şifrenizi doğrulayın", "playOnTv": "Albümü TV'de oynat", "pair": "Eşleştir", @@ -1210,8 +1159,6 @@ "joinDiscord": "Discord'a Katıl", "locations": "Konum", "descriptions": "Açıklama", - "addAName": "Add a name", - "findPeopleByName": "Find people quickly by name", "addViewers": "{count, plural, zero {Görüntüleyen ekle} one {Görüntüleyen ekle} other {Görüntüleyen ekle}}", "addCollaborators": "{count, plural, zero {Ortak çalışan ekle} one {Ortak çalışan ekle} other {Ortak çalışan ekle}}", "longPressAnEmailToVerifyEndToEndEncryption": "Uçtan uca şifrelemeyi doğrulamak için bir e-postaya uzun basın.", @@ -1221,82 +1168,5 @@ "invalidEndpoint": "Geçersiz uç nokta", "invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.", "endpointUpdatedMessage": "Fatura başarıyla güncellendi", - "customEndpoint": "{endpoint}'e bağlanıldı", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "autoPairDesc": "Auto pair works only with devices that support Chromecast.", - "manualPairDesc": "Pair with PIN works with any screen you wish to view your album on.", - "connectToDevice": "Connect to device", - "autoCastDialogBody": "You'll see available Cast devices here.", - "autoCastiOSPermission": "Make sure Local Network permissions are turned on for the Ente Photos app, in Settings.", - "noDeviceFound": "No device found", - "stopCastingTitle": "Stop casting", - "stopCastingBody": "Do you want to stop casting?", - "castIPMismatchTitle": "Failed to cast album", - "castIPMismatchBody": "Please make sure you are on the same network as the TV.", - "pairingComplete": "Pairing complete", - "savingEdits": "Saving edits...", - "autoPair": "Auto pair", - "pairWithPin": "Pair with PIN", - "faceRecognition": "Face recognition", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused. It will automatically resume when device is ready.", - "trim": "Trim", - "crop": "Crop", - "rotate": "Rotate", - "left": "Left", - "right": "Right", - "whatsNew": "What's new", - "reviewSuggestions": "Review suggestions", - "useAsCover": "Use as cover", - "notPersonLabel": "Not {name}?", - "@notPersonLabel": { - "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", - "placeholders": { - "name": { - "content": "{name}", - "type": "String" - } - } - }, - "reenterPassword": "Re-enter password", - "reenterPin": "Re-enter PIN", - "deviceLock": "Device lock", - "pinLock": "PIN lock", - "next": "Next", - "setNewPassword": "Set new password", - "enterPin": "Enter PIN", - "setNewPin": "Set new PIN", - "appLock": "App lock", - "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "tapToUnlock": "Tap to unlock", - "tooManyIncorrectAttempts": "Too many incorrect attempts", - "appLockDescription": "Choose between your device\\'s default lock screen and a custom lock screen with a PIN or password.", - "swipeLockEnablePreSteps": "To enable swipe lock, please setup device passcode or screen lock in your system settings.", - "autoLock": "Auto lock", - "immediately": "Immediately", - "autoLockFeatureDescription": "Time after which the app locks after being put in the background", - "hideContent": "Hide content", - "hideContentDescriptionAndroid": "Hides app content in the app switcher and disables screenshots", - "hideContentDescriptionIos": "Hides app content in the app switcher", - "passwordStrengthInfo": "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords", - "noQuickLinksSelected": "No quick links selected", - "pleaseSelectQuickLinksToRemove": "Please select quick links to remove", - "removePublicLinks": "Remove public links", - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", - "guestView": "Guest view", - "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Misafir Görünümü", - "cl_guest_view_description": "Telefonunuzu bir arkadaşınıza fotoğraf göstermek için mi veriyorsunuz? Fazla kaydırmasından endişelenmeyin. Misafir görünümü seçtiğiniz fotoğraflarla sınırlı kalır.", - "cl_guest_view_call_to_action": "Fotoğrafları seçin ve \"Misafir Görünümü\"nü deneyin.", - "cl_panorama_viewer_title": "Panorama Görüntüleyici", - "cl_panorama_viewer_description": "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!", - "cl_video_player_title": "Video Oynatıcı", - "cl_video_player_description": "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz.", - "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", - "authToViewPasskey": "Please authenticate to view your passkey" + "customEndpoint": "{endpoint}'e bağlanıldı" } \ No newline at end of file From b0379e8945ce17f2d7b464b0094a496fd9928821 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:28:51 +0530 Subject: [PATCH 0721/1179] [mob] Fix missing magic search --- .../semantic_search_service.dart | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 3c06bfc31d..7beb284df7 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -36,8 +36,8 @@ class SemanticSearchService { bool _hasInitialized = false; bool _textModelIsLoaded = false; - bool _isCacheRefreshPending = true; - List _cachedImageEmbeddings = []; + + Future>? _cachedImageEmbeddings; Future<(String, List)>? _searchScreenRequest; String? _latestPendingQuery; @@ -51,28 +51,28 @@ class SemanticSearchService { } _hasInitialized = true; - await _refreshClipCache(); + // call getClipEmbeddings after 5 seconds + Future.delayed(const Duration(seconds: 5), () async { + await getClipEmbeddings(); + }); Bus.instance.on().listen((event) { - _isCacheRefreshPending = true; + _cachedImageEmbeddings = null; }); unawaited(_loadTextModel(delay: true)); } bool isMagicSearchEnabledAndReady() { - return localSettings.isMLIndexingEnabled && - _textModelIsLoaded && - _cachedImageEmbeddings.isNotEmpty; + return localSettings.isMLIndexingEnabled && _textModelIsLoaded; } // searchScreenQuery should only be used for the user initiate query on the search screen. // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { - await _refreshClipCache(); if (!isMagicSearchEnabledAndReady()) { if (flagService.internalUser) { _logger.info( - "Magic search enabled ${localSettings.isMLIndexingEnabled}, loaded $_textModelIsLoaded cached ${_cachedImageEmbeddings.isNotEmpty}", + "Magic search enabled ${localSettings.isMLIndexingEnabled}, loaded $_textModelIsLoaded ", ); } return (query, []); @@ -106,21 +106,10 @@ class SemanticSearchService { _logger.info("Indexes cleared"); } - Future _refreshClipCache() async { - if (_isCacheRefreshPending == false) { - return; - } - _isCacheRefreshPending = false; + Future> getClipEmbeddings() async { _logger.info("Pulling cached embeddings"); - final startTime = DateTime.now(); - _cachedImageEmbeddings = await MLDataDB.instance.getAll(); - final endTime = DateTime.now(); - _logger.info( - "Loading ${_cachedImageEmbeddings.length} took: ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", - ); - Bus.instance.fire(EmbeddingCacheUpdatedEvent()); - _logger - .info("Cached embeddings: " + _cachedImageEmbeddings.length.toString()); + _cachedImageEmbeddings ??= MLDataDB.instance.getAll(); + return _cachedImageEmbeddings!; } Future> getMatchingFiles( @@ -278,10 +267,11 @@ class SemanticSearchService { double? minimumSimilarity, }) async { final startTime = DateTime.now(); + final embeddings = await getClipEmbeddings(); final List queryResults = await _computer.compute( computeBulkSimilarities, param: { - "imageEmbeddings": _cachedImageEmbeddings, + "imageEmbeddings": embeddings, "textEmbedding": textEmbedding, "minimumSimilarity": minimumSimilarity, }, From 71034775983126217164725f72f2b8e10d91e844 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 16:25:27 +0530 Subject: [PATCH 0722/1179] [server] Reduce filedata delete worker count to 1 --- server/pkg/controller/filedata/delete.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/pkg/controller/filedata/delete.go b/server/pkg/controller/filedata/delete.go index a610282095..c46eba9d66 100644 --- a/server/pkg/controller/filedata/delete.go +++ b/server/pkg/controller/filedata/delete.go @@ -15,7 +15,7 @@ import ( // StartDataDeletion clears associated file data from the object store func (c *Controller) StartDataDeletion() { - go c.startDeleteWorkers(5) + go c.startDeleteWorkers(1) } func (c *Controller) startDeleteWorkers(n int) { @@ -24,7 +24,7 @@ func (c *Controller) startDeleteWorkers(n int) { for i := 0; i < n; i++ { go c.delete(i) // Stagger the workers - time.Sleep(time.Duration(2*i+1) * time.Second) + time.Sleep(time.Duration(2*i+1) * time.Minute) } } From e25d439b9b2b4fd9693a4922758748bbd8f49339 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 16:28:27 +0530 Subject: [PATCH 0723/1179] [server] Update validation for storage bonus --- server/ente/admin.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/server/ente/admin.go b/server/ente/admin.go index 0085ae95d8..edff1f6a2a 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -116,16 +116,21 @@ func (u SupportUpdateBonus) Validate() error { return errors.New("invalid input, set in MB and minute for test") } } else { - if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 1000 { - return errors.New("invalid input for deal, only 200, 1000, 2000 allowed") - } + if isSupportBonus { if u.Year == 0 || u.Year > 100 { return errors.New("invalid input for year, only 1-100") } - } else if u.Year != 3 && u.Year != 5 { - return errors.New("invalid input for year, only 3 or 5") - + if u.StorageInGB == 0 || u.StorageInGB > 2000 { + return errors.New("invalid GB storage, only 1-2000") + } + } else { + if u.StorageInGB != 200 && u.StorageInGB != 2000 && u.StorageInGB != 1000 && u.StorageInGB != 50 { + return errors.New("invalid input for deal, only 50, 200, 1000, 2000 allowed") + } + if u.Year != 3 && u.Year != 5 { + return errors.New("invalid input for year, only 3 or 5") + } } } } From 520d893fd278e24f7ca6bcc6e3398ee99fe38012 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 18:05:36 +0530 Subject: [PATCH 0724/1179] Show ML option only on desktop --- .../src/components/Sidebar/Preferences.tsx | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/web/apps/photos/src/components/Sidebar/Preferences.tsx b/web/apps/photos/src/components/Sidebar/Preferences.tsx index 41c8a5886d..81cd1f9482 100644 --- a/web/apps/photos/src/components/Sidebar/Preferences.tsx +++ b/web/apps/photos/src/components/Sidebar/Preferences.tsx @@ -8,6 +8,7 @@ import { type SupportedLocale, } from "@/base/i18n"; import { MLSettings } from "@/new/photos/components/MLSettings"; +import { isMLSupported } from "@/new/photos/services/ml"; import { EnteMenuItem } from "@ente/shared/components/Menu/EnteMenuItem"; import ChevronRight from "@mui/icons-material/ChevronRight"; import ScienceIcon from "@mui/icons-material/Science"; @@ -78,19 +79,21 @@ export const Preferences: React.FC = ({ endIcon={} label={t("advanced")} /> - - } - /> - - } - onClick={() => setOpenMLSettings(true)} - label={t("ml_search")} + {isMLSupported && ( + + } /> - - + + } + onClick={() => setOpenMLSettings(true)} + label={t("ml_search")} + /> + + + )}
From 0f47842b5fceadafccbac38eefab85ca0e973410 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 18:13:17 +0530 Subject: [PATCH 0725/1179] [mob] generated files --- mobile/lib/generated/intl/messages_all.dart | 68 + mobile/lib/generated/intl/messages_ar.dart | 67 + mobile/lib/generated/intl/messages_bg.dart | 25 + mobile/lib/generated/intl/messages_ca.dart | 25 + mobile/lib/generated/intl/messages_cs.dart | 100 +- mobile/lib/generated/intl/messages_da.dart | 142 ++ mobile/lib/generated/intl/messages_de.dart | 214 ++- mobile/lib/generated/intl/messages_el.dart | 28 + mobile/lib/generated/intl/messages_en.dart | 212 +-- mobile/lib/generated/intl/messages_es.dart | 304 ++-- mobile/lib/generated/intl/messages_et.dart | 25 + mobile/lib/generated/intl/messages_fa.dart | 441 ++++++ mobile/lib/generated/intl/messages_fr.dart | 553 ++++--- mobile/lib/generated/intl/messages_gu.dart | 25 + mobile/lib/generated/intl/messages_he.dart | 975 +++++++++++++ mobile/lib/generated/intl/messages_hi.dart | 113 ++ mobile/lib/generated/intl/messages_id.dart | 1448 +++++++++++++++++++ mobile/lib/generated/intl/messages_it.dart | 381 ++--- mobile/lib/generated/intl/messages_ja.dart | 25 + mobile/lib/generated/intl/messages_km.dart | 25 + mobile/lib/generated/intl/messages_ko.dart | 118 +- mobile/lib/generated/intl/messages_nl.dart | 274 ++-- mobile/lib/generated/intl/messages_no.dart | 499 +++++-- mobile/lib/generated/intl/messages_pl.dart | 214 +-- mobile/lib/generated/intl/messages_pt.dart | 216 +-- mobile/lib/generated/intl/messages_ru.dart | 302 ++-- mobile/lib/generated/intl/messages_sv.dart | 548 +++++++ mobile/lib/generated/intl/messages_te.dart | 25 + mobile/lib/generated/intl/messages_th.dart | 365 +++++ mobile/lib/generated/intl/messages_ti.dart | 25 + mobile/lib/generated/intl/messages_tr.dart | 402 ++--- mobile/lib/generated/intl/messages_zh.dart | 256 ++-- mobile/lib/generated/l10n.dart | 17 + mobile/pubspec.yaml | 2 +- 34 files changed, 6429 insertions(+), 2030 deletions(-) create mode 100644 mobile/lib/generated/intl/messages_ar.dart create mode 100644 mobile/lib/generated/intl/messages_bg.dart create mode 100644 mobile/lib/generated/intl/messages_ca.dart create mode 100644 mobile/lib/generated/intl/messages_da.dart create mode 100644 mobile/lib/generated/intl/messages_el.dart create mode 100644 mobile/lib/generated/intl/messages_et.dart create mode 100644 mobile/lib/generated/intl/messages_fa.dart create mode 100644 mobile/lib/generated/intl/messages_gu.dart create mode 100644 mobile/lib/generated/intl/messages_he.dart create mode 100644 mobile/lib/generated/intl/messages_hi.dart create mode 100644 mobile/lib/generated/intl/messages_id.dart create mode 100644 mobile/lib/generated/intl/messages_ja.dart create mode 100644 mobile/lib/generated/intl/messages_km.dart create mode 100644 mobile/lib/generated/intl/messages_sv.dart create mode 100644 mobile/lib/generated/intl/messages_te.dart create mode 100644 mobile/lib/generated/intl/messages_th.dart create mode 100644 mobile/lib/generated/intl/messages_ti.dart diff --git a/mobile/lib/generated/intl/messages_all.dart b/mobile/lib/generated/intl/messages_all.dart index e274c0ccdb..fee2ce02b3 100644 --- a/mobile/lib/generated/intl/messages_all.dart +++ b/mobile/lib/generated/intl/messages_all.dart @@ -16,53 +16,113 @@ import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/src/intl_helpers.dart'; +import 'messages_ar.dart' as messages_ar; +import 'messages_bg.dart' as messages_bg; +import 'messages_ca.dart' as messages_ca; import 'messages_cs.dart' as messages_cs; +import 'messages_da.dart' as messages_da; import 'messages_de.dart' as messages_de; +import 'messages_el.dart' as messages_el; import 'messages_en.dart' as messages_en; import 'messages_es.dart' as messages_es; +import 'messages_et.dart' as messages_et; +import 'messages_fa.dart' as messages_fa; import 'messages_fr.dart' as messages_fr; +import 'messages_gu.dart' as messages_gu; +import 'messages_he.dart' as messages_he; +import 'messages_hi.dart' as messages_hi; +import 'messages_id.dart' as messages_id; import 'messages_it.dart' as messages_it; +import 'messages_ja.dart' as messages_ja; +import 'messages_km.dart' as messages_km; import 'messages_ko.dart' as messages_ko; import 'messages_nl.dart' as messages_nl; import 'messages_no.dart' as messages_no; import 'messages_pl.dart' as messages_pl; import 'messages_pt.dart' as messages_pt; import 'messages_ru.dart' as messages_ru; +import 'messages_sv.dart' as messages_sv; +import 'messages_te.dart' as messages_te; +import 'messages_th.dart' as messages_th; +import 'messages_ti.dart' as messages_ti; import 'messages_tr.dart' as messages_tr; import 'messages_zh.dart' as messages_zh; typedef Future LibraryLoader(); Map _deferredLibraries = { + 'ar': () => new SynchronousFuture(null), + 'bg': () => new SynchronousFuture(null), + 'ca': () => new SynchronousFuture(null), 'cs': () => new SynchronousFuture(null), + 'da': () => new SynchronousFuture(null), 'de': () => new SynchronousFuture(null), + 'el': () => new SynchronousFuture(null), 'en': () => new SynchronousFuture(null), 'es': () => new SynchronousFuture(null), + 'et': () => new SynchronousFuture(null), + 'fa': () => new SynchronousFuture(null), 'fr': () => new SynchronousFuture(null), + 'gu': () => new SynchronousFuture(null), + 'he': () => new SynchronousFuture(null), + 'hi': () => new SynchronousFuture(null), + 'id': () => new SynchronousFuture(null), 'it': () => new SynchronousFuture(null), + 'ja': () => new SynchronousFuture(null), + 'km': () => new SynchronousFuture(null), 'ko': () => new SynchronousFuture(null), 'nl': () => new SynchronousFuture(null), 'no': () => new SynchronousFuture(null), 'pl': () => new SynchronousFuture(null), 'pt': () => new SynchronousFuture(null), 'ru': () => new SynchronousFuture(null), + 'sv': () => new SynchronousFuture(null), + 'te': () => new SynchronousFuture(null), + 'th': () => new SynchronousFuture(null), + 'ti': () => new SynchronousFuture(null), 'tr': () => new SynchronousFuture(null), 'zh': () => new SynchronousFuture(null), }; MessageLookupByLibrary? _findExact(String localeName) { switch (localeName) { + case 'ar': + return messages_ar.messages; + case 'bg': + return messages_bg.messages; + case 'ca': + return messages_ca.messages; case 'cs': return messages_cs.messages; + case 'da': + return messages_da.messages; case 'de': return messages_de.messages; + case 'el': + return messages_el.messages; case 'en': return messages_en.messages; case 'es': return messages_es.messages; + case 'et': + return messages_et.messages; + case 'fa': + return messages_fa.messages; case 'fr': return messages_fr.messages; + case 'gu': + return messages_gu.messages; + case 'he': + return messages_he.messages; + case 'hi': + return messages_hi.messages; + case 'id': + return messages_id.messages; case 'it': return messages_it.messages; + case 'ja': + return messages_ja.messages; + case 'km': + return messages_km.messages; case 'ko': return messages_ko.messages; case 'nl': @@ -75,6 +135,14 @@ MessageLookupByLibrary? _findExact(String localeName) { return messages_pt.messages; case 'ru': return messages_ru.messages; + case 'sv': + return messages_sv.messages; + case 'te': + return messages_te.messages; + case 'th': + return messages_th.messages; + case 'ti': + return messages_ti.messages; case 'tr': return messages_tr.messages; case 'zh': diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart new file mode 100644 index 0000000000..1ce7ba622c --- /dev/null +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -0,0 +1,67 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ar locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ar'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("مرحبًا مجددًا!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية."), + "cancel": MessageLookupByLibrary.simpleMessage("إلغاء"), + "decrypting": MessageLookupByLibrary.simpleMessage("فك التشفير..."), + "email": MessageLookupByLibrary.simpleMessage("البريد الإلكتروني"), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("أدخل عنوان بريدك الإلكتروني"), + "enterYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("أدخل رمز الاسترداد"), + "forgotPassword": + MessageLookupByLibrary.simpleMessage("نسيت كلمة المرور"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "مفتاح الاسترداد الذي أدخلته غير صحيح"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("مفتاح الاسترداد غير صحيح"), + "invalidEmailAddress": MessageLookupByLibrary.simpleMessage( + "عنوان البريد الإلكتروني غير صالح"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية"), + "recoverButton": MessageLookupByLibrary.simpleMessage("استرداد"), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("نجح الاسترداد!"), + "sorry": MessageLookupByLibrary.simpleMessage("المعذرة"), + "terminate": MessageLookupByLibrary.simpleMessage("إنهاء"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("إنهاء الجلسة؟"), + "thisDevice": MessageLookupByLibrary.simpleMessage("هذا الجهاز"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "سيؤدي هذا إلى تسجيل خروجك من الجهاز التالي:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "سيؤدي هذا إلى تسجيل خروجك من هذا الجهاز!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً."), + "verify": MessageLookupByLibrary.simpleMessage("التحقّق"), + "verifyEmail": + MessageLookupByLibrary.simpleMessage("التحقق من البريد الإلكتروني") + }; +} diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart new file mode 100644 index 0000000000..e887127f40 --- /dev/null +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a bg locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'bg'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart new file mode 100644 index 0000000000..84dea987b0 --- /dev/null +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ca locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ca'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index be665f29b7..2bfb5800f1 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -20,104 +20,6 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'cs'; - static String m0(count) => - "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; - - static String m1(count) => - "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; - final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "addCollaborators": m0, - "addToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Add to hidden album"), - "addViewers": m1, - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), - "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), - "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( - "Change location of selected items?"), - "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), - "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), - "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), - "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), - "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), - "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), - "editsToLocationWillOnlyBeSeenWithinEnte": - MessageLookupByLibrary.simpleMessage( - "Edits to location will only be seen within Ente"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), - "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), - "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), - "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), - "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), - "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused, will automatically resume when device is ready"), - "joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"), - "locations": MessageLookupByLibrary.simpleMessage("Locations"), - "longPressAnEmailToVerifyEndToEndEncryption": - MessageLookupByLibrary.simpleMessage( - "Long press an email to verify end to end encryption."), - "modifyYourQueryOrTrySearchingFor": - MessageLookupByLibrary.simpleMessage( - "Modify your query, or try searching for"), - "moveToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "next": MessageLookupByLibrary.simpleMessage("Next"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), - "passwordLock": MessageLookupByLibrary.simpleMessage("Password lock"), - "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), - "search": MessageLookupByLibrary.simpleMessage("Search"), - "selectALocation": - MessageLookupByLibrary.simpleMessage("Select a location"), - "selectALocationFirst": - MessageLookupByLibrary.simpleMessage("Select a location first"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": - MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), - "yourMap": MessageLookupByLibrary.simpleMessage("Your map") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart new file mode 100644 index 0000000000..f243887b61 --- /dev/null +++ b/mobile/lib/generated/intl/messages_da.dart @@ -0,0 +1,142 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a da locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'da'; + + static String m0(count, formattedCount) => + "${Intl.plural(count, zero: 'ingen minder', one: '${formattedCount} minde', other: '${formattedCount} minder')}"; + + static String m1(count) => "${count} valgt"; + + static String m2(verificationID) => + "Hey, kan du bekræfte, at dette er dit ente.io verifikation ID: ${verificationID}"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("Velkommen tilbage!"), + "activeSessions": + MessageLookupByLibrary.simpleMessage("Aktive sessioner"), + "addOnPageSubtitle": + MessageLookupByLibrary.simpleMessage("Oplysninger om tilføjelser"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "Hvad er hovedårsagen til, at du sletter din konto?"), + "backedUpFolders": + MessageLookupByLibrary.simpleMessage("Sikkerhedskopierede mapper"), + "cancel": MessageLookupByLibrary.simpleMessage("Annuller"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "Ja, jeg ønsker at slette denne konto og alle dens data permanent."), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("Bekræft adgangskode"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Kopiér denne kode\ntil din autentificeringsapp"), + "couldNotUpdateSubscription": MessageLookupByLibrary.simpleMessage( + "Abonnementet kunne ikke opdateres."), + "createAccount": MessageLookupByLibrary.simpleMessage("Opret konto"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("Opret en ny konto"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("Slet konto"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "Vi er kede af at du forlader os. Forklar venligst hvorfor, så vi kan forbedre os."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("Slet konto permanent"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "Send venligst en email til account-deletion@ente.io fra din registrerede email adresse."), + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "Der mangler en vigtig funktion, som jeg har brug for"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "Jeg fandt en anden tjeneste, som jeg syntes bedre om"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("Min grund er ikke angivet"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "Din anmodning vil blive behandlet inden for 72 timer."), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Er du sikker på, at du vil ændre udviklerindstillingerne?"), + "email": MessageLookupByLibrary.simpleMessage("Email"), + "enterPin": MessageLookupByLibrary.simpleMessage("Indtast PIN"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "Indtast venligst en gyldig email adresse."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("Indtast din email adresse"), + "familyPlanPortalTitle": + MessageLookupByLibrary.simpleMessage("Familie"), + "feedback": MessageLookupByLibrary.simpleMessage("Feedback"), + "fileSavedToGallery": + MessageLookupByLibrary.simpleMessage("Fil gemt i galleri"), + "findPeopleByName": + MessageLookupByLibrary.simpleMessage("Find folk hurtigt ved navn"), + "forgotPassword": + MessageLookupByLibrary.simpleMessage("Glemt adgangskode"), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("Forkert adgangskode"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "Den gendannelsesnøgle du indtastede er forkert"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("Ugyldig email adresse"), + "invite": MessageLookupByLibrary.simpleMessage("Inviter"), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "Hjælp os venligst med disse oplysninger"), + "loggingOut": MessageLookupByLibrary.simpleMessage("Logger ud..."), + "longPressAnEmailToVerifyEndToEndEncryption": + MessageLookupByLibrary.simpleMessage( + "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen."), + "manage": MessageLookupByLibrary.simpleMessage("Administrér"), + "memoryCount": m0, + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "Bemærk venligst, at maskinindlæring vil resultere i en højere båndbredde og batteriforbrug, indtil alle elementer er indekseret. Overvej at bruge desktop app til hurtigere indeksering, vil alle resultater blive synkroniseret automatisk."), + "moments": MessageLookupByLibrary.simpleMessage("Øjeblikke"), + "next": MessageLookupByLibrary.simpleMessage("Næste"), + "ok": MessageLookupByLibrary.simpleMessage("Ok"), + "oops": MessageLookupByLibrary.simpleMessage("Ups"), + "password": MessageLookupByLibrary.simpleMessage("Adgangskode"), + "pleaseContactSupportAndWeWillBeHappyToHelp": + MessageLookupByLibrary.simpleMessage( + "Kontakt support@ente.io og vi vil være glade for at hjælpe!"), + "renameFile": MessageLookupByLibrary.simpleMessage("Omdøb fil"), + "scanThisBarcodeWithnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Skan denne QR-kode med godkendelses-appen"), + "searchHint1": + MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"), + "selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"), + "selectedPhotos": m1, + "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), + "shareTextConfirmOthersVerificationID": m2, + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Noget gik galt, prøv venligst igen"), + "subscribe": MessageLookupByLibrary.simpleMessage("Abonner"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("Afslut session?"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "Dette vil logge dig ud af følgende enhed:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "Dette vil logge dig ud af denne enhed!"), + "verify": MessageLookupByLibrary.simpleMessage("Bekræft"), + "viewAddOnButton": + MessageLookupByLibrary.simpleMessage("Vis tilføjelser"), + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("Din konto er blevet slettet") + }; +} diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index e005292385..90dc0b7f0d 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'de'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, one: 'Teilnehmer', other: 'Teilnehmer')} hinzufügen"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Element hinzufügen', other: 'Elemente hinzufügen')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Dein ${storageAmount} Add-on ist gültig bis ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, one: 'Betrachter', other: 'Betrachter')} hinzufügen"; - static String m4(emailOrName) => "Von ${emailOrName} hinzugefügt"; + static String m7(emailOrName) => "Von ${emailOrName} hinzugefügt"; - static String m5(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; + static String m8(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Keine Teilnehmer', one: '1 Teilnehmer', other: '${count} Teilnehmer')}"; - static String m7(versionValue) => "Version: ${versionValue}"; + static String m10(versionValue) => "Version: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} frei"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Bitte kündige dein aktuelles Abo über ${paymentProvider} zuerst"; - static String m10(user) => + static String m13(user) => "Der Nutzer \"${user}\" wird keine weiteren Fotos zum Album hinzufügen können.\n\nJedoch kann er weiterhin vorhandene Bilder, welche durch ihn hinzugefügt worden sind, wieder entfernen"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Deine Familiengruppe hat bereits ${storageAmountInGb} GB erhalten', @@ -58,115 +58,115 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Du hast bereits ${storageAmountInGb} GB erhalten!', })}"; - static String m12(albumName) => + static String m15(albumName) => "Kollaborativer Link für ${albumName} erstellt"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Bitte kontaktiere ${familyAdminEmail} um dein Abo zu verwalten"; - static String m14(provider) => + static String m17(provider) => "Bitte kontaktiere uns über support@ente.io, um dein ${provider} Abo zu verwalten."; - static String m15(endpoint) => "Verbunden mit ${endpoint}"; + static String m18(endpoint) => "Verbunden mit ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Lösche ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} Dateien, ${formattedSize} jede"; - static String m22(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; + static String m25(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet"; - static String m27(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; + static String m30(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; - static String m28(count) => + static String m31(count) => "Du kannst immernoch über Ente ${Intl.plural(count, one: 'darauf', other: 'auf sie')} zugreifen, solange du ein aktives Abo hast"; - static String m29(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; + static String m32(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Es kann vom Gerät gelöscht werden, um ${formattedSize} freizugeben', other: 'Sie können vom Gerät gelöscht werden, um ${formattedSize} freizugeben')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Verarbeite ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} Objekt', other: '${count} Objekte')}"; - static String m33(expiryTime) => "Link läuft am ${expiryTime} ab"; + static String m36(expiryTime) => "Link läuft am ${expiryTime} ab"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'keine Erinnerungsstücke', one: '${formattedCount} Erinnerung', other: '${formattedCount} Erinnerungsstücke')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Element verschieben', other: 'Elemente verschieben')}"; - static String m36(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; + static String m38(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; - static String m37(name) => "Nicht ${name}?"; + static String m39(name) => "Nicht ${name}?"; - static String m38(familyAdminEmail) => + static String m40(familyAdminEmail) => "Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern."; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Passwortstärke: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; - static String m41(endDate) => + static String m43(endDate) => "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; - static String m42(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; + static String m44(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; - static String m43(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; + static String m45(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; - static String m44(storeName) => "Bewerte uns auf ${storeName}"; + static String m46(storeName) => "Bewerte uns auf ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Ihr beide erhaltet ${storageInGB} GB* kostenlos"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt"; - static String m47(endDate) => "Erneuert am ${endDate}"; + static String m49(endDate) => "Erneuert am ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}"; - static String m49(count) => "${count} ausgewählt"; + static String m1(count) => "${count} ausgewählt"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} ausgewählt (${yourCount} von Ihnen)"; - static String m51(verificationID) => + static String m52(verificationID) => "Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -239,17 +239,17 @@ class MessageLookup extends MessageLookupByLibrary { "Neue E-Mail-Adresse hinzufügen"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Bearbeiter hinzufügen"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Vom Gerät hinzufügen"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Ort hinzufügen"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Hinzufügen"), "addMore": MessageLookupByLibrary.simpleMessage("Mehr hinzufügen"), "addNew": MessageLookupByLibrary.simpleMessage("Hinzufügen"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Details der Add-ons"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Add-ons"), "addPhotos": MessageLookupByLibrary.simpleMessage("Fotos hinzufügen"), "addSelected": @@ -260,12 +260,12 @@ class MessageLookup extends MessageLookupByLibrary { "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Zum versteckten Album hinzufügen"), "addViewer": MessageLookupByLibrary.simpleMessage("Album teilen"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Füge deine Foto jetzt hinzu"), "addedAs": MessageLookupByLibrary.simpleMessage("Hinzugefügt als"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage( "Wird zu Favoriten hinzugefügt..."), "advanced": MessageLookupByLibrary.simpleMessage("Erweitert"), @@ -276,7 +276,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Nach 1 Woche"), "after1Year": MessageLookupByLibrary.simpleMessage("Nach 1 Jahr"), "albumOwner": MessageLookupByLibrary.simpleMessage("Besitzer"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Albumtitel"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album aktualisiert"), @@ -317,7 +317,7 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App-Sperre"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Anwenden"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Code nutzen"), @@ -394,7 +394,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatisches Verbinden funktioniert nur mit Geräten, die Chromecast unterstützen."), "available": MessageLookupByLibrary.simpleMessage("Verfügbar"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Gesicherte Ordner"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -420,10 +420,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Du kannst nur Dateien entfernen, die dir gehören"), "cancel": MessageLookupByLibrary.simpleMessage("Abbrechen"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Abonnement kündigen"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Konnte geteilte Dateien nicht löschen"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -471,7 +471,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"), "claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"), "claimed": MessageLookupByLibrary.simpleMessage("Eingelöst"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Unkategorisiert leeren"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -500,7 +500,7 @@ class MessageLookup extends MessageLookupByLibrary { "Erstelle einen Link, mit dem andere Fotos in dem geteilten Album sehen und selbst welche hinzufügen können - ohne dass sie die ein Ente-Konto oder die App benötigen. Ideal um gemeinsam Fotos von Events zu sammeln."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Gemeinschaftlicher Link"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Bearbeiter"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -529,10 +529,10 @@ class MessageLookup extends MessageLookupByLibrary { "Bestätige deinen Wiederherstellungsschlüssel"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Mit Gerät verbinden"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Support kontaktieren"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Kontakte"), "contents": MessageLookupByLibrary.simpleMessage("Inhalte"), "continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"), @@ -578,7 +578,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Aktuell genutzt werden "), "custom": MessageLookupByLibrary.simpleMessage("Benutzerdefiniert"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Dunkel"), "dayToday": MessageLookupByLibrary.simpleMessage("Heute"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gestern"), @@ -614,11 +614,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Von Ente löschen"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Standort löschen"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Es fehlt eine zentrale Funktion, die ich benötige"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -657,7 +657,7 @@ class MessageLookup extends MessageLookupByLibrary { "Zuschauer können weiterhin Screenshots oder mit anderen externen Programmen Kopien der Bilder machen."), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Bitte beachten Sie:"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) deaktivieren"), "disablingTwofactorAuthentication": @@ -680,9 +680,9 @@ class MessageLookup extends MessageLookupByLibrary { "Herunterladen fehlgeschlagen"), "downloading": MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"), "editLocation": MessageLookupByLibrary.simpleMessage("Standort bearbeiten"), @@ -695,8 +695,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("zulässig"), "email": MessageLookupByLibrary.simpleMessage("E-Mail"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -806,8 +806,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dateien gelöscht"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -823,27 +823,27 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gesichter gefunden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Kostenlos hinzugefügter Speicherplatz"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Freier Speicherplatz nutzbar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Kostenlose Testphase"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Gerätespeicher freiräumen"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Spare Speicherplatz auf deinem Gerät, indem du Dateien löschst, die bereits gesichert wurden."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Speicherplatz freigeben"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Bis zu 1000 Erinnerungsstücke angezeigt in der Galerie"), "general": MessageLookupByLibrary.simpleMessage("Allgemein"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generierung von Verschlüsselungscodes..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Zu den Einstellungen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -923,7 +923,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"), @@ -952,7 +952,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Geräte-Limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiviert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Abgelaufen"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Ablaufdatum des Links"), "linkHasExpired": @@ -1030,7 +1030,7 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Karten"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), "mlConsent": MessageLookupByLibrary.simpleMessage( "Maschinelles Lernen aktivieren"), @@ -1053,12 +1053,12 @@ class MessageLookup extends MessageLookupByLibrary { "moments": MessageLookupByLibrary.simpleMessage("Momente"), "monthly": MessageLookupByLibrary.simpleMessage("Monatlich"), "moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Zum Album verschieben"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Zu verstecktem Album verschieben"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage( "In den Papierkorb verschoben"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1106,7 +1106,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Keine Systemsperre gefunden"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Noch nichts mit Dir geteilt"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1117,7 +1117,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"), "onEnte": MessageLookupByLibrary.simpleMessage( "Auf ente"), - "onlyFamilyAdminCanChangeCode": m38, + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Hoppla"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Hoppla, die Änderungen konnten nicht gespeichert werden"), @@ -1146,7 +1146,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Passwort erfolgreich geändert"), "passwordLock": MessageLookupByLibrary.simpleMessage("Passwort Sperre"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Die Berechnung der Stärke des Passworts basiert auf dessen Länge, den verwendeten Zeichen, und ob es in den 10.000 am häufigsten verwendeten Passwörtern vorkommt"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1157,7 +1157,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"), "pendingSync": @@ -1186,7 +1186,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Album auf dem Fernseher wiedergeben"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore Abo"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1198,14 +1198,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Bitte erteile die nötigen Berechtigungen"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Bitte wähle die zu entfernenden schnellen Links"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1241,7 +1241,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"), "rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"), "rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"), @@ -1278,7 +1278,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Gib diesen Code an deine Freunde"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Sie schließen ein bezahltes Abo ab"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Einlösungen sind derzeit pausiert"), @@ -1306,7 +1306,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"), "removePublicLink": @@ -1324,7 +1324,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement erneuern"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "resendEmail": @@ -1396,7 +1396,7 @@ class MessageLookup extends MessageLookupByLibrary { "Gruppiere Fotos, die innerhalb des Radius eines bestimmten Fotos aufgenommen wurden"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "selectALocation": MessageLookupByLibrary.simpleMessage("Standort auswählen"), @@ -1423,8 +1423,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Absenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"), "sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"), @@ -1452,10 +1452,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Teile mit ausgewählten Personen"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1721,8 +1721,6 @@ class MessageLookup extends MessageLookupByLibrary { "viewAllExifData": MessageLookupByLibrary.simpleMessage("Alle Exif-Daten anzeigen"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Große Dateien"), - "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Dateien anzeigen, die den meisten Speicherplatz belegen"), "viewLogs": MessageLookupByLibrary.simpleMessage("Protokolle anzeigen"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungsschlüssel anzeigen"), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart new file mode 100644 index 0000000000..79c0433b27 --- /dev/null +++ b/mobile/lib/generated/intl/messages_el.dart @@ -0,0 +1,28 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a el locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'el'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( + "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") + }; +} diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 1559ecc898..0c377470aa 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -20,151 +20,151 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'en'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Add item', other: 'Add items')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Your ${storageAmount} add-on is valid till ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; - static String m4(emailOrName) => "Added by ${emailOrName}"; + static String m7(emailOrName) => "Added by ${emailOrName}"; - static String m5(albumName) => "Added successfully to ${albumName}"; + static String m8(albumName) => "Added successfully to ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'No Participants', one: '1 Participant', other: '${count} Participants')}"; - static String m7(versionValue) => "Version: ${versionValue}"; + static String m10(versionValue) => "Version: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} free"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Please cancel your existing subscription from ${paymentProvider} first"; - static String m10(user) => + static String m13(user) => "${user} will not be able to add more photos to this album\n\nThey will still be able to remove existing photos added by them"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Your family has claimed ${storageAmountInGb} GB so far', 'false': 'You have claimed ${storageAmountInGb} GB so far', 'other': 'You have claimed ${storageAmountInGb} GB so far!', })}"; - static String m12(albumName) => "Collaborative link created for ${albumName}"; + static String m15(albumName) => "Collaborative link created for ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; - static String m14(provider) => + static String m17(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; - static String m15(endpoint) => "Connected to ${endpoint}"; + static String m18(endpoint) => "Connected to ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Deleting ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "This will remove the public link for accessing \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Please drop an email to ${supportEmail} from your registered email address"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} files, ${formattedSize} each"; - static String m22(newEmail) => "Email changed to ${newEmail}"; + static String m25(newEmail) => "Email changed to ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code"; - static String m27(endDate) => "Free trial valid till ${endDate}"; + static String m30(endDate) => "Free trial valid till ${endDate}"; - static String m28(count) => + static String m31(count) => "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; - static String m29(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'It can be deleted from the device to free up ${formattedSize}', other: 'They can be deleted from the device to free up ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Processing ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m33(expiryTime) => "Link will expire on ${expiryTime}"; + static String m36(expiryTime) => "Link will expire on ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'no memories', one: '${formattedCount} memory', other: '${formattedCount} memories')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Move item', other: 'Move items')}"; - static String m36(albumName) => "Moved successfully to ${albumName}"; + static String m38(albumName) => "Moved successfully to ${albumName}"; - static String m37(name) => "Not ${name}?"; + static String m39(name) => "Not ${name}?"; - static String m38(familyAdminEmail) => + static String m40(familyAdminEmail) => "Please contact ${familyAdminEmail} to change your code."; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Please talk to ${providerName} support if you were charged"; - static String m41(endDate) => + static String m43(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m42(toEmail) => "Please email us at ${toEmail}"; + static String m44(toEmail) => "Please email us at ${toEmail}"; - static String m43(toEmail) => "Please send the logs to \n${toEmail}"; + static String m45(toEmail) => "Please send the logs to \n${toEmail}"; - static String m44(storeName) => "Rate us on ${storeName}"; + static String m46(storeName) => "Rate us on ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album"; - static String m47(endDate) => "Subscription renews on ${endDate}"; + static String m49(endDate) => "Subscription renews on ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} result found', other: '${count} results found')}"; - static String m49(count) => "${count} selected"; + static String m1(count) => "${count} selected"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} selected (${yourCount} yours)"; - static String m51(verificationID) => + static String m52(verificationID) => "Here\'s my verification ID: ${verificationID} for ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -234,17 +234,17 @@ class MessageLookup extends MessageLookupByLibrary { "addANewEmail": MessageLookupByLibrary.simpleMessage("Add a new email"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Add collaborator"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Add from device"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Add location"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Add"), "addMore": MessageLookupByLibrary.simpleMessage("Add more"), "addNew": MessageLookupByLibrary.simpleMessage("Add new"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Details of add-ons"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Add-ons"), "addPhotos": MessageLookupByLibrary.simpleMessage("Add photos"), "addSelected": MessageLookupByLibrary.simpleMessage("Add selected"), @@ -253,12 +253,12 @@ class MessageLookup extends MessageLookupByLibrary { "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Add to hidden album"), "addViewer": MessageLookupByLibrary.simpleMessage("Add viewer"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Add your photos now"), "addedAs": MessageLookupByLibrary.simpleMessage("Added as"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Adding to favorites..."), "advanced": MessageLookupByLibrary.simpleMessage("Advanced"), @@ -269,7 +269,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("After 1 week"), "after1Year": MessageLookupByLibrary.simpleMessage("After 1 year"), "albumOwner": MessageLookupByLibrary.simpleMessage("Owner"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Album title"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album updated"), "albums": MessageLookupByLibrary.simpleMessage("Albums"), @@ -306,7 +306,7 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("App lock"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Apply"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Apply code"), @@ -381,7 +381,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Auto pair works only with devices that support Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Available"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Backed up folders"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -405,10 +405,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Can only remove files owned by you"), "cancel": MessageLookupByLibrary.simpleMessage("Cancel"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancel subscription"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage("Cannot delete shared files"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -454,7 +454,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Claim free storage"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim more!"), "claimed": MessageLookupByLibrary.simpleMessage("Claimed"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Clean Uncategorized"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -483,7 +483,7 @@ class MessageLookup extends MessageLookupByLibrary { "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Collaborative link"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Collaborator"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -512,10 +512,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Confirm your recovery key"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contact support"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contents"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continue"), @@ -559,7 +559,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Current usage is "), "custom": MessageLookupByLibrary.simpleMessage("Custom"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Dark"), "dayToday": MessageLookupByLibrary.simpleMessage("Today"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Yesterday"), @@ -594,11 +594,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "It’s missing a key feature that I need"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -638,7 +638,7 @@ class MessageLookup extends MessageLookupByLibrary { "Viewers can still take screenshots or save a copy of your photos using external tools"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Please note"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Disable two-factor"), "disablingTwofactorAuthentication": @@ -659,9 +659,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download failed"), "downloading": MessageLookupByLibrary.simpleMessage("Downloading..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -672,8 +672,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("eligible"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Email verification"), "emailYourLogs": @@ -779,8 +779,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("File types and names"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Files saved to gallery"), @@ -794,25 +794,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Free storage claimed"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Free storage usable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Free up device space"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Save space on your device by clearing files that have been already backed up."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Free up space"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Up to 1000 memories shown in gallery"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generating encryption keys..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Go to settings"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -886,7 +886,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Items show the number of days remaining before permanent deletion"), @@ -912,7 +912,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Device limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Enabled"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expired"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Link expiry"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link has expired"), @@ -989,7 +989,7 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Maps"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), "mlConsent": MessageLookupByLibrary.simpleMessage("Enable machine learning"), @@ -1012,11 +1012,11 @@ class MessageLookup extends MessageLookupByLibrary { "moments": MessageLookupByLibrary.simpleMessage("Moments"), "monthly": MessageLookupByLibrary.simpleMessage("Monthly"), "moreDetails": MessageLookupByLibrary.simpleMessage("More details"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Move to album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Moved to trash"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), @@ -1062,7 +1062,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("No results found"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("No system lock found"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nothing shared with you yet"), "nothingToSeeHere": @@ -1072,7 +1072,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), - "onlyFamilyAdminCanChangeCode": m38, + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("Oops, could not save edits"), @@ -1100,7 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Password changed successfully"), "passwordLock": MessageLookupByLibrary.simpleMessage("Password lock"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1110,7 +1110,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Payment failed"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Unfortunately your payment failed. Please contact support and we\'ll help you out!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Pending items"), "pendingSync": MessageLookupByLibrary.simpleMessage("Pending sync"), "people": MessageLookupByLibrary.simpleMessage("People"), @@ -1136,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("Pin album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Play album on TV"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore subscription"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1148,14 +1148,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Please contact support if the problem persists"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Please grant permissions"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Please login again"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Please try again"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1190,7 +1190,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Raise ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Rate the app"), "rateUs": MessageLookupByLibrary.simpleMessage("Rate us"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Recover"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), @@ -1224,7 +1224,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Give this code to your friends"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. They sign up for a paid plan"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), @@ -1250,7 +1250,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remove link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remove participant"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1268,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rename file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renew subscription"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Report a bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Report bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Resend email"), @@ -1336,7 +1336,7 @@ class MessageLookup extends MessageLookupByLibrary { "Group photos that are taken within some radius of a photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invite people, and you\'ll see all photos shared by them here"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Security"), "selectALocation": MessageLookupByLibrary.simpleMessage("Select a location"), @@ -1363,8 +1363,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Selected items will be deleted from all albums and moved to trash."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Send"), "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), @@ -1391,10 +1391,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Share an album now"), "shareLink": MessageLookupByLibrary.simpleMessage("Share link"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Share only with the people you want"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), "shareTextReferralCode": m53, diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index f057cefd5f..479c1538a0 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'es'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: 'Añadir colaborador', one: 'Añadir colaborador', other: 'Añadir colaboradores')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Agregar elemento', other: 'Agregar elementos')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Tu ${storageAmount} adicional es válido hasta ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, zero: 'Añadir espectador', one: 'Añadir espectador', other: 'Añadir espectadores')}"; - static String m4(emailOrName) => "Añadido por ${emailOrName}"; + static String m7(emailOrName) => "Añadido por ${emailOrName}"; - static String m5(albumName) => "Añadido exitosamente a ${albumName}"; + static String m8(albumName) => "Añadido exitosamente a ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'No hay Participantes', one: '1 Participante', other: '${count} Participantes')}"; - static String m7(versionValue) => "Versión: ${versionValue}"; + static String m10(versionValue) => "Versión: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} gratis"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Por favor, cancela primero tu suscripción existente de ${paymentProvider}"; - static String m10(user) => + static String m13(user) => "${user} no podrá añadir más fotos a este álbum\n\nTodavía podrán eliminar las fotos ya añadidas por ellos"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Tu familia ha reclamado ${storageAmountInGb} GB hasta el momento', @@ -60,111 +60,113 @@ class MessageLookup extends MessageLookupByLibrary { '¡Tú has reclamado ${storageAmountInGb} GB hasta el momento!', })}"; - static String m12(albumName) => + static String m15(albumName) => "Enlace colaborativo creado para ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Por favor contacta con ${familyAdminEmail} para administrar tu suscripción"; - static String m14(provider) => + static String m17(provider) => "Por favor, contáctanos en support@ente.io para gestionar tu suscripción a ${provider}."; - static String m15(endpoint) => "Conectado a ${endpoint}"; + static String m18(endpoint) => "Conectado a ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementos')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Borrando ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Esto eliminará el enlace público para acceder a \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Por favor, envía un correo electrónico a ${supportEmail} desde tu dirección de correo electrónico registrada"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} archivos, ${formattedSize} cada uno"; - static String m22(newEmail) => "Correo cambiado a ${newEmail}"; + static String m25(newEmail) => "Correo cambiado a ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} no tiene una cuente en Ente.\n\nEnvíale una invitación para compartir fotos."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este dispositivo han sido respaldados de forma segura"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este álbum ha sido respaldado de forma segura"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código"; - static String m27(endDate) => "Prueba gratuita válida hasta ${endDate}"; + static String m30(endDate) => "Prueba gratuita válida hasta ${endDate}"; - static String m28(count) => + static String m31(count) => "Aún puedes acceder ${Intl.plural(count, one: 'a él', other: 'a ellos')} en Ente mientras tengas una suscripción activa"; - static String m29(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Se puede eliminar del dispositivo para liberar ${formattedSize}', other: 'Se pueden eliminar del dispositivo para liberar ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Procesando ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementos')}"; - static String m33(expiryTime) => "El enlace caducará en ${expiryTime}"; + static String m36(expiryTime) => "El enlace caducará en ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'sin recuerdos', one: '${formattedCount} recuerdo', other: '${formattedCount} recuerdos')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Mover elemento', other: 'Mover elementos')}"; - static String m36(albumName) => "Movido exitosamente a ${albumName}"; + static String m38(albumName) => "Movido exitosamente a ${albumName}"; - static String m39(passwordStrengthValue) => - "Seguridad de la contraseña : ${passwordStrengthValue}"; + static String m39(name) => "¿No es ${name}?"; - static String m40(providerName) => + static String m41(passwordStrengthValue) => + "Seguridad de la contraseña: ${passwordStrengthValue}"; + + static String m42(providerName) => "Por favor, habla con el soporte de ${providerName} si se te cobró"; - static String m41(endDate) => + static String m43(endDate) => "Prueba gratuita válida hasta ${endDate}.\nPuedes elegir un plan de pago después."; - static String m42(toEmail) => + static String m44(toEmail) => "Por favor, envíanos un correo electrónico a ${toEmail}"; - static String m43(toEmail) => "Por favor, envía los registros a ${toEmail}"; + static String m45(toEmail) => "Por favor, envía los registros a ${toEmail}"; - static String m44(storeName) => "Califícanos en ${storeName}"; + static String m46(storeName) => "Califícanos en ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Ambos obtienen ${storageInGB} GB* gratis"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} será eliminado de este álbum compartido\n\nCualquier foto añadida por ellos también será eliminada del álbum"; - static String m47(endDate) => "La suscripción se renueva el ${endDate}"; + static String m49(endDate) => "La suscripción se renueva el ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultados encontrados')}"; - static String m49(count) => "${count} seleccionados"; + static String m1(count) => "${count} seleccionados"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} seleccionados (${yourCount} tuyos)"; - static String m51(verificationID) => + static String m52(verificationID) => "Aquí está mi ID de verificación: ${verificationID} para ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hola, ¿puedes confirmar que esta es tu ID de verificación ente.io: ${verificationID}?"; static String m53(referralCode, referralStorageInGB) => @@ -234,10 +236,10 @@ class MessageLookup extends MessageLookupByLibrary { "Agregar nuevo correo electrónico"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Agregar colaborador"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage( "Agregar desde el dispositivo"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Agregar ubicación"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Añadir"), @@ -245,7 +247,7 @@ class MessageLookup extends MessageLookupByLibrary { "addNew": MessageLookupByLibrary.simpleMessage("Añadir nuevo"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Detalles de los complementos"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Complementos"), "addPhotos": MessageLookupByLibrary.simpleMessage("Agregar fotos"), "addSelected": @@ -255,12 +257,12 @@ class MessageLookup extends MessageLookupByLibrary { "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Añadir al álbum oculto"), "addViewer": MessageLookupByLibrary.simpleMessage("Añadir espectador"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Añade tus fotos ahora"), "addedAs": MessageLookupByLibrary.simpleMessage("Agregado como"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Añadiendo a favoritos..."), "advanced": MessageLookupByLibrary.simpleMessage("Avanzado"), @@ -273,7 +275,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Después de una semana"), "after1Year": MessageLookupByLibrary.simpleMessage("Después de un año"), "albumOwner": MessageLookupByLibrary.simpleMessage("Propietario"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Título del álbum"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Álbum actualizado"), @@ -310,10 +312,8 @@ class MessageLookup extends MessageLookupByLibrary { "Android, iOS, Web, Computadora"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autentificación requerida"), - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appLock": MessageLookupByLibrary.simpleMessage("Aplicación bloqueada"), + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("ID de Apple"), "apply": MessageLookupByLibrary.simpleMessage("Aplicar"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Usar código"), @@ -358,8 +358,6 @@ class MessageLookup extends MessageLookupByLibrary { "Por favor, autentícate para configurar la autenticación de dos factores"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Por favor, autentícate para iniciar la eliminación de la cuenta"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Por favor, autentícate para ver tus sesiones activas"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -379,9 +377,9 @@ class MessageLookup extends MessageLookupByLibrary { "Aquí verás los dispositivos de transmisión disponibles."), "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( "Asegúrate de que los permisos de la red local están activados para la aplicación Ente Fotos, en Configuración."), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), + "autoLock": MessageLookupByLibrary.simpleMessage("Autobloqueo"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), + "Tiempo después de que la aplicación esté en segundo plano"), "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( "Debido a un fallo técnico, has sido desconectado. Nuestras disculpas por las molestias."), "autoPair": @@ -389,7 +387,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "El emparejamiento automático funciona sólo con dispositivos compatibles con Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponible"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Carpetas respaldadas"), "backup": MessageLookupByLibrary.simpleMessage("Copia de respaldo"), @@ -416,10 +414,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Sólo puede eliminar archivos de tu propiedad"), "cancel": MessageLookupByLibrary.simpleMessage("Cancelar"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancelar suscripción"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "No se pueden eliminar los archivos compartidos"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -445,25 +443,11 @@ class MessageLookup extends MessageLookupByLibrary { "Revisa tu bandeja de entrada (y spam) para completar la verificación"), "checkStatus": MessageLookupByLibrary.simpleMessage("Comprobar estado"), "checking": MessageLookupByLibrary.simpleMessage("Comprobando..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Selecciona fotos y prueba la \"Vista de Invitado\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "¿Vas a mostrar fotos a un amigo? No te preocupes por si desliza demasiado. La vista de invitado bloqueará las fotos que selecciones."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Vista de Invitado"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Hemos añadido soporte para ver fotos panorámicas con vistas de 360 grados. ¡La experiencia es inmersiva con navegación basada en el movimiento!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visor Panorámico"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Presentamos un nuevo reproductor de video, con mejores controles de reproducción y soporte para videos HDR."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Reproductor de Video"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Reclamar almacenamiento gratis"), "claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"), "claimed": MessageLookupByLibrary.simpleMessage("Reclamado"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Limpiar no categorizado"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -490,7 +474,7 @@ class MessageLookup extends MessageLookupByLibrary { "Crea un enlace para permitir que otros pueda añadir y ver fotos en tu álbum compartido sin necesitar la aplicación Ente o una cuenta. Genial para recolectar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Enlace colaborativo"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -507,7 +491,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirm2FADisable": MessageLookupByLibrary.simpleMessage( "¿Estás seguro de que deseas deshabilitar la autenticación de doble factor?"), "confirmAccountDeletion": - MessageLookupByLibrary.simpleMessage("Corfirmar borrado de cuenta"), + MessageLookupByLibrary.simpleMessage("Confirmar borrado de cuenta"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos."), "confirmPassword": @@ -520,10 +504,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirma tu clave de recuperación"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar a dispositivo"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contactar con soporte"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contactos"), "contents": MessageLookupByLibrary.simpleMessage("Contenidos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -568,7 +552,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("El uso actual es de "), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Oscuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoy"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ayer"), @@ -604,12 +588,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eliminar del dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Eliminar de Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Borrar la ubicación"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Borrar las fotos"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Falta una característica clave que necesito"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -638,7 +622,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Introduce el código"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( "Los archivos añadidos a este álbum de dispositivo se subirán automáticamente a Ente."), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), + "deviceLock": + MessageLookupByLibrary.simpleMessage("Dispositivo Bloqueado"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( "Deshabilita el bloqueo de pantalla del dispositivo cuando Ente está en primer plano y haya una copia de seguridad en curso. Normalmente esto no es necesario, pero puede ayudar a que las grandes cargas y las importaciones iniciales de grandes bibliotecas se completen más rápido."), "deviceNotFound": @@ -650,7 +635,7 @@ class MessageLookup extends MessageLookupByLibrary { "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de tus fotos usando herramientas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Por favor, ten en cuenta"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"), "disablingTwofactorAuthentication": @@ -673,9 +658,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Descarga fallida"), "downloading": MessageLookupByLibrary.simpleMessage("Descargando..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), @@ -688,8 +673,8 @@ class MessageLookup extends MessageLookupByLibrary { "Las ediciones a la ubicación sólo se verán dentro de Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegible"), "email": MessageLookupByLibrary.simpleMessage("Correo electrónico"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Verificación por correo electrónico"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -736,7 +721,8 @@ class MessageLookup extends MessageLookupByLibrary { "Introduce una contraseña que podamos usar para cifrar tus datos"), "enterPersonName": MessageLookupByLibrary.simpleMessage( "Ingresar el nombre de una persona"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), + "enterPin": + MessageLookupByLibrary.simpleMessage("Ingresa tu contraseña"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( "Ingresar código de referencia"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -799,8 +785,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de archivos"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de archivo y nombres"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Archivos eliminados"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -815,25 +801,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Caras encontradas"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Almacenamiento gratuito reclamado"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Almacenamiento libre disponible"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Liberar espacio del dispositivo"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Ahorra espacio en tu dispositivo limpiando archivos que ya han sido respaldados."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Liberar espacio"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Hasta 1000 memorias mostradas en la galería"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generando claves de encriptación..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Ir a Ajustes"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID de Google Play"), @@ -843,9 +829,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conceder permiso"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Agrupar fotos cercanas"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Vista de invitado"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "No rastreamos las aplicaciones instaladas. ¡Nos ayudarías si nos dijeras dónde nos encontraste!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -853,11 +839,12 @@ class MessageLookup extends MessageLookupByLibrary { "help": MessageLookupByLibrary.simpleMessage("Ayuda"), "hidden": MessageLookupByLibrary.simpleMessage("Oculto"), "hide": MessageLookupByLibrary.simpleMessage("Ocultar"), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), + "hideContent": + MessageLookupByLibrary.simpleMessage("Ocultar contenido"), "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), + "Oculta el contenido de la aplicación en el selector de aplicaciones y desactivar capturas de pantalla"), "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), + "Ocultar el contenido de la aplicación en el selector de aplicaciones"), "hiding": MessageLookupByLibrary.simpleMessage("Ocultando..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("Alojado en OSM France"), @@ -872,7 +859,7 @@ class MessageLookup extends MessageLookupByLibrary { "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Algunos archivos de este álbum son ignorados de la carga porque previamente habían sido borrados de Ente."), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), + "immediately": MessageLookupByLibrary.simpleMessage("Inmediatamente"), "importing": MessageLookupByLibrary.simpleMessage("Importando...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Código incorrecto"), @@ -910,7 +897,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Los artículos muestran el número de días restantes antes de ser borrados permanente"), @@ -940,7 +927,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Límite del dispositivo"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Vencido"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Enlace vence"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("El enlace ha caducado"), @@ -1022,10 +1009,8 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Mapas"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Mercancías"), - "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Por favor, ten en cuenta que el aprendizaje automático resultará en un mayor ancho de banda y uso de batería hasta que todos los elementos sean indexados."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Celular, Web, Computadora"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderada"), @@ -1034,11 +1019,11 @@ class MessageLookup extends MessageLookupByLibrary { "Modifica tu consulta o intenta buscar"), "moments": MessageLookupByLibrary.simpleMessage("Momentos"), "monthly": MessageLookupByLibrary.simpleMessage("Mensual"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum oculto"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Movido a la papelera"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1052,7 +1037,7 @@ class MessageLookup extends MessageLookupByLibrary { "newAlbum": MessageLookupByLibrary.simpleMessage("Nuevo álbum"), "newToEnte": MessageLookupByLibrary.simpleMessage("Nuevo en Ente"), "newest": MessageLookupByLibrary.simpleMessage("Más reciente"), - "next": MessageLookupByLibrary.simpleMessage("Next"), + "next": MessageLookupByLibrary.simpleMessage("Siguiente"), "no": MessageLookupByLibrary.simpleMessage("No"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Aún no has compartido ningún álbum"), @@ -1075,8 +1060,8 @@ class MessageLookup extends MessageLookupByLibrary { "No se están respaldando fotos ahora mismo"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage( "No se encontró ninguna foto aquí"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "No se han seleccionado enlaces rápidos"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("¿Sin clave de recuperación?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1084,8 +1069,9 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Sin resultados"), "noResultsFound": MessageLookupByLibrary.simpleMessage( "No se han encontrado resultados"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), + "noSystemLockFound": MessageLookupByLibrary.simpleMessage( + "Bloqueo de sistema no encontrado"), + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Aún no hay nada compartido contigo"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1114,6 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Emparejar con PIN"), "pairingComplete": MessageLookupByLibrary.simpleMessage("Emparejamiento completo"), + "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "La verificación aún está pendiente"), "passkey": MessageLookupByLibrary.simpleMessage("Clave de acceso"), @@ -1124,9 +1111,9 @@ class MessageLookup extends MessageLookupByLibrary { "Contraseña cambiada correctamente"), "passwordLock": MessageLookupByLibrary.simpleMessage("Bloqueo por contraseña"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), + "La intensidad de la contraseña se calcula teniendo en cuenta la longitud de la contraseña, los caracteres utilizados, y si la contraseña aparece o no en el top 10,000 de contraseñas más usadas"), "passwordWarning": MessageLookupByLibrary.simpleMessage( "No almacenamos esta contraseña, así que si la olvidas, no podemos descifrar tus datos"), "paymentDetails": @@ -1134,7 +1121,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Pago fallido"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Lamentablemente tu pago falló. Por favor, ¡contacta con el soporte técnico y te ayudaremos!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementos pendientes"), "pendingSync": @@ -1160,10 +1147,10 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Elegir punto central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fijar álbum"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), + "pinLock": MessageLookupByLibrary.simpleMessage("PIN Bloqueado"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproducir álbum en TV"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Suscripción en la PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1175,14 +1162,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contacta a soporte técnico si el problema persiste"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Por favor, concede permiso"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, vuelve a iniciar sesión"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "Por favor, selecciona enlaces rápidos para eliminar"), + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inténtalo nuevamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1219,7 +1206,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Evalúa la aplicación"), "rateUs": MessageLookupByLibrary.simpleMessage("Califícanos"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar cuenta"), @@ -1246,15 +1233,15 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recrear contraseña"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), + MessageLookupByLibrary.simpleMessage("Rescribe tu contraseña"), + "reenterPin": MessageLookupByLibrary.simpleMessage("Rescribe tu PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Refiere a amigos y 2x su plan"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Dale este código a tus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Se inscriben a un plan pagado"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Referidos"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Las referencias están actualmente en pausa"), @@ -1277,17 +1264,17 @@ class MessageLookup extends MessageLookupByLibrary { "removeFromAlbumTitle": MessageLookupByLibrary.simpleMessage("¿Eliminar del álbum?"), "removeFromFavorite": - MessageLookupByLibrary.simpleMessage("Quitar de favoritos"), + MessageLookupByLibrary.simpleMessage("Remover desde favoritos"), "removeLink": MessageLookupByLibrary.simpleMessage("Eliminar enlace"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Quitar participante"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Eliminar etiqueta de persona"), "removePublicLink": MessageLookupByLibrary.simpleMessage("Quitar enlace público"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Eliminar enlaces públicos"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Algunos de los elementos que estás eliminando fueron añadidos por otras personas, y perderás el acceso a ellos"), "removeWithQuestionMark": @@ -1299,7 +1286,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renombrar archivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar suscripción"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar un error"), "reportBug": MessageLookupByLibrary.simpleMessage("Reportar error"), "resendEmail": @@ -1370,7 +1357,7 @@ class MessageLookup extends MessageLookupByLibrary { "Agrupar las fotos que se tomaron cerca de la localización de una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita a gente y verás todas las fotos compartidas aquí"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleccionar una ubicación"), @@ -1399,8 +1386,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar correo electrónico"), @@ -1416,8 +1403,9 @@ class MessageLookup extends MessageLookupByLibrary { "setCover": MessageLookupByLibrary.simpleMessage("Definir portada"), "setLabel": MessageLookupByLibrary.simpleMessage("Establecer"), "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), + MessageLookupByLibrary.simpleMessage("Ingresa tu nueva contraseña"), + "setNewPin": + MessageLookupByLibrary.simpleMessage("Ingresa tu nuevo PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Establecer contraseña"), "setRadius": MessageLookupByLibrary.simpleMessage("Establecer radio"), @@ -1431,10 +1419,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartir un álbum ahora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartir enlace"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Comparte sólo con la gente que quieres"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Descarga Ente para que podamos compartir fácilmente fotos y videos en calidad original.\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1548,7 +1536,8 @@ class MessageLookup extends MessageLookupByLibrary { "tapToCopy": MessageLookupByLibrary.simpleMessage("toca para copiar"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage( "Toca para introducir el código"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), + "tapToUnlock": + MessageLookupByLibrary.simpleMessage("Toca para desbloquear"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), "terminate": MessageLookupByLibrary.simpleMessage("Terminar"), @@ -1595,17 +1584,14 @@ class MessageLookup extends MessageLookupByLibrary { "¡Esto cerrará la sesión de este dispositivo!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), + "Esto eliminará los enlaces públicos de todos los enlaces rápidos seleccionados."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Para ocultar una foto o video"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Para restablecer tu contraseña, por favor verifica tu correo electrónico primero."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Registros de hoy"), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), + "tooManyIncorrectAttempts": MessageLookupByLibrary.simpleMessage( + "Demasiados intentos incorrectos"), "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamaño total"), "trash": MessageLookupByLibrary.simpleMessage("Papelera"), @@ -1656,6 +1642,8 @@ class MessageLookup extends MessageLookupByLibrary { "Hasta el 50% de descuento, hasta el 4 de diciembre."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "El almacenamiento utilizable está limitado por tu plan actual. El exceso de almacenamiento reclamado se volverá automáticamente utilizable cuando actualices tu plan."), + "useAsCover": + MessageLookupByLibrary.simpleMessage("Usar como cubierta"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( "Usar enlaces públicos para personas que no están en Ente"), @@ -1682,6 +1670,8 @@ class MessageLookup extends MessageLookupByLibrary { "verifying": MessageLookupByLibrary.simpleMessage("Verificando..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Verificando clave de recuperación..."), + "videoInfo": + MessageLookupByLibrary.simpleMessage("Información de video"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("vídeo"), "videos": MessageLookupByLibrary.simpleMessage("Vídeos"), "viewActiveSessions": @@ -1693,8 +1683,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ver todos los datos EXIF"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Archivos grandes"), - "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Ver archivos que consumen la mayor cantidad de almacenamiento"), "viewLogs": MessageLookupByLibrary.simpleMessage("Ver Registros"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Ver código de recuperación"), diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart new file mode 100644 index 0000000000..c1b8a2ba7e --- /dev/null +++ b/mobile/lib/generated/intl/messages_et.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a et locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'et'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart new file mode 100644 index 0000000000..b6650a943a --- /dev/null +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -0,0 +1,441 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a fa locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'fa'; + + static String m10(versionValue) => "نسخه: ${versionValue}"; + + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} رایگان"; + + static String m22(supportEmail) => + "لطفا یک ایمیل از آدرس ایمیلی که ثبت نام کردید به ${supportEmail} ارسال کنید"; + + static String m41(passwordStrengthValue) => + "قدرت رمز عبور: ${passwordStrengthValue}"; + + static String m46(storeName) => "به ما در ${storeName} امتیاز دهید"; + + static String m60( + usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => + "${usedAmount} ${usedStorageUnit} از ${totalAmount} ${totalStorageUnit} استفاده شده"; + + static String m68(email) => "تایید ${email}"; + + static String m69(email) => + "ما یک ایمیل به ${email} ارسال کرده‌ایم"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( + "نسخه جدید Ente در دسترس است."), + "about": MessageLookupByLibrary.simpleMessage("درباره ما"), + "account": MessageLookupByLibrary.simpleMessage("حساب کاربری"), + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("خوش آمدید!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "من درک می‌کنم که اگر رمز عبور خود را گم کنم، ممکن است اطلاعات خود را از دست بدهم، زیرا اطلاعات من رمزگذاری سرتاسر شده است."), + "activeSessions": + MessageLookupByLibrary.simpleMessage("دستگاه‌های فعال"), + "addANewEmail": + MessageLookupByLibrary.simpleMessage("افزودن ایمیل جدید"), + "addCollaborator": MessageLookupByLibrary.simpleMessage("افزودن همکار"), + "addMore": MessageLookupByLibrary.simpleMessage("افزودن بیشتر"), + "addViewer": MessageLookupByLibrary.simpleMessage("افزودن بیننده"), + "addedAs": MessageLookupByLibrary.simpleMessage("اضافه شده به عنوان"), + "advanced": MessageLookupByLibrary.simpleMessage("پیشرفته"), + "albumUpdated": MessageLookupByLibrary.simpleMessage("آلبوم به‌روز شد"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "به افراد که این پیوند را دارند، اجازه دهید عکس‌ها را به آلبوم اشتراک گذاری شده اضافه کنند."), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("اجازه اضافه کردن عکس"), + "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( + "به افراد اجازه دهید عکس اضافه کنند"), + "androidBiometricHint": + MessageLookupByLibrary.simpleMessage("تایید هویت"), + "androidBiometricSuccess": + MessageLookupByLibrary.simpleMessage("موفقیت"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("لغو"), + "androidIosWebDesktop": MessageLookupByLibrary.simpleMessage( + "اندروید، آی‌اواس، وب، رایانه رومیزی"), + "appVersion": m10, + "archive": MessageLookupByLibrary.simpleMessage("بایگانی"), + "areYouSureYouWantToLogout": MessageLookupByLibrary.simpleMessage( + "آیا برای خارج شدن مطمئن هستید؟"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "دلیل اصلی که حساب کاربری‌تان را حذف می‌کنید، چیست؟"), + "atAFalloutShelter": + MessageLookupByLibrary.simpleMessage("در یک پناهگاه ذخیره می‌شود"), + "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( + "لطفاً برای مشاهده دستگاه‌های فعال خود احراز هویت کنید"), + "available": MessageLookupByLibrary.simpleMessage("در دسترس"), + "availableStorageSpace": m11, + "backedUpFolders": + MessageLookupByLibrary.simpleMessage("پوشه‌های پشتیبان گیری شده"), + "backup": MessageLookupByLibrary.simpleMessage("پشتیبان گیری"), + "blog": MessageLookupByLibrary.simpleMessage("وبلاگ"), + "cancel": MessageLookupByLibrary.simpleMessage("لغو"), + "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( + "پرونده‌های به اشتراک گذاشته شده را نمی‌توان حذف کرد"), + "changeEmail": MessageLookupByLibrary.simpleMessage("تغییر ایمیل"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("تغییر رمز عبور"), + "checkForUpdates": + MessageLookupByLibrary.simpleMessage("بررسی برای به‌روزرسانی"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "لطفا صندوق ورودی (و هرزنامه) خود را برای تایید کامل بررسی کنید"), + "checkStatus": MessageLookupByLibrary.simpleMessage("بررسی وضعیت"), + "checking": MessageLookupByLibrary.simpleMessage("در حال بررسی..."), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "پیوندی ایجاد کنید تا به افراد اجازه دهید بدون نیاز به برنامه یا حساب کاربری Ente عکس‌ها را در آلبوم اشتراک گذاشته شده شما اضافه و مشاهده کنند. برای جمع‌آوری عکس‌های رویداد عالی است."), + "collaborator": MessageLookupByLibrary.simpleMessage("همکار"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "همکاران می‌توانند عکس‌ها و ویدیوها را به آلبوم اشتراک گذاری شده اضافه کنند."), + "color": MessageLookupByLibrary.simpleMessage("رنگ"), + "confirm": MessageLookupByLibrary.simpleMessage("تایید"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("تایید حذف حساب کاربری"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "بله، من می‌خواهم برای همیشه این حساب کاربری و تمام اطلاعات آن را حذف کنم."), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), + "confirmRecoveryKey": + MessageLookupByLibrary.simpleMessage("تایید کلید بازیابی"), + "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "کلید بازیابی خود را تایید کنید"), + "contactSupport": + MessageLookupByLibrary.simpleMessage("ارتباط با پشتیبانی"), + "continueLabel": MessageLookupByLibrary.simpleMessage("ادامه"), + "convertToAlbum": + MessageLookupByLibrary.simpleMessage("تبدیل به آلبوم"), + "createAccount": + MessageLookupByLibrary.simpleMessage("ایجاد حساب کاربری"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("ایجاد حساب کاربری جدید"), + "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( + "به‌روزرسانی حیاتی در دسترس است"), + "custom": MessageLookupByLibrary.simpleMessage("سفارشی"), + "darkTheme": MessageLookupByLibrary.simpleMessage("تیره"), + "dayToday": MessageLookupByLibrary.simpleMessage("امروز"), + "dayYesterday": MessageLookupByLibrary.simpleMessage("دیروز"), + "decrypting": + MessageLookupByLibrary.simpleMessage("در حال رمزگشایی..."), + "deleteAccount": + MessageLookupByLibrary.simpleMessage("حذف حساب کاربری"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "ما متاسفیم که می‌بینیم شما می‌روید. لطفا نظرات خود را برای کمک به بهبود ما به اشتراک بگذارید."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("حذف دائمی حساب کاربری"), + "deleteAll": MessageLookupByLibrary.simpleMessage("حذف همه"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "لطفا یک ایمیل به account-deletion@ente.io از آدرس ایمیل ثبت شده خود ارسال کنید."), + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "یک ویژگی کلیدی که به آن نیاز دارم، وجود ندارد"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "برنامه یا یک ویژگی خاص آنطور که من فکر می‌کنم، عمل نمی‌کند"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "سرویس دیگری پیدا کردم که بهتر می‌پسندم"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("دلیل من ذکر نشده است"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "درخواست شما ظرف مدت ۷۲ ساعت پردازش خواهد شد."), + "designedToOutlive": MessageLookupByLibrary.simpleMessage( + "طراحی شده تا بیشتر زنده بماند"), + "details": MessageLookupByLibrary.simpleMessage("جزئیات"), + "developerSettings": + MessageLookupByLibrary.simpleMessage("تنظیمات توسعه‌دهنده"), + "didYouKnow": MessageLookupByLibrary.simpleMessage("آیا می‌دانستید؟"), + "discord": MessageLookupByLibrary.simpleMessage("دیسکورد"), + "doThisLater": MessageLookupByLibrary.simpleMessage("بعداً انجام شود"), + "downloading": MessageLookupByLibrary.simpleMessage("در حال دانلود..."), + "dropSupportEmail": m22, + "editLocationTagTitle": + MessageLookupByLibrary.simpleMessage("ویرایش مکان"), + "email": MessageLookupByLibrary.simpleMessage("ایمیل"), + "encryption": MessageLookupByLibrary.simpleMessage("رمزگذاری"), + "encryptionKeys": + MessageLookupByLibrary.simpleMessage("کلیدهای رمزنگاری"), + "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( + "به صورت پیش‌فرض رمزگذاری سرتاسر"), + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": + MessageLookupByLibrary.simpleMessage( + "Ente فقط در صورتی می‌تواند پرونده‌ها را رمزگذاری و نگه‌داری کند که به آن‌ها دسترسی داشته باشید"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente برای نگه‌داری عکس‌های شما به دسترسی نیاز دارد"), + "enterEmail": + MessageLookupByLibrary.simpleMessage("ایمیل را وارد کنید"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "رمز عبور جدیدی را وارد کنید که بتوانیم از آن برای رمزگذاری اطلاعات شما استفاده کنیم"), + "enterPassword": + MessageLookupByLibrary.simpleMessage("رمز عبور را وارد کنید"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "رمز عبوری را وارد کنید که بتوانیم از آن برای رمزگذاری اطلاعات شما استفاده کنیم"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "لطفا یک ایمیل معتبر وارد کنید."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("آدرس ایمیل خود را وارد کنید"), + "enterYourPassword": + MessageLookupByLibrary.simpleMessage("رمز عبور خود را وارد کنید"), + "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "کلید بازیابی خود را وارد کنید"), + "error": MessageLookupByLibrary.simpleMessage("خطا"), + "everywhere": MessageLookupByLibrary.simpleMessage("همه جا"), + "existingUser": MessageLookupByLibrary.simpleMessage("کاربر موجود"), + "familyPlanPortalTitle": + MessageLookupByLibrary.simpleMessage("خانوادگی"), + "familyPlans": + MessageLookupByLibrary.simpleMessage("برنامه‌های خانوادگی"), + "faq": MessageLookupByLibrary.simpleMessage("سوالات متداول"), + "feedback": MessageLookupByLibrary.simpleMessage("بازخورد"), + "fileInfoAddDescHint": + MessageLookupByLibrary.simpleMessage("افزودن توضیحات..."), + "fileTypes": MessageLookupByLibrary.simpleMessage("انواع پرونده"), + "forYourMemories": + MessageLookupByLibrary.simpleMessage("برای خاطرات شما"), + "forgotPassword": + MessageLookupByLibrary.simpleMessage("رمز عبور را فراموش کرده‌اید"), + "general": MessageLookupByLibrary.simpleMessage("عمومی"), + "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( + "در حال تولید کلیدهای رمزگذاری..."), + "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( + "لطفا اجازه دسترسی به تمام عکس‌ها را در تنظیمات برنامه بدهید"), + "grantPermission": MessageLookupByLibrary.simpleMessage("دسترسی دادن"), + "hearUsExplanation": MessageLookupByLibrary.simpleMessage( + "ما نصب برنامه را ردیابی نمی‌کنیم. اگر بگویید کجا ما را پیدا کردید، به ما کمک می‌کند!"), + "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( + "از کجا در مورد Ente شنیدی؟ (اختیاری)"), + "howItWorks": MessageLookupByLibrary.simpleMessage("چگونه کار می‌کند"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("نادیده گرفتن"), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("رمز عبور درست نیست"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "کلید بازیابی که وارد کردید درست نیست"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("کلید بازیابی درست نیست"), + "insecureDevice": MessageLookupByLibrary.simpleMessage("دستگاه ناامن"), + "installManually": MessageLookupByLibrary.simpleMessage("نصب دستی"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("آدرس ایمیل معتبر نیست"), + "invalidKey": MessageLookupByLibrary.simpleMessage("کلید نامعتبر"), + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": + MessageLookupByLibrary.simpleMessage( + "به نظر می‌رسد مشکلی وجود دارد. لطفا بعد از مدتی دوباره تلاش کنید. اگر همچنان با خطا مواجه می‌شوید، لطفا با تیم پشتیبانی ما ارتباط برقرار کنید."), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "لطفا با این اطلاعات به ما کمک کنید"), + "lightTheme": MessageLookupByLibrary.simpleMessage("روشن"), + "loadMessage2": MessageLookupByLibrary.simpleMessage( + "ما تا کنون بیش از ۳۰ میلیون خاطره را حفظ کرده‌ایم"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("قفل"), + "logInLabel": MessageLookupByLibrary.simpleMessage("ورود"), + "loggingOut": MessageLookupByLibrary.simpleMessage("در حال خروج..."), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "با کلیک بر روی ورود به سیستم، من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم"), + "logout": MessageLookupByLibrary.simpleMessage("خروج"), + "manage": MessageLookupByLibrary.simpleMessage("مدیریت"), + "manageFamily": MessageLookupByLibrary.simpleMessage("مدیریت خانواده"), + "manageLink": MessageLookupByLibrary.simpleMessage("مدیریت پیوند"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("مدیریت"), + "manageSubscription": + MessageLookupByLibrary.simpleMessage("مدیریت اشتراک"), + "mastodon": MessageLookupByLibrary.simpleMessage("ماستودون"), + "matrix": MessageLookupByLibrary.simpleMessage("ماتریس"), + "merchandise": MessageLookupByLibrary.simpleMessage("کالا"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("متوسط"), + "never": MessageLookupByLibrary.simpleMessage("هرگز"), + "newToEnte": MessageLookupByLibrary.simpleMessage("کاربر جدید Ente"), + "no": MessageLookupByLibrary.simpleMessage("خیر"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("کلید بازیابی ندارید؟"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "با توجه به ماهیت پروتکل رمزگذاری سرتاسر ما، اطلاعات شما بدون رمز عبور یا کلید بازیابی شما قابل رمزگشایی نیست"), + "notifications": MessageLookupByLibrary.simpleMessage("آگاه‌سازی‌ها"), + "ok": MessageLookupByLibrary.simpleMessage("تایید"), + "oops": MessageLookupByLibrary.simpleMessage("اوه"), + "password": MessageLookupByLibrary.simpleMessage("رمز عبور"), + "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( + "رمز عبور با موفقیت تغییر کرد"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "ما این رمز عبور را ذخیره نمی‌کنیم، بنابراین اگر فراموش کنید، نمی‌توانیم اطلاعات شما را رمزگشایی کنیم"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("عکس"), + "pleaseGrantPermissions": + MessageLookupByLibrary.simpleMessage("لطفا دسترسی بدهید"), + "pleaseLoginAgain": + MessageLookupByLibrary.simpleMessage("لطفا دوباره وارد شوید"), + "pleaseTryAgain": + MessageLookupByLibrary.simpleMessage("لطفا دوباره تلاش کنید"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("لطفا صبر کنید..."), + "preparingLogs": + MessageLookupByLibrary.simpleMessage("در حال آماده‌سازی لاگ‌ها..."), + "privacy": MessageLookupByLibrary.simpleMessage("حریم خصوصی"), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("سیاست حفظ حریم خصوصی"), + "privateBackups": + MessageLookupByLibrary.simpleMessage("پشتیبان گیری خصوصی"), + "privateSharing": + MessageLookupByLibrary.simpleMessage("اشتراک گذاری خصوصی"), + "rateUsOnStore": m46, + "recover": MessageLookupByLibrary.simpleMessage("بازیابی"), + "recoverAccount": + MessageLookupByLibrary.simpleMessage("بازیابی حساب کاربری"), + "recoverButton": MessageLookupByLibrary.simpleMessage("بازیابی"), + "recoveryKey": MessageLookupByLibrary.simpleMessage("کلید بازیابی"), + "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "کلید بازیابی در کلیپ‌بورد کپی شد"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "اگر رمز عبور خود را فراموش کردید، تنها راهی که می‌توانید اطلاعات خود را بازیابی کنید با این کلید است."), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "ما این کلید را ذخیره نمی‌کنیم، لطفا این کلید ۲۴ کلمه‌ای را در مکانی امن ذخیره کنید."), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("بازیابی موفقیت آمیز بود!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "دستگاه فعلی به اندازه کافی قدرتمند نیست تا رمز عبور شما را تایید کند، اما ما می‌توانیم به گونه‌ای بازسازی کنیم که با تمام دستگاه‌ها کار کند.\n\nلطفا با استفاده از کلید بازیابی خود وارد شوید و رمز عبور خود را دوباره ایجاد کنید (در صورت تمایل می‌توانید دوباره از همان رمز عبور استفاده کنید)."), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("بازتولید رمز عبور"), + "reddit": MessageLookupByLibrary.simpleMessage("ردیت"), + "removeLink": MessageLookupByLibrary.simpleMessage("حذف پیوند"), + "rename": MessageLookupByLibrary.simpleMessage("تغییر نام"), + "renameAlbum": MessageLookupByLibrary.simpleMessage("تغییر نام آلبوم"), + "renameFile": MessageLookupByLibrary.simpleMessage("تغییر نام پرونده"), + "resendEmail": MessageLookupByLibrary.simpleMessage("ارسال مجدد ایمیل"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("بازنشانی رمز عبور"), + "retry": MessageLookupByLibrary.simpleMessage("سعی مجدد"), + "reviewSuggestions": + MessageLookupByLibrary.simpleMessage("مرور پیشنهادها"), + "safelyStored": MessageLookupByLibrary.simpleMessage("به طور ایمن"), + "saveKey": MessageLookupByLibrary.simpleMessage("ذخیره کلید"), + "search": MessageLookupByLibrary.simpleMessage("جستجو"), + "security": MessageLookupByLibrary.simpleMessage("امنیت"), + "selectAll": MessageLookupByLibrary.simpleMessage("انتخاب همه"), + "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( + "پوشه‌ها را برای پشتیبان گیری انتخاب کنید"), + "selectReason": MessageLookupByLibrary.simpleMessage("انتخاب دلیل"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage( + "پوشه‌های انتخاب شده، رمزگذاری شده و از آنها نسخه پشتیبان تهیه می‌شود"), + "send": MessageLookupByLibrary.simpleMessage("ارسال"), + "sendEmail": MessageLookupByLibrary.simpleMessage("ارسال ایمیل"), + "setPasswordTitle": + MessageLookupByLibrary.simpleMessage("تنظیم رمز عبور"), + "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( + "فقط با افرادی که می‌خواهید به اشتراک بگذارید"), + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "Ente را دانلود کنید تا بتوانید به راحتی عکس‌ها و ویدیوهای با کیفیت اصلی را به اشتراک بگذارید\n\nhttps://ente.io"), + "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage( + "عکس‌های جدید به اشتراک گذاشته شده"), + "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( + "هنگامی که شخصی عکسی را به آلبوم مشترکی که شما بخشی از آن هستید اضافه می‌کند، آگاه‌سازی دریافت می‌کنید"), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم"), + "skip": MessageLookupByLibrary.simpleMessage("رد کردن"), + "social": MessageLookupByLibrary.simpleMessage("شبکه اجتماعی"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "مشکلی پیش آمده، لطفا دوباره تلاش کنید"), + "sorry": MessageLookupByLibrary.simpleMessage("متاسفیم"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "با عرض پوزش، ما نمی‌توانیم کلیدهای امن را در این دستگاه تولید کنیم.\n\nلطفا از دستگاه دیگری ثبت نام کنید."), + "sortAlbumsBy": + MessageLookupByLibrary.simpleMessage("مرتب‌سازی براساس"), + "sortNewestFirst": + MessageLookupByLibrary.simpleMessage("ایتدا جدیدترین"), + "sortOldestFirst": + MessageLookupByLibrary.simpleMessage("ایتدا قدیمی‌ترین"), + "startBackup": + MessageLookupByLibrary.simpleMessage("شروع پشتیبان گیری"), + "status": MessageLookupByLibrary.simpleMessage("وضعیت"), + "storage": MessageLookupByLibrary.simpleMessage("حافظه ذخیره‌سازی"), + "storageBreakupFamily": + MessageLookupByLibrary.simpleMessage("خانوادگی"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("شما"), + "storageUsageInfo": m60, + "strongStrength": MessageLookupByLibrary.simpleMessage("قوی"), + "support": MessageLookupByLibrary.simpleMessage("پشتیبانی"), + "systemTheme": MessageLookupByLibrary.simpleMessage("سیستم"), + "tapToEnterCode": MessageLookupByLibrary.simpleMessage( + "برای وارد کردن کد ضربه بزنید"), + "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( + "به نظر می‌رسد مشکلی وجود دارد. لطفا بعد از مدتی دوباره تلاش کنید. اگر همچنان با خطا مواجه می‌شوید، لطفا با تیم پشتیبانی ما ارتباط برقرار کنید."), + "terminate": MessageLookupByLibrary.simpleMessage("خروج"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("خروچ دستگاه؟"), + "terms": MessageLookupByLibrary.simpleMessage("شرایط و مقررات"), + "termsOfServicesTitle": + MessageLookupByLibrary.simpleMessage("شرایط و مقررات"), + "theDownloadCouldNotBeCompleted": + MessageLookupByLibrary.simpleMessage("دانلود کامل نشد"), + "theme": MessageLookupByLibrary.simpleMessage("تم"), + "thisDevice": MessageLookupByLibrary.simpleMessage("این دستگاه"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "با این کار شما از دستگاه زیر خارج می‌شوید:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "این کار شما را از این دستگاه خارج می‌کند!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "برای تنظیم مجدد رمز عبور، لطفا ابتدا ایمیل خود را تایید کنید."), + "tryAgain": MessageLookupByLibrary.simpleMessage("دوباره امتحان کنید"), + "twitter": MessageLookupByLibrary.simpleMessage("توییتر"), + "uncategorized": MessageLookupByLibrary.simpleMessage("دسته‌بندی نشده"), + "unselectAll": MessageLookupByLibrary.simpleMessage("لغو انتخاب همه"), + "update": MessageLookupByLibrary.simpleMessage("به‌روزرسانی"), + "updateAvailable": + MessageLookupByLibrary.simpleMessage("به‌رورزرسانی در دسترس است"), + "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( + "در حال به‌روزرسانی گزینش پوشه..."), + "usePublicLinksForPeopleNotOnEnte": + MessageLookupByLibrary.simpleMessage( + "استفاده از پیوندهای عمومی برای افرادی که در Ente نیستند"), + "useRecoveryKey": MessageLookupByLibrary.simpleMessage( + "از کلید بازیابی استفاده کنید"), + "verify": MessageLookupByLibrary.simpleMessage("تایید"), + "verifyEmail": MessageLookupByLibrary.simpleMessage("تایید ایمیل"), + "verifyEmailID": m68, + "verifyIDLabel": MessageLookupByLibrary.simpleMessage("تایید"), + "verifyPassword": + MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), + "verifying": MessageLookupByLibrary.simpleMessage("در حال تایید..."), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("ویدیو"), + "viewActiveSessions": + MessageLookupByLibrary.simpleMessage("مشاهده دستگاه‌های فعال"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("نمایش کلید بازیابی"), + "viewer": MessageLookupByLibrary.simpleMessage("بیننده"), + "weAreOpenSource": + MessageLookupByLibrary.simpleMessage("ما متن‌باز هستیم!"), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("ضعیف"), + "welcomeBack": MessageLookupByLibrary.simpleMessage("خوش آمدید!"), + "whatsNew": MessageLookupByLibrary.simpleMessage("تغییرات جدید"), + "yes": MessageLookupByLibrary.simpleMessage("بله"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("بله، تبدیل به بیننده شود"), + "yesLogout": MessageLookupByLibrary.simpleMessage("بله، خارج می‌شوم"), + "you": MessageLookupByLibrary.simpleMessage("شما"), + "youAreOnAFamilyPlan": MessageLookupByLibrary.simpleMessage( + "شما در یک برنامه خانوادگی هستید!"), + "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage( + "شما در حال استفاده از آخرین نسخه هستید"), + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("حساب کاربری شما حذف شده است") + }; +} diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 4b70fe3fc5..af1060e22b 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -20,34 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'fr'; - static String m0(count) => - "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; + static String m3(count) => + "${Intl.plural(count, zero: 'Ajouter un coauteur', one: 'Ajouter un coauteur', other: 'Ajouter des coauteurs')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Ajoutez un objet', other: 'Ajoutez des objets')}"; - static String m1(count) => - "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; - - static String m4(emailOrName) => "Ajouté par ${emailOrName}"; - - static String m5(albumName) => "Ajouté avec succès à ${albumName}"; + static String m5(storageAmount, endDate) => + "Votre extension de ${storageAmount} est valable jusqu\'au ${endDate}"; static String m6(count) => + "${Intl.plural(count, zero: 'Ajouter un lecteur', one: 'Ajouter un lecteur', other: 'Ajouter des lecteurs')}"; + + static String m7(emailOrName) => "Ajouté par ${emailOrName}"; + + static String m8(albumName) => "Ajouté avec succès à ${albumName}"; + + static String m9(count) => "${Intl.plural(count, zero: 'Aucun Participant', one: '1 Participant', other: '${count} Participants')}"; - static String m7(versionValue) => "Version : ${versionValue}"; + static String m10(versionValue) => "Version : ${versionValue}"; - static String m8(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} libre"; + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} gratuit"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Veuillez d\'abord annuler votre abonnement existant de ${paymentProvider}"; - static String m10(user) => - "${user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourrait toujours supprimer les photos existantes ajoutées par eux"; + static String m13(user) => + "${user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourra toujours supprimer les photos existantes ajoutées par eux"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Votre famille a demandé ${storageAmountInGb} GB jusqu\'à présent', @@ -57,108 +60,113 @@ class MessageLookup extends MessageLookupByLibrary { 'Vous avez réclamé ${storageAmountInGb} GB jusqu\'à présent!', })}"; - static String m12(albumName) => "Lien collaboratif créé pour ${albumName}"; + static String m15(albumName) => "Lien collaboratif créé pour ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour gérer votre abonnement"; - static String m14(provider) => + static String m17(provider) => "Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}."; - static String m16(count) => + static String m18(endpoint) => "Connecté à ${endpoint}"; + + static String m19(count) => "${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Suppression de ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Cela supprimera le lien public pour accéder à \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} fichiers, ${formattedSize} chacun"; - static String m22(newEmail) => "L\'e-mail a été changé en ${newEmail}"; + static String m25(newEmail) => "L\'e-mail a été changé en ${newEmail}"; - static String m23(email) => - "${email} n\'a pas de compte ente.\n\nEnvoyez une invitation pour partager des photos."; + static String m26(email) => + "${email} n\'a pas de compte Ente.\n\nEnvoyez une invitation pour partager des photos."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 fichier sur cet appareil a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers sur cet appareil ont été sauvegardés en toute sécurité')}"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 fichier dans cet album a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers dans cet album ont été sauvegardés en toute sécurité')}"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code"; - static String m27(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; + static String m30(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; - static String m28(count) => + static String m31(count) => "Vous pouvez toujours ${Intl.plural(count, one: 'y', other: 'y')} accéder sur ente tant que vous avez un abonnement actif"; - static String m29(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Peut être supprimé de l\'appareil pour libérer ${formattedSize}', other: 'Peuvent être supprimés de l\'appareil pour libérer ${formattedSize}')}"; - static String m32(count) => - "${Intl.plural(count, one: '${count} objet', other: '${count} objets')}"; - - static String m33(expiryTime) => "Le lien expirera le ${expiryTime}"; - - static String m34(count, formattedCount) => - "${Intl.plural(count, one: '${formattedCount} mémoire', other: '${formattedCount} souvenirs')}"; + static String m34(currentlyProcessing, totalCount) => + "Traitement en cours ${currentlyProcessing} / ${totalCount}"; static String m35(count) => + "${Intl.plural(count, one: '${count} objet', other: '${count} objets')}"; + + static String m36(expiryTime) => "Le lien expirera le ${expiryTime}"; + + static String m0(count, formattedCount) => + "${Intl.plural(count, one: '${formattedCount} mémoire', other: '${formattedCount} souvenirs')}"; + + static String m37(count) => "${Intl.plural(count, one: 'Déplacez l\'objet', other: 'Déplacez des objets')}"; - static String m36(albumName) => "Déplacé avec succès vers ${albumName}"; + static String m38(albumName) => "Déplacé avec succès vers ${albumName}"; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Veuillez contacter le support ${providerName} si vous avez été facturé"; - static String m41(endDate) => + static String m43(endDate) => "Essai gratuit valable jusqu\'à ${endDate}.\nVous pouvez choisir un plan payant par la suite."; - static String m42(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; + static String m44(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; - static String m43(toEmail) => "Envoyez les logs à ${toEmail}"; + static String m45(toEmail) => "Envoyez les logs à ${toEmail}"; - static String m44(storeName) => "Notez-nous sur ${storeName}"; + static String m46(storeName) => "Notez-nous sur ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Vous recevez tous les deux ${storageInGB} GB* gratuits"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l\'album"; - static String m47(endDate) => "Renouvellement le ${endDate}"; + static String m49(endDate) => "Renouvellement le ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} résultat trouvé', other: '${count} résultats trouvés')}"; - static String m49(count) => "${count} sélectionné(s)"; + static String m1(count) => "${count} sélectionné(s)"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} sélectionné(s) (${yourCount} à vous)"; - static String m51(verificationID) => + static String m52(verificationID) => "Voici mon ID de vérification : ${verificationID} pour ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hé, pouvez-vous confirmer qu\'il s\'agit de votre ID de vérification ente.io : ${verificationID}"; static String m53(referralCode, referralStorageInGB) => - "code de parrainage ente : ${referralCode} \n\nAppliquez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; + "Code de parrainage Ente : ${referralCode} \n\nValidez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Partagez avec des personnes spécifiques', one: 'Partagé avec 1 personne', other: 'Partagé avec ${numberOfPeople} des gens')}"; @@ -171,7 +179,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m57(fileType) => "Cette ${fileType} est à la fois sur ente et sur votre appareil."; - static String m58(fileType) => "Ce ${fileType} sera supprimé de ente."; + static String m58(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; static String m59(storageAmountInGB) => "${storageAmountInGB} Go"; @@ -180,7 +188,7 @@ class MessageLookup extends MessageLookupByLibrary { "${usedAmount} ${usedStorageUnit} sur ${totalAmount} ${totalStorageUnit} utilisé"; static String m61(id) => - "Votre ${id} est déjà lié à un autre compte ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; + "Votre ${id} est déjà lié à un autre compte Ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; static String m62(endDate) => "Votre abonnement sera annulé le ${endDate}"; @@ -211,7 +219,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "Une nouvelle version de ente est disponible."), + "Une nouvelle version de Ente est disponible."), "about": MessageLookupByLibrary.simpleMessage("À propos"), "account": MessageLookupByLibrary.simpleMessage("Compte"), "accountWelcomeBack": @@ -220,21 +228,23 @@ class MessageLookup extends MessageLookupByLibrary { "Je comprends que si je perds mon mot de passe, je perdrai mes données puisque mes données sont chiffrées de bout en bout."), "activeSessions": MessageLookupByLibrary.simpleMessage("Sessions actives"), + "addAName": MessageLookupByLibrary.simpleMessage("Ajouter un nom"), "addANewEmail": MessageLookupByLibrary.simpleMessage("Ajouter un nouvel email"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Ajouter un collaborateur"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Ajouter depuis l\'appareil"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Ajouter la localisation"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Ajouter"), - "addMore": MessageLookupByLibrary.simpleMessage("Ajouter Plus"), + "addMore": MessageLookupByLibrary.simpleMessage("Ajouter"), "addNew": MessageLookupByLibrary.simpleMessage("Ajouter un nouveau"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Détails des modules complémentaires"), + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Modules complémentaires"), "addPhotos": MessageLookupByLibrary.simpleMessage("Ajouter des photos"), @@ -242,17 +252,17 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ajouter la sélection"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Ajouter à l\'album"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Ajouter à ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Ajouter à Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Ajouter à un album masqué"), "addViewer": MessageLookupByLibrary.simpleMessage("Ajouter un observateur"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage( "Ajoutez vos photos maintenant"), "addedAs": MessageLookupByLibrary.simpleMessage("Ajouté comme"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Ajout aux favoris..."), "advanced": MessageLookupByLibrary.simpleMessage("Avancé"), @@ -263,7 +273,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Après 1 semaine"), "after1Year": MessageLookupByLibrary.simpleMessage("Après 1 an"), "albumOwner": MessageLookupByLibrary.simpleMessage("Propriétaire"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Titre de l\'album"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album mis à jour"), @@ -298,10 +308,9 @@ class MessageLookup extends MessageLookupByLibrary { "Android, iOS, Web, Ordinateur"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Authentification requise"), - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appLock": MessageLookupByLibrary.simpleMessage( + "Verrouillage d\'applications"), + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Appliquer"), "applyCodeTitle": @@ -349,8 +358,6 @@ class MessageLookup extends MessageLookupByLibrary { "Veuillez vous authentifier pour configurer l\'authentification à deux facteurs"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour débuter la suppression du compte"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour voir vos sessions actives"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -366,11 +373,22 @@ class MessageLookup extends MessageLookupByLibrary { "L\'authentification a échouée, veuillez réessayer"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Authentification réussie!"), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), + "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( + "Vous verrez ici les appareils Cast disponibles."), + "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( + "Assurez-vous que les autorisations de réseau local sont activées pour l\'application Ente Photos, dans les paramètres."), + "autoLock": + MessageLookupByLibrary.simpleMessage("Verrouillage automatique"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), + "Délai après lequel l\'application se verrouille une fois qu\'elle a été mise en arrière-plan"), + "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( + "En raison d\'un problème technique, vous avez été déconnecté. Veuillez nous excuser pour le désagrément."), + "autoPair": + MessageLookupByLibrary.simpleMessage("Appairage automatique"), + "autoPairDesc": MessageLookupByLibrary.simpleMessage( + "L\'appairage automatique ne fonctionne qu\'avec les appareils qui prennent en charge Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponible"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Dossiers sauvegardés"), "backup": MessageLookupByLibrary.simpleMessage("Sauvegarde"), @@ -397,49 +415,66 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Vous ne pouvez supprimer que les fichiers que vous possédez"), "cancel": MessageLookupByLibrary.simpleMessage("Annuler"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Annuler l\'abonnement"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Les fichiers partagés ne peuvent pas être supprimés"), + "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( + "Veuillez vous assurer que vous êtes sur le même réseau que la TV."), + "castIPMismatchTitle": MessageLookupByLibrary.simpleMessage( + "Échec de la diffusion de l\'album"), + "castInstruction": MessageLookupByLibrary.simpleMessage( + "Visitez cast.ente.io sur l\'appareil que vous voulez associer.\n\nEntrez le code ci-dessous pour lire l\'album sur votre TV."), "centerPoint": MessageLookupByLibrary.simpleMessage("Point central"), + "change": MessageLookupByLibrary.simpleMessage("Modifier"), "changeEmail": MessageLookupByLibrary.simpleMessage("Modifier l\'e-mail"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( - "Change location of selected items?"), + "Changer l\'emplacement des éléments sélectionnés ?"), "changePassword": MessageLookupByLibrary.simpleMessage("Modifier le mot de passe"), "changePasswordTitle": MessageLookupByLibrary.simpleMessage("Modifier le mot de passe"), "changePermissions": MessageLookupByLibrary.simpleMessage("Modifier les permissions ?"), + "changeYourReferralCode": MessageLookupByLibrary.simpleMessage( + "Modifier votre code de parrainage"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Vérifier les mises à jour"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Veuillez consulter votre boîte de courriels (et les indésirables) pour compléter la vérification"), + "checkStatus": + MessageLookupByLibrary.simpleMessage("Vérifier le statut"), "checking": MessageLookupByLibrary.simpleMessage("Vérification..."), "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Sélectionnez des photos et essayez la \"Vue Invité\"."), + "Sélectionnez les photos et fixez les en \"Vue Invité\"."), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Vous montrez des photos à un ami ? Pas de souci, il ne pourra pas trop faire défiler. La vue invité verrouille les photos que vous sélectionnez."), + "Montrer des photos à un ami en les transmettant sur votre téléphone ? Ne vous inquiétez pas si vous les faites glisser trop loin.\nLa vue \"invité\" les verrouillera dans les photos que vous avez sélectionnées."), "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Vue Invité"), + MessageLookupByLibrary.simpleMessage("Vue invité"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L\'expérience est immersive avec une navigation basée sur le mouvement !"), + "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L\'expérience est immersive avec la navigation basée sur les mouvements !"), "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visionneuse Panorama"), + MessageLookupByLibrary.simpleMessage("Visionneuse en panorama"), "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Découvrez notre nouveau lecteur vidéo avec de meilleurs contrôles de lecture et le support des vidéos HDR."), + "Intégration d\'un nouveau lecteur vidéo, avec de meilleurs contrôles de lecture et la prise en charge des vidéos HDR."), "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Lecteur Vidéo"), + MessageLookupByLibrary.simpleMessage("Lecteur vidéo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Réclamer le stockage gratuit"), "claimMore": MessageLookupByLibrary.simpleMessage("Réclamez plus !"), "claimed": MessageLookupByLibrary.simpleMessage("Réclamée"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, + "cleanUncategorized": MessageLookupByLibrary.simpleMessage( + "Effacer les éléments non classés"), + "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( + "Supprimer tous les fichiers non-catégorisés étant présents dans d\'autres albums"), "clearCaches": MessageLookupByLibrary.simpleMessage("Nettoyer le cache"), + "clearIndexes": + MessageLookupByLibrary.simpleMessage("Effacer les index"), "click": MessageLookupByLibrary.simpleMessage("• Click"), "clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage( "• Cliquez sur le menu de débordement"), @@ -449,18 +484,20 @@ class MessageLookup extends MessageLookupByLibrary { "clubByFileName": MessageLookupByLibrary.simpleMessage("Grouper par nom de fichier"), "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), + MessageLookupByLibrary.simpleMessage("Progression du regroupement"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Code appliqué"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Désolé, vous avez atteint la limite de changements de code."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Code copié dans le presse-papiers"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Code utilisé par vous"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Créez un lien pour permettre aux gens d\'ajouter et de voir des photos dans votre album partagé sans avoir besoin d\'une application ente ou d\'un compte. Idéal pour collecter des photos d\'événement."), + "Créez un lien pour permettre aux gens d\'ajouter et de voir des photos dans votre album partagé sans avoir besoin d\'une application ente ou d\'un compte. Idéal pour récupérer des photos d\'événement."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Lien collaboratif"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Collaborateur"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -488,10 +525,12 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmer la clé de récupération"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Confirmer la clé de récupération"), - "contactFamilyAdmin": m13, + "connectToDevice": + MessageLookupByLibrary.simpleMessage("Connexion à l\'appareil"), + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contenus"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"), @@ -520,7 +559,7 @@ class MessageLookup extends MessageLookupByLibrary { "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Appuyez longuement pour sélectionner des photos et cliquez sur + pour créer un album"), "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), + MessageLookupByLibrary.simpleMessage("Créer un lien collaboratif"), "createCollage": MessageLookupByLibrary.simpleMessage("Créez un collage"), "createNewAccount": @@ -536,6 +575,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage( "L\'utilisation actuelle est "), "custom": MessageLookupByLibrary.simpleMessage("Personnaliser"), + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Sombre"), "dayToday": MessageLookupByLibrary.simpleMessage("Aujourd\'hui"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Hier"), @@ -549,7 +589,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAccount": MessageLookupByLibrary.simpleMessage("Supprimer le compte"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( - "Nous sommes désolés de vous voir partir. S\'il vous plaît partagez vos commentaires pour nous aider à améliorer le service."), + "Nous sommes désolés de vous voir partir. N\'hésitez pas à partager vos commentaires pour nous aider à améliorer le service."), "deleteAccountPermanentlyButton": MessageLookupByLibrary.simpleMessage( "Supprimer définitivement le compte"), "deleteAlbum": @@ -560,7 +600,7 @@ class MessageLookup extends MessageLookupByLibrary { "Ceci supprimera tous les albums vides. Ceci est utile lorsque vous voulez réduire l\'encombrement dans votre liste d\'albums."), "deleteAll": MessageLookupByLibrary.simpleMessage("Tout Supprimer"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "Ce compte est lié à d\'autres applications ente, si vous en utilisez une.\\n\\nVos données téléchargées, dans toutes les applications ente, seront planifiées pour suppression, et votre compte sera définitivement supprimé."), + "Ce compte est lié à d\'autres applications Ente, si vous en utilisez une. Vos données téléchargées, dans toutes les applications ente, seront planifiées pour suppression, et votre compte sera définitivement supprimé."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Veuillez envoyer un e-mail à account-deletion@ente.io à partir de votre adresse e-mail enregistrée."), "deleteEmptyAlbums": @@ -573,13 +613,13 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": - MessageLookupByLibrary.simpleMessage("Supprimer de ente"), - "deleteItemCount": m16, + MessageLookupByLibrary.simpleMessage("Supprimé de Ente"), + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Supprimer des photos"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Il manque une fonction clé dont j\'ai besoin"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -600,19 +640,28 @@ class MessageLookup extends MessageLookupByLibrary { "designedToOutlive": MessageLookupByLibrary.simpleMessage("Conçu pour survivre"), "details": MessageLookupByLibrary.simpleMessage("Détails"), + "developerSettings": + MessageLookupByLibrary.simpleMessage("Paramètres du développeur"), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Êtes-vous sûr de vouloir modifier les paramètres du développeur ?"), + "deviceCodeHint": + MessageLookupByLibrary.simpleMessage("Saisissez le code"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "Les fichiers ajoutés à cet album seront automatiquement téléchargés sur ente."), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), + "Les fichiers ajoutés à cet album seront automatiquement téléchargés sur Ente."), + "deviceLock": + MessageLookupByLibrary.simpleMessage("Verrouillage de l\'appareil"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( "Désactiver le verrouillage de l\'écran de l\'appareil lorsque ente est au premier plan et il y a une sauvegarde en cours. Ce n\'est normalement pas nécessaire, mais peut aider les gros téléchargements et les premières importations de grandes bibliothèques plus rapidement."), + "deviceNotFound": + MessageLookupByLibrary.simpleMessage("Appareil non trouvé"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Le savais-tu ?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage( "Désactiver le verrouillage automatique"), "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( - "Les téléspectateurs peuvent toujours prendre des captures d\'écran ou enregistrer une copie de vos photos en utilisant des outils externes"), + "Les observateurs peuvent toujours prendre des captures d\'écran ou enregistrer une copie de vos photos en utilisant des outils externes"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Veuillez remarquer"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Désactiver la double-authentification"), "disablingTwofactorAuthentication": @@ -621,6 +670,8 @@ class MessageLookup extends MessageLookupByLibrary { "discord": MessageLookupByLibrary.simpleMessage("Discord"), "dismiss": MessageLookupByLibrary.simpleMessage("Rejeter"), "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("km"), + "doNotSignOut": + MessageLookupByLibrary.simpleMessage("Ne pas se déconnecter"), "doThisLater": MessageLookupByLibrary.simpleMessage("Plus tard"), "doYouWantToDiscardTheEditsYouHaveMade": MessageLookupByLibrary.simpleMessage( @@ -633,27 +684,28 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du téléchargement"), "downloading": MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Éditer"), - "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), + "editLocation": + MessageLookupByLibrary.simpleMessage("Modifier l’emplacement"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("Modifier l’emplacement"), "editsSaved": MessageLookupByLibrary.simpleMessage("Modification sauvegardée"), "editsToLocationWillOnlyBeSeenWithinEnte": MessageLookupByLibrary.simpleMessage( - "Edits to location will only be seen within Ente"), + "Les modifications de l\'emplacement ne seront visibles que dans Ente"), "eligible": MessageLookupByLibrary.simpleMessage("éligible"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Vérification de l\'adresse e-mail"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("Envoyez vos logs par e-mail"), - "empty": MessageLookupByLibrary.simpleMessage("Vide"), + "empty": MessageLookupByLibrary.simpleMessage("Vider"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Vider la corbeille ?"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activer la carte"), @@ -664,15 +716,17 @@ class MessageLookup extends MessageLookupByLibrary { "encryption": MessageLookupByLibrary.simpleMessage("Chiffrement"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Clés de chiffrement"), + "endpointUpdatedMessage": MessageLookupByLibrary.simpleMessage( + "Point de terminaison mis à jour avec succès"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "Chiffrement de bout en bout par défaut"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": MessageLookupByLibrary.simpleMessage( - "ente peut chiffrer et conserver des fichiers que si vous leur accordez l\'accès"), + "Ente peut chiffrer et conserver des fichiers que si vous leur accordez l\'accès"), "entePhotosPerm": MessageLookupByLibrary.simpleMessage( - "ente a besoin d\'une autorisation pour préserver vos photos"), + "Ente a besoin d\'une autorisation pour préserver vos photos"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "ente conserve vos souvenirs, donc ils sont toujours disponibles pour vous, même si vous perdez votre appareil."), + "Ente conserve vos souvenirs, ils sont donc toujours disponibles pour vous, même si vous perdez votre appareil."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Vous pouvez également ajouter votre famille à votre forfait."), "enterAlbumName": @@ -689,9 +743,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Saisissez le mot de passe"), "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Entrez un mot de passe que nous pouvons utiliser pour chiffrer vos données"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), + "enterPersonName": MessageLookupByLibrary.simpleMessage( + "Entrez le nom d\'une personne"), + "enterPin": MessageLookupByLibrary.simpleMessage("Saisir le code PIN"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( "Entrez le code de parrainage"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -716,7 +770,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("Exportez vos données"), "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), + MessageLookupByLibrary.simpleMessage("Reconnaissance faciale"), "faces": MessageLookupByLibrary.simpleMessage("Visages"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage( "Impossible d\'appliquer le code"), @@ -752,35 +806,42 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Fichiers supprimés"), + "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( + "Fichiers enregistrés dans la galerie"), + "findPeopleByName": MessageLookupByLibrary.simpleMessage( + "Trouver des personnes rapidement par leur nom"), "flip": MessageLookupByLibrary.simpleMessage("Retourner"), "forYourMemories": MessageLookupByLibrary.simpleMessage("pour vos souvenirs"), "forgotPassword": MessageLookupByLibrary.simpleMessage("Mot de passe oublié"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), + "foundFaces": MessageLookupByLibrary.simpleMessage("Visages trouvés"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Libérer de l\'espace sur l\'appareil"), + "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( + "Économisez de l\'espace sur votre appareil en effaçant les fichiers qui ont déjà été sauvegardés."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libérer de l\'espace"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Jusqu\'à 1000 souvenirs affichés dans la galerie"), "general": MessageLookupByLibrary.simpleMessage("Général"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Génération des clés de chiffrement..."), + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Allez aux réglages"), "googlePlayId": @@ -791,20 +852,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Accorder la permission"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Grouper les photos à proximité"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Nous ne suivons pas les installations d\'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( "Comment avez-vous entendu parler de Ente? (facultatif)"), + "help": MessageLookupByLibrary.simpleMessage("Aide"), "hidden": MessageLookupByLibrary.simpleMessage("Masqué"), "hide": MessageLookupByLibrary.simpleMessage("Masquer"), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), + "hideContent": + MessageLookupByLibrary.simpleMessage("Masquer le contenu"), "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), + "Masque le contenu de l\'application dans le sélecteur d\'applications et désactive les captures d\'écran"), "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), + "Masque le contenu de l\'application dans le sélecteur d\'application"), "hiding": MessageLookupByLibrary.simpleMessage("Masquage en cours..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("Hébergé chez OSM France"), @@ -819,8 +879,8 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("Ok"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorer"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Certains fichiers de cet album sont ignorés parce qu\'ils avaient été précédemment supprimés de ente."), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), + "Certains fichiers de cet album sont ignorés parce qu\'ils avaient été précédemment supprimés de Ente."), + "immediately": MessageLookupByLibrary.simpleMessage("Immédiatement"), "importing": MessageLookupByLibrary.simpleMessage("Importation en cours..."), "incorrectCode": @@ -833,33 +893,41 @@ class MessageLookup extends MessageLookupByLibrary { "La clé de secours que vous avez entrée est incorrecte"), "incorrectRecoveryKeyTitle": MessageLookupByLibrary.simpleMessage("Clé de secours non valide"), + "indexedItems": + MessageLookupByLibrary.simpleMessage("Éléments indexés"), "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused, will automatically resume when device is ready"), + "L\'indexation est en pause. Elle reprendra automatiquement lorsque l\'appareil sera prêt."), "insecureDevice": MessageLookupByLibrary.simpleMessage("Appareil non sécurisé"), "installManually": MessageLookupByLibrary.simpleMessage("Installation manuelle"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Adresse e-mail invalide"), + "invalidEndpoint": MessageLookupByLibrary.simpleMessage( + "Point de terminaison non valide"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Désolé, le point de terminaison que vous avez entré n\'est pas valide. Veuillez en entrer un valide puis réessayez."), "invalidKey": MessageLookupByLibrary.simpleMessage("Clé invalide"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( - "La clé de récupération que vous avez saisie n\'est pas valide. Veuillez vous assurer qu\'elle "), + "La clé de récupération que vous avez saisie n\'est pas valide. Veuillez vérifier qu\'elle contient 24 caractères et qu\'ils sont correctement orthographiés.\n\nSi vous avez saisi un ancien code de récupération, veuillez vérifier qu\'il contient 64 caractères et qu\'ils sont correctement orthographiés."), "invite": MessageLookupByLibrary.simpleMessage("Inviter"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("Inviter à ente"), + "inviteToEnte": + MessageLookupByLibrary.simpleMessage("Inviter à rejoindre Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Invite tes ami(e)s"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Invitez vos amis sur ente"), + MessageLookupByLibrary.simpleMessage("Invitez vos amis sur Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Les éléments montrent le nombre de jours restants avant la suppression définitive"), "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de cet album"), - "joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"), + "joinDiscord": + MessageLookupByLibrary.simpleMessage("Rejoindre Discord"), "keepPhotos": MessageLookupByLibrary.simpleMessage("Conserver les photos"), "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), @@ -874,6 +942,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Quitter le plan familial"), "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage("Quitter l\'album partagé?"), + "left": MessageLookupByLibrary.simpleMessage("Gauche"), "light": MessageLookupByLibrary.simpleMessage("Clair"), "lightTheme": MessageLookupByLibrary.simpleMessage("Clair"), "linkCopiedToClipboard": MessageLookupByLibrary.simpleMessage( @@ -882,7 +951,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite d\'appareil"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Activé"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expiré"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiration du lien"), "linkHasExpired": @@ -913,17 +982,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Chargement de la galerie..."), "loadingMessage": MessageLookupByLibrary.simpleMessage("Chargement de vos photos..."), + "loadingModel": MessageLookupByLibrary.simpleMessage( + "Téléchargement des modèles..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galerie locale"), "location": MessageLookupByLibrary.simpleMessage("Emplacement"), "locationName": MessageLookupByLibrary.simpleMessage("Nom du lieu"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( "Un tag d\'emplacement regroupe toutes les photos qui ont été prises dans un certain rayon d\'une photo"), - "locations": MessageLookupByLibrary.simpleMessage("Locations"), + "locations": MessageLookupByLibrary.simpleMessage("Emplacements"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Verrouiller"), "lockscreen": - MessageLookupByLibrary.simpleMessage("Ecran de vérouillage"), + MessageLookupByLibrary.simpleMessage("Écran de verrouillage"), "logInLabel": MessageLookupByLibrary.simpleMessage("Se connecter"), "loggingOut": MessageLookupByLibrary.simpleMessage("Deconnexion..."), + "loginSessionExpired": + MessageLookupByLibrary.simpleMessage("Session expirée"), + "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( + "Votre session a expiré. Veuillez vous reconnecter."), "loginTerms": MessageLookupByLibrary.simpleMessage( "En cliquant sur connecter, j\'accepte les conditions d\'utilisation et la politique de confidentialité"), "logout": MessageLookupByLibrary.simpleMessage("Déconnexion"), @@ -931,11 +1006,15 @@ class MessageLookup extends MessageLookupByLibrary { "Cela enverra des logs pour nous aider à déboguer votre problème. Veuillez noter que les noms de fichiers seront inclus pour aider à suivre les problèmes avec des fichiers spécifiques."), "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( - "Long press an email to verify end to end encryption."), + "Appuyez longuement sur un e-mail pour vérifier le chiffrement de bout en bout."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Appuyez longuement sur un élément pour le voir en plein écran"), "lostDevice": MessageLookupByLibrary.simpleMessage("Appareil perdu ?"), + "machineLearning": + MessageLookupByLibrary.simpleMessage("Apprentissage automatique"), + "magicSearch": + MessageLookupByLibrary.simpleMessage("Recherche magique"), "manage": MessageLookupByLibrary.simpleMessage("Gérer"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Gérer le stockage de l\'appareil"), @@ -945,40 +1024,47 @@ class MessageLookup extends MessageLookupByLibrary { "manageParticipants": MessageLookupByLibrary.simpleMessage("Gérer"), "manageSubscription": MessageLookupByLibrary.simpleMessage("Gérer l\'abonnement"), + "manualPairDesc": MessageLookupByLibrary.simpleMessage( + "L\'appairage avec le code PIN fonctionne avec n\'importe quel écran sur lequel vous souhaitez voir votre album."), "map": MessageLookupByLibrary.simpleMessage("Carte"), "maps": MessageLookupByLibrary.simpleMessage("Cartes"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Marchandise"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Ordinateur"), - "moderateStrength": - MessageLookupByLibrary.simpleMessage("Sécurité moyenne"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("Moyen"), "modifyYourQueryOrTrySearchingFor": MessageLookupByLibrary.simpleMessage( "Modifiez votre requête, ou essayez de rechercher"), "moments": MessageLookupByLibrary.simpleMessage("Souvenirs"), "monthly": MessageLookupByLibrary.simpleMessage("Mensuel"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Déplacer vers l\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Déplacer vers un album masqué"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Déplacé dans la corbeille"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Déplacement des fichiers vers l\'album..."), "name": MessageLookupByLibrary.simpleMessage("Nom"), + "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( + "Impossible de se connecter à Ente, veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter le support."), + "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( + "Impossible de se connecter à Ente, veuillez vérifier vos paramètres réseau et contacter le support si l\'erreur persiste."), "never": MessageLookupByLibrary.simpleMessage("Jamais"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nouvel album"), - "newToEnte": MessageLookupByLibrary.simpleMessage("Nouveau sur ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Nouveau à Ente"), "newest": MessageLookupByLibrary.simpleMessage("Le plus récent"), - "next": MessageLookupByLibrary.simpleMessage("Next"), + "next": MessageLookupByLibrary.simpleMessage("Suivant"), "no": MessageLookupByLibrary.simpleMessage("Non"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Aucun album que vous avez partagé"), + "noDeviceFound": + MessageLookupByLibrary.simpleMessage("Aucun appareil trouvé"), "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Aucune"), "noDeviceThatCanBeDeleted": MessageLookupByLibrary.simpleMessage( "Vous n\'avez pas de fichiers sur cet appareil qui peuvent être supprimés"), @@ -989,22 +1075,24 @@ class MessageLookup extends MessageLookupByLibrary { "Aucune photo ou vidéo cachée"), "noImagesWithLocation": MessageLookupByLibrary.simpleMessage( "Aucune image avec localisation"), + "noInternetConnection": + MessageLookupByLibrary.simpleMessage("Aucune connexion internet"), "noPhotosAreBeingBackedUpRightNow": MessageLookupByLibrary.simpleMessage( "Aucune photo en cours de sauvegarde"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Aucune photo trouvée"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), - "noRecoveryKey": - MessageLookupByLibrary.simpleMessage("Aucune clé de récupération?"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Aucun lien rapide sélectionné"), + "noRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Aucune clé de récupération ?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( "En raison de notre protocole de chiffrement de bout en bout, vos données ne peuvent pas être déchiffré sans votre mot de passe ou clé de récupération"), "noResults": MessageLookupByLibrary.simpleMessage("Aucun résultat"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), + MessageLookupByLibrary.simpleMessage("Aucun verrou système trouvé"), "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Rien n\'a encore été partagé avec vous"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1029,23 +1117,39 @@ class MessageLookup extends MessageLookupByLibrary { "Optionnel, aussi court que vous le souhaitez..."), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage( "Sélectionner un fichier existant"), + "pair": MessageLookupByLibrary.simpleMessage("Associer"), + "pairWithPin": + MessageLookupByLibrary.simpleMessage("Appairer avec le code PIN"), + "pairingComplete": + MessageLookupByLibrary.simpleMessage("Appairage terminé"), + "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), + "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( + "La vérification est toujours en attente"), + "passkey": MessageLookupByLibrary.simpleMessage("Code d\'accès"), + "passkeyAuthTitle": MessageLookupByLibrary.simpleMessage( + "Vérification du code d\'accès"), "password": MessageLookupByLibrary.simpleMessage("Mot de passe"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Le mot de passe a été modifié"), "passwordLock": MessageLookupByLibrary.simpleMessage("Mot de passe verrou"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), + "La force du mot de passe est calculée en tenant compte de la longueur du mot de passe, des caractères utilisés et du fait que le mot de passe figure ou non parmi les 10 000 mots de passe les plus utilisés"), "passwordWarning": MessageLookupByLibrary.simpleMessage( "Nous ne stockons pas ce mot de passe, donc si vous l\'oubliez, nous ne pouvons pas déchiffrer vos données"), "paymentDetails": MessageLookupByLibrary.simpleMessage("Détails de paiement"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Échec du paiement"), - "paymentFailedTalkToProvider": m40, + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "Malheureusement votre paiement a échoué. Veuillez contacter le support et nous vous aiderons !"), + "paymentFailedTalkToProvider": m42, + "pendingItems": + MessageLookupByLibrary.simpleMessage("Éléments en attente"), "pendingSync": MessageLookupByLibrary.simpleMessage("Synchronisation en attente"), + "people": MessageLookupByLibrary.simpleMessage("Personnes"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( "Personnes utilisant votre code"), "permDeleteWarning": MessageLookupByLibrary.simpleMessage( @@ -1066,24 +1170,30 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Sélectionner le point central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Épingler l\'album"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "playStoreFreeTrialValidTill": m41, + "pinLock": + MessageLookupByLibrary.simpleMessage("Verrouillage du code PIN"), + "playOnTv": + MessageLookupByLibrary.simpleMessage("Lire l\'album sur la TV"), + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abonnement au PlayStore"), + "pleaseCheckYourInternetConnectionAndTryAgain": + MessageLookupByLibrary.simpleMessage( + "S\'il vous plaît, vérifiez votre connexion à internet et réessayez."), "pleaseContactSupportAndWeWillBeHappyToHelp": MessageLookupByLibrary.simpleMessage( "Veuillez contacter support@ente.io et nous serons heureux de vous aider!"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Merci de contacter l\'assistance si cette erreur persiste"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Veuillez accorder la permission"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Veuillez vous reconnecter"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "Veuillez sélectionner les liens rapides à supprimer"), + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Veuillez réessayer"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1119,7 +1229,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Évaluer l\'application"), "rateUs": MessageLookupByLibrary.simpleMessage("Évaluez-nous"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Récupérer"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Récupérer un compte"), @@ -1145,15 +1255,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recréer le mot de passe"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), + MessageLookupByLibrary.simpleMessage("Ressaisir le mot de passe"), + "reenterPin": + MessageLookupByLibrary.simpleMessage("Ressaisir le code PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Parrainez des amis et 2x votre abonnement"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Donnez ce code à vos amis"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ils s\'inscrivent à une offre payante"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Parrainages"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Les recommandations sont actuellement en pause"), @@ -1167,9 +1278,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Miniatures distantes"), "remoteVideos": MessageLookupByLibrary.simpleMessage("Vidéos distantes"), - "remove": MessageLookupByLibrary.simpleMessage("Enlever"), + "remove": MessageLookupByLibrary.simpleMessage("Supprimer"), "removeDuplicates": MessageLookupByLibrary.simpleMessage("Supprimer les doublons"), + "removeDuplicatesDesc": MessageLookupByLibrary.simpleMessage( + "Examiner et supprimer les fichiers qui sont des doublons exacts."), "removeFromAlbum": MessageLookupByLibrary.simpleMessage("Retirer de l\'album"), "removeFromAlbumTitle": @@ -1179,13 +1292,13 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Supprimer le participant"), - "removeParticipantBody": m46, - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), + "removeParticipantBody": m48, + "removePersonLabel": MessageLookupByLibrary.simpleMessage( + "Supprimer le libellé d\'une personne"), "removePublicLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien public"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Supprimer les liens publics"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Certains des éléments que vous êtes en train de retirer ont été ajoutés par d\'autres personnes, vous perdrez l\'accès vers ces éléments"), "removeWithQuestionMark": @@ -1199,7 +1312,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Renommer le fichier"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renouveler l’abonnement"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "resendEmail": @@ -1218,6 +1331,10 @@ class MessageLookup extends MessageLookupByLibrary { "retry": MessageLookupByLibrary.simpleMessage("Réessayer"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Veuillez vérifier et supprimer les éléments que vous croyez dupliqués."), + "reviewSuggestions": + MessageLookupByLibrary.simpleMessage("Consulter les suggestions"), + "right": MessageLookupByLibrary.simpleMessage("Droite"), + "rotate": MessageLookupByLibrary.simpleMessage("Pivoter"), "rotateLeft": MessageLookupByLibrary.simpleMessage("Pivoter à gauche"), "rotateRight": MessageLookupByLibrary.simpleMessage("Faire pivoter à droite"), @@ -1233,11 +1350,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Enregistrez votre clé de récupération si vous ne l\'avez pas déjà fait"), "saving": MessageLookupByLibrary.simpleMessage("Enregistrement..."), + "savingEdits": MessageLookupByLibrary.simpleMessage( + "Enregistrement des modifications..."), "scanCode": MessageLookupByLibrary.simpleMessage("Scanner le code"), "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Scannez ce code-barres avec\nvotre application d\'authentification"), - "search": MessageLookupByLibrary.simpleMessage("Search"), + "search": MessageLookupByLibrary.simpleMessage("Rechercher"), "searchAlbumsEmptySection": MessageLookupByLibrary.simpleMessage("Albums"), "searchByAlbumNameHint": @@ -1249,7 +1368,7 @@ class MessageLookup extends MessageLookupByLibrary { "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Recherche par date, mois ou année"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( - "Trouver toutes les photos d\'une personne"), + "Les personnes seront affichées ici une fois l\'indexation terminée"), "searchFileTypesAndNamesEmptySection": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), "searchHint1": MessageLookupByLibrary.simpleMessage( @@ -1265,12 +1384,12 @@ class MessageLookup extends MessageLookupByLibrary { "Grouper les photos qui sont prises dans un certain angle d\'une photo"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invitez des gens, et vous verrez ici toutes les photos qu\'ils partagent"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "selectALocation": - MessageLookupByLibrary.simpleMessage("Select a location"), - "selectALocationFirst": - MessageLookupByLibrary.simpleMessage("Select a location first"), + MessageLookupByLibrary.simpleMessage("Sélectionnez un emplacement"), + "selectALocationFirst": MessageLookupByLibrary.simpleMessage( + "Sélectionnez d\'abord un emplacement"), "selectAlbum": MessageLookupByLibrary.simpleMessage("Sélectionner album"), "selectAll": MessageLookupByLibrary.simpleMessage("Tout sélectionner"), @@ -1287,20 +1406,22 @@ class MessageLookup extends MessageLookupByLibrary { "selectYourPlan": MessageLookupByLibrary.simpleMessage("Sélectionner votre offre"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Les fichiers sélectionnés ne sont pas sur ente"), + "Les fichiers sélectionnés ne sont pas sur Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "Les dossiers sélectionnés seront cryptés et sauvegardés"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Envoyer"), "sendEmail": MessageLookupByLibrary.simpleMessage("Envoyer un e-mail"), "sendInvite": MessageLookupByLibrary.simpleMessage("Envoyer Invitations"), "sendLink": MessageLookupByLibrary.simpleMessage("Envoyer le lien"), + "serverEndpoint": MessageLookupByLibrary.simpleMessage( + "Point de terminaison serveur"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Session expirée"), "setAPassword": @@ -1309,14 +1430,15 @@ class MessageLookup extends MessageLookupByLibrary { "setCover": MessageLookupByLibrary.simpleMessage("Définir la couverture"), "setLabel": MessageLookupByLibrary.simpleMessage("Définir"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), + "setNewPassword": MessageLookupByLibrary.simpleMessage( + "Définir un nouveau mot de passe"), + "setNewPin": + MessageLookupByLibrary.simpleMessage("Définir un nouveau code PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Définir le mot de passe"), "setRadius": MessageLookupByLibrary.simpleMessage("Définir le rayon"), "setupComplete": - MessageLookupByLibrary.simpleMessage("Configuration fini"), + MessageLookupByLibrary.simpleMessage("Configuration terminée"), "share": MessageLookupByLibrary.simpleMessage("Partager"), "shareALink": MessageLookupByLibrary.simpleMessage("Partager le lien"), "shareAlbumHint": MessageLookupByLibrary.simpleMessage( @@ -1324,20 +1446,20 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage( "Partagez un album maintenant"), "shareLink": MessageLookupByLibrary.simpleMessage("Partager le lien"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Partager uniquement avec les personnes que vous voulez"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Téléchargez ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), + "Téléchargez Ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), "shareTextReferralCode": m53, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( - "Partager avec des utilisateurs non-ente"), + "Partager avec des utilisateurs non-Ente"), "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Partagez votre premier album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "Créez des albums partagés et collaboratifs avec d\'autres utilisateurs de ente, y compris des utilisateurs sur des plans gratuits."), + "Créez des albums partagés et collaboratifs avec d\'autres utilisateurs de Ente, y compris des utilisateurs ayant des plans gratuits."), "sharedByMe": MessageLookupByLibrary.simpleMessage("Partagé par moi"), "sharedByYou": MessageLookupByLibrary.simpleMessage("Partagé par vous"), "sharedPhotoNotifications": @@ -1352,6 +1474,12 @@ class MessageLookup extends MessageLookupByLibrary { "sharing": MessageLookupByLibrary.simpleMessage("Partage..."), "showMemories": MessageLookupByLibrary.simpleMessage("Montrer les souvenirs"), + "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( + "Se déconnecter d\'autres appareils"), + "signOutOtherBody": MessageLookupByLibrary.simpleMessage( + "Si vous pensez que quelqu\'un peut connaître votre mot de passe, vous pouvez forcer tous les autres appareils utilisant votre compte à se déconnecter."), + "signOutOtherDevices": MessageLookupByLibrary.simpleMessage( + "Déconnecter les autres appareils"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "J\'accepte les conditions d\'utilisation et la politique de confidentialité"), "singleFileDeleteFromDevice": m56, @@ -1363,7 +1491,7 @@ class MessageLookup extends MessageLookupByLibrary { "social": MessageLookupByLibrary.simpleMessage("Réseaux Sociaux"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( - "Certains éléments sont à la fois dans ente et votre appareil."), + "Certains éléments sont à la fois sur Ente et votre appareil."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Certains des fichiers que vous essayez de supprimer ne sont disponibles que sur votre appareil et ne peuvent pas être récupérés s\'ils sont supprimés"), @@ -1395,6 +1523,11 @@ class MessageLookup extends MessageLookupByLibrary { "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ Succès"), "startBackup": MessageLookupByLibrary.simpleMessage("Démarrer la sauvegarde"), + "status": MessageLookupByLibrary.simpleMessage("État"), + "stopCastingBody": MessageLookupByLibrary.simpleMessage( + "Voulez-vous arrêter la diffusion ?"), + "stopCastingTitle": + MessageLookupByLibrary.simpleMessage("Arrêter la diffusion"), "storage": MessageLookupByLibrary.simpleMessage("Stockage"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Famille"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Vous"), @@ -1402,8 +1535,7 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Limite de stockage atteinte"), "storageUsageInfo": m60, - "strongStrength": - MessageLookupByLibrary.simpleMessage("Securité forte"), + "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), "subAlreadyLinkedErrMessage": m61, "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("S\'abonner"), @@ -1431,7 +1563,8 @@ class MessageLookup extends MessageLookupByLibrary { "tapToCopy": MessageLookupByLibrary.simpleMessage("taper pour copier"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage("Appuyez pour entrer le code"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), + "tapToUnlock": + MessageLookupByLibrary.simpleMessage("Appuyer pour déverrouiller"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), "terminate": MessageLookupByLibrary.simpleMessage("Se déconnecter"), @@ -1478,24 +1611,24 @@ class MessageLookup extends MessageLookupByLibrary { "Cela vous déconnectera de cet appareil !"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + "Ceci supprimera les liens publics de tous les liens rapides sélectionnés."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), + "Pour activer le verrouillage d\'application, veuillez configurer le code d\'accès de l\'appareil ou le verrouillage de l\'écran dans les paramètres de votre système."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Cacher une photo ou une vidéo"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Pour réinitialiser votre mot de passe, veuillez d\'abord vérifier votre e-mail."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Journaux du jour"), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), + "tooManyIncorrectAttempts": MessageLookupByLibrary.simpleMessage( + "Trop de tentatives incorrectes"), "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), "trashDaysLeft": m66, "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Activez la sauvegarde pour télécharger automatiquement les fichiers ajoutés à ce dossier de l\'appareil sur ente."), + "Activez la sauvegarde pour charger automatiquement sur Ente les fichiers ajoutés à ce dossier de l\'appareil."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 mois gratuits sur les forfaits annuels"), @@ -1517,6 +1650,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Désarchiver l\'album"), "unarchiving": MessageLookupByLibrary.simpleMessage("Désarchivage en cours..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Désolé, ce code n\'est pas disponible."), "uncategorized": MessageLookupByLibrary.simpleMessage("Aucune catégorie"), "unhide": MessageLookupByLibrary.simpleMessage("Dévoiler"), @@ -1543,8 +1678,10 @@ class MessageLookup extends MessageLookupByLibrary { "Jusqu\'à 50% de réduction, jusqu\'au 4ème déc."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Le stockage utilisable est limité par votre offre actuelle. Le stockage excédentaire deviendra automatiquement utilisable lorsque vous mettez à niveau votre offre."), + "useAsCover": + MessageLookupByLibrary.simpleMessage("Utiliser comme couverture"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Utiliser des liens publics pour les personnes qui ne sont pas sur ente"), + "Utiliser des liens publics pour les personnes qui ne sont pas sur Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Utiliser la clé de secours"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( @@ -1561,12 +1698,15 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), + "verifyPasskey": + MessageLookupByLibrary.simpleMessage("Vérifier le code d\'accès"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Vérifier le mot de passe"), "verifying": MessageLookupByLibrary.simpleMessage("Validation en cours..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Vérification de la clé de récupération..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("Informations vidéo"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("vidéo"), "videos": MessageLookupByLibrary.simpleMessage("Vidéos"), "viewActiveSessions": MessageLookupByLibrary.simpleMessage( @@ -1576,6 +1716,8 @@ class MessageLookup extends MessageLookupByLibrary { "viewAll": MessageLookupByLibrary.simpleMessage("Tout afficher"), "viewAllExifData": MessageLookupByLibrary.simpleMessage( "Visualiser toutes les données EXIF"), + "viewLargeFiles": + MessageLookupByLibrary.simpleMessage("Fichiers volumineux"), "viewLogs": MessageLookupByLibrary.simpleMessage("Afficher les journaux"), "viewRecoveryKey": @@ -1583,6 +1725,10 @@ class MessageLookup extends MessageLookupByLibrary { "viewer": MessageLookupByLibrary.simpleMessage("Observateur"), "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Veuillez visiter web.ente.io pour gérer votre abonnement"), + "waitingForVerification": MessageLookupByLibrary.simpleMessage( + "En attente de vérification..."), + "waitingForWifi": MessageLookupByLibrary.simpleMessage( + "En attente de connexion Wi-Fi..."), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("Nous sommes open source !"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": @@ -1591,6 +1737,7 @@ class MessageLookup extends MessageLookupByLibrary { "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Securité Faible"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bienvenue !"), + "whatsNew": MessageLookupByLibrary.simpleMessage("Nouveautés"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Oui"), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart new file mode 100644 index 0000000000..6c1d7e4d90 --- /dev/null +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a gu locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'gu'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart new file mode 100644 index 0000000000..e27bbe712b --- /dev/null +++ b/mobile/lib/generated/intl/messages_he.dart @@ -0,0 +1,975 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a he locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'he'; + + static String m4(count) => + "${Intl.plural(count, one: 'הוסף פריט', two: 'הוסף פריטים', many: 'הוסף פריטים', other: 'הוסף פריטים')}"; + + static String m9(count) => + "${Intl.plural(count, zero: 'אין משתתפים', one: '1 משתתף', two: '${count} משתתפים', many: '${count} משתתפים', other: '${count} משתתפים')}"; + + static String m12(paymentProvider) => + "אנא בטל את המנוי הקיים מ-${paymentProvider} קודם"; + + static String m13(user) => + "${user} לא יוכל להוסיף עוד תמונות לאלבום זה\n\nהם עדיין יכולו להסיר תמונות קיימות שנוספו על ידיהם"; + + static String m14(isFamilyMember, storageAmountInGb) => + "${Intl.select(isFamilyMember, { + 'true': 'קיבלת ${storageAmountInGb} GB עד כה', + 'false': 'קיבלת ${storageAmountInGb} GB עד כה', + 'other': 'קיבלת ${storageAmountInGb} GB עד כה!', + })}"; + + static String m16(familyAdminEmail) => + "אנא צור קשר עם ${familyAdminEmail} על מנת לנהל את המנוי שלך"; + + static String m17(provider) => + "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי ${provider}."; + + static String m19(count) => + "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', many: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; + + static String m20(currentlyDeleting, totalCount) => + "מוחק ${currentlyDeleting} / ${totalCount}"; + + static String m21(albumName) => + "זה יסיר את הלינק הפומבי שדרכו ניתן לגשת ל\"${albumName}\"."; + + static String m22(supportEmail) => + "אנא תשלח דוא\"ל ל${supportEmail} מהכתובת דוא\"ל שנרשמת איתה"; + + static String m24(count, formattedSize) => + "${count} קבצים, כל אחד ${formattedSize}"; + + static String m26(email) => + "לא נמצא חשבון ente ל-${email}.\n\nשלח להם הזמנה על מנת לשתף תמונות."; + + static String m29(storageAmountInGB) => + "${storageAmountInGB} GB כל פעם שמישהו נרשם עבור תוכנית בתשלום ומחיל את הקוד שלך"; + + static String m30(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; + + static String m35(count) => + "${Intl.plural(count, one: '${count} פריט', two: '${count} פריטים', many: '${count} פריטים', other: '${count} פריטים')}"; + + static String m36(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; + + static String m0(count, formattedCount) => + "${Intl.plural(count, one: '${formattedCount} זכרון', two: '${formattedCount} זכרונות', many: '${formattedCount} זכרונות', other: '${formattedCount} זכרונות')}"; + + static String m37(count) => + "${Intl.plural(count, one: 'הזז פריט', two: 'הזז פריטים', many: 'הזז פריטים', other: 'הזז פריטים')}"; + + static String m41(passwordStrengthValue) => + "חוזק הסיסמא: ${passwordStrengthValue}"; + + static String m42(providerName) => + "אנא דבר עם התמיכה של ${providerName} אם אתה חוייבת"; + + static String m46(storeName) => "דרג אותנו ב-${storeName}"; + + static String m47(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; + + static String m48(userEmail) => + "${userEmail} יוסר מהאלבום המשותף הזה\n\nגם תמונות שנוספו על ידיהם יוסרו מהאלבום"; + + static String m1(count) => "${count} נבחרו"; + + static String m51(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; + + static String m52(verificationID) => + "הנה מזהה האימות שלי: ${verificationID} עבור ente.io."; + + static String m2(verificationID) => + "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: ${verificationID}"; + + static String m54(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם ${numberOfPeople} אנשים', many: 'שותף עם ${numberOfPeople} אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; + + static String m55(emailIDs) => "הושתף ע\"י ${emailIDs}"; + + static String m56(fileType) => "${fileType} יימחק מהמכשיר שלך."; + + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; + + static String m62(endDate) => "המנוי שלך יבוטל ב-${endDate}"; + + static String m63(completed, total) => "${completed}/${total} זכרונות נשמרו"; + + static String m64(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; + + static String m65(email) => "זה מזהה האימות של ${email}"; + + static String m68(email) => "אמת ${email}"; + + static String m69(email) => "שלחנו דוא\"ל ל${email}"; + + static String m70(count) => + "${Intl.plural(count, one: 'לפני ${count} שנה', two: 'לפני ${count} שנים', many: 'לפני ${count} שנים', other: 'לפני ${count} שנים')}"; + + static String m71(storageSaved) => "הצלחת לפנות ${storageSaved}!"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "about": MessageLookupByLibrary.simpleMessage("אודות"), + "account": MessageLookupByLibrary.simpleMessage("חשבון"), + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("ברוך שובך!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "אני מבין שאם אאבד את הסיסמא, אני עלול לאבד את המידע שלי מכיוון שהמידע שלי מוצפן מקצה אל קצה."), + "activeSessions": + MessageLookupByLibrary.simpleMessage("חיבורים פעילים"), + "addANewEmail": MessageLookupByLibrary.simpleMessage("הוסף דוא\"ל חדש"), + "addCollaborator": + MessageLookupByLibrary.simpleMessage("הוסף משתף פעולה"), + "addItem": m4, + "addLocationButton": MessageLookupByLibrary.simpleMessage("הוסף"), + "addMore": MessageLookupByLibrary.simpleMessage("הוסף עוד"), + "addPhotos": MessageLookupByLibrary.simpleMessage("הוסף תמונות"), + "addToAlbum": MessageLookupByLibrary.simpleMessage("הוסף לאלבום"), + "addViewer": MessageLookupByLibrary.simpleMessage("הוסף צופה"), + "addedAs": MessageLookupByLibrary.simpleMessage("הוסף בתור"), + "addingToFavorites": + MessageLookupByLibrary.simpleMessage("מוסיף למועדפים..."), + "advanced": MessageLookupByLibrary.simpleMessage("מתקדם"), + "advancedSettings": MessageLookupByLibrary.simpleMessage("מתקדם"), + "after1Day": MessageLookupByLibrary.simpleMessage("אחרי יום 1"), + "after1Hour": MessageLookupByLibrary.simpleMessage("אחרי שעה 1"), + "after1Month": MessageLookupByLibrary.simpleMessage("אחרי חודש 1"), + "after1Week": MessageLookupByLibrary.simpleMessage("אחרי שבוע 1"), + "after1Year": MessageLookupByLibrary.simpleMessage("אחרי שנה 1"), + "albumOwner": MessageLookupByLibrary.simpleMessage("בעלים"), + "albumParticipantsCount": m9, + "albumTitle": MessageLookupByLibrary.simpleMessage("כותרת האלבום"), + "albumUpdated": MessageLookupByLibrary.simpleMessage("האלבום עודכן"), + "albums": MessageLookupByLibrary.simpleMessage("אלבומים"), + "allClear": MessageLookupByLibrary.simpleMessage("✨ הכל נוקה"), + "allMemoriesPreserved": + MessageLookupByLibrary.simpleMessage("כל הזכרונות נשמרו"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "בנוסף אפשר לאנשים עם הלינק להוסיף תמונות לאלבום המשותף."), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("אפשר הוספת תמונות"), + "allowDownloads": MessageLookupByLibrary.simpleMessage("אפשר הורדות"), + "allowPeopleToAddPhotos": + MessageLookupByLibrary.simpleMessage("תן לאנשים להוסיף תמונות"), + "androidBiometricSuccess": + MessageLookupByLibrary.simpleMessage("הצלחה"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("בטל"), + "androidIosWebDesktop": MessageLookupByLibrary.simpleMessage( + "Android, iOS, דפדפן, שולחן עבודה"), + "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), + "apply": MessageLookupByLibrary.simpleMessage("החל"), + "applyCodeTitle": MessageLookupByLibrary.simpleMessage("החל קוד"), + "appstoreSubscription": + MessageLookupByLibrary.simpleMessage("מנוי AppStore"), + "archive": MessageLookupByLibrary.simpleMessage("שמירה בארכיון"), + "areYouSureThatYouWantToLeaveTheFamily": + MessageLookupByLibrary.simpleMessage( + "אתה בטוח שאתה רוצה לעזוב את התוכנית המשפתחית?"), + "areYouSureYouWantToCancel": + MessageLookupByLibrary.simpleMessage("אתה בטוח שאתה רוצה לבטל?"), + "areYouSureYouWantToChangeYourPlan": + MessageLookupByLibrary.simpleMessage( + "אתה בטוח שאתה רוצה לשנות את התוכנית שלך?"), + "areYouSureYouWantToExit": + MessageLookupByLibrary.simpleMessage("האם אתה בטוח שברצונך לצאת?"), + "areYouSureYouWantToLogout": + MessageLookupByLibrary.simpleMessage("אתה בטוח שאתה רוצה להתנתק?"), + "areYouSureYouWantToRenew": + MessageLookupByLibrary.simpleMessage("אתה בטוח שאתה רוצה לחדש?"), + "askCancelReason": MessageLookupByLibrary.simpleMessage( + "המנוי שלך בוטל. תרצה לשתף את הסיבה?"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "מה הסיבה העיקרית שבגללה אתה מוחק את החשבון שלך?"), + "atAFalloutShelter": + MessageLookupByLibrary.simpleMessage("במקלט גרעיני"), + "authToChangeEmailVerificationSetting": + MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת לשנות את הדוא\"ל שלך"), + "authToChangeLockscreenSetting": MessageLookupByLibrary.simpleMessage( + "אנא התאמת כדי לשנות את הגדרות מסך הנעילה"), + "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( + "אנא אנא התאמת על מנת לשנות את הדוא\"ל שלך"), + "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת לשנות את הסיסמא שלך"), + "authToConfigureTwofactorAuthentication": + MessageLookupByLibrary.simpleMessage( + "אנא התאמת כדי להגדיר את האימות הדו-גורמי"), + "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת להתחיל את מחיקת החשבון שלך"), + "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת לראות את החיבורים הפעילים שלך"), + "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת לראות את הקבצים החבויים שלך"), + "authToViewYourMemories": MessageLookupByLibrary.simpleMessage( + "אנא אמת על מנת לצפות בזכרונות שלך"), + "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "אנא התאמת על מנת לראות את מפתח השחזור שלך"), + "available": MessageLookupByLibrary.simpleMessage("זמין"), + "backedUpFolders": MessageLookupByLibrary.simpleMessage("תיקיות שגובו"), + "backup": MessageLookupByLibrary.simpleMessage("גיבוי"), + "backupFailed": MessageLookupByLibrary.simpleMessage("הגיבוי נכשל"), + "backupOverMobileData": + MessageLookupByLibrary.simpleMessage("גבה על רשת סלולרית"), + "backupSettings": MessageLookupByLibrary.simpleMessage("הגדרות גיבוי"), + "backupVideos": MessageLookupByLibrary.simpleMessage("גבה סרטונים"), + "blog": MessageLookupByLibrary.simpleMessage("בלוג"), + "cachedData": MessageLookupByLibrary.simpleMessage("נתונים מוטמנים"), + "canNotUploadToAlbumsOwnedByOthers": + MessageLookupByLibrary.simpleMessage( + "לא ניתן להעלות לאלבומים שבבעלות אחרים"), + "canOnlyCreateLinkForFilesOwnedByYou": + MessageLookupByLibrary.simpleMessage( + "ניתן אך ורק ליצור קישור לקבצים שאתה בבעולתם"), + "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( + "יכול להסיר רק קבצים שבבעלותך"), + "cancel": MessageLookupByLibrary.simpleMessage("בטל"), + "cancelOtherSubscription": m12, + "cancelSubscription": MessageLookupByLibrary.simpleMessage("בטל מנוי"), + "cannotAddMorePhotosAfterBecomingViewer": m13, + "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( + "לא ניתן למחוק את הקבצים המשותפים"), + "changeEmail": MessageLookupByLibrary.simpleMessage("שנה דוא\"ל"), + "changePassword": MessageLookupByLibrary.simpleMessage("שנה סיסמה"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("שנה סיסמה"), + "changePermissions": MessageLookupByLibrary.simpleMessage("שנה הרשאה?"), + "checkForUpdates": MessageLookupByLibrary.simpleMessage("בדוק עדכונים"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "אנא בדוק את תיבת הדואר שלך (והספאם) כדי להשלים את האימות"), + "checking": MessageLookupByLibrary.simpleMessage("בודק..."), + "claimFreeStorage": + MessageLookupByLibrary.simpleMessage("תבע מקום אחסון בחינם"), + "claimMore": MessageLookupByLibrary.simpleMessage("תבע עוד!"), + "claimed": MessageLookupByLibrary.simpleMessage("נתבע"), + "claimedStorageSoFar": m14, + "click": MessageLookupByLibrary.simpleMessage("• לחץ"), + "close": MessageLookupByLibrary.simpleMessage("סגור"), + "clubByCaptureTime": + MessageLookupByLibrary.simpleMessage("קבץ לפי זמן הצילום"), + "clubByFileName": + MessageLookupByLibrary.simpleMessage("קבץ לפי שם הקובץ"), + "codeAppliedPageTitle": + MessageLookupByLibrary.simpleMessage("הקוד הוחל"), + "codeCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("הקוד הועתק ללוח"), + "codeUsedByYou": + MessageLookupByLibrary.simpleMessage("הקוד שומש על ידיך"), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "צור קישור על מנת לאפשר לאנשים להוסיף ולצפות בתמונות באלבום ששיתפת בלי צורך באפליקציית ente או חשבון. נהדר לאיסוף תמונות של אירועים."), + "collaborativeLink": + MessageLookupByLibrary.simpleMessage("קישור לשיתוף פעולה"), + "collaborator": MessageLookupByLibrary.simpleMessage("משתף פעולה"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "משתפי פעולה יכולים להוסיף תמונות וסרטונים לאלבום המשותף."), + "collageLayout": MessageLookupByLibrary.simpleMessage("פריסה"), + "collageSaved": + MessageLookupByLibrary.simpleMessage("הקולז נשמר לגלריה"), + "collectEventPhotos": + MessageLookupByLibrary.simpleMessage("אסף תמונות מאירוע"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("אסוף תמונות"), + "color": MessageLookupByLibrary.simpleMessage("צבע"), + "confirm": MessageLookupByLibrary.simpleMessage("אשר"), + "confirm2FADisable": MessageLookupByLibrary.simpleMessage( + "האם אתה בטוח שאתה רוצה להשבית את האימות הדו-גורמי?"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("אשר את מחיקת החשבון"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "כן, אני רוצה למחוק לצמיתות את החשבון הזה וכל המידע שלו."), + "confirmPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), + "confirmPlanChange": + MessageLookupByLibrary.simpleMessage("אשר שינוי תוכנית"), + "confirmRecoveryKey": + MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), + "confirmYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), + "contactFamilyAdmin": m16, + "contactSupport": + MessageLookupByLibrary.simpleMessage("צור קשר עם התמיכה"), + "contactToManageSubscription": m17, + "continueLabel": MessageLookupByLibrary.simpleMessage("המשך"), + "continueOnFreeTrial": + MessageLookupByLibrary.simpleMessage("המשך עם ניסיון חינמי"), + "copyLink": MessageLookupByLibrary.simpleMessage("העתק קישור"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "תעתיק ותדביק את הקוד הזה\nלאפליקציית האימות שלך"), + "couldNotBackUpTryLater": MessageLookupByLibrary.simpleMessage( + "לא יכולנו לגבות את המידע שלך.\nאנא נסה שוב מאוחר יותר."), + "couldNotUpdateSubscription": + MessageLookupByLibrary.simpleMessage("לא ניתן לעדכן את המנוי"), + "count": MessageLookupByLibrary.simpleMessage("כמות"), + "create": MessageLookupByLibrary.simpleMessage("צור"), + "createAccount": MessageLookupByLibrary.simpleMessage("צור חשבון"), + "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( + "לחץ לחיצה ארוכה על מנת לבחור תמונות ולחץ על + על מנת ליצור אלבום"), + "createCollage": MessageLookupByLibrary.simpleMessage("צור קולז"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("צור חשבון חדש"), + "createOrSelectAlbum": + MessageLookupByLibrary.simpleMessage("צור או בחר אלבום"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("צור קישור ציבורי"), + "creatingLink": MessageLookupByLibrary.simpleMessage("יוצר קישור..."), + "criticalUpdateAvailable": + MessageLookupByLibrary.simpleMessage("עדכון חשוב זמין"), + "currentUsageIs": MessageLookupByLibrary.simpleMessage( + "השימוש במקום האחסון כרגע הוא "), + "custom": MessageLookupByLibrary.simpleMessage("מותאם אישית"), + "darkTheme": MessageLookupByLibrary.simpleMessage("כהה"), + "dayToday": MessageLookupByLibrary.simpleMessage("היום"), + "dayYesterday": MessageLookupByLibrary.simpleMessage("אתמול"), + "decrypting": MessageLookupByLibrary.simpleMessage("מפענח..."), + "decryptingVideo": + MessageLookupByLibrary.simpleMessage("מפענח את הסרטון..."), + "deduplicateFiles": + MessageLookupByLibrary.simpleMessage("הסר קבצים כפולים"), + "delete": MessageLookupByLibrary.simpleMessage("מחק"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("מחק חשבון"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "אנחנו מצטערים לראות שאתה עוזב. אנא תחלוק את המשוב שלך כדי לעזור לנו להשתפר."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("מחק את החשבון לצמיתות"), + "deleteAlbum": MessageLookupByLibrary.simpleMessage("מחק אלבום"), + "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( + "גם להסיר תמונות (וסרטונים) שנמצאים באלבום הזה מכל שאר האלבומים שהם שייכים אליהם?"), + "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( + "זה ימחק את כל האלבומים הריקים. זה שימושי כשאתה רוצה להפחית את כמות האי סדר ברשימת האלבומים שלך."), + "deleteAll": MessageLookupByLibrary.simpleMessage("מחק הכל"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "אנא תשלח דוא\"ל לaccount-deletion@ente.io מהכתובת דוא\"ל שנרשמת איתה."), + "deleteEmptyAlbums": + MessageLookupByLibrary.simpleMessage("למחוק אלבומים ריקים"), + "deleteEmptyAlbumsWithQuestionMark": + MessageLookupByLibrary.simpleMessage("למחוק אלבומים ריקים?"), + "deleteFromBoth": MessageLookupByLibrary.simpleMessage("מחק משניהם"), + "deleteFromDevice": MessageLookupByLibrary.simpleMessage("מחק מהמכשיר"), + "deleteItemCount": m19, + "deletePhotos": MessageLookupByLibrary.simpleMessage("מחק תמונות"), + "deleteProgress": m20, + "deleteReason1": + MessageLookupByLibrary.simpleMessage("חסר מאפיין מרכזי שאני צריך"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "היישומון או מאפיין מסוים לא מתנהג כמו שאני חושב שהוא צריך"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "מצאתי שירות אחר שאני יותר מחבב"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("הסיבה שלי לא כלולה"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "הבקשה שלך תועבד תוך 72 שעות."), + "deleteSharedAlbum": + MessageLookupByLibrary.simpleMessage("מחק את האלבום המשותף?"), + "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( + "האלבום הזה יימחק עבור כולם\n\nאתה תאבד גישה לתמונות משותפות באלבום הזה שבבעלות של אחרים"), + "deselectAll": MessageLookupByLibrary.simpleMessage("בטל בחירה של הכל"), + "designedToOutlive": + MessageLookupByLibrary.simpleMessage("עוצב על מנת לשרוד"), + "details": MessageLookupByLibrary.simpleMessage("פרטים"), + "disableAutoLock": + MessageLookupByLibrary.simpleMessage("השבת נעילה אוטומטית"), + "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( + "צופים יכולים עדיין לקחת צילומי מסך או לשמור עותק של התמונות שלך בעזרת כלים חיצוניים"), + "disableDownloadWarningTitle": + MessageLookupByLibrary.simpleMessage("שים לב"), + "disableLinkMessage": m21, + "disableTwofactor": + MessageLookupByLibrary.simpleMessage("השבת דו-גורמי"), + "discord": MessageLookupByLibrary.simpleMessage("Discord"), + "dismiss": MessageLookupByLibrary.simpleMessage("התעלם"), + "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("ק\"מ"), + "doThisLater": MessageLookupByLibrary.simpleMessage("מאוחר יותר"), + "done": MessageLookupByLibrary.simpleMessage("בוצע"), + "download": MessageLookupByLibrary.simpleMessage("הורד"), + "downloadFailed": MessageLookupByLibrary.simpleMessage("ההורדה נכשלה"), + "downloading": MessageLookupByLibrary.simpleMessage("מוריד..."), + "dropSupportEmail": m22, + "duplicateItemsGroup": m24, + "edit": MessageLookupByLibrary.simpleMessage("ערוך"), + "eligible": MessageLookupByLibrary.simpleMessage("זכאי"), + "email": MessageLookupByLibrary.simpleMessage("דוא\"ל"), + "emailNoEnteAccount": m26, + "emailVerificationToggle": + MessageLookupByLibrary.simpleMessage("אימות מייל"), + "empty": MessageLookupByLibrary.simpleMessage("ריק"), + "encryption": MessageLookupByLibrary.simpleMessage("הצפנה"), + "encryptionKeys": MessageLookupByLibrary.simpleMessage("מפתחות ההצפנה"), + "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( + "מוצפן מקצה אל קצה כברירת מחדל"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente צריך הרשאות על מנת לשמור את התמונות שלך"), + "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( + "אפשר להוסיף גם את המשפחה שלך לתוכנית."), + "enterAlbumName": MessageLookupByLibrary.simpleMessage("הזן שם אלבום"), + "enterCode": MessageLookupByLibrary.simpleMessage("הזן קוד"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "הכנס את הקוד שנמסר לך מחברך בשביל לקבל מקום אחסון בחינם עבורך ועבורו"), + "enterEmail": MessageLookupByLibrary.simpleMessage("הזן דוא\"ל"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "הזן סיסמא חדשה שנוכל להשתמש בה כדי להצפין את המידע שלך"), + "enterPassword": MessageLookupByLibrary.simpleMessage("הזן את הסיסמה"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "הזן סיסמא כדי שנוכל לפענח את המידע שלך"), + "enterReferralCode": + MessageLookupByLibrary.simpleMessage("הזן קוד הפניה"), + "enterThe6digitCodeFromnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "הכנס את הקוד בעל 6 ספרות מתוך\nאפליקציית האימות שלך"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "אנא הכנס כתובת דוא\"ל חוקית."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("הכנס את כתובת הדוא״ל שלך"), + "enterYourPassword": MessageLookupByLibrary.simpleMessage("הכנס סיסמא"), + "enterYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("הזן את מפתח השחזור שלך"), + "error": MessageLookupByLibrary.simpleMessage("שגיאה"), + "everywhere": MessageLookupByLibrary.simpleMessage("בכל מקום"), + "exif": MessageLookupByLibrary.simpleMessage("EXIF"), + "existingUser": MessageLookupByLibrary.simpleMessage("משתמש קיים"), + "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( + "פג תוקף הקישור. אנא בחר בתאריך תפוגה חדש או השבת את תאריך התפוגה של הקישור."), + "exportLogs": MessageLookupByLibrary.simpleMessage("ייצוא לוגים"), + "exportYourData": + MessageLookupByLibrary.simpleMessage("ייצוא הנתונים שלך"), + "failedToApplyCode": + MessageLookupByLibrary.simpleMessage("נכשל בהחלת הקוד"), + "failedToCancel": MessageLookupByLibrary.simpleMessage("הביטול נכשל"), + "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( + "אחזור פרטי ההפניה נכשל. אנא נסה שוב מאוחר יותר."), + "failedToLoadAlbums": + MessageLookupByLibrary.simpleMessage("נכשל בטעינת האלבומים"), + "failedToRenew": MessageLookupByLibrary.simpleMessage("החידוש נכשל"), + "failedToVerifyPaymentStatus": + MessageLookupByLibrary.simpleMessage("נכשל באימות סטטוס התשלום"), + "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("משפחה"), + "familyPlans": MessageLookupByLibrary.simpleMessage("תוכניות משפחה"), + "faq": MessageLookupByLibrary.simpleMessage("שאלות נפוצות"), + "faqs": MessageLookupByLibrary.simpleMessage("שאלות נפוצות"), + "favorite": MessageLookupByLibrary.simpleMessage("מועדף"), + "feedback": MessageLookupByLibrary.simpleMessage("משוב"), + "fileFailedToSaveToGallery": + MessageLookupByLibrary.simpleMessage("נכשל בעת שמירת הקובץ לגלריה"), + "fileSavedToGallery": + MessageLookupByLibrary.simpleMessage("הקובץ נשמר לגלריה"), + "flip": MessageLookupByLibrary.simpleMessage("הפוך"), + "forYourMemories": + MessageLookupByLibrary.simpleMessage("עבור הזכורונות שלך"), + "forgotPassword": MessageLookupByLibrary.simpleMessage("שכחתי סיסמה"), + "freeStorageClaimed": + MessageLookupByLibrary.simpleMessage("מקום אחסון בחינם נתבע"), + "freeStorageOnReferralSuccess": m29, + "freeStorageUsable": + MessageLookupByLibrary.simpleMessage("מקום אחסון שמיש"), + "freeTrial": MessageLookupByLibrary.simpleMessage("ניסיון חינמי"), + "freeTrialValidTill": m30, + "freeUpDeviceSpace": + MessageLookupByLibrary.simpleMessage("פנה אחסון במכשיר"), + "freeUpSpace": MessageLookupByLibrary.simpleMessage("פנה מקום"), + "general": MessageLookupByLibrary.simpleMessage("כללי"), + "generatingEncryptionKeys": + MessageLookupByLibrary.simpleMessage("יוצר מפתחות הצפנה..."), + "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), + "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( + "נא לתת גישה לכל התמונות בתוך ההגדרות של הטלפון"), + "grantPermission": MessageLookupByLibrary.simpleMessage("הענק הרשאה"), + "hidden": MessageLookupByLibrary.simpleMessage("מוסתר"), + "hide": MessageLookupByLibrary.simpleMessage("הסתר"), + "hiding": MessageLookupByLibrary.simpleMessage("מחביא..."), + "howItWorks": MessageLookupByLibrary.simpleMessage("איך זה עובד"), + "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( + "אנא בקש מהם ללחוץ לחיצה ארוכה על הכתובת אימייל שלהם בעמוד ההגדרות, וודא שהמזההים בשני המכשירים תואמים."), + "iOSOkButton": MessageLookupByLibrary.simpleMessage("אישור"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("התעלם"), + "importing": MessageLookupByLibrary.simpleMessage("מייבא...."), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("סיסמא לא נכונה"), + "incorrectRecoveryKeyBody": + MessageLookupByLibrary.simpleMessage("המפתח שחזור שהזנת שגוי"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("מפתח שחזור שגוי"), + "insecureDevice": + MessageLookupByLibrary.simpleMessage("מכשיר בלתי מאובטח"), + "installManually": + MessageLookupByLibrary.simpleMessage("התקן באופן ידני"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("כתובת דוא״ל לא תקינה"), + "invalidKey": MessageLookupByLibrary.simpleMessage("מפתח לא חוקי"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "מפתח השחזור שהזמנת אינו תקין. אנא וודא שהוא מכיל 24 מילים, ותבדוק את האיות של כל אחת.\n\nאם הכנסת קוד שחזור ישן, וודא שהוא בעל 64 אותיות, ותבדוק כל אחת מהן."), + "invite": MessageLookupByLibrary.simpleMessage("הזמן"), + "inviteYourFriends": + MessageLookupByLibrary.simpleMessage("הזמן את חברייך"), + "itemCount": m35, + "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( + "הפריטים שנבחרו יוסרו מהאלבום הזה"), + "keepPhotos": MessageLookupByLibrary.simpleMessage("השאר תמונות"), + "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("ק\"מ"), + "kindlyHelpUsWithThisInformation": + MessageLookupByLibrary.simpleMessage("אנא עזור לנו עם המידע הזה"), + "language": MessageLookupByLibrary.simpleMessage("שפה"), + "lastUpdated": MessageLookupByLibrary.simpleMessage("עדכון אחרון"), + "leave": MessageLookupByLibrary.simpleMessage("עזוב"), + "leaveAlbum": MessageLookupByLibrary.simpleMessage("צא מהאלבום"), + "leaveFamily": MessageLookupByLibrary.simpleMessage("עזוב משפחה"), + "leaveSharedAlbum": + MessageLookupByLibrary.simpleMessage("לעזוב את האלבום המשותף?"), + "light": MessageLookupByLibrary.simpleMessage("אור"), + "lightTheme": MessageLookupByLibrary.simpleMessage("בהיר"), + "linkCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("הקישור הועתק ללוח"), + "linkDeviceLimit": + MessageLookupByLibrary.simpleMessage("מגבלת כמות מכשירים"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("מאופשר"), + "linkExpired": MessageLookupByLibrary.simpleMessage("פג תוקף"), + "linkExpiresOn": m36, + "linkExpiry": MessageLookupByLibrary.simpleMessage("תאריך תפוגה ללינק"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("הקישור פג תוקף"), + "linkNeverExpires": MessageLookupByLibrary.simpleMessage("לעולם לא"), + "location": MessageLookupByLibrary.simpleMessage("מקום"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("נעל"), + "lockscreen": MessageLookupByLibrary.simpleMessage("מסך נעילה"), + "logInLabel": MessageLookupByLibrary.simpleMessage("התחבר"), + "loggingOut": MessageLookupByLibrary.simpleMessage("מתנתק..."), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "על ידי לחיצה על התחברות, אני מסכים לתנאי שירות ולמדיניות הפרטיות"), + "logout": MessageLookupByLibrary.simpleMessage("התנתק"), + "longpressOnAnItemToViewInFullscreen": + MessageLookupByLibrary.simpleMessage( + "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא"), + "lostDevice": MessageLookupByLibrary.simpleMessage("איבדת את המכשיר?"), + "manage": MessageLookupByLibrary.simpleMessage("נהל"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("נהל את מקום אחסון המכשיר"), + "manageFamily": MessageLookupByLibrary.simpleMessage("נהל משפחה"), + "manageLink": MessageLookupByLibrary.simpleMessage("ניהול קישור"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("נהל"), + "manageSubscription": MessageLookupByLibrary.simpleMessage("נהל מנוי"), + "map": MessageLookupByLibrary.simpleMessage("מפה"), + "maps": MessageLookupByLibrary.simpleMessage("מפות"), + "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), + "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), + "memoryCount": m0, + "merchandise": MessageLookupByLibrary.simpleMessage("סחורה"), + "mobileWebDesktop": + MessageLookupByLibrary.simpleMessage("פלאפון, דפדפן, שולחן עבודה"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("מתונה"), + "monthly": MessageLookupByLibrary.simpleMessage("חודשי"), + "moveItem": m37, + "moveToAlbum": MessageLookupByLibrary.simpleMessage("הזז לאלבום"), + "movedToTrash": MessageLookupByLibrary.simpleMessage("הועבר לאשפה"), + "movingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("מעביר קבצים לאלבום..."), + "name": MessageLookupByLibrary.simpleMessage("שם"), + "never": MessageLookupByLibrary.simpleMessage("לעולם לא"), + "newAlbum": MessageLookupByLibrary.simpleMessage("אלבום חדש"), + "newest": MessageLookupByLibrary.simpleMessage("החדש ביותר"), + "no": MessageLookupByLibrary.simpleMessage("לא"), + "noDeviceLimit": MessageLookupByLibrary.simpleMessage("אין"), + "noDeviceThatCanBeDeleted": MessageLookupByLibrary.simpleMessage( + "אין לך קבצים במכשיר הזה שניתן למחוק אותם"), + "noDuplicates": MessageLookupByLibrary.simpleMessage("✨ אין כפילויות"), + "noPhotosAreBeingBackedUpRightNow": + MessageLookupByLibrary.simpleMessage( + "אף תמונה אינה נמצאת בתהליך גיבוי כרגע"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("אין מפתח שחזור?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "בשל טבע הפרוטוקול של ההצפנת קצה-אל-קצה שלנו, אין אפשרות לפענח את הנתונים שלך בלי הסיסמה או מפתח השחזור שלך"), + "noResults": MessageLookupByLibrary.simpleMessage("אין תוצאות"), + "notifications": MessageLookupByLibrary.simpleMessage("התראות"), + "ok": MessageLookupByLibrary.simpleMessage("אוקיי"), + "onDevice": MessageLookupByLibrary.simpleMessage("על המכשיר"), + "onEnte": + MessageLookupByLibrary.simpleMessage("באנטע"), + "oops": MessageLookupByLibrary.simpleMessage("אופס"), + "oopsSomethingWentWrong": + MessageLookupByLibrary.simpleMessage("אופס, משהו השתבש"), + "openSettings": MessageLookupByLibrary.simpleMessage("פתח הגדרות"), + "optionalAsShortAsYouLike": + MessageLookupByLibrary.simpleMessage("אופציונלי, קצר ככל שתרצה..."), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("או בחר באחד קיים"), + "password": MessageLookupByLibrary.simpleMessage("סיסמא"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("הססמה הוחלפה בהצלחה"), + "passwordLock": MessageLookupByLibrary.simpleMessage("נעילת סיסמא"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "אנחנו לא שומרים את הסיסמא הזו, לכן אם אתה שוכח אותה, אנחנו לא יכולים לפענח את המידע שלך"), + "paymentDetails": MessageLookupByLibrary.simpleMessage("פרטי תשלום"), + "paymentFailed": MessageLookupByLibrary.simpleMessage("התשלום נכשל"), + "paymentFailedTalkToProvider": m42, + "peopleUsingYourCode": + MessageLookupByLibrary.simpleMessage("אנשים משתמשים בקוד שלך"), + "permanentlyDelete": + MessageLookupByLibrary.simpleMessage("למחוק לצמיתות?"), + "photoGridSize": + MessageLookupByLibrary.simpleMessage("גודל לוח של התמונה"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("תמונה"), + "playstoreSubscription": + MessageLookupByLibrary.simpleMessage("מנוי PlayStore"), + "pleaseContactSupportAndWeWillBeHappyToHelp": + MessageLookupByLibrary.simpleMessage( + "אנא צור קשר עם support@ente.io ואנחנו נשמח לעזור!"), + "pleaseGrantPermissions": + MessageLookupByLibrary.simpleMessage("נא הענק את ההרשאות"), + "pleaseLoginAgain": + MessageLookupByLibrary.simpleMessage("אנא התחבר שוב"), + "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("אנא נסה שנית"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("אנא המתן..."), + "pleaseWaitForSometimeBeforeRetrying": + MessageLookupByLibrary.simpleMessage( + "אנא חכה מעט לפני שאתה מנסה שוב"), + "preparingLogs": MessageLookupByLibrary.simpleMessage("מכין לוגים..."), + "preserveMore": MessageLookupByLibrary.simpleMessage("שמור עוד"), + "pressAndHoldToPlayVideo": MessageLookupByLibrary.simpleMessage( + "לחץ והחזק על מנת להריץ את הסרטון"), + "pressAndHoldToPlayVideoDetailed": MessageLookupByLibrary.simpleMessage( + "לחץ והחזק על התמונה על מנת להריץ את הסרטון"), + "privacy": MessageLookupByLibrary.simpleMessage("פרטיות"), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("מדיניות פרטיות"), + "privateBackups": + MessageLookupByLibrary.simpleMessage("גיבויים פרטיים"), + "privateSharing": MessageLookupByLibrary.simpleMessage("שיתוף פרטי"), + "publicLinkCreated": + MessageLookupByLibrary.simpleMessage("קישור ציבורי נוצר"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("לינק ציבורי אופשר"), + "radius": MessageLookupByLibrary.simpleMessage("רדיוס"), + "raiseTicket": MessageLookupByLibrary.simpleMessage("צור ticket"), + "rateTheApp": MessageLookupByLibrary.simpleMessage("דרג את האפליקציה"), + "rateUs": MessageLookupByLibrary.simpleMessage("דרג אותנו"), + "rateUsOnStore": m46, + "recover": MessageLookupByLibrary.simpleMessage("שחזר"), + "recoverAccount": MessageLookupByLibrary.simpleMessage("שחזר חשבון"), + "recoverButton": MessageLookupByLibrary.simpleMessage("שחזר"), + "recoveryKey": MessageLookupByLibrary.simpleMessage("מפתח שחזור"), + "recoveryKeyCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("מפתח השחזור הועתק ללוח"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "אם אתה שוכח את הסיסמא שלך, הדרך היחידה שתוכל לשחזר את המידע שלך היא עם המפתח הזה."), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "אנחנו לא מאחסנים את המפתח הזה, אנא שמור את המפתח 24 מילים הזה במקום בטוח."), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "נהדר! מפתח השחזור תקין. אנחנו מודים לך על האימות.\n\nאנא תזכור לגבות את מפתח השחזור שלך באופן בטוח."), + "recoveryKeyVerified": + MessageLookupByLibrary.simpleMessage("מפתח השחזור אומת"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "מפתח השחזור שלך הוא הדרך היחידה לשחזר את התמונות שלך במקרה ותשכח את הסיסמא שלך. אתה יכול למצוא את מפתח השחזור שלך ב-הגדרות > אבטחה.\n\nאנא הכנס את מפתח השחזור שלך כאן על מנת לוודא ששמרת אותו כשורה."), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("השחזור עבר בהצלחה!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "המכשיר הנוכחי אינו חזק מספיק כדי לאמת את הסיסמא שלך, אבל אנחנו יכולים ליצור בצורה שתעבוד עם כל המכשירים.\n\nאנא התחבר בעזרת המפתח שחזור שלך וצור מחדש את הסיסמא שלך (אתה יכול להשתמש באותה אחת אם אתה רוצה)."), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("צור סיסמא מחדש"), + "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), + "referralStep1": MessageLookupByLibrary.simpleMessage( + "1. תמסור את הקוד הזה לחברייך"), + "referralStep2": MessageLookupByLibrary.simpleMessage( + "2. הם נרשמים עבור תוכנית בתשלום"), + "referralStep3": m47, + "referrals": MessageLookupByLibrary.simpleMessage("הפניות"), + "referralsAreCurrentlyPaused": + MessageLookupByLibrary.simpleMessage("הפניות כרגע מושהות"), + "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( + "גם נקה \"נמחק לאחרונה\" מ-\"הגדרות\" -> \"אחסון\" על מנת לקבל המקום אחסון שהתפנה"), + "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( + "גם נקה את ה-\"אשפה\" שלך על מנת לקבל את המקום אחסון שהתפנה"), + "remove": MessageLookupByLibrary.simpleMessage("הסר"), + "removeDuplicates": + MessageLookupByLibrary.simpleMessage("הסר כפילויות"), + "removeFromAlbum": MessageLookupByLibrary.simpleMessage("הסר מהאלבום"), + "removeFromAlbumTitle": + MessageLookupByLibrary.simpleMessage("הסר מהאלבום?"), + "removeLink": MessageLookupByLibrary.simpleMessage("הסרת קישור"), + "removeParticipant": MessageLookupByLibrary.simpleMessage("הסר משתתף"), + "removeParticipantBody": m48, + "removePublicLink": + MessageLookupByLibrary.simpleMessage("הסר לינק ציבורי"), + "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( + "חלק מהפריטים שאתה מסיר הוספו על ידי אנשים אחרים, ואתה תאבד גישה אליהם"), + "removeWithQuestionMark": MessageLookupByLibrary.simpleMessage("הסר?"), + "removingFromFavorites": + MessageLookupByLibrary.simpleMessage("מסיר מהמועדפים..."), + "rename": MessageLookupByLibrary.simpleMessage("שנה שם"), + "renameFile": MessageLookupByLibrary.simpleMessage("שנה שם הקובץ"), + "renewSubscription": MessageLookupByLibrary.simpleMessage("חדש מנוי"), + "reportABug": MessageLookupByLibrary.simpleMessage("דווח על באג"), + "reportBug": MessageLookupByLibrary.simpleMessage("דווח על באג"), + "resendEmail": MessageLookupByLibrary.simpleMessage("שלח דוא\"ל מחדש"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("איפוס סיסמה"), + "restore": MessageLookupByLibrary.simpleMessage("שחזר"), + "restoreToAlbum": MessageLookupByLibrary.simpleMessage("שחזר לאלבום"), + "restoringFiles": + MessageLookupByLibrary.simpleMessage("משחזר קבצים..."), + "retry": MessageLookupByLibrary.simpleMessage("נסה שוב"), + "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( + "אנא בחן והסר את הפריטים שאתה מאמין שהם כפלים."), + "rotateLeft": MessageLookupByLibrary.simpleMessage("סובב שמאלה"), + "safelyStored": MessageLookupByLibrary.simpleMessage("נשמר באופן בטוח"), + "save": MessageLookupByLibrary.simpleMessage("שמור"), + "saveCollage": MessageLookupByLibrary.simpleMessage("שמור קולז"), + "saveCopy": MessageLookupByLibrary.simpleMessage("שמירת עותק"), + "saveKey": MessageLookupByLibrary.simpleMessage("שמור מפתח"), + "saveYourRecoveryKeyIfYouHaventAlready": + MessageLookupByLibrary.simpleMessage( + "שמור את מפתח השחזור שלך אם לא שמרת כבר"), + "saving": MessageLookupByLibrary.simpleMessage("שומר..."), + "scanCode": MessageLookupByLibrary.simpleMessage("סרוק קוד"), + "scanThisBarcodeWithnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "סרוק את הברקוד הזה\nבעזרת אפליקציית האימות שלך"), + "searchByAlbumNameHint": + MessageLookupByLibrary.simpleMessage("שם האלבום"), + "security": MessageLookupByLibrary.simpleMessage("אבטחה"), + "selectAlbum": MessageLookupByLibrary.simpleMessage("בחר אלבום"), + "selectAll": MessageLookupByLibrary.simpleMessage("בחר הכל"), + "selectFoldersForBackup": + MessageLookupByLibrary.simpleMessage("בחר תיקיות לגיבוי"), + "selectMorePhotos": + MessageLookupByLibrary.simpleMessage("בחר תמונות נוספות"), + "selectReason": MessageLookupByLibrary.simpleMessage("בחר סיבה"), + "selectYourPlan": MessageLookupByLibrary.simpleMessage("בחר תוכנית"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage( + "התיקיות שנבחרו יוצפנו ויגובו"), + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, + "send": MessageLookupByLibrary.simpleMessage("שלח"), + "sendEmail": MessageLookupByLibrary.simpleMessage("שלח דוא\"ל"), + "sendInvite": MessageLookupByLibrary.simpleMessage("שלח הזמנה"), + "sendLink": MessageLookupByLibrary.simpleMessage("שלח קישור"), + "sessionExpired": + MessageLookupByLibrary.simpleMessage("פג תוקף החיבור"), + "setAPassword": MessageLookupByLibrary.simpleMessage("הגדר סיסמה"), + "setAs": MessageLookupByLibrary.simpleMessage("הגדר בתור"), + "setCover": MessageLookupByLibrary.simpleMessage("הגדר כרקע"), + "setLabel": MessageLookupByLibrary.simpleMessage("הגדר"), + "setPasswordTitle": MessageLookupByLibrary.simpleMessage("הגדר סיסמא"), + "setRadius": MessageLookupByLibrary.simpleMessage("הגדר רדיוס"), + "setupComplete": MessageLookupByLibrary.simpleMessage("ההתקנה הושלמה"), + "share": MessageLookupByLibrary.simpleMessage("שתף"), + "shareALink": MessageLookupByLibrary.simpleMessage("שתף קישור"), + "shareAnAlbumNow": + MessageLookupByLibrary.simpleMessage("שתף אלבום עכשיו"), + "shareLink": MessageLookupByLibrary.simpleMessage("שתף קישור"), + "shareMyVerificationID": m52, + "shareOnlyWithThePeopleYouWant": + MessageLookupByLibrary.simpleMessage("שתף רק אם אנשים שאתה בוחר"), + "shareTextConfirmOthersVerificationID": m2, + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "הורד את ente על מנת שנוכל לשתף תמונות וסרטונים באיכות המקור באופן קל\n\nhttps://ente.io"), + "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( + "שתף עם משתמשים שהם לא של ente"), + "shareWithPeopleSectionTitle": m54, + "shareYourFirstAlbum": + MessageLookupByLibrary.simpleMessage("שתף את האלבום הראשון שלך"), + "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( + "צור אלבומים הניתנים לשיתוף ושיתוף פעולה עם משתמשי ente אחרים, כולל משתמשים בתוכניות החינמיות."), + "sharedByMe": MessageLookupByLibrary.simpleMessage("שותף על ידי"), + "sharedPhotoNotifications": + MessageLookupByLibrary.simpleMessage("אלבומים משותפים חדשים"), + "sharedPhotoNotificationsExplanation": + MessageLookupByLibrary.simpleMessage( + "קבל התראות כשמישהו מוסיף תמונה לאלבום משותף שאתה חלק ממנו"), + "sharedWith": m55, + "sharedWithMe": MessageLookupByLibrary.simpleMessage("שותף איתי"), + "sharing": MessageLookupByLibrary.simpleMessage("משתף..."), + "showMemories": MessageLookupByLibrary.simpleMessage("הצג זכרונות"), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "אני מסכים לתנאי שירות ולמדיניות הפרטיות"), + "singleFileDeleteFromDevice": m56, + "singleFileDeleteHighlight": + MessageLookupByLibrary.simpleMessage("זה יימחק מכל האלבומים."), + "skip": MessageLookupByLibrary.simpleMessage("דלג"), + "social": MessageLookupByLibrary.simpleMessage("חברתי"), + "someoneSharingAlbumsWithYouShouldSeeTheSameId": + MessageLookupByLibrary.simpleMessage( + "מי שמשתף איתך אלבומים יוכל לראות את אותו המזהה במכשיר שלהם."), + "somethingWentWrong": + MessageLookupByLibrary.simpleMessage("משהו השתבש"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage("משהו השתבש, אנא נסה שנית"), + "sorry": MessageLookupByLibrary.simpleMessage("מצטער"), + "sorryCouldNotAddToFavorites": MessageLookupByLibrary.simpleMessage( + "סליחה, לא ניתן להוסיף למועדפים!"), + "sorryCouldNotRemoveFromFavorites": + MessageLookupByLibrary.simpleMessage( + "סליחה, לא ניתן להסיר מהמועדפים!"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "אנחנו מצטערים, לא הצלחנו ליצור מפתחות מאובטחים על מכשיר זה.\n\nאנא הירשם ממכשיר אחר."), + "sortAlbumsBy": MessageLookupByLibrary.simpleMessage("מיין לפי"), + "sortOldestFirst": + MessageLookupByLibrary.simpleMessage("הישן ביותר קודם"), + "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ הצלחה"), + "startBackup": MessageLookupByLibrary.simpleMessage("התחל גיבוי"), + "storage": MessageLookupByLibrary.simpleMessage("אחסון"), + "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("משפחה"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("אתה"), + "storageInGB": m59, + "storageLimitExceeded": + MessageLookupByLibrary.simpleMessage("גבול מקום האחסון נחרג"), + "strongStrength": MessageLookupByLibrary.simpleMessage("חזקה"), + "subWillBeCancelledOn": m62, + "subscribe": MessageLookupByLibrary.simpleMessage("הרשם"), + "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( + "נראה שהמנוי שלך עומד לפוג. אנא הירשם כדי לאפשר שיתוף."), + "subscription": MessageLookupByLibrary.simpleMessage("מנוי"), + "success": MessageLookupByLibrary.simpleMessage("הצלחה"), + "suggestFeatures": + MessageLookupByLibrary.simpleMessage("הציעו מאפיינים"), + "support": MessageLookupByLibrary.simpleMessage("תמיכה"), + "syncProgress": m63, + "syncing": MessageLookupByLibrary.simpleMessage("מסנכרן..."), + "systemTheme": MessageLookupByLibrary.simpleMessage("מערכת"), + "tapToCopy": MessageLookupByLibrary.simpleMessage("הקש כדי להעתיק"), + "tapToEnterCode": + MessageLookupByLibrary.simpleMessage("הקש כדי להזין את הקוד"), + "terminate": MessageLookupByLibrary.simpleMessage("סיים"), + "terminateSession": MessageLookupByLibrary.simpleMessage("סיים חיבור?"), + "terms": MessageLookupByLibrary.simpleMessage("תנאים"), + "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("תנאים"), + "thankYou": MessageLookupByLibrary.simpleMessage("תודה"), + "thankYouForSubscribing": + MessageLookupByLibrary.simpleMessage("תודה שנרשמת!"), + "theDownloadCouldNotBeCompleted": + MessageLookupByLibrary.simpleMessage("לא ניתן להשלים את ההורדה"), + "theme": MessageLookupByLibrary.simpleMessage("ערכת נושא"), + "theyAlsoGetXGb": m64, + "thisCanBeUsedToRecoverYourAccountIfYou": + MessageLookupByLibrary.simpleMessage( + "זה יכול לשמש לשחזור החשבון שלך במקרה ותאבד את הגורם השני"), + "thisDevice": MessageLookupByLibrary.simpleMessage("מכשיר זה"), + "thisIsPersonVerificationId": m65, + "thisIsYourVerificationId": + MessageLookupByLibrary.simpleMessage("זה מזהה האימות שלך"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage("זה ינתק אותך מהמכשיר הבא:"), + "thisWillLogYouOutOfThisDevice": + MessageLookupByLibrary.simpleMessage("זה ינתק אותך במכשיר זה!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "כדי לאפס את הסיסמא שלך, אנא אמת את האימייל שלך קודם."), + "total": MessageLookupByLibrary.simpleMessage("סך הכל"), + "totalSize": MessageLookupByLibrary.simpleMessage("גודל כולל"), + "trash": MessageLookupByLibrary.simpleMessage("אשפה"), + "tryAgain": MessageLookupByLibrary.simpleMessage("נסה שוב"), + "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), + "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( + "חודשיים בחינם בתוכניות שנתיות"), + "twofactor": MessageLookupByLibrary.simpleMessage("דו-גורמי"), + "twofactorAuthenticationPageTitle": + MessageLookupByLibrary.simpleMessage("אימות דו-גורמי"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage("אימות דו-שלבי"), + "unarchive": MessageLookupByLibrary.simpleMessage("הוצאה מארכיון"), + "uncategorized": MessageLookupByLibrary.simpleMessage("ללא קטגוריה"), + "unhide": MessageLookupByLibrary.simpleMessage("בטל הסתרה"), + "unhideToAlbum": + MessageLookupByLibrary.simpleMessage("בטל הסתרה בחזרה לאלבום"), + "unhidingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("מבטל הסתרת הקבצים לאלבום"), + "unlock": MessageLookupByLibrary.simpleMessage("ביטול נעילה"), + "unselectAll": MessageLookupByLibrary.simpleMessage("בטל בחירה של הכל"), + "update": MessageLookupByLibrary.simpleMessage("עדכן"), + "updateAvailable": MessageLookupByLibrary.simpleMessage("עדכון זמין"), + "updatingFolderSelection": + MessageLookupByLibrary.simpleMessage("מעדכן את בחירת התיקיות..."), + "upgrade": MessageLookupByLibrary.simpleMessage("שדרג"), + "uploadingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("מעלה קבצים לאלבום..."), + "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( + "כמות האחסון השמישה שלך מוגבלת בתוכנית הנוכחית. אחסון עודף יהפוך שוב לשמיש אחרי שתשדרג את התוכנית שלך."), + "useRecoveryKey": + MessageLookupByLibrary.simpleMessage("השתמש במפתח שחזור"), + "usedSpace": MessageLookupByLibrary.simpleMessage("מקום בשימוש"), + "verificationId": MessageLookupByLibrary.simpleMessage("מזהה אימות"), + "verify": MessageLookupByLibrary.simpleMessage("אמת"), + "verifyEmail": MessageLookupByLibrary.simpleMessage("אימות דוא\"ל"), + "verifyEmailID": m68, + "verifyIDLabel": MessageLookupByLibrary.simpleMessage("אמת"), + "verifyPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), + "verifyingRecoveryKey": + MessageLookupByLibrary.simpleMessage("מוודא את מפתח השחזור..."), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("וידאו"), + "viewActiveSessions": + MessageLookupByLibrary.simpleMessage("צפה בחיבורים פעילים"), + "viewAll": MessageLookupByLibrary.simpleMessage("הצג הכל"), + "viewLogs": MessageLookupByLibrary.simpleMessage("צפייה בלוגים"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("צפה במפתח השחזור"), + "viewer": MessageLookupByLibrary.simpleMessage("צפיין"), + "visitWebToManage": MessageLookupByLibrary.simpleMessage( + "אנא בקר ב-web.ente.io על מנת לנהל את המנוי שלך"), + "weAreOpenSource": + MessageLookupByLibrary.simpleMessage("הקוד שלנו פתוח!"), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("חלשה"), + "welcomeBack": MessageLookupByLibrary.simpleMessage("ברוך שובך!"), + "yearly": MessageLookupByLibrary.simpleMessage("שנתי"), + "yearsAgo": m70, + "yes": MessageLookupByLibrary.simpleMessage("כן"), + "yesCancel": MessageLookupByLibrary.simpleMessage("כן, בטל"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("כן, המר לצפיין"), + "yesDelete": MessageLookupByLibrary.simpleMessage("כן, מחק"), + "yesLogout": MessageLookupByLibrary.simpleMessage("כן, התנתק"), + "yesRemove": MessageLookupByLibrary.simpleMessage("כן, הסר"), + "yesRenew": MessageLookupByLibrary.simpleMessage("כן, חדש"), + "you": MessageLookupByLibrary.simpleMessage("אתה"), + "youAreOnAFamilyPlan": + MessageLookupByLibrary.simpleMessage("אתה על תוכנית משפחתית!"), + "youAreOnTheLatestVersion": + MessageLookupByLibrary.simpleMessage("אתה על הגרסא הכי עדכנית"), + "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( + "* אתה יכול במקסימום להכפיל את מקום האחסון שלך"), + "youCanManageYourLinksInTheShareTab": + MessageLookupByLibrary.simpleMessage( + "אתה יכול לנהת את הקישורים שלך בלשונית שיתוף."), + "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( + "אתה לא יכול לשנמך לתוכנית הזו"), + "youCannotShareWithYourself": + MessageLookupByLibrary.simpleMessage("אתה לא יכול לשתף עם עצמך"), + "youHaveSuccessfullyFreedUp": m71, + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("החשבון שלך נמחק"), + "yourPlanWasSuccessfullyDowngraded": + MessageLookupByLibrary.simpleMessage("התוכנית שלך שונמכה בהצלחה"), + "yourPlanWasSuccessfullyUpgraded": + MessageLookupByLibrary.simpleMessage("התוכנית שלך שודרגה בהצלחה"), + "yourPurchaseWasSuccessful": + MessageLookupByLibrary.simpleMessage("התשלום שלך עבר בהצלחה"), + "yourStorageDetailsCouldNotBeFetched": + MessageLookupByLibrary.simpleMessage( + "לא ניתן לאחזר את פרטי מקום האחסון"), + "yourSubscriptionHasExpired": + MessageLookupByLibrary.simpleMessage("פג תוקף המנוי שלך"), + "yourSubscriptionWasUpdatedSuccessfully": + MessageLookupByLibrary.simpleMessage("המנוי שלך עודכן בהצלחה"), + "youveNoDuplicateFilesThatCanBeCleared": + MessageLookupByLibrary.simpleMessage( + "אין לך קבצים כפולים שניתן לנקות אותם") + }; +} diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart new file mode 100644 index 0000000000..ce390ea7e0 --- /dev/null +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -0,0 +1,113 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a hi locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'hi'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("आपका पुनः स्वागत है"), + "activeSessions": MessageLookupByLibrary.simpleMessage("एक्टिव सेशन"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "आपका अकाउंट हटाने का मुख्य कारण क्या है?"), + "cancel": MessageLookupByLibrary.simpleMessage("रद्द करें"), + "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( + "अकाउंट डिलीट करने की पुष्टि करें"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "हां, मैं इस अकाउंट और इसके सभी डेटा को स्थायी रूप से हटाना चाहता/चाहती हूं।"), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("पासवर्ड की पुष्टि करें"), + "createAccount": MessageLookupByLibrary.simpleMessage("अकाउंट बनायें"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("नया अकाउंट बनाएँ"), + "decrypting": + MessageLookupByLibrary.simpleMessage("डिक्रिप्ट हो रहा है..."), + "deleteAccount": + MessageLookupByLibrary.simpleMessage("अकाउंट डिलीट करें"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "आपको जाता हुए देख कर हमें खेद है। कृपया हमें बेहतर बनने में सहायता के लिए अपनी प्रतिक्रिया साझा करें।"), + "deleteAccountPermanentlyButton": MessageLookupByLibrary.simpleMessage( + "अकाउंट स्थायी रूप से डिलीट करें"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "कृपया account-deletion@ente.io पर अपने पंजीकृत ईमेल एड्रेस से ईमेल भेजें।"), + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "इसमें एक मुख्य विशेषता गायब है जिसकी मुझे आवश्यकता है"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "यह ऐप या इसका कोई एक फीचर मेरे विचारानुसार काम नहीं करता है"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "मुझे कहीं और कोई दूरी सेवा मिली जो मुझे बेहतर लगी"), + "deleteReason4": MessageLookupByLibrary.simpleMessage( + "मेरा कारण इस लिस्ट में नहीं है"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "आपका अनुरोध 72 घंटों के भीतर संसाधित किया जाएगा।"), + "email": MessageLookupByLibrary.simpleMessage("ईमेल"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente को आपकी तस्वीरों को संरक्षित करने के लिए अनुमति की आवश्यकता है"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "कृपया वैद्य ईमेल ऐड्रेस डालें"), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("अपना ईमेल ऐड्रेस डालें"), + "enterYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("अपनी रिकवरी कुंजी दर्ज करें"), + "feedback": MessageLookupByLibrary.simpleMessage("प्रतिपुष्टि"), + "forgotPassword": + MessageLookupByLibrary.simpleMessage("पासवर्ड भूल गए"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "आपके द्वारा दर्ज रिकवरी कुंजी ग़लत है"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("रिकवरी कुंजी ग़लत है"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("अमान्य ईमेल ऐड्रेस"), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "कृपया हमें इस जानकारी के लिए सहायता करें"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("रिकवरी कुंजी नहीं है?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है"), + "ok": MessageLookupByLibrary.simpleMessage("ठीक है"), + "oops": MessageLookupByLibrary.simpleMessage("ओह!"), + "password": MessageLookupByLibrary.simpleMessage("पासवर्ड"), + "recoverButton": MessageLookupByLibrary.simpleMessage("पुनः प्राप्त"), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("रिकवरी सफल हुई!"), + "selectReason": MessageLookupByLibrary.simpleMessage("कारण चुनें"), + "sendEmail": MessageLookupByLibrary.simpleMessage("ईमेल भेजें"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "कुछ गड़बड़ हुई है। कृपया दोबारा प्रयास करें।"), + "sorry": MessageLookupByLibrary.simpleMessage("क्षमा करें!"), + "terminate": MessageLookupByLibrary.simpleMessage("रद्द करें"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("सेशन रद्द करें?"), + "thisDevice": MessageLookupByLibrary.simpleMessage("यह डिवाइस"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "इससे आप इन डिवाइसों से लॉग आउट हो जाएँगे:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "इससे आप इस डिवाइस से लॉग आउट हो जाएँगे!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।"), + "verify": MessageLookupByLibrary.simpleMessage("सत्यापित करें"), + "verifyEmail": + MessageLookupByLibrary.simpleMessage("ईमेल सत्यापित करें"), + "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( + "आपका अकाउंट डिलीट कर दिया गया है") + }; +} diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart new file mode 100644 index 0000000000..3d0cee4c14 --- /dev/null +++ b/mobile/lib/generated/intl/messages_id.dart @@ -0,0 +1,1448 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a id locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'id'; + + static String m3(count) => + "${Intl.plural(count, other: 'Tambahkan kolaborator')}"; + + static String m4(count) => "${Intl.plural(count, other: 'Tambahkan item')}"; + + static String m7(emailOrName) => "Ditambahkan oleh ${emailOrName}"; + + static String m8(albumName) => "Berhasil ditambahkan ke ${albumName}"; + + static String m9(count) => + "${Intl.plural(count, zero: '0 Peserta', one: '1 Peserta', other: '${count} Peserta')}"; + + static String m10(versionValue) => "Versi: ${versionValue}"; + + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} tersedia"; + + static String m13(user) => + "${user} tidak akan dapat menambahkan foto lagi di album ini\n\nMereka masih dapat menghapus foto yang sudah ada yang ditambahkan oleh mereka"; + + static String m14(isFamilyMember, storageAmountInGb) => + "${Intl.select(isFamilyMember, { + 'true': + 'Keluargamu saat ini telah memperoleh ${storageAmountInGb} GB', + 'false': 'Kamu saat ini telah memperoleh ${storageAmountInGb} GB', + 'other': 'Kamu saat ini telah memperoleh ${storageAmountInGb} GB!', + })}"; + + static String m15(albumName) => "Link kolaborasi terbuat untuk ${albumName}"; + + static String m16(familyAdminEmail) => + "Silakan hubungi ${familyAdminEmail} untuk mengatur langgananmu"; + + static String m17(provider) => + "Silakan hubungi kami di support@ente.io untuk mengatur langganan ${provider} kamu."; + + static String m18(endpoint) => "Terhubung ke ${endpoint}"; + + static String m19(count) => + "${Intl.plural(count, one: 'Hapus ${count} item', other: 'Hapus ${count} item')}"; + + static String m20(currentlyDeleting, totalCount) => + "Menghapus ${currentlyDeleting} / ${totalCount}"; + + static String m21(albumName) => + "Ini akan menghapus link publik yang digunakan untuk mengakses \"${albumName}\"."; + + static String m22(supportEmail) => + "Silakan kirimkan email ke ${supportEmail} dari alamat email terdaftar kamu"; + + static String m23(count, storageSaved) => + "Kamu telah menghapus ${Intl.plural(count, other: '${count} file duplikat')} dan membersihkan (${storageSaved}!)"; + + static String m25(newEmail) => "Email diubah menjadi ${newEmail}"; + + static String m26(email) => + "${email} tidak punya akun Ente.\n\nUndang dia untuk berbagi foto."; + + static String m27(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} file')} di perangkat ini telah berhasil dicadangkan"; + + static String m28(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} file')} dalam album ini telah berhasil dicadangkan"; + + static String m29(storageAmountInGB) => + "${storageAmountInGB} GB setiap kali orang mendaftar dengan paket berbayar lalu menerapkan kode milikmu"; + + static String m30(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; + + static String m31(count) => + "Kamu masih bisa mengakses ${Intl.plural(count, other: 'filenya')} di Ente selama kamu masih berlangganan"; + + static String m32(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; + + static String m33(count, formattedSize) => + "${Intl.plural(count, other: 'File tersebut bisa dihapus dari perangkat ini untuk membersihkan ${formattedSize}')}"; + + static String m34(currentlyProcessing, totalCount) => + "Memproses ${currentlyProcessing} / ${totalCount}"; + + static String m35(count) => "${Intl.plural(count, other: '${count} item')}"; + + static String m36(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; + + static String m0(count, formattedCount) => + "${Intl.plural(count, zero: 'tanpa kenangan', one: '${formattedCount} kenangan', other: '${formattedCount} kenangan')}"; + + static String m37(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; + + static String m38(albumName) => "Berhasil dipindahkan ke ${albumName}"; + + static String m40(familyAdminEmail) => + "Harap hubungi ${familyAdminEmail} untuk mengubah kode kamu."; + + static String m41(passwordStrengthValue) => + "Keamanan sandi: ${passwordStrengthValue}"; + + static String m43(endDate) => + "Percobaan gratis berlaku hingga ${endDate}.\nKamu dapat memilih paket berbayar setelahnya."; + + static String m44(toEmail) => "Silakan kirimi kami email di ${toEmail}"; + + static String m45(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; + + static String m46(storeName) => "Beri nilai di ${storeName}"; + + static String m47(storageInGB) => + "3. Kalian berdua mendapat ${storageInGB} GB* gratis"; + + static String m48(userEmail) => + "${userEmail} akan dikeluarkan dari album berbagi ini\n\nSemua foto yang ia tambahkan juga akan dihapus dari album ini"; + + static String m49(endDate) => "Langganan akan diperpanjang pada ${endDate}"; + + static String m50(count) => + "${Intl.plural(count, other: '${count} hasil ditemukan')}"; + + static String m1(count) => "${count} terpilih"; + + static String m51(count, yourCount) => + "${count} dipilih (${yourCount} milikmu)"; + + static String m52(verificationID) => + "Ini ID Verifikasi saya di ente.io: ${verificationID}."; + + static String m2(verificationID) => + "Halo, bisakah kamu pastikan bahwa ini adalah ID Verifikasi ente.io milikmu: ${verificationID}"; + + static String m53(referralCode, referralStorageInGB) => + "Kode rujukan Ente: ${referralCode} \n\nTerapkan pada Pengaturan → Umum → Rujukan untuk mendapatkan ${referralStorageInGB} GB gratis setelah kamu mendaftar paket berbayar\n\nhttps://ente.io"; + + static String m54(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: 'Bagikan dengan orang tertentu', one: 'Berbagi dengan 1 orang', other: 'Berbagi dengan ${numberOfPeople} orang')}"; + + static String m55(emailIDs) => "Dibagikan dengan ${emailIDs}"; + + static String m56(fileType) => + "${fileType} ini akan dihapus dari perangkat ini."; + + static String m57(fileType) => + "${fileType} ini tersimpan di Ente dan juga di perangkat ini."; + + static String m58(fileType) => "${fileType} ini akan dihapus dari Ente."; + + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; + + static String m60( + usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => + "${usedAmount} ${usedStorageUnit} dari ${totalAmount} ${totalStorageUnit} terpakai"; + + static String m61(id) => + "${id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan ${id} kamu untuk akun ini, silahkan hubungi tim bantuan kami"; + + static String m62(endDate) => + "Langganan kamu akan dibatalkan pada ${endDate}"; + + static String m64(storageAmountInGB) => + "Ia juga mendapat ${storageAmountInGB} GB"; + + static String m65(email) => "Ini adalah ID Verifikasi milik ${email}"; + + static String m66(count) => + "${Intl.plural(count, zero: '', one: '1 hari', other: '${count} hari')}"; + + static String m67(endDate) => "Berlaku hingga ${endDate}"; + + static String m68(email) => "Verifikasi ${email}"; + + static String m69(email) => + "Kami telah mengirimkan email ke ${email}"; + + static String m70(count) => + "${Intl.plural(count, other: '${count} tahun lalu')}"; + + static String m71(storageSaved) => + "Kamu telah berhasil membersihkan ${storageSaved}!"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( + "Versi baru dari Ente telah tersedia."), + "account": MessageLookupByLibrary.simpleMessage("Akun"), + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "Saya mengerti bahwa jika saya lupa sandi saya, data saya bisa hilang karena dienkripsi dari ujung ke ujung."), + "activeSessions": MessageLookupByLibrary.simpleMessage("Sesi aktif"), + "addAName": MessageLookupByLibrary.simpleMessage("Tambahkan nama"), + "addANewEmail": + MessageLookupByLibrary.simpleMessage("Tambah email baru"), + "addCollaborator": + MessageLookupByLibrary.simpleMessage("Tambah kolaborator"), + "addCollaborators": m3, + "addFromDevice": + MessageLookupByLibrary.simpleMessage("Tambahkan dari perangkat"), + "addItem": m4, + "addLocation": MessageLookupByLibrary.simpleMessage("Tambah tempat"), + "addLocationButton": MessageLookupByLibrary.simpleMessage("Tambah"), + "addMore": MessageLookupByLibrary.simpleMessage("Tambah lagi"), + "addPhotos": MessageLookupByLibrary.simpleMessage("Tambah foto"), + "addSelected": + MessageLookupByLibrary.simpleMessage("Tambahkan yang dipilih"), + "addToAlbum": MessageLookupByLibrary.simpleMessage("Tambah ke album"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Tambah ke Ente"), + "addToHiddenAlbum": + MessageLookupByLibrary.simpleMessage("Tambah ke album tersembunyi"), + "addViewer": MessageLookupByLibrary.simpleMessage("Tambahkan pemirsa"), + "addedAs": MessageLookupByLibrary.simpleMessage("Ditambahkan sebagai"), + "addedBy": m7, + "addedSuccessfullyTo": m8, + "addingToFavorites": + MessageLookupByLibrary.simpleMessage("Menambahkan ke favorit..."), + "advanced": MessageLookupByLibrary.simpleMessage("Lanjutan"), + "advancedSettings": MessageLookupByLibrary.simpleMessage("Lanjutan"), + "after1Day": MessageLookupByLibrary.simpleMessage("Setelah 1 hari"), + "after1Hour": MessageLookupByLibrary.simpleMessage("Setelah 1 jam"), + "after1Month": MessageLookupByLibrary.simpleMessage("Setelah 1 bulan"), + "after1Week": MessageLookupByLibrary.simpleMessage("Setelah 1 minggu"), + "after1Year": MessageLookupByLibrary.simpleMessage("Setelah 1 tahun"), + "albumOwner": MessageLookupByLibrary.simpleMessage("Pemilik"), + "albumParticipantsCount": m9, + "albumTitle": MessageLookupByLibrary.simpleMessage("Judul album"), + "albumUpdated": + MessageLookupByLibrary.simpleMessage("Album diperbarui"), + "albums": MessageLookupByLibrary.simpleMessage("Album"), + "allClear": MessageLookupByLibrary.simpleMessage("✨ Sudah bersih"), + "allMemoriesPreserved": + MessageLookupByLibrary.simpleMessage("Semua kenangan terpelihara"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Izinkan orang yang memiliki link untuk menambahkan foto ke album berbagi ini."), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("Izinkan menambah foto"), + "allowDownloads": + MessageLookupByLibrary.simpleMessage("Izinkan pengunduhan"), + "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( + "Izinkan orang lain menambahkan foto"), + "androidBiometricHint": + MessageLookupByLibrary.simpleMessage("Verifikasi identitas"), + "androidBiometricNotRecognized": + MessageLookupByLibrary.simpleMessage("Tidak dikenal. Coba lagi."), + "androidBiometricRequiredTitle": + MessageLookupByLibrary.simpleMessage("Biometrik diperlukan"), + "androidBiometricSuccess": + MessageLookupByLibrary.simpleMessage("Berhasil"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("Batal"), + "androidGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Autentikasi biometrik belum aktif di perangkatmu. Buka \'Setelan > Keamanan\' untuk mengaktifkan autentikasi biometrik."), + "androidIosWebDesktop": + MessageLookupByLibrary.simpleMessage("Android, iOS, Web, Desktop"), + "androidSignInTitle": + MessageLookupByLibrary.simpleMessage("Autentikasi diperlukan"), + "appVersion": m10, + "appleId": MessageLookupByLibrary.simpleMessage("ID Apple"), + "apply": MessageLookupByLibrary.simpleMessage("Terapkan"), + "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Terapkan kode"), + "archive": MessageLookupByLibrary.simpleMessage("Arsip"), + "archiveAlbum": MessageLookupByLibrary.simpleMessage("Arsipkan album"), + "archiving": MessageLookupByLibrary.simpleMessage("Mengarsipkan..."), + "areYouSureThatYouWantToLeaveTheFamily": + MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin meninggalkan paket keluarga ini?"), + "areYouSureYouWantToCancel": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin membatalkan?"), + "areYouSureYouWantToChangeYourPlan": + MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin mengubah paket kamu?"), + "areYouSureYouWantToExit": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin keluar?"), + "areYouSureYouWantToLogout": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin keluar akun?"), + "areYouSureYouWantToRenew": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin memperpanjang?"), + "askCancelReason": MessageLookupByLibrary.simpleMessage( + "Langganan kamu telah dibatalkan. Apakah kamu ingin membagikan alasannya?"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "Apa alasan utama kamu dalam menghapus akun?"), + "atAFalloutShelter": + MessageLookupByLibrary.simpleMessage("di tempat pengungsian"), + "authToChangeEmailVerificationSetting": + MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk mengatur verifikasi email"), + "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk mengubah email kamu"), + "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk mengubah sandi kamu"), + "authToConfigureTwofactorAuthentication": + MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk mengatur autentikasi dua langkah"), + "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk mulai penghapusan akun"), + "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk melihat sesi aktif kamu"), + "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk melihat file tersembunyi kamu"), + "authToViewYourMemories": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk melihat kenanganmu"), + "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Harap autentikasi untuk melihat kunci pemulihan kamu"), + "authenticationFailedPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Autentikasi gagal, silakan coba lagi"), + "authenticationSuccessful": + MessageLookupByLibrary.simpleMessage("Autentikasi berhasil!"), + "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( + "Perangkat Cast yang tersedia akan ditampilkan di sini."), + "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( + "Pastikan izin Jaringan Lokal untuk app Ente Foto aktif di Pengaturan."), + "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( + "Akibat kesalahan teknis, kamu telah keluar dari akunmu. Kami mohon maaf atas ketidaknyamanannya."), + "autoPair": MessageLookupByLibrary.simpleMessage("Taut otomatis"), + "autoPairDesc": MessageLookupByLibrary.simpleMessage( + "Taut otomatis hanya tersedia di perangkat yang mendukung Chromecast."), + "available": MessageLookupByLibrary.simpleMessage("Tersedia"), + "availableStorageSpace": m11, + "backedUpFolders": + MessageLookupByLibrary.simpleMessage("Folder yang dicadangkan"), + "backup": MessageLookupByLibrary.simpleMessage("Pencadangan"), + "backupFailed": + MessageLookupByLibrary.simpleMessage("Pencadangan gagal"), + "backupOverMobileData": MessageLookupByLibrary.simpleMessage( + "Cadangkan dengan data seluler"), + "backupSettings": + MessageLookupByLibrary.simpleMessage("Pengaturan pencadangan"), + "backupVideos": MessageLookupByLibrary.simpleMessage("Cadangkan video"), + "blackFridaySale": + MessageLookupByLibrary.simpleMessage("Penawaran Black Friday"), + "blog": MessageLookupByLibrary.simpleMessage("Blog"), + "cachedData": MessageLookupByLibrary.simpleMessage("Data cache"), + "calculating": MessageLookupByLibrary.simpleMessage("Menghitung..."), + "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( + "Hanya dapat menghapus berkas yang dimiliki oleh mu"), + "cancel": MessageLookupByLibrary.simpleMessage("Batal"), + "cancelSubscription": + MessageLookupByLibrary.simpleMessage("Batalkan langganan"), + "cannotAddMorePhotosAfterBecomingViewer": m13, + "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( + "Harap pastikan kamu berada pada jaringan yang sama dengan TV-nya."), + "castIPMismatchTitle": + MessageLookupByLibrary.simpleMessage("Gagal mentransmisikan album"), + "castInstruction": MessageLookupByLibrary.simpleMessage( + "Buka cast.ente.io pada perangkat yang ingin kamu tautkan.\n\nMasukkan kode yang ditampilkan untuk memutar album di TV."), + "change": MessageLookupByLibrary.simpleMessage("Ganti"), + "changeEmail": MessageLookupByLibrary.simpleMessage("Ubah email"), + "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( + "Ubah lokasi pada item terpilih?"), + "changePassword": MessageLookupByLibrary.simpleMessage("Ubah sandi"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("Ubah sandi"), + "changePermissions": MessageLookupByLibrary.simpleMessage("Ubah izin?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Ganti kode rujukan kamu"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "Silakan periksa kotak masuk (serta kotak spam) untuk menyelesaikan verifikasi"), + "checking": MessageLookupByLibrary.simpleMessage("Memeriksa..."), + "claimFreeStorage": + MessageLookupByLibrary.simpleMessage("Peroleh kuota gratis"), + "claimMore": + MessageLookupByLibrary.simpleMessage("Peroleh lebih banyak!"), + "claimed": MessageLookupByLibrary.simpleMessage("Diperoleh"), + "claimedStorageSoFar": m14, + "click": MessageLookupByLibrary.simpleMessage("• Click"), + "close": MessageLookupByLibrary.simpleMessage("Tutup"), + "codeAppliedPageTitle": + MessageLookupByLibrary.simpleMessage("Kode diterapkan"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Maaf, anda telah mencapai batas rubah kode."), + "codeCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("Kode tersalin ke papan klip"), + "codeUsedByYou": MessageLookupByLibrary.simpleMessage( + "Kode yang telah kamu gunakan"), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "Buat link untuk memungkinkan orang lain menambahkan dan melihat foto yang ada pada album bersama kamu tanpa memerlukan app atau akun Ente. Ideal untuk mengumpulkan foto pada suatu acara."), + "collaborativeLink": + MessageLookupByLibrary.simpleMessage("Link kolaborasi"), + "collaborativeLinkCreatedFor": m15, + "collaborator": MessageLookupByLibrary.simpleMessage("Kolaborator"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "Kolaborator bisa menambahkan foto dan video ke album bersama ini."), + "collectEventPhotos": + MessageLookupByLibrary.simpleMessage("Kumpulkan foto acara"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Kumpulkan foto"), + "color": MessageLookupByLibrary.simpleMessage("Warna"), + "confirm": MessageLookupByLibrary.simpleMessage("Konfirmasi"), + "confirm2FADisable": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin menonaktifkan autentikasi dua langkah?"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("Konfirmasi Penghapusan Akun"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "Ya, saya ingin menghapus akun ini dan seluruh data yang terkait secara permanen."), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("Konfirmasi sandi"), + "confirmPlanChange": + MessageLookupByLibrary.simpleMessage("Konfirmasi perubahan paket"), + "confirmRecoveryKey": + MessageLookupByLibrary.simpleMessage("Konfirmasi kunci pemulihan"), + "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Konfirmasi kunci pemulihan kamu"), + "connectToDevice": + MessageLookupByLibrary.simpleMessage("Hubungkan ke perangkat"), + "contactFamilyAdmin": m16, + "contactSupport": + MessageLookupByLibrary.simpleMessage("Hubungi dukungan"), + "contactToManageSubscription": m17, + "contacts": MessageLookupByLibrary.simpleMessage("Kontak"), + "continueLabel": MessageLookupByLibrary.simpleMessage("Lanjut"), + "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( + "Lanjut dengan percobaan gratis"), + "convertToAlbum": + MessageLookupByLibrary.simpleMessage("Ubah menjadi album"), + "copyEmailAddress": + MessageLookupByLibrary.simpleMessage("Salin alamat email"), + "copyLink": MessageLookupByLibrary.simpleMessage("Salin link"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Salin lalu tempel kode ini\ndi app autentikator kamu"), + "couldNotBackUpTryLater": MessageLookupByLibrary.simpleMessage( + "Kami tidak dapat mencadangkan data kamu.\nKami akan coba lagi nanti."), + "couldNotFreeUpSpace": MessageLookupByLibrary.simpleMessage( + "Tidak dapat membersihkan ruang"), + "count": MessageLookupByLibrary.simpleMessage("Jumlah"), + "crashReporting": + MessageLookupByLibrary.simpleMessage("Pelaporan crash"), + "create": MessageLookupByLibrary.simpleMessage("Buat"), + "createAccount": MessageLookupByLibrary.simpleMessage("Buat akun"), + "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( + "Tekan dan tahan foto lalu klik + untuk membuat album baru"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("Buat link kolaborasi"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("Buat akun baru"), + "createOrSelectAlbum": + MessageLookupByLibrary.simpleMessage("Buat atau pilih album"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("Buat link publik"), + "creatingLink": MessageLookupByLibrary.simpleMessage("Membuat link..."), + "criticalUpdateAvailable": + MessageLookupByLibrary.simpleMessage("Pembaruan penting tersedia"), + "crop": MessageLookupByLibrary.simpleMessage("Potong"), + "currentUsageIs": + MessageLookupByLibrary.simpleMessage("Pemakaian saat ini sebesar "), + "custom": MessageLookupByLibrary.simpleMessage("Kustom"), + "customEndpoint": m18, + "darkTheme": MessageLookupByLibrary.simpleMessage("Gelap"), + "dayToday": MessageLookupByLibrary.simpleMessage("Hari Ini"), + "dayYesterday": MessageLookupByLibrary.simpleMessage("Kemarin"), + "decrypting": MessageLookupByLibrary.simpleMessage("Mendekripsi..."), + "decryptingVideo": + MessageLookupByLibrary.simpleMessage("Mendekripsi video..."), + "delete": MessageLookupByLibrary.simpleMessage("Hapus"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("Hapus akun"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "Kami sedih kamu pergi. Silakan bagikan masukanmu agar kami bisa jadi lebih baik."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("Hapus Akun Secara Permanen"), + "deleteAlbum": MessageLookupByLibrary.simpleMessage("Hapus album"), + "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( + "Hapus foto (dan video) yang ada dalam album ini dari semua album lain yang juga menampungnya?"), + "deleteAll": MessageLookupByLibrary.simpleMessage("Hapus Semua"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "Silakan kirim email ke account-deletion@ente.io dari alamat email kamu yang terdaftar."), + "deleteEmptyAlbums": + MessageLookupByLibrary.simpleMessage("Hapus album kosong"), + "deleteEmptyAlbumsWithQuestionMark": + MessageLookupByLibrary.simpleMessage("Hapus album yang kosong?"), + "deleteFromBoth": + MessageLookupByLibrary.simpleMessage("Hapus dari keduanya"), + "deleteFromDevice": + MessageLookupByLibrary.simpleMessage("Hapus dari perangkat ini"), + "deleteFromEnte": + MessageLookupByLibrary.simpleMessage("Hapus dari Ente"), + "deleteItemCount": m19, + "deletePhotos": MessageLookupByLibrary.simpleMessage("Hapus foto"), + "deleteProgress": m20, + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "Fitur penting yang saya perlukan tidak ada"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "App ini atau fitur tertentu tidak bekerja sesuai harapan saya"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "Saya menemukan layanan lain yang lebih baik"), + "deleteReason4": MessageLookupByLibrary.simpleMessage( + "Alasan saya tidak ada di daftar"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "Permintaan kamu akan diproses dalam waktu 72 jam."), + "deleteSharedAlbum": + MessageLookupByLibrary.simpleMessage("Hapus album bersama?"), + "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( + "Album ini akan di hapus untuk semua\n\nKamu akan kehilangan akses ke foto yang di bagikan dalam album ini yang di miliki oleh pengguna lain"), + "descriptions": MessageLookupByLibrary.simpleMessage("Keterangan"), + "designedToOutlive": + MessageLookupByLibrary.simpleMessage("Dibuat untuk melestarikan"), + "details": MessageLookupByLibrary.simpleMessage("Rincian"), + "developerSettings": + MessageLookupByLibrary.simpleMessage("Pengaturan pengembang"), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Apakah kamu yakin ingin mengubah pengaturan pengembang?"), + "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Masukkan kode"), + "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( + "File yang ditambahkan ke album perangkat ini akan diunggah ke Ente secara otomatis."), + "deviceNotFound": + MessageLookupByLibrary.simpleMessage("Perangkat tidak ditemukan"), + "didYouKnow": MessageLookupByLibrary.simpleMessage("Tahukah kamu?"), + "disableAutoLock": + MessageLookupByLibrary.simpleMessage("Nonaktifkan kunci otomatis"), + "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( + "Orang yang melihat masih bisa mengambil tangkapan layar atau menyalin foto kamu menggunakan alat eksternal"), + "disableDownloadWarningTitle": + MessageLookupByLibrary.simpleMessage("Harap dicatat"), + "disableLinkMessage": m21, + "disableTwofactor": MessageLookupByLibrary.simpleMessage( + "Nonaktifkan autentikasi dua langkah"), + "disablingTwofactorAuthentication": + MessageLookupByLibrary.simpleMessage( + "Menonaktifkan autentikasi dua langkah..."), + "discord": MessageLookupByLibrary.simpleMessage("Discord"), + "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("km"), + "doNotSignOut": + MessageLookupByLibrary.simpleMessage("Jangan keluarkan akun"), + "doThisLater": + MessageLookupByLibrary.simpleMessage("Lakukan lain kali"), + "doYouWantToDiscardTheEditsYouHaveMade": + MessageLookupByLibrary.simpleMessage( + "Apakah kamu ingin membuang edit yang telah kamu buat?"), + "done": MessageLookupByLibrary.simpleMessage("Selesai"), + "doubleYourStorage": + MessageLookupByLibrary.simpleMessage("Gandakan kuota kamu"), + "download": MessageLookupByLibrary.simpleMessage("Unduh"), + "downloadFailed": + MessageLookupByLibrary.simpleMessage("Gagal mengunduh"), + "downloading": MessageLookupByLibrary.simpleMessage("Mengunduh..."), + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "edit": MessageLookupByLibrary.simpleMessage("Edit"), + "editLocation": MessageLookupByLibrary.simpleMessage("Edit lokasi"), + "editLocationTagTitle": + MessageLookupByLibrary.simpleMessage("Edit lokasi"), + "editsSaved": + MessageLookupByLibrary.simpleMessage("Perubahan tersimpan"), + "editsToLocationWillOnlyBeSeenWithinEnte": + MessageLookupByLibrary.simpleMessage( + "Perubahan lokasi hanya akan terlihat di Ente"), + "eligible": MessageLookupByLibrary.simpleMessage("memenuhi syarat"), + "email": MessageLookupByLibrary.simpleMessage("Email"), + "emailChangedTo": m25, + "emailNoEnteAccount": m26, + "emailVerificationToggle": + MessageLookupByLibrary.simpleMessage("Verifikasi email"), + "empty": MessageLookupByLibrary.simpleMessage("Kosongkan"), + "emptyTrash": MessageLookupByLibrary.simpleMessage("Kosongkan sampah?"), + "enableMaps": MessageLookupByLibrary.simpleMessage("Aktifkan Peta"), + "encryptingBackup": + MessageLookupByLibrary.simpleMessage("Mengenkripsi cadangan..."), + "encryption": MessageLookupByLibrary.simpleMessage("Enkripsi"), + "encryptionKeys": + MessageLookupByLibrary.simpleMessage("Kunci enkripsi"), + "endpointUpdatedMessage": + MessageLookupByLibrary.simpleMessage("Endpoint berhasil diubah"), + "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( + "Dirancang dengan enkripsi ujung ke ujung"), + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": + MessageLookupByLibrary.simpleMessage( + "Ente hanya dapat mengenkripsi dan menyimpan file jika kamu berikan izin"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente memerlukan izin untuk menyimpan fotomu"), + "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( + "Ente memelihara kenanganmu, sehingga ia selalu tersedia untukmu, bahkan jika kamu kehilangan perangkatmu."), + "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( + "Anggota keluargamu juga bisa ditambahkan ke paketmu."), + "enterAlbumName": + MessageLookupByLibrary.simpleMessage("Masukkan nama album"), + "enterCode": MessageLookupByLibrary.simpleMessage("Masukkan kode"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "Masukkan kode yang diberikan temanmu untuk memperoleh kuota gratis untuk kalian berdua"), + "enterEmail": MessageLookupByLibrary.simpleMessage("Masukkan email"), + "enterFileName": + MessageLookupByLibrary.simpleMessage("Masukkan nama file"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Masukkan sandi baru yang bisa kami gunakan untuk mengenkripsi data kamu"), + "enterPassword": MessageLookupByLibrary.simpleMessage("Masukkan sandi"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Masukkan sandi yang bisa kami gunakan untuk mengenkripsi data kamu"), + "enterPersonName": + MessageLookupByLibrary.simpleMessage("Masukkan nama orang"), + "enterReferralCode": + MessageLookupByLibrary.simpleMessage("Masukkan kode rujukan"), + "enterThe6digitCodeFromnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Masukkan kode 6 angka dari\napp autentikator kamu"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "Harap masukkan alamat email yang sah."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("Masukkan alamat email kamu"), + "enterYourPassword": + MessageLookupByLibrary.simpleMessage("Masukkan sandi kamu"), + "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Masukkan kunci pemulihan kamu"), + "error": MessageLookupByLibrary.simpleMessage("Kesalahan"), + "everywhere": MessageLookupByLibrary.simpleMessage("di mana saja"), + "exif": MessageLookupByLibrary.simpleMessage("EXIF"), + "existingUser": MessageLookupByLibrary.simpleMessage("Masuk"), + "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( + "Link ini telah kedaluwarsa. Silakan pilih waktu kedaluwarsa baru atau nonaktifkan waktu kedaluwarsa."), + "exportLogs": MessageLookupByLibrary.simpleMessage("Ekspor log"), + "exportYourData": + MessageLookupByLibrary.simpleMessage("Ekspor data kamu"), + "faceRecognition": + MessageLookupByLibrary.simpleMessage("Pengenalan wajah"), + "faces": MessageLookupByLibrary.simpleMessage("Wajah"), + "failedToApplyCode": + MessageLookupByLibrary.simpleMessage("Gagal menerapkan kode"), + "failedToCancel": + MessageLookupByLibrary.simpleMessage("Gagal membatalkan"), + "failedToDownloadVideo": + MessageLookupByLibrary.simpleMessage("Gagal mengunduh video"), + "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( + "Gagal memuat file asli untuk mengedit"), + "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( + "Tidak dapat mengambil kode rujukan. Harap ulang lagi nanti."), + "failedToLoadAlbums": + MessageLookupByLibrary.simpleMessage("Gagal memuat album"), + "failedToRenew": + MessageLookupByLibrary.simpleMessage("Gagal memperpanjang"), + "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( + "Gagal memeriksa status pembayaran"), + "familyPlanOverview": MessageLookupByLibrary.simpleMessage( + "Tambahkan 5 anggota keluarga ke paket kamu tanpa perlu bayar lebih.\n\nSetiap anggota mendapat ruang pribadi mereka sendiri, dan tidak dapat melihat file orang lain kecuali dibagikan.\n\nPaket keluarga tersedia bagi pelanggan yang memiliki langganan berbayar Ente.\n\nLangganan sekarang untuk mulai!"), + "familyPlanPortalTitle": + MessageLookupByLibrary.simpleMessage("Keluarga"), + "familyPlans": MessageLookupByLibrary.simpleMessage("Paket keluarga"), + "faq": MessageLookupByLibrary.simpleMessage("Tanya Jawab Umum"), + "faqs": MessageLookupByLibrary.simpleMessage("Tanya Jawab Umum"), + "feedback": MessageLookupByLibrary.simpleMessage("Masukan"), + "fileFailedToSaveToGallery": MessageLookupByLibrary.simpleMessage( + "Gagal menyimpan file ke galeri"), + "fileInfoAddDescHint": + MessageLookupByLibrary.simpleMessage("Tambahkan keterangan..."), + "fileSavedToGallery": + MessageLookupByLibrary.simpleMessage("File tersimpan ke galeri"), + "fileTypes": MessageLookupByLibrary.simpleMessage("Jenis file"), + "fileTypesAndNames": + MessageLookupByLibrary.simpleMessage("Nama dan jenis file"), + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, + "filesDeleted": MessageLookupByLibrary.simpleMessage("File terhapus"), + "filesSavedToGallery": + MessageLookupByLibrary.simpleMessage("File tersimpan ke galeri"), + "findPeopleByName": MessageLookupByLibrary.simpleMessage( + "Telusuri orang dengan mudah menggunakan nama"), + "flip": MessageLookupByLibrary.simpleMessage("Balik"), + "forYourMemories": + MessageLookupByLibrary.simpleMessage("untuk kenanganmu"), + "forgotPassword": MessageLookupByLibrary.simpleMessage("Lupa sandi"), + "foundFaces": + MessageLookupByLibrary.simpleMessage("Wajah yang ditemukan"), + "freeStorageClaimed": + MessageLookupByLibrary.simpleMessage("Kuota gratis diperoleh"), + "freeStorageOnReferralSuccess": m29, + "freeStorageUsable": MessageLookupByLibrary.simpleMessage( + "Kuota gratis yang dapat digunakan"), + "freeTrial": MessageLookupByLibrary.simpleMessage("Percobaan gratis"), + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, + "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( + "Bersihkan penyimpanan perangkat"), + "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( + "Hemat ruang penyimpanan di perangkatmu dengan membersihkan file yang sudah tercadangkan."), + "freeUpSpace": MessageLookupByLibrary.simpleMessage("Bersihkan ruang"), + "freeUpSpaceSaving": m33, + "general": MessageLookupByLibrary.simpleMessage("Umum"), + "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( + "Menghasilkan kunci enkripsi..."), + "genericProgress": m34, + "goToSettings": MessageLookupByLibrary.simpleMessage("Buka pengaturan"), + "googlePlayId": MessageLookupByLibrary.simpleMessage("ID Google Play"), + "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( + "Harap berikan akses ke semua foto di app Pengaturan"), + "grantPermission": MessageLookupByLibrary.simpleMessage("Berikan izin"), + "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( + "Kelompokkan foto yang berdekatan"), + "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( + "Dari mana Anda menemukan Ente? (opsional)"), + "help": MessageLookupByLibrary.simpleMessage("Bantuan"), + "hidden": MessageLookupByLibrary.simpleMessage("Tersembunyi"), + "hide": MessageLookupByLibrary.simpleMessage("Sembunyikan"), + "hiding": MessageLookupByLibrary.simpleMessage("Menyembunyikan..."), + "hostedAtOsmFrance": + MessageLookupByLibrary.simpleMessage("Dihosting oleh OSM France"), + "howItWorks": MessageLookupByLibrary.simpleMessage("Cara kerjanya"), + "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( + "Silakan minta dia untuk menekan lama alamat email-nya di layar pengaturan, dan pastikan bahwa ID di perangkatnya sama."), + "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Autentikasi biometrik belum aktif di perangkatmu. Silakan aktifkan Touch ID atau Face ID pada ponselmu."), + "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Abaikan"), + "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( + "Sejumlah file di album ini tidak terunggah karena telah dihapus sebelumnya dari Ente."), + "importing": MessageLookupByLibrary.simpleMessage("Mengimpor...."), + "incorrectCode": MessageLookupByLibrary.simpleMessage("Kode salah"), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("Sandi salah"), + "incorrectRecoveryKey": + MessageLookupByLibrary.simpleMessage("Kunci pemulihan salah"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan yang kamu masukkan salah"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("Kunci pemulihan salah"), + "indexedItems": MessageLookupByLibrary.simpleMessage("Item terindeks"), + "indexingIsPaused": MessageLookupByLibrary.simpleMessage( + "Proses indeks dijeda, dan akan otomatis dilanjutkan saat perangkat siap."), + "insecureDevice": + MessageLookupByLibrary.simpleMessage("Perangkat tidak aman"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("Alamat email tidak sah"), + "invalidEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint tidak sah"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Maaf, endpoint yang kamu masukkan tidak sah. Harap masukkan endpoint yang sah dan coba lagi."), + "invalidKey": MessageLookupByLibrary.simpleMessage("Kunci tidak sah"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan yang kamu masukkan tidak sah. Pastikan kunci tersebut berisi 24 kata, dan teliti ejaan masing-masing kata.\n\nJika kamu memasukkan kode pemulihan lama, pastikan kode tersebut berisi 64 karakter, dan teliti setiap karakter yang ada."), + "invite": MessageLookupByLibrary.simpleMessage("Undang"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("Undang ke Ente"), + "inviteYourFriends": + MessageLookupByLibrary.simpleMessage("Undang teman-temanmu"), + "inviteYourFriendsToEnte": + MessageLookupByLibrary.simpleMessage("Undang temanmu ke Ente"), + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": + MessageLookupByLibrary.simpleMessage( + "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami."), + "itemCount": m35, + "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( + "Item yang dipilih akan dihapus dari album ini"), + "joinDiscord": + MessageLookupByLibrary.simpleMessage("Bergabung ke Discord"), + "keepPhotos": MessageLookupByLibrary.simpleMessage("Simpan foto"), + "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "Harap bantu kami dengan informasi ini"), + "language": MessageLookupByLibrary.simpleMessage("Bahasa"), + "leave": MessageLookupByLibrary.simpleMessage("Tinggalkan"), + "leaveAlbum": MessageLookupByLibrary.simpleMessage("Tinggalkan album"), + "leaveFamily": + MessageLookupByLibrary.simpleMessage("Tinggalkan keluarga"), + "leaveSharedAlbum": + MessageLookupByLibrary.simpleMessage("Tinggalkan album bersama?"), + "left": MessageLookupByLibrary.simpleMessage("Kiri"), + "light": MessageLookupByLibrary.simpleMessage("Cahaya"), + "lightTheme": MessageLookupByLibrary.simpleMessage("Cerah"), + "linkCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("Link tersalin ke papan klip"), + "linkDeviceLimit": + MessageLookupByLibrary.simpleMessage("Batas perangkat"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktif"), + "linkExpired": MessageLookupByLibrary.simpleMessage("Kedaluwarsa"), + "linkExpiresOn": m36, + "linkExpiry": + MessageLookupByLibrary.simpleMessage("Waktu kedaluwarsa link"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("Link telah kedaluwarsa"), + "linkNeverExpires": + MessageLookupByLibrary.simpleMessage("Tidak pernah"), + "loadMessage1": MessageLookupByLibrary.simpleMessage( + "Kamu bisa membagikan langgananmu dengan keluarga"), + "loadMessage2": MessageLookupByLibrary.simpleMessage( + "Kami telah memelihara lebih dari 30 juta kenangan saat ini"), + "loadMessage3": MessageLookupByLibrary.simpleMessage( + "Kami menyimpan 3 salinan dari data kamu, salah satunya di tempat pengungsian bawah tanah"), + "loadMessage7": MessageLookupByLibrary.simpleMessage( + "App seluler kami berjalan di latar belakang untuk mengenkripsi dan mencadangkan foto yang kamu potret"), + "loadMessage8": MessageLookupByLibrary.simpleMessage( + "web.ente.io menyediakan alat pengunggah yang bagus"), + "loadMessage9": MessageLookupByLibrary.simpleMessage( + "Kami menggunakan Xchacha20Poly1305 untuk mengenkripsi data-mu dengan aman"), + "loadingExifData": + MessageLookupByLibrary.simpleMessage("Memuat data EXIF..."), + "loadingGallery": + MessageLookupByLibrary.simpleMessage("Memuat galeri..."), + "loadingMessage": + MessageLookupByLibrary.simpleMessage("Memuat fotomu..."), + "loadingModel": + MessageLookupByLibrary.simpleMessage("Mengunduh model..."), + "locationName": MessageLookupByLibrary.simpleMessage("Nama tempat"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Kunci"), + "logInLabel": MessageLookupByLibrary.simpleMessage("Masuk akun"), + "loggingOut": + MessageLookupByLibrary.simpleMessage("Mengeluarkan akun..."), + "loginSessionExpired": + MessageLookupByLibrary.simpleMessage("Sesi berakhir"), + "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( + "Sesi kamu telah berakhir. Silakan masuk akun kembali."), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "Dengan mengklik masuk akun, saya menyetujui ketentuan layanan dan kebijakan privasi Ente"), + "logout": MessageLookupByLibrary.simpleMessage("Keluar akun"), + "longPressAnEmailToVerifyEndToEndEncryption": + MessageLookupByLibrary.simpleMessage( + "Tekan dan tahan email untuk membuktikan enkripsi ujung ke ujung."), + "lostDevice": MessageLookupByLibrary.simpleMessage("Perangkat hilang?"), + "machineLearning": + MessageLookupByLibrary.simpleMessage("Pemelajaran mesin"), + "magicSearch": + MessageLookupByLibrary.simpleMessage("Penelusuran ajaib"), + "manage": MessageLookupByLibrary.simpleMessage("Atur"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("Atur penyimpanan perangkat"), + "manageFamily": MessageLookupByLibrary.simpleMessage("Atur Keluarga"), + "manageLink": MessageLookupByLibrary.simpleMessage("Atur link"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("Atur"), + "manageSubscription": + MessageLookupByLibrary.simpleMessage("Atur langganan"), + "manualPairDesc": MessageLookupByLibrary.simpleMessage( + "Tautkan dengan PIN berfungsi di layar mana pun yang kamu inginkan."), + "map": MessageLookupByLibrary.simpleMessage("Peta"), + "maps": MessageLookupByLibrary.simpleMessage("Peta"), + "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), + "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), + "memoryCount": m0, + "mlConsent": + MessageLookupByLibrary.simpleMessage("Aktifkan pemelajaran mesin"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Saya memahami, dan bersedia mengaktifkan pemelajaran mesin"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Jika kamu mengaktifkan pemelajaran mesin, maka Ente akan mengambil informasi seperti geometri wajah dari berkas, termasuk berkas yg dibagikan kepada mu.\n\nIni akan dilakukan pada perangkat kamu, dan setiap informasi geometrik yang di buat akan ter enskripsi ujung ke ujung."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Klik di sini untuk detail lebih lanjut tentang fitur ini pada kebijakan privasi kami"), + "mlConsentTitle": + MessageLookupByLibrary.simpleMessage("Aktifkan pemelajaran mesin?"), + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "Harap diperhatikan bahwa pemelajaran mesin dapat meningkatkan penggunaan data dan baterai perangkat hingga seluruh items terindeks kan. Dianjurkan menggunakan aplikasi dekstop untuk pengindeksan lebih cepat, seluruh hasil akan tersinkronkan secara otomatis."), + "mobileWebDesktop": + MessageLookupByLibrary.simpleMessage("Seluler, Web, Desktop"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("Sedang"), + "moments": MessageLookupByLibrary.simpleMessage("Momen"), + "monthly": MessageLookupByLibrary.simpleMessage("Bulanan"), + "moveItem": m37, + "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( + "Pindahkan ke album tersembunyi"), + "movedSuccessfullyTo": m38, + "movedToTrash": + MessageLookupByLibrary.simpleMessage("Pindah ke sampah"), + "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( + "Memindahkan file ke album..."), + "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( + "Tidak dapat terhubung dengan Ente, silakan coba lagi setelah beberapa saat. Jika masalah berlanjut, harap hubungi dukungan."), + "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( + "Tidak dapat terhubung dengan Ente, harap periksa pengaturan jaringan kamu dan hubungi dukungan jika masalah berlanjut."), + "never": MessageLookupByLibrary.simpleMessage("Tidak pernah"), + "newAlbum": MessageLookupByLibrary.simpleMessage("Album baru"), + "no": MessageLookupByLibrary.simpleMessage("Tidak"), + "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( + "Belum ada album yang kamu bagikan"), + "noDeviceFound": + MessageLookupByLibrary.simpleMessage("Tidak ditemukan perangkat"), + "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Tidak ada"), + "noDeviceThatCanBeDeleted": MessageLookupByLibrary.simpleMessage( + "Tidak ada file yang perlu dihapus dari perangkat ini"), + "noDuplicates": + MessageLookupByLibrary.simpleMessage("✨ Tak ada file duplikat"), + "noExifData": + MessageLookupByLibrary.simpleMessage("Tidak ada data EXIF"), + "noHiddenPhotosOrVideos": MessageLookupByLibrary.simpleMessage( + "Tidak ada foto atau video tersembunyi"), + "noInternetConnection": + MessageLookupByLibrary.simpleMessage("Tidak ada koneksi internet"), + "noPhotosFoundHere": + MessageLookupByLibrary.simpleMessage("Tidak ada foto di sini"), + "noRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Tidak punya kunci pemulihan?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "Karena sifat protokol enkripsi ujung ke ujung kami, data kamu tidak dapat didekripsi tanpa sandi atau kunci pemulihan kamu"), + "noResults": MessageLookupByLibrary.simpleMessage("Tidak ada hasil"), + "noResultsFound": + MessageLookupByLibrary.simpleMessage("Tidak ditemukan hasil"), + "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( + "Belum ada yang dibagikan denganmu"), + "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( + "Tidak ada apa-apa di sini! 👀"), + "notifications": MessageLookupByLibrary.simpleMessage("Notifikasi"), + "ok": MessageLookupByLibrary.simpleMessage("Oke"), + "onDevice": MessageLookupByLibrary.simpleMessage("Di perangkat ini"), + "onEnte": MessageLookupByLibrary.simpleMessage( + "Di ente"), + "onlyFamilyAdminCanChangeCode": m40, + "oops": MessageLookupByLibrary.simpleMessage("Aduh"), + "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( + "Aduh, tidak dapat menyimpan perubahan"), + "oopsSomethingWentWrong": + MessageLookupByLibrary.simpleMessage("Aduh, terjadi kesalahan"), + "openSettings": MessageLookupByLibrary.simpleMessage("Buka Pengaturan"), + "openTheItem": MessageLookupByLibrary.simpleMessage("• Buka item-nya"), + "openstreetmapContributors": + MessageLookupByLibrary.simpleMessage("Kontributor OpenStreetMap"), + "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( + "Opsional, pendek pun tak apa..."), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("Atau pilih yang sudah ada"), + "pair": MessageLookupByLibrary.simpleMessage("Tautkan"), + "pairWithPin": + MessageLookupByLibrary.simpleMessage("Tautkan dengan PIN"), + "pairingComplete": + MessageLookupByLibrary.simpleMessage("Penautan berhasil"), + "passkey": MessageLookupByLibrary.simpleMessage("Passkey"), + "passkeyAuthTitle": + MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), + "password": MessageLookupByLibrary.simpleMessage("Sandi"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("Sandi berhasil diubah"), + "passwordLock": + MessageLookupByLibrary.simpleMessage("Kunci dengan sandi"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "Kami tidak menyimpan sandi ini, jadi jika kamu melupakannya, kami tidak akan bisa mendekripsi data kamu"), + "paymentDetails": + MessageLookupByLibrary.simpleMessage("Rincian pembayaran"), + "paymentFailed": + MessageLookupByLibrary.simpleMessage("Pembayaran gagal"), + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!"), + "pendingItems": MessageLookupByLibrary.simpleMessage("Item menunggu"), + "people": MessageLookupByLibrary.simpleMessage("Orang"), + "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( + "Orang yang telah menggunakan kodemu"), + "permDeleteWarning": MessageLookupByLibrary.simpleMessage( + "Semua item di sampah akan dihapus secara permanen\n\nTindakan ini tidak dapat dibatalkan"), + "permanentlyDelete": + MessageLookupByLibrary.simpleMessage("Hapus secara permanen"), + "permanentlyDeleteFromDevice": MessageLookupByLibrary.simpleMessage( + "Hapus dari perangkat secara permanen?"), + "photoDescriptions": + MessageLookupByLibrary.simpleMessage("Keterangan foto"), + "photoGridSize": + MessageLookupByLibrary.simpleMessage("Ukuran kotak foto"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("foto"), + "photos": MessageLookupByLibrary.simpleMessage("Foto"), + "photosAddedByYouWillBeRemovedFromTheAlbum": + MessageLookupByLibrary.simpleMessage( + "Foto yang telah kamu tambahkan akan dihapus dari album ini"), + "playOnTv": MessageLookupByLibrary.simpleMessage("Putar album di TV"), + "playStoreFreeTrialValidTill": m43, + "pleaseCheckYourInternetConnectionAndTryAgain": + MessageLookupByLibrary.simpleMessage( + "Silakan periksa koneksi internet kamu, lalu coba lagi."), + "pleaseContactSupportAndWeWillBeHappyToHelp": + MessageLookupByLibrary.simpleMessage( + "Silakan hubungi support@ente.io dan kami akan dengan senang hati membantu!"), + "pleaseContactSupportIfTheProblemPersists": + MessageLookupByLibrary.simpleMessage( + "Silakan hubungi tim bantuan jika masalah terus terjadi"), + "pleaseEmailUsAt": m44, + "pleaseGrantPermissions": + MessageLookupByLibrary.simpleMessage("Harap berikan izin"), + "pleaseLoginAgain": + MessageLookupByLibrary.simpleMessage("Silakan masuk akun lagi"), + "pleaseSendTheLogsTo": m45, + "pleaseTryAgain": + MessageLookupByLibrary.simpleMessage("Silakan coba lagi"), + "pleaseVerifyTheCodeYouHaveEntered": + MessageLookupByLibrary.simpleMessage( + "Harap periksa kode yang kamu masukkan"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("Harap tunggu..."), + "pleaseWaitDeletingAlbum": MessageLookupByLibrary.simpleMessage( + "Harap tunggu, sedang menghapus album"), + "pleaseWaitForSometimeBeforeRetrying": + MessageLookupByLibrary.simpleMessage( + "Harap tunggu beberapa saat sebelum mencoba lagi"), + "preparingLogs": + MessageLookupByLibrary.simpleMessage("Menyiapkan log..."), + "pressAndHoldToPlayVideo": MessageLookupByLibrary.simpleMessage( + "Tekan dan tahan untuk memutar video"), + "pressAndHoldToPlayVideoDetailed": MessageLookupByLibrary.simpleMessage( + "Tekan dan tahan gambar untuk memutar video"), + "privacy": MessageLookupByLibrary.simpleMessage("Privasi"), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("Kebijakan Privasi"), + "privateBackups": + MessageLookupByLibrary.simpleMessage("Cadangan pribadi"), + "publicLinkCreated": + MessageLookupByLibrary.simpleMessage("Link publik dibuat"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("Link publik aktif"), + "radius": MessageLookupByLibrary.simpleMessage("Radius"), + "rateTheApp": MessageLookupByLibrary.simpleMessage("Nilai app ini"), + "rateUsOnStore": m46, + "recover": MessageLookupByLibrary.simpleMessage("Pulihkan"), + "recoverAccount": MessageLookupByLibrary.simpleMessage("Pulihkan akun"), + "recoverButton": MessageLookupByLibrary.simpleMessage("Pulihkan"), + "recoveryKey": MessageLookupByLibrary.simpleMessage("Kunci pemulihan"), + "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan tersalin ke papan klip"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "Saat kamu lupa sandi, satu-satunya cara untuk memulihkan data kamu adalah dengan kunci ini."), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "Kami tidak menyimpan kunci ini, jadi harap simpan kunci yang berisi 24 kata ini dengan aman."), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "Bagus! Kunci pemulihan kamu sah. Terima kasih telah melakukan verifikasi.\n\nHarap simpan selalu kunci pemulihan kamu dengan aman."), + "recoveryKeyVerified": MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan terverifikasi"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan kamu adalah satu-satunya cara untuk memulihkan foto-foto kamu jika kamu lupa kata sandi. Kamu bisa lihat kunci pemulihan kamu di Pengaturan > Keamanan.\n\nHarap masukkan kunci pemulihan kamu di sini untuk memastikan bahwa kamu telah menyimpannya dengan baik."), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("Pemulihan berhasil!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "Perangkat ini tidak cukup kuat untuk memverifikasi kata sandi kamu, tapi kami dapat membuat ulang kata sandi kamu sehingga dapat digunakan di semua perangkat.\n\nSilahkan masuk menggunakan kunci pemulihan dan buat ulang kata sandi kamu (Kamu dapat menggunakan kata sandi yang sama lagi jika mau)."), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("Buat kembali kata sandi"), + "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), + "referralStep1": MessageLookupByLibrary.simpleMessage( + "1. Berikan kode ini ke teman kamu"), + "referralStep2": MessageLookupByLibrary.simpleMessage( + "2. Ia perlu daftar ke paket berbayar"), + "referralStep3": m47, + "referralsAreCurrentlyPaused": + MessageLookupByLibrary.simpleMessage("Rujukan sedang dijeda"), + "remove": MessageLookupByLibrary.simpleMessage("Hapus"), + "removeDuplicates": + MessageLookupByLibrary.simpleMessage("Hapus duplikat"), + "removeDuplicatesDesc": MessageLookupByLibrary.simpleMessage( + "Lihat dan hapus file yang sama persis."), + "removeFromAlbum": + MessageLookupByLibrary.simpleMessage("Hapus dari album"), + "removeFromAlbumTitle": + MessageLookupByLibrary.simpleMessage("Hapus dari album?"), + "removeLink": MessageLookupByLibrary.simpleMessage("Hapus link"), + "removeParticipant": + MessageLookupByLibrary.simpleMessage("Hapus peserta"), + "removeParticipantBody": m48, + "removePersonLabel": + MessageLookupByLibrary.simpleMessage("Hapus label orang"), + "removePublicLink": + MessageLookupByLibrary.simpleMessage("Hapus link publik"), + "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( + "Beberapa item yang kamu hapus ditambahkan oleh orang lain, dan kamu akan kehilangan akses ke item tersebut"), + "removeWithQuestionMark": + MessageLookupByLibrary.simpleMessage("Hapus?"), + "removingFromFavorites": + MessageLookupByLibrary.simpleMessage("Menghapus dari favorit..."), + "rename": MessageLookupByLibrary.simpleMessage("Ubah nama"), + "renameAlbum": MessageLookupByLibrary.simpleMessage("Ubah nama album"), + "renameFile": MessageLookupByLibrary.simpleMessage("Ubah nama file"), + "renewSubscription": + MessageLookupByLibrary.simpleMessage("Perpanjang langganan"), + "renewsOn": m49, + "reportABug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), + "reportBug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), + "resendEmail": + MessageLookupByLibrary.simpleMessage("Kirim ulang email"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("Atur ulang kata sandi"), + "restore": MessageLookupByLibrary.simpleMessage("Pulihkan"), + "restoringFiles": + MessageLookupByLibrary.simpleMessage("Memulihkan file..."), + "retry": MessageLookupByLibrary.simpleMessage("Coba lagi"), + "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( + "Silakan lihat dan hapus item yang merupakan duplikat."), + "right": MessageLookupByLibrary.simpleMessage("Kanan"), + "rotate": MessageLookupByLibrary.simpleMessage("Putar"), + "rotateLeft": MessageLookupByLibrary.simpleMessage("Putar ke kiri"), + "rotateRight": MessageLookupByLibrary.simpleMessage("Putar ke kanan"), + "safelyStored": MessageLookupByLibrary.simpleMessage("Tersimpan aman"), + "save": MessageLookupByLibrary.simpleMessage("Simpan"), + "saveKey": MessageLookupByLibrary.simpleMessage("Simpan kunci"), + "saveYourRecoveryKeyIfYouHaventAlready": + MessageLookupByLibrary.simpleMessage( + "Jika belum, simpan kunci pemulihan kamu"), + "saving": MessageLookupByLibrary.simpleMessage("Menyimpan..."), + "savingEdits": + MessageLookupByLibrary.simpleMessage("Menyimpan edit..."), + "scanCode": MessageLookupByLibrary.simpleMessage("Pindai kode"), + "scanThisBarcodeWithnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Pindai barcode ini dengan\napp autentikator kamu"), + "search": MessageLookupByLibrary.simpleMessage("Telusuri"), + "searchAlbumsEmptySection": + MessageLookupByLibrary.simpleMessage("Album"), + "searchByAlbumNameHint": + MessageLookupByLibrary.simpleMessage("Nama album"), + "searchByExamples": MessageLookupByLibrary.simpleMessage( + "• Nama album (cth. \"Kamera\")\n• Jenis file (cth. \"Video\", \".gif\")\n• Tahun atau bulan (cth. \"2022\", \"Januari\")\n• Musim liburan (cth. \"Natal\")\n• Keterangan foto (cth. “#seru”)"), + "searchCaptionEmptySection": MessageLookupByLibrary.simpleMessage( + "Tambah keterangan seperti \"#trip\" pada info foto agar mudah ditemukan di sini"), + "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( + "Telusuri dengan tanggal, bulan, atau tahun"), + "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( + "Orang akan ditampilkan di sini setelah pengindeksan selesai"), + "searchFileTypesAndNamesEmptySection": + MessageLookupByLibrary.simpleMessage("Nama dan jenis file"), + "searchHint2": + MessageLookupByLibrary.simpleMessage("Tanggal, keterangan foto"), + "searchHint3": + MessageLookupByLibrary.simpleMessage("Album, nama dan jenis file"), + "searchHint5": MessageLookupByLibrary.simpleMessage( + "Segera tiba: Penelusuran wajah & ajaib ✨"), + "searchResultCount": m50, + "security": MessageLookupByLibrary.simpleMessage("Keamanan"), + "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), + "selectALocationFirst": MessageLookupByLibrary.simpleMessage( + "Pilih lokasi terlebih dahulu"), + "selectAlbum": MessageLookupByLibrary.simpleMessage("Pilih album"), + "selectAll": MessageLookupByLibrary.simpleMessage("Pilih semua"), + "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( + "Pilih folder yang perlu dicadangkan"), + "selectItemsToAdd": MessageLookupByLibrary.simpleMessage( + "Pilih item untuk ditambahkan"), + "selectLanguage": MessageLookupByLibrary.simpleMessage("Pilih Bahasa"), + "selectReason": MessageLookupByLibrary.simpleMessage("Pilih alasan"), + "selectYourPlan": + MessageLookupByLibrary.simpleMessage("Pilih paket kamu"), + "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( + "File terpilih tidak tersimpan di Ente"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage( + "Folder yang terpilih akan dienkripsi dan dicadangkan"), + "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": + MessageLookupByLibrary.simpleMessage( + "Item terpilih akan dihapus dari semua album dan dipindahkan ke sampah."), + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, + "send": MessageLookupByLibrary.simpleMessage("Kirim"), + "sendEmail": MessageLookupByLibrary.simpleMessage("Kirim email"), + "sendInvite": MessageLookupByLibrary.simpleMessage("Kirim undangan"), + "sendLink": MessageLookupByLibrary.simpleMessage("Kirim link"), + "serverEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint server"), + "setAPassword": MessageLookupByLibrary.simpleMessage("Atur sandi"), + "setAs": MessageLookupByLibrary.simpleMessage("Pasang sebagai"), + "setCover": MessageLookupByLibrary.simpleMessage("Ubah sampul"), + "setPasswordTitle": + MessageLookupByLibrary.simpleMessage("Buat kata sandi"), + "setupComplete": + MessageLookupByLibrary.simpleMessage("Penyiapan selesai"), + "share": MessageLookupByLibrary.simpleMessage("Bagikan"), + "shareALink": MessageLookupByLibrary.simpleMessage("Bagikan link"), + "shareAlbumHint": MessageLookupByLibrary.simpleMessage( + "Buka album lalu ketuk tombol bagikan di sudut kanan atas untuk berbagi."), + "shareAnAlbumNow": + MessageLookupByLibrary.simpleMessage("Bagikan album sekarang"), + "shareLink": MessageLookupByLibrary.simpleMessage("Bagikan link"), + "shareMyVerificationID": m52, + "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( + "Bagikan hanya dengan orang yang kamu inginkan"), + "shareTextConfirmOthersVerificationID": m2, + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "Unduh Ente agar kita bisa berbagi foto dan video kualitas asli dengan mudah\n\nhttps://ente.io"), + "shareTextReferralCode": m53, + "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( + "Bagikan ke pengguna non-Ente"), + "shareWithPeopleSectionTitle": m54, + "shareYourFirstAlbum": + MessageLookupByLibrary.simpleMessage("Bagikan album pertamamu"), + "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( + "Buat album bersama dan kolaborasi dengan pengguna Ente lain, termasuk pengguna paket gratis."), + "sharedByMe": + MessageLookupByLibrary.simpleMessage("Dibagikan oleh saya"), + "sharedByYou": + MessageLookupByLibrary.simpleMessage("Dibagikan oleh kamu"), + "sharedPhotoNotifications": + MessageLookupByLibrary.simpleMessage("Foto terbagi baru"), + "sharedWith": m55, + "sharedWithMe": + MessageLookupByLibrary.simpleMessage("Dibagikan dengan saya"), + "sharedWithYou": + MessageLookupByLibrary.simpleMessage("Dibagikan dengan kamu"), + "sharing": MessageLookupByLibrary.simpleMessage("Membagikan..."), + "showMemories": MessageLookupByLibrary.simpleMessage("Lihat kenangan"), + "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( + "Keluarkan akun dari perangkat lain"), + "signOutOtherBody": MessageLookupByLibrary.simpleMessage( + "Jika kamu merasa ada yang mengetahui sandimu, kamu bisa mengeluarkan akunmu secara paksa dari perangkat lain."), + "signOutOtherDevices": + MessageLookupByLibrary.simpleMessage("Keluar di perangkat lain"), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente"), + "singleFileDeleteFromDevice": m56, + "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( + "Ia akan dihapus dari semua album."), + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, + "skip": MessageLookupByLibrary.simpleMessage("Lewati"), + "social": MessageLookupByLibrary.simpleMessage("Sosial"), + "someItemsAreInBothEnteAndYourDevice": + MessageLookupByLibrary.simpleMessage( + "Sejumlah item tersimpan di Ente serta di perangkat ini."), + "someoneSharingAlbumsWithYouShouldSeeTheSameId": + MessageLookupByLibrary.simpleMessage( + "Orang yang membagikan album denganmu bisa melihat ID yang sama di perangkat mereka."), + "somethingWentWrong": + MessageLookupByLibrary.simpleMessage("Terjadi kesalahan"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Terjadi kesalahan, silakan coba lagi"), + "sorry": MessageLookupByLibrary.simpleMessage("Maaf"), + "sorryCouldNotAddToFavorites": MessageLookupByLibrary.simpleMessage( + "Maaf, tidak dapat menambahkan ke favorit!"), + "sorryCouldNotRemoveFromFavorites": + MessageLookupByLibrary.simpleMessage( + "Maaf, tidak dapat menghapus dari favorit!"), + "sorryTheCodeYouveEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage( + "Maaf, kode yang kamu masukkan salah"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "Maaf, kami tidak dapat menghasilkan kunci yang aman di perangkat ini.\n\nHarap mendaftar dengan perangkat lain."), + "sortAlbumsBy": + MessageLookupByLibrary.simpleMessage("Urut berdasarkan"), + "sortNewestFirst": MessageLookupByLibrary.simpleMessage("Terbaru dulu"), + "sortOldestFirst": MessageLookupByLibrary.simpleMessage("Terlama dulu"), + "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ Berhasil"), + "startBackup": + MessageLookupByLibrary.simpleMessage("Mulai pencadangan"), + "status": MessageLookupByLibrary.simpleMessage("Status"), + "stopCastingBody": MessageLookupByLibrary.simpleMessage( + "Apakah kamu ingin menghentikan transmisi?"), + "stopCastingTitle": + MessageLookupByLibrary.simpleMessage("Hentikan transmisi"), + "storage": MessageLookupByLibrary.simpleMessage("Penyimpanan"), + "storageBreakupFamily": + MessageLookupByLibrary.simpleMessage("Keluarga"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Kamu"), + "storageInGB": m59, + "storageUsageInfo": m60, + "strongStrength": MessageLookupByLibrary.simpleMessage("Kuat"), + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, + "subscribe": MessageLookupByLibrary.simpleMessage("Berlangganan"), + "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( + "Langgananmu telah berakhir. Silakan langganan kembali untuk berbagi."), + "subscription": MessageLookupByLibrary.simpleMessage("Langganan"), + "success": MessageLookupByLibrary.simpleMessage("Berhasil"), + "successfullyArchived": + MessageLookupByLibrary.simpleMessage("Berhasil diarsipkan"), + "successfullyHid": + MessageLookupByLibrary.simpleMessage("Berhasil disembunyikan"), + "successfullyUnarchived": MessageLookupByLibrary.simpleMessage( + "Berhasil dikeluarkan dari arsip"), + "suggestFeatures": + MessageLookupByLibrary.simpleMessage("Sarankan fitur"), + "support": MessageLookupByLibrary.simpleMessage("Dukungan"), + "syncStopped": + MessageLookupByLibrary.simpleMessage("Sinkronisasi terhenti"), + "syncing": MessageLookupByLibrary.simpleMessage("Menyinkronkan..."), + "systemTheme": MessageLookupByLibrary.simpleMessage("Sistem"), + "tapToCopy": MessageLookupByLibrary.simpleMessage("ketuk untuk salin"), + "tapToEnterCode": + MessageLookupByLibrary.simpleMessage("Ketuk untuk masukkan kode"), + "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( + "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami."), + "terminate": MessageLookupByLibrary.simpleMessage("Akhiri"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("Akhiri sesi?"), + "terms": MessageLookupByLibrary.simpleMessage("Ketentuan"), + "termsOfServicesTitle": + MessageLookupByLibrary.simpleMessage("Ketentuan"), + "thankYou": MessageLookupByLibrary.simpleMessage("Terima kasih"), + "thankYouForSubscribing": MessageLookupByLibrary.simpleMessage( + "Terima kasih telah berlangganan!"), + "theRecoveryKeyYouEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage( + "Kunci pemulihan yang kamu masukkan salah"), + "theme": MessageLookupByLibrary.simpleMessage("Tema"), + "theseItemsWillBeDeletedFromYourDevice": + MessageLookupByLibrary.simpleMessage( + "Item ini akan dihapus dari perangkat ini."), + "theyAlsoGetXGb": m64, + "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( + "Tindakan ini tidak dapat dibatalkan"), + "thisAlbumAlreadyHDACollaborativeLink": + MessageLookupByLibrary.simpleMessage( + "Link kolaborasi untuk album ini sudah terbuat"), + "thisCanBeUsedToRecoverYourAccountIfYou": + MessageLookupByLibrary.simpleMessage( + "Ini dapat digunakan untuk memulihkan akun kamu jika kehilangan faktor kedua kamu"), + "thisDevice": MessageLookupByLibrary.simpleMessage("Perangkat ini"), + "thisEmailIsAlreadyInUse": + MessageLookupByLibrary.simpleMessage("Email ini telah digunakan"), + "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( + "Gambar ini tidak memiliki data exif"), + "thisIsPersonVerificationId": m65, + "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( + "Ini adalah ID Verifikasi kamu"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "Ini akan mengeluarkan akunmu dari perangkat berikut:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "Ini akan mengeluarkan akunmu dari perangkat ini!"), + "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( + "Untuk menyembunyikan foto atau video"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "Untuk mengatur ulang sandimu, harap verifikasi email kamu terlebih dahulu."), + "todaysLogs": MessageLookupByLibrary.simpleMessage("Log hari ini"), + "total": MessageLookupByLibrary.simpleMessage("jumlah total"), + "trash": MessageLookupByLibrary.simpleMessage("Sampah"), + "trashDaysLeft": m66, + "trim": MessageLookupByLibrary.simpleMessage("Pangkas"), + "tryAgain": MessageLookupByLibrary.simpleMessage("Coba lagi"), + "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( + "Aktifkan pencadangan untuk mengunggah file yang ditambahkan ke folder ini ke Ente secara otomatis."), + "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), + "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( + "2 bulan gratis dengan paket tahunan"), + "twofactor": + MessageLookupByLibrary.simpleMessage("Autentikasi dua langkah"), + "twofactorAuthenticationHasBeenDisabled": + MessageLookupByLibrary.simpleMessage( + "Autentikasi dua langkah telah dinonaktifkan"), + "twofactorAuthenticationPageTitle": + MessageLookupByLibrary.simpleMessage("Autentikasi dua langkah"), + "twofactorAuthenticationSuccessfullyReset": + MessageLookupByLibrary.simpleMessage( + "Autentikasi dua langkah berhasil direset"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage( + "Penyiapan autentikasi dua langkah"), + "unarchive": + MessageLookupByLibrary.simpleMessage("Keluarkan dari arsip"), + "unarchiveAlbum": + MessageLookupByLibrary.simpleMessage("Keluarkan album dari arsip"), + "unarchiving": + MessageLookupByLibrary.simpleMessage("Mengeluarkan dari arsip..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Maaf, kode ini tidak tersedia."), + "uncategorized": + MessageLookupByLibrary.simpleMessage("Tak Berkategori"), + "unlock": MessageLookupByLibrary.simpleMessage("Buka"), + "unselectAll": + MessageLookupByLibrary.simpleMessage("Batalkan semua pilihan"), + "update": MessageLookupByLibrary.simpleMessage("Perbarui"), + "updateAvailable": + MessageLookupByLibrary.simpleMessage("Pembaruan tersedia"), + "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( + "Memperbaharui pilihan folder..."), + "uploadingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("Mengunggah file ke album..."), + "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( + "Potongan hingga 50%, sampai 4 Des."), + "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( + "Kuota yang dapat digunakan dibatasi oleh paket kamu saat ini. Kelebihan kuota yang diklaim, akan secara otomatis dapat digunakan saat kamu meningkatkan paket kamu."), + "usePublicLinksForPeopleNotOnEnte": + MessageLookupByLibrary.simpleMessage( + "Bagikan link publik ke orang yang tidak menggunakan Ente"), + "useRecoveryKey": + MessageLookupByLibrary.simpleMessage("Gunakan kunci pemulihan"), + "useSelectedPhoto": + MessageLookupByLibrary.simpleMessage("Gunakan foto terpilih"), + "validTill": m67, + "verificationFailedPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Verifikasi gagal, silakan coba lagi"), + "verificationId": MessageLookupByLibrary.simpleMessage("ID Verifikasi"), + "verify": MessageLookupByLibrary.simpleMessage("Verifikasi"), + "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifikasi email"), + "verifyEmailID": m68, + "verifyPasskey": + MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), + "verifyPassword": + MessageLookupByLibrary.simpleMessage("Verifikasi sandi"), + "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Memverifikasi kunci pemulihan..."), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("video"), + "videos": MessageLookupByLibrary.simpleMessage("Video"), + "viewActiveSessions": + MessageLookupByLibrary.simpleMessage("Lihat sesi aktif"), + "viewAll": MessageLookupByLibrary.simpleMessage("Lihat semua"), + "viewAllExifData": + MessageLookupByLibrary.simpleMessage("Lihat seluruh data EXIF"), + "viewLargeFiles": + MessageLookupByLibrary.simpleMessage("File berukuran besar"), + "viewLogs": MessageLookupByLibrary.simpleMessage("Lihat log"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("Lihat kunci pemulihan"), + "viewer": MessageLookupByLibrary.simpleMessage("Pemirsa"), + "visitWebToManage": MessageLookupByLibrary.simpleMessage( + "Silakan buka web.ente.io untuk mengatur langgananmu"), + "waitingForVerification": + MessageLookupByLibrary.simpleMessage("Menunggu verifikasi..."), + "waitingForWifi": + MessageLookupByLibrary.simpleMessage("Menunggu WiFi..."), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("Lemah"), + "welcomeBack": + MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), + "whatsNew": MessageLookupByLibrary.simpleMessage("Hal yang baru"), + "yearly": MessageLookupByLibrary.simpleMessage("Tahunan"), + "yearsAgo": m70, + "yes": MessageLookupByLibrary.simpleMessage("Ya"), + "yesCancel": MessageLookupByLibrary.simpleMessage("Ya, batalkan"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("Ya, ubah ke pemirsa"), + "yesDelete": MessageLookupByLibrary.simpleMessage("Ya, hapus"), + "yesDiscardChanges": + MessageLookupByLibrary.simpleMessage("Ya, buang perubahan"), + "yesLogout": MessageLookupByLibrary.simpleMessage("Ya, keluar"), + "yesRemove": MessageLookupByLibrary.simpleMessage("Ya, hapus"), + "yesRenew": MessageLookupByLibrary.simpleMessage("Ya, Perpanjang"), + "you": MessageLookupByLibrary.simpleMessage("Kamu"), + "youAreOnAFamilyPlan": MessageLookupByLibrary.simpleMessage( + "Kamu menggunakan paket keluarga!"), + "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage( + "Kamu menggunakan versi terbaru"), + "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( + "* Maksimal dua kali lipat dari kuota penyimpananmu"), + "youCanManageYourLinksInTheShareTab": + MessageLookupByLibrary.simpleMessage( + "Kamu bisa atur link yang telah kamu buat di tab berbagi."), + "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage( + "Kamu tidak bisa berbagi dengan dirimu sendiri"), + "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( + "Kamu tidak memiliki item di arsip."), + "youHaveSuccessfullyFreedUp": m71, + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), + "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), + "yourPurchaseWasSuccessful": + MessageLookupByLibrary.simpleMessage("Pembelianmu berhasil"), + "yourStorageDetailsCouldNotBeFetched": + MessageLookupByLibrary.simpleMessage( + "Rincian penyimpananmu tidak dapat dimuat"), + "yourSubscriptionHasExpired": + MessageLookupByLibrary.simpleMessage("Langgananmu telah berakhir"), + "yourSubscriptionWasUpdatedSuccessfully": + MessageLookupByLibrary.simpleMessage( + "Langgananmu telah berhasil diperbarui"), + "yourVerificationCodeHasExpired": MessageLookupByLibrary.simpleMessage( + "Kode verifikasi kamu telah kedaluwarsa"), + "zoomOutToSeePhotos": MessageLookupByLibrary.simpleMessage( + "Perkecil peta untuk melihat foto lainnya") + }; +} diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index e66ac02bc7..782eb147c5 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -20,34 +20,25 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'it'; - static String m0(count) => - "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; - - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Aggiungi elemento', other: 'Aggiungi elementi')}"; - static String m1(count) => - "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; + static String m7(emailOrName) => "Aggiunto da ${emailOrName}"; - static String m4(emailOrName) => "Aggiunto da ${emailOrName}"; + static String m8(albumName) => "Aggiunto con successo su ${albumName}"; - static String m5(albumName) => "Aggiunto con successo su ${albumName}"; - - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Nessun partecipante', one: '1 Partecipante', other: '${count} Partecipanti')}"; - static String m7(versionValue) => "Versione: ${versionValue}"; + static String m10(versionValue) => "Versione: ${versionValue}"; - static String m8(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} liberi"; - - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Annulla prima il tuo abbonamento esistente da ${paymentProvider}"; - static String m10(user) => + static String m13(user) => "${user} non sarà più in grado di aggiungere altre foto a questo album\n\nSarà ancora in grado di rimuovere le foto esistenti aggiunte da lui o lei"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Il tuo piano famiglia ha già richiesto ${storageAmountInGb} GB finora', @@ -55,106 +46,97 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Hai già richiesto ${storageAmountInGb} GB finora!', })}"; - static String m12(albumName) => "Link collaborativo creato per ${albumName}"; + static String m15(albumName) => "Link collaborativo creato per ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Contatta ${familyAdminEmail} per gestire il tuo abbonamento"; - static String m14(provider) => + static String m17(provider) => "Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}."; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Eliminazione di ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Questo rimuoverà il link pubblico per accedere a \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} file, ${formattedSize} l\'uno"; - static String m22(newEmail) => "Email cambiata in ${newEmail}"; + static String m25(newEmail) => "Email cambiata in ${newEmail}"; - static String m23(email) => - "${email} non ha un account su ente.\n\nInvia un invito per condividere foto."; - - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice"; - static String m27(endDate) => "La prova gratuita termina il ${endDate}"; + static String m30(endDate) => "La prova gratuita termina il ${endDate}"; - static String m28(count) => + static String m31(count) => "Puoi ancora accedere a ${Intl.plural(count, one: '', other: 'loro')} su ente finché hai un abbonamento attivo"; - static String m29(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Può essere cancellata per liberare ${formattedSize}', other: 'Possono essere cancellati per liberare ${formattedSize}')}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementi')}"; - static String m33(expiryTime) => "Il link scadrà il ${expiryTime}"; + static String m36(expiryTime) => "Il link scadrà il ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} ricordo', other: '${formattedCount} ricordi')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Sposta elemento', other: 'Sposta elementi')}"; - static String m36(albumName) => "Spostato con successo su ${albumName}"; + static String m38(albumName) => "Spostato con successo su ${albumName}"; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; - static String m41(endDate) => - "Prova gratuita valida fino al ${endDate}.\nPuoi scegliere un piano a pagamento in seguito."; + static String m44(toEmail) => "Per favore invia un\'email a ${toEmail}"; - static String m42(toEmail) => "Per favore invia un\'email a ${toEmail}"; + static String m45(toEmail) => "Invia i log a \n${toEmail}"; - static String m43(toEmail) => "Invia i log a \n${toEmail}"; + static String m46(storeName) => "Valutaci su ${storeName}"; - static String m44(storeName) => "Valutaci su ${storeName}"; - - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Ottenete entrambi ${storageInGB} GB* gratis"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall\'utente verrà rimossa dall\'album"; - static String m47(endDate) => "Si rinnova il ${endDate}"; + static String m49(endDate) => "Si rinnova il ${endDate}"; - static String m49(count) => "${count} selezionati"; + static String m1(count) => "${count} selezionati"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} selezionato (${yourCount} tuoi)"; - static String m51(verificationID) => + static String m52(verificationID) => "Ecco il mio ID di verifica: ${verificationID} per ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; - static String m53(referralCode, referralStorageInGB) => - "ente referral code: ${referralCode} \n\nApplicalo in Impostazioni → Generale → Referral per ottenere ${referralStorageInGB} GB gratis dopo la registrazione di un piano a pagamento\n\nhttps://ente.io"; - static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; @@ -163,20 +145,12 @@ class MessageLookup extends MessageLookupByLibrary { static String m56(fileType) => "Questo ${fileType} verrà eliminato dal tuo dispositivo."; - static String m57(fileType) => - "Questo ${fileType} è sia su ente che sul tuo dispositivo."; - - static String m58(fileType) => "Questo ${fileType} verrà eliminato su ente."; - static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; - static String m61(id) => - "Il tuo ${id} è già collegato ad un altro account ente.\nSe desideri utilizzare il tuo ${id} con questo account, contatta il nostro supporto\'\'"; - static String m62(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; static String m63(completed, total) => @@ -205,8 +179,6 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "Una nuova versione di ente è disponibile."), "about": MessageLookupByLibrary.simpleMessage("Info"), "account": MessageLookupByLibrary.simpleMessage("Account"), "accountWelcomeBack": @@ -219,13 +191,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aggiungi una nuova email"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Aggiungi collaboratore"), - "addCollaborators": m0, "addFromDevice": MessageLookupByLibrary.simpleMessage("Aggiungi dal dispositivo"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Aggiungi luogo"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Aggiungi"), "addMore": MessageLookupByLibrary.simpleMessage("Aggiungi altri"), + "addNew": MessageLookupByLibrary.simpleMessage("Aggiungi nuovo"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Dettagli dei componenti aggiuntivi"), "addOns": MessageLookupByLibrary.simpleMessage("Componenti aggiuntivi"), @@ -234,15 +206,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aggiungi selezionate"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Aggiungi all\'album"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Aggiungi su ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Aggiungi ad album nascosto"), "addViewer": MessageLookupByLibrary.simpleMessage("Aggiungi in sola lettura"), - "addViewers": m1, "addedAs": MessageLookupByLibrary.simpleMessage("Aggiunto come"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Aggiunto ai preferiti..."), "advanced": MessageLookupByLibrary.simpleMessage("Avanzate"), @@ -254,7 +224,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dopo una settimana"), "after1Year": MessageLookupByLibrary.simpleMessage("Dopo un anno"), "albumOwner": MessageLookupByLibrary.simpleMessage("Proprietario"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Titolo album"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album aggiornato"), @@ -291,10 +261,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Android, iOS, Web, Desktop"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autenticazione necessaria"), - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Applica"), "applyCodeTitle": @@ -340,8 +307,6 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticati per configurare l\'autenticazione a due fattori"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Autenticati per avviare l\'eliminazione dell\'account"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Autenticati per visualizzare le sessioni attive"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -357,11 +322,7 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticazione non riuscita, prova di nuovo"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Autenticazione riuscita!"), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), - "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), "available": MessageLookupByLibrary.simpleMessage("Disponibile"), - "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Cartelle salvate"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -384,16 +345,16 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Puoi rimuovere solo i file di tua proprietà"), "cancel": MessageLookupByLibrary.simpleMessage("Annulla"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Annulla abbonamento"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Impossibile eliminare i file condivisi"), "centerPoint": MessageLookupByLibrary.simpleMessage("Punto centrale"), "changeEmail": MessageLookupByLibrary.simpleMessage("Modifica email"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( - "Change location of selected items?"), + "Cambiare la posizione degli elementi selezionati?"), "changePassword": MessageLookupByLibrary.simpleMessage("Cambia password"), "changePasswordTitle": @@ -406,26 +367,13 @@ class MessageLookup extends MessageLookupByLibrary { "Per favore, controlla la tua casella di posta (e lo spam) per completare la verifica"), "checking": MessageLookupByLibrary.simpleMessage("Controllo in corso..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Seleziona le foto e prova la \"Vista Ospite\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Mostri le foto a un amico? Non preoccuparti che scorrano troppo lontano. La vista ospite bloccherà le foto che selezioni."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Vista Ospite"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Abbiamo aggiunto il supporto per visualizzare foto panoramiche con viste a 360 gradi. L\'esperienza è immersiva con la navigazione basata sul movimento!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visualizzatore Panoramico"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Presentiamo un nuovo lettore video, con controlli di riproduzione migliorati e supporto per video HDR."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Lettore Video"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Richiedi spazio gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Richiedine di più!"), "claimed": MessageLookupByLibrary.simpleMessage("Riscattato"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "clearCaches": MessageLookupByLibrary.simpleMessage("Svuota cache"), + "clearIndexes": MessageLookupByLibrary.simpleMessage("Cancella indici"), "click": MessageLookupByLibrary.simpleMessage("• Clic"), "clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage("• Fai clic sul menu"), @@ -434,19 +382,15 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Club per tempo di cattura"), "clubByFileName": MessageLookupByLibrary.simpleMessage("Unisci per nome file"), - "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Codice applicato"), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Codice copiato negli appunti"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Codice utilizzato da te"), - "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un\'applicazione o di un account ente. Ottimo per raccogliere foto di un evento."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link collaborativo"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Collaboratore"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -474,11 +418,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conferma chiave di recupero"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Conferma la tua chiave di recupero"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contatta il supporto"), - "contactToManageSubscription": m14, - "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), + "contactToManageSubscription": m17, + "contacts": MessageLookupByLibrary.simpleMessage("Contatti"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage("Continua la prova gratuita"), @@ -503,8 +447,6 @@ class MessageLookup extends MessageLookupByLibrary { "createAccount": MessageLookupByLibrary.simpleMessage("Crea account"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Premi a lungo per selezionare le foto e fai clic su + per creare un album"), - "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Crea un collage"), "createNewAccount": @@ -541,8 +483,6 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( "Questo eliminerà tutti gli album vuoti. È utile quando si desidera ridurre l\'ingombro nella lista degli album."), "deleteAll": MessageLookupByLibrary.simpleMessage("Elimina tutto"), - "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "Questo account è collegato ad altre app di ente, se ne utilizzi.\\n\\nI tuoi dati caricati, su tutte le app di ente, saranno pianificati per la cancellazione e il tuo account verrà eliminato definitivamente."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Invia un\'email a account-deletion@ente.io dal tuo indirizzo email registrato."), "deleteEmptyAlbums": @@ -553,13 +493,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina da entrambi"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), - "deleteFromEnte": - MessageLookupByLibrary.simpleMessage("Elimina da ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Manca una caratteristica chiave di cui ho bisogno"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -574,17 +512,11 @@ class MessageLookup extends MessageLookupByLibrary { "Eliminare l\'album condiviso?"), "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( "L\'album verrà eliminato per tutti\n\nPerderai l\'accesso alle foto condivise in questo album che sono di proprietà di altri"), - "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), "deselectAll": MessageLookupByLibrary.simpleMessage("Deseleziona tutti"), "designedToOutlive": MessageLookupByLibrary.simpleMessage("Progettato per sopravvivere"), "details": MessageLookupByLibrary.simpleMessage("Dettagli"), - "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "I file aggiunti in questa cartella del dispositivo verranno automaticamente caricati su ente."), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), - "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Disabilita il blocco schermo del dispositivo quando ente è in primo piano e c\'è un backup in corso. Questo normalmente non è necessario, ma può aiutare durante grossi caricamenti e le importazioni iniziali di grandi librerie si completano più velocemente."), "didYouKnow": MessageLookupByLibrary.simpleMessage("Lo sapevi che?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage( "Disabilita blocco automatico"), @@ -592,7 +524,7 @@ class MessageLookup extends MessageLookupByLibrary { "I visualizzatori possono scattare screenshot o salvare una copia delle foto utilizzando strumenti esterni"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Nota bene"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Disabilita autenticazione a due fattori"), "disablingTwofactorAuthentication": @@ -601,6 +533,7 @@ class MessageLookup extends MessageLookupByLibrary { "discord": MessageLookupByLibrary.simpleMessage("Discord"), "dismiss": MessageLookupByLibrary.simpleMessage("Ignora"), "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("km"), + "doNotSignOut": MessageLookupByLibrary.simpleMessage("Non uscire"), "doThisLater": MessageLookupByLibrary.simpleMessage("In seguito"), "doYouWantToDiscardTheEditsYouHaveMade": MessageLookupByLibrary.simpleMessage( @@ -613,21 +546,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Scaricamento fallito"), "downloading": MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Modifica"), - "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), + "editLocation": MessageLookupByLibrary.simpleMessage("Modifica luogo"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("Modifica luogo"), "editsSaved": MessageLookupByLibrary.simpleMessage("Modifiche salvate"), "editsToLocationWillOnlyBeSeenWithinEnte": MessageLookupByLibrary.simpleMessage( - "Edits to location will only be seen within Ente"), + "Le modifiche alla posizione saranno visibili solo all\'interno di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -645,13 +577,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Chiavi di crittografia"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage("Crittografia end-to-end"), - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": - MessageLookupByLibrary.simpleMessage( - "ente può criptare e preservare i file solo se concedi l\'accesso alle foto e ai video"), - "entePhotosPerm": MessageLookupByLibrary.simpleMessage( - "ente necessita del permesso per preservare le tue foto"), - "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "ente conserva i tuoi ricordi, in modo che siano sempre a disposizione, anche se perdi il dispositivo."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Aggiungi la tua famiglia al tuo piano."), "enterAlbumName": MessageLookupByLibrary.simpleMessage( @@ -668,9 +593,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Inserisci password"), "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Inserisci una password per criptare i tuoi dati"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( "Inserisci il codice di invito"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -692,8 +614,6 @@ class MessageLookup extends MessageLookupByLibrary { "Questo link è scaduto. Si prega di selezionare un nuovo orario di scadenza o disabilitare la scadenza del link."), "exportLogs": MessageLookupByLibrary.simpleMessage("Esporta log"), "exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"), - "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage( "Impossibile applicare il codice"), "failedToCancel": @@ -710,8 +630,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Rinnovo fallito"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Impossibile verificare lo stato del pagamento"), - "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "Aggiungi 5 membri della famiglia al tuo piano esistente senza pagare extra.\n\nOgni membro ottiene il proprio spazio privato e non può vedere i file dell\'altro a meno che non siano condivisi.\n\nI piani familiari sono disponibili per i clienti che hanno un abbonamento ente a pagamento.\n\nIscriviti ora per iniziare!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Famiglia"), "familyPlans": MessageLookupByLibrary.simpleMessage("Piano famiglia"), @@ -725,28 +643,27 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aggiungi descrizione..."), "fileSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvato nella galleria"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), "flip": MessageLookupByLibrary.simpleMessage("Capovolgi"), "forYourMemories": MessageLookupByLibrary.simpleMessage("per i tuoi ricordi"), "forgotPassword": MessageLookupByLibrary.simpleMessage("Password dimenticata"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Fino a 1000 ricordi mostrati nella galleria"), "general": MessageLookupByLibrary.simpleMessage("Generali"), @@ -761,20 +678,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Concedi il permesso"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Raggruppa foto nelle vicinanze"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Non teniamo traccia del numero di installazioni dell\'app. Sarebbe utile se ci dicesse dove ci ha trovato!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( "Come hai sentito parlare di Ente? (opzionale)"), "hidden": MessageLookupByLibrary.simpleMessage("Nascosti"), "hide": MessageLookupByLibrary.simpleMessage("Nascondi"), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), - "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), - "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), "hiding": MessageLookupByLibrary.simpleMessage("Nascondendo..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("Ospitato presso OSM France"), @@ -787,9 +696,6 @@ class MessageLookup extends MessageLookupByLibrary { "L\'autenticazione biometrica è disabilitata. Blocca e sblocca lo schermo per abilitarla."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignora"), - "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Alcuni file in questo album vengono ignorati dal caricamento perché erano stati precedentemente cancellati da ente."), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), "importing": MessageLookupByLibrary.simpleMessage("Importazione in corso...."), "incorrectCode": @@ -802,8 +708,8 @@ class MessageLookup extends MessageLookupByLibrary { "Il codice che hai inserito non è corretto"), "incorrectRecoveryKeyTitle": MessageLookupByLibrary.simpleMessage("Chiave di recupero errata"), - "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused, will automatically resume when device is ready"), + "indexedItems": + MessageLookupByLibrary.simpleMessage("Elementi indicizzati"), "insecureDevice": MessageLookupByLibrary.simpleMessage("Dispositivo non sicuro"), "installManually": @@ -814,21 +720,17 @@ class MessageLookup extends MessageLookupByLibrary { "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "La chiave di recupero che hai inserito non è valida. Assicurati che contenga 24 parole e controlla l\'ortografia di ciascuna parola.\n\nSe hai inserito un vecchio codice di recupero, assicurati che sia lungo 64 caratteri e controlla ciascuno di essi."), "invite": MessageLookupByLibrary.simpleMessage("Invita"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("Invita su ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Invita i tuoi amici"), - "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Invita i tuoi amici a ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"), "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati saranno rimossi da questo album"), - "joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"), "keepPhotos": MessageLookupByLibrary.simpleMessage("Mantieni foto"), "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( @@ -851,7 +753,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite dei dispositivi"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Attivato"), "linkExpired": MessageLookupByLibrary.simpleMessage("Scaduto"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Scadenza del link"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Il link è scaduto"), @@ -886,7 +788,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nome della località"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( "Un tag di localizzazione raggruppa tutte le foto scattate entro il raggio di una foto"), - "locations": MessageLookupByLibrary.simpleMessage("Locations"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Blocca"), "lockscreen": MessageLookupByLibrary.simpleMessage("Schermata di blocco"), @@ -897,9 +798,6 @@ class MessageLookup extends MessageLookupByLibrary { "logout": MessageLookupByLibrary.simpleMessage("Disconnetti"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Invia i log per aiutarci a risolvere il tuo problema. Si prega di notare che i nomi dei file saranno inclusi per aiutare a tenere traccia di problemi con file specifici."), - "longPressAnEmailToVerifyEndToEndEncryption": - MessageLookupByLibrary.simpleMessage( - "Long press an email to verify end to end encryption."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Premi a lungo su un elemento per visualizzarlo a schermo intero"), @@ -918,31 +816,30 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Mappe"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Mediocre"), - "modifyYourQueryOrTrySearchingFor": - MessageLookupByLibrary.simpleMessage( - "Modify your query, or try searching for"), "monthly": MessageLookupByLibrary.simpleMessage("Mensile"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Sposta nell\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Sposta in album nascosto"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Spostato nel cestino"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Spostamento dei file nell\'album..."), "name": MessageLookupByLibrary.simpleMessage("Nome"), + "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( + "Impossibile connettersi a Ente, riprova tra un po\' di tempo. Se l\'errore persiste, contatta l\'assistenza."), + "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( + "Impossibile connettersi a Ente, controlla le impostazioni di rete e contatta l\'assistenza se l\'errore persiste."), "never": MessageLookupByLibrary.simpleMessage("Mai"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nuovo album"), - "newToEnte": MessageLookupByLibrary.simpleMessage("Nuovo utente"), "newest": MessageLookupByLibrary.simpleMessage("Più recenti"), - "next": MessageLookupByLibrary.simpleMessage("Next"), "no": MessageLookupByLibrary.simpleMessage("No"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nessun album condiviso da te"), @@ -956,13 +853,13 @@ class MessageLookup extends MessageLookupByLibrary { "Nessuna foto o video nascosti"), "noImagesWithLocation": MessageLookupByLibrary.simpleMessage( "Nessuna immagine con posizione"), + "noInternetConnection": MessageLookupByLibrary.simpleMessage( + "Nessuna connessione internet"), "noPhotosAreBeingBackedUpRightNow": MessageLookupByLibrary.simpleMessage( "Il backup delle foto attualmente non viene eseguito"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Nessuna foto trovata"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Nessuna chiave di recupero?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -970,8 +867,6 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Nessun risultato"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nessun risultato trovato"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nulla di condiviso con te"), "nothingToSeeHere": @@ -1001,16 +896,16 @@ class MessageLookup extends MessageLookupByLibrary { "Password modificata con successo"), "passwordLock": MessageLookupByLibrary.simpleMessage("Blocco con password"), - "passwordStrength": m39, - "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), + "passwordStrength": m41, "passwordWarning": MessageLookupByLibrary.simpleMessage( "Noi non memorizziamo la tua password, quindi se te la dimentichi, non possiamo decriptare i tuoi dati"), "paymentDetails": MessageLookupByLibrary.simpleMessage("Dettagli di Pagamento"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, + "pendingItems": + MessageLookupByLibrary.simpleMessage("Elementi in sospeso"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sincronizzazione in sospeso"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( @@ -1030,24 +925,23 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Selezionare il punto centrale"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fissa l\'album"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), + "pleaseCheckYourInternetConnectionAndTryAgain": + MessageLookupByLibrary.simpleMessage( + "Si prega di verificare la propria connessione Internet e riprovare."), "pleaseContactSupportAndWeWillBeHappyToHelp": MessageLookupByLibrary.simpleMessage( "Contatta support@ente.io e saremo felici di aiutarti!"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Riprova. Se il problema persiste, ti invitiamo a contattare l\'assistenza"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( @@ -1081,7 +975,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Invia ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Valuta l\'app"), "rateUs": MessageLookupByLibrary.simpleMessage("Lascia una recensione"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Recupera"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recupera account"), @@ -1107,16 +1001,13 @@ class MessageLookup extends MessageLookupByLibrary { "recreatePasswordTitle": MessageLookupByLibrary.simpleMessage("Reimposta password"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), - "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Invita un amico e raddoppia il tuo spazio"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Condividi questo codice con i tuoi amici"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Si iscrivono per un piano a pagamento"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Invita un Amico"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "I referral code sono attualmente in pausa"), @@ -1135,18 +1026,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Rimuovi dall\'album"), "removeFromAlbumTitle": MessageLookupByLibrary.simpleMessage("Rimuovi dall\'album?"), - "removeFromFavorite": - MessageLookupByLibrary.simpleMessage("Rimuovi dai preferiti"), "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), - "removeParticipantBody": m46, - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), + "removeParticipantBody": m48, "removePublicLink": MessageLookupByLibrary.simpleMessage("Rimuovi link pubblico"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Alcuni degli elementi che stai rimuovendo sono stati aggiunti da altre persone e ne perderai l\'accesso"), "removeWithQuestionMark": @@ -1158,7 +1043,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rinomina file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Rinnova abbonamento"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Rinvia email"), @@ -1192,16 +1077,26 @@ class MessageLookup extends MessageLookupByLibrary { "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Scansione questo codice QR\ncon la tua app di autenticazione"), - "search": MessageLookupByLibrary.simpleMessage("Search"), + "searchAlbumsEmptySection": + MessageLookupByLibrary.simpleMessage("Album"), "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("Nome album"), "searchByExamples": MessageLookupByLibrary.simpleMessage( "• Nomi degli album (es. \"Camera\")\n• Tipi di file (es. \"Video\", \".gif\")\n• Anni e mesi (e.. \"2022\", \"gennaio\")\n• Vacanze (ad es. \"Natale\")\n• Descrizioni delle foto (ad es. “#mare”)"), + "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( + "Ricerca per data, mese o anno"), + "searchHint3": + MessageLookupByLibrary.simpleMessage("Album, nomi di file e tipi"), + "searchHint4": MessageLookupByLibrary.simpleMessage("Luogo"), + "searchLocationEmptySection": MessageLookupByLibrary.simpleMessage( + "Raggruppa foto scattate entro un certo raggio da una foto"), + "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( + "Invita persone e vedrai qui tutte le foto condivise da loro"), "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), "selectALocation": - MessageLookupByLibrary.simpleMessage("Select a location"), + MessageLookupByLibrary.simpleMessage("Seleziona un luogo"), "selectALocationFirst": - MessageLookupByLibrary.simpleMessage("Select a location first"), + MessageLookupByLibrary.simpleMessage("Scegli prima una posizione"), "selectAlbum": MessageLookupByLibrary.simpleMessage("Seleziona album"), "selectAll": MessageLookupByLibrary.simpleMessage("Seleziona tutto"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( @@ -1216,16 +1111,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Seleziona un motivo"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Seleziona un piano"), - "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "I file selezionati non sono su ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "Le cartelle selezionate verranno crittografate e salvate su ente"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Invia"), "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), @@ -1237,9 +1130,6 @@ class MessageLookup extends MessageLookupByLibrary { "setAs": MessageLookupByLibrary.simpleMessage("Imposta come"), "setCover": MessageLookupByLibrary.simpleMessage("Imposta copertina"), "setLabel": MessageLookupByLibrary.simpleMessage("Imposta"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Imposta password"), "setRadius": MessageLookupByLibrary.simpleMessage("Imposta raggio"), @@ -1252,20 +1142,13 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Condividi un album"), "shareLink": MessageLookupByLibrary.simpleMessage("Condividi link"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), - "shareTextConfirmOthersVerificationID": m52, - "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Scarica ente in modo da poter facilmente condividere foto e video senza perdita di qualità\n\nhttps://ente.io"), - "shareTextReferralCode": m53, - "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( - "Condividi con utenti che non hanno un account ente"), + "shareTextConfirmOthersVerificationID": m2, "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), - "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "Crea album condivisi e collaborativi con altri utenti ente, inclusi utenti su piani gratuiti."), "sharedByMe": MessageLookupByLibrary.simpleMessage("Condiviso da me"), "sharedByYou": MessageLookupByLibrary.simpleMessage("Condivise da te"), "sharedPhotoNotifications": @@ -1280,18 +1163,19 @@ class MessageLookup extends MessageLookupByLibrary { "sharing": MessageLookupByLibrary.simpleMessage("Condivisione in corso..."), "showMemories": MessageLookupByLibrary.simpleMessage("Mostra ricordi"), + "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( + "Esci dagli altri dispositivi"), + "signOutOtherBody": MessageLookupByLibrary.simpleMessage( + "Se pensi che qualcuno possa conoscere la tua password, puoi forzare tutti gli altri dispositivi che usano il tuo account ad uscire."), + "signOutOtherDevices": MessageLookupByLibrary.simpleMessage( + "Esci dagli altri dispositivi"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Accetto i termini di servizio e la politica sulla privacy"), "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), - "singleFileInBothLocalAndRemote": m57, - "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), - "someItemsAreInBothEnteAndYourDevice": - MessageLookupByLibrary.simpleMessage( - "Alcuni elementi sono sia su ente che sul tuo dispositivo."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Alcuni dei file che si sta tentando di eliminare sono disponibili solo sul dispositivo e non possono essere recuperati se cancellati"), @@ -1322,6 +1206,7 @@ class MessageLookup extends MessageLookupByLibrary { "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ Operazione riuscita"), "startBackup": MessageLookupByLibrary.simpleMessage("Avvia backup"), + "status": MessageLookupByLibrary.simpleMessage("Stato"), "storage": MessageLookupByLibrary.simpleMessage("Spazio di archiviazione"), "storageBreakupFamily": @@ -1332,7 +1217,6 @@ class MessageLookup extends MessageLookupByLibrary { "Limite d\'archiviazione superato"), "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m61, "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( @@ -1359,7 +1243,6 @@ class MessageLookup extends MessageLookupByLibrary { "tapToCopy": MessageLookupByLibrary.simpleMessage("tocca per copiare"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage( "Tocca per inserire il codice"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), "terminate": MessageLookupByLibrary.simpleMessage("Terminata"), @@ -1405,26 +1288,16 @@ class MessageLookup extends MessageLookupByLibrary { "Verrai disconnesso dai seguenti dispositivi:"), "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( "Verrai disconnesso dal tuo dispositivo!"), - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": - MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Per nascondere una foto o un video"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Per reimpostare la tua password, verifica prima la tua email."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Log di oggi"), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), "total": MessageLookupByLibrary.simpleMessage("totale"), "totalSize": MessageLookupByLibrary.simpleMessage("Dimensioni totali"), "trash": MessageLookupByLibrary.simpleMessage("Cestino"), "trashDaysLeft": m66, "tryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), - "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Attiva il backup per caricare automaticamente i file aggiunti in questa cartella del dispositivo su ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 mesi gratis sui piani annuali"), @@ -1470,9 +1343,6 @@ class MessageLookup extends MessageLookupByLibrary { "Caricamento dei file nell\'album..."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Lo spazio disponibile è limitato dal tuo piano corrente. L\'archiviazione in eccesso diventerà automaticamente utilizzabile quando aggiornerai il tuo piano."), - "usePublicLinksForPeopleNotOnEnte": - MessageLookupByLibrary.simpleMessage( - "Usa link pubblici per persone non registrate su ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage( "Utilizza un codice di recupero"), "useSelectedPhoto": @@ -1508,6 +1378,8 @@ class MessageLookup extends MessageLookupByLibrary { "viewer": MessageLookupByLibrary.simpleMessage("Sola lettura"), "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Visita web.ente.io per gestire il tuo abbonamento"), + "waitingForWifi": + MessageLookupByLibrary.simpleMessage("In attesa del WiFi..."), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("Siamo open source!"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": @@ -1550,7 +1422,6 @@ class MessageLookup extends MessageLookupByLibrary { "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), - "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), "yourPlanWasSuccessfullyDowngraded": MessageLookupByLibrary.simpleMessage( "Il tuo piano è stato aggiornato con successo"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart new file mode 100644 index 0000000000..a36e46602c --- /dev/null +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ja locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ja'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart new file mode 100644 index 0000000000..22d4231361 --- /dev/null +++ b/mobile/lib/generated/intl/messages_km.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a km locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'km'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 0ce3e0bd49..e378d62fd9 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -20,104 +20,28 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ko'; - static String m0(count) => - "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; - - static String m1(count) => - "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; - final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "addCollaborators": m0, - "addToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Add to hidden album"), - "addViewers": m1, - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), - "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), - "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( - "Change location of selected items?"), - "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), - "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), - "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), - "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), - "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), - "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), - "editsToLocationWillOnlyBeSeenWithinEnte": - MessageLookupByLibrary.simpleMessage( - "Edits to location will only be seen within Ente"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), - "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), - "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), - "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), - "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), - "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused, will automatically resume when device is ready"), - "joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"), - "locations": MessageLookupByLibrary.simpleMessage("Locations"), - "longPressAnEmailToVerifyEndToEndEncryption": - MessageLookupByLibrary.simpleMessage( - "Long press an email to verify end to end encryption."), - "modifyYourQueryOrTrySearchingFor": - MessageLookupByLibrary.simpleMessage( - "Modify your query, or try searching for"), - "moveToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "next": MessageLookupByLibrary.simpleMessage("Next"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), - "passwordLock": MessageLookupByLibrary.simpleMessage("Password lock"), - "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), - "search": MessageLookupByLibrary.simpleMessage("Search"), - "selectALocation": - MessageLookupByLibrary.simpleMessage("Select a location"), - "selectALocationFirst": - MessageLookupByLibrary.simpleMessage("Select a location first"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": - MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), - "yourMap": MessageLookupByLibrary.simpleMessage("Your map") + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("다시 오신 것을 환영합니다!"), + "askDeleteReason": + MessageLookupByLibrary.simpleMessage("계정을 삭제하는 가장 큰 이유가 무엇인가요?"), + "cancel": MessageLookupByLibrary.simpleMessage("닫기"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("계정 삭제 확인"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("계정 삭제"), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("계정을 영구적으로 삭제"), + "email": MessageLookupByLibrary.simpleMessage("이메일"), + "enterValidEmail": + MessageLookupByLibrary.simpleMessage("올바른 이메일 주소를 입력하세요."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("이메일을 입력하세요"), + "feedback": MessageLookupByLibrary.simpleMessage("피드백"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), + "verify": MessageLookupByLibrary.simpleMessage("인증"), + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") }; } diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 58088301a8..a33e630355 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'nl'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: 'Voeg samenwerker toe', one: 'Voeg samenwerker toe', other: 'Voeg samenwerkers toe')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Bestand toevoegen', other: 'Bestanden toevoegen')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Jouw ${storageAmount} add-on is geldig tot ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, one: 'Voeg kijker toe', other: 'Voeg kijkers toe')}"; - static String m4(emailOrName) => "Toegevoegd door ${emailOrName}"; + static String m7(emailOrName) => "Toegevoegd door ${emailOrName}"; - static String m5(albumName) => "Succesvol toegevoegd aan ${albumName}"; + static String m8(albumName) => "Succesvol toegevoegd aan ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Geen deelnemers', one: '1 deelnemer', other: '${count} deelnemers')}"; - static String m7(versionValue) => "Versie: ${versionValue}"; + static String m10(versionValue) => "Versie: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} vrij"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Annuleer eerst uw bestaande abonnement bij ${paymentProvider}"; - static String m10(user) => + static String m13(user) => "${user} zal geen foto\'s meer kunnen toevoegen aan dit album\n\nDe gebruiker zal nog steeds bestaande foto\'s kunnen verwijderen die door hen zijn toegevoegd"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Jouw familie heeft ${storageAmountInGb} GB geclaimd tot nu toe', @@ -58,113 +58,116 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Je hebt ${storageAmountInGb} GB geclaimd tot nu toe!', })}"; - static String m12(albumName) => + static String m15(albumName) => "Gezamenlijke link aangemaakt voor ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw abonnement te beheren"; - static String m14(provider) => + static String m17(provider) => "Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren."; - static String m15(endpoint) => "Verbonden met ${endpoint}"; + static String m18(endpoint) => "Verbonden met ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Verwijderen van ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Dit verwijdert de openbare link voor toegang tot \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} bestanden, elk ${formattedSize}"; - static String m22(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; + static String m25(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast"; - static String m27(endDate) => "Gratis proefversie geldig tot ${endDate}"; + static String m30(endDate) => "Gratis proefversie geldig tot ${endDate}"; - static String m28(count) => + static String m31(count) => "Je hebt nog steeds toegang tot ${Intl.plural(count, one: 'het', other: 'ze')} op Ente zolang je een actief abonnement hebt"; - static String m29(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; + static String m32(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Het kan verwijderd worden van het apparaat om ${formattedSize} vrij te maken', other: 'Ze kunnen verwijderd worden van het apparaat om ${formattedSize} vrij te maken')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Verwerken van ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m33(expiryTime) => "Link vervalt op ${expiryTime}"; + static String m36(expiryTime) => "Link vervalt op ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'geen herinneringen', one: '${formattedCount} herinnering', other: '${formattedCount} herinneringen')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Bestand verplaatsen', other: 'Bestanden verplaatsen')}"; - static String m36(albumName) => "Succesvol verplaatst naar ${albumName}"; + static String m38(albumName) => "Succesvol verplaatst naar ${albumName}"; - static String m37(name) => "Niet ${name}?"; + static String m39(name) => "Niet ${name}?"; - static String m39(passwordStrengthValue) => + static String m40(familyAdminEmail) => + "Neem contact op met ${familyAdminEmail} om uw code te wijzigen."; + + static String m41(passwordStrengthValue) => "Wachtwoord sterkte: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Praat met ${providerName} klantenservice als u in rekening bent gebracht"; - static String m41(endDate) => + static String m43(endDate) => "Gratis proefperiode geldig tot ${endDate}.\nU kunt naderhand een betaald abonnement kiezen."; - static String m42(toEmail) => "Stuur ons een e-mail op ${toEmail}"; + static String m44(toEmail) => "Stuur ons een e-mail op ${toEmail}"; - static String m43(toEmail) => + static String m45(toEmail) => "Verstuur de logboeken alstublieft naar ${toEmail}"; - static String m44(storeName) => "Beoordeel ons op ${storeName}"; + static String m46(storeName) => "Beoordeel ons op ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "Jullie krijgen allebei ${storageInGB} GB* gratis"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} zal worden verwijderd uit dit gedeelde album\n\nAlle door hen toegevoegde foto\'s worden ook uit het album verwijderd"; - static String m47(endDate) => "Wordt verlengd op ${endDate}"; + static String m49(endDate) => "Wordt verlengd op ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} resultaat gevonden', other: '${count} resultaten gevonden')}"; - static String m49(count) => "${count} geselecteerd"; + static String m1(count) => "${count} geselecteerd"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} geselecteerd (${yourCount} van jou)"; - static String m51(verificationID) => + static String m52(verificationID) => "Hier is mijn verificatie-ID: ${verificationID} voor ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hey, kunt u bevestigen dat dit uw ente.io verificatie-ID is: ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -236,10 +239,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nieuw e-mailadres toevoegen"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Samenwerker toevoegen"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Toevoegen vanaf apparaat"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Locatie toevoegen"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Toevoegen"), @@ -247,7 +250,7 @@ class MessageLookup extends MessageLookupByLibrary { "addNew": MessageLookupByLibrary.simpleMessage("Nieuwe toevoegen"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Details van add-ons"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Add-ons"), "addPhotos": MessageLookupByLibrary.simpleMessage("Foto\'s toevoegen"), "addSelected": @@ -258,12 +261,12 @@ class MessageLookup extends MessageLookupByLibrary { "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Toevoegen aan verborgen album"), "addViewer": MessageLookupByLibrary.simpleMessage("Voeg kijker toe"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Voeg nu je foto\'s toe"), "addedAs": MessageLookupByLibrary.simpleMessage("Toegevoegd als"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Toevoegen aan favorieten..."), "advanced": MessageLookupByLibrary.simpleMessage("Geavanceerd"), @@ -274,7 +277,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Na 1 week"), "after1Year": MessageLookupByLibrary.simpleMessage("Na 1 jaar"), "albumOwner": MessageLookupByLibrary.simpleMessage("Eigenaar"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Albumtitel"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album bijgewerkt"), @@ -312,8 +315,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie vereist"), "appLock": MessageLookupByLibrary.simpleMessage("App-vergrendeling"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "Kies tussen het standaard vergrendelscherm van uw apparaat en een aangepast vergrendelscherm met een pincode of wachtwoord."), + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Toepassen"), "applyCodeTitle": @@ -360,8 +363,6 @@ class MessageLookup extends MessageLookupByLibrary { "Graag verifiëren om tweestapsverificatie te configureren"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Gelieve te verifiëren om het verwijderen van je account te starten"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Graag verifiëren om uw actieve sessies te bekijken"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -391,7 +392,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatisch koppelen werkt alleen met apparaten die Chromecast ondersteunen."), "available": MessageLookupByLibrary.simpleMessage("Beschikbaar"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Back-up mappen"), "backup": MessageLookupByLibrary.simpleMessage("Back-up"), @@ -416,10 +417,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Kan alleen bestanden verwijderen die jouw eigendom zijn"), "cancel": MessageLookupByLibrary.simpleMessage("Annuleer"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Abonnement opzeggen"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Kan gedeelde bestanden niet verwijderen"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -429,6 +430,7 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "Bezoek cast.ente.io op het apparaat dat u wilt koppelen.\n\nVoer de code hieronder in om het album op uw TV af te spelen."), "centerPoint": MessageLookupByLibrary.simpleMessage("Middelpunt"), + "change": MessageLookupByLibrary.simpleMessage("Wijzigen"), "changeEmail": MessageLookupByLibrary.simpleMessage("E-mail wijzigen"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Locatie van geselecteerde items wijzigen?"), @@ -438,6 +440,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wachtwoord wijzigen"), "changePermissions": MessageLookupByLibrary.simpleMessage("Rechten aanpassen?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Wijzig uw verwijzingscode"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Controleer op updates"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( @@ -446,24 +450,24 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Status controleren"), "checking": MessageLookupByLibrary.simpleMessage("Controleren..."), "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Selecteer foto\'s en bekijk de \"Gastweergave\"."), + "Selecteer foto\'s en bekijk \"Gastweergave\"."), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Geef je je telefoon aan een vriend om foto\'s te laten zien? Maak je geen zorgen dat ze te ver swipen. Gastweergave vergrendelt ze op de foto\'s die je selecteert."), + "Geeft u een vriend uw telefoon om foto\'s te laten zien? Maakt u zich geen zorgen dat ze te ver swipen. Gastweergave zal diegene beperken tot de foto\'s die u selecteert."), "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("Gastweergave"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto\'s met 360 graden weergaven. De ervaring is meeslepend met bewegingsgestuurde navigatie!"), + "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto\'s met 360 graden weergave. De ervaring is immersief met op beweging gebaseerde navigatie!"), "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Panorama Viewer"), + MessageLookupByLibrary.simpleMessage("Panoramakijker"), "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "We introduceren een nieuwe videospeler met betere afspeelbediening en ondersteuning voor HDR-video\'s."), + "Een verfrissende nieuwe videospeler, met betere afspeelknoppen en ondersteuning voor HDR-video\'s."), "cl_video_player_title": MessageLookupByLibrary.simpleMessage("Videospeler"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Claim gratis opslag"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim meer!"), "claimed": MessageLookupByLibrary.simpleMessage("Geclaimd"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Ongecategoriseerd opschonen"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -482,6 +486,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Voortgang clusteren"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Code toegepast"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Sorry, u heeft de limiet van het aantal codewijzigingen bereikt."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Code gekopieerd naar klembord"), "codeUsedByYou": @@ -490,7 +496,7 @@ class MessageLookup extends MessageLookupByLibrary { "Maak een link waarmee mensen foto\'s in jouw gedeelde album kunnen toevoegen en bekijken zonder dat ze daarvoor een Ente app of account nodig hebben. Handig voor het verzamelen van foto\'s van evenementen."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Gezamenlijke link"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Samenwerker"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -520,10 +526,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"), "connectToDevice": MessageLookupByLibrary.simpleMessage( "Verbinding maken met apparaat"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contacten"), "contents": MessageLookupByLibrary.simpleMessage("Inhoud"), "continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"), @@ -568,7 +574,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Huidig gebruik is "), "custom": MessageLookupByLibrary.simpleMessage("Aangepast"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Donker"), "dayToday": MessageLookupByLibrary.simpleMessage("Vandaag"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gisteren"), @@ -604,12 +610,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Verwijder van Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Verwijder locatie"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Ik mis een belangrijke functie"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -651,7 +657,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kijkers kunnen nog steeds screenshots maken of een kopie van je foto\'s opslaan met behulp van externe tools"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Let op"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Tweestapsverificatie uitschakelen"), "disablingTwofactorAuthentication": @@ -672,9 +678,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download mislukt"), "downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Bewerken"), "editLocation": MessageLookupByLibrary.simpleMessage("Locatie bewerken"), @@ -687,8 +693,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bewerkte locatie wordt alleen gezien binnen Ente"), "eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-mailverificatie"), "emailYourLogs": @@ -696,10 +702,14 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Leeg"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Prullenbak leegmaken?"), + "enable": MessageLookupByLibrary.simpleMessage("Inschakelen"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente ondersteunt on-device machine learning voor gezichtsherkenning, magisch zoeken en andere geavanceerde zoekfuncties"), "enableMaps": MessageLookupByLibrary.simpleMessage("Kaarten inschakelen"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Dit toont jouw foto\'s op een wereldkaart.\n\nDeze kaart wordt gehost door Open Street Map, en de exacte locaties van jouw foto\'s worden nooit gedeeld.\n\nJe kunt deze functie op elk gewenst moment uitschakelen via de instellingen."), + "enabled": MessageLookupByLibrary.simpleMessage("Ingeschakeld"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Back-up versleutelen..."), "encryption": MessageLookupByLibrary.simpleMessage("Encryptie"), @@ -799,8 +809,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -816,25 +826,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gezichten gevonden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Apparaatruimte vrijmaken"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Bespaar ruimte op je apparaat door bestanden die al geback-upt zijn te wissen."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Ruimte vrijmaken"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Tot 1000 herinneringen getoond in de galerij"), "general": MessageLookupByLibrary.simpleMessage("Algemeen"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Encryptiesleutels genereren..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Ga naar instellingen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -844,9 +854,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Toestemming verlenen"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage("Groep foto\'s in de buurt"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Gasten weergave"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Om gasten weergave in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -911,7 +921,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Bestanden tonen het aantal resterende dagen voordat ze permanent worden verwijderd"), @@ -939,7 +949,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Apparaat limiet"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Ingeschakeld"), "linkExpired": MessageLookupByLibrary.simpleMessage("Verlopen"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Vervaldatum"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link is vervallen"), @@ -1001,6 +1011,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Machine Learning"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magische zoekfunctie"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "Magisch zoeken maakt het mogelijk om foto\'s op hun inhoud worden gezocht, bijvoorbeeld \"bloem\", \"rode auto\", \"identiteitsdocumenten\""), "manage": MessageLookupByLibrary.simpleMessage("Beheren"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage("Apparaatopslag beheren"), @@ -1016,10 +1028,20 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Kaarten"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlConsent": + MessageLookupByLibrary.simpleMessage("Schakel machine learning in"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Ik begrijp het, en wil machine learning inschakelen"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Als u machine learning inschakelt, zal Ente informatie zoals gezichtsgeometrie uit bestanden extraheren, inclusief degenen die met u gedeeld worden.\n\nDit gebeurt op uw apparaat, en alle gegenereerde biometrische informatie zal end-to-end versleuteld worden."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Klik hier voor meer details over deze functie in ons privacybeleid."), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage( + "Machine learning inschakelen?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Houd er rekening mee dat dit zal resulteren in een hoger internet- en batterijverbruik totdat alle items zijn geïndexeerd."), + "Houd er rekening mee dat machine learning zal leiden tot hoger bandbreedte- en batterijgebruik totdat alle items geïndexeerd zijn. Overweeg het gebruik van de desktop app voor snellere indexering. Alle resultaten worden automatisch gesynchroniseerd."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobiel, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Matig"), @@ -1028,12 +1050,13 @@ class MessageLookup extends MessageLookupByLibrary { "Pas je zoekopdracht aan of zoek naar"), "moments": MessageLookupByLibrary.simpleMessage("Momenten"), "monthly": MessageLookupByLibrary.simpleMessage("Maandelijks"), - "moveItem": m35, + "moreDetails": MessageLookupByLibrary.simpleMessage("Meer details"), + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Verplaats naar album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Verplaatsen naar verborgen album"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Naar prullenbak verplaatst"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1071,8 +1094,8 @@ class MessageLookup extends MessageLookupByLibrary { "Er worden momenteel geen foto\'s geback-upt"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Geen foto\'s gevonden hier"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Geen snelle links geselecteerd"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Geen herstelcode?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1082,7 +1105,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Geen resultaten gevonden"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Geen systeemvergrendeling gevonden"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nog niets met je gedeeld"), "nothingToSeeHere": @@ -1092,6 +1115,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Op het apparaat"), "onEnte": MessageLookupByLibrary.simpleMessage( "Op ente"), + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Oeps"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oeps, kon bewerkingen niet opslaan"), @@ -1120,7 +1144,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Wachtwoord succesvol aangepast"), "passwordLock": MessageLookupByLibrary.simpleMessage("Wachtwoord slot"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "De wachtwoordsterkte wordt berekend aan de hand van de lengte van het wachtwoord, de gebruikte tekens en of het wachtwoord al dan niet in de top 10.000 van meest gebruikte wachtwoorden staat"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1131,7 +1155,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Betaling mislukt"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Helaas is je betaling mislukt. Neem contact op met support zodat we je kunnen helpen!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Bestanden in behandeling"), "pendingSync": MessageLookupByLibrary.simpleMessage( @@ -1161,7 +1185,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN vergrendeling"), "playOnTv": MessageLookupByLibrary.simpleMessage("Album afspelen op TV"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore abonnement"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1173,14 +1197,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Neem contact op met klantenservice als het probleem aanhoudt"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Geef alstublieft toestemming"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Log opnieuw in"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "Selecteer snelle links om te verwijderen"), + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Probeer het nog eens"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1215,7 +1239,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Meld probleem"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Beoordeel de app"), "rateUs": MessageLookupByLibrary.simpleMessage("Beoordeel ons"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Herstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Account herstellen"), @@ -1250,7 +1274,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Geef deze code aan je vrienden"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ze registreren voor een betaald plan"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Referenties"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Verwijzingen zijn momenteel gepauzeerd"), @@ -1274,17 +1298,17 @@ class MessageLookup extends MessageLookupByLibrary { "removeFromAlbumTitle": MessageLookupByLibrary.simpleMessage("Uit album verwijderen?"), "removeFromFavorite": - MessageLookupByLibrary.simpleMessage("Verwijderen uit favorieten"), + MessageLookupByLibrary.simpleMessage("Verwijder van favorieten"), "removeLink": MessageLookupByLibrary.simpleMessage("Verwijder link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Deelnemer verwijderen"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Verwijder persoonslabel"), "removePublicLink": MessageLookupByLibrary.simpleMessage("Verwijder publieke link"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Verwijder publieke link"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Sommige van de items die je verwijdert zijn door andere mensen toegevoegd, en je verliest de toegang daartoe"), "removeWithQuestionMark": @@ -1298,7 +1322,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bestandsnaam wijzigen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement verlengen"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Een fout melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fout melden"), "resendEmail": @@ -1314,6 +1338,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Terugzetten naar album"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Bestanden herstellen..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Hervatbare uploads"), "retry": MessageLookupByLibrary.simpleMessage("Opnieuw"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Controleer en verwijder de bestanden die u denkt dat dubbel zijn."), @@ -1367,7 +1393,7 @@ class MessageLookup extends MessageLookupByLibrary { "Foto\'s groeperen die in een bepaalde straal van een foto worden genomen"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecteer een locatie"), @@ -1394,8 +1420,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Verzenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-mail versturen"), "sendInvite": @@ -1425,10 +1451,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Deel nu een album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link delen"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Deel alleen met de mensen die u wilt"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente zodat we gemakkelijk foto\'s en video\'s in originele kwaliteit kunnen delen\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1585,10 +1611,10 @@ class MessageLookup extends MessageLookupByLibrary { "Dit zal je uitloggen van dit apparaat!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), + "Hiermee worden openbare links van alle geselecteerde snelle links verwijderd."), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": MessageLookupByLibrary.simpleMessage( - "Om vergrendelscherm in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen."), + "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Om een foto of video te verbergen"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( @@ -1625,6 +1651,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album uit archief halen"), "unarchiving": MessageLookupByLibrary.simpleMessage("Uit het archief halen..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Deze code is helaas niet beschikbaar."), "uncategorized": MessageLookupByLibrary.simpleMessage("Ongecategoriseerd"), "unhide": MessageLookupByLibrary.simpleMessage("Zichtbaar maken"), @@ -1687,8 +1715,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bekijk alle EXIF gegevens"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Grote bestanden"), - "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Bekijk bestanden die de meeste opslagruimte verbruiken"), "viewLogs": MessageLookupByLibrary.simpleMessage("Logboeken bekijken"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Toon herstelsleutel"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 9ac7fbaee5..e5badae7f5 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -20,127 +20,444 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'no'; - static String m0(count) => - "${Intl.plural(count, zero: 'Add collaborator', one: 'Add collaborator', other: 'Add collaborators')}"; + static String m9(count) => + "${Intl.plural(count, zero: 'Ingen deltakere', one: '1 Deltaker', other: '${count} Deltakere')}"; - static String m1(count) => - "${Intl.plural(count, zero: 'Add viewer', one: 'Add viewer', other: 'Add viewers')}"; + static String m13(user) => + "${user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem"; + + static String m19(count) => + "${Intl.plural(count, one: 'Slett ${count} element', other: 'Slett ${count} elementer')}"; + + static String m21(albumName) => + "Dette fjerner den offentlige lenken for tilgang til \"${albumName}\"."; + + static String m22(supportEmail) => + "Vennligst send en e-post til ${supportEmail} fra din registrerte e-postadresse"; + + static String m24(count, formattedSize) => + "${count} filer, ${formattedSize} hver"; + + static String m35(count) => + "${Intl.plural(count, one: '${count} element', other: '${count} elementer')}"; + + static String m36(expiryTime) => "Lenken utløper på ${expiryTime}"; + + static String m0(count, formattedCount) => + "${Intl.plural(count, zero: 'ingen minner', one: '${formattedCount} minne', other: '${formattedCount} minner')}"; + + static String m41(passwordStrengthValue) => + "Passordstyrke: ${passwordStrengthValue}"; + + static String m1(count) => "${count} valgt"; + + static String m51(count, yourCount) => "${count} valgt (${yourCount} dine)"; + + static String m52(verificationID) => + "Her er min verifiserings-ID: ${verificationID} for ente.io."; + + static String m2(verificationID) => + "Hei, kan du bekrefte at dette er din ente.io verifiserings-ID: ${verificationID}"; + + static String m54(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: 'Del med bestemte personer', one: 'Delt med 1 person', other: 'Delt med ${numberOfPeople} personer')}"; + + static String m65(email) => "Dette er ${email} sin verifiserings-ID"; + + static String m68(email) => "Verifiser ${email}"; + + static String m69(email) => + "Vi har sendt en e-post til ${email}"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Velkommen tilbake!"), - "addCollaborators": m0, - "addToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Add to hidden album"), - "addViewers": m1, - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "Jeg forstår at dersom jeg mister passordet mitt, kan jeg miste dataen min, siden daten er ende-til-ende-kryptert."), + "activeSessions": MessageLookupByLibrary.simpleMessage("Aktive økter"), + "addANewEmail": + MessageLookupByLibrary.simpleMessage("Legg til ny e-post"), + "addCollaborator": + MessageLookupByLibrary.simpleMessage("Legg til samarbeidspartner"), + "addMore": MessageLookupByLibrary.simpleMessage("Legg til flere"), + "addViewer": MessageLookupByLibrary.simpleMessage("Legg til seer"), + "addedAs": MessageLookupByLibrary.simpleMessage("Lagt til som"), + "advanced": MessageLookupByLibrary.simpleMessage("Avansert"), + "advancedSettings": MessageLookupByLibrary.simpleMessage("Avansert"), + "after1Day": MessageLookupByLibrary.simpleMessage("Etter 1 dag"), + "after1Hour": MessageLookupByLibrary.simpleMessage("Etter 1 time"), + "after1Month": MessageLookupByLibrary.simpleMessage("Etter 1 måned"), + "after1Week": MessageLookupByLibrary.simpleMessage("Etter 1 uke"), + "after1Year": MessageLookupByLibrary.simpleMessage("Etter 1 år"), + "albumOwner": MessageLookupByLibrary.simpleMessage("Eier"), + "albumParticipantsCount": m9, + "albumUpdated": MessageLookupByLibrary.simpleMessage("Album oppdatert"), + "albums": MessageLookupByLibrary.simpleMessage("Album"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Tillat folk med lenken å også legge til bilder til det delte albumet."), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("Tillat å legge til bilder"), + "allowDownloads": + MessageLookupByLibrary.simpleMessage("Tillat nedlastinger"), + "apply": MessageLookupByLibrary.simpleMessage("Anvend"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Hva er hovedårsaken til at du sletter kontoen din?"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), - "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), + "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( + "Vennligst autentiser deg for å se dine skjulte filer"), + "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din"), "cancel": MessageLookupByLibrary.simpleMessage("Avbryt"), - "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( - "Change location of selected items?"), - "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), + "cannotAddMorePhotosAfterBecomingViewer": m13, + "changeEmail": + MessageLookupByLibrary.simpleMessage("Endre e-postadresse"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("Bytt passord"), + "changePermissions": + MessageLookupByLibrary.simpleMessage("Endre tillatelser?"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "Sjekk innboksen din (og spam) for å fullføre verifikasjonen"), + "clearIndexes": MessageLookupByLibrary.simpleMessage("Tøm indekser"), + "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "Kode kopiert til utklippstavlen"), + "collaborativeLink": + MessageLookupByLibrary.simpleMessage("Samarbeidslenke"), + "collaborator": + MessageLookupByLibrary.simpleMessage("Samarbeidspartner"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "Samarbeidspartnere kan legge til bilder og videoer i det delte albumet."), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Samle bilder"), + "confirm": MessageLookupByLibrary.simpleMessage("Bekreft"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekreft sletting av konto"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( "Ja, jeg ønsker å slette denne kontoen og all dataen dens permanent."), - "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), - "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("Bekreft passordet"), + "confirmRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Bekreft gjenopprettingsnøkkel"), + "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Bekreft din gjenopprettingsnøkkel"), + "contactSupport": + MessageLookupByLibrary.simpleMessage("Kontakt kundestøtte"), + "continueLabel": MessageLookupByLibrary.simpleMessage("Fortsett"), + "copyLink": MessageLookupByLibrary.simpleMessage("Kopier lenke"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Kopier og lim inn denne koden\ntil autentiseringsappen din"), + "createAccount": MessageLookupByLibrary.simpleMessage("Opprett konto"), + "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( + "Trykk og holde inne for å velge bilder, og trykk på + for å lage et album"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("Opprett ny konto"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("Opprett offentlig lenke"), + "custom": MessageLookupByLibrary.simpleMessage("Egendefinert"), + "decrypting": MessageLookupByLibrary.simpleMessage("Dekrypterer..."), "deleteAccount": MessageLookupByLibrary.simpleMessage("Slett konto"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( "Vi er lei oss for at du forlater oss. Gi oss gjerne en tilbakemelding så vi kan forbedre oss."), - "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "This account is linked to other ente apps, if you use any.\\n\\nYour uploaded data, across all ente apps, will be scheduled for deletion, and your account will be permanently deleted."), - "descriptions": MessageLookupByLibrary.simpleMessage("Descriptions"), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), - "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), - "editsToLocationWillOnlyBeSeenWithinEnte": - MessageLookupByLibrary.simpleMessage( - "Edits to location will only be seen within Ente"), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("Slett bruker for altid"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "Vennligst send en e-post til account-deletion@ente.io fra din registrerte e-postadresse."), + "deleteFromBoth": + MessageLookupByLibrary.simpleMessage("Slett fra begge"), + "deleteFromDevice": + MessageLookupByLibrary.simpleMessage("Slett fra enhet"), + "deleteItemCount": m19, + "deletePhotos": MessageLookupByLibrary.simpleMessage("Slett bilder"), + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "Det mangler en hovedfunksjon jeg trenger"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "Appen, eller en bestemt funksjon, fungerer ikke slik jeg tror den skal"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "Jeg fant en annen tjeneste jeg liker bedre"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("Grunnen min er ikke listet"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "Forespørselen din vil bli behandlet innen 72 timer."), + "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( + "Seere kan fremdeles ta skjermbilder eller lagre en kopi av bildene dine ved bruk av eksterne verktøy"), + "disableDownloadWarningTitle": + MessageLookupByLibrary.simpleMessage("Vær oppmerksom på"), + "disableLinkMessage": m21, + "doThisLater": + MessageLookupByLibrary.simpleMessage("Gjør dette senere"), + "done": MessageLookupByLibrary.simpleMessage("Ferdig"), + "dropSupportEmail": m22, + "duplicateItemsGroup": m24, "email": MessageLookupByLibrary.simpleMessage("E-post"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), + "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), + "encryptionKeys": + MessageLookupByLibrary.simpleMessage("Krypteringsnøkkel"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente trenger tillatelse for å bevare bildene dine"), + "enterCode": MessageLookupByLibrary.simpleMessage("Angi kode"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "Angi koden fra vennen din for å få gratis lagringsplass for dere begge"), + "enterEmail": MessageLookupByLibrary.simpleMessage("Skriv inn e-post"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Angi et nytt passord vi kan bruke til å kryptere dataene dine"), + "enterPassword": MessageLookupByLibrary.simpleMessage("Angi passord"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Angi et passord vi kan bruke til å kryptere dataene dine"), + "enterReferralCode": + MessageLookupByLibrary.simpleMessage("Angi vervekode"), + "enterThe6digitCodeFromnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Skriv inn den 6-sifrede koden fra\ndin autentiseringsapp"), "enterValidEmail": MessageLookupByLibrary.simpleMessage( "Vennligst skriv inn en gyldig e-postadresse."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( "Skriv inn e-postadressen din"), - "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), + "enterYourPassword": + MessageLookupByLibrary.simpleMessage("Angi passordet ditt"), + "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Skriv inn din gjenopprettingsnøkkel"), + "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( + "Denne lenken er utløpt. Vennligst velg en ny utløpstid eller deaktiver lenkeutløp."), + "failedToLoadAlbums": + MessageLookupByLibrary.simpleMessage("Kunne ikke laste inn album"), + "familyPlans": + MessageLookupByLibrary.simpleMessage("Familieabonnementer"), "feedback": MessageLookupByLibrary.simpleMessage("Tilbakemelding"), - "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), - "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), - "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), - "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused, will automatically resume when device is ready"), + "forgotPassword": MessageLookupByLibrary.simpleMessage("Glemt passord"), + "general": MessageLookupByLibrary.simpleMessage("Generelt"), + "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( + "Genererer krypteringsnøkler..."), + "hidden": MessageLookupByLibrary.simpleMessage("Skjult"), + "howItWorks": + MessageLookupByLibrary.simpleMessage("Hvordan det fungerer"), + "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( + "Vennligst be dem om å trykke og holde inne på e-postadressen sin på innstillingsskjermen, og bekreft at ID-ene på begge enhetene er like."), + "importing": MessageLookupByLibrary.simpleMessage("Importerer...."), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("Feil passord"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "Gjennopprettingsnøkkelen du skrev inn er feil"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("Feil gjenopprettingsnøkkel"), + "indexedItems": + MessageLookupByLibrary.simpleMessage("Indekserte elementer"), + "insecureDevice": MessageLookupByLibrary.simpleMessage("Usikker enhet"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Ugyldig e-postadresse"), - "joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"), + "invalidKey": MessageLookupByLibrary.simpleMessage("Ugyldig nøkkel"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Gjenopprettingsnøkkelen du har skrevet inn er ikke gyldig. Kontroller at den inneholder 24 ord og kontroller stavemåten av hvert ord.\n\nHvis du har angitt en eldre gjenopprettingskode, må du kontrollere at den er 64 tegn lang, og kontrollere hvert av dem."), + "itemCount": m35, + "keepPhotos": MessageLookupByLibrary.simpleMessage("Behold Bilder"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "Vær vennlig og hjelp oss med denne informasjonen"), - "locations": MessageLookupByLibrary.simpleMessage("Locations"), - "longPressAnEmailToVerifyEndToEndEncryption": + "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Enhetsgrense"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktivert"), + "linkExpired": MessageLookupByLibrary.simpleMessage("Utløpt"), + "linkExpiresOn": m36, + "linkExpiry": MessageLookupByLibrary.simpleMessage("Lenkeutløp"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("Lenken har utløpt"), + "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldri"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"), + "logInLabel": MessageLookupByLibrary.simpleMessage("Logg inn"), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "Ved å klikke Logg inn, godtar jeg brukervilkårene og personvernreglene"), + "lostDevice": MessageLookupByLibrary.simpleMessage("Mistet enhet?"), + "machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"), + "magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søk"), + "manage": MessageLookupByLibrary.simpleMessage("Administrer"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("Behandle enhetslagring"), + "manageLink": MessageLookupByLibrary.simpleMessage("Administrer lenke"), + "manageParticipants": + MessageLookupByLibrary.simpleMessage("Administrer"), + "memoryCount": m0, + "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderat"), + "movedToTrash": + MessageLookupByLibrary.simpleMessage("Flyttet til papirkurven"), + "never": MessageLookupByLibrary.simpleMessage("Aldri"), + "newAlbum": MessageLookupByLibrary.simpleMessage("Nytt album"), + "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Ingen"), + "noRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Ingen gjenopprettingsnøkkel?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "Grunnet vår type ente-til-ende-krypteringsprotokoll kan ikke dine data dekrypteres uten passordet ditt eller gjenopprettingsnøkkelen din"), + "notifications": MessageLookupByLibrary.simpleMessage("Varslinger"), + "ok": MessageLookupByLibrary.simpleMessage("Ok"), + "oops": MessageLookupByLibrary.simpleMessage("Oisann"), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("Eller velg en eksisterende"), + "password": MessageLookupByLibrary.simpleMessage("Passord"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("Passordet ble endret"), + "passwordLock": MessageLookupByLibrary.simpleMessage("Passordlås"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "Vi lagrer ikke dette passordet, så hvis du glemmer det, kan vi ikke dekryptere dataene dine"), + "pendingItems": + MessageLookupByLibrary.simpleMessage("Ventende elementer"), + "photoGridSize": + MessageLookupByLibrary.simpleMessage("Bilderutenettstørrelse"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("bilde"), + "pleaseTryAgain": + MessageLookupByLibrary.simpleMessage("Vennligst prøv igjen"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("Vennligst vent..."), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("Personvernserklæring"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("Offentlig lenke aktivert"), + "recover": MessageLookupByLibrary.simpleMessage("Gjenopprett"), + "recoverAccount": + MessageLookupByLibrary.simpleMessage("Gjenopprett konto"), + "recoverButton": MessageLookupByLibrary.simpleMessage("Gjenopprett"), + "recoveryKey": + MessageLookupByLibrary.simpleMessage("Gjenopprettingsnøkkel"), + "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "Gjenopprettingsnøkkel kopiert til utklippstavlen"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "Hvis du glemmer passordet ditt er den eneste måten du kan gjenopprette dataene dine på med denne nøkkelen."), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "Vi lagrer ikke denne nøkkelen, vennligst lagre denne 24-ords nøkkelen på et trygt sted."), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "Flott! Din gjenopprettingsnøkkel er gyldig. Takk for bekreftelsen.\n\nVennligst husk å holde gjenopprettingsnøkkelen din trygt sikkerhetskopiert."), + "recoveryKeyVerified": MessageLookupByLibrary.simpleMessage( + "Gjenopprettingsnøkkel bekreftet"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "Gjenopprettings nøkkelen er den eneste måten å gjenopprette bildene dine hvis du glemmer passordet ditt. Du kan finne gjenopprettingsnøkkelen din i Innstillinger > Sikkerhet.\n\nVennligst skriv inn gjenopprettingsnøkkelen din her for å bekrefte at du har lagret den riktig."), + "recoverySuccessful": MessageLookupByLibrary.simpleMessage( + "Gjenopprettingen var vellykket!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "Den gjeldende enheten er ikke kraftig nok til å verifisere passordet ditt, men vi kan regenerere på en måte som fungerer på alle enheter.\n\nVennligst logg inn med gjenopprettingsnøkkelen og regenerer passordet (du kan bruke den samme igjen om du vil)."), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("Gjenopprett passord"), + "referrals": MessageLookupByLibrary.simpleMessage("Vervinger"), + "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( + "Du kan også tømme \"Papirkurven\" for å få den frigjorte lagringsplassen"), + "remove": MessageLookupByLibrary.simpleMessage("Fjern"), + "removeLink": MessageLookupByLibrary.simpleMessage("Fjern lenke"), + "removeParticipant": + MessageLookupByLibrary.simpleMessage("Fjern deltaker"), + "removePublicLink": + MessageLookupByLibrary.simpleMessage("Fjern offentlig lenke"), + "resendEmail": + MessageLookupByLibrary.simpleMessage("Send e-posten på nytt"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("Tilbakestill passord"), + "saveKey": MessageLookupByLibrary.simpleMessage("Lagre nøkkel"), + "saveYourRecoveryKeyIfYouHaventAlready": MessageLookupByLibrary.simpleMessage( - "Long press an email to verify end to end encryption."), - "modifyYourQueryOrTrySearchingFor": + "Lagre gjenopprettingsnøkkelen hvis du ikke allerede har gjort det"), + "scanCode": MessageLookupByLibrary.simpleMessage("Skann kode"), + "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( - "Modify your query, or try searching for"), - "moveToHiddenAlbum": - MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "next": MessageLookupByLibrary.simpleMessage("Next"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), - "passwordLock": MessageLookupByLibrary.simpleMessage("Password lock"), - "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), - "search": MessageLookupByLibrary.simpleMessage("Search"), - "selectALocation": - MessageLookupByLibrary.simpleMessage("Select a location"), - "selectALocationFirst": - MessageLookupByLibrary.simpleMessage("Select a location first"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": + "Skann denne strekkoden med\nautentiseringsappen din"), + "security": MessageLookupByLibrary.simpleMessage("Sikkerhet"), + "selectAll": MessageLookupByLibrary.simpleMessage("Velg alle"), + "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( + "Velg mapper for sikkerhetskopiering"), + "selectReason": MessageLookupByLibrary.simpleMessage("Velg grunn"), + "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": + "Valgte mapper vil bli kryptert og sikkerhetskopiert"), + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, + "sendEmail": MessageLookupByLibrary.simpleMessage("Send e-post"), + "sendInvite": MessageLookupByLibrary.simpleMessage("Send invitasjon"), + "sendLink": MessageLookupByLibrary.simpleMessage("Send lenke"), + "setAPassword": MessageLookupByLibrary.simpleMessage("Lag et passord"), + "setPasswordTitle": + MessageLookupByLibrary.simpleMessage("Lag et passord"), + "setupComplete": + MessageLookupByLibrary.simpleMessage("Oppsett fullført"), + "shareALink": MessageLookupByLibrary.simpleMessage("Del en lenke"), + "shareMyVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, + "shareWithPeopleSectionTitle": m54, + "sharedPhotoNotifications": + MessageLookupByLibrary.simpleMessage("Nye delte bilder"), + "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( + "Motta varsler når noen legger til et bilde i et delt album som du er en del av"), + "sharing": MessageLookupByLibrary.simpleMessage("Deler..."), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "Jeg godtar bruksvilkårene og personvernreglene"), + "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( + "Den vil bli slettet fra alle album."), + "skip": MessageLookupByLibrary.simpleMessage("Hopp over"), + "someoneSharingAlbumsWithYouShouldSeeTheSameId": MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), + "Folk som deler album med deg bør se den samme ID-en på deres enhet."), + "somethingWentWrong": + MessageLookupByLibrary.simpleMessage("Noe gikk galt"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Noe gikk galt. Vennligst prøv igjen"), + "sorry": MessageLookupByLibrary.simpleMessage("Beklager"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "Beklager, vi kunne ikke generere sikre nøkler på denne enheten.\n\nvennligst registrer deg fra en annen enhet."), + "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ Suksess"), + "status": MessageLookupByLibrary.simpleMessage("Status"), + "strongStrength": MessageLookupByLibrary.simpleMessage("Sterkt"), + "tapToCopy": + MessageLookupByLibrary.simpleMessage("trykk for å kopiere"), + "tapToEnterCode": + MessageLookupByLibrary.simpleMessage("Trykk for å angi kode"), + "terminate": MessageLookupByLibrary.simpleMessage("Avslutte"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("Avslutte økten?"), + "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Vilkår"), + "thisCanBeUsedToRecoverYourAccountIfYou": + MessageLookupByLibrary.simpleMessage( + "Dette kan brukes til å gjenopprette kontoen din hvis du mister din andre faktor"), + "thisDevice": MessageLookupByLibrary.simpleMessage("Denne enheten"), + "thisIsPersonVerificationId": m65, + "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( + "Dette er din bekreftelses-ID"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "Dette vil logge deg ut av følgende enhet:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "Dette vil logge deg ut av denne enheten!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "For å tilbakestille passordet ditt, vennligt bekreft e-posten din først."), + "trash": MessageLookupByLibrary.simpleMessage("Papirkurv"), + "tryAgain": MessageLookupByLibrary.simpleMessage("Prøv igjen"), + "twofactorAuthenticationPageTitle": + MessageLookupByLibrary.simpleMessage("Tofaktorautentisering"), + "twofactorSetup": + MessageLookupByLibrary.simpleMessage("Oppsett av to-faktor"), + "uncategorized": MessageLookupByLibrary.simpleMessage("Ukategorisert"), + "unselectAll": MessageLookupByLibrary.simpleMessage("Velg bort alle"), + "updatingFolderSelection": + MessageLookupByLibrary.simpleMessage("Oppdaterer mappevalg..."), + "useRecoveryKey": + MessageLookupByLibrary.simpleMessage("Bruk gjenopprettingsnøkkel"), + "verificationId": + MessageLookupByLibrary.simpleMessage("Verifiserings-ID"), "verify": MessageLookupByLibrary.simpleMessage("Bekreft"), - "yourMap": MessageLookupByLibrary.simpleMessage("Your map") + "verifyEmail": + MessageLookupByLibrary.simpleMessage("Bekreft e-postadresse"), + "verifyEmailID": m68, + "verifyPassword": + MessageLookupByLibrary.simpleMessage("Bekreft passord"), + "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Verifiserer gjenopprettingsnøkkel..."), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("video"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("Vis gjenopprettingsnøkkel"), + "viewer": MessageLookupByLibrary.simpleMessage("Seer"), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("Svakt"), + "welcomeBack": + MessageLookupByLibrary.simpleMessage("Velkommen tilbake!"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("Ja, konverter til seer"), + "yesDelete": MessageLookupByLibrary.simpleMessage("Ja, slett"), + "you": MessageLookupByLibrary.simpleMessage("Deg"), + "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage( + "Du kan ikke dele med deg selv"), + "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( + "Brukeren din har blitt slettet") }; } diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 5d80b3aaa2..8cb6018be4 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'pl'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, one: 'Dodaj współuczestnika', few: 'Dodaj współuczestników', many: 'Dodaj współuczestników', other: 'Dodaj współuczestników')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Dodaj element', few: 'Dodaj elementy', other: 'Dodaj elementów')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Twój dodatek ${storageAmount} jest ważny do ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, one: 'Dodaj widza', few: 'Dodaj widzów', many: 'Dodaj widzów', other: 'Dodaj widzów')}"; - static String m4(emailOrName) => "Dodane przez ${emailOrName}"; + static String m7(emailOrName) => "Dodane przez ${emailOrName}"; - static String m5(albumName) => "Pomyślnie dodano do ${albumName}"; + static String m8(albumName) => "Pomyślnie dodano do ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Brak Uczestników', one: '1 Uczestnik', other: '${count} Uczestników')}"; - static String m7(versionValue) => "Wersja: ${versionValue}"; + static String m10(versionValue) => "Wersja: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} za darmo"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Prosimy najpierw anulować istniejącą subskrypcję z ${paymentProvider}"; - static String m10(user) => + static String m13(user) => "${user} nie będzie mógł dodać więcej zdjęć do tego albumu\n\nJednak nadal będą mogli usunąć istniejące zdjęcia, które dodali"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Twoja rodzina odebrała ${storageAmountInGb} GB do tej pory', @@ -58,115 +58,115 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Odebrałeś ${storageAmountInGb} GB do tej pory!', })}"; - static String m12(albumName) => "Utworzono link współpracy dla ${albumName}"; + static String m15(albumName) => "Utworzono link współpracy dla ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Prosimy skontaktować się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; - static String m14(provider) => + static String m17(provider) => "Skontaktuj się z nami pod adresem support@ente.io, aby zarządzać subskrypcją ${provider}."; - static String m15(endpoint) => "Połączono z ${endpoint}"; + static String m18(endpoint) => "Połączono z ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Usuń ${count} element', few: 'Usuń ${count} elementy', many: 'Usuń ${count} elementów', other: 'Usuń ${count} elementu')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Usuwanie ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Spowoduje to usunięcie publicznego linku dostępu do \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Wyślij wiadomość e-mail na ${supportEmail} z zarejestrowanego adresu e-mail"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Wyczyszczono ${Intl.plural(count, one: '${count} zdduplikowany plik', other: '${count} zdduplikowane pliki')}, oszczędzając (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} plików, każdy po ${formattedSize}"; - static String m22(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; + static String m25(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} nie posiada konta Ente.\n\nWyślij im zaproszenie do udostępniania zdjęć."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} w tym albumie została bezpiecznie utworzona kopia zapasowa"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB za każdym razem, gdy ktoś zarejestruje się w płatnym planie i użyje twojego kodu"; - static String m27(endDate) => "Okres próbny ważny do ${endDate}"; + static String m30(endDate) => "Okres próbny ważny do ${endDate}"; - static String m28(count) => + static String m31(count) => "Nadal możesz mieć dostęp ${Intl.plural(count, one: 'do tego', other: 'do tych')} na Ente tak długo, jak masz aktywną subskrypcję"; - static String m29(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Można to usunąć z urządzenia, aby zwolnić ${formattedSize}', other: 'Można je usunąć z urządzenia, aby zwolnić ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Przetwarzanie ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} element', few: '${count} elementy', many: '${count} elementów', other: '${count} elementu')}"; - static String m33(expiryTime) => "Link wygaśnie ${expiryTime}"; + static String m36(expiryTime) => "Link wygaśnie ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'brak wspomnień', one: '${formattedCount} wspomnienie', few: '${formattedCount} wspomnienia', other: '${formattedCount} wspomnień')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Przenieś element', few: 'Przenieś elementy', other: 'Przenieś elementów')}"; - static String m36(albumName) => "Pomyślnie przeniesiono do ${albumName}"; + static String m38(albumName) => "Pomyślnie przeniesiono do ${albumName}"; - static String m37(name) => "Nie ${name}?"; + static String m39(name) => "Nie ${name}?"; - static String m38(familyAdminEmail) => + static String m40(familyAdminEmail) => "Skontaktuj się z ${familyAdminEmail}, aby zmienić swój kod."; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Siła hasła: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; - static String m41(endDate) => + static String m43(endDate) => "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; - static String m42(toEmail) => + static String m44(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; - static String m43(toEmail) => "Prosimy wysłać logi do ${toEmail}"; + static String m45(toEmail) => "Prosimy wysłać logi do ${toEmail}"; - static String m44(storeName) => "Oceń nas na ${storeName}"; + static String m46(storeName) => "Oceń nas na ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Oboje otrzymujecie ${storageInGB} GB* za darmo"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu"; - static String m47(endDate) => "Subskrypcja odnowi się ${endDate}"; + static String m49(endDate) => "Subskrypcja odnowi się ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: 'Znaleziono ${count} wynik', few: 'Znaleziono ${count} wyniki', other: 'Znaleziono ${count} wyników')}"; - static String m49(count) => "Wybrano ${count}"; + static String m1(count) => "Wybrano ${count}"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "Wybrano ${count} (twoich ${yourCount})"; - static String m51(verificationID) => + static String m52(verificationID) => "Oto mój identyfikator weryfikacyjny: ${verificationID} dla ente.io."; - static String m52(verificationID) => + static String m2(verificationID) => "Hej, czy możesz potwierdzić, że to jest Twój identyfikator weryfikacyjny ente.io: ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -236,10 +236,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dodaj nowy adres e-mail"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Dodaj współuczestnika"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Dodaj z urządzenia"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Dodaj lokalizację"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Dodaj"), @@ -247,7 +247,7 @@ class MessageLookup extends MessageLookupByLibrary { "addNew": MessageLookupByLibrary.simpleMessage("Dodaj nowe"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Szczegóły dodatków"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Dodatki"), "addPhotos": MessageLookupByLibrary.simpleMessage("Dodaj zdjęcia"), "addSelected": MessageLookupByLibrary.simpleMessage("Dodaj zaznaczone"), @@ -256,12 +256,12 @@ class MessageLookup extends MessageLookupByLibrary { "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Dodaj do ukrytego albumu"), "addViewer": MessageLookupByLibrary.simpleMessage("Dodaj widza"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Dodaj swoje zdjęcia teraz"), "addedAs": MessageLookupByLibrary.simpleMessage("Dodano jako"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Dodawanie do ulubionych..."), "advanced": MessageLookupByLibrary.simpleMessage("Zaawansowane"), @@ -273,7 +273,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Po 1 tygodniu"), "after1Year": MessageLookupByLibrary.simpleMessage("Po 1 roku"), "albumOwner": MessageLookupByLibrary.simpleMessage("Właściciel"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Tytuł albumu"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Album został zaktualizowany"), @@ -315,7 +315,7 @@ class MessageLookup extends MessageLookupByLibrary { "Blokada dostępu do aplikacji"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Zastosuj"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Użyj kodu"), @@ -392,7 +392,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatyczne parowanie działa tylko z urządzeniami obsługującymi Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Dostępne"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Foldery kopii zapasowej"), "backup": MessageLookupByLibrary.simpleMessage("Kopia zapasowa"), @@ -419,10 +419,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Można usuwać tylko pliki należące do Ciebie"), "cancel": MessageLookupByLibrary.simpleMessage("Anuluj"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Anuluj subskrypcję"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Nie można usunąć udostępnionych plików"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -468,7 +468,7 @@ class MessageLookup extends MessageLookupByLibrary { "Odbierz bezpłatną przestrzeń dyskową"), "claimMore": MessageLookupByLibrary.simpleMessage("Zdobądź więcej!"), "claimed": MessageLookupByLibrary.simpleMessage("Odebrano"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Wyczyść Nieskategoryzowane"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -498,7 +498,7 @@ class MessageLookup extends MessageLookupByLibrary { "Utwórz link, aby umożliwić innym dodawanie i przeglądanie zdjęć w udostępnionym albumie bez konieczności korzystania z aplikacji lub konta Ente. Świetne rozwiązanie do gromadzenia zdjęć ze wspólnych wydarzeń."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link do współpracy"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Współuczestnik"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -527,10 +527,10 @@ class MessageLookup extends MessageLookupByLibrary { "Potwierdź klucz odzyskiwania"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Połącz z urządzeniem"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Kontakty"), "contents": MessageLookupByLibrary.simpleMessage("Zawartość"), "continueLabel": MessageLookupByLibrary.simpleMessage("Kontynuuj"), @@ -574,7 +574,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Aktualne użycie to "), "custom": MessageLookupByLibrary.simpleMessage("Niestandardowy"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Ciemny"), "dayToday": MessageLookupByLibrary.simpleMessage("Dzisiaj"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Wczoraj"), @@ -607,11 +607,11 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Usuń z urządzenia"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Usuń z Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Usuń lokalizację"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Usuń zdjęcia"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Brakuje kluczowej funkcji, której potrzebuję"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -652,7 +652,7 @@ class MessageLookup extends MessageLookupByLibrary { "Widzowie mogą nadal robić zrzuty ekranu lub zapisywać kopie zdjęć za pomocą programów trzecich"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Uwaga"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Wyłącz uwierzytelnianie dwustopniowe"), "disablingTwofactorAuthentication": @@ -674,9 +674,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Pobieranie nie powiodło się"), "downloading": MessageLookupByLibrary.simpleMessage("Pobieranie..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Edytuj"), "editLocation": MessageLookupByLibrary.simpleMessage("Edytuj lokalizację"), @@ -688,8 +688,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edycje lokalizacji będą widoczne tylko w Ente"), "eligible": MessageLookupByLibrary.simpleMessage("kwalifikujący się"), "email": MessageLookupByLibrary.simpleMessage("Adres e-mail"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Weryfikacja e-mail"), "emailYourLogs": @@ -800,8 +800,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Rodzaje plików"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Typy plików i nazwy"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Pliki usunięto"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Pliki zapisane do galerii"), @@ -815,26 +815,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Znaleziono twarze"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Bezpłatna pamięć, którą odebrano"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Darmowa pamięć użyteczna"), "freeTrial": MessageLookupByLibrary.simpleMessage("Darmowy okres próbny"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Zwolnij miejsce na urządzeniu"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Oszczędzaj miejsce na urządzeniu poprzez wyczyszczenie plików, które zostały już przesłane."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Zwolnij miejsce"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "W galerii wyświetlane jest do 1000 pamięci"), "general": MessageLookupByLibrary.simpleMessage("Ogólne"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generowanie kluczy szyfrujących..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Przejdź do ustawień"), "googlePlayId": @@ -913,7 +913,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elementy pokazują liczbę dni pozostałych przed trwałym usunięciem"), @@ -942,7 +942,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limit urządzeń"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktywny"), "linkExpired": MessageLookupByLibrary.simpleMessage("Wygasł"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Wygaśnięcie linku"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link wygasł"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Nigdy"), @@ -1023,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Mapy"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Sklep"), "mlConsent": MessageLookupByLibrary.simpleMessage("Włącz uczenie maszynowe"), @@ -1047,12 +1047,12 @@ class MessageLookup extends MessageLookupByLibrary { "monthly": MessageLookupByLibrary.simpleMessage("Miesięcznie"), "moreDetails": MessageLookupByLibrary.simpleMessage("Więcej szczegółów"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do albumu"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do ukrytego albumu"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Przeniesiono do kosza"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1100,7 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nie znaleziono wyników"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nie znaleziono blokady systemowej"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Nic Ci jeszcze nie udostępniono"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1110,7 +1110,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), "onEnte": MessageLookupByLibrary.simpleMessage("W ente"), - "onlyFamilyAdminCanChangeCode": m38, + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ups, nie udało się zapisać zmian"), @@ -1139,7 +1139,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Hasło zostało pomyślnie zmienione"), "passwordLock": MessageLookupByLibrary.simpleMessage("Blokada hasłem"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Siła hasła jest obliczana, biorąc pod uwagę długość hasła, użyte znaki, i czy hasło pojawi się w 10 000 najczęściej używanych haseł"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1150,7 +1150,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Płatność się nie powiodła"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Oczekujące elementy"), "pendingSync": @@ -1179,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Odtwórz album na telewizorze"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1191,14 +1191,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Prosimy wybrać szybkie linki do usunięcia"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1233,7 +1233,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Zgłoś"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Oceń aplikację"), "rateUs": MessageLookupByLibrary.simpleMessage("Oceń nas"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Odzyskaj"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Odzyskaj konto"), @@ -1269,7 +1269,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Przekaż ten kod swoim znajomym"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. Wykupują płatny plan"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Polecenia"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), @@ -1295,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Usuń link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Usuń użytkownika"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Usuń etykietę osoby"), "removePublicLink": @@ -1314,7 +1314,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Zmień nazwę pliku"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Odnów subskrypcję"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "reportBug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "resendEmail": @@ -1385,7 +1385,7 @@ class MessageLookup extends MessageLookupByLibrary { "Grupuj zdjęcia zrobione w promieniu zdjęcia"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "selectALocation": MessageLookupByLibrary.simpleMessage("Wybierz lokalizację"), @@ -1411,8 +1411,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Wybrane elementy zostaną usunięte ze wszystkich albumów i przeniesione do kosza."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Wyślij"), "sendEmail": MessageLookupByLibrary.simpleMessage("Wyślij e-mail"), "sendInvite": @@ -1439,10 +1439,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Udostępnij teraz album"), "shareLink": MessageLookupByLibrary.simpleMessage("Udostępnij link"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Udostępnij tylko ludziom, którym chcesz"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Pobierz Ente, abyśmy mogli łatwo udostępniać zdjęcia i wideo w oryginalnej jakości\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1710,7 +1710,7 @@ class MessageLookup extends MessageLookupByLibrary { "Wyświetl wszystkie dane EXIF"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Duże pliki"), "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Wyświetl pliki zużywające największą ilość pamięci"), + "Wyświetl pliki zużywające największą ilość pamięci."), "viewLogs": MessageLookupByLibrary.simpleMessage("Wyświetl logi"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Zobacz klucz odzyskiwania"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index af88659609..0472cbcbe0 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -20,37 +20,37 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'pt'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: 'Adicionar colaborador', one: 'Adicionar colaborador', other: 'Adicionar colaboradores')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Adicionar item', other: 'Adicionar itens')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Seu complemento ${storageAmount} é válido até o dia ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, zero: 'Adicionar visualizador', one: 'Adicionar visualizador', other: 'Adicionar Visualizadores')}"; - static String m4(emailOrName) => "Adicionado por ${emailOrName}"; + static String m7(emailOrName) => "Adicionado por ${emailOrName}"; - static String m5(albumName) => "Adicionado com sucesso a ${albumName}"; + static String m8(albumName) => "Adicionado com sucesso a ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Nenhum Participante', one: '1 Participante', other: '${count} Participantes')}"; - static String m7(versionValue) => "Versão: ${versionValue}"; + static String m10(versionValue) => "Versão: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} livre"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Por favor, cancele sua assinatura existente do ${paymentProvider} primeiro"; - static String m10(user) => + static String m13(user) => "${user} Não poderá adicionar mais fotos a este álbum\n\nEles ainda poderão remover as fotos existentes adicionadas por eles"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Sua família reeinvindicou ${storageAmountInGb} GB até agora', @@ -58,114 +58,114 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Você reeinvindicou ${storageAmountInGb} GB até agora', })}"; - static String m12(albumName) => "Link colaborativo criado para ${albumName}"; + static String m15(albumName) => "Link colaborativo criado para ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Entre em contato com ${familyAdminEmail} para gerenciar sua assinatura"; - static String m14(provider) => + static String m17(provider) => "Entre em contato conosco pelo e-mail support@ente.io para gerenciar sua assinatura ${provider}."; - static String m15(endpoint) => "Conectado a ${endpoint}"; + static String m18(endpoint) => "Conectado a ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Excluir ${count} item', other: 'Excluir ${count} itens')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Excluindo ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Isso removerá o link público para acessar \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Por favor, envie um e-mail para ${supportEmail} a partir do seu endereço de e-mail registrado"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Você limpou ${Intl.plural(count, one: '${count} arquivo duplicado', other: '${count} arquivos duplicados')}, salvando (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} Arquivos, ${formattedSize} cada"; - static String m22(newEmail) => "E-mail alterado para ${newEmail}"; + static String m25(newEmail) => "E-mail alterado para ${newEmail}"; - static String m23(email) => + static String m26(email) => "${email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste dispositivo teve um backup seguro"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste álbum teve um backup seguro"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguém se inscrever para um plano pago e aplica o seu código"; - static String m27(endDate) => "Teste gratuito acaba em ${endDate}"; + static String m30(endDate) => "Teste gratuito acaba em ${endDate}"; - static String m28(count) => + static String m31(count) => "Você ainda pode acessar ${Intl.plural(count, one: 'ele', other: 'eles')} no Ente contanto que você tenha uma assinatura ativa"; - static String m29(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Pode ser excluído do dispositivo para liberar ${formattedSize}', other: 'Eles podem ser excluídos do dispositivo para liberar ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Processando ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m33(expiryTime) => "O link irá expirar em ${expiryTime}"; + static String m36(expiryTime) => "O link irá expirar em ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'sem memórias', one: '${formattedCount} memória', other: '${formattedCount} memórias')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Mover item', other: 'Mover itens')}"; - static String m36(albumName) => "Movido com sucesso para ${albumName}"; + static String m38(albumName) => "Movido com sucesso para ${albumName}"; - static String m37(name) => "Não é ${name}?"; + static String m39(name) => "Não é ${name}?"; - static String m38(familyAdminEmail) => + static String m40(familyAdminEmail) => "Entre em contato com ${familyAdminEmail} para alterar o seu código."; - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Segurança da senha: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Por favor, fale com o suporte ${providerName} se você foi cobrado"; - static String m41(endDate) => + static String m43(endDate) => "Teste gratuito válido até ${endDate}.\nVocê pode escolher um plano pago depois."; - static String m42(toEmail) => + static String m44(toEmail) => "Por favor, envie-nos um e-mail para ${toEmail}"; - static String m43(toEmail) => "Por favor, envie os logs para \n${toEmail}"; + static String m45(toEmail) => "Por favor, envie os logs para \n${toEmail}"; - static String m44(storeName) => "Avalie-nos em ${storeName}"; + static String m46(storeName) => "Avalie-nos em ${storeName}"; - static String m45(storageInGB) => "3. Ambos ganham ${storageInGB} GB* grátis"; + static String m47(storageInGB) => "3. Ambos ganham ${storageInGB} GB* grátis"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} será removido deste álbum compartilhado\n\nQuaisquer fotos adicionadas por eles também serão removidas do álbum"; - static String m47(endDate) => "Renovação de assinatura em ${endDate}"; + static String m49(endDate) => "Renovação de assinatura em ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultado encontrado')}"; - static String m49(count) => "${count} Selecionados"; + static String m1(count) => "${count} Selecionados"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "${count} Selecionado (${yourCount} seus)"; - static String m51(verificationID) => + static String m52(verificationID) => "Aqui está meu ID de verificação para o Ente.io: ${verificationID}"; - static String m52(verificationID) => + static String m2(verificationID) => "Ei, você pode confirmar que este é seu ID de verificação do Ente.io? ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -236,17 +236,17 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Adicionar um novo e-mail"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Adicionar colaborador"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage( "Adicionar a partir do dispositivo"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Adicionar local"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Adicionar"), "addMore": MessageLookupByLibrary.simpleMessage("Adicione mais"), "addNew": MessageLookupByLibrary.simpleMessage("Adicionar novo"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Detalhes dos complementos"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Complementos"), "addPhotos": MessageLookupByLibrary.simpleMessage("Adicionar fotos"), "addSelected": @@ -258,12 +258,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Adicionar a álbum oculto"), "addViewer": MessageLookupByLibrary.simpleMessage("Adicionar visualizador"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Adicione suas fotos agora"), "addedAs": MessageLookupByLibrary.simpleMessage("Adicionado como"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage( "Adicionando aos favoritos..."), "advanced": MessageLookupByLibrary.simpleMessage("Avançado"), @@ -274,7 +274,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Após 1 semana"), "after1Year": MessageLookupByLibrary.simpleMessage("Após 1 ano"), "albumOwner": MessageLookupByLibrary.simpleMessage("Proprietário"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Título do álbum"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Álbum atualizado"), @@ -314,7 +314,7 @@ class MessageLookup extends MessageLookupByLibrary { "appLock": MessageLookupByLibrary.simpleMessage("Bloqueio de app"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("ID da Apple"), "apply": MessageLookupByLibrary.simpleMessage("Aplicar"), "applyCodeTitle": @@ -391,7 +391,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "O pareamento automático funciona apenas com dispositivos que suportam o Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponível"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Pastas com backup"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -417,10 +417,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Só é possível remover arquivos de sua propriedade"), "cancel": MessageLookupByLibrary.simpleMessage("Cancelar"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancelar assinatura"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Não é possível excluir arquivos compartilhados"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -466,7 +466,7 @@ class MessageLookup extends MessageLookupByLibrary { "Reivindicar armazenamento gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Reivindique mais!"), "claimed": MessageLookupByLibrary.simpleMessage("Reivindicado"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Limpar Sem Categoria"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -495,7 +495,7 @@ class MessageLookup extends MessageLookupByLibrary { "Crie um link para permitir que as pessoas adicionem e vejam fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link Colaborativo"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -524,10 +524,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirme sua chave de recuperação"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar ao dispositivo"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Contate o suporte"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contatos"), "contents": MessageLookupByLibrary.simpleMessage("Conteúdos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -571,7 +571,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("O uso atual é "), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Escuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoje"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ontem"), @@ -607,10 +607,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Excluir do dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Excluir do Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Excluir Local"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Excluir fotos"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Está faltando um recurso-chave que eu preciso"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -651,7 +651,7 @@ class MessageLookup extends MessageLookupByLibrary { "Os espectadores ainda podem tirar screenshots ou salvar uma cópia de suas fotos usando ferramentas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Observe"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Desativar autenticação de dois fatores"), "disablingTwofactorAuthentication": @@ -675,9 +675,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Falha no download"), "downloading": MessageLookupByLibrary.simpleMessage("Fazendo download..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar local"), "editLocationTagTitle": @@ -688,8 +688,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edições para local só serão vistas dentro do Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegível"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verificação por e-mail"), "emailYourLogs": @@ -799,8 +799,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de arquivo"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de arquivo e nomes"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Arquivos excluídos"), "filesSavedToGallery": @@ -816,25 +816,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Rostos encontrados"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Armazenamento gratuito reivindicado"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Armazenamento livre utilizável"), "freeTrial": MessageLookupByLibrary.simpleMessage("Teste gratuito"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Liberar espaço no dispositivo"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Economize espaço no seu dispositivo limpando arquivos que já foram salvos em backup."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Liberar espaço"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Até 1000 memórias mostradas na galeria"), "general": MessageLookupByLibrary.simpleMessage("Geral"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Gerando chaves de criptografia..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Ir para Configurações"), "googlePlayId": @@ -912,7 +912,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Os itens mostram o número de dias restantes antes da exclusão permanente"), @@ -941,7 +941,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite do dispositivo"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expirado"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiração do link"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("O link expirou"), @@ -1021,7 +1021,7 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Mapas"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Produtos"), "mlConsent": MessageLookupByLibrary.simpleMessage( "Habilitar aprendizado de máquina"), @@ -1044,11 +1044,11 @@ class MessageLookup extends MessageLookupByLibrary { "moments": MessageLookupByLibrary.simpleMessage("Momentos"), "monthly": MessageLookupByLibrary.simpleMessage("Mensal"), "moreDetails": MessageLookupByLibrary.simpleMessage("Mais detalhes"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover para álbum"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Mover para álbum oculto"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Movido para a lixeira"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1096,7 +1096,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nenhum resultado encontrado"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nenhum bloqueio de sistema encontrado"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Nada compartilhado com você ainda"), "nothingToSeeHere": @@ -1106,7 +1106,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("No dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Em ente"), - "onlyFamilyAdminCanChangeCode": m38, + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Opa"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ops, não foi possível salvar edições"), @@ -1136,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Senha alterada com sucesso"), "passwordLock": MessageLookupByLibrary.simpleMessage("Bloqueio por senha"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "Força da senha é calculada considerando o comprimento da senha, caracteres usados, e se a senha aparece ou não nas 10.000 senhas mais usadas"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -1147,7 +1147,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Falha no pagamento"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Infelizmente o seu pagamento falhou. Entre em contato com o suporte e nós ajudaremos você!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Itens pendentes"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sincronização pendente"), @@ -1175,7 +1175,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Bloqueio PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproduzir álbum na TV"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Assinatura da PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1187,14 +1187,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contate o suporte se o problema persistir"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Por favor, conceda as permissões"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inicie sessão novamente"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Selecione links rápidos para remover"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Por favor, tente novamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1231,7 +1231,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Avalie o aplicativo"), "rateUs": MessageLookupByLibrary.simpleMessage("Avalie-nos"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar conta"), @@ -1266,7 +1266,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Dê este código aos seus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscrevem em um plano pago"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Indicações"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Indicações estão atualmente pausadas"), @@ -1292,7 +1292,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remover link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remover participante"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remover etiqueta da pessoa"), "removePublicLink": @@ -1310,7 +1310,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renomear arquivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar assinatura"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar um problema"), "reportBug": @@ -1384,7 +1384,7 @@ class MessageLookup extends MessageLookupByLibrary { "Fotos de grupo que estão sendo tiradas em algum raio da foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Convide pessoas e você verá todas as fotos compartilhadas por elas aqui"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Segurança"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecionar um local"), @@ -1412,8 +1412,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Os itens selecionados serão excluídos de todos os álbuns e movidos para a lixeira."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar e-mail"), "sendInvite": MessageLookupByLibrary.simpleMessage("Enviar convite"), @@ -1442,10 +1442,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartilhar um álbum agora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartilhar link"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Compartilhar apenas com as pessoas que você quiser"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1548,7 +1548,7 @@ class MessageLookup extends MessageLookupByLibrary { "successfullyUnarchived": MessageLookupByLibrary.simpleMessage("Desarquivado com sucesso"), "successfullyUnhid": - MessageLookupByLibrary.simpleMessage("Desocultado com sucesso"), + MessageLookupByLibrary.simpleMessage("Reexibido com sucesso"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir recurso"), "support": MessageLookupByLibrary.simpleMessage("Suporte"), @@ -1709,7 +1709,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Arquivos grandes"), "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Ver arquivos que estão consumindo mais espaço de armazenamento"), + "Ver arquivos que estão consumindo mais espaço de armazenamento."), "viewLogs": MessageLookupByLibrary.simpleMessage("Ver logs"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Ver chave de recuperação"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index b62f043922..e40aaf8ce5 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -20,147 +20,149 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ru'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, one: 'Добавьте соавтора', few: 'Добавьте соавторов', many: 'Добавьте соавторов', other: 'Добавьте соавторов')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Добавить элемент', other: 'Добавить элементы')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "Ваше дополнение ${storageAmount} действительно по ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, one: 'Добавьте зрителя', few: 'Добавьте зрителей', many: 'Добавьте зрителей', other: 'Добавьте зрителей')}"; - static String m4(emailOrName) => "Добавлено ${emailOrName}"; + static String m7(emailOrName) => "Добавлено ${emailOrName}"; - static String m5(albumName) => "Успешно добавлено в ${albumName}"; + static String m8(albumName) => "Успешно добавлено в ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Нет Участников', one: '1 Участник', other: '${count} Участника')}"; - static String m7(versionValue) => "Версия: ${versionValue}"; + static String m10(versionValue) => "Версия: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} свободно"; - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Пожалуйста, сначала отмените вашу существующую подписку от ${paymentProvider}"; - static String m10(user) => + static String m13(user) => "${user} больше не сможет добавлять фотографии в этот альбом\n\nОни все еще смогут удалять существующие фотографии, добавленные ими"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Ваша семья получила ${storageAmountInGb} ГБ', 'false': 'Вы уже получили ${storageAmountInGb} ГБ', 'other': 'Вы уже получили ${storageAmountInGb} ГБ!', })}"; - static String m12(albumName) => "Совместная ссылка создана для ${albumName}"; + static String m15(albumName) => "Совместная ссылка создана для ${albumName}"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Пожалуйста, свяжитесь с ${familyAdminEmail} для управления подпиской"; - static String m14(provider) => + static String m17(provider) => "Пожалуйста, свяжитесь с нами по адресу support@ente.io для управления подпиской ${provider}."; - static String m15(endpoint) => "Подключено к ${endpoint}"; + static String m18(endpoint) => "Подключено к ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Удалена ${count} штука', other: 'Удалено ${count} штук')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Удаление ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Это удалит публичную ссылку для доступа к \"${albumName}\"."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Пожалуйста, отправьте электронное письмо на адрес ${supportEmail} с вашего зарегистрированного адреса электронной почты"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "Вы привели себя в порядок ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, экономия (${storageSaved}!)\n"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} файлов, ${formattedSize}"; - static String m22(newEmail) => + static String m25(newEmail) => "Адрес электронной почты изменен на ${newEmail}"; - static String m23(email) => + static String m26(email) => "У ${email} нет учетной записи Ente.\n\nОтправьте им приглашение для обмена фотографиями."; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "${Intl.plural(count, one: 'для 1 файла было создан бекап', other: 'для ${formattedNumber} файлов были созданы бекапы')}"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "${Intl.plural(count, one: 'для 1 файла было создан бекап', other: 'для ${formattedNumber} файлов были созданы бекапы')}"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "${storageAmountInGB} Гигабайт каждый раз когда кто-то подписывается на платный план и применяет ваш код"; - static String m27(endDate) => + static String m30(endDate) => "Бесплатная пробная версия действительна до ${endDate}"; - static String m28(count) => + static String m31(count) => "Вы все еще можете получить доступ к ${Intl.plural(count, one: 'ниму', other: 'ним')} на Ente, пока у вас есть активная подписка"; - static String m29(sizeInMBorGB) => "Освободите ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "Освободите ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Это можно удалить с устройства, чтобы освободить ${formattedSize}', other: 'Их можно удалить с устройства, чтобы освободить ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Обработка ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} штука', other: '${count} штук')}"; - static String m33(expiryTime) => "Ссылка истечёт через ${expiryTime}"; + static String m36(expiryTime) => "Ссылка истечёт через ${expiryTime}"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'нет воспоминаний', one: '${formattedCount} воспоминание', other: '${formattedCount} воспоминаний')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Переместить элемент', other: 'Переместить элементы')}"; - static String m36(albumName) => "Успешно перемещено в ${albumName}"; + static String m38(albumName) => "Успешно перемещено в ${albumName}"; - static String m39(passwordStrengthValue) => + static String m39(name) => "Не ${name}?"; + + static String m41(passwordStrengthValue) => "Мощность пароля: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Если с вас сняли оплату, обратитесь в службу поддержки ${providerName}"; - static String m41(endDate) => + static String m43(endDate) => "Бесплатный пробный период до ${endDate}.\nПосле, вы сможете выбрать платный план."; - static String m42(toEmail) => "Пожалуйста, напишите нам на ${toEmail}"; + static String m44(toEmail) => "Пожалуйста, напишите нам на ${toEmail}"; - static String m43(toEmail) => "Пожалуйста, отправьте логи на \n${toEmail}"; + static String m45(toEmail) => "Пожалуйста, отправьте логи на \n${toEmail}"; - static String m44(storeName) => "Оцените нас в ${storeName}"; + static String m46(storeName) => "Оцените нас в ${storeName}"; - static String m45(storageInGB) => + static String m47(storageInGB) => "3. Вы оба получаете ${storageInGB} Гигабайт* бесплатно"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} будет удален из этого общего альбома\n\nВсе добавленные им фотографии также будут удалены из альбома"; - static String m47(endDate) => "Обновление подписки на ${endDate}"; + static String m49(endDate) => "Обновление подписки на ${endDate}"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} результат найден', other: '${count} результатов найдено')}"; - static String m49(count) => "${count} выбрано"; + static String m1(count) => "${count} выбрано"; - static String m50(count, yourCount) => "${count} выбрано (${yourCount} ваши)"; - - static String m51(verificationID) => - "Вот мой проверочный ID: ${verificationID} для ente.io."; + static String m51(count, yourCount) => "${count} выбрано (${yourCount} ваши)"; static String m52(verificationID) => + "Вот мой проверочный ID: ${verificationID} для ente.io."; + + static String m2(verificationID) => "Эй, вы можете подтвердить, что это ваш идентификатор подтверждения ente.io: ${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -229,17 +231,17 @@ class MessageLookup extends MessageLookupByLibrary { "Добавить новый адрес эл. почты"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Добавить соавтора"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Добавить с устройства"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Добавить место"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Добавить"), "addMore": MessageLookupByLibrary.simpleMessage("Добавить еще"), "addNew": MessageLookupByLibrary.simpleMessage("Добавить новое"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Подробнее о расширениях"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Расширения"), "addPhotos": MessageLookupByLibrary.simpleMessage("Добавить фотографии"), @@ -251,12 +253,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Добавить в скрытый альбом"), "addViewer": MessageLookupByLibrary.simpleMessage("Добавить наблюдателя"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("Добавьте ваши фотографии"), "addedAs": MessageLookupByLibrary.simpleMessage("Добавлено как"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Добавление в избранное..."), "advanced": MessageLookupByLibrary.simpleMessage("Дополнительно"), @@ -268,7 +270,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Через неделю"), "after1Year": MessageLookupByLibrary.simpleMessage("Через 1 год"), "albumOwner": MessageLookupByLibrary.simpleMessage("Владелец"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Название альбома"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Альбом обновлен"), "albums": MessageLookupByLibrary.simpleMessage("Альбомы"), @@ -304,10 +306,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Android, iOS, Web, ПК"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Требуется аутентификация"), - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appLock": + MessageLookupByLibrary.simpleMessage("Блокировка приложения"), + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Применить"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Применить код"), @@ -352,8 +353,6 @@ class MessageLookup extends MessageLookupByLibrary { "Пожалуйста, авторизуйтесь для настройки двухфакторной аутентификации"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Пожалуйста, авторизуйтесь, чтобы начать удаление аккаунта"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Пожалуйста, авторизуйтесь для просмотра активных сессий"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -373,9 +372,9 @@ class MessageLookup extends MessageLookupByLibrary { "Здесь вы увидите доступные устройства."), "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( "Убедитесь, что для приложения Ente Photos включены права доступа к локальной сети в настройках."), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), + "autoLock": MessageLookupByLibrary.simpleMessage("Автоблокировка"), "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), + "Время в фоне, после которого приложение блокируется"), "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( "В связи с технической ошибкой вы вышли из системы. Приносим свои извинения."), "autoPair": @@ -383,7 +382,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Автоматическое подключение работает только с устройствами, поддерживающими Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Доступно"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Резервное копирование папок"), "backup": MessageLookupByLibrary.simpleMessage("Резервное копирование"), @@ -410,10 +409,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Можно удалять только файлы, принадлежащие вам"), "cancel": MessageLookupByLibrary.simpleMessage("Отменить"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Отменить подписку"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Невозможно удалить общие файлы"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -424,6 +423,7 @@ class MessageLookup extends MessageLookupByLibrary { "Посетите cast.ente.io на устройстве, которое вы хотите подключить.\n\nВведите код ниже, чтобы воспроизвести альбом на телевизоре."), "centerPoint": MessageLookupByLibrary.simpleMessage("Центральная точка"), + "change": MessageLookupByLibrary.simpleMessage("Изменить"), "changeEmail": MessageLookupByLibrary.simpleMessage( "Изменить адрес электронной почты"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( @@ -434,31 +434,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Изменить пароль"), "changePermissions": MessageLookupByLibrary.simpleMessage("Изменить разрешения?"), + "changeYourReferralCode": MessageLookupByLibrary.simpleMessage( + "Изменить ваш реферальный код"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Проверить обновления"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения верификации"), "checkStatus": MessageLookupByLibrary.simpleMessage("Проверить статус"), "checking": MessageLookupByLibrary.simpleMessage("Проверка..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Выберите фото и попробуйте \"Режим гостя\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Показываете фото другу? Не переживайте, что он листнет слишком далеко. Режим гостя заблокирует те фото, которые вы выбрали."), "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Режим гостя"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Мы добавили поддержку просмотра панорамных фотографий с углом обзора 360 градусов. Погружение обеспечивается навигацией на основе движения!"), + MessageLookupByLibrary.simpleMessage("Гостевой вид"), "cl_panorama_viewer_title": MessageLookupByLibrary.simpleMessage("Просмотр Панорамы"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Представляем новый видеоплеер с улучшенными элементами управления воспроизведением и поддержкой HDR видео."), "cl_video_player_title": MessageLookupByLibrary.simpleMessage("Видеоплеер"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Получить бесплатное хранилище"), "claimMore": MessageLookupByLibrary.simpleMessage("Получите больше!"), "claimed": MessageLookupByLibrary.simpleMessage("Получено"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Очистить \"Без Категории\""), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -486,7 +480,7 @@ class MessageLookup extends MessageLookupByLibrary { "Создайте ссылку, чтобы позволить людям добавлять и просматривать фотографии в вашем общем альбоме без приложения или учетной записи Ente. Отлично подходит для сбора фотографий событий."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Совместная ссылка"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Соавтор"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -516,10 +510,10 @@ class MessageLookup extends MessageLookupByLibrary { "Подтвердите ваш ключ восстановления"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Подключиться к устройству"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Связаться с поддержкой"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Контакты"), "contents": MessageLookupByLibrary.simpleMessage("Содержимое"), "continueLabel": MessageLookupByLibrary.simpleMessage("Далее"), @@ -564,7 +558,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Текущее использование "), "custom": MessageLookupByLibrary.simpleMessage("Свой"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Темная тема"), "dayToday": MessageLookupByLibrary.simpleMessage("Сегодня"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Вчера"), @@ -600,11 +594,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Удалить с устройства"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Удалить из Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Удалить местоположение"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Удалить фото"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "У вас отсутствует важная функция, которая мне нужна"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -631,7 +625,8 @@ class MessageLookup extends MessageLookupByLibrary { "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Введите код"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( "Файлы, добавленные в этот альбом на устройстве, будут автоматически загружены в Ente."), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), + "deviceLock": + MessageLookupByLibrary.simpleMessage("Блокировка устройства"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( "Отключить блокировку экрана, когда Ente находится на переднем плане и выполняется резервное копирование. Обычно это не нужно, но это может ускорить загрузку и первоначальный импорт больших библиотек."), "deviceNotFound": @@ -643,7 +638,7 @@ class MessageLookup extends MessageLookupByLibrary { "Наблюдатели все еще могут делать скриншоты или копировать ваши фотографии с помощью других инструментов"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Обратите внимание"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Отключить двухфакторную аутентификацию"), "disablingTwofactorAuthentication": @@ -664,9 +659,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Загрузка не удалась"), "downloading": MessageLookupByLibrary.simpleMessage("Скачивание..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Редактировать"), "editLocation": MessageLookupByLibrary.simpleMessage("Изменить местоположение"), @@ -679,17 +674,19 @@ class MessageLookup extends MessageLookupByLibrary { "Редактирования в местоположении будут видны только внутри Ente"), "eligible": MessageLookupByLibrary.simpleMessage("подходящий"), "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Подтверждение электронной почты"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( "Отправить логи по электронной почте"), "empty": MessageLookupByLibrary.simpleMessage("Очистить"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Очистить корзину?"), + "enable": MessageLookupByLibrary.simpleMessage("Включить"), "enableMaps": MessageLookupByLibrary.simpleMessage("Включить карты"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Ваши фотографии будут показаны на карте мира.\n\nЭта карта размещена на Open Street Map, и точное местоположение ваших фотографий никогда не разглашается.\n\nВы можете отключить эту функцию в любое время в настройках."), + "enabled": MessageLookupByLibrary.simpleMessage("Включено"), "encryptingBackup": MessageLookupByLibrary.simpleMessage( "Шифрование резервной копии..."), "encryption": MessageLookupByLibrary.simpleMessage("Шифрование"), @@ -723,7 +720,7 @@ class MessageLookup extends MessageLookupByLibrary { "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Введите пароль, который мы можем использовать для шифрования ваших данных"), "enterPersonName": MessageLookupByLibrary.simpleMessage("Введите имя"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), + "enterPin": MessageLookupByLibrary.simpleMessage("Введите PIN"), "enterReferralCode": MessageLookupByLibrary.simpleMessage("Введите реферальный код"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -784,8 +781,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Типы файлов"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Типы файлов и имена"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Файлы удалены"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Файлы сохранены в галерею"), @@ -798,26 +795,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Найденные лица"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Бесплатного хранилища получено"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Бесплатного хранилища можно использовать"), "freeTrial": MessageLookupByLibrary.simpleMessage("Бесплатный пробный период"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Освободите место на устройстве"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Сохраните место на вашем устройстве, очистив уже сохраненные файлы."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Освободить место"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "До 1000 воспоминаний, отображаемых в галерее"), "general": MessageLookupByLibrary.simpleMessage("Общее"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Генерируем ключи шифрования..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Перейти в настройки"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -827,9 +824,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Предоставить разрешение"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Группировать фотографии рядом"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), + "guestView": MessageLookupByLibrary.simpleMessage("Гостевой вид"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), + "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -837,11 +834,12 @@ class MessageLookup extends MessageLookupByLibrary { "help": MessageLookupByLibrary.simpleMessage("помощь"), "hidden": MessageLookupByLibrary.simpleMessage("Скрыто"), "hide": MessageLookupByLibrary.simpleMessage("Скрыть"), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), + "hideContent": + MessageLookupByLibrary.simpleMessage("Скрыть содержимое"), "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), + "Скрывает содержимое приложения в переключателе приложений и отключает скриншоты"), "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), + "Скрывает содержимое приложения в переключателе приложений"), "hiding": MessageLookupByLibrary.simpleMessage("Скрытие..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("Размещено на OSM France"), @@ -857,7 +855,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ничего не делать"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Некоторые файлы в этом альбоме пропущены, потому что они ранее были удалены из Ente."), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), + "immediately": MessageLookupByLibrary.simpleMessage("Немедленно"), "importing": MessageLookupByLibrary.simpleMessage("Импорт...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Неверный код"), "incorrectPasswordTitle": @@ -895,7 +893,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Элементы показывают количество дней, оставшихся до окончательного удаления"), @@ -924,7 +922,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Лимит устройств"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Разрешён"), "linkExpired": MessageLookupByLibrary.simpleMessage("Истекшая"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Срок действия ссылки истек"), "linkHasExpired": @@ -1005,10 +1003,8 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("Карты"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Товары"), - "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Пожалуйста, обратите внимание, что машинное обучение приведет к увеличению затрат интернета и энергопотребления до тех пор, пока не будут индексированы все элементы."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Телефон, Web, ПК"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Средний"), @@ -1017,12 +1013,13 @@ class MessageLookup extends MessageLookupByLibrary { "Измените свой запрос или попробуйте поискать"), "moments": MessageLookupByLibrary.simpleMessage("Мгновения"), "monthly": MessageLookupByLibrary.simpleMessage("Ежемесячно"), - "moveItem": m35, + "moreDetails": MessageLookupByLibrary.simpleMessage("Подробнее"), + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Переместить в альбом"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Переместить в скрытый альбом"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Перемещено в корзину"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1036,7 +1033,7 @@ class MessageLookup extends MessageLookupByLibrary { "newAlbum": MessageLookupByLibrary.simpleMessage("Новый альбом"), "newToEnte": MessageLookupByLibrary.simpleMessage("Впервые в Ente"), "newest": MessageLookupByLibrary.simpleMessage("Самые новые"), - "next": MessageLookupByLibrary.simpleMessage("Next"), + "next": MessageLookupByLibrary.simpleMessage("Далее"), "no": MessageLookupByLibrary.simpleMessage("Нет"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage("У вас пока нет альбомов"), @@ -1061,7 +1058,7 @@ class MessageLookup extends MessageLookupByLibrary { "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Здесь нет фотографий"), "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), + MessageLookupByLibrary.simpleMessage("Не выбрано быстрых ссылок"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Нет ключа восстановления?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1069,8 +1066,9 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Ничего не найденo"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Ничего не найдено"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), + "noSystemLockFound": MessageLookupByLibrary.simpleMessage( + "Системная блокировка не найдена"), + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Пока никто не поделился с вами"), "nothingToSeeHere": @@ -1099,6 +1097,7 @@ class MessageLookup extends MessageLookupByLibrary { "pairWithPin": MessageLookupByLibrary.simpleMessage("Соединить с PIN"), "pairingComplete": MessageLookupByLibrary.simpleMessage("Сопряжение завершено"), + "panorama": MessageLookupByLibrary.simpleMessage("Панорама"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "Верификация еще не завершена"), "passkey": MessageLookupByLibrary.simpleMessage("Ключ"), @@ -1109,9 +1108,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Пароль успешно изменён"), "passwordLock": MessageLookupByLibrary.simpleMessage("Блокировка паролем"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), + "Надежность пароля рассчитывается с учетом длины пароля, используемых символов, и появлением пароля в 10 000 наиболее используемых"), "passwordWarning": MessageLookupByLibrary.simpleMessage( "Мы не храним этот пароль, поэтому если вы забудете его, мы не сможем расшифровать ваши данные"), "paymentDetails": @@ -1119,7 +1118,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Сбой платежа"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "К сожалению, ваш платеж не был выполнен. Пожалуйста, свяжитесь со службой поддержки, и мы вам поможем!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Отложенные элементы"), "pendingSync": @@ -1145,10 +1144,10 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Указать центральную точку"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Закрепить альбом"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), + "pinLock": MessageLookupByLibrary.simpleMessage("Блокировка PIN-кодом"), "playOnTv": MessageLookupByLibrary.simpleMessage("Воспроизвести альбом на ТВ"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Подписка на PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1160,14 +1159,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Если проблема не устранена, обратитесь в службу поддержки"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Предоставьте разрешение"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Пожалуйста, войдите снова"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "Пожалуйста, выберите быстрые ссылки для удаления"), + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Пожалуйста, попробуйте ещё раз"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1204,7 +1203,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Оценить приложение"), "rateUs": MessageLookupByLibrary.simpleMessage("Оцените нас"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Восстановить"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Восстановить аккаунт"), @@ -1231,15 +1230,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Сбросить пароль"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), + MessageLookupByLibrary.simpleMessage("Подтвердите пароль"), + "reenterPin": + MessageLookupByLibrary.simpleMessage("Введите PIN-код ещё раз"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Пригласите друзей и удвойте свой план"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Дайте этот код своим друзьям"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Они подписываются на платный план"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Рефералы"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Рефералы в настоящее время приостановлены"), @@ -1266,13 +1266,13 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Удалить ссылку"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Исключить участника"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Удалить метку человека"), "removePublicLink": MessageLookupByLibrary.simpleMessage("Удалить публичную ссылку"), "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), + MessageLookupByLibrary.simpleMessage("Удалить публичные ссылки"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Некоторые элементы, которые вы удаляете, были добавлены другими людьми, и вы потеряете к ним доступ"), "removeWithQuestionMark": @@ -1286,7 +1286,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Переименовать файл"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Продлить подписку"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Сообщить об ошибке"), "reportBug": MessageLookupByLibrary.simpleMessage("Сообщить об ошибке"), @@ -1306,6 +1306,8 @@ class MessageLookup extends MessageLookupByLibrary { "retry": MessageLookupByLibrary.simpleMessage("Повторить"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Пожалуйста, проверьте и удалите те элементы, которые вы считаете что это дубликаты."), + "reviewSuggestions": + MessageLookupByLibrary.simpleMessage("Посмотреть предложения"), "right": MessageLookupByLibrary.simpleMessage("Вправо"), "rotate": MessageLookupByLibrary.simpleMessage("Повернуть"), "rotateLeft": MessageLookupByLibrary.simpleMessage("Повернуть влево"), @@ -1354,7 +1356,7 @@ class MessageLookup extends MessageLookupByLibrary { "Групповые фотографии, сделанные в некотором радиусе от фотографии"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Пригласите людей, и вы увидите все фотографии, которыми они поделились здесь"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Безопасность"), "selectALocation": MessageLookupByLibrary.simpleMessage("Выбрать место"), @@ -1380,8 +1382,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Выбранные элементы будут удалены из всех альбомов и перемещены в корзину."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Отправить"), "sendEmail": MessageLookupByLibrary.simpleMessage( "Отправить электронное письмо"), @@ -1398,8 +1400,9 @@ class MessageLookup extends MessageLookupByLibrary { "setCover": MessageLookupByLibrary.simpleMessage("Установить обложку"), "setLabel": MessageLookupByLibrary.simpleMessage("Установить"), "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), + MessageLookupByLibrary.simpleMessage("Задать новый пароль"), + "setNewPin": + MessageLookupByLibrary.simpleMessage("Установите новый PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Установить пароль"), "setRadius": MessageLookupByLibrary.simpleMessage("Установить радиус"), @@ -1413,10 +1416,10 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Поделиться альбомом сейчас"), "shareLink": MessageLookupByLibrary.simpleMessage("Поделиться ссылкой"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Поделитесь только с теми людьми, с которыми вы хотите"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Скачай Ente, чтобы мы могли легко поделиться фотографиями и видео без сжатия\n\nhttps://ente.io"), "shareTextReferralCode": m53, @@ -1529,7 +1532,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("нажмите, чтобы скопировать"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage("Нажмите, чтобы ввести код"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), + "tapToUnlock": + MessageLookupByLibrary.simpleMessage("Нажмите для разблокировки"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Похоже, что-то пошло не так. Пожалуйста, повторите попытку через некоторое время. Если ошибка повторится, обратитесь в нашу службу поддержки."), "terminate": MessageLookupByLibrary.simpleMessage("Завершить"), @@ -1576,17 +1580,14 @@ class MessageLookup extends MessageLookupByLibrary { "Совершив это действие, Вы выйдете из своей учетной записи!"), "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), + "Это удалит публичные ссылки на все выбранные быстрые ссылки."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage("Скрыть фото или видео"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Чтобы сбросить пароль, сначала подтвердите свой адрес электронной почты."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Сегодняшние логи"), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), + "tooManyIncorrectAttempts": MessageLookupByLibrary.simpleMessage( + "Слишком много неудачных попыток"), "total": MessageLookupByLibrary.simpleMessage("всего"), "totalSize": MessageLookupByLibrary.simpleMessage("Общий размер"), "trash": MessageLookupByLibrary.simpleMessage("Корзина"), @@ -1637,6 +1638,8 @@ class MessageLookup extends MessageLookupByLibrary { "Скидка 50%, до 4-го декабря."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Доступное хранилище ограничено вашим текущим планом. Избыточное полученное хранилище автоматически станет доступным для использования при улучшении плана."), + "useAsCover": + MessageLookupByLibrary.simpleMessage("Использовать для обложки"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( "Использовать публичные ссылки для людей не на Ente"), @@ -1663,6 +1666,7 @@ class MessageLookup extends MessageLookupByLibrary { "verifying": MessageLookupByLibrary.simpleMessage("Проверка..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Проверка ключа восстановления..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("Информация о видео"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("видео"), "videos": MessageLookupByLibrary.simpleMessage("Видео"), "viewActiveSessions": @@ -1673,8 +1677,6 @@ class MessageLookup extends MessageLookupByLibrary { "viewAllExifData": MessageLookupByLibrary.simpleMessage("Просмотреть все данные EXIF"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Большие файлы"), - "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "Просмотр файлов, которые потребляют наибольшее количество памяти"), "viewLogs": MessageLookupByLibrary.simpleMessage("Посмотреть логи"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Просмотреть ключ восстановления"), diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart new file mode 100644 index 0000000000..16f3eafe48 --- /dev/null +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -0,0 +1,548 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a sv locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'sv'; + + static String m9(count) => + "${Intl.plural(count, zero: 'Inga deltagare', one: '1 deltagare', other: '${count} deltagare')}"; + + static String m10(versionValue) => "Version: ${versionValue}"; + + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} gratis"; + + static String m13(user) => + "${user} kommer inte att kunna lägga till fler foton till detta album\n\nDe kommer fortfarande att kunna ta bort befintliga foton som lagts till av dem"; + + static String m19(count) => + "${Intl.plural(count, one: 'Radera ${count} objekt', other: 'Radera ${count} objekt')}"; + + static String m22(supportEmail) => + "Vänligen skicka ett e-postmeddelande till ${supportEmail} från din registrerade e-postadress"; + + static String m26(email) => + "${email} har inte ett Ente-konto.\n\nSkicka dem en inbjudan för att dela bilder."; + + static String m35(count) => + "${Intl.plural(count, one: '${count} objekt', other: '${count} objekt')}"; + + static String m36(expiryTime) => "Länken upphör att gälla ${expiryTime}"; + + static String m37(count) => + "${Intl.plural(count, one: 'Flytta objekt', other: 'Flytta objekt')}"; + + static String m39(name) => "Inte ${name}?"; + + static String m40(familyAdminEmail) => + "Kontakta ${familyAdminEmail} för att ändra din kod."; + + static String m41(passwordStrengthValue) => + "Lösenordsstyrka: ${passwordStrengthValue}"; + + static String m46(storeName) => "Betygsätt oss på ${storeName}"; + + static String m50(count) => + "${Intl.plural(count, one: '${count} resultat hittades', other: '${count} resultat hittades')}"; + + static String m52(verificationID) => + "Här är mitt verifierings-ID: ${verificationID} för ente.io."; + + static String m2(verificationID) => + "Hallå, kan du bekräfta att detta är ditt ente.io verifierings-ID: ${verificationID}"; + + static String m54(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: 'Dela med specifika personer', one: 'Delad med en person', other: 'Delad med ${numberOfPeople} personer')}"; + + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; + + static String m65(email) => "Detta är ${email}s verifierings-ID"; + + static String m66(count) => + "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagar')}"; + + static String m68(email) => "Bekräfta ${email}"; + + static String m69(email) => + "Vi har skickat ett e-postmeddelande till ${email}"; + + static String m70(count) => + "${Intl.plural(count, one: '${count} år sedan', other: '${count} år sedan')}"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( + "En ny version av Ente är tillgänglig."), + "about": MessageLookupByLibrary.simpleMessage("Om"), + "account": MessageLookupByLibrary.simpleMessage("Konto"), + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("Välkommen tillbaka!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är end-to-end-krypterad."), + "activeSessions": + MessageLookupByLibrary.simpleMessage("Aktiva sessioner"), + "addANewEmail": MessageLookupByLibrary.simpleMessage( + "Lägg till en ny e-postadress"), + "addCollaborator": + MessageLookupByLibrary.simpleMessage("Lägg till samarbetspartner"), + "addLocationButton": MessageLookupByLibrary.simpleMessage("Lägg till"), + "addMore": MessageLookupByLibrary.simpleMessage("Lägg till fler"), + "addViewer": MessageLookupByLibrary.simpleMessage("Lägg till bildvy"), + "addedAs": MessageLookupByLibrary.simpleMessage("Lades till som"), + "after1Day": MessageLookupByLibrary.simpleMessage("Om en dag"), + "after1Hour": MessageLookupByLibrary.simpleMessage("Om en timme"), + "after1Month": MessageLookupByLibrary.simpleMessage("Om en månad"), + "after1Week": MessageLookupByLibrary.simpleMessage("Om en vecka"), + "after1Year": MessageLookupByLibrary.simpleMessage("Om ett år"), + "albumOwner": MessageLookupByLibrary.simpleMessage("Ägare"), + "albumParticipantsCount": m9, + "albumUpdated": + MessageLookupByLibrary.simpleMessage("Album uppdaterat"), + "albums": MessageLookupByLibrary.simpleMessage("Album"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "Tillåt personer med länken att även lägga till foton i det delade albumet."), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("Tillåt lägga till foton"), + "allowDownloads": + MessageLookupByLibrary.simpleMessage("Tillåt nedladdningar"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("Avbryt"), + "appVersion": m10, + "apply": MessageLookupByLibrary.simpleMessage("Verkställ"), + "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Använd kod"), + "areYouSureYouWantToLogout": MessageLookupByLibrary.simpleMessage( + "Är du säker på att du vill logga ut?"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "Vad är den främsta anledningen till att du raderar ditt konto?"), + "availableStorageSpace": m11, + "blog": MessageLookupByLibrary.simpleMessage("Blogg"), + "cancel": MessageLookupByLibrary.simpleMessage("Avbryt"), + "cannotAddMorePhotosAfterBecomingViewer": m13, + "change": MessageLookupByLibrary.simpleMessage("Ändra"), + "changeEmail": + MessageLookupByLibrary.simpleMessage("Ändra e-postadress"), + "changePassword": + MessageLookupByLibrary.simpleMessage("Ändra lösenord"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("Ändra lösenord"), + "changePermissions": + MessageLookupByLibrary.simpleMessage("Ändra behörighet?"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "Kontrollera din inkorg (och skräppost) för att slutföra verifieringen"), + "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("Gästvy"), + "cl_video_player_title": + MessageLookupByLibrary.simpleMessage("Videospelare"), + "claimed": MessageLookupByLibrary.simpleMessage("Nyttjad"), + "close": MessageLookupByLibrary.simpleMessage("Stäng"), + "codeAppliedPageTitle": + MessageLookupByLibrary.simpleMessage("Kod tillämpad"), + "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "Koden har kopierats till urklipp"), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "Skapa en länk så att personer kan lägga till och visa foton i ditt delade album utan att behöva en Ente app eller konto. Perfekt för att samla in bilder från evenemang."), + "collaborativeLink": + MessageLookupByLibrary.simpleMessage("Samarbetslänk"), + "collaborator": + MessageLookupByLibrary.simpleMessage("Samarbetspartner"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "Samarbetspartner kan lägga till foton och videor till det delade albumet."), + "collectPhotos": MessageLookupByLibrary.simpleMessage("Samla in foton"), + "color": MessageLookupByLibrary.simpleMessage("Färg"), + "confirm": MessageLookupByLibrary.simpleMessage("Bekräfta"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("Bekräfta radering av konto"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "Ja, jag vill ta bort detta konto och all data permanent."), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("Bekräfta lösenord"), + "confirmRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Bekräfta återställningsnyckel"), + "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Bekräfta din återställningsnyckel"), + "contactSupport": + MessageLookupByLibrary.simpleMessage("Kontakta support"), + "contacts": MessageLookupByLibrary.simpleMessage("Kontakter"), + "continueLabel": MessageLookupByLibrary.simpleMessage("Fortsätt"), + "copyEmailAddress": + MessageLookupByLibrary.simpleMessage("Kopiera e-postadress"), + "copyLink": MessageLookupByLibrary.simpleMessage("Kopiera länk"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Kopiera-klistra in den här koden\ntill din autentiseringsapp"), + "create": MessageLookupByLibrary.simpleMessage("Skapa"), + "createAccount": MessageLookupByLibrary.simpleMessage("Skapa konto"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("Skapa nytt konto"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("Skapa offentlig länk"), + "custom": MessageLookupByLibrary.simpleMessage("Anpassad"), + "darkTheme": MessageLookupByLibrary.simpleMessage("Mörkt"), + "decrypting": MessageLookupByLibrary.simpleMessage("Dekrypterar..."), + "delete": MessageLookupByLibrary.simpleMessage("Radera"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("Radera konto"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "Vi är ledsna att se dig lämna oss. Vänligen dela dina synpunkter för att hjälpa oss att förbättra."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("Radera kontot permanent"), + "deleteAll": MessageLookupByLibrary.simpleMessage("Radera alla"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "Vänligen skicka ett e-postmeddelande till account-deletion@ente.io från din registrerade e-postadress."), + "deleteFromDevice": + MessageLookupByLibrary.simpleMessage("Radera från enhet"), + "deleteItemCount": m19, + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "Det saknas en viktig funktion som jag behöver"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "Appen eller en viss funktion beter sig inte som jag tycker det ska"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "Jag hittade en annan tjänst som jag gillar bättre"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("Min orsak finns inte med"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "Din begäran kommer att hanteras inom 72 timmar."), + "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( + "Besökare kan fortfarande ta skärmdumpar eller spara en kopia av dina foton med hjälp av externa verktyg"), + "disableDownloadWarningTitle": + MessageLookupByLibrary.simpleMessage("Vänligen notera:"), + "discord": MessageLookupByLibrary.simpleMessage("Discord"), + "doThisLater": MessageLookupByLibrary.simpleMessage("Gör detta senare"), + "done": MessageLookupByLibrary.simpleMessage("Klar"), + "dropSupportEmail": m22, + "edit": MessageLookupByLibrary.simpleMessage("Redigera"), + "email": MessageLookupByLibrary.simpleMessage("E-post"), + "emailNoEnteAccount": m26, + "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), + "encryptionKeys": + MessageLookupByLibrary.simpleMessage("Krypteringsnycklar"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente behöver tillåtelse att bevara dina foton"), + "enterCode": MessageLookupByLibrary.simpleMessage("Ange kod"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "Ange koden som din vän har angett för att få gratis lagring för er båda"), + "enterEmail": MessageLookupByLibrary.simpleMessage("Ange e-post"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Ange ett nytt lösenord som vi kan använda för att kryptera din data"), + "enterPassword": MessageLookupByLibrary.simpleMessage("Ange lösenord"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "Ange ett lösenord som vi kan använda för att kryptera din data"), + "enterReferralCode": + MessageLookupByLibrary.simpleMessage("Ange hänvisningskod"), + "enterThe6digitCodeFromnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Ange den 6-siffriga koden från din autentiseringsapp"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "Ange en giltig e-postadress."), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("Ange din e-postadress"), + "enterYourPassword": + MessageLookupByLibrary.simpleMessage("Ange ditt lösenord"), + "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Ange din återställningsnyckel"), + "exif": MessageLookupByLibrary.simpleMessage("EXIF"), + "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( + "Denna länk har upphört att gälla. Välj ett nytt datum eller inaktivera tidsbegränsningen."), + "exportYourData": + MessageLookupByLibrary.simpleMessage("Exportera din data"), + "failedToApplyCode": MessageLookupByLibrary.simpleMessage( + "Det gick inte att använda koden"), + "feedback": MessageLookupByLibrary.simpleMessage("Feedback"), + "fileInfoAddDescHint": + MessageLookupByLibrary.simpleMessage("Lägg till en beskrivning..."), + "fileTypes": MessageLookupByLibrary.simpleMessage("Filtyper"), + "forgotPassword": + MessageLookupByLibrary.simpleMessage("Glömt lösenord"), + "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( + "Skapar krypteringsnycklar..."), + "goToSettings": + MessageLookupByLibrary.simpleMessage("Gå till inställningar"), + "guestView": MessageLookupByLibrary.simpleMessage("Gästvy"), + "howItWorks": + MessageLookupByLibrary.simpleMessage("Så här fungerar det"), + "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( + "Be dem att långtrycka på sin e-postadress på inställningsskärmen och verifiera att ID:n på båda enheterna matchar."), + "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorera"), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("Felaktigt lösenord"), + "incorrectRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Felaktig återställningsnyckel"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "Återställningsnyckeln du angav är felaktig"), + "incorrectRecoveryKeyTitle": MessageLookupByLibrary.simpleMessage( + "Felaktig återställningsnyckel"), + "insecureDevice": MessageLookupByLibrary.simpleMessage("Osäker enhet"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("Ogiltig e-postadress"), + "invalidKey": MessageLookupByLibrary.simpleMessage("Ogiltig nyckel"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Återställningsnyckeln du angav är inte giltig. Kontrollera att den innehåller 24 ord och kontrollera stavningen av varje ord.\n\nOm du har angett en äldre återställnings kod, se till att den är 64 tecken lång, och kontrollera var och en av bokstäverna."), + "inviteYourFriends": + MessageLookupByLibrary.simpleMessage("Bjud in dina vänner"), + "inviteYourFriendsToEnte": MessageLookupByLibrary.simpleMessage( + "Bjud in dina vänner till Ente"), + "itemCount": m35, + "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "Vänligen hjälp oss med denna information"), + "language": MessageLookupByLibrary.simpleMessage("Språk"), + "leave": MessageLookupByLibrary.simpleMessage("Lämna"), + "lightTheme": MessageLookupByLibrary.simpleMessage("Ljust"), + "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Enhetsgräns"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiverat"), + "linkExpired": MessageLookupByLibrary.simpleMessage("Upphört"), + "linkExpiresOn": m36, + "linkExpiry": MessageLookupByLibrary.simpleMessage("Länken upphör"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("Länk har upphört att gälla"), + "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldrig"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"), + "logInLabel": MessageLookupByLibrary.simpleMessage("Logga in"), + "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( + "Din session har upphört. Logga in igen."), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "Genom att klicka på logga in godkänner jag användarvillkoren och våran integritetspolicy"), + "logout": MessageLookupByLibrary.simpleMessage("Logga ut"), + "lostDevice": MessageLookupByLibrary.simpleMessage("Förlorad enhet?"), + "manage": MessageLookupByLibrary.simpleMessage("Hantera"), + "manageLink": MessageLookupByLibrary.simpleMessage("Hantera länk"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("Hantera"), + "manageSubscription": + MessageLookupByLibrary.simpleMessage("Hantera prenumeration"), + "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), + "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), + "mlConsent": + MessageLookupByLibrary.simpleMessage("Aktivera maskininlärning"), + "mlConsentTitle": + MessageLookupByLibrary.simpleMessage("Aktivera maskininlärning?"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("Måttligt"), + "moveItem": m37, + "moveToAlbum": + MessageLookupByLibrary.simpleMessage("Flytta till album"), + "name": MessageLookupByLibrary.simpleMessage("Namn"), + "never": MessageLookupByLibrary.simpleMessage("Aldrig"), + "newAlbum": MessageLookupByLibrary.simpleMessage("Nytt album"), + "next": MessageLookupByLibrary.simpleMessage("Nästa"), + "no": MessageLookupByLibrary.simpleMessage("Nej"), + "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Ingen"), + "noExifData": MessageLookupByLibrary.simpleMessage("Ingen EXIF-data"), + "noInternetConnection": + MessageLookupByLibrary.simpleMessage("Ingen internetanslutning"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("Ingen återställningsnyckel?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "På grund av vårt punkt-till-punkt-krypteringssystem så kan dina data inte avkrypteras utan ditt lösenord eller återställningsnyckel"), + "noResults": MessageLookupByLibrary.simpleMessage("Inga resultat"), + "noResultsFound": + MessageLookupByLibrary.simpleMessage("Inga resultat hittades"), + "notPersonLabel": m39, + "ok": MessageLookupByLibrary.simpleMessage("OK"), + "onlyFamilyAdminCanChangeCode": m40, + "oops": MessageLookupByLibrary.simpleMessage("Hoppsan"), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("Eller välj en befintlig"), + "password": MessageLookupByLibrary.simpleMessage("Lösenord"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("Lösenordet har ändrats"), + "passwordLock": MessageLookupByLibrary.simpleMessage("Lösenordskydd"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "Vi lagrar inte detta lösenord, så om du glömmer bort det, kan vi inte dekryptera dina data"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("foto"), + "pleaseCheckYourInternetConnectionAndTryAgain": + MessageLookupByLibrary.simpleMessage( + "Kontrollera din internetanslutning och försök igen."), + "pleaseLoginAgain": + MessageLookupByLibrary.simpleMessage("Logga in igen"), + "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Försök igen"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("Var god vänta..."), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("Integritetspolicy"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("Offentlig länk aktiverad"), + "rateUsOnStore": m46, + "recover": MessageLookupByLibrary.simpleMessage("Återställ"), + "recoverAccount": + MessageLookupByLibrary.simpleMessage("Återställ konto"), + "recoverButton": MessageLookupByLibrary.simpleMessage("Återställ"), + "recoveryKey": + MessageLookupByLibrary.simpleMessage("Återställningsnyckel"), + "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "Återställningsnyckel kopierad till urklipp"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel."), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ords nyckel på en säker plats."), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "Grymt! Din återställningsnyckel är giltig. Tack för att du verifierade.\n\nKom ihåg att hålla din återställningsnyckel säker med backups."), + "recoveryKeyVerified": MessageLookupByLibrary.simpleMessage( + "Återställningsnyckel verifierad"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "Din återställningsnyckel är det enda sättet att återställa dina foton om du glömmer ditt lösenord. Du hittar din återställningsnyckel i Inställningar > Säkerhet.\n\nAnge din återställningsnyckel här för att verifiera att du har sparat den ordentligt."), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("Återställning lyckades!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "Denna enhet är inte tillräckligt kraftfull för att verifiera ditt lösenord, men vi kan återskapa det på ett sätt som fungerar med alla enheter.\n\nLogga in med din återställningsnyckel och återskapa ditt lösenord (du kan använda samma igen om du vill)."), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("Återskapa lösenord"), + "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), + "remove": MessageLookupByLibrary.simpleMessage("Ta bort"), + "removeLink": MessageLookupByLibrary.simpleMessage("Radera länk"), + "removeParticipant": + MessageLookupByLibrary.simpleMessage("Ta bort användaren"), + "renewSubscription": + MessageLookupByLibrary.simpleMessage("Förnya prenumeration"), + "resendEmail": MessageLookupByLibrary.simpleMessage( + "Skicka e-postmeddelandet igen"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("Återställ lösenord"), + "resetToDefault": + MessageLookupByLibrary.simpleMessage("Återställ till standard"), + "retry": MessageLookupByLibrary.simpleMessage("Försök igen"), + "save": MessageLookupByLibrary.simpleMessage("Spara"), + "saveKey": MessageLookupByLibrary.simpleMessage("Spara nyckel"), + "saveYourRecoveryKeyIfYouHaventAlready": + MessageLookupByLibrary.simpleMessage( + "Spara din återställningsnyckel om du inte redan har gjort det"), + "scanCode": MessageLookupByLibrary.simpleMessage("Skanna kod"), + "scanThisBarcodeWithnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "Skanna denna streckkod med\ndin autentiseringsapp"), + "search": MessageLookupByLibrary.simpleMessage("Sök"), + "searchResultCount": m50, + "selectLanguage": MessageLookupByLibrary.simpleMessage("Välj språk"), + "selectReason": MessageLookupByLibrary.simpleMessage("Välj anledning"), + "send": MessageLookupByLibrary.simpleMessage("Skicka"), + "sendEmail": MessageLookupByLibrary.simpleMessage("Skicka e-post"), + "sendInvite": MessageLookupByLibrary.simpleMessage("Skicka inbjudan"), + "sendLink": MessageLookupByLibrary.simpleMessage("Skicka länk"), + "setAPassword": + MessageLookupByLibrary.simpleMessage("Ange ett lösenord"), + "setPasswordTitle": + MessageLookupByLibrary.simpleMessage("Välj lösenord"), + "setupComplete": + MessageLookupByLibrary.simpleMessage("Konfiguration slutförd"), + "share": MessageLookupByLibrary.simpleMessage("Dela"), + "shareALink": MessageLookupByLibrary.simpleMessage("Dela en länk"), + "shareLink": MessageLookupByLibrary.simpleMessage("Dela länk"), + "shareMyVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "Ladda ner Ente så att vi enkelt kan dela bilder och videor med originell kvalitet\n\nhttps://ente.io"), + "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( + "Dela med icke-Ente användare"), + "shareWithPeopleSectionTitle": m54, + "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( + "Skapa delade och samarbetande album med andra Ente användare, inklusive användare med gratisnivån."), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "Jag samtycker till användarvillkoren och integritetspolicyn"), + "someoneSharingAlbumsWithYouShouldSeeTheSameId": + MessageLookupByLibrary.simpleMessage( + "Någon som delar album med dig bör se samma ID på deras enhet."), + "somethingWentWrong": + MessageLookupByLibrary.simpleMessage("Något gick fel"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Något gick fel, vänligen försök igen"), + "sorry": MessageLookupByLibrary.simpleMessage("Förlåt"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "Tyvärr, vi kunde inte generera säkra nycklar på den här enheten.\n\nVänligen registrera dig från en annan enhet."), + "sortAlbumsBy": MessageLookupByLibrary.simpleMessage("Sortera efter"), + "status": MessageLookupByLibrary.simpleMessage("Status"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Du"), + "storageInGB": m59, + "strongStrength": MessageLookupByLibrary.simpleMessage("Starkt"), + "subscribe": MessageLookupByLibrary.simpleMessage("Prenumerera"), + "subscription": MessageLookupByLibrary.simpleMessage("Prenumeration"), + "tapToCopy": + MessageLookupByLibrary.simpleMessage("tryck för att kopiera"), + "tapToEnterCode": + MessageLookupByLibrary.simpleMessage("Tryck för att ange kod"), + "terminate": MessageLookupByLibrary.simpleMessage("Avsluta"), + "terminateSession": + MessageLookupByLibrary.simpleMessage("Avsluta sessionen?"), + "terms": MessageLookupByLibrary.simpleMessage("Villkor"), + "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Villkor"), + "thankYou": MessageLookupByLibrary.simpleMessage("Tack"), + "theRecoveryKeyYouEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage( + "Återställningsnyckeln du angav är felaktig"), + "theme": MessageLookupByLibrary.simpleMessage("Tema"), + "thisCanBeUsedToRecoverYourAccountIfYou": + MessageLookupByLibrary.simpleMessage( + "Detta kan användas för att återställa ditt konto om du förlorar din andra faktor"), + "thisDevice": MessageLookupByLibrary.simpleMessage("Den här enheten"), + "thisIsPersonVerificationId": m65, + "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( + "Detta är ditt verifierings-ID"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage( + "Detta kommer att logga ut dig från följande enhet:"), + "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( + "Detta kommer att logga ut dig från denna enhet!"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "För att återställa ditt lösenord måste du först bekräfta din e-postadress."), + "trash": MessageLookupByLibrary.simpleMessage("Papperskorg"), + "trashDaysLeft": m66, + "tryAgain": MessageLookupByLibrary.simpleMessage("Försök igen"), + "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), + "twofactorAuthenticationPageTitle": + MessageLookupByLibrary.simpleMessage("Tvåfaktorsautentisering"), + "twofactorSetup": + MessageLookupByLibrary.simpleMessage("Tvåfaktorskonfiguration"), + "update": MessageLookupByLibrary.simpleMessage("Uppdatera"), + "upgrade": MessageLookupByLibrary.simpleMessage("Uppgradera"), + "useAsCover": MessageLookupByLibrary.simpleMessage("Använd som omslag"), + "useRecoveryKey": + MessageLookupByLibrary.simpleMessage("Använd återställningsnyckel"), + "verificationId": + MessageLookupByLibrary.simpleMessage("Verifierings-ID"), + "verify": MessageLookupByLibrary.simpleMessage("Bekräfta"), + "verifyEmail": + MessageLookupByLibrary.simpleMessage("Bekräfta e-postadress"), + "verifyEmailID": m68, + "verifyPassword": + MessageLookupByLibrary.simpleMessage("Bekräfta lösenord"), + "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Verifierar återställningsnyckel..."), + "viewActiveSessions": + MessageLookupByLibrary.simpleMessage("Visa aktiva sessioner"), + "viewAll": MessageLookupByLibrary.simpleMessage("Visa alla"), + "viewLogs": MessageLookupByLibrary.simpleMessage("Visa loggar"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("Visa återställningsnyckel"), + "viewer": MessageLookupByLibrary.simpleMessage("Bildvy"), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("Svagt"), + "welcomeBack": + MessageLookupByLibrary.simpleMessage("Välkommen tillbaka!"), + "whatsNew": MessageLookupByLibrary.simpleMessage("Nyheter"), + "yearsAgo": m70, + "yes": MessageLookupByLibrary.simpleMessage("Ja"), + "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, avbryt"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("Ja, konvertera till bildvy"), + "yesDelete": MessageLookupByLibrary.simpleMessage("Ja, radera"), + "yesLogout": MessageLookupByLibrary.simpleMessage("Ja, logga ut"), + "yesRenew": MessageLookupByLibrary.simpleMessage("Ja, förnya"), + "you": MessageLookupByLibrary.simpleMessage("Du"), + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("Ditt konto har raderats") + }; +} diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart new file mode 100644 index 0000000000..5e415c9da0 --- /dev/null +++ b/mobile/lib/generated/intl/messages_te.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a te locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'te'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart new file mode 100644 index 0000000000..a1bc4df70a --- /dev/null +++ b/mobile/lib/generated/intl/messages_th.dart @@ -0,0 +1,365 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a th locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'th'; + + static String m4(count) => "${Intl.plural(count, other: 'เพิ่มรายการ')}"; + + static String m10(versionValue) => "รุ่น: ${versionValue}"; + + static String m19(count) => + "${Intl.plural(count, one: 'ลบ ${count} รายการ', other: 'ลบ ${count} รายการ')}"; + + static String m20(currentlyDeleting, totalCount) => + "กำลังลบ ${currentlyDeleting} / ${totalCount}"; + + static String m22(supportEmail) => + "กรุณาส่งอีเมลไปที่ ${supportEmail} จากที่อยู่อีเมลที่คุณลงทะเบียนไว้"; + + static String m34(currentlyProcessing, totalCount) => + "กำลังประมวลผล ${currentlyProcessing} / ${totalCount}"; + + static String m35(count) => "${Intl.plural(count, other: '${count} รายการ')}"; + + static String m37(count) => "${Intl.plural(count, other: 'ย้ายรายการ')}"; + + static String m41(passwordStrengthValue) => + "ความแข็งแรงของรหัสผ่าน: ${passwordStrengthValue}"; + + static String m60( + usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => + "ใช้ไป ${usedAmount} ${usedStorageUnit} จาก ${totalAmount} ${totalStorageUnit}"; + + static String m69(email) => "เราได้ส่งจดหมายไปยัง ${email}"; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("ยินดีต้อนรับกลับมา!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "ฉันเข้าใจว่าหากฉันทำรหัสผ่านหาย ข้อมูลของฉันอาจสูญหายเนื่องจากข้อมูลของฉันมีการเข้ารหัสจากต้นทางถึงปลายทาง"), + "activeSessions": + MessageLookupByLibrary.simpleMessage("เซสชันที่ใช้งานอยู่"), + "addANewEmail": MessageLookupByLibrary.simpleMessage("เพิ่มอีเมลใหม่"), + "addCollaborator": + MessageLookupByLibrary.simpleMessage("เพิ่มผู้ทำงานร่วมกัน"), + "addItem": m4, + "addMore": MessageLookupByLibrary.simpleMessage("เพิ่มอีก"), + "addToAlbum": MessageLookupByLibrary.simpleMessage("เพิ่มไปยังอัลบั้ม"), + "addViewer": MessageLookupByLibrary.simpleMessage("เพิ่มผู้ชม"), + "after1Day": MessageLookupByLibrary.simpleMessage("หลังจาก 1 วัน"), + "after1Hour": MessageLookupByLibrary.simpleMessage("หลังจาก 1 ชั่วโมง"), + "after1Month": MessageLookupByLibrary.simpleMessage("หลังจาก 1 เดือน"), + "after1Week": MessageLookupByLibrary.simpleMessage("หลังจาก 1 สัปดาห์"), + "after1Year": MessageLookupByLibrary.simpleMessage("หลังจาก 1 ปี"), + "albumOwner": MessageLookupByLibrary.simpleMessage("เจ้าของ"), + "allowAddingPhotos": + MessageLookupByLibrary.simpleMessage("อนุญาตให้เพิ่มรูปภาพ"), + "allowDownloads": + MessageLookupByLibrary.simpleMessage("อนุญาตให้ดาวน์โหลด"), + "androidBiometricSuccess": + MessageLookupByLibrary.simpleMessage("สำเร็จ"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("ยกเลิก"), + "appVersion": m10, + "apply": MessageLookupByLibrary.simpleMessage("นำไปใช้"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "เหตุผลหลักที่คุณลบบัญชีคืออะไร?"), + "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "โปรดตรวจสอบสิทธิ์เพื่อดูคีย์การกู้คืนของคุณ"), + "canOnlyCreateLinkForFilesOwnedByYou": + MessageLookupByLibrary.simpleMessage( + "สามารถสร้างลิงก์ได้เฉพาะไฟล์ที่คุณเป็นเจ้าของ"), + "cancel": MessageLookupByLibrary.simpleMessage("ยกเลิก"), + "changeEmail": MessageLookupByLibrary.simpleMessage("เปลี่ยนอีเมล"), + "changePasswordTitle": + MessageLookupByLibrary.simpleMessage("เปลี่ยนรหัสผ่าน"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "โปรดตรวจสอบกล่องจดหมาย (และสแปม) ของคุณ เพื่อยืนยันให้เสร็จสิ้น"), + "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "คัดลอกรหัสไปยังคลิปบอร์ดแล้ว"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("รวบรวมรูปภาพ"), + "color": MessageLookupByLibrary.simpleMessage("สี"), + "confirm": MessageLookupByLibrary.simpleMessage("ยืนยัน"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("ยืนยันการลบบัญชี"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "ใช่ ฉันต้องการลบบัญชีนี้และข้อมูลที่เกี่ยวข้องทั้งหมดแบบถาวร"), + "confirmPassword": + MessageLookupByLibrary.simpleMessage("ยืนยันรหัสผ่าน"), + "confirmRecoveryKey": + MessageLookupByLibrary.simpleMessage("ยืนยันคีย์การกู้คืน"), + "confirmYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("ยืนยันคีย์การกู้คืนของคุณ"), + "contactSupport": + MessageLookupByLibrary.simpleMessage("ติดต่อฝ่ายสนับสนุน"), + "continueLabel": MessageLookupByLibrary.simpleMessage("ดำเนินการต่อ"), + "copyLink": MessageLookupByLibrary.simpleMessage("คัดลอกลิงก์"), + "createAccount": MessageLookupByLibrary.simpleMessage("สร้างบัญชี"), + "createNewAccount": + MessageLookupByLibrary.simpleMessage("สร้างบัญชีใหม่"), + "createPublicLink": + MessageLookupByLibrary.simpleMessage("สร้างลิงก์สาธารณะ"), + "custom": MessageLookupByLibrary.simpleMessage("กำหนดเอง"), + "darkTheme": MessageLookupByLibrary.simpleMessage("มืด"), + "decrypting": MessageLookupByLibrary.simpleMessage("กำลังถอดรหัส..."), + "delete": MessageLookupByLibrary.simpleMessage("ลบ"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("ลบบัญชี"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "เราเสียใจที่เห็นคุณไป โปรดแบ่งปันความคิดเห็นของคุณเพื่อช่วยให้เราปรับปรุง"), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("ลบบัญชีถาวร"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "กรุณาส่งอีเมลไปที่ account-deletion@ente.io จากที่อยู่อีเมลที่คุณลงทะเบียนไว้"), + "deleteEmptyAlbums": + MessageLookupByLibrary.simpleMessage("ลบอัลบั้มที่ว่างเปล่า"), + "deleteEmptyAlbumsWithQuestionMark": + MessageLookupByLibrary.simpleMessage( + "ลบอัลบั้มที่ว่างเปล่าหรือไม่?"), + "deleteItemCount": m19, + "deleteProgress": m20, + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "ขาดคุณสมบัติสำคัญที่ฉันต้องการ"), + "deleteReason2": MessageLookupByLibrary.simpleMessage( + "ตัวแอปหรือคุณสมบัติบางอย่างไม่ทำงานเหมือนที่ฉันคิดว่าควรจะเป็น"), + "deleteReason3": MessageLookupByLibrary.simpleMessage( + "ฉันเจอบริการอื่นที่ฉันชอบมากกว่า"), + "deleteReason4": + MessageLookupByLibrary.simpleMessage("เหตุผลของฉันไม่มีระบุไว้"), + "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( + "คำขอของคุณจะได้รับการดำเนินการภายใน 72 ชั่วโมง"), + "doThisLater": MessageLookupByLibrary.simpleMessage("ทำในภายหลัง"), + "dropSupportEmail": m22, + "edit": MessageLookupByLibrary.simpleMessage("แก้ไข"), + "editLocationTagTitle": + MessageLookupByLibrary.simpleMessage("แก้ไขตำแหน่ง"), + "eligible": MessageLookupByLibrary.simpleMessage("มีสิทธิ์"), + "email": MessageLookupByLibrary.simpleMessage("อีเมล"), + "enableMaps": MessageLookupByLibrary.simpleMessage("เปิดใช้งานแผนที่"), + "encryption": MessageLookupByLibrary.simpleMessage("การเข้ารหัส"), + "enterCode": MessageLookupByLibrary.simpleMessage("ป้อนรหัส"), + "enterEmail": MessageLookupByLibrary.simpleMessage("ใส่อีเมล"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "ใส่รหัสผ่านใหม่ที่เราสามารถใช้เพื่อเข้ารหัสข้อมูลของคุณ"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "ใส่รหัสผ่านที่เราสามารถใช้เพื่อเข้ารหัสข้อมูลของคุณ"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "โปรดใส่ที่อยู่อีเมลที่ถูกต้อง"), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("ใส่ที่อยู่อีเมลของคุณ"), + "enterYourPassword": + MessageLookupByLibrary.simpleMessage("ใส่รหัสผ่านของคุณ"), + "enterYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("ป้อนคีย์การกู้คืน"), + "faq": MessageLookupByLibrary.simpleMessage("คำถามที่พบบ่อย"), + "favorite": MessageLookupByLibrary.simpleMessage("ชื่นชอบ"), + "feedback": MessageLookupByLibrary.simpleMessage("ความคิดเห็น"), + "fileInfoAddDescHint": + MessageLookupByLibrary.simpleMessage("เพิ่มคำอธิบาย..."), + "forgotPassword": MessageLookupByLibrary.simpleMessage("ลืมรหัสผ่าน"), + "freeTrial": MessageLookupByLibrary.simpleMessage("ทดลองใช้ฟรี"), + "genericProgress": m34, + "goToSettings": MessageLookupByLibrary.simpleMessage("ไปที่การตั้งค่า"), + "hide": MessageLookupByLibrary.simpleMessage("ซ่อน"), + "hostedAtOsmFrance": + MessageLookupByLibrary.simpleMessage("โฮสต์ที่ OSM ฝรั่งเศส"), + "howItWorks": MessageLookupByLibrary.simpleMessage("วิธีการทำงาน"), + "iOSOkButton": MessageLookupByLibrary.simpleMessage("ตกลง"), + "importing": MessageLookupByLibrary.simpleMessage("กำลังนำเข้า...."), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("รหัสผ่านไม่ถูกต้อง"), + "incorrectRecoveryKey": + MessageLookupByLibrary.simpleMessage("คีย์การกู้คืนไม่ถูกต้อง"), + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( + "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("คีย์การกู้คืนไม่ถูกต้อง"), + "insecureDevice": + MessageLookupByLibrary.simpleMessage("อุปกรณ์ไม่ปลอดภัย"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("ที่อยู่อีเมลไม่ถูกต้อง"), + "invalidKey": MessageLookupByLibrary.simpleMessage("รหัสไม่ถูกต้อง"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง โปรดตรวจสอบให้แน่ใจว่ามี 24 คำ และตรวจสอบการสะกดของแต่ละคำ\n\nหากคุณป้อนรหัสกู้คืนที่เก่ากว่า ตรวจสอบให้แน่ใจว่ามีความยาว 64 ตัวอักษร และตรวจสอบแต่ละตัวอักษร"), + "itemCount": m35, + "kindlyHelpUsWithThisInformation": + MessageLookupByLibrary.simpleMessage("กรุณาช่วยเราด้วยข้อมูลนี้"), + "lastUpdated": MessageLookupByLibrary.simpleMessage("อัปเดตล่าสุด"), + "lightTheme": MessageLookupByLibrary.simpleMessage("สว่าง"), + "linkCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "คัดลอกลิงก์ไปยังคลิปบอร์ดแล้ว"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("ลิงก์หมดอายุแล้ว"), + "loadMessage9": MessageLookupByLibrary.simpleMessage( + "เราใช้ Xchacha20Poly1305 เพื่อเข้ารหัสข้อมูลของคุณอย่างปลอดภัย"), + "logInLabel": MessageLookupByLibrary.simpleMessage("เข้าสู่ระบบ"), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "โดยการคลิกเข้าสู่ระบบ ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("จัดการ"), + "map": MessageLookupByLibrary.simpleMessage("แผนที่"), + "maps": MessageLookupByLibrary.simpleMessage("แผนที่"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("ปานกลาง"), + "moveItem": m37, + "moveToAlbum": MessageLookupByLibrary.simpleMessage("ย้ายไปยังอัลบั้ม"), + "name": MessageLookupByLibrary.simpleMessage("ชื่อ"), + "newest": MessageLookupByLibrary.simpleMessage("ใหม่สุด"), + "noRecoveryKey": + MessageLookupByLibrary.simpleMessage("ไม่มีคีย์การกู้คืน?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "เนื่องจากลักษณะของโปรโตคอลการเข้ารหัสตั้งแต่ต้นทางถึงปลายทางของเรา ข้อมูลของคุณจึงไม่สามารถถอดรหัสได้หากไม่มีรหัสผ่านหรือคีย์การกู้คืน"), + "ok": MessageLookupByLibrary.simpleMessage("ตกลง"), + "onEnte": MessageLookupByLibrary.simpleMessage( + "บน ente"), + "oops": MessageLookupByLibrary.simpleMessage("อ๊ะ"), + "oopsSomethingWentWrong": + MessageLookupByLibrary.simpleMessage("อ๊ะ มีบางอย่างผิดพลาด"), + "openstreetmapContributors": + MessageLookupByLibrary.simpleMessage("ผู้มีส่วนร่วม OpenStreetMap"), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("หรือเลือกที่มีอยู่แล้ว"), + "password": MessageLookupByLibrary.simpleMessage("รหัสผ่าน"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("เปลี่ยนรหัสผ่านสำเร็จ"), + "passwordStrength": m41, + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "เราไม่จัดเก็บรหัสผ่านนี้ ดังนั้นหากคุณลืม เราจะไม่สามารถถอดรหัสข้อมูลของคุณ"), + "peopleUsingYourCode": + MessageLookupByLibrary.simpleMessage("ผู้คนที่ใช้รหัสของคุณ"), + "permanentlyDelete": + MessageLookupByLibrary.simpleMessage("ลบอย่างถาวร"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("รูปภาพ"), + "pleaseTryAgain": + MessageLookupByLibrary.simpleMessage("กรุณาลองอีกครั้ง"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("กรุณารอสักครู่..."), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("นโยบายความเป็นส่วนตัว"), + "publicLinkCreated": + MessageLookupByLibrary.simpleMessage("สร้างลิงก์สาธารณะแล้ว"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("เปิดใช้ลิงก์สาธารณะแล้ว"), + "recover": MessageLookupByLibrary.simpleMessage("กู้คืน"), + "recoverAccount": MessageLookupByLibrary.simpleMessage("กู้คืนบัญชี"), + "recoverButton": MessageLookupByLibrary.simpleMessage("กู้คืน"), + "recoveryKey": MessageLookupByLibrary.simpleMessage("คีย์การกู้คืน"), + "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( + "คัดลอกคีย์การกู้คืนไปยังคลิปบอร์ดแล้ว"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "หากคุณลืมรหัสผ่าน วิธีเดียวที่คุณสามารถกู้คืนข้อมูลของคุณได้คือการใช้คีย์นี้"), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "เราไม่จัดเก็บคีย์นี้ โปรดบันทึกคีย์ 24 คำนี้ไว้ในที่ที่ปลอดภัย"), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "ยอดเยี่ยม! คีย์การกู้คืนของคุณถูกต้อง ขอบคุณสำหรับการยืนยัน\n\nโปรดอย่าลืมสำรองคีย์การกู้คืนของคุณไว้อย่างปลอดภัย"), + "recoveryKeyVerified": + MessageLookupByLibrary.simpleMessage("ยืนยันคีย์การกู้คืนแล้ว"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "คีย์การกู้คืนเป็นวิธีเดียวที่จะกู้คืนรูปภาพของคุณหากคุณลืมรหัสผ่าน คุณสามารถหาคีย์การกู้คืนของคุณได้ในการตั้งค่า > ความปลอดภัย\n\nโปรดป้อนคีย์การกู้คืนของคุณที่นี่เพื่อยืนยันว่าคุณได้บันทึกไว้อย่างถูกต้อง"), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("กู้คืนสำเร็จ!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "อุปกรณ์ปัจจุบันไม่ทรงพลังพอที่จะยืนยันรหัสผ่านของคุณ แต่เราสามารถสร้างใหม่ในลักษณะที่ใช้ได้กับอุปกรณ์ทั้งหมดได้\n\nกรุณาเข้าสู่ระบบโดยใช้คีย์การกู้คืนของคุณและสร้างรหัสผ่านใหม่ (คุณสามารถใช้รหัสเดิมอีกครั้งได้หากต้องการ)"), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("สร้างรหัสผ่านใหม่"), + "resendEmail": MessageLookupByLibrary.simpleMessage("ส่งอีเมลอีกครั้ง"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("รีเซ็ตรหัสผ่าน"), + "restore": MessageLookupByLibrary.simpleMessage(" กู้คืน"), + "restoreToAlbum": + MessageLookupByLibrary.simpleMessage("กู้คืนไปยังอัลบั้ม"), + "save": MessageLookupByLibrary.simpleMessage("บันทึก"), + "saveCopy": MessageLookupByLibrary.simpleMessage("บันทึกสำเนา"), + "saveKey": MessageLookupByLibrary.simpleMessage("บันทึกคีย์"), + "saveYourRecoveryKeyIfYouHaventAlready": + MessageLookupByLibrary.simpleMessage( + "บันทึกคีย์การกู้คืนของคุณหากคุณยังไม่ได้ทำ"), + "scanCode": MessageLookupByLibrary.simpleMessage("สแกนรหัส"), + "selectAll": MessageLookupByLibrary.simpleMessage("เลือกทั้งหมด"), + "selectReason": MessageLookupByLibrary.simpleMessage("เลือกเหตุผล"), + "sendEmail": MessageLookupByLibrary.simpleMessage("ส่งอีเมล"), + "sendLink": MessageLookupByLibrary.simpleMessage("ส่งลิงก์"), + "setPasswordTitle": + MessageLookupByLibrary.simpleMessage("ตั้งรหัสผ่าน"), + "setupComplete": + MessageLookupByLibrary.simpleMessage("ตั้งค่าเสร็จสมบูรณ์"), + "share": MessageLookupByLibrary.simpleMessage("แชร์"), + "shareALink": MessageLookupByLibrary.simpleMessage("แชร์​ลิงก์"), + "shareLink": MessageLookupByLibrary.simpleMessage("แชร์​ลิงก์"), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว"), + "skip": MessageLookupByLibrary.simpleMessage("ข้าม"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "มีบางอย่างผิดพลาด โปรดลองอีกครั้ง"), + "sorry": MessageLookupByLibrary.simpleMessage("ขออภัย"), + "status": MessageLookupByLibrary.simpleMessage("สถานะ"), + "storageBreakupFamily": + MessageLookupByLibrary.simpleMessage("ครอบครัว"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("คุณ"), + "storageUsageInfo": m60, + "strongStrength": MessageLookupByLibrary.simpleMessage("แข็งแรง"), + "syncStopped": MessageLookupByLibrary.simpleMessage("หยุดการซิงค์แล้ว"), + "syncing": MessageLookupByLibrary.simpleMessage("กำลังซิงค์..."), + "systemTheme": MessageLookupByLibrary.simpleMessage("ระบบ"), + "tapToCopy": MessageLookupByLibrary.simpleMessage("แตะเพื่อคัดลอก"), + "tapToEnterCode": + MessageLookupByLibrary.simpleMessage("แตะเพื่อป้อนรหัส"), + "termsOfServicesTitle": + MessageLookupByLibrary.simpleMessage("เงื่อนไข"), + "theRecoveryKeyYouEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage( + "คีย์การกู้คืนที่คุณป้อนไม่ถูกต้อง"), + "thisDevice": MessageLookupByLibrary.simpleMessage("อุปกรณ์นี้"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "เพื่อรีเซ็ตรหัสผ่านของคุณ โปรดยืนยันอีเมลของคุณก่อน"), + "total": MessageLookupByLibrary.simpleMessage("รวม"), + "trash": MessageLookupByLibrary.simpleMessage("ถังขยะ"), + "tryAgain": MessageLookupByLibrary.simpleMessage("ลองอีกครั้ง"), + "twofactorSetup": + MessageLookupByLibrary.simpleMessage("การตั้งค่าสองปัจจัย"), + "unarchive": MessageLookupByLibrary.simpleMessage("เลิกเก็บถาวร"), + "uncategorized": MessageLookupByLibrary.simpleMessage("ไม่มีหมวดหมู่"), + "unhide": MessageLookupByLibrary.simpleMessage("เลิกซ่อน"), + "unhideToAlbum": + MessageLookupByLibrary.simpleMessage("เลิกซ่อนไปยังอัลบั้ม"), + "unselectAll": MessageLookupByLibrary.simpleMessage("ไม่เลือกทั้งหมด"), + "useRecoveryKey": + MessageLookupByLibrary.simpleMessage("ใช้คีย์การกู้คืน"), + "verify": MessageLookupByLibrary.simpleMessage("ยืนยัน"), + "verifyEmail": MessageLookupByLibrary.simpleMessage("ยืนยันอีเมล"), + "verifyIDLabel": MessageLookupByLibrary.simpleMessage("ยืนยัน"), + "verifyPassword": + MessageLookupByLibrary.simpleMessage("ยืนยันรหัสผ่าน"), + "verifyingRecoveryKey": + MessageLookupByLibrary.simpleMessage("กำลังยืนยันคีย์การกู้คืน..."), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("วิดีโอ"), + "viewRecoveryKey": + MessageLookupByLibrary.simpleMessage("ดูคีย์การกู้คืน"), + "waitingForWifi": + MessageLookupByLibrary.simpleMessage("กำลังรอ WiFi..."), + "weHaveSendEmailTo": m69, + "weakStrength": MessageLookupByLibrary.simpleMessage("อ่อน"), + "welcomeBack": + MessageLookupByLibrary.simpleMessage("ยินดีต้อนรับกลับมา!"), + "you": MessageLookupByLibrary.simpleMessage("คุณ"), + "youCanManageYourLinksInTheShareTab": + MessageLookupByLibrary.simpleMessage( + "คุณสามารถจัดการลิงก์ของคุณได้ในแท็บแชร์"), + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("บัญชีของคุณถูกลบแล้ว") + }; +} diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart new file mode 100644 index 0000000000..775cc78213 --- /dev/null +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ti locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ti'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index 28813655f0..fd82236d0d 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -20,155 +20,138 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'tr'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: 'Ortak çalışan ekle', one: 'Ortak çalışan ekle', other: 'Ortak çalışan ekle')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: 'Öğeyi taşı', other: 'Öğeleri taşı')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "${storageAmount} eklentiniz ${endDate} tarihine kadar geçerlidir"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, zero: 'Görüntüleyen ekle', one: 'Görüntüleyen ekle', other: 'Görüntüleyen ekle')}"; - static String m4(emailOrName) => "${emailOrName} tarafından eklendi"; + static String m7(emailOrName) => "${emailOrName} tarafından eklendi"; - static String m5(albumName) => "${albumName} albümüne başarıyla eklendi"; + static String m8(albumName) => "${albumName} albümüne başarıyla eklendi"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: 'Katılımcı Yok', one: '1 Katılımcı', other: '${count} Katılımcı')}"; - static String m7(versionValue) => "Sürüm: ${versionValue}"; + static String m10(versionValue) => "Sürüm: ${versionValue}"; - static String m8(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} free"; - - static String m9(paymentProvider) => + static String m12(paymentProvider) => "Lütfen önce mevcut aboneliğinizi ${paymentProvider} adresinden iptal edin"; - static String m10(user) => + static String m13(user) => "${user}, bu albüme daha fazla fotoğraf ekleyemeyecek.\n\nAncak, kendi eklediği mevcut fotoğrafları kaldırmaya devam edebilecektir"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Şu ana kadar aileniz ${storageAmountInGb} GB aldı', 'false': 'Şu ana kadar ${storageAmountInGb} GB aldınız', 'other': 'Şu ana kadar ${storageAmountInGb} GB aldınız!', })}"; - static String m12(albumName) => + static String m15(albumName) => "${albumName} için ortak çalışma bağlantısı oluşturuldu"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "Aboneliğinizi yönetmek için lütfen ${familyAdminEmail} ile iletişime geçin"; - static String m14(provider) => + static String m17(provider) => "Lütfen ${provider} aboneliğinizi yönetmek için support@ente.io adresinden bizimle iletişime geçin."; - static String m15(endpoint) => "${endpoint}\'e bağlanıldı"; + static String m18(endpoint) => "${endpoint}\'e bağlanıldı"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "Siliniyor ${currentlyDeleting} / ${totalCount}"; - static String m18(albumName) => + static String m21(albumName) => "Bu, \"${albumName}\"e erişim için olan genel bağlantıyı kaldıracaktır."; - static String m19(supportEmail) => + static String m22(supportEmail) => "Lütfen kayıtlı e-posta adresinizden ${supportEmail} adresine bir e-posta gönderin"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} dosyalar, ${formattedSize} her biri"; - static String m22(newEmail) => "E-posta ${newEmail} olarak değiştirildi"; + static String m25(newEmail) => "E-posta ${newEmail} olarak değiştirildi"; - static String m23(email) => - "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "Bu cihazdaki ${Intl.plural(count, one: '1 file', other: '${formattedNumber} dosya')} güvenli bir şekilde yedeklendi"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "Bu albümdeki ${Intl.plural(count, one: '1 file', other: '${formattedNumber} dosya')} güvenli bir şekilde yedeklendi"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "Birisinin davet kodunuzu uygulayıp ücretli hesap açtığı her seferede ${storageAmountInGB} GB"; - static String m27(endDate) => "Ücretsiz deneme ${endDate} sona erir"; + static String m30(endDate) => "Ücretsiz deneme ${endDate} sona erir"; - static String m28(count) => - "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; + static String m32(sizeInMBorGB) => "${sizeInMBorGB} yer açın"; - static String m29(sizeInMBorGB) => "${sizeInMBorGB} yer açın"; - - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Yer açmak için cihazdan silinebilir ${formattedSize}', other: 'Yer açmak için cihazdan silinebilir ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "Siliniyor ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} öğe', other: '${count} öğeler')}"; - static String m33(expiryTime) => + static String m36(expiryTime) => "Bu bağlantı ${expiryTime} dan sonra geçersiz olacaktır"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: 'anı yok', one: '${formattedCount} anı', other: '${formattedCount} anılar')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: 'Öğeyi taşı', other: 'Öğeleri taşı')}"; - static String m36(albumName) => "${albumName} adlı albüme başarıyla taşındı"; + static String m38(albumName) => "${albumName} adlı albüme başarıyla taşındı"; - static String m37(name) => "Not ${name}?"; - - static String m39(passwordStrengthValue) => + static String m41(passwordStrengthValue) => "Şifrenin güçlülük seviyesi: ${passwordStrengthValue}"; - static String m40(providerName) => + static String m42(providerName) => "Sizden ücret alındıysa lütfen ${providerName} destek ekibiyle görüşün"; - static String m41(endDate) => - "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; + static String m44(toEmail) => "Lütfen bize ${toEmail} adresinden ulaşın"; - static String m42(toEmail) => "Lütfen bize ${toEmail} adresinden ulaşın"; - - static String m43(toEmail) => + static String m45(toEmail) => "Lütfen günlükleri şu adrese gönderin\n${toEmail}"; - static String m44(storeName) => "Bizi ${storeName} üzerinden değerlendirin"; + static String m46(storeName) => "Bizi ${storeName} üzerinden değerlendirin"; - static String m45(storageInGB) => "3. Hepimiz ${storageInGB} GB* bedava alın"; + static String m47(storageInGB) => "3. Hepimiz ${storageInGB} GB* bedava alın"; - static String m46(userEmail) => + static String m48(userEmail) => "${userEmail} bu paylaşılan albümden kaldırılacaktır\n\nOnlar tarafından eklenen tüm fotoğraflar da albümden kaldırılacaktır"; - static String m47(endDate) => "Abonelik ${endDate} tarihinde yenilenir"; + static String m49(endDate) => "Abonelik ${endDate} tarihinde yenilenir"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, one: '${count} yıl önce', other: '${count} yıl önce')}"; - static String m49(count) => "${count} seçildi"; + static String m1(count) => "${count} seçildi"; - static String m50(count, yourCount) => + static String m51(count, yourCount) => "Seçilenler: ${count} (${yourCount} sizin seçiminiz)"; - static String m51(verificationID) => + static String m52(verificationID) => "İşte ente.io için doğrulama kimliğim: ${verificationID}."; - static String m52(verificationID) => + static String m2(verificationID) => "Merhaba, bu ente.io doğrulama kimliğinizin doğruluğunu onaylayabilir misiniz: ${verificationID}"; - static String m53(referralCode, referralStorageInGB) => - "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Belirli kişilerle paylaş', one: '1 kişiyle paylaşıldı', other: '${numberOfPeople} kişiyle paylaşıldı')}"; @@ -176,20 +159,12 @@ class MessageLookup extends MessageLookupByLibrary { static String m56(fileType) => "Bu ${fileType}, cihazınızdan silinecek."; - static String m57(fileType) => - "This ${fileType} is in both Ente and your device."; - - static String m58(fileType) => "This ${fileType} will be deleted from Ente."; - static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit} kullanıldı"; - static String m61(id) => - "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m62(endDate) => "Aboneliğiniz ${endDate} tarihinde iptal edilecektir"; @@ -218,8 +193,6 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "A new version of Ente is available."), "about": MessageLookupByLibrary.simpleMessage("Hakkında"), "account": MessageLookupByLibrary.simpleMessage("Hesap"), "accountWelcomeBack": @@ -228,35 +201,33 @@ class MessageLookup extends MessageLookupByLibrary { "Şifremi kaybedersem, verilerim uçtan uca şifrelendiği için verilerimi kaybedebileceğimi farkındayım."), "activeSessions": MessageLookupByLibrary.simpleMessage("Aktif oturumlar"), - "addAName": MessageLookupByLibrary.simpleMessage("Add a name"), "addANewEmail": MessageLookupByLibrary.simpleMessage("Yeni e-posta ekle"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Düzenleyici ekle"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Cihazdan ekle"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("Konum Ekle"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Ekle"), "addMore": MessageLookupByLibrary.simpleMessage("Daha fazla ekle"), "addNew": MessageLookupByLibrary.simpleMessage("Yeni ekle"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Eklentilerin ayrıntıları"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Eklentiler"), "addPhotos": MessageLookupByLibrary.simpleMessage("Fotoğraf ekle"), "addSelected": MessageLookupByLibrary.simpleMessage("Seçileni ekle"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Albüme ekle"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Add to Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Gizli albüme ekle"), "addViewer": MessageLookupByLibrary.simpleMessage("Görüntüleyici ekle"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage( "Fotoğraflarınızı şimdi ekleyin"), "addedAs": MessageLookupByLibrary.simpleMessage("Eklendi"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("Favorilere ekleniyor..."), "advanced": MessageLookupByLibrary.simpleMessage("Gelişmiş"), @@ -267,7 +238,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("1 hafta sonra"), "after1Year": MessageLookupByLibrary.simpleMessage("1 yıl sonra"), "albumOwner": MessageLookupByLibrary.simpleMessage("Sahip"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("Albüm Başlığı"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Albüm güncellendi"), @@ -304,10 +275,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Android, iOS, Web, Masaüstü"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Kimlik doğrulaması gerekli"), - "appLock": MessageLookupByLibrary.simpleMessage("App lock"), - "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple kimliği"), "apply": MessageLookupByLibrary.simpleMessage("Uygula"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Kodu girin"), @@ -352,8 +320,6 @@ class MessageLookup extends MessageLookupByLibrary { "İki faktörlü kimlik doğrulamayı yapılandırmak için lütfen kimlik doğrulaması yapın"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Hesap silme işlemini başlatmak için lütfen kimlik doğrulaması yapın"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Aktif oturumlarınızı görüntülemek için lütfen kimliğinizi doğrulayın"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -369,20 +335,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kimlik doğrulama başarısız oldu, lütfen tekrar deneyin"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Kimlik doğrulama başarılı!"), - "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( - "You\'ll see available Cast devices here."), - "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( - "Make sure Local Network permissions are turned on for the Ente Photos app, in Settings."), - "autoLock": MessageLookupByLibrary.simpleMessage("Auto lock"), - "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( - "Time after which the app locks after being put in the background"), - "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( - "Due to technical glitch, you have been logged out. Our apologies for the inconvenience."), - "autoPair": MessageLookupByLibrary.simpleMessage("Auto pair"), - "autoPairDesc": MessageLookupByLibrary.simpleMessage( - "Auto pair works only with devices that support Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Mevcut"), - "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Yedeklenmiş klasörler"), "backup": MessageLookupByLibrary.simpleMessage("Yedekle"), @@ -409,16 +362,12 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Yalnızca size ait dosyaları kaldırabilir"), "cancel": MessageLookupByLibrary.simpleMessage("İptal Et"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Abonelik iptali"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage("Dosyalar silinemiyor"), - "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( - "Please make sure you are on the same network as the TV."), - "castIPMismatchTitle": - MessageLookupByLibrary.simpleMessage("Failed to cast album"), "castInstruction": MessageLookupByLibrary.simpleMessage( "Eşleştirmek istediğiniz cihazda cast.ente.io adresini ziyaret edin.\n\nAlbümü TV\'nizde oynatmak için aşağıdaki kodu girin."), "centerPoint": MessageLookupByLibrary.simpleMessage("Merkez noktası"), @@ -436,27 +385,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Güncellemeleri kontol et"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Lütfen doğrulama işlemini tamamlamak için gelen kutunuzu (ve spam klasörünüzü) kontrol edin"), - "checkStatus": MessageLookupByLibrary.simpleMessage("Check status"), "checking": MessageLookupByLibrary.simpleMessage("Kontrol ediliyor..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Fotoğrafları seçin ve \"Misafir Görünümü\"nü deneyin."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Telefonunuzu bir arkadaşınıza fotoğraf göstermek için mi veriyorsunuz? Fazla kaydırmasından endişelenmeyin. Misafir görünümü seçtiğiniz fotoğraflarla sınırlı kalır."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Misafir Görünümü"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "360 derece görüşe sahip panorama fotoğrafları görüntüleme desteği ekledik. Hareket tabanlı gezinme ile etkileyici bir deneyim sunar!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Panorama Görüntüleyici"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Geliştirilmiş oynatma kontrolleri ve HDR video desteği ile yeni bir video oynatıcı sunuyoruz."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Video Oynatıcı"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Bedava alan talep edin"), "claimMore": MessageLookupByLibrary.simpleMessage("Arttır!"), "claimed": MessageLookupByLibrary.simpleMessage("Alındı"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Temiz Genel"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -472,19 +406,15 @@ class MessageLookup extends MessageLookupByLibrary { "Yakalama zamanına göre kulüp"), "clubByFileName": MessageLookupByLibrary.simpleMessage("Dosya adına göre kulüp"), - "clusteringProgress": - MessageLookupByLibrary.simpleMessage("Clustering progress"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Kod kabul edildi"), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage("Kodunuz panoya kopyalandı"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Sizin kullandığınız kod"), - "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Organizasyon bağlantısı"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("Düzenleyici"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -512,12 +442,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Kurtarma anahtarını doğrula"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Kurtarma anahtarını doğrulayın"), - "connectToDevice": - MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("Destek ile iletişim"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Kişiler"), "contents": MessageLookupByLibrary.simpleMessage("İçerikler"), "continueLabel": MessageLookupByLibrary.simpleMessage("Devam edin"), @@ -544,8 +472,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Hesap oluşturun"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Fotoğrafları seçmek için uzun basın ve + düğmesine tıklayarak bir albüm oluşturun"), - "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), "createCollage": MessageLookupByLibrary.simpleMessage("Kolaj oluştur"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Yeni bir hesap oluşturun"), @@ -557,11 +483,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bağlantı oluşturuluyor..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage("Kritik güncelleme mevcut"), - "crop": MessageLookupByLibrary.simpleMessage("Crop"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("Güncel kullanımınız "), "custom": MessageLookupByLibrary.simpleMessage("Kişisel"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("Karanlık"), "dayToday": MessageLookupByLibrary.simpleMessage("Bugün"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Dün"), @@ -583,8 +508,6 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( "Bu, tüm boş albümleri silecektir. Bu, albüm listenizdeki dağınıklığı azaltmak istediğinizde kullanışlıdır."), "deleteAll": MessageLookupByLibrary.simpleMessage("Hepsini Sil"), - "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "This account is linked to other Ente apps, if you use any. Your uploaded data, across all Ente apps, will be scheduled for deletion, and your account will be permanently deleted."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Lütfen kayıtlı e-posta adresinizden account-deletion@ente.io\'a e-posta gönderiniz."), "deleteEmptyAlbums": @@ -595,13 +518,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Her ikisinden de sil"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Cihazınızdan silin"), - "deleteFromEnte": - MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Konumu sil"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotoğrafları sil"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage( "İhtiyacım olan önemli bir özellik eksik"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -627,11 +548,6 @@ class MessageLookup extends MessageLookupByLibrary { "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( "Geliştirici ayarlarını değiştirmek istediğinizden emin misiniz?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Kodu girin"), - "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "Files added to this device album will automatically get uploaded to Ente."), - "deviceLock": MessageLookupByLibrary.simpleMessage("Device lock"), - "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Disable the device screen lock when Ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Cihaz bulunamadı"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Biliyor musun?"), @@ -641,7 +557,7 @@ class MessageLookup extends MessageLookupByLibrary { "Görüntüleyiciler, hala harici araçlar kullanarak ekran görüntüsü alabilir veya fotoğraflarınızın bir kopyasını kaydedebilir. Lütfen bunu göz önünde bulundurunuz"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Lütfen dikkate alın"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "İki Aşamalı Doğrulamayı Devre Dışı Bırak"), "disablingTwofactorAuthentication": @@ -662,9 +578,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("İndirme başarısız"), "downloading": MessageLookupByLibrary.simpleMessage("İndiriliyor..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("Düzenle"), "editLocation": MessageLookupByLibrary.simpleMessage("Konumu düzenle"), "editLocationTagTitle": @@ -676,8 +592,7 @@ class MessageLookup extends MessageLookupByLibrary { "Konumda yapılan düzenlemeler yalnızca Ente\'de görülecektir"), "eligible": MessageLookupByLibrary.simpleMessage("uygun"), "email": MessageLookupByLibrary.simpleMessage("E-Posta"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-posta doğrulama"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -698,13 +613,6 @@ class MessageLookup extends MessageLookupByLibrary { "Fatura başarıyla güncellendi"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "Varsayılan olarak uçtan uca şifrelenmiş"), - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": - MessageLookupByLibrary.simpleMessage( - "Ente can encrypt and preserve files only if you grant access to them"), - "entePhotosPerm": MessageLookupByLibrary.simpleMessage( - "Ente needs permission to preserve your photos"), - "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "Ente preserves your memories, so they\'re always available to you, even if you lose your device."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Aileniz de planınıza eklenebilir."), "enterAlbumName": @@ -722,9 +630,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Şifrenizi girin"), "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Verilerinizi şifrelemek için kullanabileceğimiz bir şifre girin"), - "enterPersonName": - MessageLookupByLibrary.simpleMessage("Enter person name"), - "enterPin": MessageLookupByLibrary.simpleMessage("Enter PIN"), "enterReferralCode": MessageLookupByLibrary.simpleMessage("Davet kodunuzu girin"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -749,8 +654,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Günlüğü dışa aktar"), "exportYourData": MessageLookupByLibrary.simpleMessage("Veriyi dışarı aktar"), - "faceRecognition": - MessageLookupByLibrary.simpleMessage("Face recognition"), "faces": MessageLookupByLibrary.simpleMessage("Yüzler"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage("Uygulanırken hata oluştu"), @@ -768,8 +671,6 @@ class MessageLookup extends MessageLookupByLibrary { "Abonelik yenilenirken hata oluştu"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage("Ödeme durumu doğrulanamadı"), - "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "Add 5 family members to your existing plan without paying extra.\n\nEach member gets their own private space, and cannot see each other\'s files unless they\'re shared.\n\nFamily plans are available to customers who have a paid Ente subscription.\n\nSubscribe now to get started!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Aile"), "familyPlans": MessageLookupByLibrary.simpleMessage("Aile Planı"), "faq": MessageLookupByLibrary.simpleMessage("Sıkça sorulan sorular"), @@ -785,41 +686,33 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dosya türü"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dosya türleri ve adları"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dosyalar silinmiş"), - "filesSavedToGallery": - MessageLookupByLibrary.simpleMessage("Files saved to gallery"), - "findPeopleByName": - MessageLookupByLibrary.simpleMessage("Find people quickly by name"), "flip": MessageLookupByLibrary.simpleMessage("Çevir"), "forYourMemories": MessageLookupByLibrary.simpleMessage("anıların için"), "forgotPassword": MessageLookupByLibrary.simpleMessage("Şifremi unuttum"), - "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Alınan bedava alan"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Kullanılabilir bedava alan"), "freeTrial": MessageLookupByLibrary.simpleMessage("Ücretsiz deneme"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Cihaz alanını boşaltın"), - "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( - "Save space on your device by clearing files that have been already backed up."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Boş alan"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Galeride 1000\'e kadar anı gösterilir"), "general": MessageLookupByLibrary.simpleMessage("Genel"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Şifreleme anahtarı oluşturuluyor..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Ayarlara git"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google play kimliği"), @@ -829,9 +722,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("İzinleri değiştir"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Yakındaki fotoğrafları gruplandır"), - "guestView": MessageLookupByLibrary.simpleMessage("Guest view"), - "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( - "To enable guest view, please setup device passcode or screen lock in your system settings."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Biz uygulama kurulumlarını takip etmiyoruz. Bizi nereden duyduğunuzdan bahsetmeniz bize çok yardımcı olacak!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -839,11 +729,6 @@ class MessageLookup extends MessageLookupByLibrary { "help": MessageLookupByLibrary.simpleMessage("Yardım"), "hidden": MessageLookupByLibrary.simpleMessage("Gizle"), "hide": MessageLookupByLibrary.simpleMessage("Gizle"), - "hideContent": MessageLookupByLibrary.simpleMessage("Hide content"), - "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher and disables screenshots"), - "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( - "Hides app content in the app switcher"), "hiding": MessageLookupByLibrary.simpleMessage("Gizleniyor..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("OSM Fransa\'da ağırlandı"), @@ -856,9 +741,6 @@ class MessageLookup extends MessageLookupByLibrary { "Biyometrik kimlik doğrulama devre dışı. Etkinleştirmek için lütfen ekranınızı kilitleyin ve kilidini açın."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Tamam"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Yoksay"), - "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Some files in this album are ignored from upload because they had previously been deleted from Ente."), - "immediately": MessageLookupByLibrary.simpleMessage("Immediately"), "importing": MessageLookupByLibrary.simpleMessage("İçeri aktarılıyor...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Yanlış kod"), @@ -872,8 +754,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Yanlış kurtarma kodu"), "indexedItems": MessageLookupByLibrary.simpleMessage("Yeni öğeleri indeksle"), - "indexingIsPaused": MessageLookupByLibrary.simpleMessage( - "Indexing is paused. It will automatically resume when device is ready."), "insecureDevice": MessageLookupByLibrary.simpleMessage("Güvenilir olmayan cihaz"), "installManually": @@ -888,15 +768,12 @@ class MessageLookup extends MessageLookupByLibrary { "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "Girdiğiniz kurtarma anahtarı geçerli değil. Lütfen anahtarın 24 kelime içerdiğinden ve her bir kelimenin doğru şekilde yazıldığından emin olun.\n\nEğer eski bir kurtarma kodu girdiyseniz, o zaman kodun 64 karakter uzunluğunda olduğunu kontrol edin."), "invite": MessageLookupByLibrary.simpleMessage("Davet et"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("Invite to Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Arkadaşlarını davet et"), - "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Invite your friends to Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Bir şeyler ters gitmiş gibi görünüyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse, lütfen destek ekibimizle iletişime geçin."), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Öğeler, kalıcı olarak silinmeden önce kalan gün sayısını gösterir"), @@ -918,7 +795,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aile planından ayrıl"), "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage( "Paylaşılan albüm silinsin mi?"), - "left": MessageLookupByLibrary.simpleMessage("Left"), "light": MessageLookupByLibrary.simpleMessage("Aydınlık"), "lightTheme": MessageLookupByLibrary.simpleMessage("Aydınlık"), "linkCopiedToClipboard": @@ -926,7 +802,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Cihaz limiti"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Geçerli"), "linkExpired": MessageLookupByLibrary.simpleMessage("Süresi dolmuş"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("Linkin geçerliliği"), "linkHasExpired": @@ -970,10 +846,6 @@ class MessageLookup extends MessageLookupByLibrary { "logInLabel": MessageLookupByLibrary.simpleMessage("Giriş yap"), "loggingOut": MessageLookupByLibrary.simpleMessage("Çıkış yapılıyor..."), - "loginSessionExpired": - MessageLookupByLibrary.simpleMessage("Session expired"), - "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( - "Your session has expired. Please login again."), "loginTerms": MessageLookupByLibrary.simpleMessage( "\"Giriş yap\" düğmesine tıklayarak, Hizmet Şartları\'nı ve Gizlilik Politikası\'nı kabul ediyorum"), "logout": MessageLookupByLibrary.simpleMessage("Çıkış yap"), @@ -998,16 +870,12 @@ class MessageLookup extends MessageLookupByLibrary { "manageParticipants": MessageLookupByLibrary.simpleMessage("Yönet"), "manageSubscription": MessageLookupByLibrary.simpleMessage("Abonelikleri yönet"), - "manualPairDesc": MessageLookupByLibrary.simpleMessage( - "Pair with PIN works with any screen you wish to view your album on."), "map": MessageLookupByLibrary.simpleMessage("Harita"), "maps": MessageLookupByLibrary.simpleMessage("Haritalar"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Ürünler"), - "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobil, Web, Masaüstü"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Ilımlı"), @@ -1016,11 +884,11 @@ class MessageLookup extends MessageLookupByLibrary { "Sorgunuzu değiştirin veya aramayı deneyin"), "moments": MessageLookupByLibrary.simpleMessage("Anlar"), "monthly": MessageLookupByLibrary.simpleMessage("Aylık"), - "moveItem": m35, + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Albüme taşı"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Gizli albüme ekle"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("Cöp kutusuna taşı"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1032,14 +900,10 @@ class MessageLookup extends MessageLookupByLibrary { "Ente\'ye bağlanılamıyor. Lütfen ağ ayarlarınızı kontrol edin ve hata devam ederse destek ekibiyle iletişime geçin."), "never": MessageLookupByLibrary.simpleMessage("Asla"), "newAlbum": MessageLookupByLibrary.simpleMessage("Yeni albüm"), - "newToEnte": MessageLookupByLibrary.simpleMessage("New to Ente"), "newest": MessageLookupByLibrary.simpleMessage("En yeni"), - "next": MessageLookupByLibrary.simpleMessage("Next"), "no": MessageLookupByLibrary.simpleMessage("Hayır"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Henüz paylaştığınız albüm yok"), - "noDeviceFound": - MessageLookupByLibrary.simpleMessage("No device found"), "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Yok"), "noDeviceThatCanBeDeleted": MessageLookupByLibrary.simpleMessage( "Bu cihazda silinebilecek hiçbir dosyanız yok"), @@ -1057,8 +921,6 @@ class MessageLookup extends MessageLookupByLibrary { "Şu anda hiçbir fotoğraf yedeklenmiyor"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Burada fotoğraf bulunamadı"), - "noQuickLinksSelected": - MessageLookupByLibrary.simpleMessage("No quick links selected"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Kurtarma kodunuz yok mu?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -1066,9 +928,6 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Sonuç bulunamadı"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Hiçbir sonuç bulunamadı"), - "noSystemLockFound": - MessageLookupByLibrary.simpleMessage("No system lock found"), - "notPersonLabel": m37, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Henüz sizinle paylaşılan bir şey yok"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1092,11 +951,6 @@ class MessageLookup extends MessageLookupByLibrary { "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("Veya mevcut birini seçiniz"), "pair": MessageLookupByLibrary.simpleMessage("Eşleştir"), - "pairWithPin": MessageLookupByLibrary.simpleMessage("Pair with PIN"), - "pairingComplete": - MessageLookupByLibrary.simpleMessage("Pairing complete"), - "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( - "Verification is still pending"), "passkey": MessageLookupByLibrary.simpleMessage("Parola Anahtarı"), "passkeyAuthTitle": MessageLookupByLibrary.simpleMessage("Geçiş anahtarı doğrulaması"), @@ -1104,9 +958,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Şifreniz başarılı bir şekilde değiştirildi"), "passwordLock": MessageLookupByLibrary.simpleMessage("Sifre kilidi"), - "passwordStrength": m39, - "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( - "Password strength is calculated considering the length of the password, used characters, and whether or not the password appears in the top 10,000 most used passwords"), + "passwordStrength": m41, "passwordWarning": MessageLookupByLibrary.simpleMessage( "Şifrelerinizi saklamıyoruz, bu yüzden unutursanız, verilerinizi deşifre edemeyiz"), "paymentDetails": @@ -1115,11 +967,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ödeme başarısız oldu"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Maalesef ödemeniz başarısız oldu. Lütfen destekle iletişime geçin, size yardımcı olacağız!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Bekleyen Öğeler"), "pendingSync": MessageLookupByLibrary.simpleMessage("Senkronizasyon bekleniyor"), - "people": MessageLookupByLibrary.simpleMessage("People"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage("Kodunuzu kullananlar"), "permDeleteWarning": MessageLookupByLibrary.simpleMessage( @@ -1140,9 +991,7 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Merkez noktasını seçin"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Albümü sabitle"), - "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Albümü TV\'de oynat"), - "playStoreFreeTrialValidTill": m41, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore aboneliği"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1154,14 +1003,12 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bu hata devam ederse lütfen desteğe başvurun"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Lütfen izin ver"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Lütfen tekrar giriş yapın"), - "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( - "Please select quick links to remove"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Lütfen tekrar deneyiniz"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1198,7 +1045,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Uygulamaya puan verin"), "rateUs": MessageLookupByLibrary.simpleMessage("Bizi değerlendirin"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Kurtarma"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Hesabı kurtar"), "recoverButton": MessageLookupByLibrary.simpleMessage("Kurtar"), @@ -1223,16 +1070,13 @@ class MessageLookup extends MessageLookupByLibrary { "recreatePasswordTitle": MessageLookupByLibrary.simpleMessage( "Sifrenizi tekrardan oluşturun"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), - "reenterPassword": - MessageLookupByLibrary.simpleMessage("Re-enter password"), - "reenterPin": MessageLookupByLibrary.simpleMessage("Re-enter PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Arkadaşlarınıza önerin ve planınızı 2 katına çıkarın"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Bu kodu arkadaşlarınıza verin"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ücretli bir plan için kaydolsunlar"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("Referanslar"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Davetler şu anda durmuş durumda"), @@ -1248,24 +1092,16 @@ class MessageLookup extends MessageLookupByLibrary { "remove": MessageLookupByLibrary.simpleMessage("Kaldır"), "removeDuplicates": MessageLookupByLibrary.simpleMessage("Yinelenenleri kaldır"), - "removeDuplicatesDesc": MessageLookupByLibrary.simpleMessage( - "Review and remove files that are exact duplicates."), "removeFromAlbum": MessageLookupByLibrary.simpleMessage("Albümden çıkar"), "removeFromAlbumTitle": MessageLookupByLibrary.simpleMessage("Albümden çıkarılsın mı?"), - "removeFromFavorite": - MessageLookupByLibrary.simpleMessage("Favorilerimden kaldır"), "removeLink": MessageLookupByLibrary.simpleMessage("Linki kaldır"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Katılımcıyı kaldır"), - "removeParticipantBody": m46, - "removePersonLabel": - MessageLookupByLibrary.simpleMessage("Remove person label"), + "removeParticipantBody": m48, "removePublicLink": MessageLookupByLibrary.simpleMessage("Herkese açık link oluştur"), - "removePublicLinks": - MessageLookupByLibrary.simpleMessage("Remove public links"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Kaldırdığınız öğelerden bazıları başkaları tarafından eklenmiştir ve bunlara erişiminizi kaybedeceksiniz"), "removeWithQuestionMark": @@ -1279,7 +1115,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dosyayı yeniden adlandır"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonelik yenileme"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("Hatayı bildir"), "reportBug": MessageLookupByLibrary.simpleMessage("Hata bildir"), "resendEmail": @@ -1297,10 +1133,6 @@ class MessageLookup extends MessageLookupByLibrary { "retry": MessageLookupByLibrary.simpleMessage("Tekrar dene"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Lütfen kopya olduğunu düşündüğünüz öğeleri inceleyin ve silin."), - "reviewSuggestions": - MessageLookupByLibrary.simpleMessage("Review suggestions"), - "right": MessageLookupByLibrary.simpleMessage("Right"), - "rotate": MessageLookupByLibrary.simpleMessage("Rotate"), "rotateLeft": MessageLookupByLibrary.simpleMessage("Sola döndür"), "rotateRight": MessageLookupByLibrary.simpleMessage("Sağa döndür"), "safelyStored": @@ -1313,12 +1145,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Henüz yapmadıysanız kurtarma anahtarınızı kaydetmeyi unutmayın"), "saving": MessageLookupByLibrary.simpleMessage("Kaydediliyor..."), - "savingEdits": MessageLookupByLibrary.simpleMessage("Saving edits..."), "scanCode": MessageLookupByLibrary.simpleMessage("Kodu tarayın"), "scanThisBarcodeWithnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Kimlik doğrulama uygulamanız ile kodu tarayın"), - "search": MessageLookupByLibrary.simpleMessage("Search"), "searchAlbumsEmptySection": MessageLookupByLibrary.simpleMessage("Albümler"), "searchByAlbumNameHint": @@ -1329,8 +1159,6 @@ class MessageLookup extends MessageLookupByLibrary { "Fotoğraf bilgilerini burada hızlı bir şekilde bulmak için \"#trip\" gibi açıklamalar ekleyin"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Tarihe, aya veya yıla göre arama yapın"), - "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( - "People will be shown here once indexing is done"), "searchFileTypesAndNamesEmptySection": MessageLookupByLibrary.simpleMessage("Dosya türleri ve adları"), "searchHint1": @@ -1346,7 +1174,7 @@ class MessageLookup extends MessageLookupByLibrary { "Bir fotoğrafın belli bir yarıçapında çekilen fotoğrafları gruplandırın"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "İnsanları davet ettiğinizde onların paylaştığı tüm fotoğrafları burada göreceksiniz"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Güvenlik"), "selectALocation": MessageLookupByLibrary.simpleMessage("Bir konum seçin"), @@ -1365,16 +1193,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ayrılma nedeninizi seçin"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Planınızı seçin"), - "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Selected files are not on Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "Seçilen klasörler şifrelenecek ve yedeklenecektir"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Seçilen öğeler tüm albümlerden silinecek ve çöp kutusuna taşınacak."), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("Gönder"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-posta gönder"), "sendInvite": MessageLookupByLibrary.simpleMessage("Davet kodu gönder"), @@ -1387,9 +1213,6 @@ class MessageLookup extends MessageLookupByLibrary { "setAs": MessageLookupByLibrary.simpleMessage("Şu şekilde ayarla"), "setCover": MessageLookupByLibrary.simpleMessage("Kapak Belirle"), "setLabel": MessageLookupByLibrary.simpleMessage("Ayarla"), - "setNewPassword": - MessageLookupByLibrary.simpleMessage("Set new password"), - "setNewPin": MessageLookupByLibrary.simpleMessage("Set new PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Parola ayarlayın"), "setRadius": MessageLookupByLibrary.simpleMessage("Yarıçapı ayarla"), @@ -1402,20 +1225,13 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Şimdi bir albüm paylaşın"), "shareLink": MessageLookupByLibrary.simpleMessage("Linki paylaş"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Yalnızca istediğiniz kişilerle paylaşın"), - "shareTextConfirmOthersVerificationID": m52, - "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m53, - "shareWithNonenteUsers": - MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), + "shareTextConfirmOthersVerificationID": m2, "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("İlk albümünüzü paylaşın"), - "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "Create shared and collaborative albums with other Ente users, including users on free plans."), "sharedByMe": MessageLookupByLibrary.simpleMessage("Benim paylaştıklarım"), "sharedByYou": MessageLookupByLibrary.simpleMessage("Paylaştıklarınız"), @@ -1441,13 +1257,8 @@ class MessageLookup extends MessageLookupByLibrary { "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("Tüm albümlerden silinecek."), - "singleFileInBothLocalAndRemote": m57, - "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Geç"), "social": MessageLookupByLibrary.simpleMessage("Sosyal Medya"), - "someItemsAreInBothEnteAndYourDevice": - MessageLookupByLibrary.simpleMessage( - "Some items are in both Ente and your device."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Silmeye çalıştığınız dosyalardan bazıları yalnızca cihazınızda mevcuttur ve silindiği takdirde kurtarılamaz"), @@ -1479,10 +1290,6 @@ class MessageLookup extends MessageLookupByLibrary { "startBackup": MessageLookupByLibrary.simpleMessage("Yedeklemeyi başlat"), "status": MessageLookupByLibrary.simpleMessage("Durum"), - "stopCastingBody": MessageLookupByLibrary.simpleMessage( - "Do you want to stop casting?"), - "stopCastingTitle": - MessageLookupByLibrary.simpleMessage("Stop casting"), "storage": MessageLookupByLibrary.simpleMessage("Depolama"), "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("Aile"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("Sen"), @@ -1491,7 +1298,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Depolama sınırı aşıldı"), "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Güçlü"), - "subAlreadyLinkedErrMessage": m61, "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Abone ol"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( @@ -1518,7 +1324,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("kopyalamak için dokunun"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage("Kodu girmek icin tıklayın"), - "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Bir şeyler ters gitmiş gibi görünüyor. Lütfen bir süre sonra tekrar deneyin. Hata devam ederse, lütfen destek ekibimizle iletişime geçin."), "terminate": MessageLookupByLibrary.simpleMessage("Sonlandır"), @@ -1562,28 +1367,17 @@ class MessageLookup extends MessageLookupByLibrary { "Bu, sizi aşağıdaki cihazdan çıkış yapacak:"), "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( "Bu cihazdaki oturumunuz kapatılacak!"), - "thisWillRemovePublicLinksOfAllSelectedQuickLinks": - MessageLookupByLibrary.simpleMessage( - "This will remove public links of all selected quick links."), - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage( - "To enable app lock, please setup device passcode or screen lock in your system settings."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Bir fotoğrafı veya videoyu gizlemek için"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Şifrenizi sıfılamak için lütfen e-postanızı girin."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Bugünün günlükleri"), - "tooManyIncorrectAttempts": - MessageLookupByLibrary.simpleMessage("Too many incorrect attempts"), "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Toplam boyut"), "trash": MessageLookupByLibrary.simpleMessage("Cöp kutusu"), "trashDaysLeft": m66, - "trim": MessageLookupByLibrary.simpleMessage("Trim"), "tryAgain": MessageLookupByLibrary.simpleMessage("Tekrar deneyiniz"), - "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Turn on backup to automatically upload files added to this device folder to Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "Yıllık planlarda 2 ay ücretsiz"), @@ -1626,10 +1420,6 @@ class MessageLookup extends MessageLookupByLibrary { "4 Aralık\'a kadar %50\'ye varan indirim."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Kullanılabilir depolama alanı mevcut planınızla sınırlıdır. Talep edilen fazla depolama alanı, planınızı yükselttiğinizde otomatik olarak kullanılabilir hale gelecektir."), - "useAsCover": MessageLookupByLibrary.simpleMessage("Use as cover"), - "usePublicLinksForPeopleNotOnEnte": - MessageLookupByLibrary.simpleMessage( - "Use public links for people not on Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Kurtarma anahtarını kullan"), "useSelectedPhoto": @@ -1662,9 +1452,6 @@ class MessageLookup extends MessageLookupByLibrary { "viewAll": MessageLookupByLibrary.simpleMessage("Tümünü görüntüle"), "viewAllExifData": MessageLookupByLibrary.simpleMessage( "Tüm EXIF verilerini görüntüle"), - "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Large files"), - "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( - "View files that are consuming the most amount of storage"), "viewLogs": MessageLookupByLibrary.simpleMessage("Günlükleri göster"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Kurtarma anahtarını görüntüle"), @@ -1684,7 +1471,6 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Zayıf"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Tekrardan hoşgeldin!"), - "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), "yearly": MessageLookupByLibrary.simpleMessage("Yıllık"), "yearsAgo": m70, "yes": MessageLookupByLibrary.simpleMessage("Evet"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 793ab08d5c..2a34fee561 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -20,137 +20,139 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'zh'; - static String m0(count) => + static String m3(count) => "${Intl.plural(count, zero: '添加协作者', one: '添加协作者', other: '添加协作者')}"; - static String m2(count) => + static String m4(count) => "${Intl.plural(count, one: '添加一个项目', other: '添加一些项目')}"; - static String m3(storageAmount, endDate) => + static String m5(storageAmount, endDate) => "您的 ${storageAmount} 插件有效期至 ${endDate}"; - static String m1(count) => + static String m6(count) => "${Intl.plural(count, zero: '添加查看者', one: '添加查看者', other: '添加查看者')}"; - static String m4(emailOrName) => "由 ${emailOrName} 添加"; + static String m7(emailOrName) => "由 ${emailOrName} 添加"; - static String m5(albumName) => "成功添加到 ${albumName}"; + static String m8(albumName) => "成功添加到 ${albumName}"; - static String m6(count) => + static String m9(count) => "${Intl.plural(count, zero: '无参与者', one: '1个参与者', other: '${count} 个参与者')}"; - static String m7(versionValue) => "版本: ${versionValue}"; + static String m10(versionValue) => "版本: ${versionValue}"; - static String m8(freeAmount, storageUnit) => + static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} 空闲"; - static String m9(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}"; + static String m12(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}"; - static String m10(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片"; + static String m13(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片"; - static String m11(isFamilyMember, storageAmountInGb) => + static String m14(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': '到目前为止,您的家庭已经领取了 ${storageAmountInGb} GB', 'false': '到目前为止,您已经领取了 ${storageAmountInGb} GB', 'other': '到目前为止,您已经领取了${storageAmountInGb} GB', })}"; - static String m12(albumName) => "为 ${albumName} 创建了协作链接"; + static String m15(albumName) => "为 ${albumName} 创建了协作链接"; - static String m13(familyAdminEmail) => + static String m16(familyAdminEmail) => "请联系 ${familyAdminEmail} 来管理您的订阅"; - static String m14(provider) => + static String m17(provider) => "请通过support@ente.io 用英语联系我们来管理您的 ${provider} 订阅。"; - static String m15(endpoint) => "已连接至 ${endpoint}"; + static String m18(endpoint) => "已连接至 ${endpoint}"; - static String m16(count) => + static String m19(count) => "${Intl.plural(count, one: '删除 ${count} 个项目', other: '删除 ${count} 个项目')}"; - static String m17(currentlyDeleting, totalCount) => + static String m20(currentlyDeleting, totalCount) => "正在删除 ${currentlyDeleting} /共 ${totalCount}"; - static String m18(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; + static String m21(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; - static String m19(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; + static String m22(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; - static String m20(count, storageSaved) => + static String m23(count, storageSaved) => "您已经清理了 ${Intl.plural(count, other: '${count} 个重复文件')}, 释放了 (${storageSaved}!)"; - static String m21(count, formattedSize) => + static String m24(count, formattedSize) => "${count} 个文件,每个文件 ${formattedSize}"; - static String m22(newEmail) => "电子邮件已更改为 ${newEmail}"; + static String m25(newEmail) => "电子邮件已更改为 ${newEmail}"; - static String m23(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; + static String m26(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; - static String m24(count, formattedNumber) => + static String m27(count, formattedNumber) => "此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; - static String m25(count, formattedNumber) => + static String m28(count, formattedNumber) => "此相册中的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; - static String m26(storageAmountInGB) => + static String m29(storageAmountInGB) => "每当有人使用您的代码注册付费计划时您将获得${storageAmountInGB} GB"; - static String m27(endDate) => "免费试用有效期至 ${endDate}"; + static String m30(endDate) => "免费试用有效期至 ${endDate}"; - static String m28(count) => + static String m31(count) => "只要您有有效的订阅,您仍然可以在 Ente 上访问 ${Intl.plural(count, one: '它', other: '它们')}"; - static String m29(sizeInMBorGB) => "释放 ${sizeInMBorGB}"; + static String m32(sizeInMBorGB) => "释放 ${sizeInMBorGB}"; - static String m30(count, formattedSize) => + static String m33(count, formattedSize) => "${Intl.plural(count, one: '它可以从设备中删除以释放 ${formattedSize}', other: '它们可以从设备中删除以释放 ${formattedSize}')}"; - static String m31(currentlyProcessing, totalCount) => + static String m34(currentlyProcessing, totalCount) => "正在处理 ${currentlyProcessing} / ${totalCount}"; - static String m32(count) => + static String m35(count) => "${Intl.plural(count, one: '${count} 个项目', other: '${count} 个项目')}"; - static String m33(expiryTime) => "链接将在 ${expiryTime} 过期"; + static String m36(expiryTime) => "链接将在 ${expiryTime} 过期"; - static String m34(count, formattedCount) => + static String m0(count, formattedCount) => "${Intl.plural(count, zero: '没有回忆', one: '${formattedCount} 个回忆', other: '${formattedCount} 个回忆')}"; - static String m35(count) => + static String m37(count) => "${Intl.plural(count, one: '移动一个项目', other: '移动一些项目')}"; - static String m36(albumName) => "成功移动到 ${albumName}"; + static String m38(albumName) => "成功移动到 ${albumName}"; - static String m37(name) => "不是 ${name}?"; + static String m39(name) => "不是 ${name}?"; - static String m39(passwordStrengthValue) => "密码强度: ${passwordStrengthValue}"; + static String m40(familyAdminEmail) => "请联系${familyAdminEmail} 以更改您的代码。"; - static String m40(providerName) => "如果您被收取费用,请用英语与 ${providerName} 的客服聊天"; + static String m41(passwordStrengthValue) => "密码强度: ${passwordStrengthValue}"; - static String m41(endDate) => "免费试用有效期至 ${endDate}。\n在此之后您可以选择付费计划。"; + static String m42(providerName) => "如果您被收取费用,请用英语与 ${providerName} 的客服聊天"; - static String m42(toEmail) => "请给我们发送电子邮件至 ${toEmail}"; + static String m43(endDate) => "免费试用有效期至 ${endDate}。\n在此之后您可以选择付费计划。"; - static String m43(toEmail) => "请将日志发送至 \n${toEmail}"; + static String m44(toEmail) => "请给我们发送电子邮件至 ${toEmail}"; - static String m44(storeName) => "在 ${storeName} 上给我们评分"; + static String m45(toEmail) => "请将日志发送至 \n${toEmail}"; - static String m45(storageInGB) => "3. 你和朋友都将免费获得 ${storageInGB} GB*"; + static String m46(storeName) => "在 ${storeName} 上给我们评分"; - static String m46(userEmail) => + static String m47(storageInGB) => "3. 你和朋友都将免费获得 ${storageInGB} GB*"; + + static String m48(userEmail) => "${userEmail} 将从这个共享相册中删除\n\nTA们添加的任何照片也将从相册中删除"; - static String m47(endDate) => "在 ${endDate} 前续费"; + static String m49(endDate) => "在 ${endDate} 前续费"; - static String m48(count) => + static String m50(count) => "${Intl.plural(count, other: '已找到 ${count} 个结果')}"; - static String m49(count) => "已选择 ${count} 个"; + static String m1(count) => "已选择 ${count} 个"; - static String m50(count, yourCount) => "选择了 ${count} 个 (您的 ${yourCount} 个)"; + static String m51(count, yourCount) => "选择了 ${count} 个 (您的 ${yourCount} 个)"; - static String m51(verificationID) => "这是我的ente.io 的验证 ID: ${verificationID}。"; + static String m52(verificationID) => "这是我的ente.io 的验证 ID: ${verificationID}。"; - static String m52(verificationID) => + static String m2(verificationID) => "嘿,你能确认这是你的 ente.io 验证 ID吗:${verificationID}"; static String m53(referralCode, referralStorageInGB) => @@ -211,15 +213,15 @@ class MessageLookup extends MessageLookupByLibrary { "addAName": MessageLookupByLibrary.simpleMessage("添加一个名称"), "addANewEmail": MessageLookupByLibrary.simpleMessage("添加新的电子邮件"), "addCollaborator": MessageLookupByLibrary.simpleMessage("添加协作者"), - "addCollaborators": m0, + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("从设备添加"), - "addItem": m2, + "addItem": m4, "addLocation": MessageLookupByLibrary.simpleMessage("添加地点"), "addLocationButton": MessageLookupByLibrary.simpleMessage("添加"), "addMore": MessageLookupByLibrary.simpleMessage("添加更多"), "addNew": MessageLookupByLibrary.simpleMessage("新建"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("附加组件详情"), - "addOnValidTill": m3, + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("附加组件"), "addPhotos": MessageLookupByLibrary.simpleMessage("添加照片"), "addSelected": MessageLookupByLibrary.simpleMessage("添加所选项"), @@ -227,11 +229,11 @@ class MessageLookup extends MessageLookupByLibrary { "addToEnte": MessageLookupByLibrary.simpleMessage("添加到 Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("添加到隐藏相册"), "addViewer": MessageLookupByLibrary.simpleMessage("添加查看者"), - "addViewers": m1, + "addViewers": m6, "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("立即添加您的照片"), "addedAs": MessageLookupByLibrary.simpleMessage("已添加为"), - "addedBy": m4, - "addedSuccessfullyTo": m5, + "addedBy": m7, + "addedSuccessfullyTo": m8, "addingToFavorites": MessageLookupByLibrary.simpleMessage("正在添加到收藏..."), "advanced": MessageLookupByLibrary.simpleMessage("高级设置"), "advancedSettings": MessageLookupByLibrary.simpleMessage("高级设置"), @@ -241,7 +243,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("1 周后"), "after1Year": MessageLookupByLibrary.simpleMessage("1 年后"), "albumOwner": MessageLookupByLibrary.simpleMessage("所有者"), - "albumParticipantsCount": m6, + "albumParticipantsCount": m9, "albumTitle": MessageLookupByLibrary.simpleMessage("相册标题"), "albumUpdated": MessageLookupByLibrary.simpleMessage("相册已更新"), "albums": MessageLookupByLibrary.simpleMessage("相册"), @@ -272,8 +274,8 @@ class MessageLookup extends MessageLookupByLibrary { "androidSignInTitle": MessageLookupByLibrary.simpleMessage("需要身份验证"), "appLock": MessageLookupByLibrary.simpleMessage("应用锁"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( - "Choose between your device\'s default lock screen and a custom lock screen with a PIN or password."), - "appVersion": m7, + "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。"), + "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("应用"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("应用代码"), @@ -313,8 +315,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份认证"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage("请进行身份验证以启动账户删除"), - "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Please authenticate to view your passkey"), + "authToViewPasskey": + MessageLookupByLibrary.simpleMessage("请验证身份以查看您的通行密钥"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage("请验证以查看您的活动会话"), "authToViewYourHiddenFiles": @@ -341,7 +343,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage("自动配对仅适用于支持 Chromecast 的设备。"), "available": MessageLookupByLibrary.simpleMessage("可用"), - "availableStorageSpace": m8, + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("已备份的文件夹"), "backup": MessageLookupByLibrary.simpleMessage("备份"), "backupFailed": MessageLookupByLibrary.simpleMessage("备份失败"), @@ -360,9 +362,9 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage("只能删除您拥有的文件"), "cancel": MessageLookupByLibrary.simpleMessage("取消"), - "cancelOtherSubscription": m9, + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("取消订阅"), - "cannotAddMorePhotosAfterBecomingViewer": m10, + "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage("无法删除共享文件"), "castIPMismatchBody": @@ -371,33 +373,36 @@ class MessageLookup extends MessageLookupByLibrary { "castInstruction": MessageLookupByLibrary.simpleMessage( "在您要配对的设备上访问 cast.ente.io。\n在下框中输入代码即可在电视上播放相册。"), "centerPoint": MessageLookupByLibrary.simpleMessage("中心点"), + "change": MessageLookupByLibrary.simpleMessage("更改"), "changeEmail": MessageLookupByLibrary.simpleMessage("修改邮箱"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage("确定要更改所选项目的位置吗?"), "changePassword": MessageLookupByLibrary.simpleMessage("修改密码"), "changePasswordTitle": MessageLookupByLibrary.simpleMessage("修改密码"), "changePermissions": MessageLookupByLibrary.simpleMessage("要修改权限吗?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("更改您的推荐代码"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("检查更新"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证"), "checkStatus": MessageLookupByLibrary.simpleMessage("检查状态"), "checking": MessageLookupByLibrary.simpleMessage("正在检查..."), "cl_guest_view_call_to_action": - MessageLookupByLibrary.simpleMessage("选择照片并查看\"访客视图\"。"), + MessageLookupByLibrary.simpleMessage("选择照片并使用“访客视图”。"), "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "要把手机递给朋友看照片?别担心他们滑动太远。访客视图将锁定您选择的照片。"), + "把手机交给朋友看照片?不用担心 Ta 们滑动屏幕乱看照片。访客视图会将 Ta 们锁定在您选择的照片中。"), "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("访客视图"), "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "我们新增了支持 360 度全景照片查看功能。结合动作导航,体验更加身临其境!"), + "我们添加了对 360 度全景照片的支持。通过基于动作的导航,用户可获得身临其境的体验!"), "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("全景查看器"), + MessageLookupByLibrary.simpleMessage("全景图查看器"), "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "推出全新的视频播放器,具有更好的播放控制功能并支持 HDR 视频。"), + "推出全新的视频播放器,提供更好的播放控制并添加了对 HDR 视频的支持。"), "cl_video_player_title": MessageLookupByLibrary.simpleMessage("视频播放器"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("领取免费存储"), "claimMore": MessageLookupByLibrary.simpleMessage("领取更多!"), "claimed": MessageLookupByLibrary.simpleMessage("已领取"), - "claimedStorageSoFar": m11, + "claimedStorageSoFar": m14, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("清除未分类的"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage("从“未分类”中删除其他相册中存在的所有文件"), @@ -411,13 +416,15 @@ class MessageLookup extends MessageLookupByLibrary { "clubByFileName": MessageLookupByLibrary.simpleMessage("按文件名排序"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("聚类进展"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("代码已应用"), + "codeChangeLimitReached": + MessageLookupByLibrary.simpleMessage("抱歉,您已达到代码更改的限制。"), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage("代码已复制到剪贴板"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("您所使用的代码"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( "创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。"), "collaborativeLink": MessageLookupByLibrary.simpleMessage("协作链接"), - "collaborativeLinkCreatedFor": m12, + "collaborativeLinkCreatedFor": m15, "collaborator": MessageLookupByLibrary.simpleMessage("协作者"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage("协作者可以将照片和视频添加到共享相册中。"), @@ -439,9 +446,9 @@ class MessageLookup extends MessageLookupByLibrary { "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("确认您的恢复密钥"), "connectToDevice": MessageLookupByLibrary.simpleMessage("连接到设备"), - "contactFamilyAdmin": m13, + "contactFamilyAdmin": m16, "contactSupport": MessageLookupByLibrary.simpleMessage("联系支持"), - "contactToManageSubscription": m14, + "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("联系人"), "contents": MessageLookupByLibrary.simpleMessage("内容"), "continueLabel": MessageLookupByLibrary.simpleMessage("继续"), @@ -474,7 +481,7 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("裁剪"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("当前用量 "), "custom": MessageLookupByLibrary.simpleMessage("自定义"), - "customEndpoint": m15, + "customEndpoint": m18, "darkTheme": MessageLookupByLibrary.simpleMessage("深色"), "dayToday": MessageLookupByLibrary.simpleMessage("今天"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨天"), @@ -503,10 +510,10 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromBoth": MessageLookupByLibrary.simpleMessage("同时从两者中删除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("从设备中删除"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从 Ente 中删除"), - "deleteItemCount": m16, + "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("删除位置"), "deletePhotos": MessageLookupByLibrary.simpleMessage("删除照片"), - "deleteProgress": m17, + "deleteProgress": m20, "deleteReason1": MessageLookupByLibrary.simpleMessage("找不到我想要的功能"), "deleteReason2": MessageLookupByLibrary.simpleMessage("应用或某个功能没有按我的预期运行"), @@ -538,7 +545,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("查看者仍然可以使用外部工具截图或保存您的照片副本"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("请注意"), - "disableLinkMessage": m18, + "disableLinkMessage": m21, "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双重认证"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage("正在禁用双重认证..."), @@ -555,9 +562,9 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("下载"), "downloadFailed": MessageLookupByLibrary.simpleMessage("下載失敗"), "downloading": MessageLookupByLibrary.simpleMessage("正在下载..."), - "dropSupportEmail": m19, - "duplicateFileCountWithStorageSaved": m20, - "duplicateItemsGroup": m21, + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, "edit": MessageLookupByLibrary.simpleMessage("编辑"), "editLocation": MessageLookupByLibrary.simpleMessage("编辑位置"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("编辑位置"), @@ -566,16 +573,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("对位置的编辑只能在 Ente 内看到"), "eligible": MessageLookupByLibrary.simpleMessage("符合资格"), "email": MessageLookupByLibrary.simpleMessage("电子邮件地址"), - "emailChangedTo": m22, - "emailNoEnteAccount": m23, + "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("电子邮件验证"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("通过电子邮件发送您的日志"), "empty": MessageLookupByLibrary.simpleMessage("清空"), "emptyTrash": MessageLookupByLibrary.simpleMessage("要清空回收站吗?"), + "enable": MessageLookupByLibrary.simpleMessage("启用"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente 支持设备上的机器学习,实现人脸识别、魔法搜索和其他高级搜索功能"), "enableMaps": MessageLookupByLibrary.simpleMessage("启用地图"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "这将在世界地图上显示您的照片。\n\n该地图由 Open Street Map 托管,并且您的照片的确切位置永远不会共享。\n\n您可以随时从“设置”中禁用此功能。"), + "enabled": MessageLookupByLibrary.simpleMessage("已启用"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("正在加密备份..."), "encryption": MessageLookupByLibrary.simpleMessage("加密"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("加密密钥"), @@ -649,8 +660,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileSavedToGallery": MessageLookupByLibrary.simpleMessage("文件已保存到相册"), "fileTypes": MessageLookupByLibrary.simpleMessage("文件类型"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("文件类型和名称"), - "filesBackedUpFromDevice": m24, - "filesBackedUpInAlbum": m25, + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("文件已删除"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("多个文件已保存到相册"), @@ -660,23 +671,23 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("忘记密码"), "foundFaces": MessageLookupByLibrary.simpleMessage("已找到的人脸"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("已领取的免费存储"), - "freeStorageOnReferralSuccess": m26, + "freeStorageOnReferralSuccess": m29, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("可用的免费存储"), "freeTrial": MessageLookupByLibrary.simpleMessage("免费试用"), - "freeTrialValidTill": m27, - "freeUpAccessPostDelete": m28, - "freeUpAmount": m29, + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("释放设备空间"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage("通过清除已备份的文件来节省设备空间。"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("释放空间"), - "freeUpSpaceSaving": m30, + "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage("在图库中显示最多1000个回忆"), "general": MessageLookupByLibrary.simpleMessage("通用"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage("正在生成加密密钥..."), - "genericProgress": m31, + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("前往设置"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": @@ -742,7 +753,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。"), - "itemCount": m32, + "itemCount": m35, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage("项目显示永久删除前剩余的天数"), "itemsWillBeRemovedFromAlbum": @@ -766,7 +777,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("设备限制"), "linkEnabled": MessageLookupByLibrary.simpleMessage("已启用"), "linkExpired": MessageLookupByLibrary.simpleMessage("已过期"), - "linkExpiresOn": m33, + "linkExpiresOn": m36, "linkExpiry": MessageLookupByLibrary.simpleMessage("链接过期"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("链接已过期"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("永不"), @@ -817,6 +828,8 @@ class MessageLookup extends MessageLookupByLibrary { "lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"), "machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"), "magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "魔法搜索允许按内容搜索照片,例如“lower\'”、“red car”、“identity documents”"), "manage": MessageLookupByLibrary.simpleMessage("管理"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage("管理设备存储"), "manageFamily": MessageLookupByLibrary.simpleMessage("管理家庭计划"), @@ -829,10 +842,18 @@ class MessageLookup extends MessageLookupByLibrary { "maps": MessageLookupByLibrary.simpleMessage("地图"), "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), - "memoryCount": m34, + "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("商品"), + "mlConsent": MessageLookupByLibrary.simpleMessage("启用机器学习"), + "mlConsentConfirmation": + MessageLookupByLibrary.simpleMessage("我了解了,并希望启用机器学习"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "如果您启用机器学习,Ente 将从文件(包括与您共享的文件)中提取面部几何形状等信息。\n\n这将在您的设备上进行,并且任何生成的生物特征信息都将被端到端加密。"), + "mlConsentPrivacy": + MessageLookupByLibrary.simpleMessage("请点击此处查看我们隐私政策中有关此功能的更多详细信息"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage("要启用机器学习吗?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。"), + "请注意,机器学习会导致带宽和电池使用量增加,直到所有项目都被索引。请考虑使用桌面应用程序来加快索引速度,所有结果都将自动同步。"), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("移动端, 网页端, 桌面端"), "moderateStrength": MessageLookupByLibrary.simpleMessage("中等"), @@ -840,10 +861,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("修改您的查询,或尝试搜索"), "moments": MessageLookupByLibrary.simpleMessage("瞬间"), "monthly": MessageLookupByLibrary.simpleMessage("每月"), - "moveItem": m35, + "moreDetails": MessageLookupByLibrary.simpleMessage("更多详情"), + "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("移动到相册"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("移至隐藏相册"), - "movedSuccessfullyTo": m36, + "movedSuccessfullyTo": m38, "movedToTrash": MessageLookupByLibrary.simpleMessage("已移至回收站"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("正在将文件移动到相册..."), @@ -881,7 +903,7 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("无结果"), "noResultsFound": MessageLookupByLibrary.simpleMessage("未找到任何结果"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("未找到系统锁"), - "notPersonLabel": m37, + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("尚未与您共享任何内容"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage("这里空空如也! 👀"), @@ -890,6 +912,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("在设备上"), "onEnte": MessageLookupByLibrary.simpleMessage( "在 ente 上"), + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("哎呀"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("糟糕,无法保存编辑"), @@ -915,7 +938,7 @@ class MessageLookup extends MessageLookupByLibrary { "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage("密码修改成功"), "passwordLock": MessageLookupByLibrary.simpleMessage("密码锁"), - "passwordStrength": m39, + "passwordStrength": m41, "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "密码强度的计算考虑了密码的长度、使用的字符以及密码是否出现在最常用的 10,000 个密码中"), "passwordWarning": MessageLookupByLibrary.simpleMessage( @@ -924,7 +947,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("支付失败"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "不幸的是,您的付款失败。请联系支持人员,我们将为您提供帮助!"), - "paymentFailedTalkToProvider": m40, + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("待处理项目"), "pendingSync": MessageLookupByLibrary.simpleMessage("正在等待同步"), "people": MessageLookupByLibrary.simpleMessage("人物"), @@ -944,7 +967,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("置顶相册"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN 锁定"), "playOnTv": MessageLookupByLibrary.simpleMessage("在电视上播放相册"), - "playStoreFreeTrialValidTill": m41, + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore 订阅"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -954,12 +977,12 @@ class MessageLookup extends MessageLookupByLibrary { "请用英语联系 support@ente.io ,我们将乐意提供帮助!"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage("如果问题仍然存在,请联系支持"), - "pleaseEmailUsAt": m42, + "pleaseEmailUsAt": m44, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("请授予权限"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("请重新登录"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage("请选择要删除的快速链接"), - "pleaseSendTheLogsTo": m43, + "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("请重试"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage("请验证您输入的代码"), @@ -985,7 +1008,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("提升工单"), "rateTheApp": MessageLookupByLibrary.simpleMessage("为此应用评分"), "rateUs": MessageLookupByLibrary.simpleMessage("给我们评分"), - "rateUsOnStore": m44, + "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("恢复"), "recoverAccount": MessageLookupByLibrary.simpleMessage("恢复账户"), "recoverButton": MessageLookupByLibrary.simpleMessage("恢复"), @@ -1012,7 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("把我们推荐给你的朋友然后获得延长一倍的订阅计划"), "referralStep1": MessageLookupByLibrary.simpleMessage("1. 将此代码提供给您的朋友"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 他们注册一个付费计划"), - "referralStep3": m45, + "referralStep3": m47, "referrals": MessageLookupByLibrary.simpleMessage("推荐"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("推荐已暂停"), @@ -1033,7 +1056,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeFromFavorite": MessageLookupByLibrary.simpleMessage("从收藏中移除"), "removeLink": MessageLookupByLibrary.simpleMessage("移除链接"), "removeParticipant": MessageLookupByLibrary.simpleMessage("移除参与者"), - "removeParticipantBody": m46, + "removeParticipantBody": m48, "removePersonLabel": MessageLookupByLibrary.simpleMessage("移除人物标签"), "removePublicLink": MessageLookupByLibrary.simpleMessage("删除公开链接"), "removePublicLinks": MessageLookupByLibrary.simpleMessage("删除公开链接"), @@ -1046,7 +1069,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameAlbum": MessageLookupByLibrary.simpleMessage("重命名相册"), "renameFile": MessageLookupByLibrary.simpleMessage("重命名文件"), "renewSubscription": MessageLookupByLibrary.simpleMessage("续费订阅"), - "renewsOn": m47, + "renewsOn": m49, "reportABug": MessageLookupByLibrary.simpleMessage("报告错误"), "reportBug": MessageLookupByLibrary.simpleMessage("报告错误"), "resendEmail": MessageLookupByLibrary.simpleMessage("重新发送电子邮件"), @@ -1056,6 +1079,7 @@ class MessageLookup extends MessageLookupByLibrary { "restore": MessageLookupByLibrary.simpleMessage("恢复"), "restoreToAlbum": MessageLookupByLibrary.simpleMessage("恢复到相册"), "restoringFiles": MessageLookupByLibrary.simpleMessage("正在恢复文件..."), + "resumableUploads": MessageLookupByLibrary.simpleMessage("可续传上传"), "retry": MessageLookupByLibrary.simpleMessage("重试"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage("请检查并删除您认为重复的项目。"), @@ -1098,7 +1122,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("在照片的一定半径内拍摄的几组照片"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("邀请他人,您将在此看到他们分享的所有照片"), - "searchResultCount": m48, + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("安全"), "selectALocation": MessageLookupByLibrary.simpleMessage("选择一个位置"), "selectALocationFirst": @@ -1118,8 +1142,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("所选文件夹将被加密并备份"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage("所选项目将从所有相册中删除并移动到回收站。"), - "selectedPhotos": m49, - "selectedPhotosWithYours": m50, + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, "send": MessageLookupByLibrary.simpleMessage("发送"), "sendEmail": MessageLookupByLibrary.simpleMessage("发送电子邮件"), "sendInvite": MessageLookupByLibrary.simpleMessage("发送邀请"), @@ -1141,10 +1165,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("打开相册并点击右上角的分享按钮进行分享"), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("立即分享相册"), "shareLink": MessageLookupByLibrary.simpleMessage("分享链接"), - "shareMyVerificationID": m51, + "shareMyVerificationID": m52, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("仅与您想要的人分享"), - "shareTextConfirmOthersVerificationID": m52, + "shareTextConfirmOthersVerificationID": m2, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage("下载 Ente,让我们轻松共享高质量的原始照片和视频"), "shareTextReferralCode": m53, @@ -1276,7 +1300,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisWillRemovePublicLinksOfAllSelectedQuickLinks": MessageLookupByLibrary.simpleMessage("这将删除所有选定的快速链接的公共链接。"), "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": - MessageLookupByLibrary.simpleMessage("要启用应用锁,请在系统设置中设置设备密码或屏幕锁定。"), + MessageLookupByLibrary.simpleMessage("要启用应用锁,请在系统设置中设置设备密码或屏幕锁。"), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage("隐藏照片或视频"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage("要重置您的密码,请先验证您的电子邮件。"), @@ -1305,6 +1329,8 @@ class MessageLookup extends MessageLookupByLibrary { "unarchive": MessageLookupByLibrary.simpleMessage("取消存档"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("取消存档相册"), "unarchiving": MessageLookupByLibrary.simpleMessage("正在取消存档..."), + "unavailableReferralCode": + MessageLookupByLibrary.simpleMessage("抱歉,此代码不可用。"), "uncategorized": MessageLookupByLibrary.simpleMessage("未分类的"), "unhide": MessageLookupByLibrary.simpleMessage("取消隐藏"), "unhideToAlbum": MessageLookupByLibrary.simpleMessage("取消隐藏到相册"), @@ -1353,7 +1379,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewAllExifData": MessageLookupByLibrary.simpleMessage("查看所有 EXIF 数据"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("大文件"), "viewLargeFilesDesc": - MessageLookupByLibrary.simpleMessage("查看占用存储空间最多的文件"), + MessageLookupByLibrary.simpleMessage("查看占用存储空间最多的文件。"), "viewLogs": MessageLookupByLibrary.simpleMessage("查看日志"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("查看恢复密钥"), "viewer": MessageLookupByLibrary.simpleMessage("查看者"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 479a187c97..e88b25f990 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9502,17 +9502,34 @@ class AppLocalizationDelegate extends LocalizationsDelegate { List get supportedLocales { return const [ Locale.fromSubtags(languageCode: 'en'), + Locale.fromSubtags(languageCode: 'ar'), + Locale.fromSubtags(languageCode: 'bg'), + Locale.fromSubtags(languageCode: 'ca'), Locale.fromSubtags(languageCode: 'cs'), + Locale.fromSubtags(languageCode: 'da'), Locale.fromSubtags(languageCode: 'de'), + Locale.fromSubtags(languageCode: 'el'), Locale.fromSubtags(languageCode: 'es'), + Locale.fromSubtags(languageCode: 'et'), + Locale.fromSubtags(languageCode: 'fa'), Locale.fromSubtags(languageCode: 'fr'), + Locale.fromSubtags(languageCode: 'gu'), + Locale.fromSubtags(languageCode: 'he'), + Locale.fromSubtags(languageCode: 'hi'), + Locale.fromSubtags(languageCode: 'id'), Locale.fromSubtags(languageCode: 'it'), + Locale.fromSubtags(languageCode: 'ja'), + Locale.fromSubtags(languageCode: 'km'), Locale.fromSubtags(languageCode: 'ko'), Locale.fromSubtags(languageCode: 'nl'), Locale.fromSubtags(languageCode: 'no'), Locale.fromSubtags(languageCode: 'pl'), Locale.fromSubtags(languageCode: 'pt'), Locale.fromSubtags(languageCode: 'ru'), + Locale.fromSubtags(languageCode: 'sv'), + Locale.fromSubtags(languageCode: 'te'), + Locale.fromSubtags(languageCode: 'th'), + Locale.fromSubtags(languageCode: 'ti'), Locale.fromSubtags(languageCode: 'tr'), Locale.fromSubtags(languageCode: 'zh'), ]; diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b13a3237f0..1852638d13 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.30+930 +version: 0.9.31+931 publish_to: none environment: From b9dd371676a3d3cd6591f72c78c4234ba528db67 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 18:13:25 +0530 Subject: [PATCH 0726/1179] [mob] bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 1852638d13..b13a3237f0 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.31+931 +version: 0.9.30+930 publish_to: none environment: From 15ba2dd2970d210dc3884d9ad8a6232447bb88d0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 13:50:45 +0530 Subject: [PATCH 0727/1179] Start working on clustering again --- web/apps/photos/src/services/searchService.ts | 3 ++- web/packages/new/photos/services/ml/index.ts | 17 +++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index 02a0062270..bbf10fde0b 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -6,6 +6,7 @@ import { isMLEnabled, isMLSupported, mlStatusSnapshot, + wipClusterEnable, } from "@/new/photos/services/ml"; import { parseDateComponents } from "@/new/photos/services/search"; import type { @@ -341,8 +342,8 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { // let done = false; // eslint-disable-next-line @typescript-eslint/no-unused-vars async function getAllPeople(_limit: number = undefined) { + if (!(await wipClusterEnable())) return []; return []; - // if (!(await wipClusterEnable())) return []; // if (done) return []; // done = true; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 20e8f995cd..7c3cc669f3 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -6,6 +6,7 @@ import { isDesktop } from "@/base/app"; import { assertionFailed } from "@/base/assert"; import { blobCache } from "@/base/blob-cache"; import { ensureElectron } from "@/base/electron"; +import { isDevBuild } from "@/base/env"; import log from "@/base/log"; import type { Electron } from "@/base/types/ipc"; import { ComlinkWorker } from "@/base/worker/comlink-worker"; @@ -14,6 +15,7 @@ import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; +import { isInternalUser } from "../feature-flags"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { UploadItem } from "../upload/types"; import { regenerateFaceCrops } from "./crop"; @@ -318,14 +320,13 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { // // TODO-Cluster temporary import here // let last: SearchPerson[] | undefined; -// /** -// * WIP! Don't enable, dragon eggs are hatching here. -// */ -// export const wipClusterEnable = async () => { -// if (!process.env.NEXT_PUBLIC_ENTE_WIP_CL) return false; -// if (!isDevBuild || !(await isInternalUser())) return false; -// return true; -// }; +/** + * WIP! Don't enable, dragon eggs are hatching here. + */ +export const wipClusterEnable = async () => + process.env.NEXT_PUBLIC_ENTE_WIP_CL && + isDevBuild && + (await isInternalUser()); // export const wipCluster = async () => { // if (!(await wipClusterEnable())) return; From 3f12ff2830122b568dfef00418ded3db202f8597 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 14:01:51 +0530 Subject: [PATCH 0728/1179] Opt --- .../new/photos/components/MLSettings.tsx | 22 ++++++++++++++++++- web/packages/new/photos/services/ml/index.ts | 4 ++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 55fc07c466..f6ed650a1f 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,12 +1,14 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; -import { MenuItemGroup } from "@/base/components/Menu"; +import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; +import { ut } from "@/base/i18n"; import log from "@/base/log"; import { disableML, enableML, mlStatusSnapshot, mlStatusSubscribe, + wipClusterEnable, type MLStatus, } from "@/new/photos/services/ml"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; @@ -295,8 +297,11 @@ const ManageML: React.FC = ({ onDisableML, setDialogBoxAttributesV2, }) => { + const [showClusterOpt, setShowClusterOpt] = useState(false); const { phase, nSyncedFiles, nTotalFiles } = mlStatus; + useEffect(() => void wipClusterEnable().then(setShowClusterOpt), []); + let status: string; switch (phase) { case "scheduled": @@ -372,6 +377,21 @@ const ManageML: React.FC = ({ + {showClusterOpt && ( + + + + + + + )} ); }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 7c3cc669f3..86fb3fdc75 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -323,8 +323,8 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { /** * WIP! Don't enable, dragon eggs are hatching here. */ -export const wipClusterEnable = async () => - process.env.NEXT_PUBLIC_ENTE_WIP_CL && +export const wipClusterEnable = async (): Promise => + !!process.env.NEXT_PUBLIC_ENTE_WIP_CL && isDevBuild && (await isInternalUser()); From 1a9a36cb4cd9b51d2edb288b260b59d8a721c029 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 14:39:48 +0530 Subject: [PATCH 0729/1179] Scaffold --- .../new/photos/components/MLSettings.tsx | 14 ++- web/packages/new/photos/services/ml/index.ts | 106 ++++++++++-------- 2 files changed, 69 insertions(+), 51 deletions(-) diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index f6ed650a1f..0871a2b9f0 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,13 +1,14 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; -import { ut } from "@/base/i18n"; +import { pt, ut } from "@/base/i18n"; import log from "@/base/log"; import { disableML, enableML, mlStatusSnapshot, mlStatusSubscribe, + wipCluster, wipClusterEnable, type MLStatus, } from "@/new/photos/services/ml"; @@ -313,7 +314,10 @@ const ManageML: React.FC = ({ case "indexing": status = t("indexing_status_running"); break; - // TODO: Clustering + case "clustering": + // TODO-Cluster + status = pt("Grouping faces"); + break; default: status = t("indexing_status_done"); break; @@ -334,6 +338,8 @@ const ManageML: React.FC = ({ }); }; + const wipClusterNow = () => void wipCluster(); + return ( @@ -382,12 +388,12 @@ const ManageML: React.FC = ({ diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 86fb3fdc75..6673ba9a16 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -13,7 +13,7 @@ import { ComlinkWorker } from "@/base/worker/comlink-worker"; import { FileType } from "@/media/file-type"; import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; -import { throttled } from "@/utils/promise"; +import { throttled, wait } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; @@ -317,9 +317,6 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { void worker().then((w) => w.onUpload(enteFile, uploadItem)); }; -// // TODO-Cluster temporary import here -// let last: SearchPerson[] | undefined; - /** * WIP! Don't enable, dragon eggs are hatching here. */ @@ -328,54 +325,67 @@ export const wipClusterEnable = async (): Promise => isDevBuild && (await isInternalUser()); -// export const wipCluster = async () => { -// if (!(await wipClusterEnable())) return; +// // TODO-Cluster temporary import here +// let last: SearchPerson[] | undefined; +let _wip_isClustering = false; -// if (last) return last; +export const wipCluster = async () => { + if (!(await wipClusterEnable())) return; -// const { clusters, cgroups } = await clusterFaces(await faceIndexes()); -// const clusterByID = new Map( -// clusters.map((cluster) => [cluster.id, cluster]), -// ); + log.info("clustering"); + _wip_isClustering = true; + triggerStatusUpdate(); -// const localFiles = await getAllLocalFiles(); -// const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); + await wait(2000); -// const result: SearchPerson[] = []; -// for (const cgroup of cgroups) { -// let avatarFaceID = cgroup.avatarFaceID; -// // TODO-Cluster -// // Temp -// if (!avatarFaceID) { -// // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -// avatarFaceID = cgroup.clusterIDs -// .map((id) => clusterByID.get(id)) -// .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; -// } -// cgroup.clusterIDs; -// const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); -// const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); -// if (!avatarFaceFileID || !avatarFaceFile) { -// assertionFailed(`Face ID ${avatarFaceID} without local file`); -// continue; -// } -// const files = cgroup.clusterIDs -// .map((id) => clusterByID.get(id)) -// .flatMap((cluster) => cluster?.faceIDs ?? []) -// .map((faceID) => fileIDFromFaceID(faceID)) -// .filter((fileID) => fileID !== undefined); -// result.push({ -// id: cgroup.id, -// name: cgroup.name, -// files, -// displayFaceID: avatarFaceID, -// displayFaceFile: avatarFaceFile, -// }); -// } + // if (last) return last; -// last = result; -// return result; -// }; + // const { clusters, cgroups } = await clusterFaces(await faceIndexes()); + // const clusterByID = new Map( + // clusters.map((cluster) => [cluster.id, cluster]), + // ); + + // const localFiles = await getAllLocalFiles(); + // const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); + + // const result: SearchPerson[] = []; + // for (const cgroup of cgroups) { + // let avatarFaceID = cgroup.avatarFaceID; + // // TODO-Cluster + // // Temp + // if (!avatarFaceID) { + // // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + // avatarFaceID = cgroup.clusterIDs + // .map((id) => clusterByID.get(id)) + // .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; + // } + // cgroup.clusterIDs; + // const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); + // const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); + // if (!avatarFaceFileID || !avatarFaceFile) { + // assertionFailed(`Face ID ${avatarFaceID} without local file`); + // continue; + // } + // const files = cgroup.clusterIDs + // .map((id) => clusterByID.get(id)) + // .flatMap((cluster) => cluster?.faceIDs ?? []) + // .map((faceID) => fileIDFromFaceID(faceID)) + // .filter((fileID) => fileID !== undefined); + // result.push({ + // id: cgroup.id, + // name: cgroup.name, + // files, + // displayFaceID: avatarFaceID, + // displayFaceFile: avatarFaceFile, + // }); + // } + + _wip_isClustering = false; + triggerStatusUpdate(); + + // last = result; + // return result; +}; export type MLStatus = | { phase: "disabled" /* The ML remote flag is off */ } @@ -476,6 +486,8 @@ const getMLStatus = async (): Promise => { const state = await (await worker()).state; if (state == "indexing" || state == "fetching") { phase = state; + } else if (_wip_isClustering) { + phase = "clustering"; } else if (state == "init" || indexableCount > 0) { phase = "scheduled"; } else { From 52bfe0310acf3677e7abb8096db9110374d6d636 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 18:28:52 +0530 Subject: [PATCH 0730/1179] Algo --- web/apps/photos/src/services/searchService.ts | 10 +- .../new/photos/components/MLSettings.tsx | 2 +- web/packages/new/photos/services/ml/index.ts | 100 ++++++++++-------- 3 files changed, 61 insertions(+), 51 deletions(-) diff --git a/web/apps/photos/src/services/searchService.ts b/web/apps/photos/src/services/searchService.ts index bbf10fde0b..76b1d5cb2b 100644 --- a/web/apps/photos/src/services/searchService.ts +++ b/web/apps/photos/src/services/searchService.ts @@ -6,7 +6,7 @@ import { isMLEnabled, isMLSupported, mlStatusSnapshot, - wipClusterEnable, + wipSearchPersons, } from "@/new/photos/services/ml"; import { parseDateComponents } from "@/new/photos/services/search"; import type { @@ -339,11 +339,9 @@ function convertSuggestionToSearchQuery(option: Suggestion): Search { } } -// let done = false; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -async function getAllPeople(_limit: number = undefined) { - if (!(await wipClusterEnable())) return []; - return []; +async function getAllPeople(limit: number = undefined) { + return (await wipSearchPersons()).slice(0, limit); + // TODO-Clustetr // if (done) return []; // done = true; diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 0871a2b9f0..43dc1231e3 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -393,7 +393,7 @@ const ManageML: React.FC = ({ diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 6673ba9a16..192f544dd9 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -17,11 +17,19 @@ import { throttled, wait } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; +import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; +import { clusterFaces } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; -import { clearMLDB, faceIndex, indexableAndIndexedCounts } from "./db"; +import { + clearMLDB, + faceIndex, + faceIndexes, + indexableAndIndexedCounts, +} from "./db"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; +import { getAllLocalFiles } from "../files"; /** * Internal state of the ML subsystem. @@ -325,9 +333,14 @@ export const wipClusterEnable = async (): Promise => isDevBuild && (await isInternalUser()); -// // TODO-Cluster temporary import here -// let last: SearchPerson[] | undefined; +// // TODO-Cluster temporary state here let _wip_isClustering = false; +let _wip_searchPersons: SearchPerson[] | undefined; + +export const wipSearchPersons = async () => { + if (!(await wipClusterEnable())) return []; + return _wip_searchPersons ?? []; +}; export const wipCluster = async () => { if (!(await wipClusterEnable())) return; @@ -337,54 +350,53 @@ export const wipCluster = async () => { triggerStatusUpdate(); await wait(2000); + _wip_searchPersons = undefined; - // if (last) return last; + const { clusters, cgroups } = await clusterFaces(await faceIndexes()); + const clusterByID = new Map( + clusters.map((cluster) => [cluster.id, cluster]), + ); - // const { clusters, cgroups } = await clusterFaces(await faceIndexes()); - // const clusterByID = new Map( - // clusters.map((cluster) => [cluster.id, cluster]), - // ); + const localFiles = await getAllLocalFiles(); + const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); - // const localFiles = await getAllLocalFiles(); - // const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); + const result: SearchPerson[] = []; + for (const cgroup of cgroups) { + let avatarFaceID = cgroup.avatarFaceID; + // TODO-Cluster + // Temp + if (!avatarFaceID) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + avatarFaceID = cgroup.clusterIDs + .map((id) => clusterByID.get(id)) + .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; + } + cgroup.clusterIDs; + const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); + const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); + if (!avatarFaceFileID || !avatarFaceFile) { + assertionFailed(`Face ID ${avatarFaceID} without local file`); + continue; + } + const files = cgroup.clusterIDs + .map((id) => clusterByID.get(id)) + .flatMap((cluster) => cluster?.faceIDs ?? []) + .map((faceID) => fileIDFromFaceID(faceID)) + .filter((fileID) => fileID !== undefined); + result.push({ + id: cgroup.id, + name: cgroup.name, + files, + displayFaceID: avatarFaceID, + displayFaceFile: avatarFaceFile, + }); + } - // const result: SearchPerson[] = []; - // for (const cgroup of cgroups) { - // let avatarFaceID = cgroup.avatarFaceID; - // // TODO-Cluster - // // Temp - // if (!avatarFaceID) { - // // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - // avatarFaceID = cgroup.clusterIDs - // .map((id) => clusterByID.get(id)) - // .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; - // } - // cgroup.clusterIDs; - // const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); - // const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); - // if (!avatarFaceFileID || !avatarFaceFile) { - // assertionFailed(`Face ID ${avatarFaceID} without local file`); - // continue; - // } - // const files = cgroup.clusterIDs - // .map((id) => clusterByID.get(id)) - // .flatMap((cluster) => cluster?.faceIDs ?? []) - // .map((faceID) => fileIDFromFaceID(faceID)) - // .filter((fileID) => fileID !== undefined); - // result.push({ - // id: cgroup.id, - // name: cgroup.name, - // files, - // displayFaceID: avatarFaceID, - // displayFaceFile: avatarFaceFile, - // }); - // } + const searchPersons = result.sort((a, b) => b.files.length - a.files.length); _wip_isClustering = false; + _wip_searchPersons = searchPersons; triggerStatusUpdate(); - - // last = result; - // return result; }; export type MLStatus = From 1fcc425779d8a1bf83f94f8dddbf45cb41fc8ae8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 18:31:07 +0530 Subject: [PATCH 0731/1179] Integrate --- web/packages/new/photos/services/ml/index.ts | 14 +++++++------- web/packages/new/photos/services/ml/worker.ts | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 192f544dd9..6ad354a25a 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -16,6 +16,7 @@ import { ensure } from "@/utils/ensure"; import { throttled, wait } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; +import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; @@ -29,7 +30,6 @@ import { } from "./db"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; -import { getAllLocalFiles } from "../files"; /** * Internal state of the ML subsystem. @@ -353,12 +353,10 @@ export const wipCluster = async () => { _wip_searchPersons = undefined; const { clusters, cgroups } = await clusterFaces(await faceIndexes()); - const clusterByID = new Map( - clusters.map((cluster) => [cluster.id, cluster]), - ); + const clusterByID = new Map(clusters.map((c) => [c.id, c])); const localFiles = await getAllLocalFiles(); - const localFilesByID = new Map(localFiles.map((f) => [f.id, f])); + const localFileByID = new Map(localFiles.map((f) => [f.id, f])); const result: SearchPerson[] = []; for (const cgroup of cgroups) { @@ -373,7 +371,7 @@ export const wipCluster = async () => { } cgroup.clusterIDs; const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); - const avatarFaceFile = localFilesByID.get(avatarFaceFileID ?? 0); + const avatarFaceFile = localFileByID.get(avatarFaceFileID ?? 0); if (!avatarFaceFileID || !avatarFaceFile) { assertionFailed(`Face ID ${avatarFaceID} without local file`); continue; @@ -392,7 +390,9 @@ export const wipCluster = async () => { }); } - const searchPersons = result.sort((a, b) => b.files.length - a.files.length); + const searchPersons = result.sort( + (a, b) => b.files.length - a.files.length, + ); _wip_isClustering = false; _wip_searchPersons = searchPersons; diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index fdcb1ac595..f21f58d85a 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -246,14 +246,14 @@ export class MLWorker { private async backfillQ() { const userID = ensure(await getKVN("userID")); // Find files that our local DB thinks need syncing. - const filesByID = await syncWithLocalFilesAndGetFilesToIndex( + const fileByID = await syncWithLocalFilesAndGetFilesToIndex( userID, 200, ); - if (!filesByID.size) return []; + if (!fileByID.size) return []; // Fetch their existing ML data (if any). - const mlDataByID = await fetchMLData(filesByID); + const mlDataByID = await fetchMLData(fileByID); // If the number of files for which remote gave us data is more than 50% // of what we asked of it, assume we are "fetching", not "indexing". @@ -263,10 +263,10 @@ export class MLWorker { if (this.state != "indexing" && this.state != "fetching") assertionFailed(`Unexpected state ${this.state}`); this.state = - mlDataByID.size * 2 > filesByID.size ? "fetching" : "indexing"; + mlDataByID.size * 2 > fileByID.size ? "fetching" : "indexing"; // Return files after annotating them with their existing ML data. - return Array.from(filesByID, ([id, file]) => ({ + return Array.from(fileByID, ([id, file]) => ({ enteFile: file, uploadItem: undefined, remoteMLData: mlDataByID.get(id), @@ -364,20 +364,20 @@ const syncWithLocalFilesAndGetFilesToIndex = async ( const isIndexable = (f: EnteFile) => f.ownerID == userID; const localFiles = await getAllLocalFiles(); - const localFilesByID = new Map( + const localFileByID = new Map( localFiles.filter(isIndexable).map((f) => [f.id, f]), ); const localTrashFileIDs = (await getLocalTrashedFiles()).map((f) => f.id); await updateAssumingLocalFiles( - Array.from(localFilesByID.keys()), + Array.from(localFileByID.keys()), localTrashFileIDs, ); const fileIDsToIndex = await indexableFileIDs(count); return new Map( - fileIDsToIndex.map((id) => [id, ensure(localFilesByID.get(id))]), + fileIDsToIndex.map((id) => [id, ensure(localFileByID.get(id))]), ); }; From 92859aa748a1c7601222a3a413bfb687794ab3b6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 18:44:51 +0530 Subject: [PATCH 0732/1179] Doc --- .../new/photos/services/ml/cluster-new.ts | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index ff28b75260..fdd83809de 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -60,15 +60,17 @@ export interface CGroup { /** * A nanoid for this cluster group. * - * This is the ID of the "cgroup" user entity, it is not contained as part - * of the group entity payload itself. + * This is the ID of the "cgroup" user entity (the envelope), and it is not + * contained as part of the group entity payload itself. */ id: string; /** * A name assigned by the user to this cluster group. * - * This should be set to an empty string for an unnamed cluster that was - * hidden. + * The client should handle both empty strings and undefined as indicating a + * cgroup without a name. When the client needs to set this to an "empty" + * value, which happens when hiding an unnamed cluster, it should it to an + * empty string. That is, expect `"" | undefined`, but set `""`. */ name: string | undefined; /** @@ -92,13 +94,20 @@ export interface CGroup { * The ID of the face that should be used as the cover photo for this * cluster group (if the user has set one). * - * {@link avatarFaceID} is the user selected face. {@link displayFaceID} is - * the automatic placeholder. + * This is similar to the [@link displayFaceID}, the difference being: + * + * - {@link avatarFaceID} is the face selected by the user. + * + * - {@link displayFaceID} is the automatic placeholder, and only comes + * into effect if the user has not explicitly selected a face. */ avatarFaceID: string | undefined; /** * Locally determined ID of the "best" face that should be used as the * display face, to represent this cluster group in the UI. + * + * This property is not synced with remote. For more details, see + * {@link avatarFaceID}. */ displayFaceID: string | undefined; } @@ -108,16 +117,16 @@ export interface CGroup { * * [Note: Face clustering algorithm] * - * A (cluster) group consists of clusters, each of which itself is a set of - * faces. + * A cgroup (cluster group) consists of clusters, each of which itself is a set + * of faces. * - * The clusters are generated using locally by clients using the following - * (pseudo-) algorithm: + * cgroup << cluster << face + * + * The clusters are generated locally by clients using the following algorithm: * * 1. clusters = [] initially, or fetched from remote. * - * 2. For each face, find its nearest neighbour in the embedding space from - * amongst the faces that have already been clustered. + * 2. For each face, find its nearest neighbour in the embedding space. * * 3. If no such neighbour is found within our threshold, create a new cluster. * @@ -126,12 +135,13 @@ export interface CGroup { * This user can then tweak the output of the algorithm by performing the * following actions to the list of clusters that they can see: * - * - They can provide a name for a cluster. This upgrades a cluster into a - * "cgroup", which then gets synced via remote to all their devices. + * - They can provide a name for a cluster ("name a person"). This upgrades a + * cluster into a "cgroup", which is an entity that gets synced via remote + * to the user's other clients. * - * - They can attach more clusters to a cgroup. + * - They can attach more clusters to a cgroup ("merge clusters") * - * - They can remove a cluster from a cgroup. + * - They can remove a cluster from a cgroup ("break clusters"). * * After clustering, we also do some routine cleanup. Faces belonging to files * that have been deleted (including those in Trash) should be pruned off. @@ -140,8 +150,8 @@ export interface CGroup { * In particular, the same face ID can be in different clusters. In such cases * we should assign it arbitrarily assign it to the last cluster we find it in. * Such leeway is intentionally provided to allow clients some slack in how they - * implement the sync without making an blocking API request for every user - * interaction. + * implement the sync without needing to make an blocking API request for every + * user interaction. */ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); @@ -278,7 +288,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { /** * A generator function that returns a stream of {faceID, embedding} values, - * flattening all the all the faces present in the given {@link faceIndices}. + * flattening all the the faces present in the given {@link faceIndices}. */ function* enumerateFaces(faceIndices: FaceIndex[]) { for (const fi of faceIndices) { From 8397ed52ce8ae41a7730b1b2eb1a2fdad83ac76a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 19:14:34 +0530 Subject: [PATCH 0733/1179] Tweaks --- .../new/photos/services/ml/cluster-new.ts | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index fdd83809de..a64ce4a43d 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -163,19 +163,17 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // or fetched from remote). const clusters = await faceClusters(); - // For fast reverse lookup - map from cluster ids to the index in the + // For fast reverse lookup - map from cluster ids to their index in the // clusters array. const clusterIndexForClusterID = new Map(clusters.map((c, i) => [c.id, i])); // For fast reverse lookup - map from face ids to the id of the cluster to // which they belong. const clusterIDForFaceID = new Map( - clusters.flatMap((c) => - c.faceIDs.map((faceID) => [faceID, c.id] as const), - ), + clusters.flatMap((c) => c.faceIDs.map((id) => [id, c.id] as const)), ); - // New cluster ID generator function. + // A function to generate new cluster IDs. const newClusterID = () => newNonSecureID("cluster_"); // For each face, @@ -247,40 +245,45 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // Prune too small clusters. const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); + let cgroups = await clusterGroups(); + + // TODO-Cluster - Currently we're not syncing with remote or saving anything + // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) + // cgroup, one per cluster. + cgroups = cgroups.concat( + validClusters.map((c) => ({ + id: c.id, + name: undefined, + clusterIDs: [c.id], + isHidden: false, + avatarFaceID: undefined, + displayFaceID: undefined, + })), + ); + // For each cluster group, use the highest scoring face in any of its // clusters as its display face. - const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); - const cgroups = await clusterGroups(); - for (const cgroup of cgroups) { - cgroup.avatarFaceID = cgroup.clusterIDs + cgroup.displayFaceID = cgroup.clusterIDs .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - .map((clusterIndex) => - clusterIndex ? clusters[clusterIndex] : undefined, - ) - .filter((cluster) => !!cluster) - .flatMap((cluster) => cluster.faceIDs) - .map((id) => faceForFaceID.get(id)) + .flatMap((i) => (i ? clusters[i]?.faceIDs : undefined) ?? []) + .map((faceID) => faceForFaceID.get(faceID)) .filter((face) => !!face) - .reduce((topFace, face) => - topFace.score > face.score ? topFace : face, + .reduce((max, face) => + max.score > face.score ? max : face, ).faceID; } - log.debug(() => [ - "ml/cluster", - { - faces, - validClusters, - clusterIndexForClusterID, - clusterIDForFaceID, - cgroups, - }, - ]); - log.debug( - () => - `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, + log.info("ml/cluster", { + faces, + validClusters, + clusterIndexForClusterID, + clusterIDForFaceID, + cgroups, + }); + log.info( + `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); return { clusters: validClusters, cgroups }; From c4f81f55d1dc6a14697106f4cfecabb82d607e86 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 19:18:30 +0530 Subject: [PATCH 0734/1179] Fix --- web/packages/new/photos/services/ml/cluster-new.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index a64ce4a43d..2185745a2a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -226,19 +226,19 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { id: newClusterID(), faceIDs: [faceID, nn.faceID], }; - clusters.push(cluster); clusterIndexForClusterID.set(cluster.id, clusters.length); clusterIDForFaceID.set(faceID, cluster.id); clusterIDForFaceID.set(nn.faceID, cluster.id); + clusters.push(cluster); } } else { // We didn't find a neighbour within the threshold. Create a new // cluster with only this face. const cluster = { id: newClusterID(), faceIDs: [faceID] }; - clusters.push(cluster); clusterIndexForClusterID.set(cluster.id, clusters.length); clusterIDForFaceID.set(faceID, cluster.id); + clusters.push(cluster); } } From ca9c244182c01d0f66faaffa051c5f0d0f8a6584 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 19:27:31 +0530 Subject: [PATCH 0735/1179] Split --- web/packages/new/photos/services/ml/index.ts | 67 ++++++++++---------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 6ad354a25a..846b48c62f 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -13,14 +13,14 @@ import { ComlinkWorker } from "@/base/worker/comlink-worker"; import { FileType } from "@/media/file-type"; import type { EnteFile } from "@/new/photos/types/file"; import { ensure } from "@/utils/ensure"; -import { throttled, wait } from "@/utils/promise"; +import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; -import { clusterFaces } from "./cluster-new"; +import { clusterFaces, type CGroup, type FaceCluster } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; import { clearMLDB, @@ -347,12 +347,21 @@ export const wipCluster = async () => { log.info("clustering"); _wip_isClustering = true; + _wip_searchPersons = undefined; triggerStatusUpdate(); - await wait(2000); - _wip_searchPersons = undefined; - const { clusters, cgroups } = await clusterFaces(await faceIndexes()); + const searchPersons = await convertToSearchPersons(clusters, cgroups); + + _wip_isClustering = false; + _wip_searchPersons = searchPersons; + triggerStatusUpdate(); +}; + +const convertToSearchPersons = async ( + clusters: FaceCluster[], + cgroups: CGroup[], +) => { const clusterByID = new Map(clusters.map((c) => [c.id, c])); const localFiles = await getAllLocalFiles(); @@ -360,43 +369,38 @@ export const wipCluster = async () => { const result: SearchPerson[] = []; for (const cgroup of cgroups) { - let avatarFaceID = cgroup.avatarFaceID; - // TODO-Cluster - // Temp - if (!avatarFaceID) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - avatarFaceID = cgroup.clusterIDs - .map((id) => clusterByID.get(id)) - .flatMap((cluster) => cluster?.faceIDs ?? [])[0]!; - } - cgroup.clusterIDs; - const avatarFaceFileID = fileIDFromFaceID(avatarFaceID); - const avatarFaceFile = localFileByID.get(avatarFaceFileID ?? 0); - if (!avatarFaceFileID || !avatarFaceFile) { - assertionFailed(`Face ID ${avatarFaceID} without local file`); + const displayFaceID = cgroup.displayFaceID; + if (!displayFaceID) { + // TODO-Cluster + assertionFailed(`cgroup ${cgroup.id} without displayFaceID`); continue; } - const files = cgroup.clusterIDs + + const displayFaceFileID = fileIDFromFaceID(displayFaceID); + if (!displayFaceFileID) continue; + + const displayFaceFile = localFileByID.get(displayFaceFileID); + if (!displayFaceFile) { + assertionFailed(`Face ID ${displayFaceFileID} without local file`); + continue; + } + + const fileIDs = cgroup.clusterIDs .map((id) => clusterByID.get(id)) .flatMap((cluster) => cluster?.faceIDs ?? []) .map((faceID) => fileIDFromFaceID(faceID)) .filter((fileID) => fileID !== undefined); + result.push({ id: cgroup.id, name: cgroup.name, - files, - displayFaceID: avatarFaceID, - displayFaceFile: avatarFaceFile, + files: [...new Set(fileIDs)], + displayFaceID, + displayFaceFile, }); } - const searchPersons = result.sort( - (a, b) => b.files.length - a.files.length, - ); - - _wip_isClustering = false; - _wip_searchPersons = searchPersons; - triggerStatusUpdate(); + return result.sort((a, b) => b.files.length - a.files.length); }; export type MLStatus = @@ -568,8 +572,7 @@ export const unidentifiedFaceIDs = async ( * Extract the fileID of the {@link EnteFile} to which the face belongs from its * faceID. */ -// TODO-Cluster: temporary export to supress linter -export const fileIDFromFaceID = (faceID: string) => { +const fileIDFromFaceID = (faceID: string) => { const fileID = parseInt(faceID.split("_")[0] ?? ""); if (isNaN(fileID)) { assertionFailed(`Ignoring attempt to parse invalid faceID ${faceID}`); From 8aac4bf55fc10b65de8ee1776f4fd9186dcf6148 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 19:50:39 +0530 Subject: [PATCH 0736/1179] Fix --- web/packages/new/photos/services/ml/cluster-new.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 2185745a2a..ecd520c436 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -267,7 +267,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { for (const cgroup of cgroups) { cgroup.displayFaceID = cgroup.clusterIDs .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - .flatMap((i) => (i ? clusters[i]?.faceIDs : undefined) ?? []) + .filter((i) => i !== undefined) /* 0 is a valid index */ + .flatMap((i) => clusters[i]?.faceIDs ?? []) .map((faceID) => faceForFaceID.get(faceID)) .filter((face) => !!face) .reduce((max, face) => @@ -278,8 +279,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { log.info("ml/cluster", { faces, validClusters, - clusterIndexForClusterID, - clusterIDForFaceID, + clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), + clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), cgroups, }); log.info( From b3d94e9bcfdddaa2a253b9e5bd03100f16939fa0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:51:28 +0530 Subject: [PATCH 0737/1179] [server] Minor copy change --- server/ente/admin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/ente/admin.go b/server/ente/admin.go index edff1f6a2a..6221ea8dc1 100644 --- a/server/ente/admin.go +++ b/server/ente/admin.go @@ -101,7 +101,7 @@ func (u SupportUpdateBonus) UpdateLog() string { if u.Testing { return fmt.Sprintf("SupportUpdateBonus: %s, storageInMB: %d, minute: %d", u.Action, u.StorageInMB, u.Minute) } else { - return fmt.Sprintf("BF_UPDATE: %s, storageInGB: %d, year: %d", u.Action, u.StorageInGB, u.Year) + return fmt.Sprintf("%s: %s, storageInGB: %d, year: %d", u.BonusType, u.Action, u.StorageInGB, u.Year) } } From cfe9178301c7f9603f380c0d86c1e2aa41924aa8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 27 Aug 2024 20:00:38 +0530 Subject: [PATCH 0738/1179] Experiment to try and reduce the latency --- .github/workflows/web-lint.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/web-lint.yml b/.github/workflows/web-lint.yml index c64463384c..6655587175 100644 --- a/.github/workflows/web-lint.yml +++ b/.github/workflows/web-lint.yml @@ -2,10 +2,21 @@ name: "Lint (web)" on: # Run on every pull request (open or push to it) that changes web/ + # + # This is for running lints on pull requests from external contributors. pull_request: paths: - "web/**" - ".github/workflows/web-lint.yml" + # Run on every push (to a non-main branch) that changes web/ + # + # This reduces the delay in waiting for the pull_request to kick in for the + # PRs from existing contributors. + push: + branches-ignore: [main] + paths: + - "web/**" + - ".github/workflows/web-lint.yml" jobs: lint: From 0657b1600215422c3795873c55aaf3cf78310c59 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 09:19:31 +0530 Subject: [PATCH 0739/1179] Debugging page --- web/apps/photos/src/pages/cluster-debug.tsx | 254 ++++++++++++++++++ .../new/photos/components/MLSettings.tsx | 17 +- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/index.ts | 33 +++ 4 files changed, 299 insertions(+), 7 deletions(-) create mode 100644 web/apps/photos/src/pages/cluster-debug.tsx diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx new file mode 100644 index 0000000000..d71b300647 --- /dev/null +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -0,0 +1,254 @@ +import { SelectionBar } from "@/base/components/Navbar"; +import { pt } from "@/base/i18n"; +import log from "@/base/log"; +import { wipClusterPageContents } from "@/new/photos/services/ml"; +import { EnteFile } from "@/new/photos/types/file"; +import { + FluidContainer, + VerticallyCentered, +} from "@ente/shared/components/Container"; +import EnteSpinner from "@ente/shared/components/EnteSpinner"; +import { PHOTOS_PAGES as PAGES } from "@ente/shared/constants/pages"; +import { CustomError } from "@ente/shared/error"; +import useMemoSingleThreaded from "@ente/shared/hooks/useMemoSingleThreaded"; +import BackButton from "@mui/icons-material/ArrowBackOutlined"; +import { Box, IconButton, styled } from "@mui/material"; +import Typography from "@mui/material/Typography"; +import { DedupePhotoList } from "components/PhotoList/dedupe"; +import PreviewCard from "components/pages/gallery/PreviewCard"; +import { ALL_SECTION } from "constants/collection"; +import { t } from "i18next"; +import { useRouter } from "next/router"; +import { AppContext } from "pages/_app"; +import { createContext, useContext, useEffect, useState } from "react"; +import AutoSizer from "react-virtualized-auto-sizer"; +import { getLocalCollections } from "services/collectionService"; +import { Duplicate } from "services/deduplicationService"; +import { + DeduplicateContextType, + DefaultDeduplicateContext, +} from "types/deduplicate"; +import { updateFileMsrcProps } from "utils/photoFrame"; + +const DeduplicateContext = createContext( + DefaultDeduplicateContext, +); + +const Info = styled("div")` + padding: 24px; + font-size: 18px; +`; + +// TODO-Cluster Temporary component for debugging +export default function Deduplicate() { + const { startLoading, finishLoading, showNavBar } = useContext(AppContext); + const [duplicates, setDuplicates] = useState(null); + const [collectionNameMap, setCollectionNameMap] = useState( + new Map(), + ); + + useEffect(() => { + showNavBar(true); + }, []); + + useEffect(() => { + syncWithRemote(); + }, []); + + const syncWithRemote = async () => { + startLoading(); + const collections = await getLocalCollections(); + const collectionNameMap = new Map(); + for (const collection of collections) { + collectionNameMap.set(collection.id, collection.name); + } + setCollectionNameMap(collectionNameMap); + const faceAndFiles = await wipClusterPageContents(); + // const files = await getLocalFiles(); + // const duplicateFiles = await getDuplicates(files, collectionNameMap); + const duplicateFiles = faceAndFiles.map(({ face, file }) => ({ + files: [file], + size: face.score, + })); + const currFileSizeMap = new Map(); + let toSelectFileIDs: number[] = []; + let count = 0; + for (const dupe of duplicateFiles) { + // select all except first file + toSelectFileIDs = [ + ...toSelectFileIDs, + ...dupe.files.slice(1).map((f) => f.id), + ]; + count += dupe.files.length - 1; + + for (const file of dupe.files) { + currFileSizeMap.set(file.id, dupe.size); + } + } + setDuplicates(duplicateFiles); + const selectedFiles = { + count: count, + ownCount: count, + collectionID: ALL_SECTION, + }; + for (const fileID of toSelectFileIDs) { + selectedFiles[fileID] = true; + } + + finishLoading(); + }; + + const duplicateFiles = useMemoSingleThreaded(() => { + return (duplicates ?? []).reduce((acc, dupe) => { + return [...acc, ...dupe.files]; + }, []); + }, [duplicates]); + + if (!duplicates) { + return ( + + + + ); + } + + return ( + + {duplicateFiles.length > 0 && ( + {t("DEDUPLICATE_BASED_ON_SIZE")} + )} + {duplicateFiles.length === 0 ? ( + + + {t("NO_DUPLICATES_FOUND")} + + + ) : ( + + )} + + + ); +} + +const Options: React.FC = () => { + const router = useRouter(); + + const close = () => { + router.push(PAGES.GALLERY); + }; + + return ( + + + + + + {pt("Faces")} + + + ); +}; + +interface ClusterDebugPhotoFrameProps { + files: EnteFile[]; + duplicates?: Duplicate[]; + activeCollectionID: number; +} + +const ClusterDebugPhotoFrame: React.FC = ({ + duplicates, + files, + activeCollectionID, +}) => { + const displayFiles = useMemoSingleThreaded(() => { + return files.map((item) => { + const filteredItem = { + ...item, + w: window.innerWidth, + h: window.innerHeight, + title: item.pubMagicMetadata?.data.caption, + }; + return filteredItem; + }); + }, [files]); + + const updateURL = + (index: number) => (id: number, url: string, forceUpdate?: boolean) => { + const file = displayFiles[index]; + // this is to prevent outdated updateURL call from updating the wrong file + if (file.id !== id) { + log.info( + `[${id}]PhotoSwipe: updateURL: file id mismatch: ${file.id} !== ${id}`, + ); + throw Error(CustomError.UPDATE_URL_FILE_ID_MISMATCH); + } + if (file.msrc && !forceUpdate) { + throw Error(CustomError.URL_ALREADY_SET); + } + updateFileMsrcProps(file, url); + }; + + const getThumbnail = ( + item: EnteFile, + index: number, + isScrolling: boolean, + ) => ( + {}} + selectable={false} + onSelect={() => {}} + selected={false} + selectOnClick={false} + onHover={() => {}} + onRangeSelect={() => {}} + isRangeSelectActive={false} + isInsSelectRange={false} + activeCollectionID={activeCollectionID} + showPlaceholder={isScrolling} + /> + ); + + return ( + + + {({ height, width }) => ( + + )} + + + ); +}; + +const Container = styled("div")` + display: block; + flex: 1; + width: 100%; + flex-wrap: wrap; + margin: 0 auto; + overflow: hidden; + .pswp-thumbnail { + display: inline-block; + cursor: pointer; + } +`; diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 43dc1231e3..fb3e6ea008 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,5 +1,5 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; -import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; +import { MenuItemGroup } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; import { pt, ut } from "@/base/i18n"; import log from "@/base/log"; @@ -8,7 +8,6 @@ import { enableML, mlStatusSnapshot, mlStatusSubscribe, - wipCluster, wipClusterEnable, type MLStatus, } from "@/new/photos/services/ml"; @@ -28,6 +27,7 @@ import { type DialogProps, } from "@mui/material"; import { t } from "i18next"; +import { useRouter } from "next/router"; import React, { useEffect, useState, useSyncExternalStore } from "react"; import { Trans } from "react-i18next"; import type { NewAppContextPhotos } from "../types/context"; @@ -338,7 +338,10 @@ const ManageML: React.FC = ({ }); }; - const wipClusterNow = () => void wipCluster(); + // TODO-Cluster + // const wipClusterNow = () => void wipCluster(); + const router = useRouter(); + const wipClusterNow = () => router.push("/cluster-debug"); return ( @@ -387,15 +390,17 @@ const ManageML: React.FC = ({ - + /> */} )} diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index ecd520c436..3c6b4e01e3 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -287,7 +287,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return { clusters: validClusters, cgroups }; + return { faces, clusters: validClusters, cgroups }; }; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 846b48c62f..aeb10c5d35 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -28,6 +28,7 @@ import { faceIndexes, indexableAndIndexedCounts, } from "./db"; +import type { Face } from "./face"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; @@ -342,6 +343,38 @@ export const wipSearchPersons = async () => { return _wip_searchPersons ?? []; }; +export const wipClusterPageContents = async () => { + if (!(await wipClusterEnable())) return []; + + log.info("clustering"); + _wip_isClustering = true; + _wip_searchPersons = undefined; + triggerStatusUpdate(); + + const { faces } = await clusterFaces(await faceIndexes()); + // const searchPersons = await convertToSearchPersons(clusters, cgroups); + + const localFiles = await getAllLocalFiles(); + const localFileByID = new Map(localFiles.map((f) => [f.id, f])); + + const result1: { file: EnteFile; face: Face }[] = []; + for (const face of faces) { + const file = ensure( + localFileByID.get(ensure(fileIDFromFaceID(face.faceID))), + ); + result1.push({ file, face }); + } + + const result = result1.sort((a, b) => b.face.score - a.face.score); + + _wip_isClustering = false; + // _wip_searchPersons = searchPersons; + triggerStatusUpdate(); + + // return { faces, clusters, cgroups }; + return result; +}; + export const wipCluster = async () => { if (!(await wipClusterEnable())) return; From 9908cf5a29b64d93240ae0e96dfbbce776fb8f7e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 10:48:10 +0530 Subject: [PATCH 0740/1179] Debug code --- web/apps/photos/src/pages/gallery/index.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/apps/photos/src/pages/gallery/index.tsx b/web/apps/photos/src/pages/gallery/index.tsx index 9bd21abecd..04b4e611e7 100644 --- a/web/apps/photos/src/pages/gallery/index.tsx +++ b/web/apps/photos/src/pages/gallery/index.tsx @@ -6,6 +6,7 @@ import { getLocalFiles, getLocalTrashedFiles, } from "@/new/photos/services/files"; +import { wipClusterEnable } from "@/new/photos/services/ml"; import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { CenteredFlex } from "@ente/shared/components/Container"; @@ -669,6 +670,17 @@ export default function Gallery() { }; }, [selectAll, clearSelection]); + useEffect(() => { + // TODO-Cluster + if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { + setTimeout(() => { + void wipClusterEnable().then( + (y) => y && router.push("cluster-debug"), + ); + }, 2000); + } + }, []); + const fileToCollectionsMap = useMemoSingleThreaded(() => { return constructFileToCollectionMap(files); }, [files]); From 87750805aecec20efa58d167550055aaa766c8d6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 10:50:25 +0530 Subject: [PATCH 0741/1179] Inline --- web/apps/photos/src/pages/cluster-debug.tsx | 420 +++++++++++--------- 1 file changed, 235 insertions(+), 185 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index d71b300647..4f2e41a9e9 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -1,143 +1,81 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; -import log from "@/base/log"; import { wipClusterPageContents } from "@/new/photos/services/ml"; +import type { Face } from "@/new/photos/services/ml/face"; import { EnteFile } from "@/new/photos/types/file"; import { + FlexWrapper, FluidContainer, VerticallyCentered, } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import { PHOTOS_PAGES as PAGES } from "@ente/shared/constants/pages"; -import { CustomError } from "@ente/shared/error"; -import useMemoSingleThreaded from "@ente/shared/hooks/useMemoSingleThreaded"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; import { Box, IconButton, styled } from "@mui/material"; -import Typography from "@mui/material/Typography"; -import { DedupePhotoList } from "components/PhotoList/dedupe"; import PreviewCard from "components/pages/gallery/PreviewCard"; -import { ALL_SECTION } from "constants/collection"; +import { + DATE_CONTAINER_HEIGHT, + GAP_BTW_TILES, + IMAGE_CONTAINER_MAX_HEIGHT, + IMAGE_CONTAINER_MAX_WIDTH, + MIN_COLUMNS, + SIZE_AND_COUNT_CONTAINER_HEIGHT, +} from "constants/gallery"; import { t } from "i18next"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; -import { createContext, useContext, useEffect, useState } from "react"; +import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; -import { getLocalCollections } from "services/collectionService"; -import { Duplicate } from "services/deduplicationService"; -import { - DeduplicateContextType, - DefaultDeduplicateContext, -} from "types/deduplicate"; -import { updateFileMsrcProps } from "utils/photoFrame"; +import { VariableSizeList as List } from "react-window"; -const DeduplicateContext = createContext( - DefaultDeduplicateContext, -); - -const Info = styled("div")` - padding: 24px; - font-size: 18px; -`; +export interface UICluster { + files: EnteFile[]; + face: Face; +} // TODO-Cluster Temporary component for debugging export default function Deduplicate() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const [duplicates, setDuplicates] = useState(null); - const [collectionNameMap, setCollectionNameMap] = useState( - new Map(), - ); + const [clusters, setClusters] = useState(null); useEffect(() => { showNavBar(true); + cluster(); }, []); - useEffect(() => { - syncWithRemote(); - }, []); - - const syncWithRemote = async () => { + const cluster = async () => { startLoading(); - const collections = await getLocalCollections(); - const collectionNameMap = new Map(); - for (const collection of collections) { - collectionNameMap.set(collection.id, collection.name); - } - setCollectionNameMap(collectionNameMap); const faceAndFiles = await wipClusterPageContents(); - // const files = await getLocalFiles(); - // const duplicateFiles = await getDuplicates(files, collectionNameMap); - const duplicateFiles = faceAndFiles.map(({ face, file }) => ({ - files: [file], - size: face.score, - })); - const currFileSizeMap = new Map(); - let toSelectFileIDs: number[] = []; - let count = 0; - for (const dupe of duplicateFiles) { - // select all except first file - toSelectFileIDs = [ - ...toSelectFileIDs, - ...dupe.files.slice(1).map((f) => f.id), - ]; - count += dupe.files.length - 1; - - for (const file of dupe.files) { - currFileSizeMap.set(file.id, dupe.size); - } - } - setDuplicates(duplicateFiles); - const selectedFiles = { - count: count, - ownCount: count, - collectionID: ALL_SECTION, - }; - for (const fileID of toSelectFileIDs) { - selectedFiles[fileID] = true; - } - + setClusters( + faceAndFiles.map(({ face, file }) => ({ + files: [file], + face, + })), + ); finishLoading(); }; - const duplicateFiles = useMemoSingleThreaded(() => { - return (duplicates ?? []).reduce((acc, dupe) => { - return [...acc, ...dupe.files]; - }, []); - }, [duplicates]); - - if (!duplicates) { - return ( - - - - ); - } - return ( - - {duplicateFiles.length > 0 && ( - {t("DEDUPLICATE_BASED_ON_SIZE")} - )} - {duplicateFiles.length === 0 ? ( - - - {t("NO_DUPLICATES_FOUND")} - - + <> + {clusters ? ( + + + {({ height, width }) => ( + + )} + + ) : ( - + + + )} - + ); } @@ -160,86 +98,6 @@ const Options: React.FC = () => { ); }; -interface ClusterDebugPhotoFrameProps { - files: EnteFile[]; - duplicates?: Duplicate[]; - activeCollectionID: number; -} - -const ClusterDebugPhotoFrame: React.FC = ({ - duplicates, - files, - activeCollectionID, -}) => { - const displayFiles = useMemoSingleThreaded(() => { - return files.map((item) => { - const filteredItem = { - ...item, - w: window.innerWidth, - h: window.innerHeight, - title: item.pubMagicMetadata?.data.caption, - }; - return filteredItem; - }); - }, [files]); - - const updateURL = - (index: number) => (id: number, url: string, forceUpdate?: boolean) => { - const file = displayFiles[index]; - // this is to prevent outdated updateURL call from updating the wrong file - if (file.id !== id) { - log.info( - `[${id}]PhotoSwipe: updateURL: file id mismatch: ${file.id} !== ${id}`, - ); - throw Error(CustomError.UPDATE_URL_FILE_ID_MISMATCH); - } - if (file.msrc && !forceUpdate) { - throw Error(CustomError.URL_ALREADY_SET); - } - updateFileMsrcProps(file, url); - }; - - const getThumbnail = ( - item: EnteFile, - index: number, - isScrolling: boolean, - ) => ( - {}} - selectable={false} - onSelect={() => {}} - selected={false} - selectOnClick={false} - onHover={() => {}} - onRangeSelect={() => {}} - isRangeSelectActive={false} - isInsSelectRange={false} - activeCollectionID={activeCollectionID} - showPlaceholder={isScrolling} - /> - ); - - return ( - - - {({ height, width }) => ( - - )} - - - ); -}; - const Container = styled("div")` display: block; flex: 1; @@ -249,6 +107,198 @@ const Container = styled("div")` overflow: hidden; .pswp-thumbnail { display: inline-block; - cursor: pointer; } `; + +interface ClusterPhotoListProps { + height: number; + width: number; + clusters: UICluster[]; +} + +const ClusterPhotoList: React.FC = ({ + height, + width, + clusters, +}) => { + const [itemList, setItemList] = useState([]); + const listRef = useRef(null); + + const getThumbnail = ( + item: EnteFile, + index: number, + isScrolling: boolean, + ) => ( + {}} + onClick={() => {}} + selectable={false} + onSelect={() => {}} + selected={false} + selectOnClick={false} + onHover={() => {}} + onRangeSelect={() => {}} + isRangeSelectActive={false} + isInsSelectRange={false} + activeCollectionID={0} + showPlaceholder={isScrolling} + /> + ); + + const columns = useMemo(() => { + const fittableColumns = getFractionFittableColumns(width); + let columns = Math.floor(fittableColumns); + if (columns < MIN_COLUMNS) { + columns = MIN_COLUMNS; + } + return columns; + }, [width]); + + const shrinkRatio = getShrinkRatio(width, columns); + const listItemHeight = + IMAGE_CONTAINER_MAX_HEIGHT * shrinkRatio + GAP_BTW_TILES; + + useEffect(() => { + setItemList(itemListFromClusters(clusters, columns)); + }, [columns, clusters]); + + useEffect(() => { + listRef.current?.resetAfterIndex(0); + }, [itemList]); + + const getItemSize = (i: number) => + itemList[i].score !== undefined + ? SIZE_AND_COUNT_CONTAINER_HEIGHT + : listItemHeight; + + const generateKey = (i: number) => + itemList[i].score !== undefined + ? `${itemList[i].score}-${i}` + : `${itemList[i].files[0].id}-${itemList[i].files.slice(-1)[0].id}`; + + const renderListItem = (listItem: ItemListItem, isScrolling: boolean) => + listItem.score !== undefined ? ( + + {listItem.fileCount} {t("FILES")},{" score "} + {listItem.score.toFixed(2)} + + ) : ( + listItem.files.map((item, idx) => + getThumbnail(item, listItem.itemStartIndex + idx, isScrolling), + ) + ); + + return ( + + {({ index, style, isScrolling, data }) => { + const { itemList, columns, shrinkRatio, renderListItem } = data; + return ( + + + {renderListItem(itemList[index], isScrolling)} + + + ); + }} + + ); +}; + +const ListContainer = styled(Box)<{ + columns: number; + shrinkRatio: number; +}>` + display: grid; + grid-template-columns: ${({ columns, shrinkRatio }) => + `repeat(${columns},${IMAGE_CONTAINER_MAX_WIDTH * shrinkRatio}px)`}; + grid-column-gap: ${GAP_BTW_TILES}px; + width: 100%; + color: #fff; + padding: 0 24px; + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { + padding: 0 4px; + } +`; + +const ListItemContainer = styled(FlexWrapper)<{ span: number }>` + grid-column: span ${(props) => props.span}; +`; + +const SizeAndCountContainer = styled(ListItemContainer)` + height: ${DATE_CONTAINER_HEIGHT}px; + color: ${({ theme }) => theme.colors.text.muted}; + margin-top: 1rem; + height: ${SIZE_AND_COUNT_CONTAINER_HEIGHT}px; +`; + +interface ItemListItem { + score?: number; + files?: EnteFile[]; + itemStartIndex?: number; + fileCount?: number; +} + +const ListItem = styled("div")` + display: flex; + justify-content: center; +`; + +function getFractionFittableColumns(width: number): number { + return ( + (width - 2 * getGapFromScreenEdge(width) + GAP_BTW_TILES) / + (IMAGE_CONTAINER_MAX_WIDTH + GAP_BTW_TILES) + ); +} + +function getGapFromScreenEdge(width: number) { + if (width > MIN_COLUMNS * IMAGE_CONTAINER_MAX_WIDTH) { + return 24; + } else { + return 4; + } +} + +function getShrinkRatio(width: number, columns: number) { + return ( + (width - + 2 * getGapFromScreenEdge(width) - + (columns - 1) * GAP_BTW_TILES) / + (columns * IMAGE_CONTAINER_MAX_WIDTH) + ); +} + +const itemListFromClusters = (clusters: UICluster[], columns: number) => { + const result: ItemListItem[] = []; + for (let index = 0; index < clusters.length; index++) { + const dupes = clusters[index]; + result.push({ + score: dupes.face.score, + fileCount: dupes.files.length, + }); + let lastIndex = 0; + while (lastIndex < dupes.files.length) { + result.push({ + files: dupes.files.slice(lastIndex, lastIndex + columns), + itemStartIndex: index, + }); + lastIndex += columns; + } + } + return result; +}; From 8e87ebd50bb49aed922d4838e91c39084811a72d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 12:06:55 +0530 Subject: [PATCH 0742/1179] Inline --- web/apps/photos/src/pages/cluster-debug.tsx | 176 +++++++++----------- 1 file changed, 80 insertions(+), 96 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 4f2e41a9e9..9d45ada7ab 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -1,6 +1,6 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; -import { wipClusterPageContents } from "@/new/photos/services/ml"; +import { faceCrop, wipClusterPageContents } from "@/new/photos/services/ml"; import type { Face } from "@/new/photos/services/ml/face"; import { EnteFile } from "@/new/photos/types/file"; import { @@ -9,24 +9,13 @@ import { VerticallyCentered, } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; -import { PHOTOS_PAGES as PAGES } from "@ente/shared/constants/pages"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; import { Box, IconButton, styled } from "@mui/material"; -import PreviewCard from "components/pages/gallery/PreviewCard"; -import { - DATE_CONTAINER_HEIGHT, - GAP_BTW_TILES, - IMAGE_CONTAINER_MAX_HEIGHT, - IMAGE_CONTAINER_MAX_WIDTH, - MIN_COLUMNS, - SIZE_AND_COUNT_CONTAINER_HEIGHT, -} from "constants/gallery"; -import { t } from "i18next"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; -import { VariableSizeList as List } from "react-window"; +import { VariableSizeList } from "react-window"; export interface UICluster { files: EnteFile[]; @@ -82,9 +71,7 @@ export default function Deduplicate() { const Options: React.FC = () => { const router = useRouter(); - const close = () => { - router.push(PAGES.GALLERY); - }; + const close = () => router.push("/gallery"); return ( @@ -103,7 +90,6 @@ const Container = styled("div")` flex: 1; width: 100%; flex-wrap: wrap; - margin: 0 auto; overflow: hidden; .pswp-thumbnail { display: inline-block; @@ -124,41 +110,13 @@ const ClusterPhotoList: React.FC = ({ const [itemList, setItemList] = useState([]); const listRef = useRef(null); - const getThumbnail = ( - item: EnteFile, - index: number, - isScrolling: boolean, - ) => ( - {}} - onClick={() => {}} - selectable={false} - onSelect={() => {}} - selected={false} - selectOnClick={false} - onHover={() => {}} - onRangeSelect={() => {}} - isRangeSelectActive={false} - isInsSelectRange={false} - activeCollectionID={0} - showPlaceholder={isScrolling} - /> + const columns = useMemo( + () => Math.max(Math.floor(getFractionFittableColumns(width)), 4), + [width], ); - const columns = useMemo(() => { - const fittableColumns = getFractionFittableColumns(width); - let columns = Math.floor(fittableColumns); - if (columns < MIN_COLUMNS) { - columns = MIN_COLUMNS; - } - return columns; - }, [width]); - const shrinkRatio = getShrinkRatio(width, columns); - const listItemHeight = - IMAGE_CONTAINER_MAX_HEIGHT * shrinkRatio + GAP_BTW_TILES; + const listItemHeight = 120 * shrinkRatio + 4; useEffect(() => { setItemList(itemListFromClusters(clusters, columns)); @@ -169,31 +127,17 @@ const ClusterPhotoList: React.FC = ({ }, [itemList]); const getItemSize = (i: number) => - itemList[i].score !== undefined - ? SIZE_AND_COUNT_CONTAINER_HEIGHT - : listItemHeight; + itemList[i].score !== undefined ? 36 : listItemHeight; const generateKey = (i: number) => itemList[i].score !== undefined ? `${itemList[i].score}-${i}` : `${itemList[i].files[0].id}-${itemList[i].files.slice(-1)[0].id}`; - const renderListItem = (listItem: ItemListItem, isScrolling: boolean) => - listItem.score !== undefined ? ( - - {listItem.fileCount} {t("FILES")},{" score "} - {listItem.score.toFixed(2)} - - ) : ( - listItem.files.map((item, idx) => - getThumbnail(item, listItem.itemStartIndex + idx, isScrolling), - ) - ); - return ( - = ({ overscanCount={3} useIsScrolling > - {({ index, style, isScrolling, data }) => { - const { itemList, columns, shrinkRatio, renderListItem } = data; + {({ index, style, data }) => { + const { itemList, columns, shrinkRatio } = data; + const item = itemList[index]; return ( - {renderListItem(itemList[index], isScrolling)} + {item.score !== undefined ? ( + + {`${item.fileCount} files, score ${item.score.toFixed(2)}`} + + ) : ( + item.files.map((enteFile) => ( + + + + )) + )} ); }} - + + ); +}; + +const FaceChip = styled(Box)` + width: 120px; + height: 120px; +`; + +interface FaceCropImageViewProps { + faceID: string; + enteFile: EnteFile; +} + +const FaceCropImageView: React.FC = ({ + faceID, + enteFile, +}) => { + const [objectURL, setObjectURL] = useState(); + + useEffect(() => { + let didCancel = false; + let thisObjectURL: string | undefined; + + void faceCrop(faceID, enteFile).then((blob) => { + if (blob && !didCancel) + setObjectURL((thisObjectURL = URL.createObjectURL(blob))); + }); + + return () => { + didCancel = true; + if (thisObjectURL) URL.revokeObjectURL(thisObjectURL); + }; + }, [faceID, enteFile]); + + return objectURL ? ( + + ) : ( +
); }; @@ -226,29 +225,24 @@ const ListContainer = styled(Box)<{ }>` display: grid; grid-template-columns: ${({ columns, shrinkRatio }) => - `repeat(${columns},${IMAGE_CONTAINER_MAX_WIDTH * shrinkRatio}px)`}; - grid-column-gap: ${GAP_BTW_TILES}px; + `repeat(${columns},${120 * shrinkRatio}px)`}; + grid-column-gap: 4px; width: 100%; - color: #fff; - padding: 0 24px; - @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * MIN_COLUMNS}px) { - padding: 0 4px; - } + padding: 4px; `; const ListItemContainer = styled(FlexWrapper)<{ span: number }>` grid-column: span ${(props) => props.span}; `; -const SizeAndCountContainer = styled(ListItemContainer)` - height: ${DATE_CONTAINER_HEIGHT}px; +const LabelContainer = styled(ListItemContainer)` color: ${({ theme }) => theme.colors.text.muted}; - margin-top: 1rem; - height: ${SIZE_AND_COUNT_CONTAINER_HEIGHT}px; + height: 32px; `; interface ItemListItem { score?: number; + face?: Face; files?: EnteFile[]; itemStartIndex?: number; fileCount?: number; @@ -260,26 +254,15 @@ const ListItem = styled("div")` `; function getFractionFittableColumns(width: number): number { - return ( - (width - 2 * getGapFromScreenEdge(width) + GAP_BTW_TILES) / - (IMAGE_CONTAINER_MAX_WIDTH + GAP_BTW_TILES) - ); + return (width - 2 * getGapFromScreenEdge(width) + 4) / (120 + 4); } -function getGapFromScreenEdge(width: number) { - if (width > MIN_COLUMNS * IMAGE_CONTAINER_MAX_WIDTH) { - return 24; - } else { - return 4; - } -} +const getGapFromScreenEdge = (width: number) => (width > 4 * 120 ? 24 : 4); function getShrinkRatio(width: number, columns: number) { return ( - (width - - 2 * getGapFromScreenEdge(width) - - (columns - 1) * GAP_BTW_TILES) / - (columns * IMAGE_CONTAINER_MAX_WIDTH) + (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / + (columns * 120) ); } @@ -295,6 +278,7 @@ const itemListFromClusters = (clusters: UICluster[], columns: number) => { while (lastIndex < dupes.files.length) { result.push({ files: dupes.files.slice(lastIndex, lastIndex + columns), + face: dupes.face, itemStartIndex: index, }); lastIndex += columns; From 74377a93d8e20e969d9a2531f32f577b5f0ef090 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Tue, 27 Aug 2024 15:31:20 +0200 Subject: [PATCH 0743/1179] Fix #2018 --- auth/assets/custom-icons/icons/runemate.svg | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/auth/assets/custom-icons/icons/runemate.svg b/auth/assets/custom-icons/icons/runemate.svg index 1855afb8d2..43523d438c 100644 --- a/auth/assets/custom-icons/icons/runemate.svg +++ b/auth/assets/custom-icons/icons/runemate.svg @@ -1,8 +1,3 @@ - - - - - - - + + From e605d4c0dfed43b32c53540cb37743ca53d7d0b8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 13:28:45 +0530 Subject: [PATCH 0744/1179] [docs] Add a intro to backup FAQ since this question keeps coming up e.g. https://github.com/ente-io/ente/discussions/3009 --- docs/docs/.vitepress/sidebar.ts | 4 ++ docs/docs/self-hosting/faq/backup.md | 65 ++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 docs/docs/self-hosting/faq/backup.md diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 6aff8e3319..62b3cedf87 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -259,6 +259,10 @@ export const sidebar = [ text: "Shared albums", link: "/self-hosting/faq/sharing", }, + { + text: "Backups", + link: "/self-hosting/faq/backup", + }, ], }, { diff --git a/docs/docs/self-hosting/faq/backup.md b/docs/docs/self-hosting/faq/backup.md new file mode 100644 index 0000000000..3a9dc00d52 --- /dev/null +++ b/docs/docs/self-hosting/faq/backup.md @@ -0,0 +1,65 @@ +--- +title: Backups +description: General introduction to backing up your self hosted Ente instance +--- + +# Backing up your Ente instance + +> [!WARNING] +> +> This is not meant to be a comprehensive and bullet proof guide. There are many +> moving parts, and if small mistakes might make your backups unusable. +> +> Please treat this only as a general introduction. And remember to test your +> restores. + +At the minimum, a functional Ente backend needs three things: + +1. Museum (the API server) +2. Postgres (the database) +3. Object storage (any S3-compatible object storage) + +When thinking about backups, this translates into backing up the relevant state +from each of these: + +1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or + any other custom configuration that you created. In particular, you should + backup the [secrets that are specific to your + instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188) + (`key.encryption`, `key.hash` and `jwt.secret`). + +2. For postgres, the entire data volume needs to be backed up. + +3. For object storage, the entire data volume needs to be backed up. + +A common oversight is taking a lot of care for backing up the object storage, +even going as far as enabling replication and backing up the the multiple object +storage volumes, but not applying the same care to the database backup. + +While the actual encrypted photos are indeed stored in the object storage, +**this encrypted data will not be usable without the database** since the +database contains information like a file specific encryption key. + +Viewed differently, to decrypt your data you need three pieces of information: + +1. The encrypted file data (which comes from the object storage backup). + +2. The ([encrypted](https://ente.io/architecture/)) file and collection specific + encryption keys (which come from the database backup). + +3. The master key (which comes from your password). + +--- + +If you're starting out with self hosting, our recommendation is to start by +keeping a plaintext backup of your photos. +[You can use the CLI or the desktop app to automate this](/photos/faq/export). + +Once you get more comfortable with the various parts, you can try backing up +your instance. As a reference, +[this document outlines how Ente itself treats backups](https://ente.io/reliability). + +If you stop doing plaintext backups and instead rely on your instance backup, +ensure that you do the full restore process also to verify you can get back your +data. As the industry saying goes, a backup without a restore is no backup at +all. From ca3ec5e94cff6847346deaf9a52a03825752a8a0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 13:30:02 +0530 Subject: [PATCH 0745/1179] pretty --- docs/docs/photos/faq/subscription.md | 2 +- docs/docs/self-hosting/faq/backup.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/photos/faq/subscription.md b/docs/docs/photos/faq/subscription.md index 99302437aa..88946920ce 100644 --- a/docs/docs/photos/faq/subscription.md +++ b/docs/docs/photos/faq/subscription.md @@ -154,7 +154,7 @@ downgrade to the 50 GB yearly plan, then - This credited amount will be discounted from your next invoice, which will be due in half a year. - + The same applies to monthly plans. If you prefer to have this credit refunded to your original payment method, diff --git a/docs/docs/self-hosting/faq/backup.md b/docs/docs/self-hosting/faq/backup.md index 3a9dc00d52..08e140604e 100644 --- a/docs/docs/self-hosting/faq/backup.md +++ b/docs/docs/self-hosting/faq/backup.md @@ -24,8 +24,8 @@ from each of these: 1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or any other custom configuration that you created. In particular, you should - backup the [secrets that are specific to your - instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188) + backup the + [secrets that are specific to your instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188) (`key.encryption`, `key.hash` and `jwt.secret`). 2. For postgres, the entire data volume needs to be backed up. From aedf659144ff4a08d72dee6fbeb472a6865c8e9e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 13:31:50 +0530 Subject: [PATCH 0746/1179] Link --- docs/docs/self-hosting/guides/admin.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/self-hosting/guides/admin.md b/docs/docs/self-hosting/guides/admin.md index c138eb4c33..6377fe39c5 100644 --- a/docs/docs/self-hosting/guides/admin.md +++ b/docs/docs/self-hosting/guides/admin.md @@ -78,3 +78,7 @@ internal: You can use [account list](https://github.com/ente-io/ente/blob/main/cli/docs/generated/ente_account_list.md) command to find the user id of any account. + +## Backups + +See this [FAQ](/self-hosting/faq/backup). From 61c1847d75d9a106dd90f567a72a6400ab9003b8 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 10:19:39 +0200 Subject: [PATCH 0747/1179] [mob][photos] Move --- mobile/lib/services/machine_learning/ml_indexing_isolate.dart | 3 +-- mobile/lib/services/machine_learning/ml_service.dart | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index b01037dc83..fec1cbf410 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -189,9 +189,8 @@ class MLIndexingIsolate { /// Analyzes the given image data by running the full pipeline for faces, using [_analyzeImageSync] in the isolate. Future analyzeImage( FileMLInstruction instruction, + String filePath, ) async { - final String filePath = await getImagePathForML(instruction.file); - final Stopwatch stopwatch = Stopwatch()..start(); late MLResult result; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index e3e41c73d2..b048301ad1 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -391,8 +391,11 @@ class MLService { bool actuallyRanML = false; try { + final String filePath = await getImagePathForML(instruction.file); + final MLResult? result = await MLIndexingIsolate.instance.analyzeImage( instruction, + filePath, ); // Check if there's no result simply because MLController paused indexing if (result == null) { From 584ce6d416d90b435aa346eb440de44c640a3296 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 13:57:22 +0530 Subject: [PATCH 0748/1179] [docs] Tweaks to the Google import steps --- .../migration/from-google-photos/index.md | 17 ++++++++++++++--- docs/docs/self-hosting/faq/backup.md | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/docs/photos/migration/from-google-photos/index.md b/docs/docs/photos/migration/from-google-photos/index.md index e334ca5f88..0623f157d2 100644 --- a/docs/docs/photos/migration/from-google-photos/index.md +++ b/docs/docs/photos/migration/from-google-photos/index.md @@ -39,10 +39,21 @@ it with Ente. 8. Wait for Google to send you your data. 9. Open [our desktop app](https://ente.io/download/desktop), click on "Upload", - select "Google takeout" and pick the ZIP file you just downloaded. + select "Google takeout" and pick the ZIP file you just downloaded. If you + were provided with multiple ZIP files, please extract **all** the ZIP files + into one folder and select that folder instead. -> If you were provided with multiple ZIP files, please extract **all** the files -> into one folder and select that folder instead. +> While the app supports uploading multiple ZIPs too, we recommend unzipping +> them all into a single folder and uploading that folder instead so that your +> photo dates are imported properly +> ([details](/photos/faq/photo-dates#importing-from-google-takeout)). +> +>
+> +> Note that you can still preserve your albums even when uploading a single +> folder - select the create new album option and the app will ask you if you +> want to put each leaf folder into a separate album +> ([details](/photos/features/albums#uploading-a-nested-folder)). ![Importing Google Takeout into Ente](google-takeout.png){width=400px} diff --git a/docs/docs/self-hosting/faq/backup.md b/docs/docs/self-hosting/faq/backup.md index 08e140604e..455468bbf5 100644 --- a/docs/docs/self-hosting/faq/backup.md +++ b/docs/docs/self-hosting/faq/backup.md @@ -8,7 +8,7 @@ description: General introduction to backing up your self hosted Ente instance > [!WARNING] > > This is not meant to be a comprehensive and bullet proof guide. There are many -> moving parts, and if small mistakes might make your backups unusable. +> moving parts, and small mistakes might make your backups unusable. > > Please treat this only as a general introduction. And remember to test your > restores. @@ -42,7 +42,7 @@ database contains information like a file specific encryption key. Viewed differently, to decrypt your data you need three pieces of information: -1. The encrypted file data (which comes from the object storage backup). +1. The encrypted file data itself (which comes from the object storage backup). 2. The ([encrypted](https://ente.io/architecture/)) file and collection specific encryption keys (which come from the database backup). From e1ce353069562df4f73f8311e87369e8bb217622 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 11:08:18 +0200 Subject: [PATCH 0749/1179] [mob][photos] Don't process large files on mobile --- mobile/lib/models/ml/ml_versions.dart | 1 + mobile/lib/services/machine_learning/ml_service.dart | 8 ++++++++ mobile/lib/utils/ml_util.dart | 9 ++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mobile/lib/models/ml/ml_versions.dart b/mobile/lib/models/ml/ml_versions.dart index 2d382209dc..35d089178a 100644 --- a/mobile/lib/models/ml/ml_versions.dart +++ b/mobile/lib/models/ml/ml_versions.dart @@ -7,3 +7,4 @@ const minimumClusterSize = 2; const embeddingFetchLimit = 200; final fileDownloadMlLimit = Platform.isIOS ? 5 : 10; +const maxFileDownloadSize = 100000000; diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index b048301ad1..616e2bb2a1 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -488,6 +488,14 @@ class MLService { ); acceptedIssue = true; } + if (errorString.contains('FileSizeTooLargeForMobileIndexing')) { + _logger.severe( + '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + e, + s, + ); + acceptedIssue = true; + } if (acceptedIssue) { await MLDataDB.instance.bulkInsertFaces( [Face.empty(instruction.file.uploadedFileID!, error: true)], diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index e07740acba..01ddd353a9 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -153,7 +153,8 @@ Future> getFilesForMlIndexing() async { } Stream> fetchEmbeddingsAndInstructions( - int yieldSize,) async* { + int yieldSize, +) async* { final List filesToIndex = await getFilesForMlIndexing(); final List> chunks = filesToIndex.chunks(embeddingFetchLimit); @@ -312,6 +313,12 @@ Future getImagePathForML(EnteFile enteFile) async { throw ThumbnailRetrievalException(e.toString(), s); } } else { + // Don't process the file if it's too large (more than 100MB) + if (enteFile.fileSize != null && enteFile.fileSize! > maxFileDownloadSize) { + throw Exception( + "FileSizeTooLargeForMobileIndexing: size is ${enteFile.fileSize}", + ); + } try { file = await getFile(enteFile, isOrigin: true); } catch (e, s) { From 1e9a014ce76f53d11a40535483d86f613cc19d88 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 11:12:22 +0200 Subject: [PATCH 0750/1179] [mob][photos] Minor cleanup --- .../services/machine_learning/ml_service.dart | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 616e2bb2a1..0fee0af261 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -470,33 +470,17 @@ class MLService { _logger.info("Results for file ${result.fileId} stored locally"); return actuallyRanML; } catch (e, s) { - bool acceptedIssue = false; final String errorString = e.toString(); - if (errorString.contains('ThumbnailRetrievalException')) { - _logger.severe( - 'ThumbnailRetrievalException while processing image with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', - e, - s, - ); - acceptedIssue = true; - } - if (errorString.contains('InvalidImageFormatException')) { - _logger.severe( - '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', - e, - s, - ); - acceptedIssue = true; - } - if (errorString.contains('FileSizeTooLargeForMobileIndexing')) { - _logger.severe( - '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', - e, - s, - ); - acceptedIssue = true; - } + final bool acceptedIssue = + errorString.contains('ThumbnailRetrievalException') || + errorString.contains('InvalidImageFormatException') || + errorString.contains('FileSizeTooLargeForMobileIndexing'); if (acceptedIssue) { + _logger.severe( + '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + e, + s, + ); await MLDataDB.instance.bulkInsertFaces( [Face.empty(instruction.file.uploadedFileID!, error: true)], ); From db8e203c367c70d7e0057a7cda6e551ed1105a55 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 11:21:50 +0200 Subject: [PATCH 0751/1179] [mob][photos] Always log basic info on empty result --- mobile/lib/services/machine_learning/ml_service.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index 0fee0af261..19ef46f2be 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -471,13 +471,16 @@ class MLService { return actuallyRanML; } catch (e, s) { final String errorString = e.toString(); + final String format = instruction.file.displayName.split('.').last; + final int? size = instruction.file.fileSize; + final fileType = instruction.file.fileType; final bool acceptedIssue = errorString.contains('ThumbnailRetrievalException') || errorString.contains('InvalidImageFormatException') || errorString.contains('FileSizeTooLargeForMobileIndexing'); if (acceptedIssue) { _logger.severe( - '$errorString with ID ${instruction.file.uploadedFileID}, storing empty results so indexing does not get stuck', + '$errorString with ID ${instruction.file.uploadedFileID} (format $format, type $fileType, size $size), storing empty results so indexing does not get stuck', e, s, ); @@ -490,7 +493,7 @@ class MLService { return true; } _logger.severe( - "Failed to analyze using FaceML for image with ID: ${instruction.file.uploadedFileID} and format ${instruction.file.displayName.split('.').last} (${instruction.file.fileType}). Not storing any results locally, which means it will be automatically retried later.", + "Failed to index file with ID: ${instruction.file.uploadedFileID} (format $format, type $fileType, size $size). Not storing any results locally, which means it will be automatically retried later.", e, s, ); From 760b1f3f857ade5ceacc1830a6cb3377a61e90df Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 15:06:27 +0530 Subject: [PATCH 0752/1179] Neighbours --- web/apps/photos/src/pages/cluster-debug.tsx | 177 ++++++++---------- .../new/photos/services/ml/cluster-new.ts | 36 +++- web/packages/new/photos/services/ml/index.ts | 34 +++- 3 files changed, 136 insertions(+), 111 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 9d45ada7ab..25f9b36031 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -1,8 +1,11 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; -import { faceCrop, wipClusterPageContents } from "@/new/photos/services/ml"; -import type { Face } from "@/new/photos/services/ml/face"; -import { EnteFile } from "@/new/photos/types/file"; +import { + faceCrop, + wipClusterPageContents, + type FaceFileNeighbour, + type FaceFileNeighbours, +} from "@/new/photos/services/ml"; import { FlexWrapper, FluidContainer, @@ -10,22 +13,17 @@ import { } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; -import { Box, IconButton, styled } from "@mui/material"; +import { Box, IconButton, styled, Typography } from "@mui/material"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeList } from "react-window"; -export interface UICluster { - files: EnteFile[]; - face: Face; -} - // TODO-Cluster Temporary component for debugging -export default function Deduplicate() { +export default function ClusterDebug() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const [clusters, setClusters] = useState(null); + const [faceFNs, setFaceFNs] = useState(null); useEffect(() => { showNavBar(true); @@ -34,26 +32,20 @@ export default function Deduplicate() { const cluster = async () => { startLoading(); - const faceAndFiles = await wipClusterPageContents(); - setClusters( - faceAndFiles.map(({ face, file }) => ({ - files: [file], - face, - })), - ); + setFaceFNs(await wipClusterPageContents()); finishLoading(); }; return ( <> - {clusters ? ( + {faceFNs ? ( {({ height, width }) => ( )} @@ -99,13 +91,13 @@ const Container = styled("div")` interface ClusterPhotoListProps { height: number; width: number; - clusters: UICluster[]; + faceFNs: FaceFileNeighbours[]; } const ClusterPhotoList: React.FC = ({ height, width, - clusters, + faceFNs, }) => { const [itemList, setItemList] = useState([]); const listRef = useRef(null); @@ -119,24 +111,23 @@ const ClusterPhotoList: React.FC = ({ const listItemHeight = 120 * shrinkRatio + 4; useEffect(() => { - setItemList(itemListFromClusters(clusters, columns)); - }, [columns, clusters]); + setItemList(itemListFromFaceFNs(faceFNs, columns)); + }, [columns, faceFNs]); useEffect(() => { listRef.current?.resetAfterIndex(0); }, [itemList]); const getItemSize = (i: number) => - itemList[i].score !== undefined ? 36 : listItemHeight; + typeof itemList[i] == "number" ? 36 : listItemHeight; const generateKey = (i: number) => - itemList[i].score !== undefined - ? `${itemList[i].score}-${i}` - : `${itemList[i].files[0].id}-${itemList[i].files.slice(-1)[0].id}`; + typeof itemList[i] == "number" + ? `${itemList[i]}-${i}` + : `${itemList[i][0].enteFile.id}/${itemList[i][0].face.faceID}-${itemList[i].slice(-1)[0].enteFile.id}/${itemList[i].slice(-1)[0].face.faceID}-${i}`; return ( = ({ columns={columns} shrinkRatio={shrinkRatio} > - {item.score !== undefined ? ( + {typeof item == "number" ? ( - {`${item.fileCount} files, score ${item.score.toFixed(2)}`} + {`score ${item.toFixed(2)}`} ) : ( - item.files.map((enteFile) => ( - - - + item.map((ffn, i) => ( + )) )} @@ -178,20 +164,41 @@ const ClusterPhotoList: React.FC = ({ ); }; -const FaceChip = styled(Box)` - width: 120px; - height: 120px; -`; +type ItemListItem = number | FaceFileNeighbour[]; -interface FaceCropImageViewProps { - faceID: string; - enteFile: EnteFile; -} +const itemListFromFaceFNs = ( + faceFNs: FaceFileNeighbours[], + columns: number, +) => { + const result: ItemListItem[] = []; + for (let index = 0; index < faceFNs.length; index++) { + const { face, neighbours } = faceFNs[index]; + result.push(face.score); + let lastIndex = 0; + while (lastIndex < neighbours.length) { + result.push(neighbours.slice(lastIndex, lastIndex + columns)); + lastIndex += columns; + } + } + return result; +}; -const FaceCropImageView: React.FC = ({ - faceID, +const getFractionFittableColumns = (width: number) => + (width - 2 * getGapFromScreenEdge(width) + 4) / (120 + 4); + +const getGapFromScreenEdge = (width: number) => (width > 4 * 120 ? 24 : 4); + +const getShrinkRatio = (width: number, columns: number) => + (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / + (columns * 120); + +const FaceItem: React.FC = ({ + face, enteFile, + cosineSimilarity, }) => { + const { faceID } = face; + const [objectURL, setObjectURL] = useState(); useEffect(() => { @@ -209,17 +216,33 @@ const FaceCropImageView: React.FC = ({ }; }, [faceID, enteFile]); - return objectURL ? ( - - ) : ( -
+ return ( + + {objectURL && ( + + )} + + {cosineSimilarity.toFixed(2)} + + ); }; -const ListContainer = styled(Box)<{ +const FaceChip = styled(Box)` + width: 120px; + height: 120px; +`; + +const ListContainer = styled(Box, { + shouldForwardProp: (propName) => propName != "shrinkRatio", +})<{ columns: number; shrinkRatio: number; }>` @@ -240,49 +263,7 @@ const LabelContainer = styled(ListItemContainer)` height: 32px; `; -interface ItemListItem { - score?: number; - face?: Face; - files?: EnteFile[]; - itemStartIndex?: number; - fileCount?: number; -} - const ListItem = styled("div")` display: flex; justify-content: center; `; - -function getFractionFittableColumns(width: number): number { - return (width - 2 * getGapFromScreenEdge(width) + 4) / (120 + 4); -} - -const getGapFromScreenEdge = (width: number) => (width > 4 * 120 ? 24 : 4); - -function getShrinkRatio(width: number, columns: number) { - return ( - (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / - (columns * 120) - ); -} - -const itemListFromClusters = (clusters: UICluster[], columns: number) => { - const result: ItemListItem[] = []; - for (let index = 0; index < clusters.length; index++) { - const dupes = clusters[index]; - result.push({ - score: dupes.face.score, - fileCount: dupes.files.length, - }); - let lastIndex = 0; - while (lastIndex < dupes.files.length) { - result.push({ - files: dupes.files.slice(lastIndex, lastIndex + columns), - face: dupes.face, - itemStartIndex: index, - }); - lastIndex += columns; - } - } - return result; -}; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 3c6b4e01e3..e67688abc0 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -112,6 +112,17 @@ export interface CGroup { displayFaceID: string | undefined; } +// TODO-Cluster +export interface FaceNeighbours { + face: Face; + neighbours: FaceNeighbour[]; +} + +interface FaceNeighbour { + face: Face; + cosineSimilarity: number; +} + /** * Cluster faces into groups. * @@ -176,6 +187,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // A function to generate new cluster IDs. const newClusterID = () => newNonSecureID("cluster_"); + const faceAndNeigbours: FaceNeighbours[] = []; + // For each face, for (const [i, { faceID, embedding }] of faces.entries()) { // If the face is already part of a cluster, then skip it. @@ -184,11 +197,13 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // Find the nearest neighbour from among all the other faces. let nn: Face | undefined; let nnCosineSimilarity = 0; + let neighbours: FaceNeighbour[] = []; for (let j = 0; j < faces.length; j++) { // ! This is an O(n^2) loop, be careful when adding more code here. - // Skip ourselves. - if (i == j) continue; + // TODO-Cluster + // // Skip ourselves. + // if (i == j) continue; // Can't find a way of avoiding the null assertion here. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -197,12 +212,27 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // The vectors are already normalized, so we can directly use their // dot product as their cosine similarity. const csim = dotProduct(embedding, n.embedding); + + // Skip ourselves. + if (i == j) { + neighbours.push({ face: n, cosineSimilarity: csim }); + continue; + } + if (csim > 0.76 && csim > nnCosineSimilarity) { nn = n; nnCosineSimilarity = csim; } + + neighbours.push({ face: n, cosineSimilarity: csim }); } + neighbours = neighbours.sort( + (a, b) => b.cosineSimilarity - a.cosineSimilarity, + ); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + faceAndNeigbours.push({ face: faces[i]!, neighbours }); + if (nn) { // Found a neighbour near enough. @@ -287,7 +317,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return { faces, clusters: validClusters, cgroups }; + return { faces, clusters: validClusters, cgroups, faceAndNeigbours }; }; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index aeb10c5d35..0d1b2f105e 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -343,6 +343,17 @@ export const wipSearchPersons = async () => { return _wip_searchPersons ?? []; }; +export interface FaceFileNeighbours { + face: Face; + neighbours: FaceFileNeighbour[]; +} + +export interface FaceFileNeighbour { + face: Face; + enteFile: EnteFile; + cosineSimilarity: number; +} + export const wipClusterPageContents = async () => { if (!(await wipClusterEnable())) return []; @@ -351,21 +362,24 @@ export const wipClusterPageContents = async () => { _wip_searchPersons = undefined; triggerStatusUpdate(); - const { faces } = await clusterFaces(await faceIndexes()); + const { faceAndNeigbours } = await clusterFaces(await faceIndexes()); // const searchPersons = await convertToSearchPersons(clusters, cgroups); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); + const fileForFace = ({ faceID }: Face) => + localFileByID.get(ensure(fileIDFromFaceID(faceID))); - const result1: { file: EnteFile; face: Face }[] = []; - for (const face of faces) { - const file = ensure( - localFileByID.get(ensure(fileIDFromFaceID(face.faceID))), - ); - result1.push({ file, face }); - } - - const result = result1.sort((a, b) => b.face.score - a.face.score); + const result = faceAndNeigbours + .map(({ face, neighbours }) => ({ + face, + neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ + face, + enteFile: fileForFace(face), + cosineSimilarity, + })), + })) + .sort((a, b) => b.face.score - a.face.score); _wip_isClustering = false; // _wip_searchPersons = searchPersons; From 77cf819ab4d53edc136540ef1953e2941007ad26 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 16:07:38 +0530 Subject: [PATCH 0753/1179] Indicate cluster --- web/apps/photos/src/pages/cluster-debug.tsx | 54 ++++++++++++++------ web/packages/new/photos/services/ml/index.ts | 28 +++++++--- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 25f9b36031..ad2a16fb96 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -2,7 +2,8 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; import { faceCrop, - wipClusterPageContents, + wipClusterDebugPageContents, + type ClusterDebugPageContents, type FaceFileNeighbour, type FaceFileNeighbours, } from "@/new/photos/services/ml"; @@ -23,7 +24,9 @@ import { VariableSizeList } from "react-window"; // TODO-Cluster Temporary component for debugging export default function ClusterDebug() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const [faceFNs, setFaceFNs] = useState(null); + const [clusterRes, setClusterRes] = useState< + ClusterDebugPageContents | undefined + >(); useEffect(() => { showNavBar(true); @@ -32,20 +35,20 @@ export default function ClusterDebug() { const cluster = async () => { startLoading(); - setFaceFNs(await wipClusterPageContents()); + setClusterRes(await wipClusterDebugPageContents()); finishLoading(); }; return ( <> - {faceFNs ? ( + {clusterRes ? ( {({ height, width }) => ( )} @@ -91,14 +94,15 @@ const Container = styled("div")` interface ClusterPhotoListProps { height: number; width: number; - faceFNs: FaceFileNeighbours[]; + clusterRes: ClusterDebugPageContents; } const ClusterPhotoList: React.FC = ({ height, width, - faceFNs, + clusterRes, }) => { + const { faceFNs, clusterIDForFaceID } = clusterRes; const [itemList, setItemList] = useState([]); const listRef = useRef(null); @@ -108,7 +112,7 @@ const ClusterPhotoList: React.FC = ({ ); const shrinkRatio = getShrinkRatio(width, columns); - const listItemHeight = 120 * shrinkRatio + 4; + const listItemHeight = 120 * shrinkRatio + 24 + 4; useEffect(() => { setItemList(itemListFromFaceFNs(faceFNs, columns)); @@ -152,8 +156,11 @@ const ClusterPhotoList: React.FC = ({ {`score ${item.toFixed(2)}`} ) : ( - item.map((ffn, i) => ( - + item.map((faceFN, i) => ( + )) )} @@ -192,11 +199,13 @@ const getShrinkRatio = (width: number, columns: number) => (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / (columns * 120); -const FaceItem: React.FC = ({ - face, - enteFile, - cosineSimilarity, -}) => { +interface FaceItemProps { + faceFN: FaceFileNeighbour; + clusterIDForFaceID: Map; +} + +const FaceItem: React.FC = ({ faceFN, clusterIDForFaceID }) => { + const { face, enteFile, cosineSimilarity } = faceFN; const { faceID } = face; const [objectURL, setObjectURL] = useState(); @@ -217,7 +226,12 @@ const FaceItem: React.FC = ({ }, [faceID, enteFile]); return ( - + {objectURL && ( = ({ src={objectURL} /> )} - + {cosineSimilarity.toFixed(2)} @@ -240,6 +254,12 @@ const FaceChip = styled(Box)` height: 120px; `; +const outlineForCluster = (clusterID: string | undefined) => + clusterID ? `1px solid oklch(0.7 0.1 ${hForID(clusterID)})` : undefined; + +const hForID = (id: string) => + ([...id].reduce((s, c) => s + c.charCodeAt(0), 0) % 10) * 36; + const ListContainer = styled(Box, { shouldForwardProp: (propName) => propName != "shrinkRatio", })<{ diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 0d1b2f105e..6b0a72be69 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -354,23 +354,33 @@ export interface FaceFileNeighbour { cosineSimilarity: number; } -export const wipClusterPageContents = async () => { - if (!(await wipClusterEnable())) return []; +export interface ClusterDebugPageContents { + faceFNs: FaceFileNeighbours[]; + clusters: FaceCluster[]; + clusterIDForFaceID: Map; +} + +export const wipClusterDebugPageContents = async (): Promise< + ClusterDebugPageContents | undefined +> => { + if (!(await wipClusterEnable())) return undefined; log.info("clustering"); _wip_isClustering = true; _wip_searchPersons = undefined; triggerStatusUpdate(); - const { faceAndNeigbours } = await clusterFaces(await faceIndexes()); + const { faceAndNeigbours, clusters } = await clusterFaces( + await faceIndexes(), + ); // const searchPersons = await convertToSearchPersons(clusters, cgroups); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); const fileForFace = ({ faceID }: Face) => - localFileByID.get(ensure(fileIDFromFaceID(faceID))); + ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))); - const result = faceAndNeigbours + const faceFNs = faceAndNeigbours .map(({ face, neighbours }) => ({ face, neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ @@ -381,12 +391,18 @@ export const wipClusterPageContents = async () => { })) .sort((a, b) => b.face.score - a.face.score); + const clusterIDForFaceID = new Map( + clusters.flatMap((cluster) => + cluster.faceIDs.map((id) => [id, cluster.id]), + ), + ); + _wip_isClustering = false; // _wip_searchPersons = searchPersons; triggerStatusUpdate(); // return { faces, clusters, cgroups }; - return result; + return { faceFNs, clusters, clusterIDForFaceID }; }; export const wipCluster = async () => { From dac0dfb8f97dd072a3ead3b751b057d3d8dab195 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 16:24:41 +0530 Subject: [PATCH 0754/1179] Set cgroups --- web/apps/photos/src/pages/gallery/index.tsx | 13 +++++++++---- web/packages/new/photos/services/ml/index.ts | 14 ++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/web/apps/photos/src/pages/gallery/index.tsx b/web/apps/photos/src/pages/gallery/index.tsx index 04b4e611e7..adce308172 100644 --- a/web/apps/photos/src/pages/gallery/index.tsx +++ b/web/apps/photos/src/pages/gallery/index.tsx @@ -6,7 +6,10 @@ import { getLocalFiles, getLocalTrashedFiles, } from "@/new/photos/services/files"; -import { wipClusterEnable } from "@/new/photos/services/ml"; +import { + wipClusterEnable, + wipHasSwitchedOnceCmpAndSet, +} from "@/new/photos/services/ml"; import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { CenteredFlex } from "@ente/shared/components/Container"; @@ -674,9 +677,11 @@ export default function Gallery() { // TODO-Cluster if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { setTimeout(() => { - void wipClusterEnable().then( - (y) => y && router.push("cluster-debug"), - ); + if (!wipHasSwitchedOnceCmpAndSet()) { + void wipClusterEnable().then( + (y) => y && router.push("cluster-debug"), + ); + } }, 2000); } }, []); diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 6b0a72be69..9b8db7cb9c 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -337,6 +337,13 @@ export const wipClusterEnable = async (): Promise => // // TODO-Cluster temporary state here let _wip_isClustering = false; let _wip_searchPersons: SearchPerson[] | undefined; +let _wip_hasSwitchedOnce = false; + +export const wipHasSwitchedOnceCmpAndSet = () => { + if (_wip_hasSwitchedOnce) return true; + _wip_hasSwitchedOnce = true; + return false; +}; export const wipSearchPersons = async () => { if (!(await wipClusterEnable())) return []; @@ -370,10 +377,10 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = undefined; triggerStatusUpdate(); - const { faceAndNeigbours, clusters } = await clusterFaces( + const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( await faceIndexes(), ); - // const searchPersons = await convertToSearchPersons(clusters, cgroups); + const searchPersons = await convertToSearchPersons(clusters, cgroups); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); @@ -398,10 +405,9 @@ export const wipClusterDebugPageContents = async (): Promise< ); _wip_isClustering = false; - // _wip_searchPersons = searchPersons; + _wip_searchPersons = searchPersons; triggerStatusUpdate(); - // return { faces, clusters, cgroups }; return { faceFNs, clusters, clusterIDForFaceID }; }; From 3cebd975a8711b7f0bd2aff170c736480024d4ba Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Wed, 28 Aug 2024 16:38:56 +0530 Subject: [PATCH 0755/1179] Update string --- mobile/lib/l10n/intl_en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 2bbf04897c..ae78fa60c3 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "We are sorry to see you go. Please share your feedback to help us improve.", "feedback": "Feedback", "kindlyHelpUsWithThisInformation": "Kindly help us with this information", - "confirmDeletePrompt": "Yes, I want to permanently delete this account and all its data.", + "confirmDeletePrompt": "Yes, I want to permanently delete this account and its data across all apps.", "confirmAccountDeletion": "Confirm Account Deletion", "deleteAccountPermanentlyButton": "Delete Account Permanently", "yourAccountHasBeenDeleted": "Your account has been deleted", From ac5d9d99f1c79bd3291db9dbfa8131635200fbae Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 13:46:58 +0200 Subject: [PATCH 0756/1179] [mob][photos] ML user developer options --- mobile/lib/db/ml/db.dart | 16 +++ .../machine_learning_settings_page.dart | 29 ++++- .../ui/settings/ml/ml_user_dev_screen.dart | 103 ++++++++++++++++++ 3 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 mobile/lib/ui/settings/ml/ml_user_dev_screen.dart diff --git a/mobile/lib/db/ml/db.dart b/mobile/lib/db/ml/db.dart index 5f5cb7af35..3103e80442 100644 --- a/mobile/lib/db/ml/db.dart +++ b/mobile/lib/db/ml/db.dart @@ -668,6 +668,22 @@ class MLDataDB { return maps.first['count'] as int; } + Future> getErroredFileIDs() async { + final db = await instance.asyncDB; + final List> maps = await db.getAll( + 'SELECT DISTINCT $fileIDColumn FROM $facesTable WHERE $faceScore < 0', + ); + return maps.map((e) => e[fileIDColumn] as int).toSet(); + } + + Future deleteFaceIndexForFiles(List fileIDs) async { + final db = await instance.asyncDB; + final String sql = ''' + DELETE FROM $facesTable WHERE $fileIDColumn IN (${fileIDs.join(", ")}) + '''; + await db.execute(sql); + } + Future getClusteredOrFacelessFileCount() async { final db = await instance.asyncDB; final List> clustered = await db.getAll( diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index cf83d4a800..8267648ad4 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -26,6 +26,7 @@ import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; import "package:photos/ui/components/toggle_switch_widget.dart"; import "package:photos/ui/settings/ml/enable_ml_consent.dart"; +import "package:photos/ui/settings/ml/ml_user_dev_screen.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:photos/utils/wakelock_util.dart"; @@ -42,6 +43,8 @@ class _MachineLearningSettingsPageState extends State { final EnteWakeLock _wakeLock = EnteWakeLock(); Timer? _timer; + int _titleTapCount = 0; + Timer? _advancedOptionsTimer; @override void initState() { @@ -55,6 +58,9 @@ class _MachineLearningSettingsPageState } }); } + _advancedOptionsTimer = Timer.periodic(const Duration(seconds: 7), (timer) { + _titleTapCount = 0; + }); } @override @@ -63,6 +69,7 @@ class _MachineLearningSettingsPageState _wakeLock.disable(); MachineLearningController.instance.forceOverrideML(turnOn: false); _timer?.cancel(); + _advancedOptionsTimer?.cancel(); } @override @@ -73,8 +80,26 @@ class _MachineLearningSettingsPageState primary: false, slivers: [ TitleBarWidget( - flexibleSpaceTitle: TitleBarTitleWidget( - title: S.of(context).machineLearning, + flexibleSpaceTitle: GestureDetector( + child: TitleBarTitleWidget( + title: S.of(context).machineLearning, + ), + onTap: () { + setState(() { + _titleTapCount++; + if (_titleTapCount >= 7) { + _titleTapCount = 0; + // showShortToast(context, "Advanced options enabled"); + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return const MLUserDeveloperOptions(); + }, + ), + ).ignore(); + } + }); + }, ), actionIcons: [ IconButtonWidget( diff --git a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart new file mode 100644 index 0000000000..8d70cee21b --- /dev/null +++ b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart @@ -0,0 +1,103 @@ +import "package:flutter/material.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/db/ml/clip_db.dart"; +import "package:photos/db/ml/db.dart"; +import "package:photos/events/people_changed_event.dart"; +import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; +import "package:photos/ui/components/title_bar_widget.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/toast_util.dart"; + +class MLUserDeveloperOptions extends StatelessWidget { + const MLUserDeveloperOptions({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + const TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: "ML debug options", + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) => Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: Column( + children: [ + Text( + "Only use if you know what you're doing", + textAlign: TextAlign.left, + style: getEnteTextTheme(context).body.copyWith( + color: getEnteColorScheme(context).textMuted, + ), + ), + const SizedBox(height: 48), + ButtonWidget( + buttonType: ButtonType.neutral, + labelText: "Purge empty indices", + onTap: () async { + await deleteEmptyIndices(context); + }, + ), + const SizedBox(height: 24), + ButtonWidget( + buttonType: ButtonType.neutral, + labelText: "Reset all local ML", + onTap: () async { + await deleteAllLocalML(context); + }, + ), + const SafeArea( + child: SizedBox( + height: 12, + ), + ), + ], + ), + ), + childCount: 1, + ), + ), + ], + ), + ); + } + + Future deleteEmptyIndices(BuildContext context) async { + try { + final Set emptyFileIDs = await MLDataDB.instance.getErroredFileIDs(); + await MLDataDB.instance.deleteFaceIndexForFiles(emptyFileIDs.toList()); + await MLDataDB.instance.deleteEmbeddings(emptyFileIDs.toList()); + showShortToast(context, "Deleted ${emptyFileIDs.length} entries"); + } catch (e) { + // ignore: unawaited_futures + showGenericErrorDialog( + context: context, + error: e, + ); + } + } + + Future deleteAllLocalML(BuildContext context) async { + try { + await MLDataDB.instance.dropClustersAndPersonTable(faces: true); + await SemanticSearchService.instance.clearIndexes(); + Bus.instance.fire(PeopleChangedEvent()); + showShortToast(context, "All local ML cleared"); + } catch (e) { + // ignore: unawaited_futures + showGenericErrorDialog( + context: context, + error: e, + ); + } + } +} From dd6f88a1cd39eafcae32e39d3ce9c73ccf5b952f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 28 Aug 2024 13:49:07 +0200 Subject: [PATCH 0757/1179] [mob][photos] Move --- mobile/lib/ui/settings/advanced_settings_screen.dart | 2 +- .../ui/settings/{ => ml}/machine_learning_settings_page.dart | 0 mobile/lib/ui/viewer/search_tab/people_section.dart | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename mobile/lib/ui/settings/{ => ml}/machine_learning_settings_page.dart (100%) diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index 6792f254bd..b2e5f5a488 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -13,7 +13,7 @@ import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/components/title_bar_title_widget.dart'; import 'package:photos/ui/components/title_bar_widget.dart'; import "package:photos/ui/components/toggle_switch_widget.dart"; -import "package:photos/ui/settings/machine_learning_settings_page.dart"; +import "package:photos/ui/settings/ml/machine_learning_settings_page.dart"; import 'package:photos/ui/tools/debug/app_storage_viewer.dart'; import 'package:photos/ui/viewer/gallery/photo_grid_size_picker_page.dart'; import 'package:photos/utils/navigation_util.dart'; diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/ml/machine_learning_settings_page.dart similarity index 100% rename from mobile/lib/ui/settings/machine_learning_settings_page.dart rename to mobile/lib/ui/settings/ml/machine_learning_settings_page.dart diff --git a/mobile/lib/ui/viewer/search_tab/people_section.dart b/mobile/lib/ui/viewer/search_tab/people_section.dart index 3e1d7599e5..4ebcbbf9d6 100644 --- a/mobile/lib/ui/viewer/search_tab/people_section.dart +++ b/mobile/lib/ui/viewer/search_tab/people_section.dart @@ -13,7 +13,7 @@ import "package:photos/models/search/search_constants.dart"; import "package:photos/models/search/search_result.dart"; import "package:photos/models/search/search_types.dart"; import "package:photos/theme/ente_theme.dart"; -import "package:photos/ui/settings/machine_learning_settings_page.dart"; +import "package:photos/ui/settings/ml/machine_learning_settings_page.dart"; import "package:photos/ui/viewer/file/no_thumbnail_widget.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/ui/viewer/people/add_person_action_sheet.dart"; From 2d50da84c868f999c3f8efdaf2e52aa9dec36719 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 17:29:52 +0530 Subject: [PATCH 0758/1179] Show blur --- web/apps/photos/src/pages/cluster-debug.tsx | 17 +++++++++-------- .../new/photos/services/ml/cluster-new.ts | 3 ++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index ad2a16fb96..9655976a21 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -7,6 +7,7 @@ import { type FaceFileNeighbour, type FaceFileNeighbours, } from "@/new/photos/services/ml"; +import type { Face } from "@/new/photos/services/ml/face"; import { FlexWrapper, FluidContainer, @@ -123,12 +124,12 @@ const ClusterPhotoList: React.FC = ({ }, [itemList]); const getItemSize = (i: number) => - typeof itemList[i] == "number" ? 36 : listItemHeight; + Array.isArray(itemList[i]) ? listItemHeight : 36; const generateKey = (i: number) => - typeof itemList[i] == "number" - ? `${itemList[i]}-${i}` - : `${itemList[i][0].enteFile.id}/${itemList[i][0].face.faceID}-${itemList[i].slice(-1)[0].enteFile.id}/${itemList[i].slice(-1)[0].face.faceID}-${i}`; + Array.isArray(itemList[i]) + ? `${itemList[i][0].enteFile.id}/${itemList[i][0].face.faceID}-${itemList[i].slice(-1)[0].enteFile.id}/${itemList[i].slice(-1)[0].face.faceID}-${i}` + : `${itemList[i].faceID}-${i}`; return ( = ({ columns={columns} shrinkRatio={shrinkRatio} > - {typeof item == "number" ? ( + {!Array.isArray(item) ? ( - {`score ${item.toFixed(2)}`} + {`score ${item.score.toFixed(2)} blur ${item.blur.toFixed(0)}`} ) : ( item.map((faceFN, i) => ( @@ -171,7 +172,7 @@ const ClusterPhotoList: React.FC = ({ ); }; -type ItemListItem = number | FaceFileNeighbour[]; +type ItemListItem = Face | FaceFileNeighbour[]; const itemListFromFaceFNs = ( faceFNs: FaceFileNeighbours[], @@ -180,7 +181,7 @@ const itemListFromFaceFNs = ( const result: ItemListItem[] = []; for (let index = 0; index < faceFNs.length; index++) { const { face, neighbours } = faceFNs[index]; - result.push(face.score); + result.push(face); let lastIndex = 0; while (lastIndex < neighbours.length) { result.push(neighbours.slice(lastIndex, lastIndex + columns)); diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index e67688abc0..4cec15a86e 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -201,7 +201,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { for (let j = 0; j < faces.length; j++) { // ! This is an O(n^2) loop, be careful when adding more code here. - // TODO-Cluster + // TODO-Cluster Commenting this here and moving it downward // // Skip ourselves. // if (i == j) continue; @@ -213,6 +213,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // dot product as their cosine similarity. const csim = dotProduct(embedding, n.embedding); + // TODO-Cluster Delete me and uncomment the check above // Skip ourselves. if (i == j) { neighbours.push({ face: n, cosineSimilarity: csim }); From 72cc188efede85c3af235bd29f36e584acd2e74e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 17:39:09 +0530 Subject: [PATCH 0759/1179] Incorporate blur --- web/apps/photos/src/pages/cluster-debug.tsx | 2 +- web/packages/new/photos/services/ml/cluster-new.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 9655976a21..683ce6bec6 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -256,7 +256,7 @@ const FaceChip = styled(Box)` `; const outlineForCluster = (clusterID: string | undefined) => - clusterID ? `1px solid oklch(0.7 0.1 ${hForID(clusterID)})` : undefined; + clusterID ? `1px solid oklch(0.8 0.2 ${hForID(clusterID)})` : undefined; const hForID = (id: string) => ([...id].reduce((s, c) => s + c.charCodeAt(0), 0) % 10) * 36; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 4cec15a86e..9d5c57b84d 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -190,7 +190,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const faceAndNeigbours: FaceNeighbours[] = []; // For each face, - for (const [i, { faceID, embedding }] of faces.entries()) { + for (const [i, { faceID, blur, embedding }] of faces.entries()) { // If the face is already part of a cluster, then skip it. if (clusterIDForFaceID.get(faceID)) continue; @@ -220,7 +220,8 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { continue; } - if (csim > 0.76 && csim > nnCosineSimilarity) { + const threshold = blur < 100 || n.blur < 100 ? 0.7 : 0.6; + if (csim > threshold && csim > nnCosineSimilarity) { nn = n; nnCosineSimilarity = csim; } From cd5e40a1f504452b5e7c227129d7f62f997eaa06 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 17:41:30 +0530 Subject: [PATCH 0760/1179] Vars --- .../new/photos/services/ml/cluster-new.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 9d5c57b84d..c0f5dd51c2 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -190,9 +190,9 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const faceAndNeigbours: FaceNeighbours[] = []; // For each face, - for (const [i, { faceID, blur, embedding }] of faces.entries()) { + for (const [i, fi] of faces.entries()) { // If the face is already part of a cluster, then skip it. - if (clusterIDForFaceID.get(faceID)) continue; + if (clusterIDForFaceID.get(fi.faceID)) continue; // Find the nearest neighbour from among all the other faces. let nn: Face | undefined; @@ -207,26 +207,26 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // Can't find a way of avoiding the null assertion here. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const n = faces[j]!; + const fj = faces[j]!; // The vectors are already normalized, so we can directly use their // dot product as their cosine similarity. - const csim = dotProduct(embedding, n.embedding); + const csim = dotProduct(fi.embedding, fj.embedding); // TODO-Cluster Delete me and uncomment the check above // Skip ourselves. if (i == j) { - neighbours.push({ face: n, cosineSimilarity: csim }); + neighbours.push({ face: fj, cosineSimilarity: csim }); continue; } - const threshold = blur < 100 || n.blur < 100 ? 0.7 : 0.6; + const threshold = fi.blur < 100 || fj.blur < 100 ? 0.7 : 0.6; if (csim > threshold && csim > nnCosineSimilarity) { - nn = n; + nn = fj; nnCosineSimilarity = csim; } - neighbours.push({ face: n, cosineSimilarity: csim }); + neighbours.push({ face: fj, cosineSimilarity: csim }); } neighbours = neighbours.sort( @@ -235,8 +235,11 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion faceAndNeigbours.push({ face: faces[i]!, neighbours }); + const { faceID } = fi; + if (nn) { // Found a neighbour near enough. + const nnFaceID = nn.faceID; // Find the cluster the nearest neighbour belongs to, if any. const nnClusterID = clusterIDForFaceID.get(nn.faceID); @@ -256,11 +259,11 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const cluster = { id: newClusterID(), - faceIDs: [faceID, nn.faceID], + faceIDs: [faceID, nnFaceID], }; clusterIndexForClusterID.set(cluster.id, clusters.length); clusterIDForFaceID.set(faceID, cluster.id); - clusterIDForFaceID.set(nn.faceID, cluster.id); + clusterIDForFaceID.set(nnFaceID, cluster.id); clusters.push(cluster); } } else { From 14ac034c0ba53762d3cd62fc330b715faadc0c46 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 17:49:36 +0530 Subject: [PATCH 0761/1179] Provide both options --- web/apps/photos/src/pages/gallery/index.tsx | 2 +- .../new/photos/components/MLSettings.tsx | 32 +++++++++++++------ web/packages/new/photos/services/ml/index.ts | 16 +--------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/web/apps/photos/src/pages/gallery/index.tsx b/web/apps/photos/src/pages/gallery/index.tsx index adce308172..1876fca7f4 100644 --- a/web/apps/photos/src/pages/gallery/index.tsx +++ b/web/apps/photos/src/pages/gallery/index.tsx @@ -675,7 +675,7 @@ export default function Gallery() { useEffect(() => { // TODO-Cluster - if (process.env.NEXT_PUBLIC_ENTE_WIP_CL) { + if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_AUTO) { setTimeout(() => { if (!wipHasSwitchedOnceCmpAndSet()) { void wipClusterEnable().then( diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index fb3e6ea008..08e17c7ff1 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,5 +1,5 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; -import { MenuItemGroup } from "@/base/components/Menu"; +import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; import { pt, ut } from "@/base/i18n"; import log from "@/base/log"; @@ -8,6 +8,7 @@ import { enableML, mlStatusSnapshot, mlStatusSubscribe, + wipCluster, wipClusterEnable, type MLStatus, } from "@/new/photos/services/ml"; @@ -339,9 +340,9 @@ const ManageML: React.FC = ({ }; // TODO-Cluster - // const wipClusterNow = () => void wipCluster(); const router = useRouter(); - const wipClusterNow = () => router.push("/cluster-debug"); + const wipClusterNow = () => wipCluster(); + const wipClusterShowNow = () => router.push("/cluster-debug"); return ( @@ -390,17 +391,30 @@ const ManageML: React.FC = ({ - {/* */} + /> + + )} + {showClusterOpt && ( + + + + + )} diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 9b8db7cb9c..f53e755502 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -411,21 +411,7 @@ export const wipClusterDebugPageContents = async (): Promise< return { faceFNs, clusters, clusterIDForFaceID }; }; -export const wipCluster = async () => { - if (!(await wipClusterEnable())) return; - - log.info("clustering"); - _wip_isClustering = true; - _wip_searchPersons = undefined; - triggerStatusUpdate(); - - const { clusters, cgroups } = await clusterFaces(await faceIndexes()); - const searchPersons = await convertToSearchPersons(clusters, cgroups); - - _wip_isClustering = false; - _wip_searchPersons = searchPersons; - triggerStatusUpdate(); -}; +export const wipCluster = () => void wipClusterDebugPageContents(); const convertToSearchPersons = async ( clusters: FaceCluster[], From 3563c20997dd6b7c261944292ed95ab0869d7d89 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 20:04:59 +0530 Subject: [PATCH 0762/1179] Add limits --- web/apps/photos/src/pages/cluster-debug.tsx | 43 +++++++++++-------- .../new/photos/components/MLSettings.tsx | 4 +- .../new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/index.ts | 7 ++- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 683ce6bec6..c6abe7226f 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -40,25 +40,34 @@ export default function ClusterDebug() { finishLoading(); }; + if (!clusterRes) { + return ( + + + + ); + } return ( <> - {clusterRes ? ( - - - {({ height, width }) => ( - - )} - - - ) : ( - - - - )} + + {`${clusterRes.clusters.length} clusters`} + + + Showing only upto first 30 faces (and only upto 30 nearest + neighbours of each). + +
+ + + {({ height, width }) => ( + + )} + + ); diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 08e17c7ff1..337bc906e8 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -397,7 +397,7 @@ const ManageML: React.FC = ({ @@ -412,7 +412,7 @@ const ManageML: React.FC = ({ diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index c0f5dd51c2..445a91bbba 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -168,7 +168,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. - const faces = [...enumerateFaces(faceIndexes)]; + const faces = [...enumerateFaces(faceIndexes)].slice(0, 900); // Start with the clusters we already have (either from a previous indexing, // or fetched from remote). diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index f53e755502..0567793fbe 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -408,7 +408,12 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = searchPersons; triggerStatusUpdate(); - return { faceFNs, clusters, clusterIDForFaceID }; + const prunedFaceFNs = faceFNs.slice(0, 30).map(({ face, neighbours }) => ({ + face, + neighbours: neighbours.slice(0, 30), + })); + + return { faceFNs: prunedFaceFNs, clusters, clusterIDForFaceID }; }; export const wipCluster = () => void wipClusterDebugPageContents(); From 5aae59cdda0f64b2525902bfb170952daa884c70 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 20:10:23 +0530 Subject: [PATCH 0763/1179] Add limits --- web/packages/new/photos/components/MLSettings.tsx | 2 +- web/packages/new/photos/services/ml/cluster-new.ts | 2 +- web/packages/new/photos/services/ml/index.ts | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index 337bc906e8..eeff4d1be8 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -397,7 +397,7 @@ const ManageML: React.FC = ({ diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 445a91bbba..eb59c7d703 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -168,7 +168,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. - const faces = [...enumerateFaces(faceIndexes)].slice(0, 900); + const faces = [...enumerateFaces(faceIndexes)].slice(0, 2000); // Start with the clusters we already have (either from a previous indexing, // or fetched from remote). diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 0567793fbe..2b4a1a044f 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -330,8 +330,7 @@ export const indexNewUpload = (enteFile: EnteFile, uploadItem: UploadItem) => { * WIP! Don't enable, dragon eggs are hatching here. */ export const wipClusterEnable = async (): Promise => - !!process.env.NEXT_PUBLIC_ENTE_WIP_CL && - isDevBuild && + (!!process.env.NEXT_PUBLIC_ENTE_WIP_CL && isDevBuild) || (await isInternalUser()); // // TODO-Cluster temporary state here From ac5d37a9e3f94609c3351f3922c8ab8ba6822287 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 20:34:42 +0530 Subject: [PATCH 0764/1179] Not helping, this is just causing it to run twice --- .github/workflows/web-lint.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/web-lint.yml b/.github/workflows/web-lint.yml index 6655587175..c64463384c 100644 --- a/.github/workflows/web-lint.yml +++ b/.github/workflows/web-lint.yml @@ -2,21 +2,10 @@ name: "Lint (web)" on: # Run on every pull request (open or push to it) that changes web/ - # - # This is for running lints on pull requests from external contributors. pull_request: paths: - "web/**" - ".github/workflows/web-lint.yml" - # Run on every push (to a non-main branch) that changes web/ - # - # This reduces the delay in waiting for the pull_request to kick in for the - # PRs from existing contributors. - push: - branches-ignore: [main] - paths: - - "web/**" - - ".github/workflows/web-lint.yml" jobs: lint: From 5ca3ca5289ae60fe5d972c9233604e1c462eeca8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 28 Aug 2024 20:38:28 +0530 Subject: [PATCH 0765/1179] Add CHANGELOG entry --- desktop/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index a48bbf7ab0..9a32cd383f 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -3,6 +3,7 @@ ## v1.7.4 (Unreleased) - Improved date search, including support for day of week and hour of day. +- Fix video thumbnail generation and upload on Intel macOS. - . ## v1.7.3 From ca1a292fb29ff5a928d2497ebe1a26ad2ed92a30 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 07:27:01 +0530 Subject: [PATCH 0766/1179] Prep to try the hdbscan --- .../new/photos/services/ml/cluster-new.ts | 118 +++++++++++++++++- .../new/photos/services/ml/cluster.ts | 2 +- 2 files changed, 117 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index eb59c7d703..51f9a44d6a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -1,6 +1,7 @@ import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; +import { clusterFacesHdbscan } from "./cluster"; import { clusterGroups, faceClusters } from "./db"; import type { Face, FaceIndex } from "./face"; import { dotProduct } from "./math"; @@ -168,6 +169,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. + // TODO-Cluster note the 2k slice const faces = [...enumerateFaces(faceIndexes)].slice(0, 2000); // Start with the clusters we already have (either from a previous indexing, @@ -232,8 +234,7 @@ export const clusterFaces = async (faceIndexes: FaceIndex[]) => { neighbours = neighbours.sort( (a, b) => b.cosineSimilarity - a.cosineSimilarity, ); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - faceAndNeigbours.push({ face: faces[i]!, neighbours }); + faceAndNeigbours.push({ face: fi, neighbours }); const { faceID } = fi; @@ -336,3 +337,116 @@ function* enumerateFaces(faceIndices: FaceIndex[]) { } } } + +export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { + const t = Date.now(); + + // A flattened array of faces. + // TODO-Cluster note the 2k slice + const faces = [...enumerateFaces(faceIndexes)].slice(0, 2000); + + const faceEmbeddings = faces.map(({ embedding }) => embedding); + + const { + clusters: clusterIndices, + noise, + debugInfo, + } = clusterFacesHdbscan(faceEmbeddings); + + log.info({ method: "hdbscan", clusterIndices, noise, debugInfo }); + log.info( + `Clustered ${faces.length} faces into ${clusterIndices.length} clusters (${Date.now() - t} ms)`, + ); + + // For fast reverse lookup - map from cluster ids to their index in the + // clusters array. + const clusterIndexForClusterID = new Map(); + + // For fast reverse lookup - map from face ids to the id of the cluster to + // which they belong. + const clusterIDForFaceID = new Map(); + + // A function to generate new cluster IDs. + const newClusterID = () => newNonSecureID("cluster_"); + + // Convert the numerical face indices into the result. + const clusters: FaceCluster[] = []; + for (const [ci, faceIndices] of clusterIndices.entries()) { + const clusterID = newClusterID(); + const faceIDs: string[] = []; + clusterIndexForClusterID.set(clusterID, ci); + for (const fi of faceIndices) { + // Can't find a way of avoiding the null assertion here. + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const face = faces[fi]!; + clusterIDForFaceID.set(face.faceID, clusterID); + faceIDs.push(face.faceID); + } + clusters.push({ id: clusterID, faceIDs }); + } + + // Convert into the data structure we're using to debug/visualize. + const faceAndNeigbours: FaceNeighbours[] = []; + for (const fi of faces) { + let neighbours: FaceNeighbour[] = []; + for (const fj of faces) { + // The vectors are already normalized, so we can directly use their + // dot product as their cosine similarity. + const csim = dotProduct(fi.embedding, fj.embedding); + neighbours.push({ face: fj, cosineSimilarity: csim }); + } + + neighbours = neighbours.sort( + (a, b) => b.cosineSimilarity - a.cosineSimilarity, + ); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + faceAndNeigbours.push({ face: fi, neighbours }); + } + + // Prune too small clusters. + const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); + + let cgroups = await clusterGroups(); + + // TODO-Cluster - Currently we're not syncing with remote or saving anything + // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) + // cgroup, one per cluster. + cgroups = cgroups.concat( + validClusters.map((c) => ({ + id: c.id, + name: undefined, + clusterIDs: [c.id], + isHidden: false, + avatarFaceID: undefined, + displayFaceID: undefined, + })), + ); + + // For each cluster group, use the highest scoring face in any of its + // clusters as its display face. + const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); + for (const cgroup of cgroups) { + cgroup.displayFaceID = cgroup.clusterIDs + .map((clusterID) => clusterIndexForClusterID.get(clusterID)) + .filter((i) => i !== undefined) /* 0 is a valid index */ + .flatMap((i) => clusters[i]?.faceIDs ?? []) + .map((faceID) => faceForFaceID.get(faceID)) + .filter((face) => !!face) + .reduce((max, face) => + max.score > face.score ? max : face, + ).faceID; + } + + log.info("ml/cluster", { + faces, + validClusters, + clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), + clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), + cgroups, + }); + log.info( + `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, + ); + + return { faces, clusters: validClusters, cgroups, faceAndNeigbours }; +}; diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index c3474b22b8..ff62f466a9 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -15,7 +15,7 @@ export interface ClusterFacesResult { * pipeline. Each embedding is for a face detected in an image (a single image * may have multiple faces detected within it). */ -export const clusterFaces = ( +export const clusterFacesHdbscan = ( faceEmbeddings: number[][], ): ClusterFacesResult => { const hdbscan = new Hdbscan({ From e84903d2ddd1dda07c58896ce2f2aa0870a9a8f6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 08:01:43 +0530 Subject: [PATCH 0767/1179] Switch --- web/packages/new/photos/services/ml/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 2b4a1a044f..43d90578b8 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -20,7 +20,7 @@ import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; -import { clusterFaces, type CGroup, type FaceCluster } from "./cluster-new"; +import { clusterFacesHdb, type CGroup, type FaceCluster } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; import { clearMLDB, @@ -376,7 +376,8 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = undefined; triggerStatusUpdate(); - const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( + // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( + const { faceAndNeigbours, clusters, cgroups } = await clusterFacesHdb( await faceIndexes(), ); const searchPersons = await convertToSearchPersons(clusters, cgroups); From 5dd1720b885862eae91c6eafa85e53b0ebb59ee7 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 08:13:56 +0530 Subject: [PATCH 0768/1179] lf --- web/packages/new/photos/services/ml/cluster-new.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 51f9a44d6a..9e07b2812c 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -399,7 +399,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { neighbours = neighbours.sort( (a, b) => b.cosineSimilarity - a.cosineSimilarity, ); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + faceAndNeigbours.push({ face: fi, neighbours }); } From d5a8f234f8b4c306d0369a1f08aef46364773ece Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 29 Aug 2024 16:08:49 +0530 Subject: [PATCH 0769/1179] [mob][photos] fix: creating a new album from hidden section is not hidden by default --- mobile/lib/ui/collections/album/vertical_list.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/collections/album/vertical_list.dart b/mobile/lib/ui/collections/album/vertical_list.dart index fd5814f183..825bbbdbd4 100644 --- a/mobile/lib/ui/collections/album/vertical_list.dart +++ b/mobile/lib/ui/collections/album/vertical_list.dart @@ -138,7 +138,8 @@ class AlbumVerticalListWidget extends StatelessWidget { bool hasVerifiedLock = false; late final Collection? collection; - if (actionType == CollectionActionType.moveToHiddenCollection) { + if (actionType == CollectionActionType.moveToHiddenCollection || + actionType == CollectionActionType.addToHiddenAlbum) { collection = await CollectionsService.instance.createHiddenAlbum(albumName); hasVerifiedLock = true; From d99e405f10aae48272115b55ff9a10693ac2927a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 16:57:16 +0530 Subject: [PATCH 0770/1179] [web] Clear cached thumbnails if the source file is edited --- web/apps/photos/src/services/fileService.ts | 7 ++- web/packages/new/photos/services/files.ts | 59 +++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/web/apps/photos/src/services/fileService.ts b/web/apps/photos/src/services/fileService.ts index 82ce81ede0..ef364844a2 100644 --- a/web/apps/photos/src/services/fileService.ts +++ b/web/apps/photos/src/services/fileService.ts @@ -1,7 +1,11 @@ import { encryptMetadataJSON } from "@/base/crypto"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; -import { getLocalFiles, setLocalFiles } from "@/new/photos/services/files"; +import { + clearCachedThumbnailsIfChanged, + getLocalFiles, + setLocalFiles, +} from "@/new/photos/services/files"; import { EncryptedEnteFile, EnteFile, @@ -47,6 +51,7 @@ export const syncFiles = async ( } const newFiles = await getFiles(collection, lastSyncTime, setFiles); + await clearCachedThumbnailsIfChanged(localFiles, newFiles); files = getLatestVersionFiles([...files, ...newFiles]); await setLocalFiles(type, files); didUpdateFiles = true; diff --git a/web/packages/new/photos/services/files.ts b/web/packages/new/photos/services/files.ts index 6a0ad4faa1..1d626a482f 100644 --- a/web/packages/new/photos/services/files.ts +++ b/web/packages/new/photos/services/files.ts @@ -1,3 +1,5 @@ +import { blobCache } from "@/base/blob-cache"; +import { FileType } from "@/media/file-type"; import localForage from "@ente/shared/storage/localForage"; import { type EnteFile, type Trash } from "../types/file"; import { mergeMetadata } from "../utils/file"; @@ -73,3 +75,60 @@ const sortTrashFiles = (files: EnteFile[]) => { return (a.deleteBy ?? 0) - (b.deleteBy ?? 0); }); }; + +/** + * Clear cached thumbnails for existing files if the thumbnail data has changed. + * + * This function in expected to be called when we are processing a collection + * diff, updating our local state to reflect files that were updated on remote. + * We use this as an opportune moment to invalidate any cached thumbnails which + * have changed. + * + * An example of when such invalidation is necessary: + * + * 1. Take a photo on mobile, and let it sync via the mobile app to us (web). + * 2. Edit the photo outside of Ente (e.g. using Apple Photos). + * 3. When the Ente mobile client next comes into foreground, it'll update the + * remote thumbnail for the existing file to reflect the changes. + * + * @param existingFiles The {@link EnteFile}s we had in our local database + * before processing the diff response. + * + * @param newFiles The {@link EnteFile}s which we got in the diff response. + */ +export const clearCachedThumbnailsIfChanged = async ( + existingFiles: EnteFile[], + newFiles: EnteFile[], +) => { + if (newFiles.length == 0) { + // Fastpath to no-op if nothing changes. + return; + } + + // TODO: This should be constructed once, at the caller (currently the + // caller doesn't need this, but we'll only know for sure after we + // consolidate all processing that happens during a diff parse). + const existingFileByID = new Map(existingFiles.map((f) => [f.id, f])); + + for (const newFile of newFiles) { + const existingFile = existingFileByID.get(newFile.id); + const m1 = existingFile?.metadata; + if (!m1) continue; + // Need to audit the types, until the add a ?? to be safe. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const m2 = newFile.metadata ?? {}; + // Both files exist, have metadata, but their (appropriate) hashes + // differ, which indicates that the change was in the file's contents, + // not the metadata itself, and thus we should refresh the thumbnail. + if ( + m1.fileType == FileType.livePhoto + ? m1.imageHash != m2.imageHash + : m1.hash != m2.hash + ) { + // This is an infrequent occurrence, so we lazily get the cache. + const thumbnailCache = await blobCache("thumbs"); + const key = newFile.id.toString(); + await thumbnailCache.delete(key); + } + } +}; From 3d2a66023d06d1f34fa389f8090bd5758898e15c Mon Sep 17 00:00:00 2001 From: Aaron Torres Date: Wed, 28 Aug 2024 20:30:25 -0700 Subject: [PATCH 0771/1179] Add RippleMatch icon --- auth/assets/custom-icons/_data/custom-icons.json | 4 ++++ auth/assets/custom-icons/icons/ripplematch.svg | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 auth/assets/custom-icons/icons/ripplematch.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index a04cb2b857..a7ad53bc20 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -702,6 +702,10 @@ "altNames": ["Newton Crypto"], "slug": "newton" }, + { + "title": "RippleMatch", + "slug": "ripplematch" + }, { "title": "T-Mobile ID", "altNames": [ diff --git a/auth/assets/custom-icons/icons/ripplematch.svg b/auth/assets/custom-icons/icons/ripplematch.svg new file mode 100644 index 0000000000..716e3d59ad --- /dev/null +++ b/auth/assets/custom-icons/icons/ripplematch.svg @@ -0,0 +1,6 @@ + + + + + + From 67361113af3574e54c860bf92504d3e3d44659b0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 17:24:20 +0530 Subject: [PATCH 0772/1179] Help the linter move on --- web/packages/new/photos/services/files.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/packages/new/photos/services/files.ts b/web/packages/new/photos/services/files.ts index 1d626a482f..11fe776807 100644 --- a/web/packages/new/photos/services/files.ts +++ b/web/packages/new/photos/services/files.ts @@ -113,10 +113,10 @@ export const clearCachedThumbnailsIfChanged = async ( for (const newFile of newFiles) { const existingFile = existingFileByID.get(newFile.id); const m1 = existingFile?.metadata; - if (!m1) continue; - // Need to audit the types, until the add a ?? to be safe. + const m2 = newFile.metadata; + // TODO: Add an extra truthy check the EnteFile type is null safe // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - const m2 = newFile.metadata ?? {}; + if (!m1 || !m2) continue; // Both files exist, have metadata, but their (appropriate) hashes // differ, which indicates that the change was in the file's contents, // not the metadata itself, and thus we should refresh the thumbnail. From 6aba9064a7d56b12d58f764475e23bdb1e5e0357 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 16:24:37 +0530 Subject: [PATCH 0773/1179] [web] Make web app's log handling consistent with how desktop app does it --- web/packages/accounts/services/logout.ts | 4 ++-- web/packages/base/local-storage.ts | 14 ++++++++++++++ web/packages/shared/storage/localStorage/index.ts | 1 - 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 web/packages/base/local-storage.ts diff --git a/web/packages/accounts/services/logout.ts b/web/packages/accounts/services/logout.ts index af3ac42053..ac43b21b18 100644 --- a/web/packages/accounts/services/logout.ts +++ b/web/packages/accounts/services/logout.ts @@ -1,9 +1,9 @@ import { clearBlobCaches } from "@/base/blob-cache"; import { clearKVDB } from "@/base/kv"; +import { clearLocalStorage } from "@/base/local-storage"; import log from "@/base/log"; import InMemoryStore from "@ente/shared/storage/InMemoryStore"; import localForage from "@ente/shared/storage/localForage"; -import { clearData } from "@ente/shared/storage/localStorage"; import { clearKeys } from "@ente/shared/storage/sessionStorage"; import { logout as remoteLogout } from "../api/user"; @@ -39,7 +39,7 @@ export const accountLogout = async () => { ignoreError("Session storage", e); } try { - clearData(); + clearLocalStorage(); } catch (e) { ignoreError("Local storage", e); } diff --git a/web/packages/base/local-storage.ts b/web/packages/base/local-storage.ts new file mode 100644 index 0000000000..e71caf48f5 --- /dev/null +++ b/web/packages/base/local-storage.ts @@ -0,0 +1,14 @@ +import { nullToUndefined } from "@/utils/transform"; + +/** + * Clear local storage on logout. + * + * This function clears everything from local storage except the app's logs. + */ +export const clearLocalStorage = () => { + const existingLogs = nullToUndefined(localStorage.getItem("logs")); + localStorage.clear(); + if (existingLogs) { + localStorage.setItem("logs", existingLogs); + } +}; diff --git a/web/packages/shared/storage/localStorage/index.ts b/web/packages/shared/storage/localStorage/index.ts index 99dd51edc1..cf8acf5a95 100644 --- a/web/packages/shared/storage/localStorage/index.ts +++ b/web/packages/shared/storage/localStorage/index.ts @@ -46,7 +46,6 @@ export const getData = (key: LS_KEYS) => { } }; -export const clearData = () => localStorage.clear(); // TODO: Migrate this to `local-user.ts`, with (a) more precise optionality // indication of the constituent fields, (b) moving any fields that need to be From 0c48f53ab1fda42dea64545fd93ded5fd37602d6 Mon Sep 17 00:00:00 2001 From: araghon007 Date: Mon, 26 Aug 2024 15:18:15 +0000 Subject: [PATCH 0774/1179] Remove X.com custom icon --- auth/assets/custom-icons/_data/custom-icons.json | 7 ------- auth/assets/custom-icons/icons/x.svg | 5 ----- 2 files changed, 12 deletions(-) delete mode 100644 auth/assets/custom-icons/icons/x.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index a7ad53bc20..8fe3f7cc9a 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -667,13 +667,6 @@ "Work OS" ] }, - { - "title": "X", - "altNames": [ - "twitter" - ], - "slug": "x" - }, { "title": "Yandex", "altNames": [ diff --git a/auth/assets/custom-icons/icons/x.svg b/auth/assets/custom-icons/icons/x.svg deleted file mode 100644 index bd4b6e9745..0000000000 --- a/auth/assets/custom-icons/icons/x.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - From 194f07d48efd7ad5c2df01a5c47bf8d7d77da1cb Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 17:50:09 +0530 Subject: [PATCH 0775/1179] Fix style lint issue --- web/packages/shared/storage/localStorage/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/web/packages/shared/storage/localStorage/index.ts b/web/packages/shared/storage/localStorage/index.ts index cf8acf5a95..df80b21330 100644 --- a/web/packages/shared/storage/localStorage/index.ts +++ b/web/packages/shared/storage/localStorage/index.ts @@ -46,7 +46,6 @@ export const getData = (key: LS_KEYS) => { } }; - // TODO: Migrate this to `local-user.ts`, with (a) more precise optionality // indication of the constituent fields, (b) moving any fields that need to be // accessed from web workers to KV DB. From 87d61051593ab29f34f23915d81b61ff9bd7a5cb Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 17:51:03 +0530 Subject: [PATCH 0776/1179] Remove leftover migration code --- web/apps/accounts/src/pages/_app.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/web/apps/accounts/src/pages/_app.tsx b/web/apps/accounts/src/pages/_app.tsx index 6b19b530fb..31ceecf32d 100644 --- a/web/apps/accounts/src/pages/_app.tsx +++ b/web/apps/accounts/src/pages/_app.tsx @@ -8,7 +8,6 @@ import { Overlay } from "@ente/shared/components/Container"; import DialogBoxV2 from "@ente/shared/components/DialogBoxV2"; import type { DialogBoxAttributesV2 } from "@ente/shared/components/DialogBoxV2/types"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; -import { clearData } from "@ente/shared/storage/localStorage"; import { getTheme } from "@ente/shared/themes"; import { THEME_COLOR } from "@ente/shared/themes/constants"; import { CssBaseline } from "@mui/material"; @@ -30,12 +29,6 @@ const App: React.FC = ({ Component, pageProps }) => { useEffect(() => { disableDiskLogs(); - // The accounts app has no local state, but some older builds might've - // leftover some scraps. Clear it out. - // - // This code added on 1 July 2024, can be removed soon since this data - // was never saved before this was released (tag: Migration). - clearData(); void setupI18n().finally(() => setIsI18nReady(true)); logUnhandledErrorsAndRejections(true); return () => logUnhandledErrorsAndRejections(false); From b55cf7c0d8fd9ab9008f721567d04aac82090526 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 17:51:48 +0530 Subject: [PATCH 0777/1179] Update --- web/packages/accounts/pages/credentials.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/accounts/pages/credentials.tsx b/web/packages/accounts/pages/credentials.tsx index b29cb952c6..bb3257c3ed 100644 --- a/web/packages/accounts/pages/credentials.tsx +++ b/web/packages/accounts/pages/credentials.tsx @@ -1,5 +1,6 @@ import { sharedCryptoWorker } from "@/base/crypto"; import type { B64EncryptionResult } from "@/base/crypto/libsodium"; +import { clearLocalStorage } from "@/base/local-storage"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; @@ -25,7 +26,6 @@ import { CustomError } from "@ente/shared/error"; import InMemoryStore, { MS_KEYS } from "@ente/shared/storage/InMemoryStore"; import { LS_KEYS, - clearData, getData, setData, setLSUser, @@ -177,7 +177,7 @@ const Page: React.FC = ({ appContext }) => { (!user?.token && !user?.encryptedToken) || (keyAttributes && !keyAttributes.memLimit) ) { - clearData(); + clearLocalStorage(); router.push("/"); return; } From 236d24c79b88c25526c1931ee4d422c9570ac469 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 29 Aug 2024 18:01:06 +0530 Subject: [PATCH 0778/1179] [server] Gracefully handle deleted users --- server/ente/errors.go | 6 ++++++ server/pkg/api/user.go | 2 +- server/pkg/controller/user/user_details.go | 11 ++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/ente/errors.go b/server/ente/errors.go index 696a764f34..c4bbc1db87 100644 --- a/server/ente/errors.go +++ b/server/ente/errors.go @@ -141,6 +141,12 @@ var ErrNotFoundError = ApiError{ HttpStatusCode: http.StatusNotFound, } +var ErrUserNotFound = &ApiError{ + Code: "USER_NOT_FOUND", + Message: "User is either deleted or not found", + HttpStatusCode: http.StatusNotFound, +} + var ErrMaxPasskeysReached = ApiError{ Code: MaxPasskeysReached, Message: "Max passkeys limit reached", diff --git a/server/pkg/api/user.go b/server/pkg/api/user.go index c02fce36c7..939c6bf5c6 100644 --- a/server/pkg/api/user.go +++ b/server/pkg/api/user.go @@ -356,7 +356,7 @@ func (h *UserHandler) FinishPasskeyAuthenticationCeremony(c *gin.Context) { return } - user, err := h.UserController.UserRepo.Get(userID) + user, err := h.UserController.GetUser(userID) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) return diff --git a/server/pkg/controller/user/user_details.go b/server/pkg/controller/user/user_details.go index 703b8fb2f5..ee4acb730e 100644 --- a/server/pkg/controller/user/user_details.go +++ b/server/pkg/controller/user/user_details.go @@ -1,6 +1,7 @@ package user import ( + "errors" "github.com/ente-io/museum/ente" "github.com/ente-io/museum/ente/details" bonus "github.com/ente-io/museum/ente/storagebonus" @@ -11,6 +12,14 @@ import ( "golang.org/x/sync/errgroup" ) +func (c *UserController) GetUser(userID int64) (ente.User, error) { + user, err := c.UserRepo.Get(userID) + if err != nil && errors.Is(err, ente.ErrUserDeleted) { + return ente.User{}, stacktrace.Propagate(ente.ErrUserNotFound, "") + } + return user, err + +} func (c *UserController) GetDetailsV2(ctx *gin.Context, userID int64, fetchMemoryCount bool, app ente.App) (details.UserDetailsResponse, error) { g := new(errgroup.Group) @@ -21,7 +30,7 @@ func (c *UserController) GetDetailsV2(ctx *gin.Context, userID int64, fetchMemor var fileCount, sharedCollectionCount, usage int64 var bonus *bonus.ActiveStorageBonus g.Go(func() error { - resp, err := c.UserRepo.Get(userID) + resp, err := c.GetUser(userID) if err != nil { return stacktrace.Propagate(err, "failed to get user") } From 67ea0cfe734f9128411cfc1f5e3dec303b09650a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 12:22:22 +0530 Subject: [PATCH 0779/1179] Debugging code --- .../new/photos/services/ml/cluster-new.ts | 26 ++++++++++--------- .../new/photos/services/ml/cluster.ts | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 9e07b2812c..94e5efe11e 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -343,17 +343,18 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // A flattened array of faces. // TODO-Cluster note the 2k slice - const faces = [...enumerateFaces(faceIndexes)].slice(0, 2000); + const faces0 = [...enumerateFaces(faceIndexes)];//.slice(0, 2000); + const faces = Array(1).fill(0).flatMap(() => faces0); const faceEmbeddings = faces.map(({ embedding }) => embedding); const { clusters: clusterIndices, - noise, - debugInfo, + // noise, + // debugInfo, } = clusterFacesHdbscan(faceEmbeddings); - log.info({ method: "hdbscan", clusterIndices, noise, debugInfo }); + // log.info({ method: "hdbscan", clusterIndices, noise, debugInfo }); log.info( `Clustered ${faces.length} faces into ${clusterIndices.length} clusters (${Date.now() - t} ms)`, ); @@ -387,7 +388,8 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // Convert into the data structure we're using to debug/visualize. const faceAndNeigbours: FaceNeighbours[] = []; - for (const fi of faces) { + const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); + for (const fi of topFaces) { let neighbours: FaceNeighbour[] = []; for (const fj of faces) { // The vectors are already normalized, so we can directly use their @@ -437,13 +439,13 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { ).faceID; } - log.info("ml/cluster", { - faces, - validClusters, - clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), - clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), - cgroups, - }); + // log.info("ml/cluster", { + // faces, + // validClusters, + // clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), + // clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), + // cgroups, + // }); log.info( `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index ff62f466a9..53e4930d94 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -24,7 +24,7 @@ export const clusterFacesHdbscan = ( minSamples: 5, clusterSelectionEpsilon: 0.6, clusterSelectionMethod: "leaf", - debug: true, + debug: false, }); return { From fc66c3e68933bcac5d2989b393f22a3c550c0760 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Thu, 29 Aug 2024 14:14:18 +0200 Subject: [PATCH 0780/1179] Add Upstox icon --- auth/assets/custom-icons/_data/custom-icons.json | 3 +++ auth/assets/custom-icons/icons/upstox.svg | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 auth/assets/custom-icons/icons/upstox.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 8fe3f7cc9a..0918925ace 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -639,6 +639,9 @@ "slug": "uphold", "hex": "6FE68A" }, + { + "title": "Upstox" + }, { "titile": "Vikunja", "slug": "vikunja" diff --git a/auth/assets/custom-icons/icons/upstox.svg b/auth/assets/custom-icons/icons/upstox.svg new file mode 100644 index 0000000000..2fb1a489f9 --- /dev/null +++ b/auth/assets/custom-icons/icons/upstox.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + From cd69e00451496ca4311f7a551a7e6ce2852bfe41 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 18:27:44 +0530 Subject: [PATCH 0781/1179] Batch --- .../new/photos/services/ml/cluster-new.ts | 132 +++++++++++++----- 1 file changed, 100 insertions(+), 32 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 94e5efe11e..e934b54676 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -342,48 +342,116 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. - // TODO-Cluster note the 2k slice - const faces0 = [...enumerateFaces(faceIndexes)];//.slice(0, 2000); - const faces = Array(1).fill(0).flatMap(() => faces0); + const faces0 = [...enumerateFaces(faceIndexes)]; + // TODO-Cluster testing code, can be removed once done + const faces = Array(1) + .fill(0) + .flatMap(() => faces0); + + // For fast reverse lookup - map from face ids to the face. + const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); const faceEmbeddings = faces.map(({ embedding }) => embedding); - const { - clusters: clusterIndices, - // noise, - // debugInfo, - } = clusterFacesHdbscan(faceEmbeddings); - - // log.info({ method: "hdbscan", clusterIndices, noise, debugInfo }); - log.info( - `Clustered ${faces.length} faces into ${clusterIndices.length} clusters (${Date.now() - t} ms)`, - ); - // For fast reverse lookup - map from cluster ids to their index in the // clusters array. const clusterIndexForClusterID = new Map(); - // For fast reverse lookup - map from face ids to the id of the cluster to - // which they belong. + // For fast reverse lookup - map from the id of a face to the id of the + // cluster to which it belongs. const clusterIDForFaceID = new Map(); + // A function to chain two reverse lookup. + const firstFaceOfCluster = (cluster: FaceCluster) => + ensure(faceForFaceID.get(ensure(cluster.faceIDs[0]))); + // A function to generate new cluster IDs. const newClusterID = () => newNonSecureID("cluster_"); - // Convert the numerical face indices into the result. + // The resultant clusters. + // TODO-Cluster Later on, instead of starting from a blank slate, this will + // be list of existing clusters we fetch from remote. const clusters: FaceCluster[] = []; - for (const [ci, faceIndices] of clusterIndices.entries()) { - const clusterID = newClusterID(); - const faceIDs: string[] = []; - clusterIndexForClusterID.set(clusterID, ci); - for (const fi of faceIndices) { - // Can't find a way of avoiding the null assertion here. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const face = faces[fi]!; - clusterIDForFaceID.set(face.faceID, clusterID); - faceIDs.push(face.faceID); + + // Process the faces in batches of 10k. The faces are already sorted by file + // ID, which is a monotonically increasing integer, so we will also have + // some temporal locality. + // + // The number 10k was derived by ad-hoc observations. On a particular test + // dataset, clustering 10k took ~2 mins, while 20k took ~8 mins. Memory + // usage was constant in both cases. + // + // At around 100k faces, the clustering starts taking hours, and we start + // running into stack overflows. The stack overflows can perhaps be avoided + // by restructuring the code, but hours of uninterruptible work is anyways + // not feasible. + + const batchSize = 10_000; + for (let i = 0; i < faceEmbeddings.length; i += batchSize) { + const embeddings = faceEmbeddings.slice(i, i + batchSize); + const { clusters: hdbClusters } = clusterFacesHdbscan(embeddings); + + log.info( + `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - t} ms)`, + ); + + // Merge the new clusters we got from hdbscan into the existing clusters + // if they are "near" them (using some heuristic). + // + // We need to ensure we don't change any of the existing cluster IDs, + // since these might be existing clusters we got from remote. + + for (const hdbCluster of hdbClusters) { + // Find the existing cluster whose (arbitrarily chosen) first face + // is the nearest neighbour of the (arbitrarily chosen) first face + // of the cluster produced by hdbscan. + + const newFace = ensure(faces[i + ensure(hdbCluster[0])]); + + let nnCluster: FaceCluster | undefined; + let nnCosineSimilarity = 0; + for (const existingCluster of clusters) { + const existingFace = firstFaceOfCluster(existingCluster); + + // The vectors are already normalized, so we can directly use their + // dot product as their cosine similarity. + const csim = dotProduct( + existingFace.embedding, + newFace.embedding, + ); + + // Use a higher cosine similarity threshold if either of the two + // faces are blurry. + const threshold = + existingFace.blur < 100 || newFace.blur < 100 ? 0.84 : 0.7; + if (csim > threshold && csim > nnCosineSimilarity) { + nnCluster = existingCluster; + nnCosineSimilarity = csim; + } + } + + if (nnCluster) { + // If we found an existing cluster that is near enough, + // sublimate the cluster produced by hdbscan into that cluster. + for (const j of hdbCluster) { + const { faceID } = ensure(faces[i + j]); + nnCluster.faceIDs.push(faceID); + clusterIDForFaceID.set(faceID, nnCluster.id); + } + } else { + // Otherwise make a new cluster from the cluster produced by + // hdbscan. + const clusterID = newClusterID(); + const faceIDs: string[] = []; + for (const j of hdbCluster) { + const { faceID } = ensure(faces[i + j]); + faceIDs.push(faceID); + clusterIDForFaceID.set(faceID, clusterID); + } + clusterIndexForClusterID.set(clusterID, clusters.length); + clusters.push({ id: clusterID, faceIDs }); + } } - clusters.push({ id: clusterID, faceIDs }); } // Convert into the data structure we're using to debug/visualize. @@ -398,14 +466,15 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { neighbours.push({ face: fj, cosineSimilarity: csim }); } - neighbours = neighbours.sort( - (a, b) => b.cosineSimilarity - a.cosineSimilarity, - ); + neighbours = neighbours + .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) + .slice(0, 30); faceAndNeigbours.push({ face: fi, neighbours }); } // Prune too small clusters. + // TODO-Cluster this is likely not needed since hdbscan already has a min? const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); let cgroups = await clusterGroups(); @@ -426,7 +495,6 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // For each cluster group, use the highest scoring face in any of its // clusters as its display face. - const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); for (const cgroup of cgroups) { cgroup.displayFaceID = cgroup.clusterIDs .map((clusterID) => clusterIndexForClusterID.get(clusterID)) From 89a5a9f42f09be8a348676b04f55099d46b87630 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 18:42:17 +0530 Subject: [PATCH 0782/1179] Prune --- web/packages/new/photos/services/ml/index.ts | 23 +++++++------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 43d90578b8..53940232f6 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -387,16 +387,14 @@ export const wipClusterDebugPageContents = async (): Promise< const fileForFace = ({ faceID }: Face) => ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))); - const faceFNs = faceAndNeigbours - .map(({ face, neighbours }) => ({ + const faceFNs = faceAndNeigbours.map(({ face, neighbours }) => ({ + face, + neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ face, - neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ - face, - enteFile: fileForFace(face), - cosineSimilarity, - })), - })) - .sort((a, b) => b.face.score - a.face.score); + enteFile: fileForFace(face), + cosineSimilarity, + })), + })); const clusterIDForFaceID = new Map( clusters.flatMap((cluster) => @@ -408,12 +406,7 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = searchPersons; triggerStatusUpdate(); - const prunedFaceFNs = faceFNs.slice(0, 30).map(({ face, neighbours }) => ({ - face, - neighbours: neighbours.slice(0, 30), - })); - - return { faceFNs: prunedFaceFNs, clusters, clusterIDForFaceID }; + return { faceFNs, clusters, clusterIDForFaceID }; }; export const wipCluster = () => void wipClusterDebugPageContents(); From 2179b193d21af7a7f7218e889a6f16b37736245b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:07:54 +0530 Subject: [PATCH 0783/1179] Preview --- web/apps/photos/src/pages/cluster-debug.tsx | 4 +- .../new/photos/services/ml/cluster-new.ts | 76 +++++++++++++++---- web/packages/new/photos/services/ml/index.ts | 32 ++++++-- 3 files changed, 89 insertions(+), 23 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index c6abe7226f..dcffaecfd2 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -53,8 +53,8 @@ export default function ClusterDebug() { {`${clusterRes.clusters.length} clusters`} - Showing only upto first 30 faces (and only upto 30 nearest - neighbours of each). + Showing only top 20 and bottom 10 clusters (and only up to 50 faces in + each, sorted by cosine distance to highest scoring face in the cluster).
diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index e934b54676..983c128a6a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -124,6 +124,16 @@ interface FaceNeighbour { cosineSimilarity: number; } +export interface ClusterPreview { + clusterSize: number; + faces: ClusterPreviewFace[]; +} + +interface ClusterPreviewFace { + face: Face; + cosineSimilarity: number; +} + /** * Cluster faces into groups. * @@ -455,22 +465,56 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { } // Convert into the data structure we're using to debug/visualize. - const faceAndNeigbours: FaceNeighbours[] = []; - const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); - for (const fi of topFaces) { - let neighbours: FaceNeighbour[] = []; - for (const fj of faces) { - // The vectors are already normalized, so we can directly use their - // dot product as their cosine similarity. - const csim = dotProduct(fi.embedding, fj.embedding); - neighbours.push({ face: fj, cosineSimilarity: csim }); + // const faceAndNeigbours: FaceNeighbours[] = []; + // const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); + // for (const fi of topFaces) { + // let neighbours: FaceNeighbour[] = []; + // for (const fj of faces) { + // // The vectors are already normalized, so we can directly use their + // // dot product as their cosine similarity. + // const csim = dotProduct(fi.embedding, fj.embedding); + // neighbours.push({ face: fj, cosineSimilarity: csim }); + // } + + // neighbours = neighbours + // .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) + // .slice(0, 30); + + // faceAndNeigbours.push({ face: fi, neighbours }); + // } + + // Convert into the data structure we're using to debug/visualize. + // + // > Showing only top 20 and bottom 10 clusters (and only up to 50 faces in + // > each, sorted by cosine distance to highest scoring face in the + // > cluster). + + const sortedClusters = clusters.sort( + (a, b) => b.faceIDs.length - a.faceIDs.length, + ); + const debugClusters = + sortedClusters.length < 30 + ? sortedClusters + : sortedClusters.slice(0, 20).concat(sortedClusters.slice(-10)); + const clusterPreviews: ClusterPreview[] = []; + for (const cluster of debugClusters) { + const faces = cluster.faceIDs.map((id) => + ensure(faceForFaceID.get(id)), + ); + const topFace = faces.reduce((max, face) => + max.score > face.score ? max : face, + ); + const previewFaces: ClusterPreviewFace[] = []; + for (const face of faces) { + const csim = dotProduct(topFace.embedding, face.embedding); + previewFaces.push({ face, cosineSimilarity: csim }); } - - neighbours = neighbours - .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) - .slice(0, 30); - - faceAndNeigbours.push({ face: fi, neighbours }); + clusterPreviews.push({ + clusterSize: cluster.faceIDs.length, + faces: previewFaces + .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) + .slice(0, 50), + }); } // Prune too small clusters. @@ -518,5 +562,5 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, ); - return { faces, clusters: validClusters, cgroups, faceAndNeigbours }; + return { faces, clusters: validClusters, cgroups, clusterPreviews }; }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 53940232f6..df8d08235c 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -360,6 +360,18 @@ export interface FaceFileNeighbour { cosineSimilarity: number; } +// "with file" +export interface ClusterPreviewWF { + clusterSize: number; + faces: ClusterPreviewFaceWF[]; +} + +interface ClusterPreviewFaceWF { + face: Face; + enteFile: EnteFile; + cosineSimilarity: number; +} + export interface ClusterDebugPageContents { faceFNs: FaceFileNeighbours[]; clusters: FaceCluster[]; @@ -377,7 +389,7 @@ export const wipClusterDebugPageContents = async (): Promise< triggerStatusUpdate(); // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( - const { faceAndNeigbours, clusters, cgroups } = await clusterFacesHdb( + const { clusterPreviews, clusters, cgroups } = await clusterFacesHdb( await faceIndexes(), ); const searchPersons = await convertToSearchPersons(clusters, cgroups); @@ -387,9 +399,19 @@ export const wipClusterDebugPageContents = async (): Promise< const fileForFace = ({ faceID }: Face) => ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))); - const faceFNs = faceAndNeigbours.map(({ face, neighbours }) => ({ - face, - neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ + // const faceFNs = faceAndNeigbours.map( + // ({ topFace: face, faces: neighbours }) => ({ + // face, + // neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ + // face, + // enteFile: fileForFace(face), + // cosineSimilarity, + // })), + // }), + // ); + const clusterPreviewWFs = clusterPreviews.map(({ clusterSize, faces }) => ({ + clusterSize, + faces: faces.map(({ face, cosineSimilarity }) => ({ face, enteFile: fileForFace(face), cosineSimilarity, @@ -406,7 +428,7 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = searchPersons; triggerStatusUpdate(); - return { faceFNs, clusters, clusterIDForFaceID }; + return { clusterPreviewWFs, clusters, clusterIDForFaceID }; }; export const wipCluster = () => void wipClusterDebugPageContents(); From 3d952120233fe9de9b5a8a2dfc46422bfb4aba08 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:20:56 +0530 Subject: [PATCH 0784/1179] Preview --- web/apps/photos/src/pages/cluster-debug.tsx | 61 +++++++++++-------- .../new/photos/services/ml/cluster-new.ts | 7 ++- web/packages/new/photos/services/ml/index.ts | 5 +- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index dcffaecfd2..23930f1f03 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -4,10 +4,9 @@ import { faceCrop, wipClusterDebugPageContents, type ClusterDebugPageContents, - type FaceFileNeighbour, - type FaceFileNeighbours, + type ClusterPreviewFaceWF, + type ClusterPreviewWF, } from "@/new/photos/services/ml"; -import type { Face } from "@/new/photos/services/ml/face"; import { FlexWrapper, FluidContainer, @@ -15,7 +14,7 @@ import { } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; -import { Box, IconButton, styled, Typography } from "@mui/material"; +import { Box, IconButton, Stack, styled, Typography } from "@mui/material"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; @@ -53,8 +52,9 @@ export default function ClusterDebug() { {`${clusterRes.clusters.length} clusters`} - Showing only top 20 and bottom 10 clusters (and only up to 50 faces in - each, sorted by cosine distance to highest scoring face in the cluster). + Showing only top 20 and bottom 10 clusters (and only up to 50 + faces in each, sorted by cosine distance to highest scoring face + in the cluster).
@@ -112,7 +112,7 @@ const ClusterPhotoList: React.FC = ({ width, clusterRes, }) => { - const { faceFNs, clusterIDForFaceID } = clusterRes; + const { clusterPreviewWFs, clusterIDForFaceID } = clusterRes; const [itemList, setItemList] = useState([]); const listRef = useRef(null); @@ -125,8 +125,8 @@ const ClusterPhotoList: React.FC = ({ const listItemHeight = 120 * shrinkRatio + 24 + 4; useEffect(() => { - setItemList(itemListFromFaceFNs(faceFNs, columns)); - }, [columns, faceFNs]); + setItemList(itemListFromClusterPreviewWFs(clusterPreviewWFs, columns)); + }, [columns, clusterPreviewWFs]); useEffect(() => { listRef.current?.resetAfterIndex(0); @@ -138,7 +138,7 @@ const ClusterPhotoList: React.FC = ({ const generateKey = (i: number) => Array.isArray(itemList[i]) ? `${itemList[i][0].enteFile.id}/${itemList[i][0].face.faceID}-${itemList[i].slice(-1)[0].enteFile.id}/${itemList[i].slice(-1)[0].face.faceID}-${i}` - : `${itemList[i].faceID}-${i}`; + : `${itemList[i]}-${i}`; return ( = ({ > {!Array.isArray(item) ? ( - {`score ${item.score.toFixed(2)} blur ${item.blur.toFixed(0)}`} + {`cluster size ${item.toFixed(2)}`} ) : ( - item.map((faceFN, i) => ( + item.map((faceWF, i) => ( )) )} @@ -181,19 +181,20 @@ const ClusterPhotoList: React.FC = ({ ); }; -type ItemListItem = Face | FaceFileNeighbour[]; +// type ItemListItem = Face | FaceFileNeighbour[]; +type ItemListItem = number | ClusterPreviewFaceWF[]; -const itemListFromFaceFNs = ( - faceFNs: FaceFileNeighbours[], +const itemListFromClusterPreviewWFs = ( + clusterPreviewWFs: ClusterPreviewWF[], columns: number, ) => { const result: ItemListItem[] = []; - for (let index = 0; index < faceFNs.length; index++) { - const { face, neighbours } = faceFNs[index]; - result.push(face); + for (let index = 0; index < clusterPreviewWFs.length; index++) { + const { clusterSize, faces } = clusterPreviewWFs[index]; + result.push(clusterSize); let lastIndex = 0; - while (lastIndex < neighbours.length) { - result.push(neighbours.slice(lastIndex, lastIndex + columns)); + while (lastIndex < faces.length) { + result.push(faces.slice(lastIndex, lastIndex + columns)); lastIndex += columns; } } @@ -210,12 +211,12 @@ const getShrinkRatio = (width: number, columns: number) => (columns * 120); interface FaceItemProps { - faceFN: FaceFileNeighbour; + faceWF: ClusterPreviewFaceWF; clusterIDForFaceID: Map; } -const FaceItem: React.FC = ({ faceFN, clusterIDForFaceID }) => { - const { face, enteFile, cosineSimilarity } = faceFN; +const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { + const { face, enteFile, cosineSimilarity } = faceWF; const { faceID } = face; const [objectURL, setObjectURL] = useState(); @@ -252,9 +253,15 @@ const FaceItem: React.FC = ({ faceFN, clusterIDForFaceID }) => { src={objectURL} /> )} - - {cosineSimilarity.toFixed(2)} - + + + {`${face.blur.toFixed(0)} blr`} + + + + {`cos ${cosineSimilarity.toFixed(2)}`} + +
); }; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 983c128a6a..e2bf78eb35 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -352,7 +352,10 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. - const faces0 = [...enumerateFaces(faceIndexes)]; + // TODO-Cluster ad-hoc filtering and slicing + const faces0 = [...enumerateFaces(faceIndexes)] + .filter((f) => f.blur > 50) + .slice(0, 1000); // TODO-Cluster testing code, can be removed once done const faces = Array(1) .fill(0) @@ -433,7 +436,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // Use a higher cosine similarity threshold if either of the two // faces are blurry. const threshold = - existingFace.blur < 100 || newFace.blur < 100 ? 0.84 : 0.7; + existingFace.blur < 100 || newFace.blur < 100 ? 0.9 : 0.7; if (csim > threshold && csim > nnCosineSimilarity) { nnCluster = existingCluster; nnCosineSimilarity = csim; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index df8d08235c..699a9b9c14 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -366,14 +366,15 @@ export interface ClusterPreviewWF { faces: ClusterPreviewFaceWF[]; } -interface ClusterPreviewFaceWF { +export interface ClusterPreviewFaceWF { face: Face; enteFile: EnteFile; cosineSimilarity: number; } export interface ClusterDebugPageContents { - faceFNs: FaceFileNeighbours[]; + // faceFNs: FaceFileNeighbours[]; + clusterPreviewWFs: ClusterPreviewWF[]; clusters: FaceCluster[]; clusterIDForFaceID: Map; } From 29b5830e19a861e20fc646d7db5a8bfcbbab8382 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:31:24 +0530 Subject: [PATCH 0785/1179] Print scores --- web/apps/photos/src/pages/cluster-debug.tsx | 8 +++++--- web/packages/new/photos/services/ml/cluster-new.ts | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 23930f1f03..62d2e05df4 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -255,11 +255,13 @@ const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { )} - {`${face.blur.toFixed(0)} blr`} + {`b ${face.blur.toFixed(0)} b`} - - {`cos ${cosineSimilarity.toFixed(2)}`} + {`s ${face.score.toFixed(2)}`} + + + {`c ${cosineSimilarity.toFixed(2)}`} diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index e2bf78eb35..e2149db180 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -355,7 +355,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // TODO-Cluster ad-hoc filtering and slicing const faces0 = [...enumerateFaces(faceIndexes)] .filter((f) => f.blur > 50) - .slice(0, 1000); + .slice(0, 6000); // TODO-Cluster testing code, can be removed once done const faces = Array(1) .fill(0) From c9acda1b6d4b25149772039607bcbc8ff9e5dec9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:47:16 +0530 Subject: [PATCH 0786/1179] Show direction --- web/apps/photos/src/pages/cluster-debug.tsx | 15 ++++++++++++--- web/packages/new/photos/services/ml/face.ts | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 62d2e05df4..0798ad608d 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -7,6 +7,7 @@ import { type ClusterPreviewFaceWF, type ClusterPreviewWF, } from "@/new/photos/services/ml"; +import { faceDirection } from "@/new/photos/services/ml/face"; import { FlexWrapper, FluidContainer, @@ -236,6 +237,8 @@ const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { }; }, [faceID, enteFile]); + const fd = faceDirection(face.detection); + const d = fd == "straight" ? "•" : fd == "left" ? "←" : "→"; return ( = ({ faceWF, clusterIDForFaceID }) => { )} - {`b ${face.blur.toFixed(0)} b`} + {`b${face.blur.toFixed(0)} `} - {`s ${face.score.toFixed(2)}`} + {`s${face.score.toFixed(1)}`} - {`c ${cosineSimilarity.toFixed(2)}`} + {`c${cosineSimilarity.toFixed(1)}`} + + + {`c${cosineSimilarity.toFixed(1)}`} + + + {`d${d}`} diff --git a/web/packages/new/photos/services/ml/face.ts b/web/packages/new/photos/services/ml/face.ts index 891b605db2..d8616b7426 100644 --- a/web/packages/new/photos/services/ml/face.ts +++ b/web/packages/new/photos/services/ml/face.ts @@ -714,7 +714,7 @@ const detectBlur = ( type FaceDirection = "left" | "right" | "straight"; -const faceDirection = ({ landmarks }: FaceDetection): FaceDirection => { +export const faceDirection = ({ landmarks }: FaceDetection): FaceDirection => { const leftEye = landmarks[0]!; const rightEye = landmarks[1]!; const nose = landmarks[2]!; From 4fd32155dc98aee636a0f01e8933f18df91e3a7f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:55:05 +0530 Subject: [PATCH 0787/1179] Worker --- .../new/photos/services/ml/cluster-new.ts | 13 +++++++++--- web/packages/new/photos/services/ml/index.ts | 21 +++++-------------- web/packages/new/photos/services/ml/worker.ts | 7 +++++++ 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index e2149db180..1258551439 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -399,7 +399,8 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // by restructuring the code, but hours of uninterruptible work is anyways // not feasible. - const batchSize = 10_000; + // const batchSize = 10_000; // TODO-Cluster + const batchSize = 1_000; for (let i = 0; i < faceEmbeddings.length; i += batchSize) { const embeddings = faceEmbeddings.slice(i, i + batchSize); const { clusters: hdbClusters } = clusterFacesHdbscan(embeddings); @@ -562,8 +563,14 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // cgroups, // }); log.info( - `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, + `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, ); - return { faces, clusters: validClusters, cgroups, clusterPreviews }; + return { + faces, + clusters: validClusters, + cgroups, + clusterPreviews, + clusterIDForFaceID, + }; }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 699a9b9c14..9f85f47119 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -20,14 +20,9 @@ import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; -import { clusterFacesHdb, type CGroup, type FaceCluster } from "./cluster-new"; +import { type CGroup, type FaceCluster } from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; -import { - clearMLDB, - faceIndex, - faceIndexes, - indexableAndIndexedCounts, -} from "./db"; +import { clearMLDB, faceIndex, indexableAndIndexedCounts } from "./db"; import type { Face } from "./face"; import { MLWorker } from "./worker"; import type { CLIPMatches } from "./worker-types"; @@ -390,9 +385,9 @@ export const wipClusterDebugPageContents = async (): Promise< triggerStatusUpdate(); // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( - const { clusterPreviews, clusters, cgroups } = await clusterFacesHdb( - await faceIndexes(), - ); + const { clusterPreviews, clusters, cgroups, clusterIDForFaceID } = + await worker().then((w) => w.clusterFacesHdb()); + const searchPersons = await convertToSearchPersons(clusters, cgroups); const localFiles = await getAllLocalFiles(); @@ -419,12 +414,6 @@ export const wipClusterDebugPageContents = async (): Promise< })), })); - const clusterIDForFaceID = new Map( - clusters.flatMap((cluster) => - cluster.faceIDs.map((id) => [id, cluster.id]), - ), - ); - _wip_isClustering = false; _wip_searchPersons = searchPersons; triggerStatusUpdate(); diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index f21f58d85a..e4a3e5ecab 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -24,8 +24,10 @@ import { indexCLIP, type CLIPIndex, } from "./clip"; +import { clusterFacesHdb } from "./cluster-new"; import { saveFaceCrops } from "./crop"; import { + faceIndexes, indexableFileIDs, markIndexingFailed, saveIndexes, @@ -272,6 +274,11 @@ export class MLWorker { remoteMLData: mlDataByID.get(id), })); } + + // TODO-Cluster + async clusterFacesHdb() { + return clusterFacesHdb(await faceIndexes()); + } } expose(MLWorker); From 15884597b4c27e4253f1db88eaf14360dcf27d51 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 19:57:30 +0530 Subject: [PATCH 0788/1179] uc --- web/apps/photos/src/pages/cluster-debug.tsx | 5 +---- .../new/photos/services/ml/cluster-new.ts | 11 +++++++--- web/packages/new/photos/services/ml/index.ts | 20 ++++++++++++++++--- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 0798ad608d..db187751de 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -50,7 +50,7 @@ export default function ClusterDebug() { return ( <> - {`${clusterRes.clusters.length} clusters`} + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} Showing only top 20 and bottom 10 clusters (and only up to 50 @@ -266,9 +266,6 @@ const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { {`c${cosineSimilarity.toFixed(1)}`} - - {`c${cosineSimilarity.toFixed(1)}`} - {`d${d}`} diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 1258551439..e49db72385 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -354,7 +354,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // A flattened array of faces. // TODO-Cluster ad-hoc filtering and slicing const faces0 = [...enumerateFaces(faceIndexes)] - .filter((f) => f.blur > 50) + .filter((f) => f.blur > 99) .slice(0, 6000); // TODO-Cluster testing code, can be removed once done const faces = Array(1) @@ -437,7 +437,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // Use a higher cosine similarity threshold if either of the two // faces are blurry. const threshold = - existingFace.blur < 100 || newFace.blur < 100 ? 0.9 : 0.7; + existingFace.blur < 200 || newFace.blur < 200 ? 0.9 : 0.7; if (csim > threshold && csim > nnCosineSimilarity) { nnCluster = existingCluster; nnCosineSimilarity = csim; @@ -566,8 +566,13 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, ); + const clusteredCount = clusterIDForFaceID.size + const unclusteredCount = faces.length - clusteredCount; + return { - faces, + // faces, + clusteredCount, + unclusteredCount, clusters: validClusters, cgroups, clusterPreviews, diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 9f85f47119..3f588c09ad 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -368,6 +368,8 @@ export interface ClusterPreviewFaceWF { } export interface ClusterDebugPageContents { + clusteredCount: number; + unclusteredCount: number; // faceFNs: FaceFileNeighbours[]; clusterPreviewWFs: ClusterPreviewWF[]; clusters: FaceCluster[]; @@ -385,8 +387,14 @@ export const wipClusterDebugPageContents = async (): Promise< triggerStatusUpdate(); // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( - const { clusterPreviews, clusters, cgroups, clusterIDForFaceID } = - await worker().then((w) => w.clusterFacesHdb()); + const { + clusteredCount, + unclusteredCount, + clusterPreviews, + clusters, + cgroups, + clusterIDForFaceID, + } = await worker().then((w) => w.clusterFacesHdb()); const searchPersons = await convertToSearchPersons(clusters, cgroups); @@ -418,7 +426,13 @@ export const wipClusterDebugPageContents = async (): Promise< _wip_searchPersons = searchPersons; triggerStatusUpdate(); - return { clusterPreviewWFs, clusters, clusterIDForFaceID }; + return { + clusteredCount, + unclusteredCount, + clusterPreviewWFs, + clusters, + clusterIDForFaceID, + }; }; export const wipCluster = () => void wipClusterDebugPageContents(); From d6c7ab0735087aaff9eee6c9b574eaefcaa3fa19 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 20:18:31 +0530 Subject: [PATCH 0789/1179] Inline --- .../new/photos/services/ml/cluster-new.ts | 66 ++++++++++++------- web/packages/new/photos/services/ml/index.ts | 31 ++++++++- 2 files changed, 73 insertions(+), 24 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index e49db72385..df97ca4bd9 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -525,34 +525,56 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // TODO-Cluster this is likely not needed since hdbscan already has a min? const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - let cgroups = await clusterGroups(); + // let cgroups = await clusterGroups(); + + // // TODO-Cluster - Currently we're not syncing with remote or saving anything + // // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) + // // cgroup, one per cluster. + // cgroups = cgroups.concat( + // validClusters.map((c) => ({ + // id: c.id, + // name: undefined, + // clusterIDs: [c.id], + // isHidden: false, + // avatarFaceID: undefined, + // displayFaceID: undefined, + // })), + // ); + + // // For each cluster group, use the highest scoring face in any of its + // // clusters as its display face. + // for (const cgroup of cgroups) { + // cgroup.displayFaceID = cgroup.clusterIDs + // .map((clusterID) => clusterIndexForClusterID.get(clusterID)) + // .filter((i) => i !== undefined) /* 0 is a valid index */ + // .flatMap((i) => clusters[i]?.faceIDs ?? []) + // .map((faceID) => faceForFaceID.get(faceID)) + // .filter((face) => !!face) + // .reduce((max, face) => + // max.score > face.score ? max : face, + // ).faceID; + // } // TODO-Cluster - Currently we're not syncing with remote or saving anything // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) // cgroup, one per cluster. - cgroups = cgroups.concat( - validClusters.map((c) => ({ - id: c.id, + + const cgroups: CGroup[] = []; + for (const cluster of sortedClusters) { + const faces = cluster.faceIDs.map((id) => + ensure(faceForFaceID.get(id)), + ); + const topFace = faces.reduce((max, face) => + max.score > face.score ? max : face, + ); + cgroups.push({ + id: cluster.id, name: undefined, - clusterIDs: [c.id], + clusterIDs: [cluster.id], isHidden: false, avatarFaceID: undefined, - displayFaceID: undefined, - })), - ); - - // For each cluster group, use the highest scoring face in any of its - // clusters as its display face. - for (const cgroup of cgroups) { - cgroup.displayFaceID = cgroup.clusterIDs - .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - .filter((i) => i !== undefined) /* 0 is a valid index */ - .flatMap((i) => clusters[i]?.faceIDs ?? []) - .map((faceID) => faceForFaceID.get(faceID)) - .filter((face) => !!face) - .reduce((max, face) => - max.score > face.score ? max : face, - ).faceID; + displayFaceID: topFace.faceID, + }); } // log.info("ml/cluster", { @@ -566,7 +588,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, ); - const clusteredCount = clusterIDForFaceID.size + const clusteredCount = clusterIDForFaceID.size; const unclusteredCount = faces.length - clusteredCount; return { diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 3f588c09ad..4248c295f0 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -396,7 +396,7 @@ export const wipClusterDebugPageContents = async (): Promise< clusterIDForFaceID, } = await worker().then((w) => w.clusterFacesHdb()); - const searchPersons = await convertToSearchPersons(clusters, cgroups); + // const searchPersons = await convertToSearchPersons(clusters, cgroups); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); @@ -422,6 +422,32 @@ export const wipClusterDebugPageContents = async (): Promise< })), })); + const clusterByID = new Map(clusters.map((c) => [c.id, c])); + + const searchPersons = cgroups + .map((cgroup) => { + const faceID = ensure(cgroup.displayFaceID); + const fileID = ensure(fileIDFromFaceID(faceID)); + const file = ensure(localFileByID.get(fileID)); + + const faceIDs = cgroup.clusterIDs + .map((id) => ensure(clusterByID.get(id))) + .flatMap((cluster) => cluster.faceIDs); + const fileIDs = faceIDs + .map((faceID) => fileIDFromFaceID(faceID)) + .filter((fileID) => fileID !== undefined); + + return { + id: cgroup.id, + name: cgroup.name, + faceIDs, + files: [...new Set(fileIDs)], + displayFaceID: faceID, + displayFaceFile: file, + }; + }) + .sort((a, b) => b.faceIDs.length - a.faceIDs.length); + _wip_isClustering = false; _wip_searchPersons = searchPersons; triggerStatusUpdate(); @@ -437,7 +463,8 @@ export const wipClusterDebugPageContents = async (): Promise< export const wipCluster = () => void wipClusterDebugPageContents(); -const convertToSearchPersons = async ( +// TODO-Cluster remove me +export const convertToSearchPersons = async ( clusters: FaceCluster[], cgroups: CGroup[], ) => { From 577b2624184a2d45a1c41bc5c86ae72c514b7a13 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Wed, 28 Aug 2024 01:12:41 +0530 Subject: [PATCH 0790/1179] fix: change sentence case for android debug builds --- mobile/android/app/src/debug/res/values/strings.xml | 2 +- mobile/android/app/src/dev/res/values/strings.xml | 2 +- mobile/android/app/src/face/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/android/app/src/debug/res/values/strings.xml b/mobile/android/app/src/debug/res/values/strings.xml index 9749285e5b..2253459b7e 100644 --- a/mobile/android/app/src/debug/res/values/strings.xml +++ b/mobile/android/app/src/debug/res/values/strings.xml @@ -1,4 +1,4 @@ - ente debug + Ente Debug backup debug diff --git a/mobile/android/app/src/dev/res/values/strings.xml b/mobile/android/app/src/dev/res/values/strings.xml index 3f5e2af1d1..50a363d10f 100644 --- a/mobile/android/app/src/dev/res/values/strings.xml +++ b/mobile/android/app/src/dev/res/values/strings.xml @@ -1,4 +1,4 @@ - ente dev + Ente Dev backup dev diff --git a/mobile/android/app/src/face/res/values/strings.xml b/mobile/android/app/src/face/res/values/strings.xml index 4932deb961..ac4281e80e 100644 --- a/mobile/android/app/src/face/res/values/strings.xml +++ b/mobile/android/app/src/face/res/values/strings.xml @@ -1,4 +1,4 @@ - ente face + Ente Face backup face From 2044d3eb6bebba5f4f55a374ef798460e2b5a37e Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Wed, 28 Aug 2024 01:13:00 +0530 Subject: [PATCH 0791/1179] chore: add translation keys --- mobile/lib/generated/intl/messages_en.dart | 3 +++ mobile/lib/generated/l10n.dart | 20 ++++++++++++++++++++ mobile/lib/l10n/intl_en.arb | 2 ++ 3 files changed, 25 insertions(+) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 0c377470aa..801ea0c58a 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -390,6 +390,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup over mobile data"), "backupSettings": MessageLookupByLibrary.simpleMessage("Backup settings"), + "backupStatus": MessageLookupByLibrary.simpleMessage("Backup status"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Items that have been backed up will show up here"), "backupVideos": MessageLookupByLibrary.simpleMessage("Backup videos"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("Black Friday Sale"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index e88b25f990..5ede242db1 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -3172,6 +3172,26 @@ class S { ); } + /// `Backup status` + String get backupStatus { + return Intl.message( + 'Backup status', + name: 'backupStatus', + desc: '', + args: [], + ); + } + + /// `Items that have been backed up will show up here` + String get backupStatusDescription { + return Intl.message( + 'Items that have been backed up will show up here', + name: 'backupStatusDescription', + desc: '', + args: [], + ); + } + /// `Backup over mobile data` String get backupOverMobileData { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index ae78fa60c3..c252714447 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -453,6 +453,8 @@ "showMemories": "Show memories", "yearsAgo": "{count, plural, one{{count} year ago} other{{count} years ago}}", "backupSettings": "Backup settings", + "backupStatus": "Backup status", + "backupStatusDescription": "Items that have been backed up will show up here", "backupOverMobileData": "Backup over mobile data", "backupVideos": "Backup videos", "disableAutoLock": "Disable auto lock", From 864b5514be07a2d0048843a69939d1bfdbd259f4 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Wed, 28 Aug 2024 01:19:44 +0530 Subject: [PATCH 0792/1179] feat(backup): introduce backup status screen --- mobile/lib/events/backup_updated_event.dart | 10 + mobile/lib/models/backup/backup_item.dart | 55 ++++++ .../lib/models/backup/backup_item_status.dart | 7 + .../ui/settings/backup/backup_item_card.dart | 171 ++++++++++++++++++ .../backup/backup_section_widget.dart | 16 ++ .../settings/backup/backup_status_screen.dart | 110 +++++++++++ mobile/lib/utils/file_uploader.dart | 63 ++++++- 7 files changed, 428 insertions(+), 4 deletions(-) create mode 100644 mobile/lib/events/backup_updated_event.dart create mode 100644 mobile/lib/models/backup/backup_item.dart create mode 100644 mobile/lib/models/backup/backup_item_status.dart create mode 100644 mobile/lib/ui/settings/backup/backup_item_card.dart create mode 100644 mobile/lib/ui/settings/backup/backup_status_screen.dart diff --git a/mobile/lib/events/backup_updated_event.dart b/mobile/lib/events/backup_updated_event.dart new file mode 100644 index 0000000000..7d710df199 --- /dev/null +++ b/mobile/lib/events/backup_updated_event.dart @@ -0,0 +1,10 @@ +import "dart:collection"; + +import "package:photos/events/event.dart"; +import "package:photos/models/backup/backup_item.dart"; + +class BackupUpdatedEvent extends Event { + final LinkedHashMap items; + + BackupUpdatedEvent(this.items); +} diff --git a/mobile/lib/models/backup/backup_item.dart b/mobile/lib/models/backup/backup_item.dart new file mode 100644 index 0000000000..02ea0c442d --- /dev/null +++ b/mobile/lib/models/backup/backup_item.dart @@ -0,0 +1,55 @@ +import "dart:async"; + +import "package:photos/models/backup/backup_item_status.dart"; +import "package:photos/models/file/file.dart"; + +class BackupItem { + final BackupItemStatus status; + final EnteFile file; + final int collectionID; + final Completer completer; + + BackupItem({ + required this.status, + required this.file, + required this.collectionID, + required this.completer, + }); + + BackupItem copyWith({ + BackupItemStatus? status, + EnteFile? file, + int? collectionID, + Completer? completer, + }) { + return BackupItem( + status: status ?? this.status, + file: file ?? this.file, + collectionID: collectionID ?? this.collectionID, + completer: completer ?? this.completer, + ); + } + + @override + String toString() { + return 'BackupItem(status: $status, file: $file, collectionID: $collectionID)'; + } + + @override + bool operator ==(covariant BackupItem other) { + if (identical(this, other)) return true; + + return other.status == status && + other.file == file && + other.collectionID == collectionID && + other.completer == completer; + } + + @override + int get hashCode { + return status.hashCode ^ + file.hashCode ^ + collectionID.hashCode ^ + completer.hashCode; + } +} diff --git a/mobile/lib/models/backup/backup_item_status.dart b/mobile/lib/models/backup/backup_item_status.dart new file mode 100644 index 0000000000..b4aedfa562 --- /dev/null +++ b/mobile/lib/models/backup/backup_item_status.dart @@ -0,0 +1,7 @@ +enum BackupItemStatus { + inBackground, + inQueue, + uploading, + completed, + retry, +} diff --git a/mobile/lib/ui/settings/backup/backup_item_card.dart b/mobile/lib/ui/settings/backup/backup_item_card.dart new file mode 100644 index 0000000000..a566fc6a4a --- /dev/null +++ b/mobile/lib/ui/settings/backup/backup_item_card.dart @@ -0,0 +1,171 @@ +import "dart:typed_data"; + +import 'package:flutter/material.dart'; +import "package:photos/models/backup/backup_item.dart"; +import "package:photos/models/backup/backup_item_status.dart"; +import 'package:photos/theme/ente_theme.dart'; +import "package:photos/utils/file_uploader.dart"; +import "package:photos/utils/thumbnail_util.dart"; + +class BackupItemCard extends StatefulWidget { + const BackupItemCard({ + super.key, + required this.item, + }); + + final BackupItem item; + + @override + State createState() => _BackupItemCardState(); +} + +class _BackupItemCardState extends State { + Uint8List? thumbnail; + String? folderName; + + @override + void initState() { + super.initState(); + _getThumbnail(); + _getFolderName(); + } + + @override + void dispose() { + super.dispose(); + } + + _getThumbnail() async { + thumbnail = await getThumbnail(widget.item.file); + setState(() {}); + } + + _getFolderName() async { + folderName = widget.item.file.deviceFolder ?? ''; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + return Container( + height: 60, + margin: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: Theme.of(context).brightness == Brightness.light + ? const Color(0xFF000000).withOpacity(0.08) + : const Color(0xFFFFFFFF).withOpacity(0.08), + width: 1, + ), + ), + child: Row( + children: [ + SizedBox( + width: 60, + height: 60, + child: ClipRRect( + borderRadius: BorderRadius.circular(4), + child: thumbnail != null + ? Image.memory( + thumbnail!, + fit: BoxFit.cover, + ) + : const SizedBox(), + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.item.file.displayName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + height: 20 / 16, + color: Theme.of(context).brightness == Brightness.light + ? const Color(0xFF000000) + : const Color(0xFFFFFFFF), + ), + ), + const SizedBox(height: 4), + Text( + folderName ?? "", + style: TextStyle( + fontSize: 14, + height: 17 / 14, + color: Theme.of(context).brightness == Brightness.light + ? const Color.fromRGBO(0, 0, 0, 0.7) + : const Color.fromRGBO(255, 255, 255, 0.7), + ), + ), + ], + ), + ), + const SizedBox(width: 12), + SizedBox( + height: 48, + width: 48, + child: Center( + child: switch (widget.item.status) { + BackupItemStatus.uploading => SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator( + strokeWidth: 2.0, + color: colorScheme.primary700, + ), + ), + BackupItemStatus.completed => const SizedBox( + width: 24, + height: 24, + child: Icon( + Icons.check, + color: Color(0xFF00B33C), + ), + ), + BackupItemStatus.inQueue => SizedBox( + width: 24, + height: 24, + child: Icon( + Icons.history, + color: Theme.of(context).brightness == Brightness.light + ? const Color.fromRGBO(0, 0, 0, .6) + : const Color.fromRGBO(255, 255, 255, .6), + ), + ), + BackupItemStatus.retry => IconButton( + icon: const Icon( + Icons.sync, + color: Color(0xFFFDB816), + ), + onPressed: () async { + await FileUploader.instance.forceUpload( + widget.item.file, + widget.item.collectionID, + ); + }, + ), + BackupItemStatus.inBackground => SizedBox( + width: 24, + height: 24, + child: Icon( + Icons.lock_reset, + color: Theme.of(context).brightness == Brightness.light + ? const Color.fromRGBO(0, 0, 0, .6) + : const Color.fromRGBO(255, 255, 255, .6), + ), + ), + }, + ), + ), + ], + ), + ); + } +} diff --git a/mobile/lib/ui/settings/backup/backup_section_widget.dart b/mobile/lib/ui/settings/backup/backup_section_widget.dart index 183b79b203..56ef0e02f7 100644 --- a/mobile/lib/ui/settings/backup/backup_section_widget.dart +++ b/mobile/lib/ui/settings/backup/backup_section_widget.dart @@ -6,6 +6,7 @@ import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart'; import 'package:photos/ui/settings/backup/backup_settings_screen.dart'; +import "package:photos/ui/settings/backup/backup_status_screen.dart"; import "package:photos/ui/settings/backup/free_space_options.dart"; import 'package:photos/ui/settings/common_settings.dart'; import 'package:photos/utils/navigation_util.dart'; @@ -47,6 +48,21 @@ class BackupSectionWidgetState extends State { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).backupStatus, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + await routeToPage( + context, + const BackupStatusScreen(), + ); + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).backupSettings, diff --git a/mobile/lib/ui/settings/backup/backup_status_screen.dart b/mobile/lib/ui/settings/backup/backup_status_screen.dart new file mode 100644 index 0000000000..4117e2c980 --- /dev/null +++ b/mobile/lib/ui/settings/backup/backup_status_screen.dart @@ -0,0 +1,110 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import "dart:collection"; + +import 'package:flutter/material.dart'; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/backup_updated_event.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/backup/backup_item.dart"; +import 'package:photos/ui/components/title_bar_title_widget.dart'; +import 'package:photos/ui/components/title_bar_widget.dart'; +import "package:photos/ui/settings/backup/backup_item_card.dart"; +import "package:photos/utils/file_uploader.dart"; + +class BackupStatusScreen extends StatefulWidget { + const BackupStatusScreen({super.key}); + + @override + State createState() => _BackupStatusScreenState(); +} + +class _BackupStatusScreenState extends State { + LinkedHashMap items = FileUploader.instance.allBackups; + + @override + void initState() { + super.initState(); + + checkBackupUpdatedEvent(); + } + + void checkBackupUpdatedEvent() { + Bus.instance.on().listen((event) { + items = event.items; + setState(() {}); + }); + } + + @override + Widget build(BuildContext context) { + final List items = this.items.values.toList(); + + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: S.of(context).backupStatus, + ), + ), + items.isEmpty + ? SliverFillRemaining( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 60, + vertical: 12, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.cloud_upload_outlined, + color: + Theme.of(context).brightness == Brightness.light + ? const Color.fromRGBO(0, 0, 0, 0.6) + : const Color.fromRGBO(255, 255, 255, 0.6), + ), + const SizedBox(height: 16), + Text( + S.of(context).backupStatusDescription, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + height: 20 / 16, + color: + Theme.of(context).brightness == Brightness.light + ? const Color(0xFF000000).withOpacity(0.7) + : const Color(0xFFFFFFFF).withOpacity(0.7), + ), + ), + const SizedBox(height: 48), + ], + ), + ), + ) + : SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 16, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (final item in items) + BackupItemCard(item: item), + ], + ), + ); + }, + childCount: 1, + ), + ), + ], + ), + ); + } +} diff --git a/mobile/lib/utils/file_uploader.dart b/mobile/lib/utils/file_uploader.dart index 6e81e5acc5..c4c8217c5e 100644 --- a/mobile/lib/utils/file_uploader.dart +++ b/mobile/lib/utils/file_uploader.dart @@ -16,11 +16,14 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/core/network/network.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/db/upload_locks_db.dart'; +import "package:photos/events/backup_updated_event.dart"; import "package:photos/events/file_uploaded_event.dart"; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/events/subscription_purchased_event.dart'; import 'package:photos/main.dart'; +import "package:photos/models/backup/backup_item.dart"; +import "package:photos/models/backup/backup_item_status.dart"; import 'package:photos/models/encryption_result.dart'; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; @@ -59,11 +62,15 @@ class FileUploader { final _enteDio = NetworkClient.instance.enteDio; final LinkedHashMap _queue = LinkedHashMap(); + final LinkedHashMap _allBackups = + LinkedHashMap(); final _uploadLocks = UploadLocksDB.instance; final kSafeBufferForLockExpiry = const Duration(days: 1).inMicroseconds; final kBGTaskDeathTimeout = const Duration(seconds: 5).inMicroseconds; final _uploadURLs = Queue(); + LinkedHashMap get allBackups => _allBackups; + // Maintains the count of files in the current upload session. // Upload session is the period between the first entry into the _queue and last entry out of the _queue int _totalCountInUploadSession = 0; @@ -160,6 +167,13 @@ class FileUploader { if (!_queue.containsKey(localID)) { final completer = Completer(); _queue[localID] = FileUploadItem(file, collectionID, completer); + _allBackups[localID] = BackupItem( + status: BackupItemStatus.inQueue, + file: file, + collectionID: collectionID, + completer: completer, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); _pollQueue(); return completer.future; } @@ -203,6 +217,10 @@ class FileUploader { }); for (final id in uploadsToBeRemoved) { _queue.remove(id)?.completer.completeError(reason); + _allBackups[id] = _allBackups[id]!.copyWith( + status: BackupItemStatus.retry, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } _totalCountInUploadSession = 0; } @@ -225,6 +243,9 @@ class FileUploader { }); for (final id in uploadsToBeRemoved) { _queue.remove(id)?.completer.completeError(reason); + _allBackups[id] = + _allBackups[id]!.copyWith(status: BackupItemStatus.retry); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } _logger.info( 'number of enteries removed from queue ${uploadsToBeRemoved.length}', @@ -291,13 +312,21 @@ class FileUploader { }, ); _queue.remove(localID)!.completer.complete(uploadedFile); + _allBackups[localID] = + _allBackups[localID]!.copyWith(status: BackupItemStatus.completed); return uploadedFile; } catch (e) { if (e is LockAlreadyAcquiredError) { _queue[localID]!.status = UploadStatus.inBackground; + _allBackups[localID] = _allBackups[localID]! + .copyWith(status: BackupItemStatus.inBackground); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); return _queue[localID]!.completer.future; } else { _queue.remove(localID)!.completer.completeError(e); + _allBackups[localID] = + _allBackups[localID]!.copyWith(status: BackupItemStatus.retry); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); return null; } } finally { @@ -406,7 +435,20 @@ class FileUploader { Future forceUpload(EnteFile file, int collectionID) async { _hasInitiatedForceUpload = true; - return _tryToUpload(file, collectionID, true); + try { + final result = await _tryToUpload(file, collectionID, true); + _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( + status: BackupItemStatus.completed, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + return result; + } catch (_) { + _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( + status: BackupItemStatus.retry, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + rethrow; + } } Future _tryToUpload( @@ -426,6 +468,14 @@ class FileUploader { return fileOnDisk; } } + + if (_allBackups[file.localID!] != null && + _allBackups[file.localID]!.status != BackupItemStatus.uploading) { + _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( + status: BackupItemStatus.uploading, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + } if ((file.localID ?? '') == '') { _logger.severe('Trying to upload file with missing localID'); return file; @@ -442,7 +492,7 @@ class FileUploader { } final String lockKey = file.localID!; - bool _isMultipartUpload = false; + bool isMultipartUpload = false; try { await _uploadLocks.acquireLock( @@ -589,7 +639,7 @@ class FileUploader { final fileUploadURL = await _getUploadURL(); fileObjectKey = await _putFile(fileUploadURL, encryptedFile); } else { - _isMultipartUpload = true; + isMultipartUpload = true; _logger.finest( "Init multipartUpload $multipartEntryExists, isUpdate $isUpdatedFile", ); @@ -757,7 +807,7 @@ class FileUploader { encryptedFilePath, encryptedThumbnailPath, lockKey: lockKey, - isMultiPartUpload: _isMultipartUpload, + isMultiPartUpload: isMultipartUpload, ); } } @@ -1280,10 +1330,15 @@ class FileUploader { if (dbFile?.uploadedFileID != null) { _logger.info("Background upload success detected"); completer?.complete(dbFile); + _allBackups[upload.key] = _allBackups[upload.key]! + .copyWith(status: BackupItemStatus.completed); } else { _logger.info("Background upload failure detected"); completer?.completeError(SilentlyCancelUploadsError()); + _allBackups[upload.key] = + _allBackups[upload.key]!.copyWith(status: BackupItemStatus.retry); } + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } } Future.delayed(kBlockedUploadsPollFrequency, () async { From 5662661326fd4c8cd62f146991cf1f6cdec88200 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Wed, 28 Aug 2024 01:22:00 +0530 Subject: [PATCH 0793/1179] fix(backup-status): limit folder name to single line --- mobile/lib/ui/settings/backup/backup_item_card.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mobile/lib/ui/settings/backup/backup_item_card.dart b/mobile/lib/ui/settings/backup/backup_item_card.dart index a566fc6a4a..e99d1ed54b 100644 --- a/mobile/lib/ui/settings/backup/backup_item_card.dart +++ b/mobile/lib/ui/settings/backup/backup_item_card.dart @@ -96,6 +96,8 @@ class _BackupItemCardState extends State { const SizedBox(height: 4), Text( folderName ?? "", + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 14, height: 17 / 14, From 325871f7c5456be01e3b32dbde964f4814562056 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Thu, 29 Aug 2024 00:53:57 +0530 Subject: [PATCH 0794/1179] fix(backup): attach reason of error, use ListView.builder, use upload instead of forceUpload --- mobile/lib/models/backup/backup_item.dart | 9 +++- .../ui/settings/backup/backup_item_card.dart | 10 ++--- .../settings/backup/backup_status_screen.dart | 13 +++--- mobile/lib/utils/file_uploader.dart | 44 ++++++++++++------- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/mobile/lib/models/backup/backup_item.dart b/mobile/lib/models/backup/backup_item.dart index 02ea0c442d..957f0f883c 100644 --- a/mobile/lib/models/backup/backup_item.dart +++ b/mobile/lib/models/backup/backup_item.dart @@ -8,12 +8,14 @@ class BackupItem { final EnteFile file; final int collectionID; final Completer completer; + final Object? error; BackupItem({ required this.status, required this.file, required this.collectionID, required this.completer, + this.error, }); BackupItem copyWith({ @@ -21,18 +23,20 @@ class BackupItem { EnteFile? file, int? collectionID, Completer? completer, + Object? error, }) { return BackupItem( status: status ?? this.status, file: file ?? this.file, collectionID: collectionID ?? this.collectionID, completer: completer ?? this.completer, + error: error ?? this.error, ); } @override String toString() { - return 'BackupItem(status: $status, file: $file, collectionID: $collectionID)'; + return 'BackupItem(status: $status, file: $file, collectionID: $collectionID, error: $error)'; } @override @@ -42,7 +46,8 @@ class BackupItem { return other.status == status && other.file == file && other.collectionID == collectionID && - other.completer == completer; + other.completer == completer && + other.error == error; } @override diff --git a/mobile/lib/ui/settings/backup/backup_item_card.dart b/mobile/lib/ui/settings/backup/backup_item_card.dart index e99d1ed54b..40be26cbdc 100644 --- a/mobile/lib/ui/settings/backup/backup_item_card.dart +++ b/mobile/lib/ui/settings/backup/backup_item_card.dart @@ -147,17 +147,17 @@ class _BackupItemCardState extends State { color: Color(0xFFFDB816), ), onPressed: () async { - await FileUploader.instance.forceUpload( + await FileUploader.instance.upload( widget.item.file, widget.item.collectionID, ); }, ), BackupItemStatus.inBackground => SizedBox( - width: 24, - height: 24, - child: Icon( - Icons.lock_reset, + width: 16, + height: 16, + child: CircularProgressIndicator( + strokeWidth: 2.0, color: Theme.of(context).brightness == Brightness.light ? const Color.fromRGBO(0, 0, 0, .6) : const Color.fromRGBO(255, 255, 255, .6), diff --git a/mobile/lib/ui/settings/backup/backup_status_screen.dart b/mobile/lib/ui/settings/backup/backup_status_screen.dart index 4117e2c980..0d7199ca47 100644 --- a/mobile/lib/ui/settings/backup/backup_status_screen.dart +++ b/mobile/lib/ui/settings/backup/backup_status_screen.dart @@ -91,12 +91,13 @@ class _BackupStatusScreenState extends State { vertical: 20, horizontal: 16, ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (final item in items) - BackupItemCard(item: item), - ], + child: ListView.builder( + shrinkWrap: true, + primary: false, + itemBuilder: (context, index) { + return BackupItemCard(item: items[index]); + }, + itemCount: items.length, ), ); }, diff --git a/mobile/lib/utils/file_uploader.dart b/mobile/lib/utils/file_uploader.dart index c4c8217c5e..0b3ee1c4bc 100644 --- a/mobile/lib/utils/file_uploader.dart +++ b/mobile/lib/utils/file_uploader.dart @@ -219,6 +219,7 @@ class FileUploader { _queue.remove(id)?.completer.completeError(reason); _allBackups[id] = _allBackups[id]!.copyWith( status: BackupItemStatus.retry, + error: reason, ); Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } @@ -243,8 +244,8 @@ class FileUploader { }); for (final id in uploadsToBeRemoved) { _queue.remove(id)?.completer.completeError(reason); - _allBackups[id] = - _allBackups[id]!.copyWith(status: BackupItemStatus.retry); + _allBackups[id] = _allBackups[id]! + .copyWith(status: BackupItemStatus.retry, error: reason); Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } _logger.info( @@ -283,6 +284,10 @@ class FileUploader { } if (pendingEntry != null) { pendingEntry.status = UploadStatus.inProgress; + _allBackups[pendingEntry.file.localID!] = + _allBackups[pendingEntry.file.localID]! + .copyWith(status: BackupItemStatus.uploading); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); _encryptAndUploadFileToCollection( pendingEntry.file, pendingEntry.collectionID, @@ -314,6 +319,7 @@ class FileUploader { _queue.remove(localID)!.completer.complete(uploadedFile); _allBackups[localID] = _allBackups[localID]!.copyWith(status: BackupItemStatus.completed); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); return uploadedFile; } catch (e) { if (e is LockAlreadyAcquiredError) { @@ -324,8 +330,8 @@ class FileUploader { return _queue[localID]!.completer.future; } else { _queue.remove(localID)!.completer.completeError(e); - _allBackups[localID] = - _allBackups[localID]!.copyWith(status: BackupItemStatus.retry); + _allBackups[localID] = _allBackups[localID]! + .copyWith(status: BackupItemStatus.retry, error: e); Bus.instance.fire(BackupUpdatedEvent(_allBackups)); return null; } @@ -435,18 +441,24 @@ class FileUploader { Future forceUpload(EnteFile file, int collectionID) async { _hasInitiatedForceUpload = true; + final isInQueue = _allBackups[file.localID!] != null; try { final result = await _tryToUpload(file, collectionID, true); - _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( - status: BackupItemStatus.completed, - ); - Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + if (isInQueue) { + _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( + status: BackupItemStatus.completed, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + } return result; - } catch (_) { - _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( - status: BackupItemStatus.retry, - ); - Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + } catch (error) { + if (isInQueue) { + _allBackups[file.localID!] = _allBackups[file.localID]!.copyWith( + status: BackupItemStatus.retry, + error: error, + ); + Bus.instance.fire(BackupUpdatedEvent(_allBackups)); + } rethrow; } } @@ -1335,8 +1347,10 @@ class FileUploader { } else { _logger.info("Background upload failure detected"); completer?.completeError(SilentlyCancelUploadsError()); - _allBackups[upload.key] = - _allBackups[upload.key]!.copyWith(status: BackupItemStatus.retry); + _allBackups[upload.key] = _allBackups[upload.key]!.copyWith( + status: BackupItemStatus.retry, + error: SilentlyCancelUploadsError(), + ); } Bus.instance.fire(BackupUpdatedEvent(_allBackups)); } From ac0ae000154889154dcc25ca87889369d59554c0 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 14:29:20 +0530 Subject: [PATCH 0795/1179] [mob][auth] Update flutter submodule to v3.24.1 --- auth/flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/flutter b/auth/flutter index 80c2e84975..5874a72aa4 160000 --- a/auth/flutter +++ b/auth/flutter @@ -1 +1 @@ -Subproject commit 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 +Subproject commit 5874a72aa4c779a02553007c47dacbefba2374dc From d413ed2de0e8bf47703ca9603be8e28a0aac9df5 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 27 Aug 2024 14:29:27 +0530 Subject: [PATCH 0796/1179] [mob][auth] Update flutter version in github workflows --- .github/workflows/auth-lint.yml | 2 +- .github/workflows/auth-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auth-lint.yml b/.github/workflows/auth-lint.yml index 4518c542da..2362d2b344 100644 --- a/.github/workflows/auth-lint.yml +++ b/.github/workflows/auth-lint.yml @@ -8,7 +8,7 @@ on: - ".github/workflows/auth-lint.yml" env: - FLUTTER_VERSION: "3.24.0" + FLUTTER_VERSION: "3.24.1" jobs: lint: diff --git a/.github/workflows/auth-release.yml b/.github/workflows/auth-release.yml index ef7a3d9192..d67cf1c7e9 100644 --- a/.github/workflows/auth-release.yml +++ b/.github/workflows/auth-release.yml @@ -29,7 +29,7 @@ on: - "auth-v*" env: - FLUTTER_VERSION: "3.24.0" + FLUTTER_VERSION: "3.24.1" jobs: build-ubuntu: From d5a1187e13a20c3c58d73b01314eb3447ce14843 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Thu, 29 Aug 2024 20:33:18 +0530 Subject: [PATCH 0797/1179] Prep --- web/apps/photos/src/pages/cluster-debug.tsx | 24 +++++++++----- .../new/photos/components/MLSettings.tsx | 15 +++++---- .../new/photos/services/ml/cluster-new.ts | 32 +++++++++---------- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index db187751de..fcbeadfcab 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -49,14 +49,22 @@ export default function ClusterDebug() { } return ( <> - - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} - - - Showing only top 20 and bottom 10 clusters (and only up to 50 - faces in each, sorted by cosine distance to highest scoring face - in the cluster). - + + + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} + + + Showing only top 30 and bottom 30 clusters. + + + For each cluster showing only up to 50 faces, sorted by + cosine similarity to highest scoring face in the cluster. + + + Below each face is its{" "} + blur - score - cosineSimilarity - direction + +
diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index eeff4d1be8..c8785110b6 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -8,7 +8,6 @@ import { enableML, mlStatusSnapshot, mlStatusSubscribe, - wipCluster, wipClusterEnable, type MLStatus, } from "@/new/photos/services/ml"; @@ -341,7 +340,7 @@ const ManageML: React.FC = ({ // TODO-Cluster const router = useRouter(); - const wipClusterNow = () => wipCluster(); + // const wipClusterNow = () => wipCluster(); const wipClusterShowNow = () => router.push("/cluster-debug"); return ( @@ -391,18 +390,20 @@ const ManageML: React.FC = ({ )} - {showClusterOpt && ( + {/* {showClusterOpt && ( = ({ )} /> - )} + )} */} ); }; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index df97ca4bd9..d6e1dc505a 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -348,14 +348,13 @@ function* enumerateFaces(faceIndices: FaceIndex[]) { } } -export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { +export const clusterFacesHdb = (faceIndexes: FaceIndex[]) => { const t = Date.now(); // A flattened array of faces. // TODO-Cluster ad-hoc filtering and slicing - const faces0 = [...enumerateFaces(faceIndexes)] - .filter((f) => f.blur > 99) - .slice(0, 6000); + const faces0 = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); + // .slice(0, 6000); // TODO-Cluster testing code, can be removed once done const faces = Array(1) .fill(0) @@ -386,27 +385,28 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // be list of existing clusters we fetch from remote. const clusters: FaceCluster[] = []; - // Process the faces in batches of 10k. The faces are already sorted by file - // ID, which is a monotonically increasing integer, so we will also have - // some temporal locality. + // Process the faces in batches. The faces are already sorted by file ID, + // which is a monotonically increasing integer, so we will also have some + // temporal locality. // - // The number 10k was derived by ad-hoc observations. On a particular test - // dataset, clustering 10k took ~2 mins, while 20k took ~8 mins. Memory - // usage was constant in both cases. + // The number 2500 was derived by ad-hoc observations and takes a few + // seconds. On a particular test dataset and a particular machine, + // clustering 1k took ~2 seconds, 10k took ~2 mins, while 20k took ~8 mins. + // Memory usage was constant in all these cases. // // At around 100k faces, the clustering starts taking hours, and we start // running into stack overflows. The stack overflows can perhaps be avoided // by restructuring the code, but hours of uninterruptible work is anyways // not feasible. - // const batchSize = 10_000; // TODO-Cluster - const batchSize = 1_000; + const batchSize = 2500; for (let i = 0; i < faceEmbeddings.length; i += batchSize) { + const it = Date.now(); const embeddings = faceEmbeddings.slice(i, i + batchSize); const { clusters: hdbClusters } = clusterFacesHdbscan(embeddings); log.info( - `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - t} ms)`, + `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - it} ms)`, ); // Merge the new clusters we got from hdbscan into the existing clusters @@ -489,7 +489,7 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { // Convert into the data structure we're using to debug/visualize. // - // > Showing only top 20 and bottom 10 clusters (and only up to 50 faces in + // > Showing only top 30 and bottom 30 clusters (and only up to 50 faces in // > each, sorted by cosine distance to highest scoring face in the // > cluster). @@ -497,9 +497,9 @@ export const clusterFacesHdb = async (faceIndexes: FaceIndex[]) => { (a, b) => b.faceIDs.length - a.faceIDs.length, ); const debugClusters = - sortedClusters.length < 30 + sortedClusters.length < 60 ? sortedClusters - : sortedClusters.slice(0, 20).concat(sortedClusters.slice(-10)); + : sortedClusters.slice(0, 30).concat(sortedClusters.slice(-30)); const clusterPreviews: ClusterPreview[] = []; for (const cluster of debugClusters) { const faces = cluster.faceIDs.map((id) => From be3a7093354e8e40096f8640da5c74f6b2047ace Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:26:03 +0530 Subject: [PATCH 0798/1179] [server] Use nanoId as reqID --- server/cmd/museum/main.go | 10 +++++++++- server/ente/base/id.go | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 234b0435bf..531b720ee3 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -5,6 +5,7 @@ import ( "database/sql" b64 "encoding/base64" "fmt" + "github.com/ente-io/museum/ente/base" "github.com/ente-io/museum/pkg/controller/file_copy" "github.com/ente-io/museum/pkg/controller/filedata" "net/http" @@ -361,7 +362,14 @@ func main() { server.Use(p.HandlerFunc()) // note: the recover middleware must be in the last - server.Use(requestid.New(), middleware.Logger(urlSanitizer), cors(), gzip.Gzip(gzip.DefaultCompression), middleware.PanicRecover()) + + server.Use(requestid.New( + requestid.Config{ + Generator: func() string { + return base.ServerReqID() + }, + }), + middleware.Logger(urlSanitizer), cors(), gzip.Gzip(gzip.DefaultCompression), middleware.PanicRecover()) publicAPI := server.Group("/") publicAPI.Use(rateLimiter.GlobalRateLimiter(), rateLimiter.APIRateLimitMiddleware(urlSanitizer)) diff --git a/server/ente/base/id.go b/server/ente/base/id.go index f6579a05c6..559bc41542 100644 --- a/server/ente/base/id.go +++ b/server/ente/base/id.go @@ -3,6 +3,7 @@ package base import ( "errors" "fmt" + "github.com/google/uuid" "github.com/matoous/go-nanoid/v2" ) @@ -28,3 +29,12 @@ func NewID(prefix string) (*string, error) { result := fmt.Sprintf("%s_%s", prefix, id) return &result, nil } + +func ServerReqID() string { + // Generate a nanoid with a custom alphabet and length of 22 + id, err := NewID("ser") + if err != nil { + return "ser_" + uuid.New().String() + } + return *id +} From dc6fde9f77c5afcbf24982d6d1b85fc013c8c836 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 29 Aug 2024 19:17:33 +0530 Subject: [PATCH 0799/1179] [mob][photos] Fix: audio not playing on iOS when in silent mode --- mobile/ios/Podfile.lock | 2 +- mobile/ios/Runner/AppDelegate.swift | 28 ++++++++++++++++++++++++++- mobile/lib/audio_session_handler.dart | 16 +++++++++++++++ mobile/lib/main.dart | 5 +++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 mobile/lib/audio_session_handler.dart diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 8ebcc2c8fe..c40e47d7ab 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -472,7 +472,7 @@ SPEC CHECKSUMS: image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43 image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 - integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift index 9824022683..3f14877d91 100644 --- a/mobile/ios/Runner/AppDelegate.swift +++ b/mobile/ios/Runner/AppDelegate.swift @@ -1,7 +1,8 @@ import Flutter import UIKit +import AVFoundation -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, @@ -12,11 +13,36 @@ import UIKit UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate } + let controller : FlutterViewController = window?.rootViewController as! FlutterViewController + let audioSessionChannel = FlutterMethodChannel(name: "io.ente.frame/audio_session", + binaryMessenger: controller.binaryMessenger) + + audioSessionChannel.setMethodCallHandler({ + (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + if call.method == "setAudioSessionCategory" { + self.setAudioSessionCategory(result: result) + } else { + result(FlutterMethodNotImplemented) + } + }) + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } + private func setAudioSessionCategory(result: @escaping FlutterResult) { + do { + try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .defaultToSpeaker]) + try AVAudioSession.sharedInstance().setActive(true) + result(nil) + } catch { + result(FlutterError(code: "AUDIO_SESSION_ERROR", + message: "Failed to set audio session category", + details: error.localizedDescription)) + } + } + override func applicationDidBecomeActive(_ application: UIApplication) { signal(SIGPIPE, SIG_IGN) } diff --git a/mobile/lib/audio_session_handler.dart b/mobile/lib/audio_session_handler.dart new file mode 100644 index 0000000000..8aede31b12 --- /dev/null +++ b/mobile/lib/audio_session_handler.dart @@ -0,0 +1,16 @@ +import "package:flutter/services.dart"; +import "package:logging/logging.dart"; + +class AudioSessionHandler { + static final _logger = Logger("AudioSessionHandler"); + static const MethodChannel _channel = + MethodChannel('io.ente.frame/audio_session'); + + static Future setAudioSessionCategory() async { + try { + await _channel.invokeMethod('setAudioSessionCategory'); + } on PlatformException catch (e) { + _logger.warning("Failed to set audio session category: '${e.message}'."); + } + } +} diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 09126649df..c2c3a38fa6 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -14,6 +14,7 @@ import 'package:logging/logging.dart'; import "package:media_kit/media_kit.dart"; import 'package:path_provider/path_provider.dart'; import 'package:photos/app.dart'; +import "package:photos/audio_session_handler.dart"; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/error-reporting/super_logging.dart'; @@ -73,6 +74,10 @@ const kFGTaskDeathTimeoutInMicroseconds = 5000000; void main() async { debugRepaintRainbowEnabled = false; WidgetsFlutterBinding.ensureInitialized(); + //For audio to work on vidoes in iOS when in silent mode. + if (Platform.isIOS) { + unawaited(AudioSessionHandler.setAudioSessionCategory()); + } MediaKit.ensureInitialized(); final savedThemeMode = await AdaptiveTheme.getThemeMode(); From 3feac9f0b40d65e1ce2c64d363af75c6e59a7c9d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:16:08 +0530 Subject: [PATCH 0800/1179] [mob] Bump version v0.9.31 --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/pubspec.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 801ea0c58a..9eaa0d5e5e 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -504,7 +504,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Confirm Account Deletion"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Yes, I want to permanently delete this account and all its data."), + "Yes, I want to permanently delete this account and its data across all apps."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Confirm password"), "confirmPlanChange": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 5ede242db1..e12296fb2c 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -170,10 +170,10 @@ class S { ); } - /// `Yes, I want to permanently delete this account and all its data.` + /// `Yes, I want to permanently delete this account and its data across all apps.` String get confirmDeletePrompt { return Intl.message( - 'Yes, I want to permanently delete this account and all its data.', + 'Yes, I want to permanently delete this account and its data across all apps.', name: 'confirmDeletePrompt', desc: '', args: [], diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b13a3237f0..1852638d13 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.30+930 +version: 0.9.31+931 publish_to: none environment: From d374960c353a073c35e4893e5d1c2215ed4c9f81 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 13:18:57 +0530 Subject: [PATCH 0801/1179] Tweak the debugging panel --- web/apps/photos/src/pages/gallery/index.tsx | 12 +++------- .../new/photos/components/MLSettings.tsx | 22 +++---------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/web/apps/photos/src/pages/gallery/index.tsx b/web/apps/photos/src/pages/gallery/index.tsx index 1876fca7f4..74273eb014 100644 --- a/web/apps/photos/src/pages/gallery/index.tsx +++ b/web/apps/photos/src/pages/gallery/index.tsx @@ -6,10 +6,7 @@ import { getLocalFiles, getLocalTrashedFiles, } from "@/new/photos/services/files"; -import { - wipClusterEnable, - wipHasSwitchedOnceCmpAndSet, -} from "@/new/photos/services/ml"; +import { wipHasSwitchedOnceCmpAndSet } from "@/new/photos/services/ml"; import { EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; import { CenteredFlex } from "@ente/shared/components/Container"; @@ -677,11 +674,8 @@ export default function Gallery() { // TODO-Cluster if (process.env.NEXT_PUBLIC_ENTE_WIP_CL_AUTO) { setTimeout(() => { - if (!wipHasSwitchedOnceCmpAndSet()) { - void wipClusterEnable().then( - (y) => y && router.push("cluster-debug"), - ); - } + if (!wipHasSwitchedOnceCmpAndSet()) + router.push("cluster-debug"); }, 2000); } }, []); diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index c8785110b6..dde90b5368 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -340,8 +340,7 @@ const ManageML: React.FC = ({ // TODO-Cluster const router = useRouter(); - // const wipClusterNow = () => wipCluster(); - const wipClusterShowNow = () => router.push("/cluster-debug"); + const wipClusterDebug = () => router.push("/cluster-debug"); return ( @@ -393,31 +392,16 @@ const ManageML: React.FC = ({ label={ut( "Create clusters • internal only option", )} - onClick={wipClusterShowNow} + onClick={wipClusterDebug} /> )} - {/* {showClusterOpt && ( - - - - - - - )} */} ); }; From ed1970b6d81cc0702fba60ed69b6b7bd2cabb7c5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:51:43 +0530 Subject: [PATCH 0802/1179] [docs] Add troubleshooting guide for auth --- docs/docs/.vitepress/sidebar.ts | 9 ++++ .../auth/troubleshooting/windows-login.md | 43 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 docs/docs/auth/troubleshooting/windows-login.md diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 62b3cedf87..35eac00fd5 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -205,6 +205,15 @@ export const sidebar = [ }, ], }, + { + text: "Troubleshooting", + items: [ + { + text: "Windows login", + link: "/auth/troubleshooting/windows-login", + }, + ], + }, ], }, { diff --git a/docs/docs/auth/troubleshooting/windows-login.md b/docs/docs/auth/troubleshooting/windows-login.md new file mode 100644 index 0000000000..2a990fc7af --- /dev/null +++ b/docs/docs/auth/troubleshooting/windows-login.md @@ -0,0 +1,43 @@ +--- +title: Unable to login on Windows Desktop +description: + Troubleshooting when you are not able to login or register on Ente Auth app on Windows +--- + + + +# Windows Login Error + + +### HandshakeException: Handshake error in client + +This error usually happens when the Trusted Root certificates on your Windows machine are outdated. + +To update the Trusted Root Certificates on Windows, you can use the `certutil` command. Here are the steps to do so: + +1. **Open Command Prompt as Administrator**: + - Press `Windows + X` and select `Command Prompt (Admin)` or `Windows PowerShell (Admin)`. + +2. **Run the following command to update the root certificates**: + ```bash + certutil -generateSSTFromWU roots.sst + ``` + This command will generate a file named `roots.sst` that contains the latest root certificates from Windows Update. + +3. **Install the new root certificates**: + ```bash + certutil -addstore -f ROOT roots.sst + ``` + This command will add the certificates from the `roots.sst` file to the Trusted Root Certification Authorities store. + +4. **Clean up**: + After the installation, you can delete the `roots.sst` file if you no longer need it: + ```bash + del roots.sst + ``` + +Make sure to restart your application after updating the certificates to ensure the changes take effect. + +If the above steps don't resolve the issue, please follow [this guide](https://woshub.com/updating-trusted-root-certificates-in-windows-10/#h2_3) to update your trusted root certicates, and try again. + + From ed3d8b984e721de8902b66549cdbafa8c1012a91 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 15:09:53 +0530 Subject: [PATCH 0803/1179] Scrollable header --- web/apps/photos/src/pages/cluster-debug.tsx | 221 +++++++++++--------- 1 file changed, 117 insertions(+), 104 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index fcbeadfcab..d1ab0342b0 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -2,10 +2,8 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; import { faceCrop, - wipClusterDebugPageContents, type ClusterDebugPageContents, type ClusterPreviewFaceWF, - type ClusterPreviewWF, } from "@/new/photos/services/ml"; import { faceDirection } from "@/new/photos/services/ml/face"; import { @@ -24,56 +22,18 @@ import { VariableSizeList } from "react-window"; // TODO-Cluster Temporary component for debugging export default function ClusterDebug() { - const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const [clusterRes, setClusterRes] = useState< - ClusterDebugPageContents | undefined - >(); + const { showNavBar } = useContext(AppContext); useEffect(() => { showNavBar(true); - cluster(); }, []); - const cluster = async () => { - startLoading(); - setClusterRes(await wipClusterDebugPageContents()); - finishLoading(); - }; - - if (!clusterRes) { - return ( - - - - ); - } return ( <> - - - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} - - - Showing only top 30 and bottom 30 clusters. - - - For each cluster showing only up to 50 faces, sorted by - cosine similarity to highest scoring face in the cluster. - - - Below each face is its{" "} - blur - score - cosineSimilarity - direction - - -
{({ height, width }) => ( - + )} @@ -101,6 +61,7 @@ const Options: React.FC = () => { const Container = styled("div")` display: block; + border: 1px solid tomato; flex: 1; width: 100%; flex-wrap: wrap; @@ -110,21 +71,36 @@ const Container = styled("div")` } `; -interface ClusterPhotoListProps { +interface ClusterListProps { height: number; width: number; - clusterRes: ClusterDebugPageContents; } -const ClusterPhotoList: React.FC = ({ - height, - width, - clusterRes, -}) => { - const { clusterPreviewWFs, clusterIDForFaceID } = clusterRes; - const [itemList, setItemList] = useState([]); +const ClusterList: React.FC = ({ height, width }) => { + const { startLoading, finishLoading } = useContext(AppContext); + + const [clusterRes, setClusterRes] = useState< + ClusterDebugPageContents | undefined + >(); + const [items, setItems] = useState([]); const listRef = useRef(null); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const cluster = async () => { + startLoading(); + // setClusterRes(await wipClusterDebugPageContents()); + setClusterRes({ + clusteredCount: 1, + unclusteredCount: 2, + clusterPreviewWFs: Array(100) + .fill(0) + .map(() => ({ clusterSize: 0, faces: [] })), + clusters: [], + clusterIDForFaceID: new Map(), + }); + finishLoading(); + }; + const columns = useMemo( () => Math.max(Math.floor(getFractionFittableColumns(width)), 4), [width], @@ -134,36 +110,40 @@ const ClusterPhotoList: React.FC = ({ const listItemHeight = 120 * shrinkRatio + 24 + 4; useEffect(() => { - setItemList(itemListFromClusterPreviewWFs(clusterPreviewWFs, columns)); - }, [columns, clusterPreviewWFs]); + setItems(clusterRes ? itemsFromClusterRes(clusterRes, columns) : []); + }, [columns, clusterRes]); useEffect(() => { listRef.current?.resetAfterIndex(0); - }, [itemList]); + }, [items]); - const getItemSize = (i: number) => - Array.isArray(itemList[i]) ? listItemHeight : 36; + const clusterIDForFaceID = clusterRes?.clusterIDForFaceID; - const generateKey = (i: number) => - Array.isArray(itemList[i]) - ? `${itemList[i][0].enteFile.id}/${itemList[i][0].face.faceID}-${itemList[i].slice(-1)[0].enteFile.id}/${itemList[i].slice(-1)[0].face.faceID}-${i}` - : `${itemList[i]}-${i}`; + const getItemSize = (index: number) => + index === 0 + ? 100 + : Array.isArray(items[index - 1]) + ? listItemHeight + : 36; return ( - {({ index, style, data }) => { - const { itemList, columns, shrinkRatio } = data; - const item = itemList[index]; + {({ index, style }) => { + if (index === 0) + return ( +
+
+
+ ); + + const item = items[index - 1]; return ( = ({ ); }; -// type ItemListItem = Face | FaceFileNeighbour[]; -type ItemListItem = number | ClusterPreviewFaceWF[]; +type Item = number | ClusterPreviewFaceWF[]; -const itemListFromClusterPreviewWFs = ( - clusterPreviewWFs: ClusterPreviewWF[], +const itemsFromClusterRes = ( + clusterRes: ClusterDebugPageContents, columns: number, ) => { - const result: ItemListItem[] = []; + const { clusterPreviewWFs } = clusterRes; + + const result: Item[] = []; for (let index = 0; index < clusterPreviewWFs.length; index++) { const { clusterSize, faces } = clusterPreviewWFs[index]; result.push(clusterSize); @@ -219,9 +200,69 @@ const getShrinkRatio = (width: number, columns: number) => (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / (columns * 120); +const ListContainer = styled(Box, { + shouldForwardProp: (propName) => propName != "shrinkRatio", +})<{ + columns: number; + shrinkRatio: number; +}>` + display: grid; + grid-template-columns: ${({ columns, shrinkRatio }) => + `repeat(${columns},${120 * shrinkRatio}px)`}; + grid-column-gap: 4px; + width: 100%; + padding: 4px; +`; + +const ListItemContainer = styled(FlexWrapper)<{ span: number }>` + grid-column: span ${(props) => props.span}; +`; + +const LabelContainer = styled(ListItemContainer)` + color: ${({ theme }) => theme.colors.text.muted}; + height: 32px; +`; + +const ListItem = styled("div")` + display: flex; + justify-content: center; +`; + +interface HeaderProps { + clusterRes: ClusterDebugPageContents | undefined; +} + +const Header: React.FC = ({ clusterRes }) => { + if (!clusterRes) return ; + return ( + + + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} + + + Showing only top 30 and bottom 30 clusters. + + + For each cluster showing only up to 50 faces, sorted by cosine + similarity to highest scoring face in the cluster. + + + Below each face is its{" "} + blur - score - cosineSimilarity - direction + + + ); +}; + +const Loader = () => ( + + + +); + interface FaceItemProps { faceWF: ClusterPreviewFaceWF; - clusterIDForFaceID: Map; + clusterIDForFaceID: Map | undefined; } const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { @@ -250,7 +291,7 @@ const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { return ( @@ -292,31 +333,3 @@ const outlineForCluster = (clusterID: string | undefined) => const hForID = (id: string) => ([...id].reduce((s, c) => s + c.charCodeAt(0), 0) % 10) * 36; - -const ListContainer = styled(Box, { - shouldForwardProp: (propName) => propName != "shrinkRatio", -})<{ - columns: number; - shrinkRatio: number; -}>` - display: grid; - grid-template-columns: ${({ columns, shrinkRatio }) => - `repeat(${columns},${120 * shrinkRatio}px)`}; - grid-column-gap: 4px; - width: 100%; - padding: 4px; -`; - -const ListItemContainer = styled(FlexWrapper)<{ span: number }>` - grid-column: span ${(props) => props.span}; -`; - -const LabelContainer = styled(ListItemContainer)` - color: ${({ theme }) => theme.colors.text.muted}; - height: 32px; -`; - -const ListItem = styled("div")` - display: flex; - justify-content: center; -`; From 657f27822c210c7d03a55426a2af791c1491e9db Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 15:21:28 +0530 Subject: [PATCH 0804/1179] form 1 --- web/apps/photos/src/pages/cluster-debug.tsx | 39 ++++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index d1ab0342b0..6f6e9d4c23 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -6,6 +6,7 @@ import { type ClusterPreviewFaceWF, } from "@/new/photos/services/ml"; import { faceDirection } from "@/new/photos/services/ml/face"; +import { wait } from "@/utils/promise"; import { FlexWrapper, FluidContainer, @@ -14,6 +15,7 @@ import { import EnteSpinner from "@ente/shared/components/EnteSpinner"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; import { Box, IconButton, Stack, styled, Typography } from "@mui/material"; +import { useFormik } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; @@ -76,6 +78,12 @@ interface ClusterListProps { width: number; } +interface ClusteringOpts { + method: "hdbscan"; + batchSize: number; + joinThreshold: number; +} + const ClusterList: React.FC = ({ height, width }) => { const { startLoading, finishLoading } = useContext(AppContext); @@ -86,9 +94,11 @@ const ClusterList: React.FC = ({ height, width }) => { const listRef = useRef(null); // eslint-disable-next-line @typescript-eslint/no-unused-vars - const cluster = async () => { + const cluster = async (opts: ClusteringOpts) => { startLoading(); // setClusterRes(await wipClusterDebugPageContents()); + console.log(opts); + await wait(5000); setClusterRes({ clusteredCount: 1, unclusteredCount: 2, @@ -139,7 +149,10 @@ const ClusterList: React.FC = ({ height, width }) => { if (index === 0) return (
-
+
void cluster(opts)} + />
); @@ -230,12 +243,26 @@ const ListItem = styled("div")` interface HeaderProps { clusterRes: ClusterDebugPageContents | undefined; + onCluster: (opts: ClusteringOpts) => void; } -const Header: React.FC = ({ clusterRes }) => { - if (!clusterRes) return ; - return ( +const Header: React.FC = ({ clusterRes, onCluster }) => { + const formik = useFormik({ + initialValues: { + method: "hdbscan", + batchSize: 2500, + joinThreshold: 0.7, + }, + onSubmit: onCluster, + }); + + const clusterInfo = !clusterRes ? ( + + ) : ( +
+ +
{`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} @@ -252,6 +279,8 @@ const Header: React.FC = ({ clusterRes }) => {
); + + return
{clusterInfo}
; }; const Loader = () => ( From d9ca47914d0b25f8381c1f2f0caf0dc06ea49277 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Fri, 30 Aug 2024 15:23:26 +0530 Subject: [PATCH 0805/1179] Add FAQ about shared item organization --- docs/docs/photos/features/share.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/docs/photos/features/share.md b/docs/docs/photos/features/share.md index a1b9be376a..076b5546e1 100644 --- a/docs/docs/photos/features/share.md +++ b/docs/docs/photos/features/share.md @@ -57,6 +57,26 @@ If you wish to collect photos from folks who are not Ente, you can do so with our Links. Simply tick the box that says "Allow uploads", and anyone who has access to the link will be able to add photos to your album. +## Organization + +You can favorite items that have been shared with you, and organize them into +your own albums. + +When you perform these operations, Ente will create a hard copy of these items, +that you fully own. This means, these copied items will count against your +storage space. + +We understand there are use cases where this approach will consume extra space +(for eg. if you are organizing photos of a family member). We chose hard copies +as a first version to avoid complexities regarding the ownership of shared +items, in case the original owner were to delete it from their own library. + +We plan to tackle these complexities in the future, by copying a reference to +the item that was shared, instead of the actual file, so that your storage will +only get consumed if the original owner deletes it from their library. If this +sounds useful to you, please participate in [this +discussion](https://github.com/ente-io/ente/discussions/790). + ## Technical details More details, including technical aspect about how the sharing features were From 91646a809b1429cd16c4e1232dac2b618199813f Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 30 Aug 2024 12:07:06 +0200 Subject: [PATCH 0806/1179] [mob][photos] Actual logging in ML Computer --- mobile/lib/services/machine_learning/ml_computer.dart | 4 ++++ .../semantic_search/clip/clip_text_encoder.dart | 4 +++- mobile/lib/utils/image_ml_util.dart | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index afbd511c62..8f27dfb3d4 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -4,7 +4,9 @@ import 'dart:isolate'; import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; +import "package:flutter/foundation.dart" show kDebugMode; import "package:logging/logging.dart"; +import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/models/ml/face/box.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; @@ -59,6 +61,8 @@ class MLComputer { @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { + Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; + Logger.root.onRecord.listen(SuperLogging.onLogRecord); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart index ff75a9028e..cd59fd1aa5 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_text_encoder.dart @@ -56,7 +56,9 @@ class ClipTextEncoder extends MlModel { final embedding = (outputs[0]?.value as List>)[0]; inputOrt.release(); runOptions.release(); - outputs.forEach((element) => element?.release()); + for (var element in outputs) { + element?.release(); + } normalizeEmbedding(embedding); return embedding; } diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index ee259dd8af..e8eb3e7312 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -150,8 +150,8 @@ Future> generateFaceThumbnailsUsingCanvas( await Future.wait(futureFaceThumbnails); return faceThumbnails; } catch (e) { - log('[ImageMlUtils] Error generating face thumbnails: $e'); - log('[ImageMlUtils] cropImage problematic input argument: ${faceBoxes[i]}'); + _logger.severe('Error generating face thumbnails: $e'); + _logger.severe('cropImage problematic input argument: ${faceBoxes[i]}'); return []; } } From df3ba8697736c1192f4976452f9cfca2ec00e36c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:27:18 +0530 Subject: [PATCH 0807/1179] Update build file --- mobile/ios/Podfile.lock | 2 +- mobile/pubspec.lock | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index c40e47d7ab..8ebcc2c8fe 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -472,7 +472,7 @@ SPEC CHECKSUMS: image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43 image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index 0223bc5236..7388ae92f2 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -1297,18 +1297,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -1441,10 +1441,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" media_extension: dependency: "direct main" description: @@ -1529,10 +1529,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mgrs_dart: dependency: transitive description: @@ -1901,10 +1901,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: @@ -2410,26 +2410,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.2" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.0" timezone: dependency: transitive description: @@ -2708,10 +2708,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" volume_controller: dependency: transitive description: From e243a914e9ca081ee6263a5ec636618dcebf1549 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:31:17 +0530 Subject: [PATCH 0808/1179] [mob] Show backup status on status_bar tap --- mobile/lib/ui/home/status_bar_widget.dart | 12 +++++++++++- .../settings/backup/backup_section_widget.dart | 16 ---------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index 8df1a90242..461a92a1c9 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -16,6 +16,7 @@ import 'package:photos/ui/account/verify_recovery_page.dart'; import 'package:photos/ui/components/home_header_widget.dart'; import 'package:photos/ui/components/notification_widget.dart'; import 'package:photos/ui/home/header_error_widget.dart'; +import "package:photos/ui/settings/backup/backup_status_screen.dart"; import 'package:photos/utils/navigation_util.dart'; const double kContainerHeight = 36; @@ -90,7 +91,16 @@ class _StatusBarWidgetState extends State { centerWidget: _showStatus ? _showErrorBanner ? const Text("ente", style: brandStyleMedium) - : const SyncStatusWidget() + : GestureDetector( + onTap: () { + routeToPage( + context, + const BackupStatusScreen(), + forceCustomPageRoute: true, + ).ignore(); + }, + child: const SyncStatusWidget(), + ) : const Text("ente", style: brandStyleMedium), ), _showErrorBanner diff --git a/mobile/lib/ui/settings/backup/backup_section_widget.dart b/mobile/lib/ui/settings/backup/backup_section_widget.dart index 56ef0e02f7..183b79b203 100644 --- a/mobile/lib/ui/settings/backup/backup_section_widget.dart +++ b/mobile/lib/ui/settings/backup/backup_section_widget.dart @@ -6,7 +6,6 @@ import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart'; import 'package:photos/ui/settings/backup/backup_settings_screen.dart'; -import "package:photos/ui/settings/backup/backup_status_screen.dart"; import "package:photos/ui/settings/backup/free_space_options.dart"; import 'package:photos/ui/settings/common_settings.dart'; import 'package:photos/utils/navigation_util.dart'; @@ -48,21 +47,6 @@ class BackupSectionWidgetState extends State { }, ), sectionOptionSpacing, - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).backupStatus, - ), - pressedColor: getEnteColorScheme(context).fillFaint, - trailingIcon: Icons.chevron_right_outlined, - trailingIconIsMuted: true, - onTap: () async { - await routeToPage( - context, - const BackupStatusScreen(), - ); - }, - ), - sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).backupSettings, From 6da1f892ceefa5fbb1ecb1051536b99516ed93c0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:33:26 +0530 Subject: [PATCH 0809/1179] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 1852638d13..9188a87ea9 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.31+931 +version: 0.9.32+932 publish_to: none environment: From 1b1f54feb0cf1472e933bf4915caa96d860cae2b Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 30 Aug 2024 12:22:58 +0200 Subject: [PATCH 0810/1179] [mob][photos] Actual logging in cluster isolate --- .../face_clustering_service.dart | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index d37a8821f9..66fa306dcd 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -8,6 +8,7 @@ import "package:flutter/foundation.dart" show kDebugMode; import "package:logging/logging.dart"; import "package:ml_linalg/dtype.dart"; import "package:ml_linalg/vector.dart"; +import "package:photos/core/error-reporting/super_logging.dart"; import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/models/base/id.dart"; import "package:photos/services/machine_learning/face_ml/face_clustering/face_db_info_for_clustering.dart"; @@ -118,6 +119,8 @@ class FaceClusteringService { /// The main execution function of the isolate. static void _isolateMain(SendPort mainSendPort) async { + Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; + Logger.root.onRecord.listen(SuperLogging.onLogRecord); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); @@ -407,6 +410,8 @@ class FaceClusteringService { } } +final _logger = Logger("FaceLinearClustering"); + ClusteringResult _runLinearClustering(Map args) { // final input = args['input'] as Map; final input = args['input'] as Set; @@ -419,8 +424,8 @@ ClusteringResult _runLinearClustering(Map args) { final oldClusterSummaries = args['oldClusterSummaries'] as Map?; - log( - "[ClusterIsolate] ${DateTime.now()} Copied to isolate ${input.length} faces", + _logger.info( + "Copied to isolate ${input.length} faces", ); // Organize everything into a list of FaceInfo objects @@ -470,14 +475,11 @@ ClusteringResult _runLinearClustering(Map args) { } } final alreadyClusteredCount = facesWithClusterID.length; + final newToClusterCount = facesWithoutClusterID.length; final sortedFaceInfos = []; sortedFaceInfos.addAll(facesWithClusterID); sortedFaceInfos.addAll(facesWithoutClusterID); - log( - "[ClusterIsolate] ${DateTime.now()} Clustering ${facesWithoutClusterID.length} new faces without clusterId, and $alreadyClusteredCount faces with clusterId", - ); - // Make sure the first face has a clusterId final int totalFaces = sortedFaceInfos.length; int dynamicThresholdCount = 0; @@ -487,8 +489,8 @@ ClusteringResult _runLinearClustering(Map args) { } // Start actual clustering - log( - "[ClusterIsolate] ${DateTime.now()} Processing $totalFaces faces in total in this round ${offset != null ? "on top of ${offset + facesWithClusterID.length} earlier processed faces" : ""}", + _logger.info( + "[ClusterIsolate] ${DateTime.now()} Processing $totalFaces faces ($newToClusterCount new, $alreadyClusteredCount already done) in total in this round ${offset != null ? "on top of ${offset + facesWithClusterID.length} earlier processed faces" : ""}", ); // set current epoch time as clusterID String clusterID = newClusterID(); @@ -517,7 +519,7 @@ ClusteringResult _runLinearClustering(Map args) { thresholdValue = distanceThreshold; } if (i % 250 == 0) { - log("[ClusterIsolate] ${DateTime.now()} Processed ${offset != null ? i + offset : i} faces"); + _logger.info("Processed ${offset != null ? i + offset : i} faces"); } // WARNING: The loop below is now O(n^2) so be very careful with anything you put in there! for (int j = i - 1; j >= 0; j--) { @@ -536,8 +538,8 @@ ClusteringResult _runLinearClustering(Map args) { if (closestDistance < thresholdValue) { if (sortedFaceInfos[closestIdx].clusterId == null) { // Ideally this should never happen, but just in case log it - log( - " [ClusterIsolate] [WARNING] ${DateTime.now()} Found new cluster $clusterID", + _logger.severe( + "Found new cluster $clusterID, but closest face has no clusterId", ); clusterID = newClusterID(); sortedFaceInfos[closestIdx].clusterId = clusterID; @@ -568,12 +570,12 @@ ClusteringResult _runLinearClustering(Map args) { } stopwatchClustering.stop(); - log( - ' [ClusterIsolate] ${DateTime.now()} Clustering for ${sortedFaceInfos.length} embeddings executed in ${stopwatchClustering.elapsedMilliseconds}ms', + _logger.info( + 'Clustering for ${sortedFaceInfos.length} embeddings executed in ${stopwatchClustering.elapsedMilliseconds}ms', ); if (useDynamicThreshold) { - log( - "[ClusterIsolate] ${DateTime.now()} Dynamic thresholding: $dynamicThresholdCount faces had a low face score or low blur clarity", + _logger.info( + "Dynamic thresholding: $dynamicThresholdCount faces had a low face score or low blur clarity", ); } @@ -838,8 +840,8 @@ Map _updateClusterSummaries({ ); } } - log( - "[ClusterIsolate] ${DateTime.now()} Calculated cluster summaries in ${DateTime.now().difference(calcSummariesStart).inMilliseconds}ms", + _logger.info( + "Calculated cluster summaries in ${DateTime.now().difference(calcSummariesStart).inMilliseconds}ms", ); return newClusterSummaries; From 20c742d43dc0c07990e06f89f4dba603e1d967aa Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 16:15:32 +0530 Subject: [PATCH 0811/1179] form 2 --- web/apps/photos/src/pages/cluster-debug.tsx | 101 +++++++++++++++----- 1 file changed, 79 insertions(+), 22 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 6f6e9d4c23..d5ca36db34 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -14,7 +14,16 @@ import { } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; import BackButton from "@mui/icons-material/ArrowBackOutlined"; -import { Box, IconButton, Stack, styled, Typography } from "@mui/material"; +import { + Box, + Button, + IconButton, + MenuItem, + Stack, + styled, + TextField, + Typography, +} from "@mui/material"; import { useFormik } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; @@ -55,7 +64,7 @@ const Options: React.FC = () => { - {pt("Faces")} + {pt("Face Clusters")} ); @@ -79,7 +88,7 @@ interface ClusterListProps { } interface ClusteringOpts { - method: "hdbscan"; + method: "linear" | "hdbscan"; batchSize: number; joinThreshold: number; } @@ -131,7 +140,7 @@ const ClusterList: React.FC = ({ height, width }) => { const getItemSize = (index: number) => index === 0 - ? 100 + ? 270 : Array.isArray(items[index - 1]) ? listItemHeight : 36; @@ -151,7 +160,7 @@ const ClusterList: React.FC = ({ height, width }) => {
void cluster(opts)} + onCluster={cluster} />
); @@ -243,26 +252,68 @@ const ListItem = styled("div")` interface HeaderProps { clusterRes: ClusterDebugPageContents | undefined; - onCluster: (opts: ClusteringOpts) => void; + onCluster: (opts: ClusteringOpts) => Promise; } const Header: React.FC = ({ clusterRes, onCluster }) => { - const formik = useFormik({ - initialValues: { - method: "hdbscan", - batchSize: 2500, - joinThreshold: 0.7, - }, - onSubmit: onCluster, - }); + const { values, handleSubmit, handleChange, isSubmitting } = + useFormik({ + initialValues: { + method: "hdbscan", + joinThreshold: 0.7, + batchSize: 2500, + }, + onSubmit: onCluster, + }); - const clusterInfo = !clusterRes ? ( - - ) : ( + const form = ( +
+ + Parameters + + + {["hdbscan", "linear"].map((v) => ( + + {v} + + ))} + + + + + + + + +
+ ); + + const clusterInfo = clusterRes && ( -
- -
{`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} @@ -280,11 +331,17 @@ const Header: React.FC = ({ clusterRes, onCluster }) => {
); - return
{clusterInfo}
; + return ( +
+ {form} + {isSubmitting && } + {clusterInfo} +
+ ); }; const Loader = () => ( - + ); From 26cb81a7206a0d11956c13882df4b83e53a25ab3 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 16:21:36 +0530 Subject: [PATCH 0812/1179] [mob][photos] almost fully functional toggle for toggling video loop --- mobile/lib/core/configuration.dart | 9 +++++ mobile/lib/ui/viewer/file/file_app_bar.dart | 34 +++++++++++++++++++ .../ui/viewer/file/video_widget_native.dart | 5 ++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index 16a65d497f..70db6c3d96 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -71,6 +71,7 @@ class Configuration { "has_selected_all_folders_for_backup"; static const anonymousUserIDKey = "anonymous_user_id"; static const endPointKey = "endpoint"; + static const shouldLoopVideoKey = "should_loop_video"; static final _logger = Logger("Configuration"); String? _cachedToken; @@ -661,6 +662,14 @@ class Configuration { await _preferences.setBool(hasSelectedAllFoldersForBackupKey, value); } + Future setShouldLoopVideo(bool value) async { + await _preferences.setBool(shouldLoopVideoKey, value); + } + + bool shouldLoopVideo() { + return _preferences.getBool(shouldLoopVideoKey) ?? true; + } + Future _migrateSecurityStorageToFirstUnlock() async { final hasMigratedSecureStorage = _preferences.getBool(hasMigratedSecureStorageKey) ?? false; diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 362868eeec..92d6d54239 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -6,6 +6,7 @@ import "package:flutter_svg/flutter_svg.dart"; import "package:local_auth/local_auth.dart"; import 'package:logging/logging.dart'; import 'package:media_extension/media_extension.dart'; +import "package:photos/core/configuration.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/guest_view_event.dart"; import "package:photos/generated/l10n.dart"; @@ -55,6 +56,7 @@ class FileAppBarState extends State { final List _actions = []; late final StreamSubscription _guestViewEventSubscription; bool isGuestView = false; + bool shouldLoopVideo = Configuration.instance.shouldLoopVideo(); @override void didUpdateWidget(FileAppBar oldWidget) { @@ -315,6 +317,29 @@ class FileAppBarState extends State { ), ), ); + + if (widget.file.isVideo) { + items.add( + PopupMenuItem( + value: 7, + child: Row( + children: [ + Icon( + Icons.repeat_rounded, + color: Theme.of(context).iconTheme.color, + ), + const Padding( + padding: EdgeInsets.all(8), + ), + shouldLoopVideo + ? const Text("Video loop on") + : const Text("Video loop off"), + ], + ), + ), + ); + } + if (items.isNotEmpty) { _actions.add( PopupMenuButton( @@ -334,6 +359,8 @@ class FileAppBarState extends State { await _handleUnHideRequest(context); } else if (value == 6) { await _onTapGuestView(); + } else if (value == 7) { + _onToggleVideoLoop(); } }, ), @@ -342,6 +369,13 @@ class FileAppBarState extends State { return _actions; } + _onToggleVideoLoop() { + Configuration.instance.setShouldLoopVideo(!shouldLoopVideo); + setState(() { + shouldLoopVideo = !shouldLoopVideo; + }); + } + Future _handleHideRequest(BuildContext context) async { try { final hideResult = diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 58e3367122..268bdec5e2 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -4,6 +4,7 @@ import "dart:io"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/core/configuration.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/guest_view_event.dart"; @@ -347,7 +348,9 @@ class _VideoWidgetNativeState extends State } void _onPlaybackEnded() { - _controller?.play(); + if (Configuration.instance.shouldLoopVideo()) { + _controller?.play(); + } } void _loadNetworkVideo() { From 598d5aab10fa23c1e79f6f4331d25875c02bb797 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 16:44:58 +0530 Subject: [PATCH 0813/1179] propagate --- web/apps/photos/src/pages/cluster-debug.tsx | 60 +++----- .../new/photos/services/ml/cluster-new.ts | 22 +-- web/packages/new/photos/services/ml/index.ts | 145 +++++------------- web/packages/new/photos/services/ml/worker.ts | 6 +- 4 files changed, 75 insertions(+), 158 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index d5ca36db34..7f84b0c5f2 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -2,11 +2,12 @@ import { SelectionBar } from "@/base/components/Navbar"; import { pt } from "@/base/i18n"; import { faceCrop, + wipClusterDebugPageContents, type ClusterDebugPageContents, - type ClusterPreviewFaceWF, + type ClusterPreviewFaceWithFile, } from "@/new/photos/services/ml"; +import { type ClusteringOpts } from "@/new/photos/services/ml/cluster-new"; import { faceDirection } from "@/new/photos/services/ml/face"; -import { wait } from "@/utils/promise"; import { FlexWrapper, FluidContainer, @@ -87,12 +88,6 @@ interface ClusterListProps { width: number; } -interface ClusteringOpts { - method: "linear" | "hdbscan"; - batchSize: number; - joinThreshold: number; -} - const ClusterList: React.FC = ({ height, width }) => { const { startLoading, finishLoading } = useContext(AppContext); @@ -105,18 +100,7 @@ const ClusterList: React.FC = ({ height, width }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const cluster = async (opts: ClusteringOpts) => { startLoading(); - // setClusterRes(await wipClusterDebugPageContents()); - console.log(opts); - await wait(5000); - setClusterRes({ - clusteredCount: 1, - unclusteredCount: 2, - clusterPreviewWFs: Array(100) - .fill(0) - .map(() => ({ clusterSize: 0, faces: [] })), - clusters: [], - clusterIDForFaceID: new Map(), - }); + setClusterRes(await wipClusterDebugPageContents(opts)); finishLoading(); }; @@ -136,8 +120,6 @@ const ClusterList: React.FC = ({ height, width }) => { listRef.current?.resetAfterIndex(0); }, [items]); - const clusterIDForFaceID = clusterRes?.clusterIDForFaceID; - const getItemSize = (index: number) => index === 0 ? 270 @@ -177,10 +159,10 @@ const ClusterList: React.FC = ({ height, width }) => { {`cluster size ${item.toFixed(2)}`} ) : ( - item.map((faceWF, i) => ( + item.map((f, i) => ( )) )} @@ -192,17 +174,17 @@ const ClusterList: React.FC = ({ height, width }) => { ); }; -type Item = number | ClusterPreviewFaceWF[]; +type Item = number | ClusterPreviewFaceWithFile[]; const itemsFromClusterRes = ( clusterRes: ClusterDebugPageContents, columns: number, ) => { - const { clusterPreviewWFs } = clusterRes; + const { clusterPreviewsWithFile } = clusterRes; const result: Item[] = []; - for (let index = 0; index < clusterPreviewWFs.length; index++) { - const { clusterSize, faces } = clusterPreviewWFs[index]; + for (let index = 0; index < clusterPreviewsWithFile.length; index++) { + const { clusterSize, faces } = clusterPreviewsWithFile[index]; result.push(clusterSize); let lastIndex = 0; while (lastIndex < faces.length) { @@ -315,7 +297,7 @@ const Header: React.FC = ({ clusterRes, onCluster }) => { const clusterInfo = clusterRes && ( - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredCount} faces. ${clusterRes.unclusteredCount} unclustered faces.`} + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces. ${clusterRes.unclusteredFaceCount} unclustered faces.`} Showing only top 30 and bottom 30 clusters. @@ -326,7 +308,10 @@ const Header: React.FC = ({ clusterRes, onCluster }) => { Below each face is its{" "} - blur - score - cosineSimilarity - direction + blur - score - cosineSimilarity - direction. + + + Faces added to the cluster as a result of merging are outlined. ); @@ -347,12 +332,11 @@ const Loader = () => ( ); interface FaceItemProps { - faceWF: ClusterPreviewFaceWF; - clusterIDForFaceID: Map | undefined; + faceWithFile: ClusterPreviewFaceWithFile; } -const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { - const { face, enteFile, cosineSimilarity } = faceWF; +const FaceItem: React.FC = ({ faceWithFile }) => { + const { face, enteFile, cosineSimilarity, wasMerged } = faceWithFile; const { faceID } = face; const [objectURL, setObjectURL] = useState(); @@ -377,7 +361,7 @@ const FaceItem: React.FC = ({ faceWF, clusterIDForFaceID }) => { return ( @@ -413,9 +397,3 @@ const FaceChip = styled(Box)` width: 120px; height: 120px; `; - -const outlineForCluster = (clusterID: string | undefined) => - clusterID ? `1px solid oklch(0.8 0.2 ${hForID(clusterID)})` : undefined; - -const hForID = (id: string) => - ([...id].reduce((s, c) => s + c.charCodeAt(0), 0) % 10) * 36; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index d6e1dc505a..8bfb00b164 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -113,15 +113,10 @@ export interface CGroup { displayFaceID: string | undefined; } -// TODO-Cluster -export interface FaceNeighbours { - face: Face; - neighbours: FaceNeighbour[]; -} - -interface FaceNeighbour { - face: Face; - cosineSimilarity: number; +export interface ClusteringOpts { + method: "linear" | "hdbscan"; + batchSize: number; + joinThreshold: number; } export interface ClusterPreview { @@ -129,9 +124,10 @@ export interface ClusterPreview { faces: ClusterPreviewFace[]; } -interface ClusterPreviewFace { +export interface ClusterPreviewFace { face: Face; cosineSimilarity: number; + wasMerged: boolean; } /** @@ -348,7 +344,11 @@ function* enumerateFaces(faceIndices: FaceIndex[]) { } } -export const clusterFacesHdb = (faceIndexes: FaceIndex[]) => { +export const clusterFacesHdb = ( + faceIndexes: FaceIndex[], + opts: ClusteringOpts, +) => { + const { batch } = opts; const t = Date.now(); // A flattened array of faces. diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 4248c295f0..c5ff83c2ef 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -20,7 +20,11 @@ import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; -import { type CGroup, type FaceCluster } from "./cluster-new"; +import { + type ClusteringOpts, + type ClusterPreviewFace, + type FaceCluster, +} from "./cluster-new"; import { regenerateFaceCrops } from "./crop"; import { clearMLDB, faceIndex, indexableAndIndexedCounts } from "./db"; import type { Face } from "./face"; @@ -344,42 +348,30 @@ export const wipSearchPersons = async () => { return _wip_searchPersons ?? []; }; -export interface FaceFileNeighbours { - face: Face; - neighbours: FaceFileNeighbour[]; -} - -export interface FaceFileNeighbour { - face: Face; - enteFile: EnteFile; - cosineSimilarity: number; -} - -// "with file" -export interface ClusterPreviewWF { +export interface ClusterPreviewWithFile { clusterSize: number; - faces: ClusterPreviewFaceWF[]; + faces: ClusterPreviewFaceWithFile[]; } -export interface ClusterPreviewFaceWF { - face: Face; +export type ClusterPreviewFaceWithFile = ClusterPreviewFace & { enteFile: EnteFile; - cosineSimilarity: number; -} +}; export interface ClusterDebugPageContents { - clusteredCount: number; - unclusteredCount: number; - // faceFNs: FaceFileNeighbours[]; - clusterPreviewWFs: ClusterPreviewWF[]; + clusteredFaceCount: number; + unclusteredFaceCount: number; clusters: FaceCluster[]; - clusterIDForFaceID: Map; + clusterPreviewsWithFile: ClusterPreviewWithFile[]; + unclusteredFacesWithFile: { + face: Face; + enteFile: EnteFile; + }; } -export const wipClusterDebugPageContents = async (): Promise< - ClusterDebugPageContents | undefined -> => { - if (!(await wipClusterEnable())) return undefined; +export const wipClusterDebugPageContents = async ( + opts: ClusteringOpts, +): Promise => { + if (!(await wipClusterEnable())) throw new Error("Not implemented"); log.info("clustering"); _wip_isClustering = true; @@ -388,38 +380,33 @@ export const wipClusterDebugPageContents = async (): Promise< // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( const { - clusteredCount, - unclusteredCount, + clusteredFaceCount, + unclusteredFaceCount, clusterPreviews, clusters, cgroups, - clusterIDForFaceID, - } = await worker().then((w) => w.clusterFacesHdb()); - - // const searchPersons = await convertToSearchPersons(clusters, cgroups); + unclusteredFaces, + } = await worker().then((w) => w.clusterFacesHdb(opts)); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); const fileForFace = ({ faceID }: Face) => ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))); - // const faceFNs = faceAndNeigbours.map( - // ({ topFace: face, faces: neighbours }) => ({ - // face, - // neighbours: neighbours.map(({ face, cosineSimilarity }) => ({ - // face, - // enteFile: fileForFace(face), - // cosineSimilarity, - // })), - // }), - // ); - const clusterPreviewWFs = clusterPreviews.map(({ clusterSize, faces }) => ({ - clusterSize, - faces: faces.map(({ face, cosineSimilarity }) => ({ - face, - enteFile: fileForFace(face), - cosineSimilarity, - })), + const clusterPreviewsWithFile = clusterPreviews.map( + ({ clusterSize, faces }) => ({ + clusterSize, + faces: faces.map(({ face, cosineSimilarity }) => ({ + face, + enteFile: fileForFace(face), + cosineSimilarity, + })), + }), + ); + + const unclusteredFacesWithFile = unclusteredFaces.map((face) => ({ + face, + enteFile: fileForFace(face), })); const clusterByID = new Map(clusters.map((c) => [c.id, c])); @@ -453,62 +440,14 @@ export const wipClusterDebugPageContents = async (): Promise< triggerStatusUpdate(); return { - clusteredCount, - unclusteredCount, - clusterPreviewWFs, + clusteredFaceCount, + unclusteredFaceCount, clusters, - clusterIDForFaceID, + clusterPreviewsWithFile, + unclusteredFacesWithFile, }; }; -export const wipCluster = () => void wipClusterDebugPageContents(); - -// TODO-Cluster remove me -export const convertToSearchPersons = async ( - clusters: FaceCluster[], - cgroups: CGroup[], -) => { - const clusterByID = new Map(clusters.map((c) => [c.id, c])); - - const localFiles = await getAllLocalFiles(); - const localFileByID = new Map(localFiles.map((f) => [f.id, f])); - - const result: SearchPerson[] = []; - for (const cgroup of cgroups) { - const displayFaceID = cgroup.displayFaceID; - if (!displayFaceID) { - // TODO-Cluster - assertionFailed(`cgroup ${cgroup.id} without displayFaceID`); - continue; - } - - const displayFaceFileID = fileIDFromFaceID(displayFaceID); - if (!displayFaceFileID) continue; - - const displayFaceFile = localFileByID.get(displayFaceFileID); - if (!displayFaceFile) { - assertionFailed(`Face ID ${displayFaceFileID} without local file`); - continue; - } - - const fileIDs = cgroup.clusterIDs - .map((id) => clusterByID.get(id)) - .flatMap((cluster) => cluster?.faceIDs ?? []) - .map((faceID) => fileIDFromFaceID(faceID)) - .filter((fileID) => fileID !== undefined); - - result.push({ - id: cgroup.id, - name: cgroup.name, - files: [...new Set(fileIDs)], - displayFaceID, - displayFaceFile, - }); - } - - return result.sort((a, b) => b.files.length - a.files.length); -}; - export type MLStatus = | { phase: "disabled" /* The ML remote flag is off */ } | { diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index e4a3e5ecab..6eff182347 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -24,7 +24,7 @@ import { indexCLIP, type CLIPIndex, } from "./clip"; -import { clusterFacesHdb } from "./cluster-new"; +import { clusterFacesHdb, type ClusteringOpts } from "./cluster-new"; import { saveFaceCrops } from "./crop"; import { faceIndexes, @@ -276,8 +276,8 @@ export class MLWorker { } // TODO-Cluster - async clusterFacesHdb() { - return clusterFacesHdb(await faceIndexes()); + async clusterFacesHdb(opts: ClusteringOpts) { + return clusterFacesHdb(await faceIndexes(), opts); } } From f8593255ac2403fed2bc8352e83cfebb099e7584 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 16:59:26 +0530 Subject: [PATCH 0814/1179] [mob][photos] Fix most of the seekbar issues when turning off looping videos --- .../file/native_video_player_controls/seek_bar.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index 015e6eb5ef..f57d772566 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -2,6 +2,7 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; +import "package:photos/core/configuration.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/utils/debouncer.dart"; @@ -136,16 +137,21 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { } void _onPlaybackPositionChanged() async { - if (widget.controller.playbackInfo?.status == PlaybackStatus.paused) { + if (widget.controller.playbackInfo?.status == PlaybackStatus.paused || + (widget.controller.playbackInfo?.status == PlaybackStatus.stopped && + widget.controller.playbackInfo?.positionFraction != 0)) { return; } final target = widget.controller.playbackInfo?.positionFraction ?? 0; - //To immediately set the position to 0 when the ends when playing in loop + //To immediately set the position to 0 when the video ends if (_prevPositionFraction == 1.0 && target == 0.0) { setState(() { _animationController.value = 0; }); + if (!Configuration.instance.shouldLoopVideo()) { + return; + } } //There is a slight delay (around 350 ms) for the event being listened to From 48e00a0ecca6bb531e78816a89e167facc92ba5a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 17:05:16 +0530 Subject: [PATCH 0815/1179] Linear --- .../new/photos/services/ml/cluster-hdb.ts | 35 + .../new/photos/services/ml/cluster-new.ts | 603 ------------------ .../new/photos/services/ml/cluster.ts | 522 ++++++++++++++- web/packages/new/photos/services/ml/db.ts | 2 +- web/packages/new/photos/services/ml/index.ts | 4 +- web/packages/new/photos/services/ml/worker.ts | 6 +- .../new/photos/services/user-entity.ts | 2 +- 7 files changed, 539 insertions(+), 635 deletions(-) create mode 100644 web/packages/new/photos/services/ml/cluster-hdb.ts delete mode 100644 web/packages/new/photos/services/ml/cluster-new.ts diff --git a/web/packages/new/photos/services/ml/cluster-hdb.ts b/web/packages/new/photos/services/ml/cluster-hdb.ts new file mode 100644 index 0000000000..3ecda4b5bc --- /dev/null +++ b/web/packages/new/photos/services/ml/cluster-hdb.ts @@ -0,0 +1,35 @@ +import { Hdbscan, type DebugInfo } from "hdbscan"; + +/** + * Each "cluster" is a list of indexes of the embeddings belonging to that + * particular cluster. + */ +export type EmbeddingCluster = number[]; + +export interface ClusterHdbscanResult { + clusters: EmbeddingCluster[]; + noise: number[]; + debugInfo?: DebugInfo; +} + +/** + * Cluster the given {@link embeddings} using hdbscan. + */ +export const clusterHdbscan = ( + embeddings: number[][], +): ClusterHdbscanResult => { + const hdbscan = new Hdbscan({ + input: embeddings, + minClusterSize: 3, + minSamples: 5, + clusterSelectionEpsilon: 0.6, + clusterSelectionMethod: "leaf", + debug: false, + }); + + return { + clusters: hdbscan.getClusters(), + noise: hdbscan.getNoise(), + debugInfo: hdbscan.getDebugInfo(), + }; +}; diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts deleted file mode 100644 index 8bfb00b164..0000000000 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ /dev/null @@ -1,603 +0,0 @@ -import { newNonSecureID } from "@/base/id-worker"; -import log from "@/base/log"; -import { ensure } from "@/utils/ensure"; -import { clusterFacesHdbscan } from "./cluster"; -import { clusterGroups, faceClusters } from "./db"; -import type { Face, FaceIndex } from "./face"; -import { dotProduct } from "./math"; - -/** - * A face cluster is an set of faces. - * - * Each cluster has an id so that a {@link CGroup} can refer to it. - * - * The cluster is not directly synced to remote. Only clusters that the user - * interacts with get synced to remote, as part of a {@link CGroup}. - */ -export interface FaceCluster { - /** - * A nanoid for this cluster. - */ - id: string; - /** - * An unordered set of ids of the faces that belong to this cluster. - * - * For ergonomics of transportation and persistence this is an array, but it - * should conceptually be thought of as a set. - */ - faceIDs: string[]; -} - -/** - * A cgroup ("cluster group") is a group of clusters (possibly containing a - * single cluster) that the user has interacted with. - * - * Interactions include hiding, merging and giving a name and/or a cover photo. - * - * The most frequent interaction is naming a {@link FaceCluster}, which promotes - * it to a become a {@link CGroup}. The promotion comes with the ability to be - * synced with remote (as a "cgroup" user entity). - * - * There after, the user may attach more clusters to the same {@link CGroup}. - * - * > A named cluster group can be thought of as a "person", though this is not - * > necessarily an accurate characterization. e.g. there can be a named cluster - * > group that contains face clusters of pets. - * - * The other form of interaction is hiding. The user may hide a single (unnamed) - * cluster, or they may hide an named {@link CGroup}. In both cases, we promote - * the cluster to a CGroup if needed so that their request to hide gets synced. - * - * While in our local representation we separately maintain clusters and link to - * them from within CGroups by their clusterID, in the remote representation - * clusters themselves don't get synced. Instead, the "cgroup" entities synced - * with remote contain the clusters within themselves. So a group that gets - * synced with remote looks something like: - * - * { id, name, clusters: [{ clusterID, faceIDs }] } - * - */ -export interface CGroup { - /** - * A nanoid for this cluster group. - * - * This is the ID of the "cgroup" user entity (the envelope), and it is not - * contained as part of the group entity payload itself. - */ - id: string; - /** - * A name assigned by the user to this cluster group. - * - * The client should handle both empty strings and undefined as indicating a - * cgroup without a name. When the client needs to set this to an "empty" - * value, which happens when hiding an unnamed cluster, it should it to an - * empty string. That is, expect `"" | undefined`, but set `""`. - */ - name: string | undefined; - /** - * An unordered set of ids of the clusters that belong to this group. - * - * For ergonomics of transportation and persistence this is an array, but it - * should conceptually be thought of as a set. - */ - clusterIDs: string[]; - /** - * True if this cluster group should be hidden. - * - * The user can hide both named cluster groups and single unnamed clusters. - * If the user hides a single cluster that was offered as a suggestion to - * them on a client, the client will create a new unnamed cgroup containing - * it, and set its hidden flag to sync it with remote (so that other clients - * can also stop showing this cluster). - */ - isHidden: boolean; - /** - * The ID of the face that should be used as the cover photo for this - * cluster group (if the user has set one). - * - * This is similar to the [@link displayFaceID}, the difference being: - * - * - {@link avatarFaceID} is the face selected by the user. - * - * - {@link displayFaceID} is the automatic placeholder, and only comes - * into effect if the user has not explicitly selected a face. - */ - avatarFaceID: string | undefined; - /** - * Locally determined ID of the "best" face that should be used as the - * display face, to represent this cluster group in the UI. - * - * This property is not synced with remote. For more details, see - * {@link avatarFaceID}. - */ - displayFaceID: string | undefined; -} - -export interface ClusteringOpts { - method: "linear" | "hdbscan"; - batchSize: number; - joinThreshold: number; -} - -export interface ClusterPreview { - clusterSize: number; - faces: ClusterPreviewFace[]; -} - -export interface ClusterPreviewFace { - face: Face; - cosineSimilarity: number; - wasMerged: boolean; -} - -/** - * Cluster faces into groups. - * - * [Note: Face clustering algorithm] - * - * A cgroup (cluster group) consists of clusters, each of which itself is a set - * of faces. - * - * cgroup << cluster << face - * - * The clusters are generated locally by clients using the following algorithm: - * - * 1. clusters = [] initially, or fetched from remote. - * - * 2. For each face, find its nearest neighbour in the embedding space. - * - * 3. If no such neighbour is found within our threshold, create a new cluster. - * - * 4. Otherwise assign this face to the same cluster as its nearest neighbour. - * - * This user can then tweak the output of the algorithm by performing the - * following actions to the list of clusters that they can see: - * - * - They can provide a name for a cluster ("name a person"). This upgrades a - * cluster into a "cgroup", which is an entity that gets synced via remote - * to the user's other clients. - * - * - They can attach more clusters to a cgroup ("merge clusters") - * - * - They can remove a cluster from a cgroup ("break clusters"). - * - * After clustering, we also do some routine cleanup. Faces belonging to files - * that have been deleted (including those in Trash) should be pruned off. - * - * We should not make strict assumptions about the clusters we get from remote. - * In particular, the same face ID can be in different clusters. In such cases - * we should assign it arbitrarily assign it to the last cluster we find it in. - * Such leeway is intentionally provided to allow clients some slack in how they - * implement the sync without needing to make an blocking API request for every - * user interaction. - */ -export const clusterFaces = async (faceIndexes: FaceIndex[]) => { - const t = Date.now(); - - // A flattened array of faces. - // TODO-Cluster note the 2k slice - const faces = [...enumerateFaces(faceIndexes)].slice(0, 2000); - - // Start with the clusters we already have (either from a previous indexing, - // or fetched from remote). - const clusters = await faceClusters(); - - // For fast reverse lookup - map from cluster ids to their index in the - // clusters array. - const clusterIndexForClusterID = new Map(clusters.map((c, i) => [c.id, i])); - - // For fast reverse lookup - map from face ids to the id of the cluster to - // which they belong. - const clusterIDForFaceID = new Map( - clusters.flatMap((c) => c.faceIDs.map((id) => [id, c.id] as const)), - ); - - // A function to generate new cluster IDs. - const newClusterID = () => newNonSecureID("cluster_"); - - const faceAndNeigbours: FaceNeighbours[] = []; - - // For each face, - for (const [i, fi] of faces.entries()) { - // If the face is already part of a cluster, then skip it. - if (clusterIDForFaceID.get(fi.faceID)) continue; - - // Find the nearest neighbour from among all the other faces. - let nn: Face | undefined; - let nnCosineSimilarity = 0; - let neighbours: FaceNeighbour[] = []; - for (let j = 0; j < faces.length; j++) { - // ! This is an O(n^2) loop, be careful when adding more code here. - - // TODO-Cluster Commenting this here and moving it downward - // // Skip ourselves. - // if (i == j) continue; - - // Can't find a way of avoiding the null assertion here. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const fj = faces[j]!; - - // The vectors are already normalized, so we can directly use their - // dot product as their cosine similarity. - const csim = dotProduct(fi.embedding, fj.embedding); - - // TODO-Cluster Delete me and uncomment the check above - // Skip ourselves. - if (i == j) { - neighbours.push({ face: fj, cosineSimilarity: csim }); - continue; - } - - const threshold = fi.blur < 100 || fj.blur < 100 ? 0.7 : 0.6; - if (csim > threshold && csim > nnCosineSimilarity) { - nn = fj; - nnCosineSimilarity = csim; - } - - neighbours.push({ face: fj, cosineSimilarity: csim }); - } - - neighbours = neighbours.sort( - (a, b) => b.cosineSimilarity - a.cosineSimilarity, - ); - faceAndNeigbours.push({ face: fi, neighbours }); - - const { faceID } = fi; - - if (nn) { - // Found a neighbour near enough. - const nnFaceID = nn.faceID; - - // Find the cluster the nearest neighbour belongs to, if any. - const nnClusterID = clusterIDForFaceID.get(nn.faceID); - - if (nnClusterID) { - // If the neighbour is already part of a cluster, also add - // ourselves to that cluster. - - const nnClusterIndex = ensure( - clusterIndexForClusterID.get(nnClusterID), - ); - clusters[nnClusterIndex]?.faceIDs.push(faceID); - clusterIDForFaceID.set(faceID, nnClusterID); - } else { - // Otherwise create a new cluster with us and our nearest - // neighbour. - - const cluster = { - id: newClusterID(), - faceIDs: [faceID, nnFaceID], - }; - clusterIndexForClusterID.set(cluster.id, clusters.length); - clusterIDForFaceID.set(faceID, cluster.id); - clusterIDForFaceID.set(nnFaceID, cluster.id); - clusters.push(cluster); - } - } else { - // We didn't find a neighbour within the threshold. Create a new - // cluster with only this face. - - const cluster = { id: newClusterID(), faceIDs: [faceID] }; - clusterIndexForClusterID.set(cluster.id, clusters.length); - clusterIDForFaceID.set(faceID, cluster.id); - clusters.push(cluster); - } - } - - // Prune too small clusters. - const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - - let cgroups = await clusterGroups(); - - // TODO-Cluster - Currently we're not syncing with remote or saving anything - // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) - // cgroup, one per cluster. - cgroups = cgroups.concat( - validClusters.map((c) => ({ - id: c.id, - name: undefined, - clusterIDs: [c.id], - isHidden: false, - avatarFaceID: undefined, - displayFaceID: undefined, - })), - ); - - // For each cluster group, use the highest scoring face in any of its - // clusters as its display face. - const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); - for (const cgroup of cgroups) { - cgroup.displayFaceID = cgroup.clusterIDs - .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - .filter((i) => i !== undefined) /* 0 is a valid index */ - .flatMap((i) => clusters[i]?.faceIDs ?? []) - .map((faceID) => faceForFaceID.get(faceID)) - .filter((face) => !!face) - .reduce((max, face) => - max.score > face.score ? max : face, - ).faceID; - } - - log.info("ml/cluster", { - faces, - validClusters, - clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), - clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), - cgroups, - }); - log.info( - `Clustered ${faces.length} faces into ${validClusters.length} clusters (${Date.now() - t} ms)`, - ); - - return { faces, clusters: validClusters, cgroups, faceAndNeigbours }; -}; - -/** - * A generator function that returns a stream of {faceID, embedding} values, - * flattening all the the faces present in the given {@link faceIndices}. - */ -function* enumerateFaces(faceIndices: FaceIndex[]) { - for (const fi of faceIndices) { - for (const f of fi.faces) { - yield f; - } - } -} - -export const clusterFacesHdb = ( - faceIndexes: FaceIndex[], - opts: ClusteringOpts, -) => { - const { batch } = opts; - const t = Date.now(); - - // A flattened array of faces. - // TODO-Cluster ad-hoc filtering and slicing - const faces0 = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); - // .slice(0, 6000); - // TODO-Cluster testing code, can be removed once done - const faces = Array(1) - .fill(0) - .flatMap(() => faces0); - - // For fast reverse lookup - map from face ids to the face. - const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); - - const faceEmbeddings = faces.map(({ embedding }) => embedding); - - // For fast reverse lookup - map from cluster ids to their index in the - // clusters array. - const clusterIndexForClusterID = new Map(); - - // For fast reverse lookup - map from the id of a face to the id of the - // cluster to which it belongs. - const clusterIDForFaceID = new Map(); - - // A function to chain two reverse lookup. - const firstFaceOfCluster = (cluster: FaceCluster) => - ensure(faceForFaceID.get(ensure(cluster.faceIDs[0]))); - - // A function to generate new cluster IDs. - const newClusterID = () => newNonSecureID("cluster_"); - - // The resultant clusters. - // TODO-Cluster Later on, instead of starting from a blank slate, this will - // be list of existing clusters we fetch from remote. - const clusters: FaceCluster[] = []; - - // Process the faces in batches. The faces are already sorted by file ID, - // which is a monotonically increasing integer, so we will also have some - // temporal locality. - // - // The number 2500 was derived by ad-hoc observations and takes a few - // seconds. On a particular test dataset and a particular machine, - // clustering 1k took ~2 seconds, 10k took ~2 mins, while 20k took ~8 mins. - // Memory usage was constant in all these cases. - // - // At around 100k faces, the clustering starts taking hours, and we start - // running into stack overflows. The stack overflows can perhaps be avoided - // by restructuring the code, but hours of uninterruptible work is anyways - // not feasible. - - const batchSize = 2500; - for (let i = 0; i < faceEmbeddings.length; i += batchSize) { - const it = Date.now(); - const embeddings = faceEmbeddings.slice(i, i + batchSize); - const { clusters: hdbClusters } = clusterFacesHdbscan(embeddings); - - log.info( - `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - it} ms)`, - ); - - // Merge the new clusters we got from hdbscan into the existing clusters - // if they are "near" them (using some heuristic). - // - // We need to ensure we don't change any of the existing cluster IDs, - // since these might be existing clusters we got from remote. - - for (const hdbCluster of hdbClusters) { - // Find the existing cluster whose (arbitrarily chosen) first face - // is the nearest neighbour of the (arbitrarily chosen) first face - // of the cluster produced by hdbscan. - - const newFace = ensure(faces[i + ensure(hdbCluster[0])]); - - let nnCluster: FaceCluster | undefined; - let nnCosineSimilarity = 0; - for (const existingCluster of clusters) { - const existingFace = firstFaceOfCluster(existingCluster); - - // The vectors are already normalized, so we can directly use their - // dot product as their cosine similarity. - const csim = dotProduct( - existingFace.embedding, - newFace.embedding, - ); - - // Use a higher cosine similarity threshold if either of the two - // faces are blurry. - const threshold = - existingFace.blur < 200 || newFace.blur < 200 ? 0.9 : 0.7; - if (csim > threshold && csim > nnCosineSimilarity) { - nnCluster = existingCluster; - nnCosineSimilarity = csim; - } - } - - if (nnCluster) { - // If we found an existing cluster that is near enough, - // sublimate the cluster produced by hdbscan into that cluster. - for (const j of hdbCluster) { - const { faceID } = ensure(faces[i + j]); - nnCluster.faceIDs.push(faceID); - clusterIDForFaceID.set(faceID, nnCluster.id); - } - } else { - // Otherwise make a new cluster from the cluster produced by - // hdbscan. - const clusterID = newClusterID(); - const faceIDs: string[] = []; - for (const j of hdbCluster) { - const { faceID } = ensure(faces[i + j]); - faceIDs.push(faceID); - clusterIDForFaceID.set(faceID, clusterID); - } - clusterIndexForClusterID.set(clusterID, clusters.length); - clusters.push({ id: clusterID, faceIDs }); - } - } - } - - // Convert into the data structure we're using to debug/visualize. - // const faceAndNeigbours: FaceNeighbours[] = []; - // const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); - // for (const fi of topFaces) { - // let neighbours: FaceNeighbour[] = []; - // for (const fj of faces) { - // // The vectors are already normalized, so we can directly use their - // // dot product as their cosine similarity. - // const csim = dotProduct(fi.embedding, fj.embedding); - // neighbours.push({ face: fj, cosineSimilarity: csim }); - // } - - // neighbours = neighbours - // .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) - // .slice(0, 30); - - // faceAndNeigbours.push({ face: fi, neighbours }); - // } - - // Convert into the data structure we're using to debug/visualize. - // - // > Showing only top 30 and bottom 30 clusters (and only up to 50 faces in - // > each, sorted by cosine distance to highest scoring face in the - // > cluster). - - const sortedClusters = clusters.sort( - (a, b) => b.faceIDs.length - a.faceIDs.length, - ); - const debugClusters = - sortedClusters.length < 60 - ? sortedClusters - : sortedClusters.slice(0, 30).concat(sortedClusters.slice(-30)); - const clusterPreviews: ClusterPreview[] = []; - for (const cluster of debugClusters) { - const faces = cluster.faceIDs.map((id) => - ensure(faceForFaceID.get(id)), - ); - const topFace = faces.reduce((max, face) => - max.score > face.score ? max : face, - ); - const previewFaces: ClusterPreviewFace[] = []; - for (const face of faces) { - const csim = dotProduct(topFace.embedding, face.embedding); - previewFaces.push({ face, cosineSimilarity: csim }); - } - clusterPreviews.push({ - clusterSize: cluster.faceIDs.length, - faces: previewFaces - .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) - .slice(0, 50), - }); - } - - // Prune too small clusters. - // TODO-Cluster this is likely not needed since hdbscan already has a min? - const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - - // let cgroups = await clusterGroups(); - - // // TODO-Cluster - Currently we're not syncing with remote or saving anything - // // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) - // // cgroup, one per cluster. - // cgroups = cgroups.concat( - // validClusters.map((c) => ({ - // id: c.id, - // name: undefined, - // clusterIDs: [c.id], - // isHidden: false, - // avatarFaceID: undefined, - // displayFaceID: undefined, - // })), - // ); - - // // For each cluster group, use the highest scoring face in any of its - // // clusters as its display face. - // for (const cgroup of cgroups) { - // cgroup.displayFaceID = cgroup.clusterIDs - // .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - // .filter((i) => i !== undefined) /* 0 is a valid index */ - // .flatMap((i) => clusters[i]?.faceIDs ?? []) - // .map((faceID) => faceForFaceID.get(faceID)) - // .filter((face) => !!face) - // .reduce((max, face) => - // max.score > face.score ? max : face, - // ).faceID; - // } - - // TODO-Cluster - Currently we're not syncing with remote or saving anything - // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) - // cgroup, one per cluster. - - const cgroups: CGroup[] = []; - for (const cluster of sortedClusters) { - const faces = cluster.faceIDs.map((id) => - ensure(faceForFaceID.get(id)), - ); - const topFace = faces.reduce((max, face) => - max.score > face.score ? max : face, - ); - cgroups.push({ - id: cluster.id, - name: undefined, - clusterIDs: [cluster.id], - isHidden: false, - avatarFaceID: undefined, - displayFaceID: topFace.faceID, - }); - } - - // log.info("ml/cluster", { - // faces, - // validClusters, - // clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), - // clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), - // cgroups, - // }); - log.info( - `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, - ); - - const clusteredCount = clusterIDForFaceID.size; - const unclusteredCount = faces.length - clusteredCount; - - return { - // faces, - clusteredCount, - unclusteredCount, - clusters: validClusters, - cgroups, - clusterPreviews, - clusterIDForFaceID, - }; -}; diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 53e4930d94..f13b889aa1 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -1,35 +1,507 @@ -import { Hdbscan, type DebugInfo } from "hdbscan"; +import { newNonSecureID } from "@/base/id-worker"; +import log from "@/base/log"; +import { ensure } from "@/utils/ensure"; +import { type EmbeddingCluster, clusterHdbscan } from "./cluster-hdb"; +import type { Face, FaceIndex } from "./face"; +import { dotProduct } from "./math"; -export type Cluster = number[]; - -export interface ClusterFacesResult { - clusters: Cluster[]; - noise: Cluster; - debugInfo?: DebugInfo; +/** + * A face cluster is an set of faces. + * + * Each cluster has an id so that a {@link CGroup} can refer to it. + * + * The cluster is not directly synced to remote. Only clusters that the user + * interacts with get synced to remote, as part of a {@link CGroup}. + */ +export interface FaceCluster { + /** + * A nanoid for this cluster. + */ + id: string; + /** + * An unordered set of ids of the faces that belong to this cluster. + * + * For ergonomics of transportation and persistence this is an array, but it + * should conceptually be thought of as a set. + */ + faceIDs: string[]; } /** - * Cluster the given {@link faceEmbeddings}. + * A cgroup ("cluster group") is a group of clusters (possibly containing a + * single cluster) that the user has interacted with. + * + * Interactions include hiding, merging and giving a name and/or a cover photo. + * + * The most frequent interaction is naming a {@link FaceCluster}, which promotes + * it to a become a {@link CGroup}. The promotion comes with the ability to be + * synced with remote (as a "cgroup" user entity). + * + * There after, the user may attach more clusters to the same {@link CGroup}. + * + * > A named cluster group can be thought of as a "person", though this is not + * > necessarily an accurate characterization. e.g. there can be a named cluster + * > group that contains face clusters of pets. + * + * The other form of interaction is hiding. The user may hide a single (unnamed) + * cluster, or they may hide an named {@link CGroup}. In both cases, we promote + * the cluster to a CGroup if needed so that their request to hide gets synced. + * + * While in our local representation we separately maintain clusters and link to + * them from within CGroups by their clusterID, in the remote representation + * clusters themselves don't get synced. Instead, the "cgroup" entities synced + * with remote contain the clusters within themselves. So a group that gets + * synced with remote looks something like: + * + * { id, name, clusters: [{ clusterID, faceIDs }] } * - * @param faceEmbeddings An array of embeddings produced by our face indexing - * pipeline. Each embedding is for a face detected in an image (a single image - * may have multiple faces detected within it). */ -export const clusterFacesHdbscan = ( - faceEmbeddings: number[][], -): ClusterFacesResult => { - const hdbscan = new Hdbscan({ - input: faceEmbeddings, - minClusterSize: 3, - minSamples: 5, - clusterSelectionEpsilon: 0.6, - clusterSelectionMethod: "leaf", - debug: false, - }); +export interface CGroup { + /** + * A nanoid for this cluster group. + * + * This is the ID of the "cgroup" user entity (the envelope), and it is not + * contained as part of the group entity payload itself. + */ + id: string; + /** + * A name assigned by the user to this cluster group. + * + * The client should handle both empty strings and undefined as indicating a + * cgroup without a name. When the client needs to set this to an "empty" + * value, which happens when hiding an unnamed cluster, it should it to an + * empty string. That is, expect `"" | undefined`, but set `""`. + */ + name: string | undefined; + /** + * An unordered set of ids of the clusters that belong to this group. + * + * For ergonomics of transportation and persistence this is an array, but it + * should conceptually be thought of as a set. + */ + clusterIDs: string[]; + /** + * True if this cluster group should be hidden. + * + * The user can hide both named cluster groups and single unnamed clusters. + * If the user hides a single cluster that was offered as a suggestion to + * them on a client, the client will create a new unnamed cgroup containing + * it, and set its hidden flag to sync it with remote (so that other clients + * can also stop showing this cluster). + */ + isHidden: boolean; + /** + * The ID of the face that should be used as the cover photo for this + * cluster group (if the user has set one). + * + * This is similar to the [@link displayFaceID}, the difference being: + * + * - {@link avatarFaceID} is the face selected by the user. + * + * - {@link displayFaceID} is the automatic placeholder, and only comes + * into effect if the user has not explicitly selected a face. + */ + avatarFaceID: string | undefined; + /** + * Locally determined ID of the "best" face that should be used as the + * display face, to represent this cluster group in the UI. + * + * This property is not synced with remote. For more details, see + * {@link avatarFaceID}. + */ + displayFaceID: string | undefined; +} + +export interface ClusteringOpts { + method: "linear" | "hdbscan"; + batchSize: number; + joinThreshold: number; +} + +export interface ClusterPreview { + clusterSize: number; + faces: ClusterPreviewFace[]; +} + +export interface ClusterPreviewFace { + face: Face; + cosineSimilarity: number; + wasMerged: boolean; +} + +/** + * Cluster faces into groups. + * + * [Note: Face clustering algorithm] + * + * A cgroup (cluster group) consists of clusters, each of which itself is a set + * of faces. + * + * cgroup << cluster << face + * + * The clusters are generated locally by clients using the following algorithm: + * + * 1. clusters = [] initially, or fetched from remote. + * + * 2. For each face, find its nearest neighbour in the embedding space. + * + * 3. If no such neighbour is found within our threshold, create a new cluster. + * + * 4. Otherwise assign this face to the same cluster as its nearest neighbour. + * + * This user can then tweak the output of the algorithm by performing the + * following actions to the list of clusters that they can see: + * + * - They can provide a name for a cluster ("name a person"). This upgrades a + * cluster into a "cgroup", which is an entity that gets synced via remote + * to the user's other clients. + * + * - They can attach more clusters to a cgroup ("merge clusters") + * + * - They can remove a cluster from a cgroup ("break clusters"). + * + * After clustering, we also do some routine cleanup. Faces belonging to files + * that have been deleted (including those in Trash) should be pruned off. + * + * We should not make strict assumptions about the clusters we get from remote. + * In particular, the same face ID can be in different clusters. In such cases + * we should assign it arbitrarily assign it to the last cluster we find it in. + * Such leeway is intentionally provided to allow clients some slack in how they + * implement the sync without needing to make an blocking API request for every + * user interaction. + */ +export const clusterFaces = ( + faceIndexes: FaceIndex[], + opts: ClusteringOpts, +) => { + const { batchSize, joinThreshold } = opts; + const t = Date.now(); + + // A flattened array of faces. + // TODO-Cluster ad-hoc filtering and slicing + const faces0 = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); + // .slice(0, 6000); + // TODO-Cluster testing code, can be removed once done + const faces = Array(1) + .fill(0) + .flatMap(() => faces0); + + // For fast reverse lookup - map from face ids to the face. + const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); + + const faceEmbeddings = faces.map(({ embedding }) => embedding); + + // For fast reverse lookup - map from cluster ids to their index in the + // clusters array. + const clusterIndexForClusterID = new Map(); + + // For fast reverse lookup - map from the id of a face to the id of the + // cluster to which it belongs. + const clusterIDForFaceID = new Map(); + + // A function to chain two reverse lookup. + const firstFaceOfCluster = (cluster: FaceCluster) => + ensure(faceForFaceID.get(ensure(cluster.faceIDs[0]))); + + // A function to generate new cluster IDs. + const newClusterID = () => newNonSecureID("cluster_"); + + // The resultant clusters. + // TODO-Cluster Later on, instead of starting from a blank slate, this will + // be list of existing clusters we fetch from remote. + const clusters: FaceCluster[] = []; + + // Process the faces in batches. The faces are already sorted by file ID, + // which is a monotonically increasing integer, so we will also have some + // temporal locality. + // + // The number 2500 was derived by ad-hoc observations and takes a few + // seconds. On a particular test dataset and a particular machine, + // clustering 1k took ~2 seconds, 10k took ~2 mins, while 20k took ~8 mins. + // Memory usage was constant in all these cases. + // + // At around 100k faces, the clustering starts taking hours, and we start + // running into stack overflows. The stack overflows can perhaps be avoided + // by restructuring the code, but hours of uninterruptible work is anyways + // not feasible. + + const batchSize = 2500; + for (let i = 0; i < faceEmbeddings.length; i += batchSize) { + const it = Date.now(); + const embeddings = faceEmbeddings.slice(i, i + batchSize); + const { clusters: hdbClusters } = clusterHdbscan(embeddings); + + log.info( + `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - it} ms)`, + ); + + // Merge the new clusters we got from hdbscan into the existing clusters + // if they are "near" them (using some heuristic). + // + // We need to ensure we don't change any of the existing cluster IDs, + // since these might be existing clusters we got from remote. + + for (const hdbCluster of hdbClusters) { + // Find the existing cluster whose (arbitrarily chosen) first face + // is the nearest neighbour of the (arbitrarily chosen) first face + // of the cluster produced by hdbscan. + + const newFace = ensure(faces[i + ensure(hdbCluster[0])]); + + let nnCluster: FaceCluster | undefined; + let nnCosineSimilarity = 0; + for (const existingCluster of clusters) { + const existingFace = firstFaceOfCluster(existingCluster); + + // The vectors are already normalized, so we can directly use their + // dot product as their cosine similarity. + const csim = dotProduct( + existingFace.embedding, + newFace.embedding, + ); + + // Use a higher cosine similarity threshold if either of the two + // faces are blurry. + const threshold = + existingFace.blur < 200 || newFace.blur < 200 ? 0.9 : 0.7; + if (csim > threshold && csim > nnCosineSimilarity) { + nnCluster = existingCluster; + nnCosineSimilarity = csim; + } + } + + if (nnCluster) { + // If we found an existing cluster that is near enough, + // sublimate the cluster produced by hdbscan into that cluster. + for (const j of hdbCluster) { + const { faceID } = ensure(faces[i + j]); + nnCluster.faceIDs.push(faceID); + clusterIDForFaceID.set(faceID, nnCluster.id); + } + } else { + // Otherwise make a new cluster from the cluster produced by + // hdbscan. + const clusterID = newClusterID(); + const faceIDs: string[] = []; + for (const j of hdbCluster) { + const { faceID } = ensure(faces[i + j]); + faceIDs.push(faceID); + clusterIDForFaceID.set(faceID, clusterID); + } + clusterIndexForClusterID.set(clusterID, clusters.length); + clusters.push({ id: clusterID, faceIDs }); + } + } + } + + // Convert into the data structure we're using to debug/visualize. + // const faceAndNeigbours: FaceNeighbours[] = []; + // const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); + // for (const fi of topFaces) { + // let neighbours: FaceNeighbour[] = []; + // for (const fj of faces) { + // // The vectors are already normalized, so we can directly use their + // // dot product as their cosine similarity. + // const csim = dotProduct(fi.embedding, fj.embedding); + // neighbours.push({ face: fj, cosineSimilarity: csim }); + // } + + // neighbours = neighbours + // .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) + // .slice(0, 30); + + // faceAndNeigbours.push({ face: fi, neighbours }); + // } + + // Convert into the data structure we're using to debug/visualize. + // + // > Showing only top 30 and bottom 30 clusters (and only up to 50 faces in + // > each, sorted by cosine distance to highest scoring face in the + // > cluster). + + const sortedClusters = clusters.sort( + (a, b) => b.faceIDs.length - a.faceIDs.length, + ); + const debugClusters = + sortedClusters.length < 60 + ? sortedClusters + : sortedClusters.slice(0, 30).concat(sortedClusters.slice(-30)); + const clusterPreviews: ClusterPreview[] = []; + for (const cluster of debugClusters) { + const faces = cluster.faceIDs.map((id) => + ensure(faceForFaceID.get(id)), + ); + const topFace = faces.reduce((max, face) => + max.score > face.score ? max : face, + ); + const previewFaces: ClusterPreviewFace[] = []; + for (const face of faces) { + const csim = dotProduct(topFace.embedding, face.embedding); + previewFaces.push({ face, cosineSimilarity: csim }); + } + clusterPreviews.push({ + clusterSize: cluster.faceIDs.length, + faces: previewFaces + .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) + .slice(0, 50), + }); + } + + // Prune too small clusters. + // TODO-Cluster this is likely not needed since hdbscan already has a min? + const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); + + // let cgroups = await clusterGroups(); + + // // TODO-Cluster - Currently we're not syncing with remote or saving anything + // // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) + // // cgroup, one per cluster. + // cgroups = cgroups.concat( + // validClusters.map((c) => ({ + // id: c.id, + // name: undefined, + // clusterIDs: [c.id], + // isHidden: false, + // avatarFaceID: undefined, + // displayFaceID: undefined, + // })), + // ); + + // // For each cluster group, use the highest scoring face in any of its + // // clusters as its display face. + // for (const cgroup of cgroups) { + // cgroup.displayFaceID = cgroup.clusterIDs + // .map((clusterID) => clusterIndexForClusterID.get(clusterID)) + // .filter((i) => i !== undefined) /* 0 is a valid index */ + // .flatMap((i) => clusters[i]?.faceIDs ?? []) + // .map((faceID) => faceForFaceID.get(faceID)) + // .filter((face) => !!face) + // .reduce((max, face) => + // max.score > face.score ? max : face, + // ).faceID; + // } + + // TODO-Cluster - Currently we're not syncing with remote or saving anything + // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) + // cgroup, one per cluster. + + const cgroups: CGroup[] = []; + for (const cluster of sortedClusters) { + const faces = cluster.faceIDs.map((id) => + ensure(faceForFaceID.get(id)), + ); + const topFace = faces.reduce((max, face) => + max.score > face.score ? max : face, + ); + cgroups.push({ + id: cluster.id, + name: undefined, + clusterIDs: [cluster.id], + isHidden: false, + avatarFaceID: undefined, + displayFaceID: topFace.faceID, + }); + } + + // log.info("ml/cluster", { + // faces, + // validClusters, + // clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), + // clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), + // cgroups, + // }); + log.info( + `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, + ); + + const clusteredCount = clusterIDForFaceID.size; + const unclusteredCount = faces.length - clusteredCount; return { - clusters: hdbscan.getClusters(), - noise: hdbscan.getNoise(), - debugInfo: hdbscan.getDebugInfo(), + // faces, + clusteredCount, + unclusteredCount, + clusters: validClusters, + cgroups, + clusterPreviews, + clusterIDForFaceID, }; }; + +/** + * A generator function that returns a stream of {faceID, embedding} values, + * flattening all the the faces present in the given {@link faceIndices}. + */ +function* enumerateFaces(faceIndices: FaceIndex[]) { + for (const fi of faceIndices) { + for (const f of fi.faces) { + yield f; + } + } +} + +interface ClusterLinearResult { + clusters: EmbeddingCluster[]; +} + +const clusterLinear = ( + embeddings: number[][], + threshold: number, +): ClusterLinearResult => { + const clusters: EmbeddingCluster[] = []; + const clusterIndexForEmbeddingIndex = new Map(); + // For each embedding + for (const [i, ei] of embeddings.entries()) { + // If the embedding is already part of a cluster, then skip it. + if (clusterIndexForEmbeddingIndex.get(i)) continue; + + // Find the nearest neighbour from among all the other embeddings. + let nnIndex: number | undefined; + let nnCosineSimilarity = 0; + for (const [j, ej] of embeddings.entries()) { + // ! This is an O(n^2) loop, be careful when adding more code here. + + // Skip ourselves. + if (i == j) continue; + + // The vectors are already normalized, so we can directly use their + // dot product as their cosine similarity. + const csim = dotProduct(ei, ej); + if (csim > threshold && csim > nnCosineSimilarity) { + nnIndex = j; + nnCosineSimilarity = csim; + } + } + + if (nnIndex) { + // Find the cluster the nearest neighbour belongs to, if any. + const nnClusterIndex = clusterIndexForEmbeddingIndex.get(nnIndex); + + if (nnClusterIndex) { + // If the neighbour is already part of a cluster, also add + // ourselves to that cluster. + + ensure(clusters[nnClusterIndex]).push(i); + clusterIndexForEmbeddingIndex.set(i, nnClusterIndex); + } else { + // Otherwise create a new cluster with us and our nearest + // neighbour. + + clusterIndexForEmbeddingIndex.set(i, clusters.length); + clusterIndexForEmbeddingIndex.set(nnIndex, clusters.length); + clusters.push([i, nnIndex]); + } + } else { + // We didn't find a neighbour within the threshold. Create a new + // cluster with only this embedding. + + clusterIndexForEmbeddingIndex.set(i, clusters.length); + clusters.push([i]); + } + } + + // Prune singletone clusters. + const validClusters = clusters.filter((cs) => cs.length > 1); + + return { clusters: validClusters }; +}; diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index f6d2043752..5f57ea30e1 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -3,7 +3,7 @@ import log from "@/base/log"; import localForage from "@ente/shared/storage/localForage"; import { deleteDB, openDB, type DBSchema } from "idb"; import type { LocalCLIPIndex } from "./clip"; -import type { CGroup, FaceCluster } from "./cluster-new"; +import type { CGroup, FaceCluster } from "./cluster"; import type { LocalFaceIndex } from "./face"; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index c5ff83c2ef..d4f3c862e3 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -24,7 +24,7 @@ import { type ClusteringOpts, type ClusterPreviewFace, type FaceCluster, -} from "./cluster-new"; +} from "./cluster"; import { regenerateFaceCrops } from "./crop"; import { clearMLDB, faceIndex, indexableAndIndexedCounts } from "./db"; import type { Face } from "./face"; @@ -386,7 +386,7 @@ export const wipClusterDebugPageContents = async ( clusters, cgroups, unclusteredFaces, - } = await worker().then((w) => w.clusterFacesHdb(opts)); + } = await worker().then((w) => w.clusterFaces(opts)); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 6eff182347..518bfb2804 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -24,7 +24,7 @@ import { indexCLIP, type CLIPIndex, } from "./clip"; -import { clusterFacesHdb, type ClusteringOpts } from "./cluster-new"; +import { type ClusteringOpts } from "./cluster"; import { saveFaceCrops } from "./crop"; import { faceIndexes, @@ -276,8 +276,8 @@ export class MLWorker { } // TODO-Cluster - async clusterFacesHdb(opts: ClusteringOpts) { - return clusterFacesHdb(await faceIndexes(), opts); + async clusterFaces(opts: ClusteringOpts) { + return clusterFace(await faceIndexes(), opts); } } diff --git a/web/packages/new/photos/services/user-entity.ts b/web/packages/new/photos/services/user-entity.ts index 7e26726dd5..121171d214 100644 --- a/web/packages/new/photos/services/user-entity.ts +++ b/web/packages/new/photos/services/user-entity.ts @@ -12,7 +12,7 @@ import { ensure } from "@/utils/ensure"; import { nullToUndefined } from "@/utils/transform"; import { z } from "zod"; import { gunzip } from "./gzip"; -import type { CGroup } from "./ml/cluster-new"; +import type { CGroup } from "./ml/cluster"; import { applyCGroupDiff } from "./ml/db"; /** From 4f4eb773fc6c9b6969285cfa7fa0629fea523e5d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 17:24:49 +0530 Subject: [PATCH 0816/1179] Clean --- web/apps/photos/src/pages/cluster-debug.tsx | 4 +- .../new/photos/services/ml/cluster.ts | 139 ++++-------------- web/packages/new/photos/services/ml/index.ts | 10 +- web/packages/new/photos/services/ml/worker.ts | 4 +- 4 files changed, 41 insertions(+), 116 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 7f84b0c5f2..60efbb0118 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -6,7 +6,7 @@ import { type ClusterDebugPageContents, type ClusterPreviewFaceWithFile, } from "@/new/photos/services/ml"; -import { type ClusteringOpts } from "@/new/photos/services/ml/cluster-new"; +import { type ClusteringOpts } from "@/new/photos/services/ml/cluster"; import { faceDirection } from "@/new/photos/services/ml/face"; import { FlexWrapper, @@ -297,7 +297,7 @@ const Header: React.FC = ({ clusterRes, onCluster }) => { const clusterInfo = clusterRes && ( - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces. ${clusterRes.unclusteredFaceCount} unclustered faces.`} + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces in ${(clusterRes.timeTakenMs / 1000).toFixed(0)} seconds. ${clusterRes.unclusteredFaceCount} unclustered faces.`} Showing only top 30 and bottom 30 clusters. diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index f13b889aa1..7eec7af886 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -174,17 +174,11 @@ export const clusterFaces = ( faceIndexes: FaceIndex[], opts: ClusteringOpts, ) => { - const { batchSize, joinThreshold } = opts; + const { method, batchSize, joinThreshold } = opts; const t = Date.now(); // A flattened array of faces. - // TODO-Cluster ad-hoc filtering and slicing - const faces0 = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); - // .slice(0, 6000); - // TODO-Cluster testing code, can be removed once done - const faces = Array(1) - .fill(0) - .flatMap(() => faces0); + const faces = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); // For fast reverse lookup - map from face ids to the face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); @@ -199,6 +193,10 @@ export const clusterFaces = ( // cluster to which it belongs. const clusterIDForFaceID = new Map(); + // Keeps track of which faces were found by the OG clustering algorithm, and + // which were sublimated in from a later match. + const wasMergedFaceIDs = new Set(); + // A function to chain two reverse lookup. const firstFaceOfCluster = (cluster: FaceCluster) => ensure(faceForFaceID.get(ensure(cluster.faceIDs[0]))); @@ -214,18 +212,7 @@ export const clusterFaces = ( // Process the faces in batches. The faces are already sorted by file ID, // which is a monotonically increasing integer, so we will also have some // temporal locality. - // - // The number 2500 was derived by ad-hoc observations and takes a few - // seconds. On a particular test dataset and a particular machine, - // clustering 1k took ~2 seconds, 10k took ~2 mins, while 20k took ~8 mins. - // Memory usage was constant in all these cases. - // - // At around 100k faces, the clustering starts taking hours, and we start - // running into stack overflows. The stack overflows can perhaps be avoided - // by restructuring the code, but hours of uninterruptible work is anyways - // not feasible. - const batchSize = 2500; for (let i = 0; i < faceEmbeddings.length; i += batchSize) { const it = Date.now(); const embeddings = faceEmbeddings.slice(i, i + batchSize); @@ -294,92 +281,34 @@ export const clusterFaces = ( } } - // Convert into the data structure we're using to debug/visualize. - // const faceAndNeigbours: FaceNeighbours[] = []; - // const topFaces = faces.sort((a, b) => b.score - a.score).slice(0, 30); - // for (const fi of topFaces) { - // let neighbours: FaceNeighbour[] = []; - // for (const fj of faces) { - // // The vectors are already normalized, so we can directly use their - // // dot product as their cosine similarity. - // const csim = dotProduct(fi.embedding, fj.embedding); - // neighbours.push({ face: fj, cosineSimilarity: csim }); - // } - - // neighbours = neighbours - // .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) - // .slice(0, 30); - - // faceAndNeigbours.push({ face: fi, neighbours }); - // } - - // Convert into the data structure we're using to debug/visualize. - // - // > Showing only top 30 and bottom 30 clusters (and only up to 50 faces in - // > each, sorted by cosine distance to highest scoring face in the - // > cluster). - const sortedClusters = clusters.sort( (a, b) => b.faceIDs.length - a.faceIDs.length, ); - const debugClusters = + + // Convert into the data structure we're using to debug/visualize. + const clusterPreviewClusters = sortedClusters.length < 60 ? sortedClusters : sortedClusters.slice(0, 30).concat(sortedClusters.slice(-30)); - const clusterPreviews: ClusterPreview[] = []; - for (const cluster of debugClusters) { + const clusterPreviews = clusterPreviewClusters.map((cluster) => { const faces = cluster.faceIDs.map((id) => ensure(faceForFaceID.get(id)), ); - const topFace = faces.reduce((max, face) => - max.score > face.score ? max : face, + const topFace = faces.reduce((top, face) => + top.score > face.score ? top : face, ); - const previewFaces: ClusterPreviewFace[] = []; - for (const face of faces) { + const previewFaces: ClusterPreviewFace[] = faces.map((face) => { const csim = dotProduct(topFace.embedding, face.embedding); - previewFaces.push({ face, cosineSimilarity: csim }); - } - clusterPreviews.push({ + const wasMerged = wasMergedFaceIDs.has(face.faceID); + return { face, cosineSimilarity: csim, wasMerged }; + }); + return { clusterSize: cluster.faceIDs.length, faces: previewFaces .sort((a, b) => b.cosineSimilarity - a.cosineSimilarity) .slice(0, 50), - }); - } - - // Prune too small clusters. - // TODO-Cluster this is likely not needed since hdbscan already has a min? - const validClusters = clusters.filter(({ faceIDs }) => faceIDs.length > 1); - - // let cgroups = await clusterGroups(); - - // // TODO-Cluster - Currently we're not syncing with remote or saving anything - // // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) - // // cgroup, one per cluster. - // cgroups = cgroups.concat( - // validClusters.map((c) => ({ - // id: c.id, - // name: undefined, - // clusterIDs: [c.id], - // isHidden: false, - // avatarFaceID: undefined, - // displayFaceID: undefined, - // })), - // ); - - // // For each cluster group, use the highest scoring face in any of its - // // clusters as its display face. - // for (const cgroup of cgroups) { - // cgroup.displayFaceID = cgroup.clusterIDs - // .map((clusterID) => clusterIndexForClusterID.get(clusterID)) - // .filter((i) => i !== undefined) /* 0 is a valid index */ - // .flatMap((i) => clusters[i]?.faceIDs ?? []) - // .map((faceID) => faceForFaceID.get(faceID)) - // .filter((face) => !!face) - // .reduce((max, face) => - // max.score > face.score ? max : face, - // ).faceID; - // } + }; + }); // TODO-Cluster - Currently we're not syncing with remote or saving anything // locally, so cgroups will be empty. Create a temporary (unsaved, unsynced) @@ -390,8 +319,8 @@ export const clusterFaces = ( const faces = cluster.faceIDs.map((id) => ensure(faceForFaceID.get(id)), ); - const topFace = faces.reduce((max, face) => - max.score > face.score ? max : face, + const topFace = faces.reduce((top, face) => + top.score > face.score ? top : face, ); cgroups.push({ id: cluster.id, @@ -403,28 +332,22 @@ export const clusterFaces = ( }); } - // log.info("ml/cluster", { - // faces, - // validClusters, - // clusterIndexForClusterID: Object.fromEntries(clusterIndexForClusterID), - // clusterIDForFaceID: Object.fromEntries(clusterIDForFaceID), - // cgroups, - // }); + const timeTakenMs = Date.now() - t; log.info( - `Clustered ${faces.length} faces into ${validClusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${Date.now() - t} ms)`, + `Clustered ${faces.length} faces into ${clusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${timeTakenMs} ms)`, ); - const clusteredCount = clusterIDForFaceID.size; - const unclusteredCount = faces.length - clusteredCount; + const clusteredFaceCount = clusterIDForFaceID.size; + const unclusteredFaceCount = faces.length - clusteredFaceCount; return { - // faces, - clusteredCount, - unclusteredCount, - clusters: validClusters, - cgroups, + clusteredFaceCount, + unclusteredFaceCount, clusterPreviews, - clusterIDForFaceID, + clusters: sortedClusters, + cgroups, + unclusteredFaces: [], + timeTakenMs, }; }; diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index d4f3c862e3..836eba693e 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -365,7 +365,8 @@ export interface ClusterDebugPageContents { unclusteredFacesWithFile: { face: Face; enteFile: EnteFile; - }; + }[]; + timeTakenMs: number; } export const wipClusterDebugPageContents = async ( @@ -378,7 +379,6 @@ export const wipClusterDebugPageContents = async ( _wip_searchPersons = undefined; triggerStatusUpdate(); - // const { faceAndNeigbours, clusters, cgroups } = await clusterFaces( const { clusteredFaceCount, unclusteredFaceCount, @@ -386,6 +386,7 @@ export const wipClusterDebugPageContents = async ( clusters, cgroups, unclusteredFaces, + timeTakenMs, } = await worker().then((w) => w.clusterFaces(opts)); const localFiles = await getAllLocalFiles(); @@ -396,10 +397,10 @@ export const wipClusterDebugPageContents = async ( const clusterPreviewsWithFile = clusterPreviews.map( ({ clusterSize, faces }) => ({ clusterSize, - faces: faces.map(({ face, cosineSimilarity }) => ({ + faces: faces.map(({ face, ...rest }) => ({ face, enteFile: fileForFace(face), - cosineSimilarity, + ...rest, })), }), ); @@ -445,6 +446,7 @@ export const wipClusterDebugPageContents = async ( clusters, clusterPreviewsWithFile, unclusteredFacesWithFile, + timeTakenMs, }; }; diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index 518bfb2804..c663abc2c9 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -24,7 +24,7 @@ import { indexCLIP, type CLIPIndex, } from "./clip"; -import { type ClusteringOpts } from "./cluster"; +import { clusterFaces, type ClusteringOpts } from "./cluster"; import { saveFaceCrops } from "./crop"; import { faceIndexes, @@ -277,7 +277,7 @@ export class MLWorker { // TODO-Cluster async clusterFaces(opts: ClusteringOpts) { - return clusterFace(await faceIndexes(), opts); + return clusterFaces(await faceIndexes(), opts); } } From a9bc6502cb8c32695f3c9048285e727cac439fd7 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 30 Aug 2024 13:58:46 +0200 Subject: [PATCH 0817/1179] [mob][photos] proper logging in ML indexing isolate --- .../face_detection_service.dart | 28 +++------- .../face_embedding_service.dart | 8 +-- .../face_ml/face_recognition_service.dart | 54 ++++++++++--------- .../machine_learning/ml_computer.dart | 4 +- .../machine_learning/ml_indexing_isolate.dart | 10 ++-- .../clip/clip_image_encoder.dart | 21 ++++++-- .../semantic_search_service.dart | 7 +-- mobile/lib/utils/image_ml_util.dart | 12 +++-- mobile/lib/utils/ml_util.dart | 15 ++++-- 9 files changed, 85 insertions(+), 74 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart index c232317b3a..728de95dae 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_detection/face_detection_service.dart @@ -1,5 +1,4 @@ import "dart:async"; -import "dart:developer" as dev show log; import 'dart:typed_data' show ByteData, Float32List; import 'dart:ui' as ui show Image; @@ -55,9 +54,8 @@ class FaceDetectionService extends MlModel { 'sessionAddress should be valid', ); - final stopwatch = Stopwatch()..start(); + final startTime = DateTime.now(); - final stopwatchPreprocessing = Stopwatch()..start(); final (inputImageList, newSize) = await preprocessImageToFloat32ChannelsFirst( image, @@ -67,17 +65,12 @@ class FaceDetectionService extends MlModel { requiredHeight: kInputHeight, maintainAspectRatio: true, ); - stopwatchPreprocessing.stop(); - dev.log( - 'Face detection image preprocessing is finished, in ${stopwatchPreprocessing.elapsedMilliseconds}ms', - ); + final preprocessingTime = DateTime.now(); _logger.info( - 'Image decoding and preprocessing is finished, in ${stopwatchPreprocessing.elapsedMilliseconds}ms', + 'Face detection preprocessing is finished, in ${preprocessingTime.difference(startTime).inMilliseconds} ms', ); // Run inference - final stopwatchInterpreter = Stopwatch()..start(); - List>>? nestedResults = []; try { if (MlModel.usePlatformPlugin) { @@ -88,23 +81,16 @@ class FaceDetectionService extends MlModel { inputImageList, ); // [1, 25200, 16] } + _logger.info( + 'inference is finished, in ${DateTime.now().difference(preprocessingTime).inMilliseconds} ms', + ); } catch (e, s) { - dev.log('Error while running inference', error: e, stackTrace: s); + _logger.severe('Error while running inference', e, s); throw YOLOFaceInterpreterRunException(); } - stopwatchInterpreter.stop(); try { - _logger.info( - 'interpreter.run is finished, in ${stopwatchInterpreter.elapsedMilliseconds} ms', - ); - final relativeDetections = _yoloPostProcessOutputs(nestedResults!, newSize); - stopwatch.stop(); - _logger.info( - 'predict() face detection executed in ${stopwatch.elapsedMilliseconds}ms', - ); - return relativeDetections; } catch (e, s) { _logger.severe('Error while post processing', e, s); diff --git a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart index f36a69c752..0853112c44 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_embedding/face_embedding_service.dart @@ -46,9 +46,11 @@ class FaceEmbeddingService extends MlModel { } else { return _runFFIBasedPredict(input, sessionAddress); } - } catch (e) { - _logger.info( - 'MobileFaceNet (PlatformPlugin: $MlModel.usePlatformPlugin)Error while running inference: $e', + } catch (e, s) { + _logger.severe( + 'Error while running inference (PlatformPlugin: ${MlModel.usePlatformPlugin})', + e, + s, ); throw MobileFaceNetInterpreterRunException(); } diff --git a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart index 8b3bb7eda1..22e3019517 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_recognition_service.dart @@ -1,5 +1,4 @@ import "dart:async" show unawaited; -import "dart:developer" as dev show log; import "dart:typed_data" show ByteData, Float32List; import "dart:ui" show Image; @@ -16,7 +15,7 @@ import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/utils/image_ml_util.dart"; class FaceRecognitionService { - final _logger = Logger("FaceRecognitionService"); + static final _logger = Logger("FaceRecognitionService"); // Singleton pattern FaceRecognitionService._privateConstructor(); @@ -76,8 +75,6 @@ class FaceRecognitionService { int faceEmbeddingAddress, ) async { final faceResults = []; - - final Stopwatch stopwatch = Stopwatch()..start(); final startTime = DateTime.now(); // Get the faces @@ -89,19 +86,17 @@ class FaceRecognitionService { faceDetectionAddress, faceResults, ); - dev.log( - "${faceDetectionResult.length} faces detected with scores ${faceDetectionResult.map((e) => e.score).toList()}: completed `detectFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); + final detectFacesTime = DateTime.now(); + final detectFacesMs = detectFacesTime.difference(startTime).inMilliseconds; // If no faces were detected, return a result with no faces. Otherwise, continue. if (faceDetectionResult.isEmpty) { - dev.log( - "No faceDetectionResult, Completed analyzing image with uploadedFileID $enteFileID, in " - "${stopwatch.elapsedMilliseconds} ms"); + _logger.info( + "Finished runFacesPipeline with fileID $enteFileID in $detectFacesMs ms (${faceDetectionResult.length} faces, detectFaces: $detectFacesMs ms)", + ); return []; } - stopwatch.reset(); // Align the faces final Float32List faceAlignmentResult = await _alignFacesSync( image, @@ -109,23 +104,24 @@ class FaceRecognitionService { faceDetectionResult, faceResults, ); - dev.log("Completed `alignFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); + final alignFacesTime = DateTime.now(); + final alignFacesMs = + alignFacesTime.difference(detectFacesTime).inMilliseconds; - stopwatch.reset(); // Get the embeddings of the faces - final embeddings = await _embedFacesSync( + await _embedFacesSync( faceAlignmentResult, faceEmbeddingAddress, faceResults, ); - dev.log("Completed `embedFacesSync` function, in " - "${stopwatch.elapsedMilliseconds} ms"); - stopwatch.stop(); + final embedFacesTime = DateTime.now(); + final embedFacesMs = + embedFacesTime.difference(alignFacesTime).inMilliseconds; + final totalMs = DateTime.now().difference(startTime).inMilliseconds; - dev.log("Finished faces pipeline (${embeddings.length} faces) with " - "uploadedFileID $enteFileID, in " - "${DateTime.now().difference(startTime).inMilliseconds} ms"); + _logger.info( + "Finished runFacesPipeline with fileID $enteFileID in $totalMs ms (${faceDetectionResult.length} faces, detectFaces: $detectFacesMs ms, alignFaces: $alignFacesMs ms, embedFaces: $embedFacesMs ms)", + ); return faceResults; } @@ -160,8 +156,8 @@ class FaceRecognitionService { return faces; } on YOLOFaceInterpreterRunException { throw CouldNotRunFaceDetector(); - } catch (e) { - dev.log('[SEVERE] Face detection failed: $e'); + } catch (e, s) { + _logger.severe('Face detection failed', e, s); throw GeneralFaceMlException('Face detection failed: $e'); } } @@ -184,6 +180,9 @@ class FaceRecognitionService { // Store the results if (alignmentResults.length != faces.length) { + _logger.severe( + "The amount of alignment results (${alignmentResults.length}) does not match the number of faces (${faces.length})", + ); throw Exception( "The amount of alignment results (${alignmentResults.length}) does not match the number of faces (${faces.length})", ); @@ -195,7 +194,7 @@ class FaceRecognitionService { return alignedFaces; } catch (e, s) { - dev.log('[SEVERE] Face alignment failed: $e $s'); + _logger.severe('Face alignment failed: $e $s'); throw CouldNotWarpAffine(); } } @@ -214,6 +213,9 @@ class FaceRecognitionService { // Store the results if (embeddings.length != faceResults.length) { + _logger.severe( + "The amount of embeddings (${embeddings.length}) does not match the number of faces (${faceResults.length})", + ); throw Exception( "The amount of embeddings (${embeddings.length}) does not match the number of faces (${faceResults.length})", ); @@ -225,8 +227,8 @@ class FaceRecognitionService { return embeddings; } on MobileFaceNetInterpreterRunException { throw CouldNotRunFaceEmbeddor(); - } catch (e) { - dev.log('[SEVERE] Face embedding (batch) failed: $e'); + } catch (e, s) { + _logger.severe('Face embedding (batch) failed', e, s); throw GeneralFaceMlException('Face embedding (batch) failed: $e'); } } diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 8f27dfb3d4..78743bbd84 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -102,6 +102,7 @@ class MLComputer { sendPort.send(true); break; case MLComputerOperation.runClipText: + //TODO:lau check logging here final textEmbedding = await ClipTextEncoder.predict(args); sendPort.send(List.from(textEmbedding, growable: false)); break; @@ -199,7 +200,8 @@ class MLComputer { // Load ClipText model final String modelName = ClipTextEncoder.instance.modelName; - final String? modelPath = await ClipTextEncoder.instance.downloadModelSafe(); + final String? modelPath = + await ClipTextEncoder.instance.downloadModelSafe(); if (modelPath == null) { throw Exception("Could not download clip text model, no wifi"); } diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index fec1cbf410..66772dd40b 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -67,9 +67,7 @@ class MLIndexingIsolate { @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; - Logger.root.onRecord.listen((LogRecord rec) { - debugPrint('[MLIsolate] ${rec.toPrettyString()}'); - }); + Logger.root.onRecord.listen(SuperLogging.onLogRecord); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); receivePort.listen((message) async { @@ -81,11 +79,7 @@ class MLIndexingIsolate { try { switch (function) { case MLIndexingOperation.analyzeImage: - final time = DateTime.now(); final MLResult result = await analyzeImageStatic(args); - _logger.info( - "`analyzeImageSync` function executed in ${DateTime.now().difference(time).inMilliseconds} ms", - ); sendPort.send(result.toJsonString()); break; case MLIndexingOperation.loadModels: @@ -93,6 +87,7 @@ class MLIndexingIsolate { final modelPaths = args['modelPaths'] as List; final addresses = []; for (int i = 0; i < modelNames.length; i++) { + // TODO:lau check logging here final int address = await MlModel.loadModel( modelNames[i], modelPaths[i], @@ -102,6 +97,7 @@ class MLIndexingIsolate { sendPort.send(List.from(addresses, growable: false)); break; case MLIndexingOperation.releaseModels: + // TODO:lau check logging here final modelNames = args['modelNames'] as List; final modelAddresses = args['modelAddresses'] as List; for (int i = 0; i < modelNames.length; i++) { diff --git a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart index 1b6e8a9ebe..193e9bac14 100644 --- a/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart +++ b/mobile/lib/services/machine_learning/semantic_search/clip/clip_image_encoder.dart @@ -31,14 +31,27 @@ class ClipImageEncoder extends MlModel { static Future> predict( Image image, ByteData imageByteData, - int sessionAddress, - ) async { + int sessionAddress, [ + int? enteFileID, + ]) async { + final startTime = DateTime.now(); final inputList = await preprocessImageClip(image, imageByteData); + final preprocessingTime = DateTime.now(); + final preprocessingMs = + preprocessingTime.difference(startTime).inMilliseconds; + late List result; if (MlModel.usePlatformPlugin) { - return await _runPlatformPluginPredict(inputList); + result = await _runPlatformPluginPredict(inputList); } else { - return _runFFIBasedPredict(inputList, sessionAddress); + result = _runFFIBasedPredict(inputList, sessionAddress); } + final inferTime = DateTime.now(); + final inferenceMs = inferTime.difference(preprocessingTime).inMilliseconds; + final totalMs = inferTime.difference(startTime).inMilliseconds; + _logger.info( + "Clip predict took $totalMs ms${enteFileID != null ? " with fileID $enteFileID" : ""} (nference: $inferenceMs ms, preprocessing: $preprocessingMs ms)", + ); + return result; } static List _runFFIBasedPredict( diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 7beb284df7..067259307f 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -24,7 +24,7 @@ import "package:photos/services/machine_learning/semantic_search/clip/clip_image import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { - final _logger = Logger("SemanticSearchService"); + static final _logger = Logger("SemanticSearchService"); SemanticSearchService._privateConstructor(); static final SemanticSearchService instance = @@ -293,18 +293,15 @@ class SemanticSearchService { ByteData imageByteData, int clipImageAddress, ) async { - final startTime = DateTime.now(); final embedding = await ClipImageEncoder.predict( image, imageByteData, clipImageAddress, + enteFileID, ); final clipResult = ClipResult(fileID: enteFileID, embedding: embedding); - dev.log('Finished running ClipImage for $enteFileID in ' - '${DateTime.now().difference(startTime).inMilliseconds} ms'); - return clipResult; } } diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index e8eb3e7312..0de42f0c98 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -35,7 +35,9 @@ Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { await HeifConverter.convert(imagePath, format: 'jpg'); if (jpgPath == null) { _logger.severe('Error converting $format to jpg:', e, s); - throw Exception('InvalidImageFormatException: Error decoding image of format $format'); + throw Exception( + 'InvalidImageFormatException: Error decoding image of format $format', + ); } final imageData = await File(jpgPath).readAsBytes(); final image = await decodeImageFromData(imageData); @@ -47,7 +49,9 @@ Future<(Image, ByteData)> decodeImageFromPath(String imagePath) async { e, s, ); - throw Exception('InvalidImageFormatException: Error decoding image of format $format'); + throw Exception( + 'InvalidImageFormatException: Error decoding image of format $format', + ); } } } @@ -278,7 +282,9 @@ Future<(Float32List, List, List, List, Size)> final (alignmentResult, correctlyEstimated) = SimilarityTransform.estimate(face.allKeypoints); if (!correctlyEstimated) { - log('Face alignment failed because not able to estimate SimilarityTransform, for face: $face'); + _logger.severe( + 'Face alignment failed because not able to estimate SimilarityTransform, for face: $face', + ); throw Exception( 'Face alignment failed because not able to estimate SimilarityTransform', ); diff --git a/mobile/lib/utils/ml_util.dart b/mobile/lib/utils/ml_util.dart index 01ddd353a9..817c0bd4ea 100644 --- a/mobile/lib/utils/ml_util.dart +++ b/mobile/lib/utils/ml_util.dart @@ -388,18 +388,20 @@ Future analyzeImageStatic(Map args) async { final int clipImageAddress = args["clipImageAddress"] as int; _logger.info( - "Start analyzing image with uploadedFileID: $enteFileID inside the isolate", + "Start analyzeImageStatic with fileID: $enteFileID (runFaces: $runFaces, runClip: $runClip)", ); - final time = DateTime.now(); + final startTime = DateTime.now(); // Decode the image once to use for both face detection and alignment final (image, imageByteData) = await decodeImageFromPath(imagePath); - _logger.info('Reading and decoding image took ' - '${DateTime.now().difference(time).inMilliseconds} ms'); final decodedImageSize = Dimensions(height: image.height, width: image.width); final result = MLResult.fromEnteFileID(enteFileID); result.decodedImageSize = decodedImageSize; + final decodeTime = DateTime.now(); + _logger.info( + 'Reading and decoding image took ${decodeTime.difference(startTime).inMilliseconds} ms (fileID: $enteFileID)', + ); if (runFaces) { final resultFaces = await FaceRecognitionService.runFacesPipeline( @@ -426,6 +428,11 @@ Future analyzeImageStatic(Map args) async { result.clip = clipResult; } + final endTime = DateTime.now(); + _logger.info( + 'Finished analyzeImageStatic with fileID: $enteFileID, in ${endTime.difference(startTime).inMilliseconds} ms', + ); + return result; } catch (e, s) { _logger.severe("Could not analyze image", e, s); From 96397c24b41bf79f8a39ccb3f75730b113d46c1b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 17:36:01 +0530 Subject: [PATCH 0818/1179] Fin --- .../new/photos/services/ml/cluster.ts | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 7eec7af886..f53b8bbf03 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -209,31 +209,37 @@ export const clusterFaces = ( // be list of existing clusters we fetch from remote. const clusters: FaceCluster[] = []; - // Process the faces in batches. The faces are already sorted by file ID, - // which is a monotonically increasing integer, so we will also have some - // temporal locality. - + // Process the faces in batches. for (let i = 0; i < faceEmbeddings.length; i += batchSize) { const it = Date.now(); - const embeddings = faceEmbeddings.slice(i, i + batchSize); - const { clusters: hdbClusters } = clusterHdbscan(embeddings); + + const embeddingBatch = faceEmbeddings.slice(i, i + batchSize); + let embeddingClusters: EmbeddingCluster[]; + if (method == "hdbscan") { + ({ clusters: embeddingClusters } = clusterHdbscan(embeddingBatch)); + } else { + ({ clusters: embeddingClusters } = clusterLinear( + embeddingBatch, + joinThreshold, + )); + } log.info( - `hdbscan produced ${hdbClusters.length} clusters from ${embeddings.length} faces (${Date.now() - it} ms)`, + `${method} produced ${embeddingClusters.length} clusters from ${embeddingBatch.length} faces (${Date.now() - it} ms)`, ); - // Merge the new clusters we got from hdbscan into the existing clusters - // if they are "near" them (using some heuristic). + // Merge the new clusters we got from this batch into the existing + // clusters if they are "near" enough (using some heuristic). // // We need to ensure we don't change any of the existing cluster IDs, // since these might be existing clusters we got from remote. - for (const hdbCluster of hdbClusters) { + for (const newCluster of embeddingClusters) { // Find the existing cluster whose (arbitrarily chosen) first face // is the nearest neighbour of the (arbitrarily chosen) first face - // of the cluster produced by hdbscan. + // of the cluster produced in this batch. - const newFace = ensure(faces[i + ensure(hdbCluster[0])]); + const newFace = ensure(faces[i + ensure(newCluster[0])]); let nnCluster: FaceCluster | undefined; let nnCosineSimilarity = 0; @@ -250,27 +256,29 @@ export const clusterFaces = ( // Use a higher cosine similarity threshold if either of the two // faces are blurry. const threshold = - existingFace.blur < 200 || newFace.blur < 200 ? 0.9 : 0.7; + existingFace.blur < 200 || newFace.blur < 200 + ? 0.9 + : joinThreshold; if (csim > threshold && csim > nnCosineSimilarity) { nnCluster = existingCluster; nnCosineSimilarity = csim; } } + // If we found an existing cluster that is near enough, merge the + // new cluster into the existing cluster. if (nnCluster) { - // If we found an existing cluster that is near enough, - // sublimate the cluster produced by hdbscan into that cluster. - for (const j of hdbCluster) { + for (const j of newCluster) { const { faceID } = ensure(faces[i + j]); + wasMergedFaceIDs.add(faceID); nnCluster.faceIDs.push(faceID); clusterIDForFaceID.set(faceID, nnCluster.id); } } else { - // Otherwise make a new cluster from the cluster produced by - // hdbscan. + // Otherwise retain the new cluster. const clusterID = newClusterID(); const faceIDs: string[] = []; - for (const j of hdbCluster) { + for (const j of newCluster) { const { faceID } = ensure(faces[i + j]); faceIDs.push(faceID); clusterIDForFaceID.set(faceID, clusterID); From 7ff9dd5a5750bf54b29c497f6c2f176a7ff64d12 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 17:48:29 +0530 Subject: [PATCH 0819/1179] LF --- web/apps/photos/src/pages/cluster-debug.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 60efbb0118..a0997da481 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -97,7 +97,7 @@ const ClusterList: React.FC = ({ height, width }) => { const [items, setItems] = useState([]); const listRef = useRef(null); - // eslint-disable-next-line @typescript-eslint/no-unused-vars + const cluster = async (opts: ClusteringOpts) => { startLoading(); setClusterRes(await wipClusterDebugPageContents(opts)); From b93a591401cfe9182e221ec4579179ed1653e2ad Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 17:58:47 +0530 Subject: [PATCH 0820/1179] Rem params --- web/apps/photos/src/pages/cluster-debug.tsx | 26 +++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index a0997da481..2795ee5303 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -73,7 +73,6 @@ const Options: React.FC = () => { const Container = styled("div")` display: block; - border: 1px solid tomato; flex: 1; width: 100%; flex-wrap: wrap; @@ -91,14 +90,16 @@ interface ClusterListProps { const ClusterList: React.FC = ({ height, width }) => { const { startLoading, finishLoading } = useContext(AppContext); + const [clusteringOpts, setClusteringOpts] = useState(); const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); const [items, setItems] = useState([]); const listRef = useRef(null); - const cluster = async (opts: ClusteringOpts) => { + setClusteringOpts(opts); + setClusterRes(undefined); startLoading(); setClusterRes(await wipClusterDebugPageContents(opts)); finishLoading(); @@ -141,6 +142,7 @@ const ClusterList: React.FC = ({ height, width }) => { return (
@@ -233,20 +235,20 @@ const ListItem = styled("div")` `; interface HeaderProps { + clusteringOpts: ClusteringOpts; clusterRes: ClusterDebugPageContents | undefined; onCluster: (opts: ClusteringOpts) => Promise; } -const Header: React.FC = ({ clusterRes, onCluster }) => { - const { values, handleSubmit, handleChange, isSubmitting } = - useFormik({ - initialValues: { - method: "hdbscan", - joinThreshold: 0.7, - batchSize: 2500, - }, - onSubmit: onCluster, - }); +const Header: React.FC = ({ + clusteringOpts, + clusterRes, + onCluster, +}) => { + const { values, handleSubmit, handleChange, isSubmitting } = useFormik({ + initialValues: clusteringOpts, + onSubmit: onCluster, + }); const form = (
From b06bd19bc9bfd7482fffb6fbdcb2e6ab223dbd8f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 18:07:17 +0530 Subject: [PATCH 0821/1179] Unclustered --- web/apps/photos/src/pages/cluster-debug.tsx | 47 ++++++++++++++----- .../new/photos/services/ml/cluster.ts | 12 +++-- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 2795ee5303..127133b323 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -4,10 +4,10 @@ import { faceCrop, wipClusterDebugPageContents, type ClusterDebugPageContents, - type ClusterPreviewFaceWithFile, } from "@/new/photos/services/ml"; import { type ClusteringOpts } from "@/new/photos/services/ml/cluster"; -import { faceDirection } from "@/new/photos/services/ml/face"; +import { faceDirection, type Face } from "@/new/photos/services/ml/face"; +import type { EnteFile } from "@/new/photos/types/file"; import { FlexWrapper, FluidContainer, @@ -90,7 +90,11 @@ interface ClusterListProps { const ClusterList: React.FC = ({ height, width }) => { const { startLoading, finishLoading } = useContext(AppContext); - const [clusteringOpts, setClusteringOpts] = useState(); + const [clusteringOpts, setClusteringOpts] = useState({ + method: "hdbscan", + joinThreshold: 0.7, + batchSize: 2500, + }); const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); @@ -158,7 +162,7 @@ const ClusterList: React.FC = ({ height, width }) => { > {!Array.isArray(item) ? ( - {`cluster size ${item.toFixed(2)}`} + {item} ) : ( item.map((f, i) => ( @@ -176,24 +180,36 @@ const ClusterList: React.FC = ({ height, width }) => { ); }; -type Item = number | ClusterPreviewFaceWithFile[]; +type Item = string | FaceWithFile[]; const itemsFromClusterRes = ( clusterRes: ClusterDebugPageContents, columns: number, ) => { - const { clusterPreviewsWithFile } = clusterRes; + const { clusterPreviewsWithFile, unclusteredFacesWithFile } = clusterRes; const result: Item[] = []; for (let index = 0; index < clusterPreviewsWithFile.length; index++) { const { clusterSize, faces } = clusterPreviewsWithFile[index]; - result.push(clusterSize); + result.push(`cluster size ${clusterSize.toFixed(2)}`); let lastIndex = 0; while (lastIndex < faces.length) { result.push(faces.slice(lastIndex, lastIndex + columns)); lastIndex += columns; } } + + if (unclusteredFacesWithFile.length) { + result.push(`•• unclustered faces ${unclusteredFacesWithFile.length}`); + let lastIndex = 0; + while (lastIndex < unclusteredFacesWithFile.length) { + result.push( + unclusteredFacesWithFile.slice(lastIndex, lastIndex + columns), + ); + lastIndex += columns; + } + } + return result; }; @@ -334,7 +350,14 @@ const Loader = () => ( ); interface FaceItemProps { - faceWithFile: ClusterPreviewFaceWithFile; + faceWithFile: FaceWithFile; +} + +interface FaceWithFile { + face: Face; + enteFile: EnteFile; + cosineSimilarity?: number; + wasMerged?: boolean; } const FaceItem: React.FC = ({ faceWithFile }) => { @@ -384,9 +407,11 @@ const FaceItem: React.FC = ({ faceWithFile }) => { {`s${face.score.toFixed(1)}`} - - {`c${cosineSimilarity.toFixed(1)}`} - + {cosineSimilarity && ( + + {`c${cosineSimilarity.toFixed(1)}`} + + )} {`d${d}`} diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index f53b8bbf03..e667884cb8 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -340,21 +340,25 @@ export const clusterFaces = ( }); } + const clusteredFaceCount = clusterIDForFaceID.size; + const unclusteredFaceCount = faces.length - clusteredFaceCount; + + const unclusteredFaces = faces.filter( + ({ faceID }) => !clusterIDForFaceID.has(faceID), + ); + const timeTakenMs = Date.now() - t; log.info( `Clustered ${faces.length} faces into ${clusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${timeTakenMs} ms)`, ); - const clusteredFaceCount = clusterIDForFaceID.size; - const unclusteredFaceCount = faces.length - clusteredFaceCount; - return { clusteredFaceCount, unclusteredFaceCount, clusterPreviews, clusters: sortedClusters, cgroups, - unclusteredFaces: [], + unclusteredFaces: unclusteredFaces, timeTakenMs, }; }; From 1881dde11fe605fb8dc0a0d31e7dbea5739b3ca8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 18:13:10 +0530 Subject: [PATCH 0822/1179] Fix aliasing --- web/packages/new/photos/services/ml/cluster.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index e667884cb8..266a089474 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -234,6 +234,10 @@ export const clusterFaces = ( // We need to ensure we don't change any of the existing cluster IDs, // since these might be existing clusters we got from remote. + // Create a copy so that we don't modify existing clusters as we're + // iterating. + const existingClusters = [...clusters]; + for (const newCluster of embeddingClusters) { // Find the existing cluster whose (arbitrarily chosen) first face // is the nearest neighbour of the (arbitrarily chosen) first face @@ -243,7 +247,7 @@ export const clusterFaces = ( let nnCluster: FaceCluster | undefined; let nnCosineSimilarity = 0; - for (const existingCluster of clusters) { + for (const existingCluster of existingClusters) { const existingFace = firstFaceOfCluster(existingCluster); // The vectors are already normalized, so we can directly use their From c6ec5cf64546feba742051362337fc9f26b3da3b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 18:13:46 +0530 Subject: [PATCH 0823/1179] [mob][photos] Fix state issue with video loop toggle button --- mobile/lib/ui/viewer/file/file_app_bar.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 92d6d54239..b65a9d9c1e 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -57,6 +57,7 @@ class FileAppBarState extends State { late final StreamSubscription _guestViewEventSubscription; bool isGuestView = false; bool shouldLoopVideo = Configuration.instance.shouldLoopVideo(); + bool _reloadActions = false; @override void didUpdateWidget(FileAppBar oldWidget) { @@ -89,8 +90,9 @@ class FileAppBarState extends State { //When the widget is initialized, the actions are not available. //Cannot call _getActions() in initState. - if (_actions.isEmpty) { + if (_actions.isEmpty || _reloadActions) { _getActions(); + _reloadActions = false; } final isTrashedFile = widget.file is TrashFile; @@ -372,6 +374,7 @@ class FileAppBarState extends State { _onToggleVideoLoop() { Configuration.instance.setShouldLoopVideo(!shouldLoopVideo); setState(() { + _reloadActions = true; shouldLoopVideo = !shouldLoopVideo; }); } From d2459016f12472459db899c656b27da56142250a Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 18:19:11 +0530 Subject: [PATCH 0824/1179] [mob][photos] Change copy --- mobile/lib/ui/viewer/file/file_app_bar.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index b65a9d9c1e..9fb901af6e 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -334,8 +334,8 @@ class FileAppBarState extends State { padding: EdgeInsets.all(8), ), shouldLoopVideo - ? const Text("Video loop on") - : const Text("Video loop off"), + ? const Text("Loop video on") + : const Text("Loop video off"), ], ), ), @@ -362,7 +362,7 @@ class FileAppBarState extends State { } else if (value == 6) { await _onTapGuestView(); } else if (value == 7) { - _onToggleVideoLoop(); + _onToggleLoopVideo(); } }, ), @@ -371,7 +371,7 @@ class FileAppBarState extends State { return _actions; } - _onToggleVideoLoop() { + _onToggleLoopVideo() { Configuration.instance.setShouldLoopVideo(!shouldLoopVideo); setState(() { _reloadActions = true; From 70ad285e094c95c9f384fb766320168a0684ab0f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 18:21:36 +0530 Subject: [PATCH 0825/1179] [mob][photos] Extract strings --- mobile/lib/generated/intl/messages_ar.dart | 2 ++ mobile/lib/generated/intl/messages_bg.dart | 5 ++++- mobile/lib/generated/intl/messages_ca.dart | 5 ++++- mobile/lib/generated/intl/messages_cs.dart | 5 ++++- mobile/lib/generated/intl/messages_da.dart | 2 ++ mobile/lib/generated/intl/messages_de.dart | 2 ++ mobile/lib/generated/intl/messages_el.dart | 4 +++- mobile/lib/generated/intl/messages_en.dart | 4 +++- mobile/lib/generated/intl/messages_es.dart | 2 ++ mobile/lib/generated/intl/messages_et.dart | 5 ++++- mobile/lib/generated/intl/messages_fa.dart | 2 ++ mobile/lib/generated/intl/messages_fr.dart | 2 ++ mobile/lib/generated/intl/messages_gu.dart | 5 ++++- mobile/lib/generated/intl/messages_he.dart | 2 ++ mobile/lib/generated/intl/messages_hi.dart | 2 ++ mobile/lib/generated/intl/messages_id.dart | 2 ++ mobile/lib/generated/intl/messages_it.dart | 2 ++ mobile/lib/generated/intl/messages_ja.dart | 5 ++++- mobile/lib/generated/intl/messages_km.dart | 5 ++++- mobile/lib/generated/intl/messages_ko.dart | 2 ++ mobile/lib/generated/intl/messages_nl.dart | 2 ++ mobile/lib/generated/intl/messages_no.dart | 2 ++ mobile/lib/generated/intl/messages_pl.dart | 2 ++ mobile/lib/generated/intl/messages_pt.dart | 2 ++ mobile/lib/generated/intl/messages_ru.dart | 2 ++ mobile/lib/generated/intl/messages_sv.dart | 2 ++ mobile/lib/generated/intl/messages_te.dart | 5 ++++- mobile/lib/generated/intl/messages_th.dart | 2 ++ mobile/lib/generated/intl/messages_ti.dart | 5 ++++- mobile/lib/generated/intl/messages_tr.dart | 2 ++ mobile/lib/generated/intl/messages_zh.dart | 2 ++ mobile/lib/generated/l10n.dart | 24 +++++++++++++++++++-- mobile/lib/l10n/intl_ar.arb | 4 +++- mobile/lib/l10n/intl_bg.arb | 4 +++- mobile/lib/l10n/intl_ca.arb | 4 +++- mobile/lib/l10n/intl_cs.arb | 4 +++- mobile/lib/l10n/intl_da.arb | 4 +++- mobile/lib/l10n/intl_de.arb | 4 +++- mobile/lib/l10n/intl_el.arb | 4 +++- mobile/lib/l10n/intl_en.arb | 4 +++- mobile/lib/l10n/intl_es.arb | 4 +++- mobile/lib/l10n/intl_et.arb | 4 +++- mobile/lib/l10n/intl_fa.arb | 4 +++- mobile/lib/l10n/intl_fr.arb | 4 +++- mobile/lib/l10n/intl_gu.arb | 4 +++- mobile/lib/l10n/intl_he.arb | 4 +++- mobile/lib/l10n/intl_hi.arb | 4 +++- mobile/lib/l10n/intl_id.arb | 4 +++- mobile/lib/l10n/intl_it.arb | 4 +++- mobile/lib/l10n/intl_ja.arb | 4 +++- mobile/lib/l10n/intl_km.arb | 4 +++- mobile/lib/l10n/intl_ko.arb | 4 +++- mobile/lib/l10n/intl_nl.arb | 4 +++- mobile/lib/l10n/intl_no.arb | 4 +++- mobile/lib/l10n/intl_pl.arb | 4 +++- mobile/lib/l10n/intl_pt.arb | 4 +++- mobile/lib/l10n/intl_ru.arb | 4 +++- mobile/lib/l10n/intl_sv.arb | 4 +++- mobile/lib/l10n/intl_te.arb | 4 +++- mobile/lib/l10n/intl_th.arb | 4 +++- mobile/lib/l10n/intl_ti.arb | 4 +++- mobile/lib/l10n/intl_tr.arb | 4 +++- mobile/lib/l10n/intl_zh.arb | 4 +++- mobile/lib/ui/viewer/file/file_app_bar.dart | 4 ++-- 64 files changed, 199 insertions(+), 46 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 1ce7ba622c..aea20b16df 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -41,6 +41,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("مفتاح الاسترداد غير صحيح"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage( "عنوان البريد الإلكتروني غير صالح"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index e887127f40..851852e93c 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'bg'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index 84dea987b0..09442d5939 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ca'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 2bfb5800f1..d356229fc0 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'cs'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index f243887b61..9b8ffaf2a0 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -100,6 +100,8 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen."), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manage": MessageLookupByLibrary.simpleMessage("Administrér"), "memoryCount": m0, "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 90dc0b7f0d..3efeeb2b0a 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -1009,6 +1009,8 @@ class MessageLookup extends MessageLookupByLibrary { "Lange auf eine E-Mail drücken, um die Ende-zu-Ende-Verschlüsselung zu überprüfen."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Drücken Sie lange auf ein Element, um es im Vollbildmodus anzuzeigen"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Gerät verloren?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Maschinelles Lernen"), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index 79c0433b27..806ebe1f80 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -23,6 +23,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( - "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") + "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 0c377470aa..cd4e029a65 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -501,7 +501,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Confirm Account Deletion"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Yes, I want to permanently delete this account and all its data."), + "Yes, I want to permanently delete this account and its data across all apps."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Confirm password"), "confirmPlanChange": @@ -969,6 +969,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Long-press on an item to view in full-screen"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Lost device?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Machine learning"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 479c1538a0..8fdf9da3e8 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -987,6 +987,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Manten presionado un elemento para ver en pantalla completa"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("¿Perdiste tu dispositivo?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index c1b8a2ba7e..064920dfe8 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'et'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index b6650a943a..0ad7da61da 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -249,6 +249,8 @@ class MessageLookup extends MessageLookupByLibrary { "loginTerms": MessageLookupByLibrary.simpleMessage( "با کلیک بر روی ورود به سیستم، من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم"), "logout": MessageLookupByLibrary.simpleMessage("خروج"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manage": MessageLookupByLibrary.simpleMessage("مدیریت"), "manageFamily": MessageLookupByLibrary.simpleMessage("مدیریت خانواده"), "manageLink": MessageLookupByLibrary.simpleMessage("مدیریت پیوند"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index af1060e22b..001b99ef5f 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -1010,6 +1010,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Appuyez longuement sur un élément pour le voir en plein écran"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Appareil perdu ?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Apprentissage automatique"), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index 6c1d7e4d90..fb3ab8be3b 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'gu'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index e27bbe712b..ca95dae231 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -557,6 +557,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("איבדת את המכשיר?"), "manage": MessageLookupByLibrary.simpleMessage("נהל"), "manageDeviceStorage": diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index ce390ea7e0..f90d881b1d 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -77,6 +77,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("अमान्य ईमेल ऐड्रेस"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "कृपया हमें इस जानकारी के लिए सहायता करें"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("रिकवरी कुंजी नहीं है?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 3d0cee4c14..cfa7ce2c60 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -817,6 +817,8 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Tekan dan tahan email untuk membuktikan enkripsi ujung ke ujung."), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Perangkat hilang?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Pemelajaran mesin"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 782eb147c5..867febe2b9 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -801,6 +801,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Premi a lungo su un elemento per visualizzarlo a schermo intero"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Dispositivo perso?"), "manage": MessageLookupByLibrary.simpleMessage("Gestisci"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index a36e46602c..4f9b5f9d57 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ja'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index 22d4231361..d034501147 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'km'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index e378d62fd9..95f7a65da1 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -40,6 +40,8 @@ class MessageLookup extends MessageLookupByLibrary { "feedback": MessageLookupByLibrary.simpleMessage("피드백"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index a33e630355..50469948cc 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -1005,6 +1005,8 @@ class MessageLookup extends MessageLookupByLibrary { "Druk lang op een e-mail om de versleuteling te verifiëren."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Houd een bestand lang ingedrukt om te bekijken op volledig scherm"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Apparaat verloren?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index e5badae7f5..d3589b9b62 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -263,6 +263,8 @@ class MessageLookup extends MessageLookupByLibrary { "logInLabel": MessageLookupByLibrary.simpleMessage("Logg inn"), "loginTerms": MessageLookupByLibrary.simpleMessage( "Ved å klikke Logg inn, godtar jeg brukervilkårene og personvernreglene"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Mistet enhet?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søk"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 8cb6018be4..c888ded391 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -1000,6 +1000,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Długo naciśnij element, aby wyświetlić go na pełnym ekranie"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Utracono urządzenie?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 0472cbcbe0..d21045fdec 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -999,6 +999,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Pressione e segure em um item para exibir em tela cheia"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Dispositivo perdido?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index e40aaf8ce5..f7789a20e3 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -982,6 +982,8 @@ class MessageLookup extends MessageLookupByLibrary { "Длительное нажатие на email для подтверждения сквозного шифрования."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Удерживайте нажатие на элемент для просмотра в полноэкранном режиме"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Потеряли свое устройство?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index 16f3eafe48..0adaac9efd 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -318,6 +318,8 @@ class MessageLookup extends MessageLookupByLibrary { "loginTerms": MessageLookupByLibrary.simpleMessage( "Genom att klicka på logga in godkänner jag användarvillkoren och våran integritetspolicy"), "logout": MessageLookupByLibrary.simpleMessage("Logga ut"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Förlorad enhet?"), "manage": MessageLookupByLibrary.simpleMessage("Hantera"), "manageLink": MessageLookupByLibrary.simpleMessage("Hantera länk"), diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart index 5e415c9da0..63ee905c5e 100644 --- a/mobile/lib/generated/intl/messages_te.dart +++ b/mobile/lib/generated/intl/messages_te.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'te'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index a1bc4df70a..3ecc08c00d 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -211,6 +211,8 @@ class MessageLookup extends MessageLookupByLibrary { "logInLabel": MessageLookupByLibrary.simpleMessage("เข้าสู่ระบบ"), "loginTerms": MessageLookupByLibrary.simpleMessage( "โดยการคลิกเข้าสู่ระบบ ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manageParticipants": MessageLookupByLibrary.simpleMessage("จัดการ"), "map": MessageLookupByLibrary.simpleMessage("แผนที่"), "maps": MessageLookupByLibrary.simpleMessage("แผนที่"), diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart index 775cc78213..f366d5665f 100644 --- a/mobile/lib/generated/intl/messages_ti.dart +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -21,5 +21,8 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ti'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => {}; + static Map _notInlinedMessages(_) => { + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + }; } diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index fd82236d0d..e2b1057550 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -857,6 +857,8 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Tam ekranda görüntülemek için bir öğeye uzun basın"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Cihazı kayıp mı ettiniz?"), "machineLearning": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 2a34fee561..47482f612b 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -825,6 +825,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("长按电子邮件以验证端到端加密。"), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage("长按一个项目来全屏查看"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"), "machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"), "magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index e88b25f990..9cb39c1c2a 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -170,10 +170,10 @@ class S { ); } - /// `Yes, I want to permanently delete this account and all its data.` + /// `Yes, I want to permanently delete this account and its data across all apps.` String get confirmDeletePrompt { return Intl.message( - 'Yes, I want to permanently delete this account and all its data.', + 'Yes, I want to permanently delete this account and its data across all apps.', name: 'confirmDeletePrompt', desc: '', args: [], @@ -9494,6 +9494,26 @@ class S { args: [], ); } + + /// `Loop video on` + String get loopVideoOn { + return Intl.message( + 'Loop video on', + name: 'loopVideoOn', + desc: '', + args: [], + ); + } + + /// `Loop video off` + String get loopVideoOff { + return Intl.message( + 'Loop video off', + name: 'loopVideoOff', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index 86273581a6..dbea9b3da1 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -23,5 +23,7 @@ "noRecoveryKeyNoDecryption": "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية", "verifyEmail": "التحقق من البريد الإلكتروني", "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", - "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية." + "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية.", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index 49c26657f9..1f008e0571 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -85,5 +85,7 @@ "longPressAnEmailToVerifyEndToEndEncryption": "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen.", "developerSettingsWarning": "Er du sikker på, at du vil ændre udviklerindstillingerne?", "next": "Næste", - "enterPin": "Indtast PIN" + "enterPin": "Indtast PIN", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index aa50482f8d..f7250591dd 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1314,5 +1314,7 @@ "cl_video_player_description": "Einführung eines neuen Video-Players mit besserer Wiedergabesteuerung und Unterstützung für HDR-Videos.", "appLockDescriptions": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.", - "authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen" + "authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index ce8b1a1a54..16e2bbf02a 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -1,4 +1,6 @@ { "@@locale ": "en", - "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας" + "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index ae78fa60c3..ad4c9a2b85 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1315,5 +1315,7 @@ "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos.", "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "authToViewPasskey": "Please authenticate to view your passkey" + "authToViewPasskey": "Please authenticate to view your passkey", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 238f61095f..a08d08e877 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1287,5 +1287,7 @@ "removePublicLinks": "Eliminar enlaces públicos", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Esto eliminará los enlaces públicos de todos los enlaces rápidos seleccionados.", "guestView": "Vista de invitado", - "guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema." + "guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema.", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index d5dbe63862..b42295354d 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -308,5 +308,7 @@ "developerSettings": "تنظیمات توسعه‌دهنده", "search": "جستجو", "whatsNew": "تغییرات جدید", - "reviewSuggestions": "مرور پیشنهادها" + "reviewSuggestions": "مرور پیشنهادها", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 8f4b1e375e..55714b9125 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1285,5 +1285,7 @@ "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec la navigation basée sur les mouvements !", "cl_video_player_title": "Lecteur vidéo", "cl_video_player_description": "Intégration d'un nouveau lecteur vidéo, avec de meilleurs contrôles de lecture et la prise en charge des vidéos HDR.", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système." + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index ad713b19d7..237ccf1332 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -819,5 +819,7 @@ "addPhotos": "הוסף תמונות", "create": "צור", "viewAll": "הצג הכל", - "hiding": "מחביא..." + "hiding": "מחביא...", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 35f1e866b4..c70c8bee50 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -49,5 +49,7 @@ "sorry": "क्षमा करें!", "noRecoveryKeyNoDecryption": "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है", "verifyEmail": "ईमेल सत्यापित करें", - "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।" + "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index 0768a2d798..ca032e8060 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1065,5 +1065,7 @@ "rotate": "Putar", "left": "Kiri", "right": "Kanan", - "whatsNew": "Hal yang baru" + "whatsNew": "Hal yang baru", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index ac66ecca17..f03bb21411 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1103,5 +1103,7 @@ "selectALocation": "Seleziona un luogo", "selectALocationFirst": "Scegli prima una posizione", "changeLocationOfSelectedItems": "Cambiare la posizione degli elementi selezionati?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Le modifiche alla posizione saranno visibili solo all'interno di Ente" + "editsToLocationWillOnlyBeSeenWithinEnte": "Le modifiche alla posizione saranno visibili solo all'interno di Ente", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 06c81195f7..f9e862d51f 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -12,5 +12,7 @@ "feedback": "피드백", "confirmAccountDeletion": "계정 삭제 확인", "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", - "yourAccountHasBeenDeleted": "계정이 삭제되었습니다." + "yourAccountHasBeenDeleted": "계정이 삭제되었습니다.", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 62dc45e844..d1db7d56d4 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1313,5 +1313,7 @@ "cl_video_player_title": "Videospeler", "cl_video_player_description": "Een verfrissende nieuwe videospeler, met betere afspeelknoppen en ondersteuning voor HDR-video's.", "appLockDescriptions": "Kies tussen het standaard vergrendelscherm van uw apparaat en een aangepast vergrendelscherm met een pincode of wachtwoord.", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen." + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 9bf690cd30..cfc1df2fa9 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -373,5 +373,7 @@ "advanced": "Avansert", "general": "Generelt", "security": "Sikkerhet", - "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din" + "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 7be752f684..cf4654be3a 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1315,5 +1315,7 @@ "cl_video_player_description": "Wprowadzamy nowy odtwarzacz wideo z lepszym sterowaniem odtwarzania i obsługą wideo HDR.", "appLockDescriptions": "Wybierz między domyślnym ekranem blokady urządzenia a niestandardowym ekranem blokady z kodem PIN lub hasłem.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", - "authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz dostępu" + "authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz dostępu", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 0ca1ce69cd..b57fb95802 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1315,5 +1315,7 @@ "cl_video_player_description": "Apresentando um novo reprodutor de vídeo, com melhores controles de reprodução e suporte para vídeos HDR.", "appLockDescriptions": "Escolha entre a tela de bloqueio padrão do seu dispositivo e uma tela de bloqueio personalizada com PIN ou senha.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema.", - "authToViewPasskey": "Por favor, autentique-se para ver sua chave de acesso" + "authToViewPasskey": "Por favor, autentique-se para ver sua chave de acesso", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 2bf2d4efc1..a61e1bd024 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1295,5 +1295,7 @@ "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", "cl_guest_view_title": "Гостевой вид", "cl_panorama_viewer_title": "Просмотр Панорамы", - "cl_video_player_title": "Видеоплеер" + "cl_video_player_title": "Видеоплеер", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 3c51f175e0..89d190c136 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -423,5 +423,7 @@ "next": "Nästa", "guestView": "Gästvy", "cl_guest_view_title": "Gästvy", - "cl_video_player_title": "Videospelare" + "cl_video_player_title": "Videospelare", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index 9d6b4c0801..a0c717ce17 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -297,5 +297,7 @@ "description": "Label for the map view" }, "maps": "แผนที่", - "enableMaps": "เปิดใช้งานแผนที่" + "enableMaps": "เปิดใช้งานแผนที่", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index c8494661c6..3c06fdbe82 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -1,3 +1,5 @@ { - "@@locale ": "en" + "@@locale ": "en", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index a51913a120..18c052eb7d 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1168,5 +1168,7 @@ "invalidEndpoint": "Geçersiz uç nokta", "invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.", "endpointUpdatedMessage": "Fatura başarıyla güncellendi", - "customEndpoint": "{endpoint}'e bağlanıldı" + "customEndpoint": "{endpoint}'e bağlanıldı", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index abb3a223ae..bacd3f7623 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1315,5 +1315,7 @@ "cl_video_player_description": "推出全新的视频播放器,提供更好的播放控制并添加了对 HDR 视频的支持。", "appLockDescriptions": "在设备的默认锁定屏幕和带有 PIN 或密码的自定义锁定屏幕之间进行选择。", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁。", - "authToViewPasskey": "请验证身份以查看您的通行密钥" + "authToViewPasskey": "请验证身份以查看您的通行密钥", + "loopVideoOn": "Loop video on", + "loopVideoOff": "Loop video off" } \ No newline at end of file diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 9fb901af6e..a0905c16e6 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -334,8 +334,8 @@ class FileAppBarState extends State { padding: EdgeInsets.all(8), ), shouldLoopVideo - ? const Text("Loop video on") - : const Text("Loop video off"), + ? Text(S.of(context).loopVideoOn) + : Text(S.of(context).loopVideoOff), ], ), ), From e1f2a7dcf7799494b18e6f9a4835f2604d31a771 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 18:50:48 +0530 Subject: [PATCH 0826/1179] [mob][photos] Improve play pause button in video player --- .../play_pause_button.dart | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 9e0f388bb4..887b98db47 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -1,9 +1,5 @@ -import "dart:async"; - import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; -import "package:photos/core/event_bus.dart"; -import "package:photos/events/pause_video_event.dart"; import "package:photos/theme/colors.dart"; class PlayPauseButton extends StatefulWidget { @@ -15,22 +11,31 @@ class PlayPauseButton extends StatefulWidget { } class _PlayPauseButtonState extends State { - late StreamSubscription pauseVideoSubscription; bool _isPlaying = true; @override void initState() { super.initState(); - pauseVideoSubscription = Bus.instance.on().listen((event) { + widget.controller?.onPlaybackStatusChanged + .addListener(_onPlaybackStatusChanged); + } + + _onPlaybackStatusChanged() { + if (_playbackStatus == PlaybackStatus.playing) { + setState(() { + _isPlaying = true; + }); + } else { setState(() { _isPlaying = false; }); - }); + } } @override void dispose() { - pauseVideoSubscription.cancel(); + widget.controller?.onPlaybackStatusChanged + .removeListener(_onPlaybackStatusChanged); super.dispose(); } @@ -41,14 +46,8 @@ class _PlayPauseButtonState extends State { onTap: () { if (_playbackStatus == PlaybackStatus.playing) { widget.controller?.pause(); - setState(() { - _isPlaying = false; - }); } else { widget.controller?.play(); - setState(() { - _isPlaying = true; - }); } }, child: Container( From 4dc9ed643862b1d47f94a0b5097b11136558087f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 18:14:47 +0530 Subject: [PATCH 0827/1179] Don't overwrite submitting state --- web/apps/photos/src/pages/cluster-debug.tsx | 38 ++++++++------------ web/packages/new/photos/services/ml/index.ts | 2 +- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 127133b323..ddcc7b28b1 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -25,7 +25,7 @@ import { TextField, Typography, } from "@mui/material"; -import { useFormik } from "formik"; +import { useFormik, type Formik } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; @@ -90,11 +90,6 @@ interface ClusterListProps { const ClusterList: React.FC = ({ height, width }) => { const { startLoading, finishLoading } = useContext(AppContext); - const [clusteringOpts, setClusteringOpts] = useState({ - method: "hdbscan", - joinThreshold: 0.7, - batchSize: 2500, - }); const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); @@ -102,13 +97,21 @@ const ClusterList: React.FC = ({ height, width }) => { const listRef = useRef(null); const cluster = async (opts: ClusteringOpts) => { - setClusteringOpts(opts); setClusterRes(undefined); startLoading(); setClusterRes(await wipClusterDebugPageContents(opts)); finishLoading(); }; + const formik = useFormik({ + initialValues: { + method: "hdbscan", + joinThreshold: 0.7, + batchSize: 2500, + }, + onSubmit: cluster, + }); + const columns = useMemo( () => Math.max(Math.floor(getFractionFittableColumns(width)), 4), [width], @@ -145,11 +148,7 @@ const ClusterList: React.FC = ({ height, width }) => { if (index === 0) return (
-
+
); @@ -251,21 +250,12 @@ const ListItem = styled("div")` `; interface HeaderProps { - clusteringOpts: ClusteringOpts; + formik: Formik; clusterRes: ClusterDebugPageContents | undefined; - onCluster: (opts: ClusteringOpts) => Promise; } -const Header: React.FC = ({ - clusteringOpts, - clusterRes, - onCluster, -}) => { - const { values, handleSubmit, handleChange, isSubmitting } = useFormik({ - initialValues: clusteringOpts, - onSubmit: onCluster, - }); - +const Header: React.FC = ({ formik, clusterRes }) => { + const { values, handleSubmit, handleChange, isSubmitting } = formik; const form = ( diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 836eba693e..6f8bb91a49 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -374,7 +374,7 @@ export const wipClusterDebugPageContents = async ( ): Promise => { if (!(await wipClusterEnable())) throw new Error("Not implemented"); - log.info("clustering"); + log.info("clustering", opts); _wip_isClustering = true; _wip_searchPersons = undefined; triggerStatusUpdate(); From b7e67d4e2a8f3cadd303f2b589437a67b8ff4426 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 19:11:51 +0530 Subject: [PATCH 0828/1179] Lint fix --- web/apps/photos/src/pages/cluster-debug.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index ddcc7b28b1..2cc97f4511 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -25,7 +25,7 @@ import { TextField, Typography, } from "@mui/material"; -import { useFormik, type Formik } from "formik"; +import { useFormik, type FormikContextType } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; @@ -250,7 +250,7 @@ const ListItem = styled("div")` `; interface HeaderProps { - formik: Formik; + formik: FormikContextType; clusterRes: ClusterDebugPageContents | undefined; } From 737e46a90e5b98bd550ad2c008952d56645aed67 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 19:15:04 +0530 Subject: [PATCH 0829/1179] Use correct type --- web/apps/photos/src/pages/cluster-debug.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 2cc97f4511..225bd79780 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -25,7 +25,7 @@ import { TextField, Typography, } from "@mui/material"; -import { useFormik, type FormikContextType } from "formik"; +import { useFormik, type FormikProps } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; @@ -250,7 +250,7 @@ const ListItem = styled("div")` `; interface HeaderProps { - formik: FormikContextType; + formik: FormikProps; clusterRes: ClusterDebugPageContents | undefined; } From cb83f3592be432cd8489b09845b6fee16d827864 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 19:37:28 +0530 Subject: [PATCH 0830/1179] [mob][photos] Use custom icon for 'loop video off' button --- mobile/lib/ui/viewer/file/file_app_bar.dart | 24 ++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index a0905c16e6..04df35146c 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -326,9 +326,27 @@ class FileAppBarState extends State { value: 7, child: Row( children: [ - Icon( - Icons.repeat_rounded, - color: Theme.of(context).iconTheme.color, + Stack( + alignment: Alignment.center, + children: [ + Icon( + Icons.loop_rounded, + color: Theme.of(context).iconTheme.color, + ), + shouldLoopVideo + ? const SizedBox.shrink() + : Transform.rotate( + angle: (3.14 / 4) * 1, + child: Container( + width: 2, + height: 24, + decoration: BoxDecoration( + color: Theme.of(context).iconTheme.color, + borderRadius: BorderRadius.circular(1), + ), + ), + ), + ], ), const Padding( padding: EdgeInsets.all(8), From ccb0e5278d480538fc8912529780beea1d770c39 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 19:58:55 +0530 Subject: [PATCH 0831/1179] Minscore --- web/apps/photos/src/pages/cluster-debug.tsx | 18 ++++++++++++++++++ web/packages/new/photos/services/ml/cluster.ts | 10 +++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 225bd79780..d0788500de 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -106,6 +106,8 @@ const ClusterList: React.FC = ({ height, width }) => { const formik = useFormik({ initialValues: { method: "hdbscan", + minBlur: 99, + minScore: 0, joinThreshold: 0.7, batchSize: 2500, }, @@ -276,6 +278,22 @@ const Header: React.FC = ({ formik, clusterRes }) => { ))} + + { - const { method, batchSize, joinThreshold } = opts; + const { method, batchSize, minBlur, minScore, joinThreshold } = opts; const t = Date.now(); // A flattened array of faces. - const faces = [...enumerateFaces(faceIndexes)].filter((f) => f.blur > 99); + const faces = [...enumerateFaces(faceIndexes)] + .filter((f) => f.blur > minBlur) + .filter((f) => f.score > minScore); // For fast reverse lookup - map from face ids to the face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); @@ -439,7 +443,7 @@ const clusterLinear = ( } } - // Prune singletone clusters. + // Prune singleton clusters. const validClusters = clusters.filter((cs) => cs.length > 1); return { clusters: validClusters }; From e4149fa55ef42fddef9db342a335031a2cc11954 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 30 Aug 2024 19:59:05 +0530 Subject: [PATCH 0832/1179] [mob][photos] Chore --- mobile/lib/ui/viewer/file/file_app_bar.dart | 2 +- .../play_pause_button.dart | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 04df35146c..8913790766 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -336,7 +336,7 @@ class FileAppBarState extends State { shouldLoopVideo ? const SizedBox.shrink() : Transform.rotate( - angle: (3.14 / 4) * 1, + angle: 3.14 / 4, child: Container( width: 2, height: 24, diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart index 887b98db47..06a1d40708 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/play_pause_button.dart @@ -20,18 +20,6 @@ class _PlayPauseButtonState extends State { .addListener(_onPlaybackStatusChanged); } - _onPlaybackStatusChanged() { - if (_playbackStatus == PlaybackStatus.playing) { - setState(() { - _isPlaying = true; - }); - } else { - setState(() { - _isPlaying = false; - }); - } - } - @override void dispose() { widget.controller?.onPlaybackStatusChanged @@ -88,4 +76,16 @@ class _PlayPauseButtonState extends State { PlaybackStatus? get _playbackStatus => widget.controller?.playbackInfo?.status; + + void _onPlaybackStatusChanged() { + if (_playbackStatus == PlaybackStatus.playing) { + setState(() { + _isPlaying = true; + }); + } else { + setState(() { + _isPlaying = false; + }); + } + } } From c147ec10673294e38554ac87930679e415e14e99 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 20:53:47 +0530 Subject: [PATCH 0833/1179] Ensure nums There's a better way, just debugging code for now --- web/apps/photos/src/pages/cluster-debug.tsx | 190 ++++++++++++-------- 1 file changed, 118 insertions(+), 72 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index d0788500de..48162a8f1c 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -25,16 +25,39 @@ import { TextField, Typography, } from "@mui/material"; -import { useFormik, type FormikProps } from "formik"; +import { useFormik } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; -import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; +import React, { + useCallback, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from "react"; import AutoSizer from "react-virtualized-auto-sizer"; import { VariableSizeList } from "react-window"; // TODO-Cluster Temporary component for debugging export default function ClusterDebug() { - const { showNavBar } = useContext(AppContext); + const { startLoading, finishLoading, showNavBar } = useContext(AppContext); + + const [clusterRes, setClusterRes] = useState< + ClusterDebugPageContents | undefined + >(); + + const cluster = useCallback((opts: ClusteringOpts) => { + return new Promise((resolve) => { + setClusterRes(undefined); + startLoading(); + wipClusterDebugPageContents(opts).then((v) => { + setClusterRes(v); + finishLoading(); + resolve(true); + }); + }); + }, []); useEffect(() => { showNavBar(true); @@ -45,7 +68,10 @@ export default function ClusterDebug() { {({ height, width }) => ( - + )} @@ -82,43 +108,29 @@ const Container = styled("div")` } `; -interface ClusterListProps { - height: number; - width: number; -} - -const ClusterList: React.FC = ({ height, width }) => { - const { startLoading, finishLoading } = useContext(AppContext); - - const [clusterRes, setClusterRes] = useState< - ClusterDebugPageContents | undefined - >(); - const [items, setItems] = useState([]); - const listRef = useRef(null); - - const cluster = async (opts: ClusteringOpts) => { - setClusterRes(undefined); - startLoading(); - setClusterRes(await wipClusterDebugPageContents(opts)); - finishLoading(); +type ClusterListProps = Header1Props & + Header2Props & { + height: number; + width: number; }; - const formik = useFormik({ - initialValues: { - method: "hdbscan", - minBlur: 99, - minScore: 0, - joinThreshold: 0.7, - batchSize: 2500, - }, - onSubmit: cluster, - }); +const ClusterList: React.FC = ({ + width, + height, + onCluster, + clusterRes, +}) => { + const [items, setItems] = useState([]); + const listRef = useRef(null); const columns = useMemo( () => Math.max(Math.floor(getFractionFittableColumns(width)), 4), [width], ); + const Header1Memo = React.memo(Header1); + const Header2Memo = React.memo(Header2); + const shrinkRatio = getShrinkRatio(width, columns); const listItemHeight = 120 * shrinkRatio + 24 + 4; @@ -130,19 +142,25 @@ const ClusterList: React.FC = ({ height, width }) => { listRef.current?.resetAfterIndex(0); }, [items]); + const itemKey = (index: number) => + index === 0 || index === 1 ? `header-${index}` : `item-${index}`; + const getItemSize = (index: number) => index === 0 - ? 270 - : Array.isArray(items[index - 1]) - ? listItemHeight - : 36; + ? 140 + : index === 1 + ? 130 + : Array.isArray(items[index - 1 - 1]) + ? listItemHeight + : 36; return ( @@ -150,11 +168,18 @@ const ClusterList: React.FC = ({ height, width }) => { if (index === 0) return (
-
+
); - const item = items[index - 1]; + if (index === 1) + return ( +
+ +
+ ); + + const item = items[index - 2]; return ( ; - clusterRes: ClusterDebugPageContents | undefined; +interface Header1Props { + onCluster: (opts: ClusteringOpts) => Promise; } -const Header: React.FC = ({ formik, clusterRes }) => { - const { values, handleSubmit, handleChange, isSubmitting } = formik; - const form = ( +const Header1: React.FC = ({ onCluster }) => { + const toFloat = (n: number | string) => + typeof n == "string" ? parseFloat(n) : n; + const { values, handleSubmit, handleChange, isSubmitting } = + useFormik({ + initialValues: { + method: "linear", + minBlur: 10, + minScore: 0.8, + joinThreshold: 0.7, + batchSize: 12500, + }, + onSubmit: (values) => + onCluster({ + method: values.method, + minBlur: toFloat(values.minBlur), + minScore: toFloat(values.minScore), + joinThreshold: toFloat(values.joinThreshold), + batchSize: toFloat(values.batchSize), + }), + }); + + return ( Parameters @@ -316,38 +360,40 @@ const Header: React.FC = ({ formik, clusterRes }) => { Cluster + {isSubmitting && } ); +}; - const clusterInfo = clusterRes && ( - - - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces in ${(clusterRes.timeTakenMs / 1000).toFixed(0)} seconds. ${clusterRes.unclusteredFaceCount} unclustered faces.`} - - - Showing only top 30 and bottom 30 clusters. - - - For each cluster showing only up to 50 faces, sorted by cosine - similarity to highest scoring face in the cluster. - - - Below each face is its{" "} - blur - score - cosineSimilarity - direction. - - - Faces added to the cluster as a result of merging are outlined. - - - ); +interface Header2Props { + clusterRes: ClusterDebugPageContents | undefined; +} +const Header2: React.FC = ({ clusterRes }) => { return ( -
- {form} - {isSubmitting && } - {clusterInfo} -
+ clusterRes && ( + + + {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces in ${(clusterRes.timeTakenMs / 1000).toFixed(0)} seconds. ${clusterRes.unclusteredFaceCount} unclustered faces.`} + + + Showing only top 30 and bottom 30 clusters. + + + For each cluster showing only up to 50 faces, sorted by + cosine similarity to highest scoring face in the cluster. + + + Below each face is its{" "} + blur - score - cosineSimilarity - direction. + + + Faces added to the cluster as a result of merging are + outlined. + + + ) ); }; From 0da8f45084af13d9011af840f88da78543fc916e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Fri, 30 Aug 2024 21:09:42 +0530 Subject: [PATCH 0834/1179] Fix form reset --- web/apps/photos/src/pages/cluster-debug.tsx | 33 ++++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 48162a8f1c..65d66087fa 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -43,12 +43,20 @@ import { VariableSizeList } from "react-window"; export default function ClusterDebug() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); + const [clusteringOptions, setClusteringOptions] = useState({ + method: "linear", + minBlur: 10, + minScore: 0.8, + joinThreshold: 0.7, + batchSize: 12500, + }); const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); const cluster = useCallback((opts: ClusteringOpts) => { return new Promise((resolve) => { + setClusteringOptions(opts); setClusterRes(undefined); startLoading(); wipClusterDebugPageContents(opts).then((v) => { @@ -69,8 +77,13 @@ export default function ClusterDebug() { {({ height, width }) => ( )} @@ -117,6 +130,7 @@ type ClusterListProps = Header1Props & const ClusterList: React.FC = ({ width, height, + clusteringOptions, onCluster, clusterRes, }) => { @@ -168,7 +182,9 @@ const ClusterList: React.FC = ({ if (index === 0) return (
- +
); @@ -277,21 +293,16 @@ const ListItem = styled("div")` `; interface Header1Props { + clusteringOptions: ClusteringOpts; onCluster: (opts: ClusteringOpts) => Promise; } -const Header1: React.FC = ({ onCluster }) => { +const Header1: React.FC = ({ clusteringOptions, onCluster }) => { const toFloat = (n: number | string) => typeof n == "string" ? parseFloat(n) : n; const { values, handleSubmit, handleChange, isSubmitting } = useFormik({ - initialValues: { - method: "linear", - minBlur: 10, - minScore: 0.8, - joinThreshold: 0.7, - batchSize: 12500, - }, + initialValues: clusteringOptions, onSubmit: (values) => onCluster({ method: values.method, From 1e1ef7f94b689c043719e53b98078b72693a28d4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 07:22:48 +0530 Subject: [PATCH 0835/1179] Live photo changelog https://github.com/ente-io/ente/pull/2865 --- desktop/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index 9a32cd383f..e55fa1e3e9 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -4,6 +4,7 @@ - Improved date search, including support for day of week and hour of day. - Fix video thumbnail generation and upload on Intel macOS. +- Club a photo and video into a live photo only if both are within 2 minutes. - . ## v1.7.3 From 854198f2156a607bbfcfaf3ac42e54e2ce14b238 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 09:25:17 +0530 Subject: [PATCH 0836/1179] [web] Indicate that hash comparision is also used in the detail message Context: https://github.com/ente-io/ente/discussions/3070 --- web/packages/base/locales/en-US/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 3adb4f3673..5585253915 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -301,7 +301,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generation failed", "UNSUPPORTED_FILES": "Unsupported files", "SUCCESSFUL_UPLOADS": "Successful uploads", - "SKIPPED_INFO": "Skipped these as there are files with matching names in the same album", + "SKIPPED_INFO": "Skipped these as there are files with matching name and content in the same album", "UNSUPPORTED_INFO": "Ente does not support these file formats yet", "BLOCKED_UPLOADS": "Blocked uploads", "INPROGRESS_METADATA_EXTRACTION": "In progress", From 14a4398a14219ab87df3cc9e926f3cbd25eada8a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 09:45:43 +0530 Subject: [PATCH 0837/1179] Restructure to avoid unnecessary rerenders --- web/apps/photos/src/pages/cluster-debug.tsx | 242 ++++++++++---------- 1 file changed, 120 insertions(+), 122 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 65d66087fa..2ad6327b5f 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -43,24 +43,18 @@ import { VariableSizeList } from "react-window"; export default function ClusterDebug() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const [clusteringOptions, setClusteringOptions] = useState({ - method: "linear", - minBlur: 10, - minScore: 0.8, - joinThreshold: 0.7, - batchSize: 12500, - }); + const Header1Memo = React.memo(Header1); + const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); const cluster = useCallback((opts: ClusteringOpts) => { return new Promise((resolve) => { - setClusteringOptions(opts); - setClusterRes(undefined); startLoading(); - wipClusterDebugPageContents(opts).then((v) => { - setClusterRes(v); + // setClusterRes(undefined); + wipClusterDebugPageContents(opts).then((res) => { + setClusterRes(res); finishLoading(); resolve(true); }); @@ -71,20 +65,16 @@ export default function ClusterDebug() { showNavBar(true); }, []); + console.log("rendering Top", clusterRes); + return ( <> {({ height, width }) => ( - + + + )} @@ -121,18 +111,117 @@ const Container = styled("div")` } `; -type ClusterListProps = Header1Props & - Header2Props & { - height: number; - width: number; - }; +interface Header1Props { + onCluster: (opts: ClusteringOpts) => Promise; +} -const ClusterList: React.FC = ({ +const Header1: React.FC = ({ onCluster }) => { + const toFloat = (n: number | string) => + typeof n == "string" ? parseFloat(n) : n; + const { values, handleSubmit, handleChange, isSubmitting } = + useFormik({ + initialValues: { + method: "linear", + minBlur: 10, + minScore: 0.8, + joinThreshold: 0.7, + batchSize: 12500, + }, + // onSubmit1: (values) => { + // console.log("onSubmit"); + // return new Promise((resolve) => { + // console.log("onSubmit will resolve promise", { + // isSubmitting, + // }); + // setTimeout(resolve, 2000); + // }); + // }, + onSubmit: (values) => + onCluster({ + method: values.method, + minBlur: toFloat(values.minBlur), + minScore: toFloat(values.minScore), + joinThreshold: toFloat(values.joinThreshold), + batchSize: toFloat(values.batchSize), + }), + }); + + console.log("rendering form", { isSubmitting }); + + return ( +
+ + Parameters + + + {["hdbscan", "linear"].map((v) => ( + + {v} + + ))} + + + + + + + + + + {isSubmitting && } + +
+ ); +}; + +type ClusterListProps = Header2Props & { + height: number; + width: number; +}; + +const ClusterList: React.FC> = ({ width, height, - clusteringOptions, - onCluster, clusterRes, + children, }) => { const [items, setItems] = useState([]); const listRef = useRef(null); @@ -142,7 +231,6 @@ const ClusterList: React.FC = ({ [width], ); - const Header1Memo = React.memo(Header1); const Header2Memo = React.memo(Header2); const shrinkRatio = getShrinkRatio(width, columns); @@ -168,6 +256,8 @@ const ClusterList: React.FC = ({ ? listItemHeight : 36; + console.log("rendering Within AutoSizer", clusterRes, listRef); + return ( = ({ overscanCount={3} > {({ index, style }) => { - if (index === 0) - return ( -
- -
- ); + if (index === 0) return
{children}
; if (index === 1) return ( @@ -292,91 +375,6 @@ const ListItem = styled("div")` justify-content: center; `; -interface Header1Props { - clusteringOptions: ClusteringOpts; - onCluster: (opts: ClusteringOpts) => Promise; -} - -const Header1: React.FC = ({ clusteringOptions, onCluster }) => { - const toFloat = (n: number | string) => - typeof n == "string" ? parseFloat(n) : n; - const { values, handleSubmit, handleChange, isSubmitting } = - useFormik({ - initialValues: clusteringOptions, - onSubmit: (values) => - onCluster({ - method: values.method, - minBlur: toFloat(values.minBlur), - minScore: toFloat(values.minScore), - joinThreshold: toFloat(values.joinThreshold), - batchSize: toFloat(values.batchSize), - }), - }); - - return ( -
- - Parameters - - - {["hdbscan", "linear"].map((v) => ( - - {v} - - ))} - - - - - - - - - - {isSubmitting && } - -
- ); -}; - interface Header2Props { clusterRes: ClusterDebugPageContents | undefined; } From 067ba8ea85232aeed0539622c6c71bd51f0e9fb4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 10:37:56 +0530 Subject: [PATCH 0838/1179] Fix form rerendering The item renderer should not be defined inline otherwise it will get re-created each time the parent component (list) gets rerendered. https://github.com/bvaughn/react-window/issues/413#issuecomment-597876562 --- web/apps/photos/src/pages/cluster-debug.tsx | 105 ++++++++++---------- 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 2ad6327b5f..b20350147f 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -37,14 +37,12 @@ import React, { useState, } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; -import { VariableSizeList } from "react-window"; +import { areEqual, VariableSizeList } from "react-window"; // TODO-Cluster Temporary component for debugging export default function ClusterDebug() { const { startLoading, finishLoading, showNavBar } = useContext(AppContext); - const Header1Memo = React.memo(Header1); - const [clusterRes, setClusterRes] = useState< ClusterDebugPageContents | undefined >(); @@ -52,7 +50,7 @@ export default function ClusterDebug() { const cluster = useCallback((opts: ClusteringOpts) => { return new Promise((resolve) => { startLoading(); - // setClusterRes(undefined); + setClusterRes(undefined); wipClusterDebugPageContents(opts).then((res) => { setClusterRes(res); finishLoading(); @@ -73,7 +71,9 @@ export default function ClusterDebug() { {({ height, width }) => ( - + + + )} @@ -127,15 +127,6 @@ const Header1: React.FC = ({ onCluster }) => { joinThreshold: 0.7, batchSize: 12500, }, - // onSubmit1: (values) => { - // console.log("onSubmit"); - // return new Promise((resolve) => { - // console.log("onSubmit will resolve promise", { - // isSubmitting, - // }); - // setTimeout(resolve, 2000); - // }); - // }, onSubmit: (values) => onCluster({ method: values.method, @@ -212,6 +203,21 @@ const Header1: React.FC = ({ onCluster }) => { ); }; +const Header1Memo = React.memo(Header1); + +const Row = React.memo( + (props) => { + const { style, children } = props; + console.log("Rendering row", props); + return
{children}
; + }, + // areEqual, + (...args) => { + console.log("areEqual called", args); + return true; + }, +); + type ClusterListProps = Header2Props & { height: number; width: number; @@ -231,8 +237,6 @@ const ClusterList: React.FC> = ({ [width], ); - const Header2Memo = React.memo(Header2); - const shrinkRatio = getShrinkRatio(width, columns); const listItemHeight = 120 * shrinkRatio + 24 + 4; @@ -244,9 +248,6 @@ const ClusterList: React.FC> = ({ listRef.current?.resetAfterIndex(0); }, [items]); - const itemKey = (index: number) => - index === 0 || index === 1 ? `header-${index}` : `item-${index}`; - const getItemSize = (index: number) => index === 0 ? 140 @@ -262,49 +263,45 @@ const ClusterList: React.FC> = ({ - {({ index, style }) => { - if (index === 0) return
{children}
; - - if (index === 1) - return ( -
- -
- ); - - const item = items[index - 2]; - return ( - - - {!Array.isArray(item) ? ( - - {item} - - ) : ( - item.map((f, i) => ( - - )) - )} - - - ); - }} + {DefineMeOutside}
); }; +const DefineMeOutside = React.memo(({ index, style, data }) => { + const { clusterRes, columns, shrinkRatio, items, children } = data; + + if (index === 0) return children; + + if (index === 1) + return ( +
+ +
+ ); + + const item = items[index - 2]; + return ( + + + {!Array.isArray(item) ? ( + {item} + ) : ( + item.map((f, i) => ( + + )) + )} + + + ); +}, areEqual); + type Item = string | FaceWithFile[]; const itemsFromClusterRes = ( @@ -406,6 +403,8 @@ const Header2: React.FC = ({ clusterRes }) => { ); }; +const Header2Memo = React.memo(Header2); + const Loader = () => ( From c3cfb7ae2f70a20d2ebb0c5812b450cc743dffd6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 11:09:07 +0530 Subject: [PATCH 0839/1179] Clean up --- web/apps/photos/src/pages/cluster-debug.tsx | 42 +++++++------------ .../new/photos/services/ml/cluster.ts | 3 +- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index b20350147f..b253d061b4 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -49,8 +49,8 @@ export default function ClusterDebug() { const cluster = useCallback((opts: ClusteringOpts) => { return new Promise((resolve) => { - startLoading(); setClusterRes(undefined); + startLoading(); wipClusterDebugPageContents(opts).then((res) => { setClusterRes(res); finishLoading(); @@ -63,17 +63,13 @@ export default function ClusterDebug() { showNavBar(true); }, []); - console.log("rendering Top", clusterRes); - return ( <> {({ height, width }) => ( - - - + )} @@ -205,17 +201,9 @@ const Header1: React.FC = ({ onCluster }) => { const Header1Memo = React.memo(Header1); -const Row = React.memo( - (props) => { - const { style, children } = props; - console.log("Rendering row", props); - return
{children}
; - }, - // areEqual, - (...args) => { - console.log("areEqual called", args); - return true; - }, +const DivMemo = React.memo( + ({ style, children }) =>
{children}
, + areEqual, ); type ClusterListProps = Header2Props & { @@ -248,36 +236,36 @@ const ClusterList: React.FC> = ({ listRef.current?.resetAfterIndex(0); }, [items]); - const getItemSize = (index: number) => + const itemSize = (index: number) => index === 0 ? 140 : index === 1 ? 130 - : Array.isArray(items[index - 1 - 1]) + : Array.isArray(items[index - 2]) ? listItemHeight : 36; - console.log("rendering Within AutoSizer", clusterRes, listRef); - return ( - {DefineMeOutside} + {ClusterListItemRenderer} ); }; -const DefineMeOutside = React.memo(({ index, style, data }) => { +const ClusterListItemRenderer = React.memo(({ index, style, data }) => { const { clusterRes, columns, shrinkRatio, items, children } = data; - if (index === 0) return children; + if (index === 0) { + return {children}; + } if (index === 1) return ( diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index dad9e509c2..c39e0304c9 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -182,7 +182,8 @@ export const clusterFaces = ( // A flattened array of faces. const faces = [...enumerateFaces(faceIndexes)] .filter((f) => f.blur > minBlur) - .filter((f) => f.score > minScore); + .filter((f) => f.score > minScore) + .slice(0, 2000); // For fast reverse lookup - map from face ids to the face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); From 60cac291fff922d95faf75478d980d2d76155547 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 11:13:23 +0530 Subject: [PATCH 0840/1179] Cleanup --- web/apps/photos/src/pages/cluster-debug.tsx | 30 +++++++-------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index b253d061b4..0595325458 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -28,14 +28,7 @@ import { import { useFormik } from "formik"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; -import React, { - useCallback, - useContext, - useEffect, - useMemo, - useRef, - useState, -} from "react"; +import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; import { areEqual, VariableSizeList } from "react-window"; @@ -47,17 +40,12 @@ export default function ClusterDebug() { ClusterDebugPageContents | undefined >(); - const cluster = useCallback((opts: ClusteringOpts) => { - return new Promise((resolve) => { - setClusterRes(undefined); - startLoading(); - wipClusterDebugPageContents(opts).then((res) => { - setClusterRes(res); - finishLoading(); - resolve(true); - }); - }); - }, []); + const cluster = async (opts: ClusteringOpts) => { + setClusterRes(undefined); + startLoading(); + setClusterRes(await wipClusterDebugPageContents(opts)); + finishLoading(); + }; useEffect(() => { showNavBar(true); @@ -69,7 +57,7 @@ export default function ClusterDebug() { {({ height, width }) => ( - + )} @@ -108,7 +96,7 @@ const Container = styled("div")` `; interface Header1Props { - onCluster: (opts: ClusteringOpts) => Promise; + onCluster: (opts: ClusteringOpts) => Promise; } const Header1: React.FC = ({ onCluster }) => { From cfcd41fc7eb22e3e8e3d43fb138830bbeb9c65d5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 11:26:48 +0530 Subject: [PATCH 0841/1179] Cleanup --- web/apps/photos/src/pages/cluster-debug.tsx | 170 ++++++++++---------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 0595325458..b5cd361fef 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -57,7 +57,7 @@ export default function ClusterDebug() { {({ height, width }) => ( - + )} @@ -95,11 +95,11 @@ const Container = styled("div")` } `; -interface Header1Props { +interface OptionsFormProps { onCluster: (opts: ClusteringOpts) => Promise; } -const Header1: React.FC = ({ onCluster }) => { +const OptionsForm: React.FC = ({ onCluster }) => { const toFloat = (n: number | string) => typeof n == "string" ? parseFloat(n) : n; const { values, handleSubmit, handleChange, isSubmitting } = @@ -187,14 +187,7 @@ const Header1: React.FC = ({ onCluster }) => { ); }; -const Header1Memo = React.memo(Header1); - -const DivMemo = React.memo( - ({ style, children }) =>
{children}
, - areEqual, -); - -type ClusterListProps = Header2Props & { +type ClusterListProps = ClusterResHeaderProps & { height: number; width: number; }; @@ -248,36 +241,6 @@ const ClusterList: React.FC> = ({ ); }; -const ClusterListItemRenderer = React.memo(({ index, style, data }) => { - const { clusterRes, columns, shrinkRatio, items, children } = data; - - if (index === 0) { - return {children}; - } - - if (index === 1) - return ( -
- -
- ); - - const item = items[index - 2]; - return ( - - - {!Array.isArray(item) ? ( - {item} - ) : ( - item.map((f, i) => ( - - )) - )} - - - ); -}, areEqual); - type Item = string | FaceWithFile[]; const itemsFromClusterRes = ( @@ -320,6 +283,87 @@ const getShrinkRatio = (width: number, columns: number) => (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / (columns * 120); +const ClusterListItemRenderer = React.memo(({ index, style, data }) => { + const { clusterRes, columns, shrinkRatio, items, children } = data; + + if (index == 0) { + // It in necessary to memoize the div that contains the form otherwise + // the form loses its submitting state on unnecessary re-renders. + return {children}; + } + + if (index == 1) + return ( +
+ +
+ ); + + const item = items[index - 2]; + return ( + + + {!Array.isArray(item) ? ( + {item} + ) : ( + item.map((f, i) => ( + + )) + )} + + + ); +}, areEqual); + +const DivMemo = React.memo( + ({ style, children }) =>
{children}
, + areEqual, +); + +interface ClusterResHeaderProps { + clusterRes: ClusterDebugPageContents | undefined; +} + +const ClusterResHeader: React.FC = ({ clusterRes }) => { + if (!clusterRes) return null; + + const { clusteredFaceCount, unclusteredFaceCount, timeTakenMs, clusters } = + clusterRes; + + return ( + + + {`${clusters.length} clusters from ${clusteredFaceCount} faces in ${(timeTakenMs / 1000).toFixed(0)} seconds. ${unclusteredFaceCount} unclustered faces.`} + + + Showing only top 30 and bottom 30 clusters. + + + For each cluster showing only up to 50 faces, sorted by cosine + similarity to highest scoring face in the cluster. + + + Below each face is its{" "} + blur - score - cosineSimilarity - direction. + + + Faces added to the cluster as a result of merging are outlined. + + + ); +}; + +const Loader = () => ( + + + +); + +const ListItem = styled("div")` + display: flex; + justify-content: center; +`; + const ListContainer = styled(Box, { shouldForwardProp: (propName) => propName != "shrinkRatio", })<{ @@ -343,50 +387,6 @@ const LabelContainer = styled(ListItemContainer)` height: 32px; `; -const ListItem = styled("div")` - display: flex; - justify-content: center; -`; - -interface Header2Props { - clusterRes: ClusterDebugPageContents | undefined; -} - -const Header2: React.FC = ({ clusterRes }) => { - return ( - clusterRes && ( - - - {`${clusterRes.clusters.length} clusters from ${clusterRes.clusteredFaceCount} faces in ${(clusterRes.timeTakenMs / 1000).toFixed(0)} seconds. ${clusterRes.unclusteredFaceCount} unclustered faces.`} - - - Showing only top 30 and bottom 30 clusters. - - - For each cluster showing only up to 50 faces, sorted by - cosine similarity to highest scoring face in the cluster. - - - Below each face is its{" "} - blur - score - cosineSimilarity - direction. - - - Faces added to the cluster as a result of merging are - outlined. - - - ) - ); -}; - -const Header2Memo = React.memo(Header2); - -const Loader = () => ( - - - -); - interface FaceItemProps { faceWithFile: FaceWithFile; } From e36f081d96ac65ab9e276ff2cc5f96f0ef1cbdc1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 11:29:50 +0530 Subject: [PATCH 0842/1179] Cleanup --- web/apps/photos/src/pages/cluster-debug.tsx | 66 ++++++++++----------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index b5cd361fef..59d24b01ca 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -30,7 +30,11 @@ import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import AutoSizer from "react-virtualized-auto-sizer"; -import { areEqual, VariableSizeList } from "react-window"; +import { + areEqual, + VariableSizeList, + type ListChildComponentProps, +} from "react-window"; // TODO-Cluster Temporary component for debugging export default function ClusterDebug() { @@ -47,9 +51,7 @@ export default function ClusterDebug() { finishLoading(); }; - useEffect(() => { - showNavBar(true); - }, []); + useEffect(() => showNavBar(true), []); return ( <> @@ -283,40 +285,36 @@ const getShrinkRatio = (width: number, columns: number) => (width - 2 * getGapFromScreenEdge(width) - (columns - 1) * 4) / (columns * 120); -const ClusterListItemRenderer = React.memo(({ index, style, data }) => { - const { clusterRes, columns, shrinkRatio, items, children } = data; +// It in necessary to define the item renderer otherwise it gets recreated every +// time the parent rerenders, causing the form to lose its submitting state. +const ClusterListItemRenderer = React.memo( + ({ index, style, data }) => { + const { clusterRes, columns, shrinkRatio, items, children } = data; - if (index == 0) { - // It in necessary to memoize the div that contains the form otherwise - // the form loses its submitting state on unnecessary re-renders. - return {children}; - } + if (index == 0) return
{children}
; - if (index == 1) + if (index == 1) + return ( +
+ +
+ ); + + const item = items[index - 2]; return ( -
- -
+ + + {!Array.isArray(item) ? ( + {item} + ) : ( + item.map((f, i) => ( + + )) + )} + + ); - - const item = items[index - 2]; - return ( - - - {!Array.isArray(item) ? ( - {item} - ) : ( - item.map((f, i) => ( - - )) - )} - - - ); -}, areEqual); - -const DivMemo = React.memo( - ({ style, children }) =>
{children}
, + }, areEqual, ); From 1ec9dfea7f7a41cd1cdd22b7653c47b464cfd06d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 12:21:25 +0530 Subject: [PATCH 0843/1179] Equal sized buttons --- web/apps/photos/src/pages/cluster-debug.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 59d24b01ca..25dbc202a5 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -129,7 +129,11 @@ const OptionsForm: React.FC = ({ onCluster }) => {
Parameters - + Date: Sat, 31 Aug 2024 12:36:51 +0530 Subject: [PATCH 0844/1179] Without ID --- web/apps/photos/src/pages/cluster-debug.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 25dbc202a5..7f04c3ec0d 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -135,7 +135,6 @@ const OptionsForm: React.FC = ({ onCluster }) => { sx={{ ".MuiFormControl-root": { flex: "1" } }} > = ({ onCluster }) => { ))} = ({ onCluster }) => { onChange={handleChange} /> = ({ onCluster }) => { onChange={handleChange} /> = ({ onCluster }) => { onChange={handleChange} /> Date: Sat, 31 Aug 2024 13:01:06 +0530 Subject: [PATCH 0845/1179] More counts --- web/apps/photos/src/pages/cluster-debug.tsx | 18 +++++++++++++----- .../new/photos/services/ml/cluster.ts | 11 ++++++++--- web/packages/new/photos/services/ml/index.ts | 19 ++++++------------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 7f04c3ec0d..ae2ea6b225 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -324,16 +324,23 @@ interface ClusterResHeaderProps { const ClusterResHeader: React.FC = ({ clusterRes }) => { if (!clusterRes) return null; - const { clusteredFaceCount, unclusteredFaceCount, timeTakenMs, clusters } = - clusterRes; + const { + totalFaceCount, + filteredFaceCount, + clusteredFaceCount, + unclusteredFaceCount, + timeTakenMs, + clusters, + } = clusterRes; return ( - {`${clusters.length} clusters from ${clusteredFaceCount} faces in ${(timeTakenMs / 1000).toFixed(0)} seconds. ${unclusteredFaceCount} unclustered faces.`} + {`${clusters.length} clusters in ${(timeTakenMs / 1000).toFixed(0)} seconds. Faces total ${totalFaceCount} filtered ${filteredFaceCount} clustered ${clusteredFaceCount} unclustered ${unclusteredFaceCount}.`} - Showing only top 30 and bottom 30 clusters. + Showing only top 30 clusters, bottom 30 clusters, and + unclustered faces. For each cluster showing only up to 50 faces, sorted by cosine @@ -344,7 +351,8 @@ const ClusterResHeader: React.FC = ({ clusterRes }) => { blur - score - cosineSimilarity - direction. - Faces added to the cluster as a result of merging are outlined. + Faces added to the cluster as a result of next batch merging are + outlined. ); diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index c39e0304c9..8d2607ff08 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -180,7 +180,8 @@ export const clusterFaces = ( const t = Date.now(); // A flattened array of faces. - const faces = [...enumerateFaces(faceIndexes)] + const allFaces = [...enumerateFaces(faceIndexes)]; + const faces = allFaces .filter((f) => f.blur > minBlur) .filter((f) => f.score > minScore) .slice(0, 2000); @@ -349,8 +350,10 @@ export const clusterFaces = ( }); } + const totalFaceCount = allFaces.length; + const filteredFaceCount = faces.length; const clusteredFaceCount = clusterIDForFaceID.size; - const unclusteredFaceCount = faces.length - clusteredFaceCount; + const unclusteredFaceCount = filteredFaceCount - clusteredFaceCount; const unclusteredFaces = faces.filter( ({ faceID }) => !clusterIDForFaceID.has(faceID), @@ -358,10 +361,12 @@ export const clusterFaces = ( const timeTakenMs = Date.now() - t; log.info( - `Clustered ${faces.length} faces into ${clusters.length} clusters, with ${faces.length - clusterIDForFaceID.size} faces remaining unclustered (${timeTakenMs} ms)`, + `Clustered ${faces.length} faces into ${clusters.length} clusters, ${faces.length - clusterIDForFaceID.size} faces remain unclustered (${timeTakenMs} ms)`, ); return { + totalFaceCount, + filteredFaceCount, clusteredFaceCount, unclusteredFaceCount, clusterPreviews, diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 6f8bb91a49..3bb6bb3eaf 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -358,15 +358,17 @@ export type ClusterPreviewFaceWithFile = ClusterPreviewFace & { }; export interface ClusterDebugPageContents { + totalFaceCount: number; + filteredFaceCount: number; clusteredFaceCount: number; unclusteredFaceCount: number; + timeTakenMs: number; clusters: FaceCluster[]; clusterPreviewsWithFile: ClusterPreviewWithFile[]; unclusteredFacesWithFile: { face: Face; enteFile: EnteFile; }[]; - timeTakenMs: number; } export const wipClusterDebugPageContents = async ( @@ -379,15 +381,8 @@ export const wipClusterDebugPageContents = async ( _wip_searchPersons = undefined; triggerStatusUpdate(); - const { - clusteredFaceCount, - unclusteredFaceCount, - clusterPreviews, - clusters, - cgroups, - unclusteredFaces, - timeTakenMs, - } = await worker().then((w) => w.clusterFaces(opts)); + const { clusterPreviews, clusters, cgroups, unclusteredFaces, ...rest } = + await worker().then((w) => w.clusterFaces(opts)); const localFiles = await getAllLocalFiles(); const localFileByID = new Map(localFiles.map((f) => [f.id, f])); @@ -441,12 +436,10 @@ export const wipClusterDebugPageContents = async ( triggerStatusUpdate(); return { - clusteredFaceCount, - unclusteredFaceCount, clusters, clusterPreviewsWithFile, unclusteredFacesWithFile, - timeTakenMs, + ...rest, }; }; From 72dc526724649826a023ff544cc569c438ae15e1 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 13:29:24 +0530 Subject: [PATCH 0846/1179] Form tweaks --- web/apps/photos/src/pages/cluster-debug.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index ae2ea6b225..6337daffd1 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -102,8 +102,10 @@ interface OptionsFormProps { } const OptionsForm: React.FC = ({ onCluster }) => { + // Formik converts nums to a string on edit. const toFloat = (n: number | string) => typeof n == "string" ? parseFloat(n) : n; + const { values, handleSubmit, handleChange, isSubmitting } = useFormik({ initialValues: { @@ -123,8 +125,6 @@ const OptionsForm: React.FC = ({ onCluster }) => { }), }); - console.log("rendering form", { isSubmitting }); - return ( @@ -178,7 +178,11 @@ const OptionsForm: React.FC = ({ onCluster }) => { /> - @@ -335,8 +339,8 @@ const ClusterResHeader: React.FC = ({ clusterRes }) => { return ( - - {`${clusters.length} clusters in ${(timeTakenMs / 1000).toFixed(0)} seconds. Faces total ${totalFaceCount} filtered ${filteredFaceCount} clustered ${clusteredFaceCount} unclustered ${unclusteredFaceCount}.`} + + {`${clusters.length} clusters in ${(timeTakenMs / 1000).toFixed(0)} seconds • ${totalFaceCount} faces ${filteredFaceCount} filtered ${clusteredFaceCount} clustered ${unclusteredFaceCount} unclustered`} Showing only top 30 clusters, bottom 30 clusters, and From 7a7c8c02dec8f3797666812081908ea9e2bc81f0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 13:39:37 +0530 Subject: [PATCH 0847/1179] Remove debug code --- web/packages/new/photos/services/ml/cluster.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 8d2607ff08..271cd6d491 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -183,8 +183,8 @@ export const clusterFaces = ( const allFaces = [...enumerateFaces(faceIndexes)]; const faces = allFaces .filter((f) => f.blur > minBlur) - .filter((f) => f.score > minScore) - .slice(0, 2000); + .filter((f) => f.score > minScore); + // .slice(0, 2000); // For fast reverse lookup - map from face ids to the face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); From 22c5485b3bd2482303203fdc5b85cc0734a9e5ee Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 15:43:18 +0530 Subject: [PATCH 0848/1179] [web] Make it more apparent what the create albums button does Change title of the button from "New album" to "Create albums" to indicate that it can be used to preserve albums. See: https://github.com/ente-io/ente/issues/3067 --- .../Collections/CollectionSelector/AddCollectionButton.tsx | 4 +--- web/packages/base/locales/en-US/translation.json | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx b/web/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx index 87e698361d..0b2245744c 100644 --- a/web/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx +++ b/web/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx @@ -23,9 +23,7 @@ export default function AddCollectionButton({ showNextModal }: Iprops) { onClick={() => showNextModal()} coverFile={null} > - - {t("CREATE_COLLECTION")} - + {t("create_albums")} + diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 5585253915..2e984af93b 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "How did you hear about Ente? (optional)", "REFERRAL_INFO": "We don't track app installs, It'd help us if you told us where you found us!", "PASSPHRASE_MATCH_ERROR": "Passwords don't match", + "create_albums": "Create albums", "CREATE_COLLECTION": "New album", "ENTER_ALBUM_NAME": "Album name", "CLOSE_OPTION": "Close (Esc)", From 7dece286ec600cd3582e326c99e92e29b5786888 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Sat, 31 Aug 2024 10:18:47 +0000 Subject: [PATCH 0849/1179] New Crowdin translations by GitHub Action --- .../base/locales/ar-SA/translation.json | 357 +++++----- .../base/locales/bg-BG/translation.json | 1 + .../base/locales/ca-ES/translation.json | 1 + .../base/locales/de-DE/translation.json | 3 +- .../base/locales/el-GR/translation.json | 1 + .../base/locales/es-ES/translation.json | 3 +- .../base/locales/et-EE/translation.json | 1 + .../base/locales/fa-IR/translation.json | 1 + .../base/locales/fi-FI/translation.json | 1 + .../base/locales/fr-FR/translation.json | 3 +- .../base/locales/gu-IN/translation.json | 1 + .../base/locales/hi-IN/translation.json | 1 + .../base/locales/id-ID/translation.json | 1 + .../base/locales/is-IS/translation.json | 1 + .../base/locales/it-IT/translation.json | 1 + .../base/locales/ja-JP/translation.json | 1 + .../base/locales/km-KH/translation.json | 1 + .../base/locales/ko-KR/translation.json | 1 + .../base/locales/nl-NL/translation.json | 3 +- .../base/locales/pl-PL/translation.json | 3 +- .../base/locales/pt-BR/translation.json | 3 +- .../base/locales/pt-PT/translation.json | 1 + .../base/locales/ru-RU/translation.json | 3 +- .../base/locales/sv-SE/translation.json | 15 +- .../base/locales/ta-IN/translation.json | 659 ++++++++++++++++++ .../base/locales/te-IN/translation.json | 1 + .../base/locales/th-TH/translation.json | 1 + .../base/locales/ti-ER/translation.json | 1 + .../base/locales/tr-TR/translation.json | 1 + .../base/locales/zh-CN/translation.json | 5 +- 30 files changed, 882 insertions(+), 194 deletions(-) create mode 100644 web/packages/base/locales/ta-IN/translation.json diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 968e1627bd..d4d7e31068 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -33,14 +33,15 @@ "ENTER_ENC_PASSPHRASE": "الرجاء إدخال كلمة المرور التي يمكننا استخدامها لتشفير بياناتك", "PASSPHRASE_DISCLAIMER": "نحن لا نخزن كلمة مرورك، لذا إذا نسيتها، لن نتمكن من مساعدتك في استرداد بياناتك دون مفتاح الاسترداد.", "WELCOME_TO_ENTE_HEADING": "مرحبا بك في ", - "WELCOME_TO_ENTE_SUBHEADING": "", - "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "WELCOME_TO_ENTE_SUBHEADING": "تخزين الصور ومشاركتها بشكل مشفر من طرف إلى طرف", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "أين تعيش أفضل صورك", "KEY_GENERATION_IN_PROGRESS_MESSAGE": "جار توليد مفاتيح التشفير...", "PASSPHRASE_HINT": "كلمة المرور", "CONFIRM_PASSPHRASE": "تأكيد كلمة المرور", "REFERRAL_CODE_HINT": "كيف سمعت عن Ente؟ (اختياري)", - "REFERRAL_INFO": "", + "REFERRAL_INFO": "نحن لا نتتبع عمليات تثبيت التطبيق، سيكون من المفيد لنا أن تخبرنا أين وجدتنا!", "PASSPHRASE_MATCH_ERROR": "كلمات المرور غير متطابقة", + "create_albums": "", "CREATE_COLLECTION": "ألبوم جديد", "ENTER_ALBUM_NAME": "اسم الألبوم", "CLOSE_OPTION": "إغلاق (Esc)", @@ -58,10 +59,10 @@ "FILE_UPLOAD": "تحميل الملف", "UPLOAD_STAGE_MESSAGE": { "0": "الإعداد للتحميل", - "1": "", - "2": "", - "3": "", - "4": "", + "1": "قراءة ملفات بيانات تعريف جوجل", + "2": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} البيانات الملفات الوصفية المستخرجة", + "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} ملفات معالجة", + "4": "إلغاء التحميلات المتبقية", "5": "اكتمل النسخ الاحتياطي" }, "FILE_NOT_UPLOADED_LIST": "لم يتم تحميل الملفات التالية", @@ -71,227 +72,227 @@ "ACCOUNT_EXISTS": "لديك حساب بالفعل", "CREATE": "إنشاء", "DOWNLOAD": "تنزيل", - "DOWNLOAD_OPTION": "", - "DOWNLOAD_FAVORITES": "", - "DOWNLOAD_UNCATEGORIZED": "", - "DOWNLOAD_HIDDEN_ITEMS": "", - "COPY_OPTION": "", - "TOGGLE_FULLSCREEN": "", - "ZOOM_IN_OUT": "", - "PREVIOUS": "", - "NEXT": "", - "title_photos": "", - "title_auth": "", - "title_accounts": "", - "UPLOAD_FIRST_PHOTO": "", - "IMPORT_YOUR_FOLDERS": "", - "UPLOAD_DROPZONE_MESSAGE": "", + "DOWNLOAD_OPTION": "تنزيل (D)", + "DOWNLOAD_FAVORITES": "تنزيل المفضلات", + "DOWNLOAD_UNCATEGORIZED": "التنزيل غير المصنف", + "DOWNLOAD_HIDDEN_ITEMS": "تنزيل العناصر المخفية", + "COPY_OPTION": "نسخ كـ PNG (Ctrl/Cmd - C)", + "TOGGLE_FULLSCREEN": "تبديل ملء الشاشة (F)", + "ZOOM_IN_OUT": "تكبير/تصغير", + "PREVIOUS": "السابق (←)", + "NEXT": "التالي (→)", + "title_photos": "صور Ente", + "title_auth": "مصادقة Ente", + "title_accounts": "حسابات Ente", + "UPLOAD_FIRST_PHOTO": "تحميل صورتك الأولى", + "IMPORT_YOUR_FOLDERS": "استيراد مجلداتك", + "UPLOAD_DROPZONE_MESSAGE": "إسقاط للنسخ الاحتياطي للملفاتك", "WATCH_FOLDER_DROPZONE_MESSAGE": "", - "TRASH_FILES_TITLE": "", - "TRASH_FILE_TITLE": "", - "DELETE_FILES_TITLE": "", - "DELETE_FILES_MESSAGE": "", - "DELETE": "", - "DELETE_OPTION": "", - "FAVORITE_OPTION": "", - "UNFAVORITE_OPTION": "", - "MULTI_FOLDER_UPLOAD": "", - "UPLOAD_STRATEGY_CHOICE": "", - "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", - "OR": "", - "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", - "SESSION_EXPIRED_MESSAGE": "", - "SESSION_EXPIRED": "", - "PASSWORD_GENERATION_FAILED": "", - "CHANGE_PASSWORD": "", - "password_changed_elsewhere": "", - "password_changed_elsewhere_message": "", - "GO_BACK": "", - "RECOVERY_KEY": "", - "SAVE_LATER": "", - "SAVE": "", + "TRASH_FILES_TITLE": "حذف الملفات؟", + "TRASH_FILE_TITLE": "حذف الملف؟", + "DELETE_FILES_TITLE": "حذف فورا؟", + "DELETE_FILES_MESSAGE": "سيتم حذف الملفات المحددة نهائيا من حساب Ente الخاص بك.", + "DELETE": "حذف", + "DELETE_OPTION": "حذف (DEL)", + "FAVORITE_OPTION": "مفضلة (L)", + "UNFAVORITE_OPTION": "غير مفضلة (L)", + "MULTI_FOLDER_UPLOAD": "تم اكتشاف مجلدات متعددة", + "UPLOAD_STRATEGY_CHOICE": "هل ترغب في تحميلهم إلى", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "ألبوم واحد", + "OR": "أو", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "ألبومات منفصلة", + "SESSION_EXPIRED_MESSAGE": "لقد انتهت صلاحية جلستك، يرجى تسجيل الدخول مرة أخرى للمتابعة", + "SESSION_EXPIRED": "انتهت صلاحية الجلسة", + "PASSWORD_GENERATION_FAILED": "لم يتمكن متصفحك من إنشاء مفتاح قوي يفي بمعايير تشفير Ente، يرجى المحاولة باستخدام تطبيق الهاتف المحمول أو متصفح آخر", + "CHANGE_PASSWORD": "تغيير كلمة المرور", + "password_changed_elsewhere": "تم تغيير كلمة المرور في مكان آخر", + "password_changed_elsewhere_message": "يرجى تسجيل الدخول مرة أخرى على هذا الجهاز لاستخدام كلمة المرور الجديدة للمصادقة.", + "GO_BACK": "رجوع", + "RECOVERY_KEY": "مفتاح الاستعادة", + "SAVE_LATER": "قم بهذا لاحقا", + "SAVE": "حفظ المفتاح", "RECOVERY_KEY_DESCRIPTION": "", "RECOVER_KEY_GENERATION_FAILED": "", "KEY_NOT_STORED_DISCLAIMER": "", - "FORGOT_PASSWORD": "", - "RECOVER_ACCOUNT": "", - "RECOVERY_KEY_HINT": "", - "RECOVER": "", - "NO_RECOVERY_KEY": "", - "INCORRECT_RECOVERY_KEY": "", - "SORRY": "", + "FORGOT_PASSWORD": "نسيت كلمة المرور", + "RECOVER_ACCOUNT": "إستعادة الحساب", + "RECOVERY_KEY_HINT": "مفتاح الاستعادة", + "RECOVER": "استعادة", + "NO_RECOVERY_KEY": "ما من مفتاح استعادة؟", + "INCORRECT_RECOVERY_KEY": "مفتاح استعادة غير صحيح", + "SORRY": "عذرا", "NO_RECOVERY_KEY_MESSAGE": "", "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", - "CONTACT_SUPPORT": "", - "REQUEST_FEATURE": "", - "SUPPORT": "", - "CONFIRM": "", - "cancel": "", - "LOGOUT": "", - "delete_account": "", + "CONTACT_SUPPORT": "الاتصال بالدعم", + "REQUEST_FEATURE": "طلب ميزة", + "SUPPORT": "الدعم", + "CONFIRM": "تأكيد", + "cancel": "إلغاء", + "LOGOUT": "تسجيل الخروج", + "delete_account": "حذف الحساب", "delete_account_manually_message": "", - "LOGOUT_MESSAGE": "", - "CHANGE_EMAIL": "", - "OK": "", - "SUCCESS": "", - "ERROR": "", - "MESSAGE": "", + "LOGOUT_MESSAGE": "هل أنت متأكد من أنك تريد تسجيل الخروج؟", + "CHANGE_EMAIL": "تغيير البريد الإلكتروني", + "OK": "حسنا", + "SUCCESS": "تم بنجاح", + "ERROR": "خطأ", + "MESSAGE": "رسالة", "OFFLINE_MSG": "", "INSTALL_MOBILE_APP": "", "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", - "EXPORT": "", - "SUBSCRIPTION": "", - "SUBSCRIBE": "", - "MANAGEMENT_PORTAL": "", - "MANAGE_FAMILY_PORTAL": "", - "LEAVE_FAMILY_PLAN": "", - "LEAVE": "", - "LEAVE_FAMILY_CONFIRM": "", - "CHOOSE_PLAN": "", - "MANAGE_PLAN": "", - "CURRENT_USAGE": "", - "TWO_MONTHS_FREE": "", - "POPULAR": "", - "free_plan_option": "", - "free_plan_description": "", - "active": "", - "subscription_info_free": "", + "DOWNLOAD_APP": "تنزيل تطبيق سطح المكتب", + "EXPORT": "تصدير البيانات", + "SUBSCRIPTION": "اشتراك", + "SUBSCRIBE": "اشترك", + "MANAGEMENT_PORTAL": "إدارة طريقة الدفع", + "MANAGE_FAMILY_PORTAL": "إدارة العائلة", + "LEAVE_FAMILY_PLAN": "مغادرة خطة العائلة", + "LEAVE": "مغادرة", + "LEAVE_FAMILY_CONFIRM": "هل أنت متأكد من أنك تريد مغادرة الخطة العائلية؟", + "CHOOSE_PLAN": "اختر خطتك", + "MANAGE_PLAN": "إدارة اشتراكك", + "CURRENT_USAGE": "الاستخدام الحالي هو {{usage}}", + "TWO_MONTHS_FREE": "احصل على شهرين مجانا في الخطط السنوية", + "POPULAR": "رائج", + "free_plan_option": "المتابعة مع الخطة المجانية", + "free_plan_description": "{{storage}} مجاني للأبد", + "active": "نشط", + "subscription_info_free": "أنت في الخطة المجانية", "subscription_info_family": "", "subscription_info_expired": "", "subscription_info_renewal_cancelled": "", "subscription_info_storage_quota_exceeded": "", "subscription_status_renewal_active": "", - "subscription_status_renewal_cancelled": "", + "subscription_status_renewal_cancelled": "ينتهي في {{date, date}}", "add_on_valid_till": "", - "subscription_expired": "", - "storage_quota_exceeded": "", - "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "subscription_expired": "إنتهت صلاحية الاشتراك", + "storage_quota_exceeded": "تم تجاوز حد التخزين", + "SUBSCRIPTION_PURCHASE_SUCCESS": "

لقد تلقينا دفعتك

اشتراكك صالح حتى {{date, date}}

", "SUBSCRIPTION_PURCHASE_CANCELLED": "", "SUBSCRIPTION_PURCHASE_FAILED": "", "SUBSCRIPTION_UPDATE_FAILED": "", "UPDATE_PAYMENT_METHOD_MESSAGE": "", "STRIPE_AUTHENTICATION_FAILED": "", "UPDATE_PAYMENT_METHOD": "", - "MONTHLY": "", - "YEARLY": "", - "MONTH_SHORT": "", - "YEAR": "", - "update_subscription_title": "", - "UPDATE_SUBSCRIPTION_MESSAGE": "", - "UPDATE_SUBSCRIPTION": "", - "CANCEL_SUBSCRIPTION": "", + "MONTHLY": "شهريا", + "YEARLY": "سنويا", + "MONTH_SHORT": "شهر", + "YEAR": "سنة", + "update_subscription_title": "تأكيد تغيير الخطة", + "UPDATE_SUBSCRIPTION_MESSAGE": "هل أنت متأكد من أنك تريد تغيير خطتك؟", + "UPDATE_SUBSCRIPTION": "تغيير الخطة", + "CANCEL_SUBSCRIPTION": "إلغاء الاشتراك", "CANCEL_SUBSCRIPTION_MESSAGE": "", "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", - "SUBSCRIPTION_CANCEL_FAILED": "", - "SUBSCRIPTION_CANCEL_SUCCESS": "", - "REACTIVATE_SUBSCRIPTION": "", + "SUBSCRIPTION_CANCEL_FAILED": "فشل في إلغاء الاشتراك", + "SUBSCRIPTION_CANCEL_SUCCESS": "تم إلغاء الاشتراك بنجاح", + "REACTIVATE_SUBSCRIPTION": "إعادة تنشيط الاشتراك", "REACTIVATE_SUBSCRIPTION_MESSAGE": "", "SUBSCRIPTION_ACTIVATE_SUCCESS": "", "SUBSCRIPTION_ACTIVATE_FAILED": "", - "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "شكرا لك", "CANCEL_SUBSCRIPTION_ON_MOBILE": "", "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", "MAIL_TO_MANAGE_SUBSCRIPTION": "", - "RENAME": "", - "RENAME_FILE": "", - "RENAME_COLLECTION": "", - "DELETE_COLLECTION_TITLE": "", - "DELETE_COLLECTION": "", + "RENAME": "اعادة تسمية", + "RENAME_FILE": "إعادة تسمية ملف", + "RENAME_COLLECTION": "إعادة تسمية ألبوم", + "DELETE_COLLECTION_TITLE": "حذف ألبوم؟", + "DELETE_COLLECTION": "حذف ألبوم", "DELETE_COLLECTION_MESSAGE": "", - "DELETE_PHOTOS": "", - "KEEP_PHOTOS": "", - "SHARE_COLLECTION": "", - "SHARE_WITH_SELF": "", + "DELETE_PHOTOS": "حذف الصور", + "KEEP_PHOTOS": "الاحتفاظ بالصور", + "SHARE_COLLECTION": "مشاركة الألبوم", + "SHARE_WITH_SELF": "عفوا، لا يمكنك المشاركة مع نفسك", "ALREADY_SHARED": "", - "SHARING_BAD_REQUEST_ERROR": "", - "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", - "DOWNLOAD_COLLECTION": "", + "SHARING_BAD_REQUEST_ERROR": "لا يسمح بمشاركة الألبوم", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "المشاركة معطلة للحسابات المجانية", + "DOWNLOAD_COLLECTION": "تنزيل الألبوم", "CREATE_ALBUM_FAILED": "", - "SEARCH": "", - "SEARCH_RESULTS": "", - "NO_RESULTS": "", - "SEARCH_HINT": "", + "SEARCH": "بحث", + "SEARCH_RESULTS": "نتائج البحث", + "NO_RESULTS": "لا توجد نتائج", + "SEARCH_HINT": "البحث عن الألبومات، التواريخ، والأوصاف...", "SEARCH_TYPE": { - "COLLECTION": "", - "LOCATION": "", - "CITY": "", - "DATE": "", - "FILE_NAME": "", - "THING": "", - "FILE_CAPTION": "", - "FILE_TYPE": "", - "CLIP": "" + "COLLECTION": "ألبوم", + "LOCATION": "الموقع", + "CITY": "الموقع", + "DATE": "تاريخ", + "FILE_NAME": "إسم الملف", + "THING": "المحتوى", + "FILE_CAPTION": "وصف", + "FILE_TYPE": "نوع الملف", + "CLIP": "سحر" }, - "photos_count_zero": "", - "photos_count_one": "", - "photos_count": "", - "TERMS_AND_CONDITIONS": "", - "ADD_TO_COLLECTION": "", - "SELECTED": "", + "photos_count_zero": "لا توجد ذكريات", + "photos_count_one": "ذكرى واحدة", + "photos_count": "{{count, number}} ذكريات", + "TERMS_AND_CONDITIONS": "أوافق على
شروط الخدمة وسياسة الخصوصية", + "ADD_TO_COLLECTION": "إضافة إلى الألبوم", + "SELECTED": "محدد", "PEOPLE": "", - "indexing_scheduled": "", + "indexing_scheduled": "الفهرسة مجدولة...", "indexing_photos": "", "indexing_fetching": "", "indexing_people": "", "indexing_done": "", - "UNIDENTIFIED_FACES": "", + "UNIDENTIFIED_FACES": "وجوه غير محددة", "OBJECTS": "", - "TEXT": "", - "INFO": "", - "INFO_OPTION": "", - "FILE_NAME": "", - "CAPTION_PLACEHOLDER": "", - "LOCATION": "", - "SHOW_ON_MAP": "", - "MAP": "", - "MAP_SETTINGS": "", - "ENABLE_MAPS": "", - "ENABLE_MAP": "", - "DISABLE_MAPS": "", + "TEXT": "نص", + "INFO": "معلومات ", + "INFO_OPTION": "معلومات (I)", + "FILE_NAME": "إسم الملف", + "CAPTION_PLACEHOLDER": "إضافة وصف", + "LOCATION": "الموقع", + "SHOW_ON_MAP": "عرض على OpenStreetMap", + "MAP": "خريطة", + "MAP_SETTINGS": "إعدادات الخريطة", + "ENABLE_MAPS": "تمكين الخرائط ؟", + "ENABLE_MAP": "تمكين الخريطة", + "DISABLE_MAPS": "تعطيل الخرائط؟", "ENABLE_MAP_DESCRIPTION": "", "DISABLE_MAP_DESCRIPTION": "", - "DISABLE_MAP": "", - "DETAILS": "", - "view_exif": "", - "no_exif": "", - "exif": "", - "ISO": "", + "DISABLE_MAP": "تعطيل الخريطة", + "DETAILS": "تفاصيل", + "view_exif": "عرض جميع بيانات Exif", + "no_exif": "لا توجد بيانات Exif", + "exif": "Exif", + "ISO": "ISO", "TWO_FACTOR": "", - "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_AUTHENTICATION": "المصادقة الثنائية", "TWO_FACTOR_QR_INSTRUCTION": "", - "ENTER_CODE_MANUALLY": "", + "ENTER_CODE_MANUALLY": "أدخل الرمز يدويا", "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", - "SCAN_QR_CODE": "", + "SCAN_QR_CODE": "مسح رمز QR بدلاً من ذلك", "ENABLE_TWO_FACTOR": "", - "enable": "", - "enabled": "", + "enable": "تفعيل", + "enabled": "مفعل", "LOST_DEVICE": "", - "INCORRECT_CODE": "", + "INCORRECT_CODE": "رمز غير صحيح", "TWO_FACTOR_INFO": "", "DISABLE_TWO_FACTOR_LABEL": "", "UPDATE_TWO_FACTOR_LABEL": "", - "disable": "", - "reconfigure": "", + "disable": "تعطيل", + "reconfigure": "إعادة التهيئة", "UPDATE_TWO_FACTOR": "", "UPDATE_TWO_FACTOR_MESSAGE": "", - "UPDATE": "", + "UPDATE": "تحديث", "DISABLE_TWO_FACTOR": "", "DISABLE_TWO_FACTOR_MESSAGE": "", "TWO_FACTOR_DISABLE_FAILED": "", - "EXPORT_DATA": "", + "EXPORT_DATA": "تصدير البيانات", "select_folder": "", "select_zips": "", - "faq": "", + "faq": "الأسئلة الشائعة", "takeout_hint": "", - "DESTINATION": "", - "START": "", - "LAST_EXPORT_TIME": "", + "DESTINATION": "الوجهة", + "START": "بدء", + "LAST_EXPORT_TIME": "آخر وقت تصدير", "EXPORT_AGAIN": "", - "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "التخزين المحلي غير قابل للوصول", "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", "SEND_OTT": "", - "EMAIl_ALREADY_OWNED": "", + "EMAIl_ALREADY_OWNED": "البريد الإلكتروني مأخوذ بالفعل", "ETAGS_BLOCKED": "", "LIVE_PHOTOS_DETECTED": "", "RETRY_FAILED": "", @@ -321,22 +322,22 @@ "MOVE_TO_COLLECTION": "", "UNARCHIVE": "", "UNARCHIVE_COLLECTION": "", - "HIDE_COLLECTION": "", - "UNHIDE_COLLECTION": "", - "MOVE": "", - "ADD": "", - "REMOVE": "", - "YES_REMOVE": "", + "HIDE_COLLECTION": "إخفاء الألبوم", + "UNHIDE_COLLECTION": "إلغاء إخفاء الألبوم", + "MOVE": "نقل", + "ADD": "إضافة", + "REMOVE": "ازالة", + "YES_REMOVE": "نعم، إزالة", "REMOVE_FROM_COLLECTION": "", - "TRASH": "", - "MOVE_TO_TRASH": "", + "TRASH": "سلة المهملات", + "MOVE_TO_TRASH": "نقل إلى سلة المهملات", "TRASH_FILES_MESSAGE": "", "TRASH_FILE_MESSAGE": "", - "DELETE_PERMANENTLY": "", - "RESTORE": "", + "DELETE_PERMANENTLY": "حذف بشكل دائم", + "RESTORE": "استعادة", "RESTORE_TO_COLLECTION": "", - "EMPTY_TRASH": "", - "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH": "إفراغ سلة المهملات", + "EMPTY_TRASH_TITLE": "إفراغ سلة المهملات؟", "EMPTY_TRASH_MESSAGE": "", "LEAVE_SHARED_ALBUM": "", "LEAVE_ALBUM": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index 7df973eb83..787567c446 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index 6c83a4dd72..fdad284a60 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Wie hast du von Ente erfahren? (optional)", "REFERRAL_INFO": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", "PASSPHRASE_MATCH_ERROR": "Die Passwörter stimmen nicht überein", + "create_albums": "", "CREATE_COLLECTION": "Neues Album", "ENTER_ALBUM_NAME": "Albumname", "CLOSE_OPTION": "Schließen (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Das Vorschaubild konnte nicht erzeugt werden", "UNSUPPORTED_FILES": "Nicht unterstützte Dateien", "SUCCESSFUL_UPLOADS": "Erfolgreiche Uploads", - "SKIPPED_INFO": "Diese wurden übersprungen, da es Dateien mit gleichen Namen im selben Album gibt", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "Ente unterstützt diese Dateiformate noch nicht", "BLOCKED_UPLOADS": "Blockierte Uploads", "INPROGRESS_METADATA_EXTRACTION": "In Bearbeitung", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 5f93899450..9ecc3b137f 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Πώς ακούσατε για το Ente; (προαιρετικό)", "REFERRAL_INFO": "Δεν παρακολουθούμε τις εγκαταστάσεις εφαρμογών. Θα μας βοηθούσε αν μας λέγατε που μας βρήκατε!", "PASSPHRASE_MATCH_ERROR": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", + "create_albums": "", "CREATE_COLLECTION": "Νέο άλμπουμ", "ENTER_ALBUM_NAME": "Όνομα άλμπουμ", "CLOSE_OPTION": "Κλείσιμο (Esc)", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index 6fee153eb7..3254dc154c 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "¿Cómo escuchaste acerca de Ente? (opcional)", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "Las contraseñas no coinciden", + "create_albums": "", "CREATE_COLLECTION": "Nuevo álbum", "ENTER_ALBUM_NAME": "Nombre del álbum", "CLOSE_OPTION": "Cerrar (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generación de miniaturas fallida", "UNSUPPORTED_FILES": "Archivos no soportados", "SUCCESSFUL_UPLOADS": "Subidas exitosas", - "SKIPPED_INFO": "Se han omitido ya que hay archivos con nombres coincidentes en el mismo álbum", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "ente no soporta estos formatos de archivo aún", "BLOCKED_UPLOADS": "Subidas bloqueadas", "INPROGRESS_METADATA_EXTRACTION": "En proceso", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index c3d6c8159a..b6d481c36a 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index d0f899abef..8794455ddc 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Miten kuulit Entestä? (valinnainen)", "REFERRAL_INFO": "Emme seuraa sovelluksen asennuksia. Se auttaisi meitä, jos kertoisit mistä löysit meidät!", "PASSPHRASE_MATCH_ERROR": "Salasanat eivät täsmää", + "create_albums": "", "CREATE_COLLECTION": "Uusi albumi", "ENTER_ALBUM_NAME": "Albumin nimi", "CLOSE_OPTION": "Sulje (Esc)", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index b315c99929..639b8a29b6 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Comment avez-vous entendu parler de Ente? (facultatif)", "REFERRAL_INFO": "Nous ne suivons pas les installations d'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !", "PASSPHRASE_MATCH_ERROR": "Les mots de passe ne correspondent pas", + "create_albums": "", "CREATE_COLLECTION": "Nouvel album", "ENTER_ALBUM_NAME": "Nom de l'album", "CLOSE_OPTION": "Fermer (Échap)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Échec de création d'une miniature", "UNSUPPORTED_FILES": "Fichiers non supportés", "SUCCESSFUL_UPLOADS": "Chargements réussis", - "SKIPPED_INFO": "Ignorés car il y a des fichiers avec des noms identiques dans le même album", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "Ente ne supporte pas encore ces formats de fichiers", "BLOCKED_UPLOADS": "Chargements bloqués", "INPROGRESS_METADATA_EXTRACTION": "En cours", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index 9bf887d7be..3f0ae89793 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Dari mana Anda menemukan Ente? (opsional)", "REFERRAL_INFO": "Kami tidak melacak pemasangan aplikasi, Ini akan membantu kami jika Anda memberi tahu kami di mana Anda menemukan kami!", "PASSPHRASE_MATCH_ERROR": "Kata sandi tidak cocok", + "create_albums": "", "CREATE_COLLECTION": "Album baru", "ENTER_ALBUM_NAME": "Nama album", "CLOSE_OPTION": "Tutup (Esc)", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 609dff0ef7..326ed688ec 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index e32e814fda..63d1d3fee1 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Come hai conosciuto Ente? (opzionale)", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "Le password non corrispondono", + "create_albums": "", "CREATE_COLLECTION": "Nuovo album", "ENTER_ALBUM_NAME": "Nome album", "CLOSE_OPTION": "Chiudi (Esc)", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index 0afc0224fd..0a973ce7ae 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "어떻게 Ente에 대해 들으셨나요? (선택사항)", "REFERRAL_INFO": "우리는 앱 설치를 추적하지 않습니다. 우리를 알게 된 곳을 남겨주시면 우리에게 도움이 될꺼에요!", "PASSPHRASE_MATCH_ERROR": "비밀번호가 일치하지 않습니다", + "create_albums": "", "CREATE_COLLECTION": "새 앨범", "ENTER_ALBUM_NAME": "앨범 이름", "CLOSE_OPTION": "닫기 (Esc)", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 1dd8934a3c..d8cba2d986 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Hoe hoorde je over Ente? (optioneel)", "REFERRAL_INFO": "Wij gebruiken geen tracking. Het zou helpen als je ons vertelt waar je ons gevonden hebt!", "PASSPHRASE_MATCH_ERROR": "Wachtwoorden komen niet overeen", + "create_albums": "", "CREATE_COLLECTION": "Nieuw album", "ENTER_ALBUM_NAME": "Albumnaam", "CLOSE_OPTION": "Sluiten (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Thumbnail generatie mislukt", "UNSUPPORTED_FILES": "Niet-ondersteunde bestanden", "SUCCESSFUL_UPLOADS": "Succesvolle uploads", - "SKIPPED_INFO": "Deze zijn overgeslagen omdat er bestanden zijn met overeenkomende namen in hetzelfde album", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "Ente ondersteunt deze bestandsformaten nog niet", "BLOCKED_UPLOADS": "Geblokkeerde uploads", "INPROGRESS_METADATA_EXTRACTION": "In behandeling", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 2bf6775c9a..33a6a9ba1a 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Jak usłyszałeś/aś o Ente? (opcjonalnie)", "REFERRAL_INFO": "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!", "PASSPHRASE_MATCH_ERROR": "Hasła nie pasują do siebie", + "create_albums": "", "CREATE_COLLECTION": "Nowy album", "ENTER_ALBUM_NAME": "Nazwa albumu", "CLOSE_OPTION": "Zamknij (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generowanie miniatur nie powiodło się", "UNSUPPORTED_FILES": "Nieobsługiwane pliki", "SUCCESSFUL_UPLOADS": "Pomyślne przesłania", - "SKIPPED_INFO": "Pominięto te pliki, ponieważ są pliki z pasującymi nazwami w tym samym albumie", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "Ente nie obsługuje jeszcze tych formatów plików", "BLOCKED_UPLOADS": "Zablokowane przesłania", "INPROGRESS_METADATA_EXTRACTION": "W toku", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 7cb8e2e3ca..4b9245dfcd 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Como você ouviu sobre o Ente? (opcional)", "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", "PASSPHRASE_MATCH_ERROR": "As senhas não coincidem", + "create_albums": "", "CREATE_COLLECTION": "Novo álbum", "ENTER_ALBUM_NAME": "Nome do álbum", "CLOSE_OPTION": "Fechar (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Falha ao gerar miniaturas", "UNSUPPORTED_FILES": "Arquivos não suportados", "SUCCESSFUL_UPLOADS": "Envios bem sucedidos", - "SKIPPED_INFO": "Ignorar estes como existem arquivos com nomes correspondentes no mesmo álbum", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "ente ainda não suporta estes formatos de arquivo", "BLOCKED_UPLOADS": "Envios bloqueados", "INPROGRESS_METADATA_EXTRACTION": "Em andamento", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index b1d4f2f26e..e5f318a3be 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "Novo álbum", "ENTER_ALBUM_NAME": "Nome do álbum", "CLOSE_OPTION": "Fechar (Esc)", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index f15cc4a8f0..e8aa1eb726 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", + "create_albums": "", "CREATE_COLLECTION": "Новый альбом", "ENTER_ALBUM_NAME": "Название альбома", "CLOSE_OPTION": "Закрыть (Esc)", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Не удалось создать миниатюру", "UNSUPPORTED_FILES": "Неподдерживаемые файлы", "SUCCESSFUL_UPLOADS": "Успешные загрузки", - "SKIPPED_INFO": "Пропустил их, так как в одном альбоме есть файлы с одинаковыми названиями", + "SKIPPED_INFO": "", "UNSUPPORTED_INFO": "Ente пока не поддерживает эти форматы файлов", "BLOCKED_UPLOADS": "Заблокированные загрузки", "INPROGRESS_METADATA_EXTRACTION": "В процессе", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 42cdf3e79a..59aaf3dc88 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -7,7 +7,7 @@ "HERO_SLIDE_3": "Android, iOS, webb, skrivbord", "LOGIN": "Logga in", "SIGN_UP": "Registrera", - "NEW_USER": "", + "NEW_USER": "Ny hos Ente", "EXISTING_USER": "Befintlig användare", "ENTER_NAME": "Ange namn", "PUBLIC_UPLOADER_NAME_MESSAGE": "Lägg till ett namn så att dina vänner vet vem de ska tacka för dessa fantastiska bilder!", @@ -26,7 +26,7 @@ "SENT": "Skickat!", "password": "Lösenord", "link_password_description": "Ange lösenord för att låsa upp albumet", - "unlock": "", + "unlock": "Lås upp", "SET_PASSPHRASE": "Välj lösenord", "VERIFY_PASSPHRASE": "Logga in", "INCORRECT_PASSPHRASE": "Felaktigt lösenord", @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "Hur hörde du talas om Ente? (valfritt)", "REFERRAL_INFO": "Vi spårar inte appinstallationer, Det skulle hjälpa oss om du berättade var du hittade oss!", "PASSPHRASE_MATCH_ERROR": "Lösenorden matchar inte", + "create_albums": "", "CREATE_COLLECTION": "Nytt album", "ENTER_ALBUM_NAME": "Albumnamn", "CLOSE_OPTION": "Stäng (Esc)", @@ -60,11 +61,11 @@ "0": "Förbereder att ladda upp", "1": "Läser Google metadatafiler", "2": "Metadata för {{uploadCounter.finished, number}} / {{uploadCounter.total, number}} filer extraherat", - "3": "", - "4": "", - "5": "" + "3": "{{uploadCounter.finished, number}} / {{uploadCounter.total, number}} filer behandlade", + "4": "Avbryter återstående uppladdningar", + "5": "Säkerhetskopiering slutförd" }, - "FILE_NOT_UPLOADED_LIST": "", + "FILE_NOT_UPLOADED_LIST": "Följande filer laddades ej upp", "INITIAL_LOAD_DELAY_WARNING": "", "USER_DOES_NOT_EXIST": "", "NO_ACCOUNT": "", @@ -650,7 +651,7 @@ "redirect_close_instructions": "", "redirect_again": "", "autogenerated_first_album_name": "", - "autogenerated_default_album_name": "", + "autogenerated_default_album_name": "Nytt album", "developer_settings": "Utvecklarinställningar", "server_endpoint": "", "more_information": "", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json new file mode 100644 index 0000000000..f90267b710 --- /dev/null +++ b/web/packages/base/locales/ta-IN/translation.json @@ -0,0 +1,659 @@ +{ + "HERO_SLIDE_1_TITLE": "", + "HERO_SLIDE_1": "", + "HERO_SLIDE_2_TITLE": "", + "HERO_SLIDE_2": "", + "HERO_SLIDE_3_TITLE": "", + "HERO_SLIDE_3": "", + "LOGIN": "", + "SIGN_UP": "", + "NEW_USER": "", + "EXISTING_USER": "", + "ENTER_NAME": "", + "PUBLIC_UPLOADER_NAME_MESSAGE": "", + "ENTER_EMAIL": "", + "EMAIL_ERROR": "", + "REQUIRED": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "UNKNOWN_ERROR": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "password": "", + "link_password_description": "", + "unlock": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "WELCOME_TO_ENTE_HEADING": "", + "WELCOME_TO_ENTE_SUBHEADING": "", + "WHERE_YOUR_BEST_PHOTOS_LIVE": "", + "KEY_GENERATION_IN_PROGRESS_MESSAGE": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "REFERRAL_CODE_HINT": "", + "REFERRAL_INFO": "", + "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", + "CREATE_COLLECTION": "", + "ENTER_ALBUM_NAME": "", + "CLOSE_OPTION": "", + "ENTER_FILE_NAME": "", + "CLOSE": "", + "NO": "", + "NOTHING_HERE": "", + "upload": "", + "import": "", + "ADD_PHOTOS": "", + "ADD_MORE_PHOTOS": "", + "add_photos_count_one": "", + "add_photos_count": "", + "select_photos": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "2": "", + "3": "", + "4": "", + "5": "" + }, + "FILE_NOT_UPLOADED_LIST": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "CREATE": "", + "DOWNLOAD": "", + "DOWNLOAD_OPTION": "", + "DOWNLOAD_FAVORITES": "", + "DOWNLOAD_UNCATEGORIZED": "", + "DOWNLOAD_HIDDEN_ITEMS": "", + "COPY_OPTION": "", + "TOGGLE_FULLSCREEN": "", + "ZOOM_IN_OUT": "", + "PREVIOUS": "", + "NEXT": "", + "title_photos": "", + "title_auth": "", + "title_accounts": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "UPLOAD_DROPZONE_MESSAGE": "", + "WATCH_FOLDER_DROPZONE_MESSAGE": "", + "TRASH_FILES_TITLE": "", + "TRASH_FILE_TITLE": "", + "DELETE_FILES_TITLE": "", + "DELETE_FILES_MESSAGE": "", + "DELETE": "", + "DELETE_OPTION": "", + "FAVORITE_OPTION": "", + "UNFAVORITE_OPTION": "", + "MULTI_FOLDER_UPLOAD": "", + "UPLOAD_STRATEGY_CHOICE": "", + "UPLOAD_STRATEGY_SINGLE_COLLECTION": "", + "OR": "", + "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "", + "SESSION_EXPIRED_MESSAGE": "", + "SESSION_EXPIRED": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "password_changed_elsewhere": "", + "password_changed_elsewhere_message": "", + "GO_BACK": "", + "RECOVERY_KEY": "", + "SAVE_LATER": "", + "SAVE": "", + "RECOVERY_KEY_DESCRIPTION": "", + "RECOVER_KEY_GENERATION_FAILED": "", + "KEY_NOT_STORED_DISCLAIMER": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "SORRY": "", + "NO_RECOVERY_KEY_MESSAGE": "", + "NO_TWO_FACTOR_RECOVERY_KEY_MESSAGE": "", + "CONTACT_SUPPORT": "", + "REQUEST_FEATURE": "", + "SUPPORT": "", + "CONFIRM": "", + "cancel": "", + "LOGOUT": "", + "delete_account": "", + "delete_account_manually_message": "", + "LOGOUT_MESSAGE": "", + "CHANGE_EMAIL": "", + "OK": "", + "SUCCESS": "", + "ERROR": "", + "MESSAGE": "", + "OFFLINE_MSG": "", + "INSTALL_MOBILE_APP": "", + "DOWNLOAD_APP_MESSAGE": "", + "DOWNLOAD_APP": "", + "EXPORT": "", + "SUBSCRIPTION": "", + "SUBSCRIBE": "", + "MANAGEMENT_PORTAL": "", + "MANAGE_FAMILY_PORTAL": "", + "LEAVE_FAMILY_PLAN": "", + "LEAVE": "", + "LEAVE_FAMILY_CONFIRM": "", + "CHOOSE_PLAN": "", + "MANAGE_PLAN": "", + "CURRENT_USAGE": "", + "TWO_MONTHS_FREE": "", + "POPULAR": "", + "free_plan_option": "", + "free_plan_description": "", + "active": "", + "subscription_info_free": "", + "subscription_info_family": "", + "subscription_info_expired": "", + "subscription_info_renewal_cancelled": "", + "subscription_info_storage_quota_exceeded": "", + "subscription_status_renewal_active": "", + "subscription_status_renewal_cancelled": "", + "add_on_valid_till": "", + "subscription_expired": "", + "storage_quota_exceeded": "", + "SUBSCRIPTION_PURCHASE_SUCCESS": "", + "SUBSCRIPTION_PURCHASE_CANCELLED": "", + "SUBSCRIPTION_PURCHASE_FAILED": "", + "SUBSCRIPTION_UPDATE_FAILED": "", + "UPDATE_PAYMENT_METHOD_MESSAGE": "", + "STRIPE_AUTHENTICATION_FAILED": "", + "UPDATE_PAYMENT_METHOD": "", + "MONTHLY": "", + "YEARLY": "", + "MONTH_SHORT": "", + "YEAR": "", + "update_subscription_title": "", + "UPDATE_SUBSCRIPTION_MESSAGE": "", + "UPDATE_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION": "", + "CANCEL_SUBSCRIPTION_MESSAGE": "", + "CANCEL_SUBSCRIPTION_WITH_ADDON_MESSAGE": "", + "SUBSCRIPTION_CANCEL_FAILED": "", + "SUBSCRIPTION_CANCEL_SUCCESS": "", + "REACTIVATE_SUBSCRIPTION": "", + "REACTIVATE_SUBSCRIPTION_MESSAGE": "", + "SUBSCRIPTION_ACTIVATE_SUCCESS": "", + "SUBSCRIPTION_ACTIVATE_FAILED": "", + "SUBSCRIPTION_PURCHASE_SUCCESS_TITLE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE": "", + "CANCEL_SUBSCRIPTION_ON_MOBILE_MESSAGE": "", + "MAIL_TO_MANAGE_SUBSCRIPTION": "", + "RENAME": "", + "RENAME_FILE": "", + "RENAME_COLLECTION": "", + "DELETE_COLLECTION_TITLE": "", + "DELETE_COLLECTION": "", + "DELETE_COLLECTION_MESSAGE": "", + "DELETE_PHOTOS": "", + "KEEP_PHOTOS": "", + "SHARE_COLLECTION": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "DOWNLOAD_COLLECTION": "", + "CREATE_ALBUM_FAILED": "", + "SEARCH": "", + "SEARCH_RESULTS": "", + "NO_RESULTS": "", + "SEARCH_HINT": "", + "SEARCH_TYPE": { + "COLLECTION": "", + "LOCATION": "", + "CITY": "", + "DATE": "", + "FILE_NAME": "", + "THING": "", + "FILE_CAPTION": "", + "FILE_TYPE": "", + "CLIP": "" + }, + "photos_count_zero": "", + "photos_count_one": "", + "photos_count": "", + "TERMS_AND_CONDITIONS": "", + "ADD_TO_COLLECTION": "", + "SELECTED": "", + "PEOPLE": "", + "indexing_scheduled": "", + "indexing_photos": "", + "indexing_fetching": "", + "indexing_people": "", + "indexing_done": "", + "UNIDENTIFIED_FACES": "", + "OBJECTS": "", + "TEXT": "", + "INFO": "", + "INFO_OPTION": "", + "FILE_NAME": "", + "CAPTION_PLACEHOLDER": "", + "LOCATION": "", + "SHOW_ON_MAP": "", + "MAP": "", + "MAP_SETTINGS": "", + "ENABLE_MAPS": "", + "ENABLE_MAP": "", + "DISABLE_MAPS": "", + "ENABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP_DESCRIPTION": "", + "DISABLE_MAP": "", + "DETAILS": "", + "view_exif": "", + "no_exif": "", + "exif": "", + "ISO": "", + "TWO_FACTOR": "", + "TWO_FACTOR_AUTHENTICATION": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "ENABLE_TWO_FACTOR": "", + "enable": "", + "enabled": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "TWO_FACTOR_INFO": "", + "DISABLE_TWO_FACTOR_LABEL": "", + "UPDATE_TWO_FACTOR_LABEL": "", + "disable": "", + "reconfigure": "", + "UPDATE_TWO_FACTOR": "", + "UPDATE_TWO_FACTOR_MESSAGE": "", + "UPDATE": "", + "DISABLE_TWO_FACTOR": "", + "DISABLE_TWO_FACTOR_MESSAGE": "", + "TWO_FACTOR_DISABLE_FAILED": "", + "EXPORT_DATA": "", + "select_folder": "", + "select_zips": "", + "faq": "", + "takeout_hint": "", + "DESTINATION": "", + "START": "", + "LAST_EXPORT_TIME": "", + "EXPORT_AGAIN": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "SEND_OTT": "", + "EMAIl_ALREADY_OWNED": "", + "ETAGS_BLOCKED": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "failed_uploads_hint": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "INPROGRESS_METADATA_EXTRACTION": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "UPLOAD_TO_COLLECTION": "", + "UNCATEGORIZED": "", + "ARCHIVE": "", + "FAVORITES": "", + "ARCHIVE_COLLECTION": "", + "ARCHIVE_SECTION_NAME": "", + "ALL_SECTION_NAME": "", + "MOVE_TO_COLLECTION": "", + "UNARCHIVE": "", + "UNARCHIVE_COLLECTION": "", + "HIDE_COLLECTION": "", + "UNHIDE_COLLECTION": "", + "MOVE": "", + "ADD": "", + "REMOVE": "", + "YES_REMOVE": "", + "REMOVE_FROM_COLLECTION": "", + "TRASH": "", + "MOVE_TO_TRASH": "", + "TRASH_FILES_MESSAGE": "", + "TRASH_FILE_MESSAGE": "", + "DELETE_PERMANENTLY": "", + "RESTORE": "", + "RESTORE_TO_COLLECTION": "", + "EMPTY_TRASH": "", + "EMPTY_TRASH_TITLE": "", + "EMPTY_TRASH_MESSAGE": "", + "LEAVE_SHARED_ALBUM": "", + "LEAVE_ALBUM": "", + "LEAVE_SHARED_ALBUM_TITLE": "", + "LEAVE_SHARED_ALBUM_MESSAGE": "", + "NOT_FILE_OWNER": "", + "CONFIRM_SELF_REMOVE_MESSAGE": "", + "CONFIRM_SELF_AND_OTHER_REMOVE_MESSAGE": "", + "SORT_BY_CREATION_TIME_ASCENDING": "", + "SORT_BY_UPDATION_TIME_DESCENDING": "", + "SORT_BY_NAME": "", + "FIX_CREATION_TIME": "", + "FIX_CREATION_TIME_IN_PROGRESS": "", + "CREATION_TIME_UPDATED": "", + "UPDATE_CREATION_TIME_NOT_STARTED": "", + "UPDATE_CREATION_TIME_COMPLETED": "", + "UPDATE_CREATION_TIME_COMPLETED_WITH_ERROR": "", + "CAPTION_CHARACTER_LIMIT": "", + "DATE_TIME_ORIGINAL": "", + "DATE_TIME_DIGITIZED": "", + "METADATA_DATE": "", + "CUSTOM_TIME": "", + "REOPEN_PLAN_SELECTOR_MODAL": "", + "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", + "INSTALL": "", + "SHARING_DETAILS": "", + "MODIFY_SHARING": "", + "ADD_COLLABORATORS": "", + "ADD_NEW_EMAIL": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", + "ADD_VIEWERS": "", + "CHANGE_PERMISSIONS_TO_VIEWER": "", + "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", + "CONVERT_TO_VIEWER": "", + "CONVERT_TO_COLLABORATOR": "", + "CHANGE_PERMISSION": "", + "REMOVE_PARTICIPANT": "", + "CONFIRM_REMOVE": "", + "MANAGE": "", + "ADDED_AS": "", + "COLLABORATOR_RIGHTS": "", + "REMOVE_PARTICIPANT_HEAD": "", + "OWNER": "", + "COLLABORATORS": "", + "ADD_MORE": "", + "VIEWERS": "", + "OR_ADD_EXISTING": "", + "REMOVE_PARTICIPANT_MESSAGE": "", + "NOT_FOUND": "", + "LINK_EXPIRED": "", + "LINK_EXPIRED_MESSAGE": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "FILE_DOWNLOAD": "", + "link_password_lock": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "NO_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "NEVER": "", + "DISABLE_FILE_DOWNLOAD": "", + "DISABLE_FILE_DOWNLOAD_MESSAGE": "", + "SHARED_USING": "", + "SHARING_REFERRAL_CODE": "", + "LIVE": "", + "DISABLE_PASSWORD": "", + "DISABLE_PASSWORD_MESSAGE": "", + "PASSWORD_LOCK": "", + "LOCK": "", + "DOWNLOAD_UPLOAD_LOGS": "", + "file": "", + "folder": "", + "google_takeout": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "STOP_ALL_UPLOADS_MESSAGE": "", + "STOP_UPLOADS_HEADER": "", + "YES_STOP_UPLOADS": "", + "STOP_DOWNLOADS_HEADER": "", + "YES_STOP_DOWNLOADS": "", + "STOP_ALL_DOWNLOADS_MESSAGE": "", + "albums_count_one": "", + "albums_count": "", + "ALL_ALBUMS": "", + "ALBUMS": "", + "ALL_HIDDEN_ALBUMS": "", + "HIDDEN_ALBUMS": "", + "HIDDEN_ITEMS": "", + "ENTER_TWO_FACTOR_OTP": "", + "CREATE_ACCOUNT": "", + "COPIED": "", + "WATCH_FOLDERS": "", + "upgrade_now": "", + "renew_now": "", + "STORAGE": "", + "USED": "", + "YOU": "", + "FAMILY": "", + "FREE": "", + "OF": "", + "WATCHED_FOLDERS": "", + "NO_FOLDERS_ADDED": "", + "FOLDERS_AUTOMATICALLY_MONITORED": "", + "UPLOAD_NEW_FILES_TO_ENTE": "", + "REMOVE_DELETED_FILES_FROM_ENTE": "", + "ADD_FOLDER": "", + "STOP_WATCHING": "", + "STOP_WATCHING_FOLDER": "", + "STOP_WATCHING_DIALOG_MESSAGE": "", + "YES_STOP": "", + "CHANGE_FOLDER": "", + "FAMILY_PLAN": "", + "DOWNLOAD_LOGS": "", + "DOWNLOAD_LOGS_MESSAGE": "", + "WEAK_DEVICE": "", + "drag_and_drop_hint": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "NEVERMIND": "", + "UPDATE_AVAILABLE": "", + "UPDATE_INSTALLABLE_MESSAGE": "", + "INSTALL_NOW": "", + "INSTALL_ON_NEXT_LAUNCH": "", + "UPDATE_AVAILABLE_MESSAGE": "", + "DOWNLOAD_AND_INSTALL": "", + "IGNORE_THIS_VERSION": "", + "TODAY": "", + "YESTERDAY": "", + "NAME_PLACEHOLDER": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED": "", + "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "", + "CHOSE_THEME": "", + "more_details": "", + "ml_search": "", + "ml_search_description": "", + "ml_search_footnote": "", + "indexing": "", + "processed": "", + "indexing_status_running": "", + "indexing_status_fetching": "", + "indexing_status_scheduled": "", + "indexing_status_done": "", + "ml_search_disable": "", + "ml_search_disable_confirm": "", + "ml_consent": "", + "ml_consent_title": "", + "ml_consent_description": "", + "ml_consent_confirmation": "", + "labs": "", + "YOURS": "", + "passphrase_strength_weak": "", + "passphrase_strength_moderate": "", + "passphrase_strength_strong": "", + "preferences": "", + "language": "", + "advanced": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST": "", + "EXPORT_DIRECTORY_DOES_NOT_EXIST_MESSAGE": "", + "SUBSCRIPTION_VERIFICATION_ERROR": "", + "storage_unit": { + "b": "", + "kb": "", + "mb": "", + "gb": "", + "tb": "" + }, + "AFTER_TIME": { + "HOUR": "", + "DAY": "", + "WEEK": "", + "MONTH": "", + "YEAR": "" + }, + "COPY_LINK": "", + "DONE": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "PUBLIC_LINK_CREATED": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "MIGRATING_EXPORT": "", + "RENAMING_COLLECTION_FOLDERS": "", + "TRASHING_DELETED_FILES": "", + "TRASHING_DELETED_COLLECTIONS": "", + "CONTINUOUS_EXPORT": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "", + "delete_account_reason_label": "", + "delete_account_reason_placeholder": "", + "delete_reason": { + "missing_feature": "", + "behaviour": "", + "found_another_service": "", + "not_listed": "" + }, + "delete_account_feedback_label": "", + "delete_account_feedback_placeholder": "", + "delete_account_confirm_checkbox_label": "", + "delete_account_confirm": "", + "delete_account_confirm_message": "", + "feedback_required": "", + "feedback_required_found_another_service": "", + "RECOVER_TWO_FACTOR": "", + "at": "", + "AUTH_NEXT": "", + "AUTH_DOWNLOAD_MOBILE_APP": "", + "HIDDEN": "", + "HIDE": "", + "UNHIDE": "", + "UNHIDE_TO_COLLECTION": "", + "SORT_BY": "", + "NEWEST_FIRST": "", + "OLDEST_FIRST": "", + "CONVERSION_FAILED_NOTIFICATION_MESSAGE": "", + "SELECT_COLLECTION": "", + "PIN_ALBUM": "", + "UNPIN_ALBUM": "", + "DOWNLOAD_COMPLETE": "", + "DOWNLOADING_COLLECTION": "", + "DOWNLOAD_FAILED": "", + "DOWNLOAD_PROGRESS": "", + "CHRISTMAS": "", + "CHRISTMAS_EVE": "", + "NEW_YEAR": "", + "NEW_YEAR_EVE": "", + "IMAGE": "", + "VIDEO": "", + "LIVE_PHOTO": "", + "editor": { + "crop": "" + }, + "CONVERT": "", + "CONFIRM_EDITOR_CLOSE_MESSAGE": "", + "CONFIRM_EDITOR_CLOSE_DESCRIPTION": "", + "BRIGHTNESS": "", + "CONTRAST": "", + "SATURATION": "", + "BLUR": "", + "INVERT_COLORS": "", + "ASPECT_RATIO": "", + "SQUARE": "", + "ROTATE_LEFT": "", + "ROTATE_RIGHT": "", + "FLIP_VERTICALLY": "", + "FLIP_HORIZONTALLY": "", + "DOWNLOAD_EDITED": "", + "SAVE_A_COPY_TO_ENTE": "", + "RESTORE_ORIGINAL": "", + "TRANSFORM": "", + "COLORS": "", + "FLIP": "", + "ROTATION": "", + "RESET": "", + "PHOTO_EDITOR": "", + "FASTER_UPLOAD": "", + "FASTER_UPLOAD_DESCRIPTION": "", + "CAST_ALBUM_TO_TV": "", + "ENTER_CAST_PIN_CODE": "", + "PAIR_DEVICE_TO_TV": "", + "TV_NOT_FOUND": "", + "AUTO_CAST_PAIR": "", + "AUTO_CAST_PAIR_DESC": "", + "PAIR_WITH_PIN": "", + "CHOOSE_DEVICE_FROM_BROWSER": "", + "PAIR_WITH_PIN_DESC": "", + "VISIT_CAST_ENTE_IO": "", + "CAST_AUTO_PAIR_FAILED": "", + "FREEHAND": "", + "APPLY_CROP": "", + "PHOTO_EDIT_REQUIRED_TO_SAVE": "", + "passkeys": "", + "passkey_fetch_failed": "", + "manage_passkey": "", + "delete_passkey": "", + "delete_passkey_confirmation": "", + "rename_passkey": "", + "add_passkey": "", + "enter_passkey_name": "", + "passkeys_description": "", + "CREATED_AT": "", + "passkey_add_failed": "", + "passkey_login_failed": "", + "passkey_login_invalid_url": "", + "passkey_login_already_claimed_session": "", + "passkey_login_generic_error": "", + "passkey_login_credential_hint": "", + "passkeys_not_supported": "", + "try_again": "", + "check_status": "", + "passkey_login_instructions": "", + "passkey_login": "", + "passkey": "", + "passkey_verify_description": "", + "waiting_for_verification": "", + "verification_still_pending": "", + "passkey_verified": "", + "redirecting_back_to_app": "", + "redirect_close_instructions": "", + "redirect_again": "", + "autogenerated_first_album_name": "", + "autogenerated_default_album_name": "", + "developer_settings": "", + "server_endpoint": "", + "more_information": "", + "save": "" +} diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 2f7b02d9ee..f90267b710 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "", "REFERRAL_INFO": "", "PASSPHRASE_MATCH_ERROR": "", + "create_albums": "", "CREATE_COLLECTION": "", "ENTER_ALBUM_NAME": "", "CLOSE_OPTION": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 6064de6295..8e5cb95bea 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -41,6 +41,7 @@ "REFERRAL_CODE_HINT": "您是如何知道Ente的? (可选的)", "REFERRAL_INFO": "我们不跟踪应用程序安装情况,如果您告诉我们您是在哪里找到我们的,将会有所帮助!", "PASSPHRASE_MATCH_ERROR": "两次输入的密码不一致", + "create_albums": "", "CREATE_COLLECTION": "新建相册", "ENTER_ALBUM_NAME": "相册名称", "CLOSE_OPTION": "关闭 (或按Esc键)", @@ -98,7 +99,7 @@ "MULTI_FOLDER_UPLOAD": "检测到多个文件夹", "UPLOAD_STRATEGY_CHOICE": "你想要上传他们到", "UPLOAD_STRATEGY_SINGLE_COLLECTION": "单个相册", - "OR": "或者", + "OR": "还是", "UPLOAD_STRATEGY_COLLECTION_PER_FOLDER": "独立相册", "SESSION_EXPIRED_MESSAGE": "您的会话已过期,请重新登录以继续", "SESSION_EXPIRED": "会话已过期", @@ -301,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "缩略图生成失败", "UNSUPPORTED_FILES": "不支持的文件", "SUCCESSFUL_UPLOADS": "上传成功", - "SKIPPED_INFO": "跳过这些,因为在同一相册中有具有匹配名称的文件", + "SKIPPED_INFO": "跳过这些文件,因为同一相册中有名称和内容相匹配的文件", "UNSUPPORTED_INFO": "Ente 尚不支持这些文件格式", "BLOCKED_UPLOADS": "已阻止上传", "INPROGRESS_METADATA_EXTRACTION": "进行中", From 823196402395292aba798a172b255bfbb0000485 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 17:16:02 +0530 Subject: [PATCH 0850/1179] [desktop] Fix flakiness in reading zip files I'm not sure what was the issue in the existing code, but I happened to chance on a setup that reproduced the flakiness that some customers have reported (that reading the zips sometimes fails). There wasn't anything specific in the setup - I was reading a 50 MB zip file, a file which I'd read multiple times before, except this time it seemed to invariably result in failures during read. Replacing the node stream to web stream conversion with this new approach fixes the flakiness, at least in the reproducible scenario that I was encountering. --- desktop/src/main/stream.ts | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/desktop/src/main/stream.ts b/desktop/src/main/stream.ts index d32eecc627..49e20cdff5 100644 --- a/desktop/src/main/stream.ts +++ b/desktop/src/main/stream.ts @@ -4,8 +4,6 @@ import { net, protocol } from "electron/main"; import { randomUUID } from "node:crypto"; import fs from "node:fs/promises"; -import { Readable } from "node:stream"; -import { ReadableStream } from "node:stream/web"; import { pathToFileURL } from "node:url"; import log from "./log"; import { ffmpegConvertToMP4 } from "./services/ffmpeg"; @@ -17,6 +15,7 @@ import { deleteTempFileIgnoringErrors, makeTempFilePath, } from "./utils/temp"; +const { Readable } = require("node:stream"); /** * Register a protocol handler that we use for streaming large files between the @@ -120,20 +119,21 @@ const handleReadZip = async (zipPath: string, entryName: string) => { return new Response("", { status: 404 }); } - // This returns an "old style" NodeJS.ReadableStream. - const stream = await zip.stream(entry); - // Convert it into a new style NodeJS.Readable. - const nodeReadable = new Readable({ emitClose: true }).wrap(stream); - // Then convert it into a Web stream. - const webReadableStreamAny = Readable.toWeb(nodeReadable); - // However, we get a ReadableStream now. This doesn't go into the - // `BodyInit` expected by the Response constructor, which wants a - // ReadableStream. Force a cast. - const webReadableStream = - webReadableStreamAny as ReadableStream; + const { writable, readable } = new TransformStream(); + const writer = writable.getWriter(); - // Let go of the zip handle when the underlying stream closes. - nodeReadable.on("close", () => markClosableZip(zipPath)); + // zip.stream returns an "old style" NodeJS.ReadableStream. We then write it + // to the writable end of the web stream pipe, the readable end of which is + // relayed back to the renderer as the response. + const stream = await zip.stream(entry); + + stream.on("data", (chunk: Buffer) => { + void writer.write(chunk); + }); + + stream.on("end", () => { + void writer.close(); + }); // While it is documented that entry.time is the modification time, // the units are not mentioned. By seeing the source code, we can @@ -142,8 +142,7 @@ const handleReadZip = async (zipPath: string, entryName: string) => { // https://github.com/antelle/node-stream-zip/blob/master/node_stream_zip.js const modifiedMs = entry.time; - // @ts-expect-error [Note: Node and web stream type mismatch] - return new Response(webReadableStream, { + return new Response(readable, { headers: { // We don't know the exact type, but it doesn't really matter, just // set it to a generic binary content-type so that the browser From 138dcf3d2a59e1e081518627700015ac9114a121 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 17:58:35 +0530 Subject: [PATCH 0851/1179] Simplify --- desktop/src/main/stream.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/desktop/src/main/stream.ts b/desktop/src/main/stream.ts index 49e20cdff5..118587603b 100644 --- a/desktop/src/main/stream.ts +++ b/desktop/src/main/stream.ts @@ -4,6 +4,7 @@ import { net, protocol } from "electron/main"; import { randomUUID } from "node:crypto"; import fs from "node:fs/promises"; +import { Writable } from "node:stream"; import { pathToFileURL } from "node:url"; import log from "./log"; import { ffmpegConvertToMP4 } from "./services/ffmpeg"; @@ -15,7 +16,6 @@ import { deleteTempFileIgnoringErrors, makeTempFilePath, } from "./utils/temp"; -const { Readable } = require("node:stream"); /** * Register a protocol handler that we use for streaming large files between the @@ -119,21 +119,15 @@ const handleReadZip = async (zipPath: string, entryName: string) => { return new Response("", { status: 404 }); } - const { writable, readable } = new TransformStream(); - const writer = writable.getWriter(); - // zip.stream returns an "old style" NodeJS.ReadableStream. We then write it // to the writable end of the web stream pipe, the readable end of which is // relayed back to the renderer as the response. + const { writable, readable } = new TransformStream(); const stream = await zip.stream(entry); - stream.on("data", (chunk: Buffer) => { - void writer.write(chunk); - }); + stream.pipe(Writable.fromWeb(writable)); + - stream.on("end", () => { - void writer.close(); - }); // While it is documented that entry.time is the modification time, // the units are not mentioned. By seeing the source code, we can From 027e3425bbbadf2878b19513f9d7c29d9c86f8d3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 18:17:38 +0530 Subject: [PATCH 0852/1179] Gracefully handle aborts --- desktop/src/main/stream.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/desktop/src/main/stream.ts b/desktop/src/main/stream.ts index 118587603b..41c71285a9 100644 --- a/desktop/src/main/stream.ts +++ b/desktop/src/main/stream.ts @@ -125,9 +125,17 @@ const handleReadZip = async (zipPath: string, entryName: string) => { const { writable, readable } = new TransformStream(); const stream = await zip.stream(entry); - stream.pipe(Writable.fromWeb(writable)); - + const nodeWritable = Writable.fromWeb(writable); + stream.pipe(nodeWritable); + nodeWritable.on("error", (e: unknown) => { + // If the renderer process closes the network connection (say when it + // only needs the content-length and doesn't care about the body), we + // get an AbortError. Handle them here otherwise they litter the logs + // with unhandled exceptions. + if (e instanceof Error && e.name == "AbortError") return; + log.error("Error event for the writable end of zip stream", e); + }); // While it is documented that entry.time is the modification time, // the units are not mentioned. By seeing the source code, we can From 171a8670a469ab215b42dfeb902a3449226e37a2 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 31 Aug 2024 18:19:38 +0530 Subject: [PATCH 0853/1179] Balance ref counts --- desktop/src/main/services/zip.ts | 4 ++-- desktop/src/main/stream.ts | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/desktop/src/main/services/zip.ts b/desktop/src/main/services/zip.ts index 5a7f4242f0..17a7205bce 100644 --- a/desktop/src/main/services/zip.ts +++ b/desktop/src/main/services/zip.ts @@ -65,9 +65,9 @@ export const markClosableZip = (zipPath: string) => { */ export const clearOpenZipCache = () => { if (_refCount.size > 0) { - const keys = JSON.stringify([..._refCount.keys()]); + const kvs = JSON.stringify([..._refCount.entries()]); throw new Error( - `Attempting to clear zip file cache when some items are still in use: ${keys}`, + `Attempting to clear zip file cache when some items are still in use: ${kvs}`, ); } _cache.clear(); diff --git a/desktop/src/main/stream.ts b/desktop/src/main/stream.ts index 41c71285a9..261ab32a21 100644 --- a/desktop/src/main/stream.ts +++ b/desktop/src/main/stream.ts @@ -137,6 +137,10 @@ const handleReadZip = async (zipPath: string, entryName: string) => { log.error("Error event for the writable end of zip stream", e); }); + nodeWritable.on("close", () => { + markClosableZip(zipPath); + }); + // While it is documented that entry.time is the modification time, // the units are not mentioned. By seeing the source code, we can // verify that it is indeed epoch milliseconds. See `parseZipTime` From 33c843e5d8f1192a6133b58e1572e1dca82cde45 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:57:45 +0530 Subject: [PATCH 0854/1179] [auth][perf] Reduce redundant painting --- auth/lib/ui/code_timer_progress.dart | 67 ++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/auth/lib/ui/code_timer_progress.dart b/auth/lib/ui/code_timer_progress.dart index a215f0ca02..98538788ed 100644 --- a/auth/lib/ui/code_timer_progress.dart +++ b/auth/lib/ui/code_timer_progress.dart @@ -1,48 +1,45 @@ import 'package:ente_auth/theme/ente_theme.dart'; -import 'package:ente_auth/ui/linear_progress_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; class CodeTimerProgress extends StatefulWidget { final int period; - CodeTimerProgress({ + const CodeTimerProgress({ super.key, required this.period, }); @override - State createState() => _CodeTimerProgressState(); + State createState() => _CodeTimerProgressState(); } class _CodeTimerProgressState extends State with SingleTickerProviderStateMixin { late final Ticker _ticker; - double _progress = 0.0; + late final ValueNotifier _progress; late final int _microSecondsInPeriod; @override void initState() { super.initState(); _microSecondsInPeriod = widget.period * 1000000; - _ticker = createTicker((elapsed) { - _updateTimeRemaining(); - }); + _progress = ValueNotifier(0.0); + _ticker = createTicker(_updateTimeRemaining); _ticker.start(); - _updateTimeRemaining(); + _updateTimeRemaining(Duration.zero); } - void _updateTimeRemaining() { - int timeRemaining = (_microSecondsInPeriod) - + void _updateTimeRemaining(Duration elapsed) { + int timeRemaining = _microSecondsInPeriod - (DateTime.now().microsecondsSinceEpoch % _microSecondsInPeriod); - setState(() { - _progress = (timeRemaining / _microSecondsInPeriod); - }); + _progress.value = timeRemaining / _microSecondsInPeriod; } @override void dispose() { _ticker.dispose(); + _progress.dispose(); super.dispose(); } @@ -50,12 +47,46 @@ class _CodeTimerProgressState extends State Widget build(BuildContext context) { return SizedBox( height: 3, - child: LinearProgressWidget( - color: _progress > 0.4 - ? getEnteColorScheme(context).primary700 - : Colors.orange, - fractionOfStorage: _progress, + child: ValueListenableBuilder( + valueListenable: _progress, + builder: (context, progress, _) { + return CustomPaint( + painter: _ProgressPainter( + progress: progress, + color: progress > 0.4 + ? getEnteColorScheme(context).primary700 + : Colors.orange, + ), + size: Size.infinite, + ); + }, ), ); } } + +class _ProgressPainter extends CustomPainter { + final double progress; + final Color color; + + _ProgressPainter({required this.progress, required this.color}); + + @override + void paint(Canvas canvas, Size size) { + final paint = Paint() + ..color = color + ..style = PaintingStyle.fill; + + final rect = RRect.fromRectAndRadius( + Rect.fromLTWH(0, 0, size.width * progress, size.height), + const Radius.circular(2), + ); + + canvas.drawRRect(rect, paint); + } + + @override + bool shouldRepaint(_ProgressPainter oldDelegate) { + return oldDelegate.progress != progress || oldDelegate.color != color; + } +} From 815dd6b4b657bacf6db456183457456a8df6f88b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:24:58 +0530 Subject: [PATCH 0855/1179] [auth][perf] Cache timer progress widget --- auth/lib/ui/code_timer_progress.dart | 11 +++++++++++ auth/lib/ui/code_widget.dart | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/auth/lib/ui/code_timer_progress.dart b/auth/lib/ui/code_timer_progress.dart index 98538788ed..a825a6ca43 100644 --- a/auth/lib/ui/code_timer_progress.dart +++ b/auth/lib/ui/code_timer_progress.dart @@ -2,6 +2,17 @@ import 'package:ente_auth/theme/ente_theme.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; +class CodeTimerProgressCache { + static final Map _cache = {}; + + static CodeTimerProgress getCachedWidget(int period) { + if (!_cache.containsKey(period)) { + _cache[period] = CodeTimerProgress(period: period); + } + return _cache[period]!; + } +} + class CodeTimerProgress extends StatefulWidget { final int period; diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 4cd263be5a..cb073e5dea 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -111,8 +111,8 @@ class _CodeWidgetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ if (widget.code.type.isTOTPCompatible) - CodeTimerProgress( - period: widget.code.period, + CodeTimerProgressCache.getCachedWidget( + widget.code.period, ), const SizedBox(height: 28), Row( From 7354f69dc3a7a6d73c95701438c181e7d37d8f0d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:25:22 +0530 Subject: [PATCH 0856/1179] [auth][perf] Avoid redundant totp computation --- auth/lib/ui/code_widget.dart | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index cb073e5dea..4c3e748e3a 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -49,6 +49,7 @@ class _CodeWidgetState extends State { late bool _shouldShowLargeIcon; late bool _hideCode; bool isMaskingEnabled = false; + int _codeTimeStep = -1; @override void initState() { @@ -57,11 +58,22 @@ class _CodeWidgetState extends State { _hideCode = isMaskingEnabled; _everySecondTimer = Timer.periodic(const Duration(milliseconds: 500), (Timer t) { - String newCode = _getCurrentOTP(); - if (newCode != _currentCode.value) { - _currentCode.value = newCode; - if (widget.code.type.isTOTPCompatible) { - _nextCode.value = _getNextTotp(); + int newStep = 0; + if (widget.code.type != Type.hotp) { + newStep = (((DateTime.now().millisecondsSinceEpoch ~/ 1000).round()) ~/ + widget.code.period) + .floor(); + } else { + newStep = widget.code.counter; + } + if (_codeTimeStep != newStep) { + _codeTimeStep = newStep; + String newCode = _getCurrentOTP(); + if (newCode != _currentCode.value) { + _currentCode.value = newCode; + if (widget.code.type.isTOTPCompatible) { + _nextCode.value = _getNextTotp(); + } } } }); From d40dc0617147f5ac9709ec4ffb0a1d8cb49d48cb Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Sun, 1 Sep 2024 22:53:24 +0200 Subject: [PATCH 0857/1179] [mob][photos] MVP logs working in isolate --- .../core/error-reporting/isolate_logging.dart | 59 +++++++++++++++++++ .../core/error-reporting/super_logging.dart | 8 ++- .../face_clustering_service.dart | 7 ++- .../machine_learning/ml_computer.dart | 31 +++++++++- .../machine_learning/ml_indexing_isolate.dart | 5 +- .../ui/settings/ml/ml_user_dev_screen.dart | 11 ++++ 6 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 mobile/lib/core/error-reporting/isolate_logging.dart diff --git a/mobile/lib/core/error-reporting/isolate_logging.dart b/mobile/lib/core/error-reporting/isolate_logging.dart new file mode 100644 index 0000000000..0d686178f8 --- /dev/null +++ b/mobile/lib/core/error-reporting/isolate_logging.dart @@ -0,0 +1,59 @@ +import "dart:collection" show Queue; +import "dart:convert" show jsonEncode, jsonDecode; + +import "package:logging/logging.dart"; +import "package:photos/core/error-reporting/super_logging.dart"; + +class IsolateLogString { + final String logString; + final Object? error; + + IsolateLogString(this.logString, this.error); + + String toJsonString() => jsonEncode({ + 'logString': logString, + 'error': error, + }); + + static IsolateLogString fromJsonString(String jsonString) { + final json = jsonDecode(jsonString); + return IsolateLogString( + json['logString'] as String, + json['error'], + ); + } +} + +class IsolateLogger { + final Queue fileQueueEntries = Queue(); + + Future onLogRecordInIsolate(LogRecord rec) async { + final str = "[ISOLATE]" + rec.toPrettyString(); + + // write to stdout + SuperLogging.printLog(str); + + // push to log queue + fileQueueEntries.add(IsolateLogString(str, rec.error != null)); + } + + /// WARNING: only call this from the isolate + Queue getLogStringsAndClear() { + if (fileQueueEntries.isEmpty) return Queue(); + final result = Queue(); + while (fileQueueEntries.isNotEmpty) { + final entry = fileQueueEntries.removeFirst(); + result.add(entry.toJsonString()); + } + return result; + } + + /// WARNING: only call this from the main thread + static void handLogStringsToMainLogger(Queue logs) { + while (logs.isNotEmpty) { + final logString = logs.removeFirst(); + final log = IsolateLogString.fromJsonString(logString); + SuperLogging.saveLogString(log.logString, log.error); + } + } +} diff --git a/mobile/lib/core/error-reporting/super_logging.dart b/mobile/lib/core/error-reporting/super_logging.dart index 2a677b3fd3..f146b1b14c 100644 --- a/mobile/lib/core/error-reporting/super_logging.dart +++ b/mobile/lib/core/error-reporting/super_logging.dart @@ -270,6 +270,10 @@ class SuperLogging { // write to stdout printLog(str); + saveLogString(str, rec.error); + } + + static void saveLogString(String str, Object? error) { // push to log queue if (fileIsEnabled) { fileQueueEntries.add(str + '\n'); @@ -279,8 +283,8 @@ class SuperLogging { } // add error to sentry queue - if (sentryIsEnabled && rec.error != null) { - _sendErrorToSentry(rec.error!, null).ignore(); + if (sentryIsEnabled && error != null) { + _sendErrorToSentry(error, null).ignore(); } } diff --git a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart index 66fa306dcd..fefe2910d2 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_clustering/face_clustering_service.dart @@ -4,7 +4,7 @@ import "dart:isolate"; import "dart:typed_data" show Uint8List; import "package:computer/computer.dart"; -import "package:flutter/foundation.dart" show kDebugMode; +import "package:flutter/foundation.dart" show debugPrint, kDebugMode; import "package:logging/logging.dart"; import "package:ml_linalg/dtype.dart"; import "package:ml_linalg/vector.dart"; @@ -120,7 +120,10 @@ class FaceClusteringService { /// The main execution function of the isolate. static void _isolateMain(SendPort mainSendPort) async { Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; - Logger.root.onRecord.listen(SuperLogging.onLogRecord); + // TODO:lau move to right isolate logging + Logger.root.onRecord.listen((LogRecord rec) { + debugPrint('[MLIsolate] ${rec.toPrettyString()}'); + }); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index 78743bbd84..f027208758 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import "dart:collection" show Queue; import "dart:io" show File; import 'dart:isolate'; import 'dart:typed_data' show Uint8List; @@ -6,7 +7,7 @@ import 'dart:typed_data' show Uint8List; import "package:dart_ui_isolate/dart_ui_isolate.dart"; import "package:flutter/foundation.dart" show kDebugMode; import "package:logging/logging.dart"; -import "package:photos/core/error-reporting/super_logging.dart"; +import "package:photos/core/error-reporting/isolate_logging.dart"; import "package:photos/models/ml/face/box.dart"; import "package:photos/services/machine_learning/ml_model.dart"; import "package:photos/services/machine_learning/semantic_search/clip/clip_text_encoder.dart"; @@ -20,6 +21,7 @@ enum MLComputerOperation { loadModel, initializeClipTokenizer, runClipText, + testLogging, } class MLComputer { @@ -62,7 +64,8 @@ class MLComputer { @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; - Logger.root.onRecord.listen(SuperLogging.onLogRecord); + final IsolateLogger isolateLogger = IsolateLogger(); + Logger.root.onRecord.listen(isolateLogger.onLogRecordInIsolate); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); @@ -106,6 +109,14 @@ class MLComputer { final textEmbedding = await ClipTextEncoder.predict(args); sendPort.send(List.from(textEmbedding, growable: false)); break; + case MLComputerOperation.testLogging: + final logger = Logger('XXX MLComputerTestLogging'); + logger.info("XXX logging from isolate is working!!!"); + final Queue logStrings = + isolateLogger.getLogStringsAndClear(); + final test = [List.from(logStrings)]; + sendPort.send(test); + break; } } catch (e, stackTrace) { sendPort @@ -221,4 +232,20 @@ class MLComputer { } }); } + + Future testLogging() async { + try { + final test = await _runInIsolate( + ( + MLComputerOperation.testLogging, + {}, + ), + ) as List>; + IsolateLogger.handLogStringsToMainLogger(Queue.from(test[0])); + return; + } catch (e, s) { + _logger.severe("XXX Could not test logging in isolate", e, s); + rethrow; + } + } } diff --git a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart index 66772dd40b..996a766d64 100644 --- a/mobile/lib/services/machine_learning/ml_indexing_isolate.dart +++ b/mobile/lib/services/machine_learning/ml_indexing_isolate.dart @@ -67,7 +67,10 @@ class MLIndexingIsolate { @pragma('vm:entry-point') static void _isolateMain(SendPort mainSendPort) async { Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; - Logger.root.onRecord.listen(SuperLogging.onLogRecord); + // TODO:lau move to right isolate logging + Logger.root.onRecord.listen((LogRecord rec) { + debugPrint('[MLIsolate] ${rec.toPrettyString()}'); + }); final receivePort = ReceivePort(); mainSendPort.send(receivePort.sendPort); receivePort.listen((message) async { diff --git a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart index 8d70cee21b..7c4d808592 100644 --- a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart +++ b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart @@ -3,6 +3,7 @@ import "package:photos/core/event_bus.dart"; import "package:photos/db/ml/clip_db.dart"; import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; +import "package:photos/services/machine_learning/ml_computer.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; @@ -55,6 +56,16 @@ class MLUserDeveloperOptions extends StatelessWidget { await deleteAllLocalML(context); }, ), + // TODO:lau remove below code + const SizedBox(height: 24), + ButtonWidget( + buttonType: ButtonType.neutral, + labelText: "Log something in isolate", + onTap: () async { + await MLComputer.instance.testLogging(); + showShortToast(context, "Done"); + }, + ), const SafeArea( child: SizedBox( height: 12, From 746aa4cb9617e97881053a0eee5610e0a68fc5d6 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 2 Sep 2024 00:32:36 +0000 Subject: [PATCH 0858/1179] New Crowdin translations by GitHub Action --- .../base/locales/pl-PL/translation.json | 4 +-- .../base/locales/pt-BR/translation.json | 4 +-- .../base/locales/ru-RU/translation.json | 32 +++++++++---------- .../base/locales/sv-SE/translation.json | 2 +- .../base/locales/zh-CN/translation.json | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 33a6a9ba1a..61e464e0af 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "Jak usłyszałeś/aś o Ente? (opcjonalnie)", "REFERRAL_INFO": "Nie śledzimy instalacji aplikacji. Pomogłyby nam, gdybyś powiedział/a nam, gdzie nas znalazłeś/aś!", "PASSPHRASE_MATCH_ERROR": "Hasła nie pasują do siebie", - "create_albums": "", + "create_albums": "Utwórz albumy", "CREATE_COLLECTION": "Nowy album", "ENTER_ALBUM_NAME": "Nazwa albumu", "CLOSE_OPTION": "Zamknij (Esc)", @@ -302,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Generowanie miniatur nie powiodło się", "UNSUPPORTED_FILES": "Nieobsługiwane pliki", "SUCCESSFUL_UPLOADS": "Pomyślne przesłania", - "SKIPPED_INFO": "", + "SKIPPED_INFO": "Pominięto te pliki, ponieważ są pliki z pasującymi nazwami i zawartością w tym samym albumie", "UNSUPPORTED_INFO": "Ente nie obsługuje jeszcze tych formatów plików", "BLOCKED_UPLOADS": "Zablokowane przesłania", "INPROGRESS_METADATA_EXTRACTION": "W toku", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 4b9245dfcd..6e640539b1 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "Como você ouviu sobre o Ente? (opcional)", "REFERRAL_INFO": "Não rastreamos instalações do aplicativo. Seria útil se você nos contasse onde nos encontrou!", "PASSPHRASE_MATCH_ERROR": "As senhas não coincidem", - "create_albums": "", + "create_albums": "Criar álbuns", "CREATE_COLLECTION": "Novo álbum", "ENTER_ALBUM_NAME": "Nome do álbum", "CLOSE_OPTION": "Fechar (Esc)", @@ -302,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Falha ao gerar miniaturas", "UNSUPPORTED_FILES": "Arquivos não suportados", "SUCCESSFUL_UPLOADS": "Envios bem sucedidos", - "SKIPPED_INFO": "", + "SKIPPED_INFO": "Estes foram pulados, pois há arquivos com nome e conteúdo correspondentes no mesmo álbum", "UNSUPPORTED_INFO": "ente ainda não suporta estes formatos de arquivo", "BLOCKED_UPLOADS": "Envios bloqueados", "INPROGRESS_METADATA_EXTRACTION": "Em andamento", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index e8aa1eb726..26a8fb055c 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -1,11 +1,11 @@ { - "HERO_SLIDE_1_TITLE": "
Личные резервные копии
для твоих воспоминаний
", + "HERO_SLIDE_1_TITLE": "
Приватные резервные копии
для ваших воспоминаний
", "HERO_SLIDE_1": "Сквозное шифрование по умолчанию", "HERO_SLIDE_2_TITLE": "
Надежно хранится
в убежище от радиоактивных осадков
", "HERO_SLIDE_2": "Созданный для того, чтобы пережить", "HERO_SLIDE_3_TITLE": "
Доступно
везде
", "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Авторизоваться", + "LOGIN": "Войти", "SIGN_UP": "Регистрация", "NEW_USER": "Новенький в Ente", "EXISTING_USER": "Существующий пользователь", @@ -19,7 +19,7 @@ "ENTER_OTT": "Проверочный код", "RESEND_MAIL": "Отправить код еще раз", "VERIFY": "Подтвердить", - "UNKNOWN_ERROR": "Что-то пошло не так, Попробуйте еще раз", + "UNKNOWN_ERROR": "Что-то пошло не так, попробуйте еще раз", "INVALID_CODE": "Неверный код подтверждения", "EXPIRED_CODE": "Срок действия вашего проверочного кода истек", "SENDING": "Отправка...", @@ -28,7 +28,7 @@ "link_password_description": "Введите пароль, чтобы разблокировать альбом", "unlock": "Разблокировать", "SET_PASSPHRASE": "Установить пароль", - "VERIFY_PASSPHRASE": "Войти", + "VERIFY_PASSPHRASE": "Зарегистрироваться", "INCORRECT_PASSPHRASE": "Неверный пароль", "ENTER_ENC_PASSPHRASE": "Пожалуйста, введите пароль, который мы можем использовать для шифрования ваших данных", "PASSPHRASE_DISCLAIMER": "Мы не храним ваш пароль, поэтому, если вы его забудете,\nмы ничем не сможем вам помочь\nвосстановите ваши данные без ключа восстановления.", @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "Как вы узнали о Ente? (необязательно)", "REFERRAL_INFO": "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!", "PASSPHRASE_MATCH_ERROR": "Пароли не совпадают", - "create_albums": "", + "create_albums": "Создать альбомы", "CREATE_COLLECTION": "Новый альбом", "ENTER_ALBUM_NAME": "Название альбома", "CLOSE_OPTION": "Закрыть (Esc)", @@ -176,7 +176,7 @@ "UPDATE_PAYMENT_METHOD": "Обновить платёжную информацию", "MONTHLY": "Ежемесячно", "YEARLY": "Ежегодно", - "MONTH_SHORT": "мо", + "MONTH_SHORT": "мес", "YEAR": "год", "update_subscription_title": "Подтвердить изменение плана", "UPDATE_SUBSCRIPTION_MESSAGE": "Хотите сменить текущий план?", @@ -302,7 +302,7 @@ "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Не удалось создать миниатюру", "UNSUPPORTED_FILES": "Неподдерживаемые файлы", "SUCCESSFUL_UPLOADS": "Успешные загрузки", - "SKIPPED_INFO": "", + "SKIPPED_INFO": "Пропущено, так как в альбоме есть файлы с совпадающими именем и содержимым", "UNSUPPORTED_INFO": "Ente пока не поддерживает эти форматы файлов", "BLOCKED_UPLOADS": "Заблокированные загрузки", "INPROGRESS_METADATA_EXTRACTION": "В процессе", @@ -336,8 +336,8 @@ "DELETE_PERMANENTLY": "Удалить навсегда", "RESTORE": "Восстанавливать", "RESTORE_TO_COLLECTION": "Восстановить в альбом", - "EMPTY_TRASH": "Пустой мусор", - "EMPTY_TRASH_TITLE": "Пустой мусор?", + "EMPTY_TRASH": "Очистить корзину", + "EMPTY_TRASH_TITLE": "Очистить корзину?", "EMPTY_TRASH_MESSAGE": "Эти файлы будут безвозвратно удалены из вашей учетной записи Ente.", "LEAVE_SHARED_ALBUM": "Да, уходи", "LEAVE_ALBUM": "Оставить альбом", @@ -486,15 +486,15 @@ "indexing": "Индексирование", "processed": "Обработано", "indexing_status_running": "Выполняется", - "indexing_status_fetching": "", + "indexing_status_fetching": "Получение", "indexing_status_scheduled": "Запланировано", "indexing_status_done": "Готово", "ml_search_disable": "Отключить машинное обучение", "ml_search_disable_confirm": "Вы хотите отключить машинное обучение на всех ваших устройствах?", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_consent": "Включить машинное обучение", + "ml_consent_title": "Включить машинное обучение?", + "ml_consent_description": "

Если вы включите машинное обучение, Ente будет извлекать информацию из файлов (например, геометрию лица), включая те, которыми с вами поделились.

Это будет происходить на вашем устройстве, и любая сгенерированная биометрическая информация будет зашифрована с использованием сквозного (End-to-End) шифрования

Пожалуйста нажмите здесь для получения дополнительной информации об этой функции в нашей политике конфиденциальности

", + "ml_consent_confirmation": "Я понимаю, и хочу разрешить машинное обучение", "labs": "Лаборатории", "YOURS": "твой", "passphrase_strength_weak": "Надежность пароля: слабая", @@ -533,8 +533,8 @@ "EXPORT_PROGRESS": "{{progress.success, number}} / {{progress.total, number}} синхронизированные элементы", "MIGRATING_EXPORT": "Подготовка...", "RENAMING_COLLECTION_FOLDERS": "Переименование папок альбомов...", - "TRASHING_DELETED_FILES": "Удаление удаленных файлов...", - "TRASHING_DELETED_COLLECTIONS": "Удаление удаленных альбомов...", + "TRASHING_DELETED_FILES": "Очистка удаленных файлов...", + "TRASHING_DELETED_COLLECTIONS": "Очистка удаленных альбомов...", "CONTINUOUS_EXPORT": "Непрерывная синхронизация", "PENDING_ITEMS": "Отложенные пункты", "EXPORT_STARTING": "Запуск экспорта...", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 59aaf3dc88..48bea6d012 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "Hur hörde du talas om Ente? (valfritt)", "REFERRAL_INFO": "Vi spårar inte appinstallationer, Det skulle hjälpa oss om du berättade var du hittade oss!", "PASSPHRASE_MATCH_ERROR": "Lösenorden matchar inte", - "create_albums": "", + "create_albums": "Skapa album", "CREATE_COLLECTION": "Nytt album", "ENTER_ALBUM_NAME": "Albumnamn", "CLOSE_OPTION": "Stäng (Esc)", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 8e5cb95bea..66fc6fa6f9 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "您是如何知道Ente的? (可选的)", "REFERRAL_INFO": "我们不跟踪应用程序安装情况,如果您告诉我们您是在哪里找到我们的,将会有所帮助!", "PASSPHRASE_MATCH_ERROR": "两次输入的密码不一致", - "create_albums": "", + "create_albums": "创建相册", "CREATE_COLLECTION": "新建相册", "ENTER_ALBUM_NAME": "相册名称", "CLOSE_OPTION": "关闭 (或按Esc键)", From 71644e255d3e28714d3478e11f22c87227f24fe9 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 2 Sep 2024 01:04:42 +0000 Subject: [PATCH 0859/1179] New Crowdin translations by GitHub Action --- mobile/lib/l10n/intl_da.arb | 1 - mobile/lib/l10n/intl_de.arb | 2 +- mobile/lib/l10n/intl_es.arb | 1 - mobile/lib/l10n/intl_fa.arb | 1 - mobile/lib/l10n/intl_fr.arb | 34 ++++++++++- mobile/lib/l10n/intl_he.arb | 1 - mobile/lib/l10n/intl_hi.arb | 1 - mobile/lib/l10n/intl_id.arb | 58 +++++++++++++++++- mobile/lib/l10n/intl_it.arb | 117 +++++++++++++++++++++++++++++++++++- mobile/lib/l10n/intl_nl.arb | 8 ++- mobile/lib/l10n/intl_no.arb | 1 - mobile/lib/l10n/intl_pl.arb | 4 +- mobile/lib/l10n/intl_pt.arb | 4 +- mobile/lib/l10n/intl_ru.arb | 24 +++++--- mobile/lib/l10n/intl_sv.arb | 2 +- mobile/lib/l10n/intl_ta.arb | 19 ++++++ mobile/lib/l10n/intl_th.arb | 1 - mobile/lib/l10n/intl_tr.arb | 1 - mobile/lib/l10n/intl_zh.arb | 4 +- 19 files changed, 257 insertions(+), 27 deletions(-) create mode 100644 mobile/lib/l10n/intl_ta.arb diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index 49c26657f9..e4b2cc656b 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "Vi er kede af at du forlader os. Forklar venligst hvorfor, så vi kan forbedre os.", "feedback": "Feedback", "kindlyHelpUsWithThisInformation": "Hjælp os venligst med disse oplysninger", - "confirmDeletePrompt": "Ja, jeg ønsker at slette denne konto og alle dens data permanent.", "confirmAccountDeletion": "Bekræft Sletning Af Konto", "deleteAccountPermanentlyButton": "Slet konto permanent", "yourAccountHasBeenDeleted": "Din konto er blevet slettet", diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index aa50482f8d..50f0248d40 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Wir bedauern sehr, dass du dein Konto löschen möchtest. Du würdest uns sehr helfen, wenn du uns kurz einige Gründe hierfür nennen könntest.", "feedback": "Rückmeldung", "kindlyHelpUsWithThisInformation": "Bitte gib diese Daten ein", - "confirmDeletePrompt": "Ja, ich möchte dieses Konto und alle enthaltenen Daten endgültig und unwiderruflich löschen.", + "confirmDeletePrompt": "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps endgültig und unwiderruflich löschen.", "confirmAccountDeletion": "Kontolöschung bestätigen", "deleteAccountPermanentlyButton": "Konto unwiderruflich löschen", "yourAccountHasBeenDeleted": "Dein Benutzerkonto wurde gelöscht", diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 238f61095f..3131fb37eb 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "Lamentamos que te vayas. Por favor, explícanos el motivo para ayudarnos a mejorar.", "feedback": "Sugerencias", "kindlyHelpUsWithThisInformation": "Por favor ayúdanos con esta información", - "confirmDeletePrompt": "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos.", "confirmAccountDeletion": "Confirmar borrado de cuenta", "deleteAccountPermanentlyButton": "Eliminar cuenta permanentemente", "yourAccountHasBeenDeleted": "Tu cuenta ha sido eliminada", diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index d5dbe63862..8d957cf574 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "ما متاسفیم که می‌بینیم شما می‌روید. لطفا نظرات خود را برای کمک به بهبود ما به اشتراک بگذارید.", "feedback": "بازخورد", "kindlyHelpUsWithThisInformation": "لطفا با این اطلاعات به ما کمک کنید", - "confirmDeletePrompt": "بله، من می‌خواهم برای همیشه این حساب کاربری و تمام اطلاعات آن را حذف کنم.", "confirmAccountDeletion": "تایید حذف حساب کاربری", "deleteAccountPermanentlyButton": "حذف دائمی حساب کاربری", "yourAccountHasBeenDeleted": "حساب کاربری شما حذف شده است", diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 8f4b1e375e..01cf3c930d 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Nous sommes désolés de vous voir partir. N'hésitez pas à partager vos commentaires pour nous aider à améliorer le service.", "feedback": "Commentaires", "kindlyHelpUsWithThisInformation": "Merci de nous aider avec cette information", - "confirmDeletePrompt": "Oui, je veux supprimer définitivement ce compte et toutes ses données.", + "confirmDeletePrompt": "Oui, je veux supprimer définitivement ce compte et ses données dans toutes les applications.", "confirmAccountDeletion": "Confirmer la suppression du compte", "deleteAccountPermanentlyButton": "Supprimer définitivement le compte", "yourAccountHasBeenDeleted": "Votre compte a été supprimé", @@ -277,6 +277,7 @@ "change": "Modifier", "unavailableReferralCode": "Désolé, ce code n'est pas disponible.", "codeChangeLimitReached": "Désolé, vous avez atteint la limite de changements de code.", + "onlyFamilyAdminCanChangeCode": "Veuillez contacter {familyAdminEmail} pour modifier votre code.", "storageInGB": "{storageAmountInGB} Go", "claimed": "Réclamée", "@claimed": { @@ -413,7 +414,13 @@ "photoGridSize": "Taille de la grille photo", "manageDeviceStorage": "Gérer le stockage de l'appareil", "machineLearning": "Apprentissage automatique", + "mlConsent": "Activer l'apprentissage automatique", + "mlConsentTitle": "Activer l'apprentissage automatique ?", + "mlConsentDescription": "Si vous activez l'apprentissage automatique, Ente extraira des informations comme la géométrie des visages, incluant les photos partagées avec vous. \nCela se fera sur votre appareil, avec un cryptage de bout-en-bout de toutes les données biométriques générées.", + "mlConsentPrivacy": "Veuillez cliquer ici pour plus de détails sur cette fonctionnalité dans notre politique de confidentialité", + "mlConsentConfirmation": "Je comprends, et souhaite activer l'apprentissage automatique", "magicSearch": "Recherche magique", + "mlIndexingDescription": "Veuillez noter que l'apprentissage automatique entraînera une augmentation de l'utilisation de la bande passante et de la batterie, jusqu'à ce que tous les éléments soient indexés. \nEnvisagez d'utiliser l'application de bureau pour une indexation plus rapide, tous les résultats seront automatiquement synchronisés.", "loadingModel": "Téléchargement des modèles...", "waitingForWifi": "En attente de connexion Wi-Fi...", "status": "État", @@ -489,6 +496,7 @@ "removeDuplicates": "Supprimer les doublons", "removeDuplicatesDesc": "Examiner et supprimer les fichiers qui sont des doublons exacts.", "viewLargeFiles": "Fichiers volumineux", + "viewLargeFilesDesc": "Afficher les fichiers qui consomment le plus de stockage.", "noDuplicates": "✨ Aucun doublon", "youveNoDuplicateFilesThatCanBeCleared": "Vous n'avez aucun fichier dédupliqué pouvant être nettoyé", "success": "Succès", @@ -1145,6 +1153,7 @@ "successfullyHid": "Masquage réussi", "successfullyUnhid": "Masquage réussi", "crashReporting": "Rapports d'erreurs", + "resumableUploads": "Chargements à poursuivre", "addToHiddenAlbum": "Ajouter à un album masqué", "moveToHiddenAlbum": "Déplacer vers un album masqué", "fileTypes": "Types de fichiers", @@ -1247,12 +1256,29 @@ "foundFaces": "Visages trouvés", "clusteringProgress": "Progression du regroupement", "indexingIsPaused": "L'indexation est en pause. Elle reprendra automatiquement lorsque l'appareil sera prêt.", + "trim": "Recadrer", + "crop": "Rogner", "rotate": "Pivoter", "left": "Gauche", "right": "Droite", "whatsNew": "Nouveautés", "reviewSuggestions": "Consulter les suggestions", "useAsCover": "Utiliser comme couverture", + "notPersonLabel": "Pas {name}?", + "@notPersonLabel": { + "description": "Label to indicate that the person in the photo is not the person whose name is mentioned", + "placeholders": { + "name": { + "content": "{name}", + "type": "String" + } + } + }, + "enable": "Activer", + "enabled": "Activé", + "moreDetails": "Plus de détails", + "enableMLIndexingDesc": "Ente prend en charge l'apprentissage automatique sur l'appareil pour la reconnaissance faciale, la recherche magique et d'autres fonctionnalités de recherche avancée", + "magicSearchHint": "La recherche magique permet de rechercher des photos par leur contenu, par exemple 'fleur', 'voiture rouge', 'documents d'identité'", "panorama": "Panorama", "reenterPassword": "Ressaisir le mot de passe", "reenterPin": "Ressaisir le code PIN", @@ -1278,6 +1304,8 @@ "pleaseSelectQuickLinksToRemove": "Veuillez sélectionner les liens rapides à supprimer", "removePublicLinks": "Supprimer les liens publics", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Ceci supprimera les liens publics de tous les liens rapides sélectionnés.", + "guestView": "Vue invité", + "guestViewEnablePreSteps": "Pour activer la vue invité, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", "cl_guest_view_title": "Vue invité", "cl_guest_view_description": "Montrer des photos à un ami en les transmettant sur votre téléphone ? Ne vous inquiétez pas si vous les faites glisser trop loin.\nLa vue \"invité\" les verrouillera dans les photos que vous avez sélectionnées.", "cl_guest_view_call_to_action": "Sélectionnez les photos et fixez les en \"Vue Invité\".", @@ -1285,5 +1313,7 @@ "cl_panorama_viewer_description": "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L'expérience est immersive avec la navigation basée sur les mouvements !", "cl_video_player_title": "Lecteur vidéo", "cl_video_player_description": "Intégration d'un nouveau lecteur vidéo, avec de meilleurs contrôles de lecture et la prise en charge des vidéos HDR.", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système." + "appLockDescriptions": "Choisissez entre l'écran de verrouillage par défaut de votre appareil et un écran de verrouillage personnalisé avec un code PIN ou un mot de passe.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", + "authToViewPasskey": "Veuillez vous authentifier pour afficher votre clé de récupération" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index ad713b19d7..9342d8cf07 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "אנחנו מצטערים לראות שאתה עוזב. אנא תחלוק את המשוב שלך כדי לעזור לנו להשתפר.", "feedback": "משוב", "kindlyHelpUsWithThisInformation": "אנא עזור לנו עם המידע הזה", - "confirmDeletePrompt": "כן, אני רוצה למחוק לצמיתות את החשבון הזה וכל המידע שלו.", "confirmAccountDeletion": "אשר את מחיקת החשבון", "deleteAccountPermanentlyButton": "מחק את החשבון לצמיתות", "yourAccountHasBeenDeleted": "החשבון שלך נמחק", diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index 35f1e866b4..b79d9682f2 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "आपको जाता हुए देख कर हमें खेद है। कृपया हमें बेहतर बनने में सहायता के लिए अपनी प्रतिक्रिया साझा करें।", "feedback": "प्रतिपुष्टि", "kindlyHelpUsWithThisInformation": "कृपया हमें इस जानकारी के लिए सहायता करें", - "confirmDeletePrompt": "हां, मैं इस अकाउंट और इसके सभी डेटा को स्थायी रूप से हटाना चाहता/चाहती हूं।", "confirmAccountDeletion": "अकाउंट डिलीट करने की पुष्टि करें", "deleteAccountPermanentlyButton": "अकाउंट स्थायी रूप से डिलीट करें", "yourAccountHasBeenDeleted": "आपका अकाउंट डिलीट कर दिया गया है", diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index 0768a2d798..2a5c73f456 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Kami sedih kamu pergi. Silakan bagikan masukanmu agar kami bisa jadi lebih baik.", "feedback": "Masukan", "kindlyHelpUsWithThisInformation": "Harap bantu kami dengan informasi ini", - "confirmDeletePrompt": "Ya, saya ingin menghapus akun ini dan seluruh data yang terkait secara permanen.", + "confirmDeletePrompt": "Ya, saya ingin menghapus akun ini dan seluruh datanya secara permanen di semua aplikasi.", "confirmAccountDeletion": "Konfirmasi Penghapusan Akun", "deleteAccountPermanentlyButton": "Hapus Akun Secara Permanen", "yourAccountHasBeenDeleted": "Akunmu telah dihapus", @@ -426,6 +426,7 @@ "status": "Status", "indexedItems": "Item terindeks", "pendingItems": "Item menunggu", + "clearIndexes": "Hapus indeks", "selectFoldersForBackup": "Pilih folder yang perlu dicadangkan", "selectedFoldersWillBeEncryptedAndBackedUp": "Folder yang terpilih akan dienkripsi dan dicadangkan", "unselectAll": "Batalkan semua pilihan", @@ -437,11 +438,18 @@ "showMemories": "Lihat kenangan", "yearsAgo": "{count, plural, other{{count} tahun lalu}}", "backupSettings": "Pengaturan pencadangan", + "backupStatus": "Status pencadangan", + "backupStatusDescription": "Item yang sudah dicadangkan akan terlihat di sini", "backupOverMobileData": "Cadangkan dengan data seluler", "backupVideos": "Cadangkan video", "disableAutoLock": "Nonaktifkan kunci otomatis", + "deviceLockExplanation": "Nonaktfikan kunci layar perangkat saat Ente berada di latar depan dan ada pencadangan yang sedang berlangsung. Hal ini biasanya tidak diperlukan, namun dapat membantu unggahan dan import awal berkas berkas besar selesai lebih cepat.", + "about": "Tentang", + "weAreOpenSource": "Kode kami sumber terbuka!", "privacy": "Privasi", "terms": "Ketentuan", + "checkForUpdates": "Periksa pembaruan", + "checkStatus": "Periksa status", "checking": "Memeriksa...", "youAreOnTheLatestVersion": "Kamu menggunakan versi terbaru", "account": "Akun", @@ -458,10 +466,13 @@ "yesLogout": "Ya, keluar", "aNewVersionOfEnteIsAvailable": "Versi baru dari Ente telah tersedia.", "update": "Perbarui", + "installManually": "Instal secara manual", "criticalUpdateAvailable": "Pembaruan penting tersedia", "updateAvailable": "Pembaruan tersedia", "ignoreUpdate": "Abaikan", "downloading": "Mengunduh...", + "cannotDeleteSharedFiles": "Tidak dapat menghapus file berbagi", + "theDownloadCouldNotBeCompleted": "Unduhan tidak dapat diselesaikan", "retry": "Coba lagi", "backedUpFolders": "Folder yang dicadangkan", "backup": "Pencadangan", @@ -472,8 +483,12 @@ "removeDuplicates": "Hapus duplikat", "removeDuplicatesDesc": "Lihat dan hapus file yang sama persis.", "viewLargeFiles": "File berukuran besar", + "viewLargeFilesDesc": "Tampilkan file yang banyak mengkonsumsi ruang penyimpanan.", "noDuplicates": "✨ Tak ada file duplikat", + "youveNoDuplicateFilesThatCanBeCleared": "Kamu tidak memiliki file duplikat yang dapat di hapus", "success": "Berhasil", + "rateUs": "Beri kami nilai", + "remindToEmptyDeviceTrash": "Kosongkan juga “Baru Saja Dihapus” dari “Pengaturan” -> “Penyimpanan” untuk mengklaim ruang yang baru dikosongkan", "youHaveSuccessfullyFreedUp": "Kamu telah berhasil membersihkan {storageSaved}!", "@youHaveSuccessfullyFreedUp": { "description": "The text to display when the user has successfully freed up storage", @@ -485,6 +500,7 @@ } } }, + "remindToEmptyEnteTrash": "Kosongkan juga \"Sampah\" untuk mendapatkan ruang yang baru dikosongkan", "sparkleSuccess": "✨ Berhasil", "duplicateFileCountWithStorageSaved": "Kamu telah menghapus {count, plural, other{{count} file duplikat}} dan membersihkan ({storageSaved}!)", "@duplicateFileCountWithStorageSaved": { @@ -502,14 +518,18 @@ } }, "familyPlans": "Paket keluarga", + "referrals": "Referensi", "notifications": "Notifikasi", "sharedPhotoNotifications": "Foto terbagi baru", + "sharedPhotoNotificationsExplanation": "Terima notifikasi apabila seseorang menambahkan foto ke album bersama yang kamu ikuti", "advanced": "Lanjutan", "general": "Umum", "security": "Keamanan", "authToViewYourRecoveryKey": "Harap autentikasi untuk melihat kunci pemulihan kamu", "twofactor": "Autentikasi dua langkah", "authToConfigureTwofactorAuthentication": "Harap autentikasi untuk mengatur autentikasi dua langkah", + "lockscreen": "Kunci layar", + "authToChangeLockscreenSetting": "Lakukan autentikasi untuk mengubah pengaturan kunci layar", "viewActiveSessions": "Lihat sesi aktif", "authToViewYourActiveSessions": "Harap autentikasi untuk melihat sesi aktif kamu", "disableTwofactor": "Nonaktifkan autentikasi dua langkah", @@ -519,6 +539,7 @@ "social": "Sosial", "rateUsOnStore": "Beri nilai di {storeName}", "blog": "Blog", + "merchandise": "Barang Dagangan", "twitter": "Twitter", "mastodon": "Mastodon", "matrix": "Matrix", @@ -549,6 +570,7 @@ "renewsOn": "Langganan akan diperpanjang pada {endDate}", "freeTrialValidTill": "Percobaan gratis berlaku hingga {endDate}", "validTill": "Berlaku hingga {endDate}", + "addOnValidTill": "Add-on {storageAmount} kamu berlaku sampai {endDate}", "playStoreFreeTrialValidTill": "Percobaan gratis berlaku hingga {endDate}.\nKamu dapat memilih paket berbayar setelahnya.", "subWillBeCancelledOn": "Langganan kamu akan dibatalkan pada {endDate}", "subscription": "Langganan", @@ -576,18 +598,46 @@ }, "confirmPlanChange": "Konfirmasi perubahan paket", "areYouSureYouWantToChangeYourPlan": "Apakah kamu yakin ingin mengubah paket kamu?", + "youCannotDowngradeToThisPlan": "Anda tidak dapat turun ke paket ini", + "cancelOtherSubscription": "Harap batalkan langganan kamu dari {paymentProvider} terlebih dahulu", + "@cancelOtherSubscription": { + "description": "The text to display when the user has an existing subscription from a different payment provider", + "type": "text", + "placeholders": { + "paymentProvider": { + "example": "Apple", + "type": "String" + } + } + }, "optionalAsShortAsYouLike": "Opsional, pendek pun tak apa...", "send": "Kirim", "askCancelReason": "Langganan kamu telah dibatalkan. Apakah kamu ingin membagikan alasannya?", "thankYouForSubscribing": "Terima kasih telah berlangganan!", "yourPurchaseWasSuccessful": "Pembelianmu berhasil", + "yourPlanWasSuccessfullyUpgraded": "Paket kamu berhasil ditingkatkan", + "yourPlanWasSuccessfullyDowngraded": "Paket kamu berhasil di turunkan", "yourSubscriptionWasUpdatedSuccessfully": "Langgananmu telah berhasil diperbarui", "googlePlayId": "ID Google Play", "appleId": "ID Apple", + "playstoreSubscription": "Langganan PlayStore", + "appstoreSubscription": "Langganan AppStore", "subAlreadyLinkedErrMessage": "{id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan {id} kamu untuk akun ini, silahkan hubungi tim bantuan kami", "visitWebToManage": "Silakan buka web.ente.io untuk mengatur langgananmu", + "couldNotUpdateSubscription": "Tidak dapat memperbarui langganan", "pleaseContactSupportAndWeWillBeHappyToHelp": "Silakan hubungi support@ente.io dan kami akan dengan senang hati membantu!", "paymentFailed": "Pembayaran gagal", + "paymentFailedTalkToProvider": "Harap hubungi dukungan {providerName} jika kamu dikenai biaya", + "@paymentFailedTalkToProvider": { + "description": "The text to display when the payment failed", + "type": "text", + "placeholders": { + "providerName": { + "example": "AppStore|PlayStore", + "type": "String" + } + } + }, "continueOnFreeTrial": "Lanjut dengan percobaan gratis", "areYouSureYouWantToExit": "Apakah kamu yakin ingin keluar?", "thankYou": "Terima kasih", @@ -601,8 +651,10 @@ "leave": "Tinggalkan", "rateTheApp": "Nilai app ini", "startBackup": "Mulai pencadangan", + "noPhotosAreBeingBackedUpRightNow": "Tidak ada foto yang sedang dicadangkan sekarang", "grantFullAccessPrompt": "Harap berikan akses ke semua foto di app Pengaturan", "openSettings": "Buka Pengaturan", + "selectMorePhotos": "Pilih lebih banyak foto", "existingUser": "Masuk", "privateBackups": "Cadangan pribadi", "forYourMemories": "untuk kenanganmu", @@ -614,6 +666,7 @@ "everywhere": "di mana saja", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Seluler, Web, Desktop", + "newToEnte": "Baru di Ente", "pleaseLoginAgain": "Silakan masuk akun lagi", "autoLogoutMessage": "Akibat kesalahan teknis, kamu telah keluar dari akunmu. Kami mohon maaf atas ketidaknyamanannya.", "yourSubscriptionHasExpired": "Langgananmu telah berakhir", @@ -848,6 +901,9 @@ "networkHostLookUpErr": "Tidak dapat terhubung dengan Ente, harap periksa pengaturan jaringan kamu dan hubungi dukungan jika masalah berlanjut.", "networkConnectionRefusedErr": "Tidak dapat terhubung dengan Ente, silakan coba lagi setelah beberapa saat. Jika masalah berlanjut, harap hubungi dukungan.", "cachedData": "Data cache", + "remoteThumbnails": "Thumbnail jarak jauh", + "pendingSync": "Sinkronisasi yang tertunda", + "localGallery": "Galeri lokal", "todaysLogs": "Log hari ini", "viewLogs": "Lihat log", "preparingLogs": "Menyiapkan log...", diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index ac66ecca17..37ac274bda 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Ci dispiace vederti andare via. Facci sapere se hai bisogno di aiuto o se vuoi aiutarci a migliorare.", "feedback": "Suggerimenti", "kindlyHelpUsWithThisInformation": "Aiutaci con queste informazioni", - "confirmDeletePrompt": "Sì, voglio eliminare definitivamente questo account e tutti i suoi dati.", + "confirmDeletePrompt": "Sì, voglio eliminare definitivamente questo account e i dati associati a esso su tutte le applicazioni.", "confirmAccountDeletion": "Conferma eliminazione account", "deleteAccountPermanentlyButton": "Cancella definitivamente il tuo account", "yourAccountHasBeenDeleted": "Il tuo account è stato eliminato", @@ -24,6 +24,7 @@ "sendEmail": "Invia email", "deleteRequestSLAText": "La tua richiesta verrà elaborata entro 72 ore.", "deleteEmailRequest": "Invia un'email a account-deletion@ente.io dal tuo indirizzo email registrato.", + "entePhotosPerm": "Ente necessita del permesso per preservare le tue foto", "ok": "Ok", "createAccount": "Crea account", "createNewAccount": "Crea un nuovo account", @@ -225,14 +226,17 @@ }, "description": "Number of participants in an album, including the album owner." }, + "collabLinkSectionDescription": "Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un'applicazione o di un account Ente. Ottimo per raccogliere foto di un evento.", "collectPhotos": "Raccogli le foto", "collaborativeLink": "Link collaborativo", + "shareWithNonenteUsers": "Condividi con utenti che non hanno un account Ente", "createPublicLink": "Crea link pubblico", "sendLink": "Invia link", "copyLink": "Copia link", "linkHasExpired": "Il link è scaduto", "publicLinkEnabled": "Link pubblico abilitato", "shareALink": "Condividi un link", + "sharedAlbumSectionDescription": "Crea album condivisi e collaborativi con altri utenti di Ente, inclusi gli utenti con piani gratuiti.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Condividi con persone specifiche} =1 {Condividi con una persona} other {Condividi con {numberOfPeople} persone}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -256,10 +260,12 @@ }, "verificationId": "ID di verifica", "verifyEmailID": "Verifica {email}", + "emailNoEnteAccount": "{email} non ha un account Ente.\n\nInvia un invito per condividere foto.", "shareMyVerificationID": "Ecco il mio ID di verifica: {verificationID} per ente.io.", "shareTextConfirmOthersVerificationID": "Hey, puoi confermare che questo è il tuo ID di verifica: {verificationID} su ente.io", "somethingWentWrong": "Qualcosa è andato storto", "sendInvite": "Invita", + "shareTextRecommendUsingEnte": "Scarica Ente in modo da poter facilmente condividere foto e video in qualità originale\n\nhttps://ente.io", "done": "Completato", "applyCodeTitle": "Applica codice", "enterCodeDescription": "Inserisci il codice fornito dal tuo amico per richiedere spazio gratuito per entrambi", @@ -267,6 +273,11 @@ "failedToApplyCode": "Impossibile applicare il codice", "enterReferralCode": "Inserisci il codice di invito", "codeAppliedPageTitle": "Codice applicato", + "changeYourReferralCode": "Cambia il tuo codice invito", + "change": "Cambia", + "unavailableReferralCode": "Siamo spiacenti, questo codice non è disponibile.", + "codeChangeLimitReached": "Siamo spiacenti, hai raggiunto il limite di modifiche del codice.", + "onlyFamilyAdminCanChangeCode": "Per favore contatta {familyAdminEmail} per cambiare il tuo codice.", "storageInGB": "{storageAmountInGB} GB", "claimed": "Riscattato", "@claimed": { @@ -276,6 +287,7 @@ "claimMore": "Richiedine di più!", "theyAlsoGetXGb": "Anche loro riceveranno {storageAmountInGB} GB", "freeStorageOnReferralSuccess": "{storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice", + "shareTextReferralCode": "Codice invito Ente: {referralCode} \n\nInseriscilo in Impostazioni → Generali → Inviti per ottenere {referralStorageInGB} GB gratis dopo la sottoscrizione a un piano a pagamento\n\nhttps://ente.io", "claimFreeStorage": "Richiedi spazio gratuito", "inviteYourFriends": "Invita i tuoi amici", "failedToFetchReferralDetails": "Impossibile recuperare i dettagli. Per favore, riprova più tardi.", @@ -298,6 +310,7 @@ } }, "faq": "FAQ", + "help": "Aiuto", "oopsSomethingWentWrong": "Oops! Qualcosa è andato storto", "peopleUsingYourCode": "Persone che hanno usato il tuo codice", "eligible": "idoneo", @@ -327,6 +340,7 @@ "removeParticipantBody": "{userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall'utente verrà rimossa dall'album", "keepPhotos": "Mantieni foto", "deletePhotos": "Elimina foto", + "inviteToEnte": "Invita su Ente", "removePublicLink": "Rimuovi link pubblico", "disableLinkMessage": "Questo rimuoverà il link pubblico per accedere a \"{albumName}\".", "sharing": "Condivisione in corso...", @@ -342,7 +356,10 @@ "videoSmallCase": "video", "photoSmallCase": "foto", "singleFileDeleteHighlight": "Verrà eliminato da tutti gli album.", + "singleFileInBothLocalAndRemote": "Questo {fileType} è sia su Ente che sul tuo dispositivo.", + "singleFileInRemoteOnly": "Questo {fileType} verrà eliminato da Ente.", "singleFileDeleteFromDevice": "Questo {fileType} verrà eliminato dal tuo dispositivo.", + "deleteFromEnte": "Elimina da Ente", "yesDelete": "Sì, elimina", "movedToTrash": "Spostato nel cestino", "deleteFromDevice": "Elimina dal dispositivo", @@ -396,6 +413,10 @@ }, "photoGridSize": "Dimensione griglia foto", "manageDeviceStorage": "Gestisci memoria dispositivo", + "mlConsentDescription": "Se abiliti il Machine Learning, Ente estrarrà informazioni come la geometria del volto dai file, inclusi quelli condivisi con te.\n\nQuesto accadrà sul tuo dispositivo, e qualsiasi informazione biometrica generata sarà crittografata end-to-end.", + "mlConsentPrivacy": "Clicca qui per maggiori dettagli su questa funzione nella nostra informativa sulla privacy", + "mlIndexingDescription": "Si prega di notare che l'attivazione dell'apprendimento automatico si tradurrà in un maggior utilizzo della connessione e della batteria fino a quando tutti gli elementi non saranno indicizzati. Valuta di utilizzare l'applicazione desktop per un'indicizzazione più veloce, tutti i risultati verranno sincronizzati automaticamente.", + "loadingModel": "Scaricamento modelli...", "waitingForWifi": "In attesa del WiFi...", "status": "Stato", "indexedItems": "Elementi indicizzati", @@ -430,11 +451,13 @@ "backupOverMobileData": "Backup su dati mobili", "backupVideos": "Backup dei video", "disableAutoLock": "Disabilita blocco automatico", + "deviceLockExplanation": "Disabilita il blocco schermo del dispositivo quando Ente è in primo piano e c'è un backup in corso. Questo normalmente non è necessario ma può aiutare a completare più velocemente grossi caricamenti e l'importazione iniziale di grandi librerie.", "about": "Info", "weAreOpenSource": "Siamo open source!", "privacy": "Privacy", "terms": "Termini d'uso", "checkForUpdates": "Controlla aggiornamenti", + "checkStatus": "Verifica stato", "checking": "Controllo in corso...", "youAreOnTheLatestVersion": "Stai utilizzando l'ultima versione", "account": "Account", @@ -449,6 +472,7 @@ "authToInitiateAccountDeletion": "Autenticati per avviare l'eliminazione dell'account", "areYouSureYouWantToLogout": "Sei sicuro di volerti disconnettere?", "yesLogout": "Sì, disconnetti", + "aNewVersionOfEnteIsAvailable": "Una nuova versione di Ente è disponibile.", "update": "Aggiorna", "installManually": "Installa manualmente", "criticalUpdateAvailable": "Un aggiornamento importante è disponibile", @@ -461,9 +485,13 @@ "backedUpFolders": "Cartelle salvate", "backup": "Backup", "freeUpDeviceSpace": "Libera spazio", + "freeUpDeviceSpaceDesc": "Risparmia spazio sul tuo dispositivo cancellando i file che sono già stati salvati online.", "allClear": "✨ Tutto pulito", "noDeviceThatCanBeDeleted": "Non hai file su questo dispositivo che possono essere eliminati", "removeDuplicates": "Rimuovi i doppioni", + "removeDuplicatesDesc": "Verifica e rimuovi i file che sono esattamente duplicati.", + "viewLargeFiles": "File di grandi dimensioni", + "viewLargeFilesDesc": "Visualizza i file che stanno occupando la maggior parte dello spazio di archiviazione.", "noDuplicates": "✨ Nessun doppione", "youveNoDuplicateFilesThatCanBeCleared": "Non hai file duplicati che possono essere cancellati", "success": "Operazione riuscita", @@ -536,6 +564,7 @@ "systemTheme": "Sistema", "freeTrial": "Prova gratuita", "selectYourPlan": "Seleziona un piano", + "enteSubscriptionPitch": "Ente conserva i tuoi ricordi in modo che siano sempre a disposizione, anche se perdi il tuo dispositivo.", "enteSubscriptionShareWithFamily": "Aggiungi la tua famiglia al tuo piano.", "currentUsageIs": "Spazio attualmente utilizzato ", "@currentUsageIs": { @@ -549,6 +578,8 @@ "renewsOn": "Si rinnova il {endDate}", "freeTrialValidTill": "La prova gratuita termina il {endDate}", "validTill": "Valido fino al {endDate}", + "addOnValidTill": "Il tuo spazio aggiuntivo di {storageAmount} è valido fino al {endDate}", + "playStoreFreeTrialValidTill": "Prova gratuita valida fino al {endDate}.\nIn seguito potrai scegliere un piano a pagamento.", "subWillBeCancelledOn": "L'abbonamento verrà cancellato il {endDate}", "subscription": "Abbonamento", "paymentDetails": "Dettagli di Pagamento", @@ -599,6 +630,7 @@ "appleId": "Apple ID", "playstoreSubscription": "Abbonamento su PlayStore", "appstoreSubscription": "abbonamento AppStore", + "subAlreadyLinkedErrMessage": "Il tuo {id} è già collegato a un altro account Ente.\nSe desideri utilizzare il tuo {id} con questo account, per favore contatta il nostro supporto''", "visitWebToManage": "Visita web.ente.io per gestire il tuo abbonamento", "couldNotUpdateSubscription": "Impossibile aggiornare l'abbonamento", "pleaseContactSupportAndWeWillBeHappyToHelp": "Contatta support@ente.io e saremo felici di aiutarti!", @@ -619,6 +651,7 @@ "thankYou": "Grazie", "failedToVerifyPaymentStatus": "Impossibile verificare lo stato del pagamento", "pleaseWaitForSometimeBeforeRetrying": "Riprova tra qualche minuto", + "paymentFailedMessage": "Purtroppo il tuo pagamento non è riuscito. Contatta l'assistenza e ti aiuteremo!", "youAreOnAFamilyPlan": "Sei un utente con piano famiglia!", "contactFamilyAdmin": "Contatta {familyAdminEmail} per gestire il tuo abbonamento", "leaveFamily": "Abbandona il piano famiglia", @@ -642,7 +675,9 @@ "everywhere": "ovunque", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Mobile, Web, Desktop", + "newToEnte": "Prima volta con Ente", "pleaseLoginAgain": "Effettua nuovamente l'accesso", + "autoLogoutMessage": "A causa di problemi tecnici, sei stato disconnesso. Ci scusiamo per l'inconveniente.", "yourSubscriptionHasExpired": "Il tuo abbonamento è scaduto", "storageLimitExceeded": "Limite d'archiviazione superato", "upgrade": "Acquista altro spazio", @@ -653,10 +688,12 @@ }, "backupFailed": "Backup fallito", "couldNotBackUpTryLater": "Impossibile eseguire il backup dei tuoi dati.\nRiproveremo più tardi.", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente può criptare e conservare i file solo se gliene concedi l'accesso", "pleaseGrantPermissions": "Concedi i permessi", "grantPermission": "Concedi il permesso", "privateSharing": "Condivisioni private", "shareOnlyWithThePeopleYouWant": "Condividi solo con le persone che vuoi", + "usePublicLinksForPeopleNotOnEnte": "Usa link pubblici per persone non registrate su Ente", "allowPeopleToAddPhotos": "Permetti alle persone di aggiungere foto", "shareAnAlbumNow": "Condividi un album", "collectEventPhotos": "Raccogli le foto di un evento", @@ -679,6 +716,21 @@ "deleteEmptyAlbumsWithQuestionMark": "Eliminare gli album vuoti?", "deleteAlbumsDialogBody": "Questo eliminerà tutti gli album vuoti. È utile quando si desidera ridurre l'ingombro nella lista degli album.", "deleteProgress": "Eliminazione di {currentlyDeleting} / {totalCount}", + "genericProgress": "Elaborazione {currentlyProcessing} / {totalCount}", + "@genericProgress": { + "description": "Generic progress text to display when processing multiple items", + "type": "text", + "placeholders": { + "currentlyProcessing": { + "example": "1", + "type": "int" + }, + "totalCount": { + "example": "10", + "type": "int" + } + } + }, "permanentlyDelete": "Elimina definitivamente", "canOnlyCreateLinkForFilesOwnedByYou": "Puoi creare solo link per i file di tua proprietà", "publicLinkCreated": "Link pubblico creato", @@ -693,11 +745,13 @@ "unhide": "Mostra", "unarchive": "Rimuovi dall'archivio", "favorite": "Preferito", + "removeFromFavorite": "Rimuovi dai preferiti", "shareLink": "Condividi link", "createCollage": "Crea un collage", "saveCollage": "Salva il collage", "collageSaved": "Collage salvato nella galleria", "collageLayout": "Disposizione", + "addToEnte": "Aggiungi a Ente", "addToAlbum": "Aggiungi all'album", "delete": "Cancella", "hide": "Nascondi", @@ -762,7 +816,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Le foto aggiunte da te verranno rimosse dall'album", "youveNoFilesInThisAlbumThatCanBeDeleted": "Non hai file in questo album che possono essere eliminati", "youDontHaveAnyArchivedItems": "Non hai nulla di archiviato.", + "ignoredFolderUploadReason": "Alcuni file in questo album vengono ignorati dal caricamento perché erano stati precedentemente eliminati da Ente.", "resetIgnoredFiles": "Ripristina i file ignorati", + "deviceFilesAutoUploading": "I file aggiunti a questo album del dispositivo verranno automaticamente caricati su Ente.", + "turnOnBackupForAutoUpload": "Attiva il backup per caricare automaticamente i file aggiunti a questa cartella del dispositivo su Ente.", "noHiddenPhotosOrVideos": "Nessuna foto o video nascosti", "toHideAPhotoOrVideo": "Per nascondere una foto o un video", "openTheItem": "• Apri la foto o il video", @@ -788,6 +845,7 @@ "close": "Chiudi", "setAs": "Imposta come", "fileSavedToGallery": "File salvato nella galleria", + "filesSavedToGallery": "File salvati nella galleria", "fileFailedToSaveToGallery": "Impossibile salvare il file nella galleria", "download": "Scarica", "pressAndHoldToPlayVideo": "Tieni premuto per riprodurre il video", @@ -890,6 +948,7 @@ "renameFile": "Rinomina file", "enterFileName": "Inserisci un nome per il file", "filesDeleted": "File eliminati", + "selectedFilesAreNotOnEnte": "I file selezionati non sono su Ente", "thisActionCannotBeUndone": "Questa azione non può essere annullata", "emptyTrash": "Vuoi svuotare il cestino?", "permDeleteWarning": "Tutti gli elementi nel cestino verranno eliminati definitivamente\n\nQuesta azione non può essere annullata", @@ -898,6 +957,7 @@ "permanentlyDeleteFromDevice": "Eliminare definitivamente dal dispositivo?", "someOfTheFilesYouAreTryingToDeleteAre": "Alcuni dei file che si sta tentando di eliminare sono disponibili solo sul dispositivo e non possono essere recuperati se cancellati", "theyWillBeDeletedFromAllAlbums": "Verranno eliminati da tutti gli album.", + "someItemsAreInBothEnteAndYourDevice": "Alcuni elementi sono sia su Ente che sul tuo dispositivo.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino.", "theseItemsWillBeDeletedFromYourDevice": "Questi file verranno eliminati dal tuo dispositivo.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Sembra che qualcosa sia andato storto. Riprova tra un po'. Se l'errore persiste, contatta il nostro team di supporto.", @@ -933,11 +993,17 @@ "loadMessage7": "Le nostre app per smartphone vengono eseguite in background per crittografare e eseguire il backup di qualsiasi nuova foto o video", "loadMessage8": "web.ente.io ha un uploader intuitivo", "loadMessage9": "Usiamo Xchacha20Poly1305 per crittografare in modo sicuro i tuoi dati", + "photoDescriptions": "Descrizioni delle foto", + "fileTypesAndNames": "Tipi e nomi di file", "location": "Luogo", + "moments": "Momenti", + "searchFaceEmptySection": "Le persone saranno mostrate qui una volta completata l'indicizzazione", "searchDatesEmptySection": "Ricerca per data, mese o anno", "searchLocationEmptySection": "Raggruppa foto scattate entro un certo raggio da una foto", "searchPeopleEmptySection": "Invita persone e vedrai qui tutte le foto condivise da loro", "searchAlbumsEmptySection": "Album", + "searchFileTypesAndNamesEmptySection": "Tipi e nomi di file", + "searchCaptionEmptySection": "Aggiungi descrizioni come \"#viaggio\" nelle informazioni delle foto per trovarle rapidamente qui", "language": "Lingua", "selectLanguage": "Seleziona una lingua", "locationName": "Nome della località", @@ -986,6 +1052,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, + "availableStorageSpace": "{freeAmount} {storageUnit} liberi", "appVersion": "Versione: {versionValue}", "verifyIDLabel": "Verifica", "fileInfoAddDescHint": "Aggiungi descrizione...", @@ -996,6 +1063,7 @@ }, "setRadius": "Imposta raggio", "familyPlanPortalTitle": "Famiglia", + "familyPlanOverview": "Aggiungi 5 membri della famiglia al tuo piano esistente senza pagare extra.\n\nOgni membro ottiene il proprio spazio privato e non può vedere i file dell'altro a meno che non siano condivisi.\n\nI piani familiari sono disponibili per i clienti che hanno un abbonamento Ente a pagamento.\n\nIscriviti ora per iniziare!", "androidBiometricHint": "Verifica l'identità", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1073,21 +1141,43 @@ "noAlbumsSharedByYouYet": "Ancora nessun album condiviso da te", "sharedWithYou": "Condivise con te", "sharedByYou": "Condivise da te", + "inviteYourFriendsToEnte": "Invita i tuoi amici a Ente", "failedToDownloadVideo": "Download del video non riuscito", "hiding": "Nascondendo...", "unhiding": "Rimuovendo dal nascondiglio...", "successfullyHid": "Nascosta con successo", "successfullyUnhid": "Rimossa dal nascondiglio con successo", "crashReporting": "Segnalazione di crash", + "resumableUploads": "Caricamenti riattivabili", "addToHiddenAlbum": "Aggiungi ad album nascosto", "moveToHiddenAlbum": "Sposta in album nascosto", + "fileTypes": "Tipi di file", "hearUsWhereTitle": "Come hai sentito parlare di Ente? (opzionale)", "hearUsExplanation": "Non teniamo traccia del numero di installazioni dell'app. Sarebbe utile se ci dicesse dove ci ha trovato!", "viewAddOnButton": "Visualizza componenti aggiuntivi", "addOns": "Componenti aggiuntivi", "addOnPageSubtitle": "Dettagli dei componenti aggiuntivi", + "yourMap": "La tua mappa", + "modifyYourQueryOrTrySearchingFor": "Modifica la tua interrogazione o prova a cercare", + "blackFridaySale": "Offerta del Black Friday", + "photos": "Foto", + "videos": "Video", "searchHint3": "Album, nomi di file e tipi", "searchHint4": "Luogo", + "addYourPhotosNow": "Aggiungi le tue foto ora", + "searchResultCount": "{count, plural, one{{count} risultato trovato} other{{count} risultati trovati}}", + "@searchResultCount": { + "description": "Text to tell user how many results were found for their search query", + "placeholders": { + "count": { + "example": "1|2|3", + "type": "int" + } + } + }, + "faces": "Volti", + "people": "Persone", + "contents": "Contenuti", "addNew": "Aggiungi nuovo", "@addNew": { "description": "Text to add a new item (location tag, album, caption etc)" @@ -1103,5 +1193,28 @@ "selectALocation": "Seleziona un luogo", "selectALocationFirst": "Scegli prima una posizione", "changeLocationOfSelectedItems": "Cambiare la posizione degli elementi selezionati?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Le modifiche alla posizione saranno visibili solo all'interno di Ente" + "editsToLocationWillOnlyBeSeenWithinEnte": "Le modifiche alla posizione saranno visibili solo all'interno di Ente", + "waitingForVerification": "In attesa di verifica...", + "passkey": "Passkey", + "passkeyAuthTitle": "Verifica della passkey", + "passKeyPendingVerification": "La verifica è ancora in corso", + "loginSessionExpired": "Sessione scaduta", + "loginSessionExpiredDetails": "La sessione è scaduta. Si prega di accedere nuovamente.", + "verifyPasskey": "Verifica passkey", + "playOnTv": "Riproduci album sulla TV", + "pair": "Abbina", + "deviceNotFound": "Dispositivo non trovato", + "castInstruction": "Visita cast.ente.io sul dispositivo che vuoi abbinare.\n\nInserisci il codice qui sotto per riprodurre l'album sulla tua TV.", + "deviceCodeHint": "Inserisci il codice", + "joinDiscord": "Unisciti a Discord", + "locations": "Luoghi", + "descriptions": "Descrizioni", + "addAName": "Aggiungi un nome", + "findPeopleByName": "Trova rapidamente le persone per nome", + "addViewers": "{count, plural, zero {Aggiungi visualizzatore} one {Aggiungi visualizzatore} other {Aggiungi visualizzatori}}", + "addCollaborators": "{count, plural, zero {Aggiungi collaboratore} one {Aggiungi collaboratore} other {Aggiungi collaboratori}}", + "developerSettings": "Impostazioni sviluppatore", + "serverEndpoint": "Endpoint del server", + "invalidEndpoint": "Endpoint invalido", + "invalidEndpointMessage": "Spiacenti, l'endpoint inserito non è valido. Inserisci un endpoint valido e riprova." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index 62dc45e844..92a66a3401 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "We vinden het jammer je te zien gaan. Deel je feedback om ons te helpen verbeteren.", "feedback": "Feedback", "kindlyHelpUsWithThisInformation": "Help ons alsjeblieft met deze informatie", - "confirmDeletePrompt": "Ja, ik wil permanent mijn account inclusief alle gegevens verwijderen.", + "confirmDeletePrompt": "Ja, ik wil mijn account en de bijbehorende gegevens verspreid over alle apps permanent verwijderen.", "confirmAccountDeletion": "Account verwijderen bevestigen", "deleteAccountPermanentlyButton": "Account permanent verwijderen", "yourAccountHasBeenDeleted": "Je account is verwijderd", @@ -453,6 +453,8 @@ "showMemories": "Toon herinneringen", "yearsAgo": "{count, plural, one{{count} jaar geleden} other{{count} jaar geleden}}", "backupSettings": "Back-up instellingen", + "backupStatus": "Back-upstatus", + "backupStatusDescription": "Items die zijn geback-upt, worden hier getoond", "backupOverMobileData": "Back-up maken via mobiele data", "backupVideos": "Back-up video's", "disableAutoLock": "Automatisch vergrendelen uitschakelen", @@ -496,6 +498,7 @@ "removeDuplicates": "Duplicaten verwijderen", "removeDuplicatesDesc": "Controleer en verwijder bestanden die exacte kopieën zijn.", "viewLargeFiles": "Grote bestanden", + "viewLargeFilesDesc": "Bekijk bestanden die de meeste opslagruimte verbruiken.", "noDuplicates": "✨ Geen duplicaten", "youveNoDuplicateFilesThatCanBeCleared": "Je hebt geen dubbele bestanden die kunnen worden gewist", "success": "Succes", @@ -1313,5 +1316,6 @@ "cl_video_player_title": "Videospeler", "cl_video_player_description": "Een verfrissende nieuwe videospeler, met betere afspeelknoppen en ondersteuning voor HDR-video's.", "appLockDescriptions": "Kies tussen het standaard vergrendelscherm van uw apparaat en een aangepast vergrendelscherm met een pincode of wachtwoord.", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen." + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", + "authToViewPasskey": "Verifieer uzelf om uw toegangssleutel te bekijken" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 9bf690cd30..1319dca79c 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "Vi er lei oss for at du forlater oss. Gi oss gjerne en tilbakemelding så vi kan forbedre oss.", "feedback": "Tilbakemelding", "kindlyHelpUsWithThisInformation": "Vær vennlig og hjelp oss med denne informasjonen", - "confirmDeletePrompt": "Ja, jeg ønsker å slette denne kontoen og all dataen dens permanent.", "confirmAccountDeletion": "Bekreft sletting av konto", "deleteAccountPermanentlyButton": "Slett bruker for altid", "yourAccountHasBeenDeleted": "Brukeren din har blitt slettet", diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 7be752f684..bbbaddce95 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Przykro nam, że odchodzisz. Wyjaśnij nam, dlaczego nas opuszczasz, aby pomóc ulepszać nasze usługi.", "feedback": "Opinia", "kindlyHelpUsWithThisInformation": "Pomóż nam z tą informacją", - "confirmDeletePrompt": "Tak, chcę trwale usunąć konto i wszystkie dane z nim powiązane.", + "confirmDeletePrompt": "Tak, chcę trwale usunąć to konto i jego dane ze wszystkich aplikacji.", "confirmAccountDeletion": "Potwierdź usunięcie konta", "deleteAccountPermanentlyButton": "Usuń konto na stałe", "yourAccountHasBeenDeleted": "Twoje konto zostało usunięte", @@ -453,6 +453,8 @@ "showMemories": "Pokaż wspomnienia", "yearsAgo": "{count, plural, one{{count} rok temu} few {{count} lata temu} many {{count} lat temu} other{{count} lata temu}}", "backupSettings": "Ustawienia kopii zapasowej", + "backupStatus": "Status kopii zapasowej", + "backupStatusDescription": "Elementy, których kopia zapasowa została utworzona, zostaną wyświetlone w tym miejscu", "backupOverMobileData": "Kopia zapasowa przez dane mobilne", "backupVideos": "Utwórz kopię zapasową wideo", "disableAutoLock": "Wyłącz automatyczną blokadę", diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 0ca1ce69cd..630f8f63fa 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Lamentamos ver você partir. Por favor, compartilhe seus comentários para nos ajudar a melhorar.", "feedback": "Comentários", "kindlyHelpUsWithThisInformation": "Ajude-nos com esta informação", - "confirmDeletePrompt": "Sim, desejo excluir permanentemente esta conta e todos os seus dados.", + "confirmDeletePrompt": "Sim, eu quero excluir permanentemente esta conta e seus dados em todos os aplicativos.", "confirmAccountDeletion": "Confirmar exclusão da conta", "deleteAccountPermanentlyButton": "Excluir conta permanentemente", "yourAccountHasBeenDeleted": "Sua conta foi excluída", @@ -453,6 +453,8 @@ "showMemories": "Mostrar memórias", "yearsAgo": "{count, plural, one{{count} anos atrás} other{{count} anos atrás}}", "backupSettings": "Configurações de backup", + "backupStatus": "Status do Backup", + "backupStatusDescription": "Os itens que foram salvos no backup aparecerão aqui", "backupOverMobileData": "Backup usando dados móveis", "backupVideos": "Backup de vídeos", "disableAutoLock": "Desativar bloqueio automático", diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index 2bf2d4efc1..d646ec6803 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Мы сожалеем, что вы уходите. Пожалуйста, объясните, почему вы уходите, чтобы помочь нам развиваться.", "feedback": "Отзыв", "kindlyHelpUsWithThisInformation": "Пожалуйста, помогите нам с этой информацией", - "confirmDeletePrompt": "Да, я хочу навсегда удалить эту учётную запись и все её данные.", + "confirmDeletePrompt": "Да, я хочу навсегда удалить эту учётную запись и все её данные во всех приложениях Ente.", "confirmAccountDeletion": "Подтвердить удаление учётной записи", "deleteAccountPermanentlyButton": "Удалить аккаунт навсегда", "yourAccountHasBeenDeleted": "Ваша учетная запись была удалена", @@ -128,7 +128,7 @@ } } }, - "twofactorSetup": "Установка двуфакторной аутентификации", + "twofactorSetup": "Вход с 2FA", "enterCode": "Введите код", "scanCode": "Сканировать код", "codeCopiedToClipboard": "Код скопирован в буфер обмена", @@ -275,6 +275,7 @@ "codeAppliedPageTitle": "Код применён", "changeYourReferralCode": "Изменить ваш реферальный код", "change": "Изменить", + "unavailableReferralCode": "Извините, такого кода не существует.", "storageInGB": "{storageAmountInGB} Гигабайт", "claimed": "Получено", "@claimed": { @@ -306,8 +307,8 @@ } } }, - "faq": "ЧаВо", - "help": "помощь", + "faq": "Ответы на ваши вопросы", + "help": "Помощь", "oopsSomethingWentWrong": "Ой! Что-то пошло не так", "peopleUsingYourCode": "Люди использующие ваш код", "eligible": "подходящий", @@ -411,7 +412,13 @@ "photoGridSize": "Размер сетки фотографий", "manageDeviceStorage": "Управление хранилищем устройства", "machineLearning": "Machine learning", + "mlConsent": "Включить машинное обучение", + "mlConsentTitle": "Включить машинное обучение?", + "mlConsentDescription": "Если вы включите машинное обучение, Ente будет извлекать информацию из файлов (например, геометрию лица), включая те, которыми с вами поделились.\n\nЭто будет происходить на вашем устройстве, и любая сгенерированная биометрическая информация будет зашифрована с использованием сквозного (End-to-End) шифрования между вашим устройством и сервером.", + "mlConsentPrivacy": "Пожалуйста, нажмите здесь, чтобы узнать больше об этой функции в нашей политике конфиденциальности", + "mlConsentConfirmation": "Я понимаю и хочу включить машинное обучение", "magicSearch": "Волшебный поиск", + "mlIndexingDescription": "Обратите внимание, что машинное обучение приведёт к повышенному потреблению трафика и батареи, пока все элементы не будут проиндексированы. Рекомендуем использовать ПК версию для более быстрого индексирования. Полученные результаты будут синхронизированы автоматически между устройствами.", "loadingModel": "Загрузка моделей...", "waitingForWifi": "Ожидание WiFi...", "status": "Статус", @@ -443,7 +450,7 @@ }, "showMemories": "Показать воспоминания", "yearsAgo": "{count, plural, one{{count} год назад} other{{count} лет назад}}", - "backupSettings": "Резервная копия настроек", + "backupSettings": "Настройки резервного копирования", "backupOverMobileData": "Резервное копирование через мобильную сеть", "backupVideos": "Резервное копирование видео", "disableAutoLock": "Отключить автоблокировку", @@ -461,8 +468,8 @@ "authToChangeYourEmail": "Пожалуйста, авторизуйтесь, чтобы изменить адрес электронной почты", "changePassword": "Изменить пароль", "authToChangeYourPassword": "Пожалуйста, авторизуйтесь, чтобы изменить пароль", - "emailVerificationToggle": "Подтверждение электронной почты", - "authToChangeEmailVerificationSetting": "Авторизуйтесь, чтобы изменить подтверждение электронной почты", + "emailVerificationToggle": "Вход с кодом на почту", + "authToChangeEmailVerificationSetting": "Пожалуйста, войдите, чтобы изменить настройку подтверждения электронной почты", "exportYourData": "Экспорт данных", "logout": "Выйти", "authToInitiateAccountDeletion": "Пожалуйста, авторизуйтесь, чтобы начать удаление аккаунта", @@ -1143,6 +1150,7 @@ "successfullyHid": "Успешно скрыто", "successfullyUnhid": "Успешно показано", "crashReporting": "Отчеты об ошибках", + "resumableUploads": "Поддержка дозагрузки файл(а/ов) при разрыве связи", "addToHiddenAlbum": "Добавить в скрытый альбом", "moveToHiddenAlbum": "Переместить в скрытый альбом", "fileTypes": "Типы файлов", @@ -1266,6 +1274,8 @@ "enable": "Включить", "enabled": "Включено", "moreDetails": "Подробнее", + "enableMLIndexingDesc": "Ente поддерживает машинное обучение на устройстве для распознавания лиц, умного поиска и других расширенных функций поиска", + "magicSearchHint": "Умный поиск позволяет искать фотографии по их содержимому, например, 'цветок', 'красная машина', 'паспорт', 'документы'", "panorama": "Панорама", "reenterPassword": "Подтвердите пароль", "reenterPin": "Введите PIN-код ещё раз", diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 3c51f175e0..bfb0e0291a 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "Vi är ledsna att se dig lämna oss. Vänligen dela dina synpunkter för att hjälpa oss att förbättra.", "feedback": "Feedback", "kindlyHelpUsWithThisInformation": "Vänligen hjälp oss med denna information", - "confirmDeletePrompt": "Ja, jag vill ta bort detta konto och all data permanent.", "confirmAccountDeletion": "Bekräfta radering av konto", "deleteAccountPermanentlyButton": "Radera kontot permanent", "yourAccountHasBeenDeleted": "Ditt konto har raderats", @@ -281,6 +280,7 @@ "description": "Used to indicate storage claimed, like 10GB Claimed" }, "inviteYourFriends": "Bjud in dina vänner", + "help": "Hjälp", "subscribe": "Prenumerera", "trash": "Papperskorg", "photoSmallCase": "foto", diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb new file mode 100644 index 0000000000..d3d26e203c --- /dev/null +++ b/mobile/lib/l10n/intl_ta.arb @@ -0,0 +1,19 @@ +{ + "@@locale ": "en", + "enterYourEmailAddress": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "accountWelcomeBack": "மீண்டும் வருக!", + "email": "மின்னஞ்சல்", + "cancel": "ரத்து செய்", + "verify": "சரிபார்க்கவும்", + "invalidEmailAddress": "தவறான மின்னஞ்சல் முகவரி", + "enterValidEmail": "சரியான மின்னஞ்சல் முகவரியை உள்ளிடவும்.", + "deleteAccount": "கணக்கை நீக்கு", + "askDeleteReason": "உங்கள் கணக்கை நீக்குவதற்கான முக்கிய காரணம் என்ன?", + "deleteAccountFeedbackPrompt": "நீங்கள் வெளியேறுவதை கண்டு வருந்துகிறோம். எங்களை மேம்படுத்த உதவ உங்கள் கருத்தைப் பகிரவும்.", + "feedback": "பின்னூட்டம்", + "kindlyHelpUsWithThisInformation": "இந்த தகவலுடன் தயவுசெய்து எங்களுக்கு உதவுங்கள்", + "confirmDeletePrompt": "ஆம், எல்லா செயலிகளிலும் இந்தக் கணக்கையும் அதன் தரவையும் நிரந்தரமாக நீக்க விரும்புகிறேன்.", + "confirmAccountDeletion": "கணக்கு நீக்குதலை உறுதிப்படுத்தவும்", + "deleteAccountPermanentlyButton": "கணக்கை நிரந்தரமாக நீக்கவும்", + "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index 9d6b4c0801..3cce924a17 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "เราเสียใจที่เห็นคุณไป โปรดแบ่งปันความคิดเห็นของคุณเพื่อช่วยให้เราปรับปรุง", "feedback": "ความคิดเห็น", "kindlyHelpUsWithThisInformation": "กรุณาช่วยเราด้วยข้อมูลนี้", - "confirmDeletePrompt": "ใช่ ฉันต้องการลบบัญชีนี้และข้อมูลที่เกี่ยวข้องทั้งหมดแบบถาวร", "confirmAccountDeletion": "ยืนยันการลบบัญชี", "deleteAccountPermanentlyButton": "ลบบัญชีถาวร", "yourAccountHasBeenDeleted": "บัญชีของคุณถูกลบแล้ว", diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index a51913a120..1e20822143 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -12,7 +12,6 @@ "deleteAccountFeedbackPrompt": "Aramızdan ayrıldığınız için üzgünüz. Lütfen kendimizi geliştirmemize yardımcı olun. Neden ayrıldığınızı Açıklar mısınız.", "feedback": "Geri Bildirim", "kindlyHelpUsWithThisInformation": "Lütfen bu bilgilerle bize yardımcı olun", - "confirmDeletePrompt": "Evet, bu hesabı ve tüm verileri kalıcı olarak silmek istiyorum.", "confirmAccountDeletion": "Hesap silme işlemini onayla", "deleteAccountPermanentlyButton": "Hesabımı kalıcı olarak sil", "yourAccountHasBeenDeleted": "Hesabınız silindi", diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index abb3a223ae..20912fdc44 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "我们很抱歉看到您离开。请分享您的反馈以帮助我们改进。", "feedback": "反馈", "kindlyHelpUsWithThisInformation": "请帮助我们了解这个信息", - "confirmDeletePrompt": "是的,我想永久删除此账户及其相关数据.", + "confirmDeletePrompt": "是的,我想永久删除此账户及其所有关联的应用程序的数据。", "confirmAccountDeletion": "确认删除账户", "deleteAccountPermanentlyButton": "永久删除账户", "yourAccountHasBeenDeleted": "您的账户已删除", @@ -453,6 +453,8 @@ "showMemories": "显示回忆", "yearsAgo": "{count, plural, one{{count} 年前} other{{count} 年前}}", "backupSettings": "备份设置", + "backupStatus": "备份状态", + "backupStatusDescription": "已备份的项目将显示在此处", "backupOverMobileData": "通过移动数据备份", "backupVideos": "备份视频", "disableAutoLock": "禁用自动锁定", From 743fc4aa41125842cdac9291bfb60165757e12ed Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 2 Sep 2024 01:17:03 +0000 Subject: [PATCH 0860/1179] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_bg.arb | 128 ++++++++++++++++++++++++++++++++++- auth/lib/l10n/arb/app_de.arb | 29 +++++++- auth/lib/l10n/arb/app_el.arb | 5 ++ auth/lib/l10n/arb/app_fr.arb | 13 ++-- auth/lib/l10n/arb/app_sv.arb | 22 +++++- auth/lib/l10n/arb/app_ta.arb | 1 + auth/lib/l10n/arb/app_vi.arb | 42 ++++++++++-- auth/lib/l10n/arb/app_zh.arb | 56 +++++++-------- 8 files changed, 256 insertions(+), 40 deletions(-) create mode 100644 auth/lib/l10n/arb/app_ta.arb diff --git a/auth/lib/l10n/arb/app_bg.arb b/auth/lib/l10n/arb/app_bg.arb index 12730e7933..85b0440407 100644 --- a/auth/lib/l10n/arb/app_bg.arb +++ b/auth/lib/l10n/arb/app_bg.arb @@ -67,7 +67,7 @@ "pleaseWait": "Моля изчакайте...", "generatingEncryptionKeysTitle": "Генерират се ключове за шифроване...", "recreatePassword": "Създайте отново парола", - "recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nВлезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).", + "recreatePasswordMessage": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, така че трябва да го генерираме отново веднъж по начин, който работи с всички устройства. \n\nМоля, влезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).", "useRecoveryKey": "Използвайте ключ за възстановяване", "incorrectPasswordTitle": "Грешна парола", "welcomeBack": "Добре дошли отново!", @@ -130,7 +130,61 @@ "faq_q_3": "Как мога да изтрия кодове?", "faq_a_3": "Можете да изтриете код, като плъзнете наляво върху него.", "faq_q_4": "Как мога да подкрепя този проект?", + "faq_a_4": "Можете да подкрепите развитието на този проект, като се абонирате за нашето приложение за снимки @ ente.io.", + "faq_q_5": "Как мога да активирам заключване чрез FaceID в Auth", + "faq_a_5": "Можете да активирате заключване чрез FaceID в Настройки → Сигурност → Заключен екран.", + "somethingWentWrongMessage": "Нещо се обърка, моля опитайте отново", + "leaveFamily": "Напуснете семейството", + "leaveFamilyMessage": "Сигурни ли сте, че искате да напуснете семейния план?", + "inFamilyPlanMessage": "Вие сте на семеен план!", + "swipeHint": "Плъзнете наляво, за да редактирате или премахнете кодове", "scan": "Сканиране", + "scanACode": "Скениране на код", + "verify": "Потвърждаване", + "verifyEmail": "Потвърдете имейла", + "enterCodeHint": "Въведете 6-цифрения код от\nВашето приложение за удостоверяване", + "lostDeviceTitle": "Загубено устройство?", + "twoFactorAuthTitle": "Двуфакторно удостоверяване", + "passkeyAuthTitle": "Удостоверяване с ключ за парола", + "verifyPasskey": "Потвърдете ключ за парола", + "recoverAccount": "Възстановяване на акаунт", + "enterRecoveryKeyHint": "Въведете Вашия ключ за възстановяване", + "recover": "Възстановяване", + "contactSupportViaEmailMessage": "Моля, изпратете имейл до {email} от Вашия регистриран имейл адрес", + "@contactSupportViaEmailMessage": { + "placeholders": { + "email": { + "type": "String" + } + } + }, + "invalidQRCode": "Невалиден QR код", + "noRecoveryKeyTitle": "Няма ключ за възстановяване?", + "enterEmailHint": "Въведете Вашият имейл адрес", + "invalidEmailTitle": "Невалиден имейл адрес", + "invalidEmailMessage": "Моля, въведете валиден имейл адрес.", + "deleteAccount": "Изтриване на акаунта", + "deleteAccountQuery": "Ще съжаляваме да си тръгнете. Изправени ли сте пред някакъв проблем?", + "yesSendFeedbackAction": "Да, изпращане на обратна връзка", + "noDeleteAccountAction": "Не, изтриване на акаунта", + "initiateAccountDeleteTitle": "Моля, удостоверете се, за да инициирате изтриването на акаунта", + "sendEmail": "Изпратете имейл", + "createNewAccount": "Създаване на нов акаунт", + "weakStrength": "Слаба", + "strongStrength": "Силна", + "moderateStrength": "Умерена", + "confirmPassword": "Потвърждаване на паролата", + "close": "Затваряне", + "oopsSomethingWentWrong": "Ами сега, нещо се обърка.", + "selectLanguage": "Изберете език", + "language": "Език", + "social": "Социални мрежи", + "security": "Сигурност", + "lockscreen": "Заключен екран", + "authToChangeLockscreenSetting": "Моля, удостоверете се, за да промените настройката за заключен екран", + "deviceLockEnablePreSteps": "За да активирате заключването на устройството, моля, задайте парола за устройството или заключване на екрана в системните настройки.", + "viewActiveSessions": "Вижте активните сесии", + "authToViewYourActiveSessions": "Моля, удостоверете се, за да видите Вашите активни сесии", "searchHint": "Търсене...", "search": "Търсене", "sorryUnableToGenCode": "За съжаление не може да се генерира код за {issuerName}", @@ -183,46 +237,118 @@ "insecureDevice": "Несигурно устройство", "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "За съжаление не можахме да генерираме защитени ключове на това устройство.\n\nМоля, регистрирайте се от друго устройство.", "howItWorks": "Как работи", + "ackPasswordLostWarning": "Разбирам, че ако загубя паролата си, може да загубя данните си, тъй като данните ми са шифровани от край до край.", + "loginTerms": "С натискането на вход, се съгласявам с условията за ползване и политиката за поверителност", + "logInLabel": "Вход", "logout": "Изход", "areYouSureYouWantToLogout": "Наистина ли искате да излезете от профила си?", "yesLogout": "Да, излез", "exit": "Изход", + "verifyingRecoveryKey": "Проверка на ключа за възстановяване...", + "recoveryKeyVerified": "Ключът за възстановяване е проверен", + "recoveryKeySuccessBody": "Страхотно! Вашият ключ за възстановяване е валиден. Благодарим Ви за проверката.\n\nМоля, не забравяйте да запазите безопасно архивирания си ключ за възстановяване.", + "invalidRecoveryKey": "Въведеният от Вас ключ за възстановяване не е валиден. Моля, уверете се, че съдържа 24 думи и проверете правописа на всяка.\n\nАко сте въвели по-стар код за възстановяване, уверете се, че е дълъг 64 знака и проверете всеки от тях.", + "recreatePasswordTitle": "Създайте отново парола", + "recreatePasswordBody": "Текущото устройство не е достатъчно мощно, за да потвърди паролата Ви, но можем да я регенерираме по начин, който работи с всички устройства.\n\nМоля, влезте с Вашия ключ за възстановяване и генерирайте отново паролата си (можете да използвате същата отново, ако желаете).", "invalidKey": "Невалиден ключ", "tryAgain": "Опитайте отново", + "viewRecoveryKey": "Вижте ключа за възстановяване", + "confirmRecoveryKey": "Потвърдете ключа за възстановяване", + "recoveryKeyVerifyReason": "Вашият ключ за възстановяване е единственият начин да възстановите Вашите снимки, ако забравите паролата си. Можете да намерите своя ключ за възстановяване в Настройки > Акаунт.\n\nМоля, въведете Вашия ключ за възстановяване тук, за да проверите дали сте го запазили правилно.", + "confirmYourRecoveryKey": "Потвърдете Вашия ключ за възстановяване", "confirm": "Потвърждаване", + "emailYourLogs": "Изпратете Вашата история на действията на имейл", + "pleaseSendTheLogsTo": "Моля, изпратете историята на действията на \n{toEmail}", + "copyEmailAddress": "Копиране на имейл адрес", + "exportLogs": "Експорт на файловете с историята", + "enterYourRecoveryKey": "Въведете Вашия ключ за възстановяване", + "tempErrorContactSupportIfPersists": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.", + "networkHostLookUpErr": "Не може да се свърже с Ente, моля, проверете мрежовите си настройки и се свържете с поддръжката, ако проблемът продължава.", + "networkConnectionRefusedErr": "Не може да се свърже с Ente, моля, опитайте отново след известно време. Ако проблемът продължава, моля, свържете се с поддръжката.", + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Изглежда нещо се обърка. Моля, опитайте отново след известно време. Ако грешката продължава, моля, свържете се с нашия екип за поддръжка.", "about": "Относно", + "weAreOpenSource": "Ние сме с отворен код!", "privacy": "Поверителност", "terms": "Условия", "checkForUpdates": "Провери за актуализации", "checkStatus": "Проверка на състоянието", "downloadUpdate": "Изтегляне", + "criticalUpdateAvailable": "Налична е критична актуализация", "updateAvailable": "Налична актуализация", "update": "Актуализиране", "checking": "Извършва се проверка...", + "youAreOnTheLatestVersion": "Вие сте с най-новата версия", "warning": "Предупреждение", + "exportWarningDesc": "Експортираният файл съдържа поверителна информация. Моля, съхранявайте го безопасно.", "iUnderStand": "Разбрах", "@iUnderStand": { "description": "Text for the button to confirm the user understands the warning" }, + "authToExportCodes": "Моля, удостоверете се, за да експортирате Вашите кодове", "importSuccessTitle": "Ура!", + "importSuccessDesc": "Импортирахте {count} кода!", + "@importSuccessDesc": { + "placeholders": { + "count": { + "description": "The number of codes imported", + "type": "int", + "example": "1" + } + } + }, "sorry": "Съжаляваме", + "importFailureDesc": "Неуспешен анализ на избрания файл.\nМоля, пишете на support@ente.io, ако имате нужда от помощ!", "pendingSyncs": "Предупреждение", + "pendingSyncsWarningBody": "Някои от вашите кодове не са архивирани.\n\nМоля, уверете се, че имате резервно копие на тези кодове, преди да излезете.", + "checkInboxAndSpamFolder": "Моля, проверете входящата си поща (и спама), за да завършите проверката", + "tapToEnterCode": "Докоснете, за да въведете код", "resendEmail": "Повторно изпращане на имейл", + "weHaveSendEmailTo": "Изпратихме имейл до {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, "activeSessions": "Активни сесии", "somethingWentWrongPleaseTryAgain": "Нещо се обърка, моля опитайте отново", + "thisWillLogYouOutOfThisDevice": "Това ще Ви изкара от профила на това устройство!", + "thisWillLogYouOutOfTheFollowingDevice": "Това ще Ви изкара от профила на следното устройство:", + "terminateSession": "Прекратяване на сесията?", "terminate": "Прекратяване", "thisDevice": "Това устройство", + "toResetVerifyEmail": "За да нулирате паролата си, моля, първо потвърдете своя имейл.", "thisEmailIsAlreadyInUse": "Този имейл вече се използва", + "verificationFailedPleaseTryAgain": "Неуспешно проверка, моля опитайте отново", + "yourVerificationCodeHasExpired": "Вашият код за потвърждение е изтекъл", "incorrectCode": "Неправилен код", + "sorryTheCodeYouveEnteredIsIncorrect": "За съжаление кодът, който сте въвели, е неправилен", + "emailChangedTo": "Имейлът е променен на {newEmail}", "authenticationFailedPleaseTryAgain": "Неуспешно удостоверяване, моля опитайте отново", "authenticationSuccessful": "Успешно удостоверяване!", "twofactorAuthenticationSuccessfullyReset": "Двуфакторното удостоверяване бе успешно нулирано", + "incorrectRecoveryKey": "Неправилен ключ за възстановяване", + "theRecoveryKeyYouEnteredIsIncorrect": "Въведеният от Вас ключ за възстановяване е неправилен", "enterPassword": "Въведете парола", "selectExportFormat": "Изберете формат за експортиране", + "exportDialogDesc": "Шифрованите експорти ще бъдат защитени с парола по Ваш избор.", "encrypted": "Шифровано", "plainText": "Обикновен текст", "passwordToEncryptExport": "Парола за шифроване на експортирането", "export": "Експортиране", + "useOffline": "Използвайте без резервни копия", + "signInToBackup": "Влезте, за да архивирате Вашите кодове", + "singIn": "Вход", + "sigInBackupReminder": "Моля, експортирайте Вашите кодове, за да сте сигурни, че имате резервно копие, от което можете да ги възстановите.", + "offlineModeWarning": "Избрахте да продължите без резервни копия. Моля, направете ръчни резервни копия, за да сте сигурни, че Вашите кодове са в безопасност.", + "showLargeIcons": "Показване на големи икони", + "shouldHideCode": "Скриване на кодове", + "doubleTapToViewHiddenCode": "Можете да докоснете два пъти върху запис, за да видите кода", + "focusOnSearchBar": "Фокусиране на търсенето при стартиране на приложението", "confirmUpdatingkey": "Сигурни ли сте, че искате да актуализирате секретния ключ?", "minimizeAppOnCopy": "Минимизиране на приложението при копиране", "editCodeAuthMessage": "Удостоверете се, за да редактирате кода", diff --git a/auth/lib/l10n/arb/app_de.arb b/auth/lib/l10n/arb/app_de.arb index 4d67965b2c..217fe8f2ae 100644 --- a/auth/lib/l10n/arb/app_de.arb +++ b/auth/lib/l10n/arb/app_de.arb @@ -72,7 +72,7 @@ "incorrectPasswordTitle": "Falsches Passwort", "welcomeBack": "Willkommen zurück!", "madeWithLoveAtPrefix": "gemacht mit ❤️ bei ", - "supportDevs": "Bei ente registrieren um das Projekt zu unterstützen.", + "supportDevs": "Bei ente registrieren, um das Projekt zu unterstützen", "supportDiscount": "Benutze den Rabattcode \"AUTH\" für 10% Rabatt im ersten Jahr", "changeEmail": "E-Mail ändern", "changePassword": "Passwort ändern", @@ -182,6 +182,7 @@ "security": "Sicherheit", "lockscreen": "Sperrbildschirm", "authToChangeLockscreenSetting": "Bitte authentifizieren um die Einstellungen des Sperrbildschirms zu ändern", + "deviceLockEnablePreSteps": "Um die Gerätesperre zu aktivieren, richte bitte einen Gerätepasscode oder eine Bildschirmsperre in den Systemeinstellungen ein.", "viewActiveSessions": "Aktive Sitzungen anzeigen", "authToViewYourActiveSessions": "Bitte authentifizieren um, die aktiven Sitzungen zu sehen", "searchHint": "Suchen...", @@ -441,5 +442,29 @@ "deleteTagTitle": "Tag löschen?", "deleteTagMessage": "Sind Sie sicher, dass Sie diesen Code löschen wollen? Diese Aktion ist unumkehrbar.", "somethingWentWrongParsingCode": "Wir konnten {x} Codes nicht parsen.", - "updateNotAvailable": "Update ist nicht verfügbar" + "updateNotAvailable": "Update ist nicht verfügbar", + "viewRawCodes": "Rohcodes anzeigen", + "rawCodes": "Rohcodes", + "rawCodeData": "Rohcode Daten", + "appLock": "App-Sperre", + "noSystemLockFound": "Keine Systemsperre gefunden", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.", + "autoLock": "Automatisches Sperren", + "immediately": "Sofort", + "reEnterPassword": "Passwort erneut eingeben", + "reEnterPin": "PIN erneut eingeben", + "next": "Weiter", + "tooManyIncorrectAttempts": "Zu viele fehlerhafte Versuche", + "tapToUnlock": "Zum Entsperren antippen", + "setNewPassword": "Neues Passwort festlegen", + "deviceLock": "Gerätesperre", + "hideContent": "Inhalte verstecken", + "hideContentDescriptionAndroid": "Versteckt Inhalte der App beim Wechseln zwischen Apps und deaktiviert Screenshots", + "hideContentDescriptioniOS": "Versteckt Inhalte der App beim Wechseln zwischen Apps", + "autoLockFeatureDescription": "Zeit, nach der die App gesperrt wird, nachdem sie in den Hintergrund verschoben wurde", + "appLockDescription": "Wähle zwischen dem Standard-Sperrbildschirm deines Gerätes und einem eigenen Sperrbildschirm mit PIN oder Passwort.", + "pinLock": "PIN-Sperre", + "enterPin": "PIN eingeben", + "setNewPin": "Neue PIN festlegen", + "importFailureDescNew": "Die ausgewählte Datei konnte nicht verarbeitet werden." } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_el.arb b/auth/lib/l10n/arb/app_el.arb index 0bbe9b9b81..e6f1d23b7c 100644 --- a/auth/lib/l10n/arb/app_el.arb +++ b/auth/lib/l10n/arb/app_el.arb @@ -182,6 +182,7 @@ "security": "Ασφάλεια", "lockscreen": "Οθόνη κλειδώματος", "authToChangeLockscreenSetting": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να αλλάξετε τις ρυθμίσεις οθόνης κλειδώματος", + "deviceLockEnablePreSteps": "Για να ενεργοποιήσετε το κλείδωμα της συσκευής, παρακαλώ ρυθμίστε τον κωδικό πρόσβασης της συσκευής ή το κλείδωμα οθόνης στις ρυθμίσεις του συστήματός σας.", "viewActiveSessions": "Προβολή ενεργών συνεδριών", "authToViewYourActiveSessions": "Παρακαλώ πραγματοποιήστε έλεγχο ταυτότητας για να δείτε τις ενεργές συνεδρίες σας", "searchHint": "Αναζήτηση...", @@ -458,6 +459,10 @@ "setNewPassword": "Ορίστε νέο κωδικό πρόσβασης", "deviceLock": "Κλείδωμα συσκευής", "hideContent": "Απόκρυψη περιεχομένου", + "hideContentDescriptionAndroid": "Απόκρυψη περιεχομένου εφαρμογής στην εναλλαγή εφαρμογών και απενεργοποίηση στιγμιότυπων οθόνης", + "hideContentDescriptioniOS": "Απόκρυψη περιεχομένου εφαρμογών στην εναλλαγή εφαρμογών", + "autoLockFeatureDescription": "Χρόνος μετά τον οποίο η εφαρμογή κλειδώνει μετά την τοποθέτηση στο παρασκήνιο", + "appLockDescription": "Επιλέξτε ανάμεσα στην προεπιλεγμένη οθόνη κλειδώματος της συσκευής σας και σε μια προσαρμοσμένη οθόνη κλειδώματος με ένα PIN ή έναν κωδικό πρόσβασης.", "pinLock": "Κλείδωμα καρφιτσωμάτων", "enterPin": "Εισαγωγή PIN", "setNewPin": "Ορίστε νέο PIN", diff --git a/auth/lib/l10n/arb/app_fr.arb b/auth/lib/l10n/arb/app_fr.arb index 1c411338ea..ec8ce6f86d 100644 --- a/auth/lib/l10n/arb/app_fr.arb +++ b/auth/lib/l10n/arb/app_fr.arb @@ -19,7 +19,7 @@ "pleaseVerifyDetails": "Veuillez vérifier vos informations et réessayez", "codeIssuerHint": "Émetteur", "codeSecretKeyHint": "Clé secrète", - "codeAccountHint": "Compte (vous@exemple.com)", + "codeAccountHint": "Compte (nom@exemple.com)", "codeTagHint": "Tag", "accountKeyType": "Type de clé", "sessionExpired": "Session expirée", @@ -118,7 +118,7 @@ "existingUser": "Utilisateur existant", "newUser": "Nouveau dans Ente", "delete": "Supprimer", - "enterYourPasswordHint": "Saisir votre mot de passe", + "enterYourPasswordHint": "Entrez votre mot de passe", "forgotPassword": "Mot de passe oublié", "oops": "Oups", "suggestFeatures": "Suggérer des fonctionnalités", @@ -135,14 +135,14 @@ "faq_a_5": "Vous pouvez activer le verrouillage FaceID dans Paramètres → Sécurité → Écran de verrouillage.", "somethingWentWrongMessage": "Quelque chose s'est mal passé, veuillez recommencer", "leaveFamily": "Quitter le plan familial", - "leaveFamilyMessage": "Êtes-vous certains de vouloir quitter le plan familial?", + "leaveFamilyMessage": "Êtes-vous sûr de vouloir quitter le plan familial ?", "inFamilyPlanMessage": "Vous êtes sur un plan familial !", "swipeHint": "Glisser vers la gauche pour modifier ou supprimer des codes", "scan": "Analyser", "scanACode": "Scanner un code", "verify": "Vérifier", "verifyEmail": "Vérifier l'e-mail", - "enterCodeHint": "Saisir le code à 6 caractères de votre appli d'authentification", + "enterCodeHint": "Entrez le code à 6 chiffres de votre application d'authentification", "lostDeviceTitle": "Appareil perdu ?", "twoFactorAuthTitle": "Authentification à deux facteurs", "passkeyAuthTitle": "Vérification du code d'accès", @@ -446,7 +446,9 @@ "viewRawCodes": "Afficher les codes bruts", "rawCodes": "Codes bruts", "rawCodeData": "Données de code brut", + "appLock": "Verrouillage d'application", "noSystemLockFound": "Aucun verrou système trouvé", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer un code d'accès ou le verrouillage de l'écran dans les paramètres de votre appareil.", "autoLock": "Verrouillage automatique", "immediately": "Immédiatement", "reEnterPassword": "Ressaisir le mot de passe", @@ -457,6 +459,9 @@ "setNewPassword": "Définir un nouveau mot de passe", "deviceLock": "Verrouillage de l'appareil", "hideContent": "Masquer le contenu", + "autoLockFeatureDescription": "Délai après lequel l'application se verrouille une fois qu'elle a été mise en arrière-plan", + "appLockDescription": "Choisissez entre l'écran de verrouillage par défaut de votre appareil et un écran de verrouillage par code PIN ou mot de passe personnalisé.", + "pinLock": "Verrouillage par code PIN", "enterPin": "Saisir le code PIN", "setNewPin": "Définir un nouveau code PIN", "importFailureDescNew": "Impossible de lire le fichier sélectionné." diff --git a/auth/lib/l10n/arb/app_sv.arb b/auth/lib/l10n/arb/app_sv.arb index e47c1b8c0e..e0c817c13c 100644 --- a/auth/lib/l10n/arb/app_sv.arb +++ b/auth/lib/l10n/arb/app_sv.arb @@ -20,10 +20,11 @@ "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" }, - "pleaseLoginAgain": "Vänligen logga in igen", + "pleaseLoginAgain": "Logga in igen", "loggingOut": "Loggar ut...", "saveAction": "Spara", "nextTotpTitle": "nästa", + "deleteCodeTitle": "Radera kod?", "deleteCodeMessage": "Vill du ta bort den här koden? Det går inte att ångra den här åtgärden.", "viewLogsAction": "Visa loggar", "emailLogsTitle": "E-posta loggar", @@ -63,6 +64,7 @@ "importCodes": "Importera koder", "exportCodes": "Exportera koder", "importLabel": "Importera", + "ok": "OK", "cancel": "Avbryt", "yes": "Ja", "no": "Nej", @@ -109,8 +111,21 @@ "recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.", "saveKey": "Spara nyckel", "save": "Spara", + "send": "Skicka", "back": "Tillbaka", "createAccount": "Skapa konto", + "passwordStrength": "Lösenordsstyrka: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, "password": "Lösenord", "privacyPolicyTitle": "Integritetspolicy", "termsOfServicesTitle": "Villkor", @@ -151,6 +166,7 @@ "incorrectRecoveryKey": "Felaktig återställningsnyckel", "enterPassword": "Ange lösenord", "export": "Exportera", + "signInToBackup": "Logga in för att säkerhetskopiera dina koder", "singIn": "Logga in", "shouldHideCode": "Dölj koder", "androidCancelButton": "Avbryt", @@ -163,7 +179,11 @@ }, "noInternetConnection": "Ingen internetanslutning", "pleaseCheckYourInternetConnectionAndTryAgain": "Kontrollera din internetanslutning och försök igen.", + "signOutOtherDevices": "Logga ut andra enheter", "loginSessionExpiredDetails": "Din session har upphört. Logga in igen.", + "create": "Skapa", + "editTag": "Redigera tagg", + "deleteTagTitle": "Radera tagg?", "immediately": "Omedelbart", "reEnterPassword": "Ange lösenord igen", "reEnterPin": "Ange PIN-kod igen", diff --git a/auth/lib/l10n/arb/app_ta.arb b/auth/lib/l10n/arb/app_ta.arb new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/auth/lib/l10n/arb/app_ta.arb @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_vi.arb b/auth/lib/l10n/arb/app_vi.arb index 672afa36c3..1c75de3109 100644 --- a/auth/lib/l10n/arb/app_vi.arb +++ b/auth/lib/l10n/arb/app_vi.arb @@ -21,12 +21,13 @@ "codeSecretKeyHint": "Khóa bí mật", "codeAccountHint": "Tài khoản (bạn@miền.com)", "codeTagHint": "Thẻ", + "accountKeyType": "Loại khóa", "sessionExpired": "Phiên làm việc đã hết hạn", "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" }, "pleaseLoginAgain": "Vui lòng đăng nhập lại", - "loggingOut": "Đang thoát...", + "loggingOut": "Đang đăng xuất...", "timeBasedKeyType": "Dựa trên thời gian (TOTP)", "counterBasedKeyType": "Dựa trên bộ đếm (HOTP)", "saveAction": "Lưu", @@ -74,7 +75,7 @@ "supportDevs": "Đăng ký ente để hỗ trợ dự án này.", "supportDiscount": "Sử dụng mã giảm giá \"AUTH\" để được giảm 10% trong năm đầu tiên", "changeEmail": "Thay đổi email", - "changePassword": "Thay đổi mật khẩu", + "changePassword": "Đổi mật khẩu", "data": "Dữ liệu", "importCodes": "Nhập mã", "importTypePlainText": "Văn bản thuần", @@ -131,7 +132,7 @@ "faq_a_4": "Bạn có thể hỗ trợ sự phát triển của dự án này bằng cách đăng ký ứng dụng Ảnh @ ente.io của chúng tôi.", "faq_q_5": "Làm sao để tôi bật FaceID trong ente", "faq_a_5": "Bạn có thể bật khóa FaceID trong Cài đặt → Bảo mật → Màn hình khóa.", - "somethingWentWrongMessage": "Phát hiện có lỗi, xin thử lại", + "somethingWentWrongMessage": "Đã xảy ra lỗi, xin thử lại", "leaveFamily": "Rời khỏi gia đình", "leaveFamilyMessage": "Bạn có chắc chắn muốn thoát khỏi gói dành cho gia đình không?", "inFamilyPlanMessage": "Bạn đang sử dụng gói dành cho gia đình!", @@ -141,7 +142,7 @@ "verify": "Xác minh", "verifyEmail": "Xác nhận địa chỉ Email", "enterCodeHint": "Nhập mã gồm 6 chữ số từ ứng dụng xác thực của bạn", - "lostDeviceTitle": "Bạn đã mất thiết bị?", + "lostDeviceTitle": "Mất thiết bị?", "twoFactorAuthTitle": "Xác thực hai yếu tố", "recoverAccount": "Khôi phục tài khoản", "enterRecoveryKeyHint": "Nhập khóa khôi phục của bạn", @@ -154,6 +155,7 @@ } } }, + "invalidQRCode": "Mã QR không hợp lệ", "noRecoveryKeyTitle": "Không có khóa khôi phục?", "enterEmailHint": "Nhập địa chỉ email của bạn", "invalidEmailTitle": "Địa chỉ email không hợp lệ", @@ -177,6 +179,7 @@ "security": "Bảo mật", "lockscreen": "Màn hình khoá", "authToChangeLockscreenSetting": "Vui lòng xác thực để thay đổi cài đặt màn hình khóa", + "deviceLockEnablePreSteps": "Để bật khoá thiết bị, vui lòng thiết lập mật khẩu thiết bị hoặc khóa màn hình trong cài đặt hệ thống của bạn.", "viewActiveSessions": "Xem danh sách phiên làm việc hiện tại", "authToViewYourActiveSessions": "Vui lòng xác thực để xem danh sách phiên làm việc của bạn", "searchHint": "Tìm kiếm...", @@ -195,6 +198,8 @@ "recoveryKeySaveDescription": "Chúng tôi không lưu trữ khóa này, vui lòng lưu khóa 24 từ này ở nơi an toàn.", "doThisLater": "Để sau", "saveKey": "Lưu khóa", + "save": "Lưu", + "send": "Gửi", "back": "Quay lại", "createAccount": "Tạo tài khoản", "passwordStrength": "Độ mạnh mật khẩu: {passwordStrengthValue}", @@ -253,6 +258,8 @@ "exportLogs": "Xuất nhật ký", "enterYourRecoveryKey": "Nhập khóa khôi phục của bạn", "tempErrorContactSupportIfPersists": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.", + "networkHostLookUpErr": "Không thể kết nối đến Ente, vui lòng kiểm tra lại kết nối mạng. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.", + "networkConnectionRefusedErr": "Không thể kết nối đến Ente, vui lòng thử lại sau. Nếu vẫn còn lỗi, xin vui lòng liên hệ hỗ trợ.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Có vẻ như đã xảy ra sự cố. Vui lòng thử lại sau một thời gian. Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi.", "about": "Về chúng tôi", "weAreOpenSource": "Chúng tôi có mã nguồn mở!", @@ -342,6 +349,7 @@ "deleteCodeAuthMessage": "Xác minh để xóa mã", "showQRAuthMessage": "Xác minh để hiển thị mã QR", "confirmAccountDeleteTitle": "Xác nhận xóa tài khoản", + "confirmAccountDeleteMessage": "Tài khoản này được liên kết với các ứng dụng Ente trên các nền tảng khác, nếu bạn có sử dụng.\n\nDữ liệu đã tải lên của bạn, trên mọi nền tảng, sẽ bị lên lịch xóa và tài khoản của bạn sẽ bị xóa vĩnh viễn.", "androidBiometricHint": "Xác định danh tính", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -402,11 +410,37 @@ "doNotSignOut": "Không được đăng xuất", "hearUsWhereTitle": "Bạn biết đến Ente bằng cách nào? (không bắt buộc)", "hearUsExplanation": "Chúng tôi không theo dõi lượt cài đặt ứng dụng. Sẽ rất hữu ích nếu bạn cho chúng tôi biết nơi bạn tìm thấy chúng tôi!", + "recoveryKeySaved": "Đã lưu khoá dự phòng vào thư mục Tải về!", + "waitingForVerification": "Đang chờ xác thực", + "loginSessionExpired": "Phiên làm việc hết hạn", + "loginSessionExpiredDetails": "Phiên làm việc hết hạn. Vui lòng đăng nhập lại.", + "developerSettings": "Cài đặt cho nhà phát triển", + "customEndpoint": "Đã kết nối đến", + "pinText": "Ghim", + "unpinText": "Bỏ ghim", + "tags": "Thẻ", + "createNewTag": "Tạo thẻ mới", + "tag": "Thẻ", + "create": "Tạo", + "editTag": "Sửa thẻ", + "deleteTagTitle": "Xóa thẻ?", + "deleteTagMessage": "Bạn có chắc chắn muốn xóa thẻ này không? Hành động này không thể đảo ngược.", "updateNotAvailable": "Cập nhật không khả dụng", "viewRawCodes": "Xem mã nguồn", "rawCodes": "Mã nguồn", + "appLock": "Khóa ứng dụng", + "autoLock": "Tự động khóa", + "immediately": "Tức thì", + "reEnterPassword": "Nhập lại mật khẩu", + "reEnterPin": "Nhập lại mã PIN", + "next": "Tiếp", + "tooManyIncorrectAttempts": "Quá nhiều lần thử không chính xác", + "tapToUnlock": "Nhấn để mở khóa", "setNewPassword": "Đặt lại mật khẩu", "deviceLock": "Khóa thiết bị", + "hideContent": "Ẩn nội dung", + "hideContentDescriptionAndroid": "Ẩn nội dung khi chuyển ứng dụng và chặn chụp màn hình", + "hideContentDescriptioniOS": "Ẩn nội dung khi chuyển ứng dụng", "pinLock": "Mã PIN", "enterPin": "Nhập mã PIN", "setNewPin": "Đổi mã PIN" diff --git a/auth/lib/l10n/arb/app_zh.arb b/auth/lib/l10n/arb/app_zh.arb index b20bf2dd38..a62a7c13f3 100644 --- a/auth/lib/l10n/arb/app_zh.arb +++ b/auth/lib/l10n/arb/app_zh.arb @@ -27,15 +27,15 @@ "description": "Title of the dialog when the users current session is invalid/expired" }, "pleaseLoginAgain": "请重新登录", - "loggingOut": "正在退出登录...", - "timeBasedKeyType": "基于时间的 (TOTP)", - "counterBasedKeyType": "基于计数器的(HOTP)", + "loggingOut": "正在登出...", + "timeBasedKeyType": "基于时间 (TOTP)", + "counterBasedKeyType": "基于计数器 (HOTP)", "saveAction": "保存", "nextTotpTitle": "下一个", "deleteCodeTitle": "要删除代码吗?", - "deleteCodeMessage": "您确定要删除此代码吗?此操作是不可逆的。", + "deleteCodeMessage": "您确定要删除此代码吗?此操作不可逆。", "viewLogsAction": "查看日志", - "sendLogsDescription": "这将跨日志发送以帮助我们调试您的问题。 虽然我们采取预防措施以确保不记录敏感信息,但我们鼓励您在共享这些日志之前先查看它们。", + "sendLogsDescription": "这将发送日志以帮助我们调试您的问题。虽然我们采取预防措施确保不记录敏感信息,但我们建议您在共享这些日志之前先查看它们。", "preparingLogsTitle": "正在准备日志...", "emailLogsTitle": "电子邮件日志", "emailLogsMessage": "请将日志发送至 {email}", @@ -67,13 +67,13 @@ "pleaseWait": "请稍候...", "generatingEncryptionKeysTitle": "正在生成加密密钥...", "recreatePassword": "重新创建密码", - "recreatePasswordMessage": "当前设备的强度不足以验证您的密码, 所以我们需要以一种能够与所有设备一起运行的方式重新生成它。 \n\n请使用您的恢复密钥登录并重新生成您的密码 (如果您愿意,您可以再次使用相同密钥)。", + "recreatePasswordMessage": "当前设备的功能不足以验证您的密码,因此我们需要以一种适用于所有设备的方式重新生成一次密码。\n\n请使用您的恢复密钥登录并重新生成您的密码(如果您愿意,可以再次使用相同的密码)。", "useRecoveryKey": "使用恢复密钥", "incorrectPasswordTitle": "密码错误", "welcomeBack": "欢迎回来!", "madeWithLoveAtPrefix": "用❤️制成 ", "supportDevs": "订阅 ente 以支持此项目。", - "supportDiscount": "使用优惠券号码“AUTH”获得第一年优惠10%的折扣", + "supportDiscount": "使用优惠码“AUTH”可享受首年 10% 折扣", "changeEmail": "修改邮箱", "changePassword": "修改密码", "data": "数据", @@ -83,29 +83,29 @@ "passwordForDecryptingExport": "用来解密导出的密码", "passwordEmptyError": "密码不能为空", "importFromApp": "从 {appName} 导入代码", - "importGoogleAuthGuide": "使用“转移帐户”选项将您的帐户从 Google 身份验证器导出到二维码。然后使用另一台设备扫描二维码。\n\n提示:您可以使用笔记本电脑的网络摄像头拍摄二维码的照片。", + "importGoogleAuthGuide": "使用“转移账户”选项将您的账户从 Google Authenticator 导出到二维码。然后使用另一台设备扫描二维码。\n\n提示:您可以使用笔记本电脑的摄像头拍摄二维码的照片。", "importSelectJsonFile": "选择 JSON 文件", "importSelectAppExport": "选择 {appName} 的导出文件", "importEnteEncGuide": "选择从 Ente 导出的 JSON 加密文件", "importRaivoGuide": "使用 Raivo 设置中的“将 OTP 导出到 Zip 存档”选项。\n\n解压 zip 文件并导入 JSON 文件。", - "importBitwardenGuide": "使用 Bitwarden 工具中的“导出保管库”选项并导入未加密的 JSON 文件。", - "importAegisGuide": "在Aegis的设置中使用\"导出密码库\"选项。\n\n如果您的密码库已加密,您需要输入密码才能解密密码库。", - "import2FasGuide": "使用 2FAS 中的“设置 -> 备份 - 导出”选项。\n\n如果您的备份已被加密,则需要输入密码才能解密备份", + "importBitwardenGuide": "使用 Bitwarden 工具中的“导出密码库”选项并导入未加密的 JSON 文件。", + "importAegisGuide": "使用 Aegis 设置中的“导出密码库”选项。\n\n如果您的密码库已加密,则需要输入密码库密码才能解密密码库。", + "import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密,则需要输入密码来解密备份", "importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。", "exportCodes": "导出代码", "importLabel": "导入", - "importInstruction": "请以以下格式选择包含代码列表的文件", + "importInstruction": "请选择一个包含以下格式的代码列表的文件", "importCodeDelimiterInfo": "代码可以用逗号或新行分隔。", "selectFile": "选择文件", "emailVerificationToggle": "电子邮件验证", - "emailVerificationEnableWarning": "如果您将 2FA 存储到我们的电子邮件中,则打开电子邮件验证可能会导致僵局。如果您被一项服务锁定,您可能无法登录另一项服务。", + "emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重验证的副本。", "authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证", "authToViewYourRecoveryKey": "请验证以查看您的恢复密钥", "authToChangeYourEmail": "请验证以更改您的电子邮件", "authToChangeYourPassword": "请验证以更改密码", - "authToViewSecrets": "请进行身份验证以查看您的秘密", + "authToViewSecrets": "请进行身份验证以查看您的密钥", "authToInitiateSignIn": "请进行身份验证以启动登录进行备份。", - "ok": "好的", + "ok": "确定", "cancel": "取消", "yes": "是", "no": "否", @@ -125,8 +125,8 @@ "faq": "常见问题", "faq_q_1": "Auth 的安全性如何?", "faq_a_1": "您通过 Auth 备份的所有代码均以端到端加密方式存储。这意味着只有您可以访问您的代码。我们的应用程序是开源的并且我们的加密技术已经过外部审计。", - "faq_q_2": "我可以在桌面上访问我的代码吗?", - "faq_a_2": "您可以在 web @auth.ente.io 上访问您的代码。", + "faq_q_2": "我可以在桌面设备上访问我的代码吗?", + "faq_a_2": "您可以在网页 auth.ente.io 上访问您的代码。", "faq_q_3": "我如何删除代码?", "faq_a_3": "您可以通过向左滑动该项目来删除该代码。", "faq_q_4": "我该如何支持该项目?", @@ -240,9 +240,9 @@ "ackPasswordLostWarning": "我明白,如果我丢失密码,我可能会丢失我的数据,因为我的数据是 端到端加密的。", "loginTerms": "点击登录后,我同意 服务条款隐私政策", "logInLabel": "登录", - "logout": "退出登录", - "areYouSureYouWantToLogout": "您确定要退出登录吗?", - "yesLogout": "是的,退出登陆", + "logout": "登出", + "areYouSureYouWantToLogout": "您确定要登出吗?", + "yesLogout": "是的,登出", "exit": "退出", "verifyingRecoveryKey": "正在验证恢复密钥...", "recoveryKeyVerified": "恢复密钥已验证", @@ -299,7 +299,7 @@ "sorry": "抱歉", "importFailureDesc": "无法解析选定的文件。\n如果您需要帮助,请写入support@ente.io!", "pendingSyncs": "警告", - "pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在退出登录之前备份这些代码。", + "pendingSyncsWarningBody": "您的一些代码尚未备份。\n\n请确保您在登出之前备份这些代码。", "checkInboxAndSpamFolder": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证", "tapToEnterCode": "点击以输入代码", "resendEmail": "重新发送电子邮件", @@ -316,8 +316,8 @@ }, "activeSessions": "已登录的设备", "somethingWentWrongPleaseTryAgain": "出了点问题,请重试", - "thisWillLogYouOutOfThisDevice": "这将使您在此设备上退出登录!", - "thisWillLogYouOutOfTheFollowingDevice": "这将使您在以下设备中退出登录:", + "thisWillLogYouOutOfThisDevice": "这将使您登出该设备!", + "thisWillLogYouOutOfTheFollowingDevice": "这将使您登出以下设备:", "terminateSession": "是否终止会话?", "terminate": "终止", "thisDevice": "此设备", @@ -396,7 +396,7 @@ "@androidGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." }, - "iOSLockOut": "生物识别身份验证已禁用。请锁定再解锁您的屏幕以启用它。", + "iOSLockOut": "生物识别身份验证已禁用。请锁定并解锁屏幕以启用该功能。", "@iOSLockOut": { "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." }, @@ -410,11 +410,11 @@ }, "noInternetConnection": "无互联网连接", "pleaseCheckYourInternetConnectionAndTryAgain": "请检查您的互联网连接,然后重试。", - "signOutFromOtherDevices": "从其他设备退出登录", - "signOutOtherBody": "如果你认为有人可能知道你的密码,你可以强制所有使用你账户的其他设备退出登录。", + "signOutFromOtherDevices": "从其他设备登出", + "signOutOtherBody": "如果您认为有人可能知道您的密码,您可以强制所有其他使用您账户的设备登出。", "signOutOtherDevices": "登出其他设备", - "doNotSignOut": "不要退登", - "hearUsWhereTitle": "您是如何知道Ente的? (可选的)", + "doNotSignOut": "不要登出", + "hearUsWhereTitle": "您是怎么知道 Ente 的?(可选)", "hearUsExplanation": "我们不跟踪应用程序安装情况。如果您告诉我们您是在哪里找到我们的,将会有所帮助!", "recoveryKeySaved": "恢复密钥已保存在下载文件夹中!", "waitingForBrowserRequest": "正在等待浏览器请求...", From 1197e11f58fc17e5b2b35870efba3101f16eebbe Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:18:04 +0200 Subject: [PATCH 0861/1179] Remove unnecessary slug fields --- .../custom-icons/_data/custom-icons.json | 56 ++++++------------- 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 0918925ace..77e7f20b01 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -70,19 +70,16 @@ "blockchain.com", "blockchain.com Wallet", "blockchain.com Exchange" - ], - "slug": "blockchain" + ] }, { "title": "BorgBase", "altNames": [ "borg" - ], - "slug": "BorgBase" + ] }, { "title": "Booking", - "slug": "booking", "altNames":[ "Booking.com" ] @@ -117,8 +114,7 @@ "title": "CloudAMQP" }, { - "title": "ConfigCat", - "slug": "configcat" + "title": "ConfigCat" }, { "title": "CoinDCX" @@ -147,8 +143,7 @@ "title": "DCS", "altNames": [ "Digital Combat Simulator" - ], - "slug": "dcs" + ] }, { "title": "DEGIRO" @@ -240,16 +235,13 @@ "title": "HuggingFace", "altNames": [ "Hugging Face" - ], - "slug": "huggingface" + ] }, { - "title": "IceDrive", - "slug": "Icedrive" + "title": "IceDrive" }, { - "titile": "Infomaniak", - "slug": "infomaniak" + "titile": "Infomaniak" }, { "title": "ING" @@ -270,8 +262,7 @@ "hex": "000000" }, { - "title": "IVPN", - "slug": "IVPN" + "title": "IVPN" }, { "title": "Jagex", @@ -333,7 +324,6 @@ "mathstodon", "fosstodon" ], - "slug": "mastodon", "hex": "6364FF" }, { @@ -420,8 +410,7 @@ "title": "Notion" }, { - "title": "NuCommunity", - "slug": "nucommunity" + "title": "NuCommunity" }, { "title": "NVIDIA" @@ -447,8 +436,7 @@ "title": "PayPal" }, { - "title": "pCloud", - "slug": "pCloud" + "title": "pCloud" }, { "title": "Peerberry", @@ -495,7 +483,6 @@ "title": "Registro br", "slug": "registro_br", "altNames": [ - "Registro br", "registrobr", "Registro.br" ] @@ -551,8 +538,7 @@ ] }, { - "title": "SMTP2GO", - "slug": "smtp2go" + "title": "SMTP2GO" }, { "title": "Snapchat" @@ -571,7 +557,6 @@ }, { "title": "TCPShield", - "slug": "tcpshield", "hex": "FFFFFF" }, { @@ -597,7 +582,6 @@ }, { "title": "Trading 212", - "slug": "trading212", "hex": "4BA4DE" }, { @@ -636,7 +620,6 @@ }, { "title": "Uphold", - "slug": "uphold", "hex": "6FE68A" }, { @@ -660,12 +643,10 @@ "title": "Wise" }, { - "title": "WYZE", - "slug": "wyze" + "title": "WYZE" }, { "title": "WorkOS", - "slug": "workos", "altNames": [ "Work OS" ] @@ -675,8 +656,7 @@ "altNames": [ "Ya", "Яндекс" - ], - "slug": "Yandex" + ] }, { "title": "yahoo" @@ -686,21 +666,17 @@ "altNames": [ "You Need A Budget" ], - "slug": "ynab", "hex": "3B5EDA" }, { - "title": "Shakepay", - "slug": "shakepay" + "title": "Shakepay" }, { "title": "Newton", - "altNames": ["Newton Crypto"], - "slug": "newton" + "altNames": ["Newton Crypto"] }, { - "title": "RippleMatch", - "slug": "ripplematch" + "title": "RippleMatch" }, { "title": "T-Mobile ID", From a13256cf3968a488b7be4bc8a8d536a08c6afdd7 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:19:00 +0200 Subject: [PATCH 0862/1179] Remove unnecessary slug fields --- auth/assets/custom-icons/_data/custom-icons.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 77e7f20b01..a3b49db55d 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -176,8 +176,8 @@ "hex": "1DB954" }, { - "title": "enom" - }, + "title": "enom" + }, { "title": "Epic Games", "slug": "epic_games", @@ -686,8 +686,7 @@ "slug": "t-mobile" }, { - "title": "Wealthfront", - "slug": "wealthfront" + "title": "Wealthfront" }, { "title": "BinanceUS", From dbde6abc8c58608ef01463c14e8c46d2f41c4b2f Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:22:12 +0200 Subject: [PATCH 0863/1179] Refactor and clean code --- .../custom-icons/_data/custom-icons.json | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index a3b49db55d..cbf3dc6b60 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -31,12 +31,12 @@ "title": "bitget" }, { - "titile":"bitget wallet", - "slug":"bitget_wallet" + "titile": "bitget wallet", + "slug": "bitget_wallet" }, { "title": "Bitmart", - "hex":"000000" + "hex": "000000" }, { "title": "BitMEX" @@ -80,14 +80,14 @@ }, { "title": "Booking", - "altNames":[ + "altNames": [ "Booking.com" ] }, { "title": "Brave Creators", "slug": "brave_creators", - "altNames":[ + "altNames": [ "Brave", "Brave Rewards", "Brave Browser" @@ -168,8 +168,8 @@ "slug": "dusnet" }, { - "title":"ecitizen kenya", - "slug":"ecitizen_kenya" + "title": "ecitizen kenya", + "slug": "ecitizen_kenya" }, { "title": "ente", @@ -213,10 +213,10 @@ }, { "title": "Gosuslugi", + "slug": "Gosuslugi", "altNames": [ "Госуслуги" - ], - "slug": "Gosuslugi" + ] }, { "title": "Habbo" @@ -355,11 +355,10 @@ "title": "Mozilla" }, { - "title": "Murena", + "title": "ecloud", "altNames": [ - "eCloud" - ], - "slug": "ecloud" + "Murena" + ] }, { "title": "MyFRITZ!Net", @@ -421,14 +420,15 @@ { "titile": "OpenObserve", "slug": "open_observe", - "altNames":[ + "altNames": [ "openobserve.ai", "openobserve ai" ] }, { "title": "okx", - "hex": "000000" }, + "hex": "000000" + }, { "title": "Parsec" }, @@ -673,32 +673,35 @@ }, { "title": "Newton", - "altNames": ["Newton Crypto"] + "altNames": [ + "Newton Crypto" + ] }, { "title": "RippleMatch" }, { - "title": "T-Mobile ID", + "title": "T-Mobile", "altNames": [ - "T-Mobile" - ], - "slug": "t-mobile" + "T-Mobile ID" + ] }, { "title": "Wealthfront" }, { "title": "BinanceUS", + "slug": "binance_us", "altNames": [ "Binance US" - ], - "slug": "binance_us" + ] }, { "title": "Bethesda Softworks", - "altNames": ["Bethesda"], - "slug": "bethesda" + "slug": "bethesda", + "altNames": [ + "Bethesda" + ] } ] } From b1e727f269e4f998af14da7363c984be929ea70c Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:24:51 +0200 Subject: [PATCH 0864/1179] Refactor --- auth/assets/custom-icons/_data/custom-icons.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index cbf3dc6b60..d4b5de23a8 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -697,10 +697,9 @@ ] }, { - "title": "Bethesda Softworks", - "slug": "bethesda", + "title": "Bethesda", "altNames": [ - "Bethesda" + "Bethesda Softworks" ] } ] From a1742f71e0c5f6b275566d923905cafea7302a16 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:32:11 +0200 Subject: [PATCH 0865/1179] Fix typo --- auth/assets/custom-icons/_data/custom-icons.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index d4b5de23a8..ea9d05a0f3 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -31,7 +31,7 @@ "title": "bitget" }, { - "titile": "bitget wallet", + "title": "bitget wallet", "slug": "bitget_wallet" }, { @@ -241,7 +241,7 @@ "title": "IceDrive" }, { - "titile": "Infomaniak" + "title": "Infomaniak" }, { "title": "ING" @@ -418,7 +418,7 @@ "title": "Odido" }, { - "titile": "OpenObserve", + "title": "OpenObserve", "slug": "open_observe", "altNames": [ "openobserve.ai", @@ -626,7 +626,7 @@ "title": "Upstox" }, { - "titile": "Vikunja", + "title": "Vikunja", "slug": "vikunja" }, { From 0a7a8e49fed329879134badda97d83338d301e85 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:32:51 +0200 Subject: [PATCH 0866/1179] Reorder alphabetically --- .../custom-icons/_data/custom-icons.json | 104 +++++++++--------- 1 file changed, 49 insertions(+), 55 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index ea9d05a0f3..f80c4f0551 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -24,6 +24,19 @@ { "title": "AscendEX" }, + { + "title": "Bethesda", + "altNames": [ + "Bethesda Softworks" + ] + }, + { + "title": "BinanceUS", + "slug": "binance_us", + "altNames": [ + "Binance US" + ] + }, { "title": "Bitfinex" }, @@ -31,7 +44,7 @@ "title": "bitget" }, { - "title": "bitget wallet", + "titile": "bitget wallet", "slug": "bitget_wallet" }, { @@ -107,14 +120,11 @@ "slug": "cih", "hex": "D14633" }, - { - "title": "Cloudflare" - }, { "title": "CloudAMQP" }, { - "title": "ConfigCat" + "title": "Cloudflare" }, { "title": "CoinDCX" @@ -122,6 +132,9 @@ { "title": "ConfigCat" }, + { + "title": "ConfigCat" + }, { "title": "Control D", "slug": "controld", @@ -171,6 +184,12 @@ "title": "ecitizen kenya", "slug": "ecitizen_kenya" }, + { + "title": "ecloud", + "altNames": [ + "Murena" + ] + }, { "title": "ente", "hex": "1DB954" @@ -241,7 +260,7 @@ "title": "IceDrive" }, { - "title": "Infomaniak" + "titile": "Infomaniak" }, { "title": "ING" @@ -354,12 +373,6 @@ { "title": "Mozilla" }, - { - "title": "ecloud", - "altNames": [ - "Murena" - ] - }, { "title": "MyFRITZ!Net", "slug": "myfritz", @@ -395,6 +408,12 @@ { "title": "NextDNS" }, + { + "title": "Newton", + "altNames": [ + "Newton Crypto" + ] + }, { "title": "ngrok", "hex": "858585" @@ -418,7 +437,7 @@ "title": "Odido" }, { - "title": "OpenObserve", + "titile": "OpenObserve", "slug": "open_observe", "altNames": [ "openobserve.ai", @@ -494,6 +513,9 @@ "title": "Revolt", "hex": "858585" }, + { + "title": "RippleMatch" + }, { "title": "Rockstar Games", "slug": "rockstar_games" @@ -516,6 +538,9 @@ { "title": "service-bw" }, + { + "title": "Shakepay" + }, { "title": "SimpleLogin" }, @@ -626,9 +651,12 @@ "title": "Upstox" }, { - "title": "Vikunja", + "titile": "Vikunja", "slug": "vikunja" }, + { + "title": "Wealthfront" + }, { "title": "Wealthsimple" }, @@ -642,15 +670,18 @@ { "title": "Wise" }, - { - "title": "WYZE" - }, { "title": "WorkOS", "altNames": [ "Work OS" ] }, + { + "title": "WYZE" + }, + { + "title": "yahoo" + }, { "title": "Yandex", "altNames": [ @@ -658,49 +689,12 @@ "Яндекс" ] }, - { - "title": "yahoo" - }, { "title": "YNAB", "altNames": [ "You Need A Budget" ], "hex": "3B5EDA" - }, - { - "title": "Shakepay" - }, - { - "title": "Newton", - "altNames": [ - "Newton Crypto" - ] - }, - { - "title": "RippleMatch" - }, - { - "title": "T-Mobile", - "altNames": [ - "T-Mobile ID" - ] - }, - { - "title": "Wealthfront" - }, - { - "title": "BinanceUS", - "slug": "binance_us", - "altNames": [ - "Binance US" - ] - }, - { - "title": "Bethesda", - "altNames": [ - "Bethesda Softworks" - ] } ] -} +} \ No newline at end of file From 05cf33ffb2caf9c1d76920e3159dac3a4737f1d5 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:50:21 +0200 Subject: [PATCH 0867/1179] Remove unnecessary hex fields --- .../custom-icons/_data/custom-icons.json | 42 +++++++------------ auth/assets/custom-icons/icons/kucoin.svg | 2 +- auth/assets/custom-icons/icons/postnl.svg | 2 +- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index f80c4f0551..5c04d71028 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -64,8 +64,7 @@ "title": "Bitstamp" }, { - "title": "Bitvavo", - "hex": "0051FF" + "title": "Bitvavo" }, { "title": "Bitwarden" @@ -137,8 +136,7 @@ }, { "title": "Control D", - "slug": "controld", - "hex": "5FD800" + "slug": "controld" }, { "title": "Crowdpear" @@ -291,8 +289,7 @@ "title": "Kagi" }, { - "title": "Kick", - "hex": "53FC19" + "title": "Kick" }, { "title": "Kite" @@ -305,15 +302,13 @@ "color": "00CC00" }, { - "title": "Kraken", - "hex": "5848D5" + "title": "Kraken" }, { "title": "Kronos" }, { - "title": "KuCoin", - "hex": "01BC8D" + "title": "KuCoin" }, { "title": "La Poste", @@ -458,12 +453,10 @@ "title": "pCloud" }, { - "title": "Peerberry", - "hex": "03E5A5" + "title": "Peerberry" }, { - "title": "Pingvin Share", - "hex": "485099" + "title": "Pingvin Share" }, { "title": "Plutus", @@ -473,12 +466,10 @@ "title": "Poloniex" }, { - "title": "Porkbun", - "hex": "F27777" + "title": "Porkbun" }, { - "title": "PostNL", - "color": "EF8300" + "title": "PostNL" }, { "title": "Privacy Guides", @@ -521,8 +512,7 @@ "slug": "rockstar_games" }, { - "title": "RuneMate", - "hex": "2ECC71" + "title": "RuneMate" }, { "title": "Rust Language Forum", @@ -570,8 +560,7 @@ }, { "title": "Standard Notes", - "slug": "standardnotes", - "hex": "2173E6" + "slug": "standardnotes" }, { "title": "Surfshark" @@ -606,8 +595,7 @@ "title": "TorGuard" }, { - "title": "Trading 212", - "hex": "4BA4DE" + "title": "Trading 212" }, { "title": "TradingView" @@ -644,8 +632,7 @@ "hex": "858585" }, { - "title": "Uphold", - "hex": "6FE68A" + "title": "Uphold" }, { "title": "Upstox" @@ -693,8 +680,7 @@ "title": "YNAB", "altNames": [ "You Need A Budget" - ], - "hex": "3B5EDA" + ] } ] } \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/kucoin.svg b/auth/assets/custom-icons/icons/kucoin.svg index 1b67b54717..d51a1660d8 100644 --- a/auth/assets/custom-icons/icons/kucoin.svg +++ b/auth/assets/custom-icons/icons/kucoin.svg @@ -1 +1 @@ - + diff --git a/auth/assets/custom-icons/icons/postnl.svg b/auth/assets/custom-icons/icons/postnl.svg index 3aa9415188..8ab3ff6784 100644 --- a/auth/assets/custom-icons/icons/postnl.svg +++ b/auth/assets/custom-icons/icons/postnl.svg @@ -1 +1 @@ - + From dc120a06ca8b80e40fc5bab021af95b6978eae62 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:51:22 +0200 Subject: [PATCH 0868/1179] Refactor --- auth/assets/custom-icons/_data/custom-icons.json | 1 - 1 file changed, 1 deletion(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 5c04d71028..5989c5bb00 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -146,7 +146,6 @@ "slug": "crypto", "altNames": [ "crypto", - "Crypto.com", "Crypto com" ] }, From e16fa2dc3193ecc3d618ba20640ac8e61fa8bd62 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:52:07 +0200 Subject: [PATCH 0869/1179] Fix typo --- auth/assets/custom-icons/_data/custom-icons.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 5989c5bb00..842afc6dab 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -44,7 +44,7 @@ "title": "bitget" }, { - "titile": "bitget wallet", + "title": "bitget wallet", "slug": "bitget_wallet" }, { @@ -257,7 +257,7 @@ "title": "IceDrive" }, { - "titile": "Infomaniak" + "title": "Infomaniak" }, { "title": "ING" @@ -431,7 +431,7 @@ "title": "Odido" }, { - "titile": "OpenObserve", + "title": "OpenObserve", "slug": "open_observe", "altNames": [ "openobserve.ai", @@ -637,8 +637,7 @@ "title": "Upstox" }, { - "titile": "Vikunja", - "slug": "vikunja" + "title": "Vikunja" }, { "title": "Wealthfront" From dca50a4e458f2a5ad59038f1cd6f7d61fdb1c7e2 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 18:54:08 +0200 Subject: [PATCH 0870/1179] Refactor --- auth/assets/custom-icons/_data/custom-icons.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 842afc6dab..d1d90ff4f0 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -131,9 +131,6 @@ { "title": "ConfigCat" }, - { - "title": "ConfigCat" - }, { "title": "Control D", "slug": "controld" From 05bcfdc16e1c3fc18aaf83a5eeafa09c01180ab7 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 19:17:21 +0200 Subject: [PATCH 0871/1179] Fix TCPShield icon --- .../custom-icons/_data/custom-icons.json | 3 +- auth/assets/custom-icons/icons/tcpshield.svg | 35 +++++-------------- 2 files changed, 9 insertions(+), 29 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index d1d90ff4f0..dcd03b50e8 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -566,8 +566,7 @@ "slug": "synology_dsm" }, { - "title": "TCPShield", - "hex": "FFFFFF" + "title": "TCPShield" }, { "title": "Techlore", diff --git a/auth/assets/custom-icons/icons/tcpshield.svg b/auth/assets/custom-icons/icons/tcpshield.svg index 9f6ce24091..6e6914700f 100644 --- a/auth/assets/custom-icons/icons/tcpshield.svg +++ b/auth/assets/custom-icons/icons/tcpshield.svg @@ -1,27 +1,8 @@ - - TCPShield - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + From 0fc0a00f47644cf4e7b7171268eec08afcd624d3 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Fri, 30 Aug 2024 21:25:26 +0200 Subject: [PATCH 0872/1179] Add Battle.net icon --- auth/assets/custom-icons/_data/custom-icons.json | 8 ++++++++ auth/assets/custom-icons/icons/battlenet.svg | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 auth/assets/custom-icons/icons/battlenet.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index dcd03b50e8..aee0df534c 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -24,6 +24,14 @@ { "title": "AscendEX" }, + { + "title": "Battle.net", + "slug": "battlenet", + "altNames": [ + "Battle net", + "Blizzard" + ] + }, { "title": "Bethesda", "altNames": [ diff --git a/auth/assets/custom-icons/icons/battlenet.svg b/auth/assets/custom-icons/icons/battlenet.svg new file mode 100644 index 0000000000..023e205622 --- /dev/null +++ b/auth/assets/custom-icons/icons/battlenet.svg @@ -0,0 +1,10 @@ + + + + + + + + + + From 7500fdd380243e65b962643d181acd192f18d94d Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Wed, 28 Aug 2024 04:11:04 +0800 Subject: [PATCH 0873/1179] Request focus on the search box when clicked the search icon --- auth/lib/ui/home_page.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index 1e17947210..f9c6410d9d 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -55,6 +55,9 @@ class _HomePageState extends State { final Logger _logger = Logger("HomePage"); final scaffoldKey = GlobalKey(); + // Used to request focus on the search box when clicked the search icon + late FocusNode searchBoxFocusNode; + final TextEditingController _textController = TextEditingController(); final bool _autoFocusSearch = PreferenceService.instance.shouldAutoFocusOnSearchBar(); @@ -89,6 +92,8 @@ class _HomePageState extends State { setState(() {}); }); _showSearchBox = _autoFocusSearch; + + searchBoxFocusNode = FocusNode(); } void _loadCodes() { @@ -158,6 +163,9 @@ class _HomePageState extends State { _triggerLogoutEvent?.cancel(); _iconsChangedEvent?.cancel(); _textController.removeListener(_applyFilteringAndRefresh); + + searchBoxFocusNode.dispose(); + super.dispose(); } @@ -241,6 +249,7 @@ class _HomePageState extends State { border: InputBorder.none, focusedBorder: InputBorder.none, ), + focusNode: searchBoxFocusNode, ), centerTitle: true, actions: [ @@ -258,6 +267,12 @@ class _HomePageState extends State { _searchText = ""; } else { _searchText = _textController.text; + + // Request focus on the search box + // For Windows only for now. "Platform.isWindows" can be removed if other platforms has been tested. + if (Platform.isWindows) { + searchBoxFocusNode.requestFocus(); + } } _applyFilteringAndRefresh(); }, From a6359f07564296e60a01a1c49d6a93f686cacb2b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 2 Sep 2024 13:43:26 +0530 Subject: [PATCH 0874/1179] Prefer existing clusters when adding --- .../new/photos/services/ml/cluster.ts | 82 ++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 271cd6d491..6513b9432e 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -393,7 +393,8 @@ interface ClusterLinearResult { clusters: EmbeddingCluster[]; } -const clusterLinear = ( +// TODO-Cluster remove me +export const clusterLinear_Direct = ( embeddings: number[][], threshold: number, ): ClusterLinearResult => { @@ -454,3 +455,82 @@ const clusterLinear = ( return { clusters: validClusters }; }; + +const clusterLinear = ( + embeddings: number[][], + threshold: number, +): ClusterLinearResult => { + const clusters: EmbeddingCluster[] = []; + const clusterIndexForEmbeddingIndex = new Map(); + // For each embedding + for (const [i, ei] of embeddings.entries()) { + // If the embedding is already part of a cluster, then skip it. + if (clusterIndexForEmbeddingIndex.get(i)) continue; + + // Find the nearest neighbour from among all the other embeddings. + let nnIndex: number | undefined; + let nnCosineSimilarity = 0; + // Find the nearest cluster from among all the existing clusters. + let nClusterIndex: number | undefined; + let nClusterCosineSimilarity = 0; + for (const [j, ej] of embeddings.entries()) { + // ! This is an O(n^2) loop, be careful when adding more code here. + + // Skip ourselves. + if (i == j) continue; + + // The vectors are already normalized, so we can directly use their + // dot product as their cosine similarity. + const csim = dotProduct(ei, ej); + if (csim > threshold) { + if (csim > nnCosineSimilarity) { + nnIndex = j; + nnCosineSimilarity = csim; + } + if (csim > nClusterCosineSimilarity) { + const jClusterIndex = clusterIndexForEmbeddingIndex.get(j); + if (jClusterIndex) { + nClusterIndex = jClusterIndex; + nClusterCosineSimilarity = csim; + } + } + } + } + + if (nClusterIndex) { + // Found a neighbouring cluster close enough, add ourselves to that. + + ensure(clusters[nClusterIndex]).push(i); + clusterIndexForEmbeddingIndex.set(i, nClusterIndex); + } else if (nnIndex) { + // Find the cluster the nearest neighbour belongs to, if any. + const nnClusterIndex = clusterIndexForEmbeddingIndex.get(nnIndex); + + if (nnClusterIndex) { + // If the neighbour is already part of a cluster, also add + // ourselves to that cluster. + + ensure(clusters[nnClusterIndex]).push(i); + clusterIndexForEmbeddingIndex.set(i, nnClusterIndex); + } else { + // Otherwise create a new cluster with us and our nearest + // neighbour. + + clusterIndexForEmbeddingIndex.set(i, clusters.length); + clusterIndexForEmbeddingIndex.set(nnIndex, clusters.length); + clusters.push([i, nnIndex]); + } + } else { + // We didn't find a neighbour within the threshold. Create a new + // cluster with only this embedding. + + clusterIndexForEmbeddingIndex.set(i, clusters.length); + clusters.push([i]); + } + } + + // Prune singleton clusters. + const validClusters = clusters.filter((cs) => cs.length > 1); + + return { clusters: validClusters }; +}; From c0ad778c90d9fc5e4bff2711fa3adc2a480ad24d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 2 Sep 2024 13:56:00 +0530 Subject: [PATCH 0875/1179] Add min threshold --- web/apps/photos/src/pages/cluster-debug.tsx | 9 +++++++ .../new/photos/services/ml/cluster.ts | 25 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 6337daffd1..d2f921b532 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -112,6 +112,7 @@ const OptionsForm: React.FC = ({ onCluster }) => { method: "linear", minBlur: 10, minScore: 0.8, + minClusterSize: 2, joinThreshold: 0.7, batchSize: 12500, }, @@ -120,6 +121,7 @@ const OptionsForm: React.FC = ({ onCluster }) => { method: values.method, minBlur: toFloat(values.minBlur), minScore: toFloat(values.minScore), + minClusterSize: toFloat(values.minClusterSize), joinThreshold: toFloat(values.joinThreshold), batchSize: toFloat(values.batchSize), }), @@ -162,6 +164,13 @@ const OptionsForm: React.FC = ({ onCluster }) => { size="small" onChange={handleChange} /> + { - const { method, batchSize, minBlur, minScore, joinThreshold } = opts; + const { + method, + batchSize, + minBlur, + minScore, + minClusterSize, + joinThreshold, + } = opts; const t = Date.now(); // A flattened array of faces. @@ -299,7 +307,12 @@ export const clusterFaces = ( } } - const sortedClusters = clusters.sort( + // Prune clusters that are smaller than the threshold. + const validClusters = clusters.filter( + (cs) => cs.faceIDs.length > minClusterSize, + ); + + const sortedClusters = validClusters.sort( (a, b) => b.faceIDs.length - a.faceIDs.length, ); @@ -361,7 +374,7 @@ export const clusterFaces = ( const timeTakenMs = Date.now() - t; log.info( - `Clustered ${faces.length} faces into ${clusters.length} clusters, ${faces.length - clusterIDForFaceID.size} faces remain unclustered (${timeTakenMs} ms)`, + `Clustered ${faces.length} faces into ${sortedClusters.length} clusters, ${faces.length - clusterIDForFaceID.size} faces remain unclustered (${timeTakenMs} ms)`, ); return { @@ -507,11 +520,13 @@ const clusterLinear = ( const nnClusterIndex = clusterIndexForEmbeddingIndex.get(nnIndex); if (nnClusterIndex) { + // TODO-Cluster remove this case. // If the neighbour is already part of a cluster, also add // ourselves to that cluster. - ensure(clusters[nnClusterIndex]).push(i); - clusterIndexForEmbeddingIndex.set(i, nnClusterIndex); + // ensure(clusters[nnClusterIndex]).push(i); + // clusterIndexForEmbeddingIndex.set(i, nnClusterIndex); + throw new Error("We shouldn't have reached here"); } else { // Otherwise create a new cluster with us and our nearest // neighbour. From ab86c5129e5498146b8b8addddb6f990fcbc6a4f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 2 Sep 2024 14:46:52 +0530 Subject: [PATCH 0876/1179] [mob][photos] Refactor --- mobile/lib/core/configuration.dart | 9 --------- mobile/lib/ui/viewer/file/file_app_bar.dart | 10 +++++----- .../file/native_video_player_controls/seek_bar.dart | 4 ++-- mobile/lib/ui/viewer/file/video_widget_native.dart | 5 ++--- mobile/lib/utils/local_settings.dart | 9 +++++++++ 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index 70db6c3d96..16a65d497f 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -71,7 +71,6 @@ class Configuration { "has_selected_all_folders_for_backup"; static const anonymousUserIDKey = "anonymous_user_id"; static const endPointKey = "endpoint"; - static const shouldLoopVideoKey = "should_loop_video"; static final _logger = Logger("Configuration"); String? _cachedToken; @@ -662,14 +661,6 @@ class Configuration { await _preferences.setBool(hasSelectedAllFoldersForBackupKey, value); } - Future setShouldLoopVideo(bool value) async { - await _preferences.setBool(shouldLoopVideoKey, value); - } - - bool shouldLoopVideo() { - return _preferences.getBool(shouldLoopVideoKey) ?? true; - } - Future _migrateSecurityStorageToFirstUnlock() async { final hasMigratedSecureStorage = _preferences.getBool(hasMigratedSecureStorageKey) ?? false; diff --git a/mobile/lib/ui/viewer/file/file_app_bar.dart b/mobile/lib/ui/viewer/file/file_app_bar.dart index 8913790766..67b10bb9ad 100644 --- a/mobile/lib/ui/viewer/file/file_app_bar.dart +++ b/mobile/lib/ui/viewer/file/file_app_bar.dart @@ -6,7 +6,6 @@ import "package:flutter_svg/flutter_svg.dart"; import "package:local_auth/local_auth.dart"; import 'package:logging/logging.dart'; import 'package:media_extension/media_extension.dart'; -import "package:photos/core/configuration.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/guest_view_event.dart"; import "package:photos/generated/l10n.dart"; @@ -17,6 +16,7 @@ import 'package:photos/models/file/file_type.dart'; import 'package:photos/models/file/trash_file.dart'; import "package:photos/models/metadata/common_keys.dart"; import 'package:photos/models/selected_files.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/hidden_service.dart'; import "package:photos/services/local_authentication_service.dart"; @@ -44,8 +44,8 @@ class FileAppBar extends StatefulWidget { this.height, this.shouldShowActions, { required this.enableFullScreenNotifier, - Key? key, - }) : super(key: key); + super.key, + }); @override FileAppBarState createState() => FileAppBarState(); @@ -56,7 +56,7 @@ class FileAppBarState extends State { final List _actions = []; late final StreamSubscription _guestViewEventSubscription; bool isGuestView = false; - bool shouldLoopVideo = Configuration.instance.shouldLoopVideo(); + bool shouldLoopVideo = localSettings.shouldLoopVideo(); bool _reloadActions = false; @override @@ -390,7 +390,7 @@ class FileAppBarState extends State { } _onToggleLoopVideo() { - Configuration.instance.setShouldLoopVideo(!shouldLoopVideo); + localSettings.setShouldLoopVideo(!shouldLoopVideo); setState(() { _reloadActions = true; shouldLoopVideo = !shouldLoopVideo; diff --git a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart index f57d772566..f37791d56e 100644 --- a/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart +++ b/mobile/lib/ui/viewer/file/native_video_player_controls/seek_bar.dart @@ -2,7 +2,7 @@ import "dart:async"; import "package:flutter/material.dart"; import "package:native_video_player/native_video_player.dart"; -import "package:photos/core/configuration.dart"; +import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/utils/debouncer.dart"; @@ -149,7 +149,7 @@ class _SeekBarState extends State with SingleTickerProviderStateMixin { setState(() { _animationController.value = 0; }); - if (!Configuration.instance.shouldLoopVideo()) { + if (!localSettings.shouldLoopVideo()) { return; } } diff --git a/mobile/lib/ui/viewer/file/video_widget_native.dart b/mobile/lib/ui/viewer/file/video_widget_native.dart index 268bdec5e2..4281d405df 100644 --- a/mobile/lib/ui/viewer/file/video_widget_native.dart +++ b/mobile/lib/ui/viewer/file/video_widget_native.dart @@ -4,15 +4,14 @@ import "dart:io"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; import "package:native_video_player/native_video_player.dart"; -import "package:photos/core/configuration.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/events/guest_view_event.dart"; import "package:photos/events/pause_video_event.dart"; -// import "package:photos/events/pause_video_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/extensions/file_props.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/files_service.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; @@ -348,7 +347,7 @@ class _VideoWidgetNativeState extends State } void _onPlaybackEnded() { - if (Configuration.instance.shouldLoopVideo()) { + if (localSettings.shouldLoopVideo()) { _controller?.play(); } } diff --git a/mobile/lib/utils/local_settings.dart b/mobile/lib/utils/local_settings.dart index cdf0b6ef63..cc657c369e 100644 --- a/mobile/lib/utils/local_settings.dart +++ b/mobile/lib/utils/local_settings.dart @@ -14,6 +14,7 @@ class LocalSettings { static const kRateUsShownCount = "rate_us_shown_count"; static const kEnableMultiplePart = "ls.enable_multiple_part"; static const kRateUsPromptThreshold = 2; + static const shouldLoopVideoKey = "video.should_loop"; final SharedPreferences _prefs; @@ -82,4 +83,12 @@ class LocalSettings { await _prefs.setBool("remoteFetchEnabled", !remoteFetchEnabled); } //#endregion + + Future setShouldLoopVideo(bool value) async { + await _prefs.setBool(shouldLoopVideoKey, value); + } + + bool shouldLoopVideo() { + return _prefs.getBool(shouldLoopVideoKey) ?? true; + } } From b90a719972c13b479806f66c2101fbc32293a88c Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 2 Sep 2024 11:24:57 +0200 Subject: [PATCH 0877/1179] [mob][photos] Cleaner indication of isolate logging --- mobile/lib/core/error-reporting/isolate_logging.dart | 2 +- mobile/lib/core/error-reporting/super_logging.dart | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mobile/lib/core/error-reporting/isolate_logging.dart b/mobile/lib/core/error-reporting/isolate_logging.dart index 0d686178f8..5521e0748d 100644 --- a/mobile/lib/core/error-reporting/isolate_logging.dart +++ b/mobile/lib/core/error-reporting/isolate_logging.dart @@ -28,7 +28,7 @@ class IsolateLogger { final Queue fileQueueEntries = Queue(); Future onLogRecordInIsolate(LogRecord rec) async { - final str = "[ISOLATE]" + rec.toPrettyString(); + final str = rec.toPrettyString(null, true); // write to stdout SuperLogging.printLog(str); diff --git a/mobile/lib/core/error-reporting/super_logging.dart b/mobile/lib/core/error-reporting/super_logging.dart index f146b1b14c..c71cea8254 100644 --- a/mobile/lib/core/error-reporting/super_logging.dart +++ b/mobile/lib/core/error-reporting/super_logging.dart @@ -38,8 +38,9 @@ extension SuperString on String { } extension SuperLogRecord on LogRecord { - String toPrettyString([String? extraLines]) { - final header = "[$loggerName] [$level] [$time]"; + String toPrettyString([String? extraLines, bool inIsolate = false]) { + final header = + "[$loggerName${inIsolate ? " (in isolate)" : ""}] [$level] [$time]"; var msg = "$header $message"; From dcac2332965bbcb0f7dd99b156158761dc7364a9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 2 Sep 2024 11:50:06 +0200 Subject: [PATCH 0878/1179] [mob][photos] refactor --- .../lib/core/error-reporting/isolate_logging.dart | 4 ++-- .../services/machine_learning/ml_computer.dart | 15 ++++++++------- mobile/lib/ui/settings/ml/ml_user_dev_screen.dart | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/mobile/lib/core/error-reporting/isolate_logging.dart b/mobile/lib/core/error-reporting/isolate_logging.dart index 5521e0748d..5ac74b6303 100644 --- a/mobile/lib/core/error-reporting/isolate_logging.dart +++ b/mobile/lib/core/error-reporting/isolate_logging.dart @@ -49,9 +49,9 @@ class IsolateLogger { } /// WARNING: only call this from the main thread - static void handLogStringsToMainLogger(Queue logs) { + static void handLogStringsToMainLogger(List logs) { while (logs.isNotEmpty) { - final logString = logs.removeFirst(); + final logString = logs.removeAt(0); final log = IsolateLogString.fromJsonString(logString); SuperLogging.saveLogString(log.logString, log.error); } diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index f027208758..f0e01d4c7d 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -114,8 +114,8 @@ class MLComputer { logger.info("XXX logging from isolate is working!!!"); final Queue logStrings = isolateLogger.getLogStringsAndClear(); - final test = [List.from(logStrings)]; - sendPort.send(test); + final logs = List.from(logStrings); + sendPort.send({"data": true, "logs": logs}); break; } } catch (e, stackTrace) { @@ -233,16 +233,17 @@ class MLComputer { }); } - Future testLogging() async { + Future testLogging() async { try { - final test = await _runInIsolate( + final result = await _runInIsolate( ( MLComputerOperation.testLogging, {}, ), - ) as List>; - IsolateLogger.handLogStringsToMainLogger(Queue.from(test[0])); - return; + ) as Map; + final logs = result['logs'] as List; + IsolateLogger.handLogStringsToMainLogger(logs); + return result['data'] as bool; } catch (e, s) { _logger.severe("XXX Could not test logging in isolate", e, s); rethrow; diff --git a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart index 7c4d808592..1f75c95d5b 100644 --- a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart +++ b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart @@ -62,8 +62,8 @@ class MLUserDeveloperOptions extends StatelessWidget { buttonType: ButtonType.neutral, labelText: "Log something in isolate", onTap: () async { - await MLComputer.instance.testLogging(); - showShortToast(context, "Done"); + final boolean = await MLComputer.instance.testLogging(); + showShortToast(context, "Done: $boolean"); }, ), const SafeArea( From 5fef369e91c2ff54b999a550ed5a5ce21b0bd26c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:47:29 +0530 Subject: [PATCH 0879/1179] [mob] Surface backup status --- .../settings/backup/backup_section_widget.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mobile/lib/ui/settings/backup/backup_section_widget.dart b/mobile/lib/ui/settings/backup/backup_section_widget.dart index 183b79b203..56ef0e02f7 100644 --- a/mobile/lib/ui/settings/backup/backup_section_widget.dart +++ b/mobile/lib/ui/settings/backup/backup_section_widget.dart @@ -6,6 +6,7 @@ import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart'; import 'package:photos/ui/settings/backup/backup_settings_screen.dart'; +import "package:photos/ui/settings/backup/backup_status_screen.dart"; import "package:photos/ui/settings/backup/free_space_options.dart"; import 'package:photos/ui/settings/common_settings.dart'; import 'package:photos/utils/navigation_util.dart'; @@ -47,6 +48,21 @@ class BackupSectionWidgetState extends State { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).backupStatus, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + await routeToPage( + context, + const BackupStatusScreen(), + ); + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).backupSettings, From 28e691122fa5ffcd5c6960c72237c5c641a280d2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:20:57 +0530 Subject: [PATCH 0880/1179] [mob] Fix translations --- mobile/lib/generated/intl/messages_all.dart | 4 + mobile/lib/generated/intl/messages_da.dart | 2 - mobile/lib/generated/intl/messages_de.dart | 2 +- mobile/lib/generated/intl/messages_en.dart | 5 + mobile/lib/generated/intl/messages_es.dart | 2 - mobile/lib/generated/intl/messages_fa.dart | 2 - mobile/lib/generated/intl/messages_fr.dart | 41 ++++- mobile/lib/generated/intl/messages_he.dart | 8 +- mobile/lib/generated/intl/messages_hi.dart | 2 - mobile/lib/generated/intl/messages_id.dart | 74 +++++++- mobile/lib/generated/intl/messages_it.dart | 193 +++++++++++++++++++- mobile/lib/generated/intl/messages_nl.dart | 9 +- mobile/lib/generated/intl/messages_no.dart | 4 +- mobile/lib/generated/intl/messages_pl.dart | 6 +- mobile/lib/generated/intl/messages_pt.dart | 6 +- mobile/lib/generated/intl/messages_ru.dart | 39 +++- mobile/lib/generated/intl/messages_sv.dart | 3 +- mobile/lib/generated/intl/messages_ta.dart | 53 ++++++ mobile/lib/generated/intl/messages_th.dart | 2 - mobile/lib/generated/intl/messages_tr.dart | 2 - mobile/lib/generated/intl/messages_zh.dart | 5 +- mobile/lib/generated/l10n.dart | 21 +++ mobile/lib/l10n/intl_en.arb | 2 + mobile/lib/l10n/intl_he.arb | 7 +- mobile/lib/l10n/intl_no.arb | 5 +- mobile/lib/l10n/intl_sv.arb | 2 +- 26 files changed, 455 insertions(+), 46 deletions(-) create mode 100644 mobile/lib/generated/intl/messages_ta.dart diff --git a/mobile/lib/generated/intl/messages_all.dart b/mobile/lib/generated/intl/messages_all.dart index fee2ce02b3..3d9620100b 100644 --- a/mobile/lib/generated/intl/messages_all.dart +++ b/mobile/lib/generated/intl/messages_all.dart @@ -42,6 +42,7 @@ import 'messages_pl.dart' as messages_pl; import 'messages_pt.dart' as messages_pt; import 'messages_ru.dart' as messages_ru; import 'messages_sv.dart' as messages_sv; +import 'messages_ta.dart' as messages_ta; import 'messages_te.dart' as messages_te; import 'messages_th.dart' as messages_th; import 'messages_ti.dart' as messages_ti; @@ -76,6 +77,7 @@ Map _deferredLibraries = { 'pt': () => new SynchronousFuture(null), 'ru': () => new SynchronousFuture(null), 'sv': () => new SynchronousFuture(null), + 'ta': () => new SynchronousFuture(null), 'te': () => new SynchronousFuture(null), 'th': () => new SynchronousFuture(null), 'ti': () => new SynchronousFuture(null), @@ -137,6 +139,8 @@ MessageLookupByLibrary? _findExact(String localeName) { return messages_ru.messages; case 'sv': return messages_sv.messages; + case 'ta': + return messages_ta.messages; case 'te': return messages_te.messages; case 'th': diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index f243887b61..2209983e4e 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -43,8 +43,6 @@ class MessageLookup extends MessageLookupByLibrary { "cancel": MessageLookupByLibrary.simpleMessage("Annuller"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, jeg ønsker at slette denne konto og alle dens data permanent."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Bekræft adgangskode"), "copypasteThisCodentoYourAuthenticatorApp": diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 90dc0b7f0d..4004a561cd 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -518,7 +518,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Kontolöschung bestätigen"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, ich möchte dieses Konto und alle enthaltenen Daten endgültig und unwiderruflich löschen."), + "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps endgültig und unwiderruflich löschen."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Passwort wiederholen"), "confirmPlanChange": diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 9eaa0d5e5e..8ac868cb94 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -206,6 +206,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 day', other: '${count} days')}"; + static String m72(count) => "Preserving ${count} memories..."; + static String m67(endDate) => "Valid till ${endDate}"; static String m68(email) => "Verify ${email}"; @@ -1607,6 +1609,9 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Uploading files to album..."), + "uploadingMultipleMemories": m72, + "uploadingSingleMemory": + MessageLookupByLibrary.simpleMessage("Preserving 1 memory..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Upto 50% off, until 4th Dec."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 479c1538a0..5395aaf930 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -492,8 +492,6 @@ class MessageLookup extends MessageLookupByLibrary { "¿Estás seguro de que deseas deshabilitar la autenticación de doble factor?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Confirmar borrado de cuenta"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Sí, quiero eliminar permanentemente esta cuenta y todos sus datos."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Confirmar contraseña"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index b6650a943a..0332b402f3 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -113,8 +113,6 @@ class MessageLookup extends MessageLookupByLibrary { "confirm": MessageLookupByLibrary.simpleMessage("تایید"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("تایید حذف حساب کاربری"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "بله، من می‌خواهم برای همیشه این حساب کاربری و تمام اطلاعات آن را حذف کنم."), "confirmPassword": MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), "confirmRecoveryKey": diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index af1060e22b..eb1159068d 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -128,6 +128,11 @@ class MessageLookup extends MessageLookupByLibrary { static String m38(albumName) => "Déplacé avec succès vers ${albumName}"; + static String m39(name) => "Pas ${name}?"; + + static String m40(familyAdminEmail) => + "Veuillez contacter ${familyAdminEmail} pour modifier votre code."; + static String m41(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; @@ -310,6 +315,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Authentification requise"), "appLock": MessageLookupByLibrary.simpleMessage( "Verrouillage d\'applications"), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Choisissez entre l\'écran de verrouillage par défaut de votre appareil et un écran de verrouillage personnalisé avec un code PIN ou un mot de passe."), "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Appliquer"), @@ -358,6 +365,8 @@ class MessageLookup extends MessageLookupByLibrary { "Veuillez vous authentifier pour configurer l\'authentification à deux facteurs"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour débuter la suppression du compte"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Veuillez vous authentifier pour afficher votre clé de récupération"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Veuillez vous authentifier pour voir vos sessions actives"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -516,7 +525,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "Confirmer la suppression du compte"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Oui, je veux supprimer définitivement ce compte et toutes ses données."), + "Oui, je veux supprimer définitivement ce compte et ses données dans toutes les applications."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Confirmer le mot de passe"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( @@ -572,6 +581,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Création du lien..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( "Mise à jour critique disponible"), + "crop": MessageLookupByLibrary.simpleMessage("Rogner"), "currentUsageIs": MessageLookupByLibrary.simpleMessage( "L\'utilisation actuelle est "), "custom": MessageLookupByLibrary.simpleMessage("Personnaliser"), @@ -708,9 +718,13 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Vider"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Vider la corbeille ?"), + "enable": MessageLookupByLibrary.simpleMessage("Activer"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente prend en charge l\'apprentissage automatique sur l\'appareil pour la reconnaissance faciale, la recherche magique et d\'autres fonctionnalités de recherche avancée"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activer la carte"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Vos photos seront affichées sur une carte du monde.\n\nCette carte est hébergée par Open Street Map, et les emplacements exacts de vos photos ne sont jamais partagés.\n\nVous pouvez désactiver cette fonction à tout moment dans les Paramètres."), + "enabled": MessageLookupByLibrary.simpleMessage("Activé"), "encryptingBackup": MessageLookupByLibrary.simpleMessage( "Chiffrement de la sauvegarde..."), "encryption": MessageLookupByLibrary.simpleMessage("Chiffrement"), @@ -852,6 +866,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Accorder la permission"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Grouper les photos à proximité"), + "guestView": MessageLookupByLibrary.simpleMessage("Vue invité"), + "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( + "Pour activer la vue invité, veuillez configurer le code d\'accès de l\'appareil ou le verrouillage de l\'écran dans les paramètres de votre système."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Nous ne suivons pas les installations d\'applications. Il serait utile que vous nous disiez comment vous nous avez trouvés !"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -1015,6 +1032,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Apprentissage automatique"), "magicSearch": MessageLookupByLibrary.simpleMessage("Recherche magique"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "La recherche magique permet de rechercher des photos par leur contenu, par exemple \'fleur\', \'voiture rouge\', \'documents d\'identité\'"), "manage": MessageLookupByLibrary.simpleMessage("Gérer"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Gérer le stockage de l\'appareil"), @@ -1032,6 +1051,18 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Marchandise"), + "mlConsent": MessageLookupByLibrary.simpleMessage( + "Activer l\'apprentissage automatique"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Je comprends, et souhaite activer l\'apprentissage automatique"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Si vous activez l\'apprentissage automatique, Ente extraira des informations comme la géométrie des visages, incluant les photos partagées avec vous. \nCela se fera sur votre appareil, avec un cryptage de bout-en-bout de toutes les données biométriques générées."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Veuillez cliquer ici pour plus de détails sur cette fonctionnalité dans notre politique de confidentialité"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage( + "Activer l\'apprentissage automatique ?"), + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "Veuillez noter que l\'apprentissage automatique entraînera une augmentation de l\'utilisation de la bande passante et de la batterie, jusqu\'à ce que tous les éléments soient indexés. \nEnvisagez d\'utiliser l\'application de bureau pour une indexation plus rapide, tous les résultats seront automatiquement synchronisés."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Ordinateur"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moyen"), @@ -1040,6 +1071,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modifiez votre requête, ou essayez de rechercher"), "moments": MessageLookupByLibrary.simpleMessage("Souvenirs"), "monthly": MessageLookupByLibrary.simpleMessage("Mensuel"), + "moreDetails": MessageLookupByLibrary.simpleMessage("Plus de détails"), "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Déplacer vers l\'album"), @@ -1093,6 +1125,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Aucun verrou système trouvé"), + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Rien n\'a encore été partagé avec vous"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1102,6 +1135,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sur l\'appareil"), "onEnte": MessageLookupByLibrary.simpleMessage( "Sur ente"), + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Oups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oups, impossible d\'enregistrer les modifications"), @@ -1328,6 +1362,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Restaurer vers l\'album"), "restoringFiles": MessageLookupByLibrary.simpleMessage( "Restauration des fichiers..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Chargements à poursuivre"), "retry": MessageLookupByLibrary.simpleMessage("Réessayer"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Veuillez vérifier et supprimer les éléments que vous croyez dupliqués."), @@ -1626,6 +1662,7 @@ class MessageLookup extends MessageLookupByLibrary { "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), "trashDaysLeft": m66, + "trim": MessageLookupByLibrary.simpleMessage("Recadrer"), "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Activez la sauvegarde pour charger automatiquement sur Ente les fichiers ajoutés à ce dossier de l\'appareil."), @@ -1718,6 +1755,8 @@ class MessageLookup extends MessageLookupByLibrary { "Visualiser toutes les données EXIF"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Fichiers volumineux"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "Afficher les fichiers qui consomment le plus de stockage."), "viewLogs": MessageLookupByLibrary.simpleMessage("Afficher les journaux"), "viewRecoveryKey": diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index e27bbe712b..8b792cdcdb 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -24,7 +24,7 @@ class MessageLookup extends MessageLookupByLibrary { "${Intl.plural(count, one: 'הוסף פריט', two: 'הוסף פריטים', many: 'הוסף פריטים', other: 'הוסף פריטים')}"; static String m9(count) => - "${Intl.plural(count, zero: 'אין משתתפים', one: '1 משתתף', two: '${count} משתתפים', many: '${count} משתתפים', other: '${count} משתתפים')}"; + "${Intl.plural(count, zero: 'אין משתתפים', one: '1 משתתף', two: '2 משתתפים', other: '${count} משתתפים')}"; static String m12(paymentProvider) => "אנא בטל את המנוי הקיים מ-${paymentProvider} קודם"; @@ -46,7 +46,7 @@ class MessageLookup extends MessageLookupByLibrary { "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי ${provider}."; static String m19(count) => - "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', many: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; + "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; static String m20(currentlyDeleting, totalCount) => "מוחק ${currentlyDeleting} / ${totalCount}"; @@ -103,7 +103,7 @@ class MessageLookup extends MessageLookupByLibrary { "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: ${verificationID}"; static String m54(numberOfPeople) => - "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם ${numberOfPeople} אנשים', many: 'שותף עם ${numberOfPeople} אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; + "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם 2 אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; static String m55(emailIDs) => "הושתף ע\"י ${emailIDs}"; @@ -295,8 +295,6 @@ class MessageLookup extends MessageLookupByLibrary { "האם אתה בטוח שאתה רוצה להשבית את האימות הדו-גורמי?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("אשר את מחיקת החשבון"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "כן, אני רוצה למחוק לצמיתות את החשבון הזה וכל המידע שלו."), "confirmPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage("אשר שינוי תוכנית"), diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index ce390ea7e0..ff4756d8d4 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -30,8 +30,6 @@ class MessageLookup extends MessageLookupByLibrary { "cancel": MessageLookupByLibrary.simpleMessage("रद्द करें"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "अकाउंट डिलीट करने की पुष्टि करें"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "हां, मैं इस अकाउंट और इसके सभी डेटा को स्थायी रूप से हटाना चाहता/चाहती हूं।"), "confirmPassword": MessageLookupByLibrary.simpleMessage("पासवर्ड की पुष्टि करें"), "createAccount": MessageLookupByLibrary.simpleMessage("अकाउंट बनायें"), diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 3d0cee4c14..ad25710471 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -25,6 +25,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m4(count) => "${Intl.plural(count, other: 'Tambahkan item')}"; + static String m5(storageAmount, endDate) => + "Add-on ${storageAmount} kamu berlaku sampai ${endDate}"; + static String m7(emailOrName) => "Ditambahkan oleh ${emailOrName}"; static String m8(albumName) => "Berhasil ditambahkan ke ${albumName}"; @@ -37,6 +40,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m11(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} tersedia"; + static String m12(paymentProvider) => + "Harap batalkan langganan kamu dari ${paymentProvider} terlebih dahulu"; + static String m13(user) => "${user} tidak akan dapat menambahkan foto lagi di album ini\n\nMereka masih dapat menghapus foto yang sudah ada yang ditambahkan oleh mereka"; @@ -117,6 +123,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m41(passwordStrengthValue) => "Keamanan sandi: ${passwordStrengthValue}"; + static String m42(providerName) => + "Harap hubungi dukungan ${providerName} jika kamu dikenai biaya"; + static String m43(endDate) => "Percobaan gratis berlaku hingga ${endDate}.\nKamu dapat memilih paket berbayar setelahnya."; @@ -201,6 +210,7 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( "Versi baru dari Ente telah tersedia."), + "about": MessageLookupByLibrary.simpleMessage("Tentang"), "account": MessageLookupByLibrary.simpleMessage("Akun"), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), @@ -219,6 +229,7 @@ class MessageLookup extends MessageLookupByLibrary { "addLocation": MessageLookupByLibrary.simpleMessage("Tambah tempat"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Tambah"), "addMore": MessageLookupByLibrary.simpleMessage("Tambah lagi"), + "addOnValidTill": m5, "addPhotos": MessageLookupByLibrary.simpleMessage("Tambah foto"), "addSelected": MessageLookupByLibrary.simpleMessage("Tambahkan yang dipilih"), @@ -275,6 +286,8 @@ class MessageLookup extends MessageLookupByLibrary { "appleId": MessageLookupByLibrary.simpleMessage("ID Apple"), "apply": MessageLookupByLibrary.simpleMessage("Terapkan"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Terapkan kode"), + "appstoreSubscription": + MessageLookupByLibrary.simpleMessage("Langganan AppStore"), "archive": MessageLookupByLibrary.simpleMessage("Arsip"), "archiveAlbum": MessageLookupByLibrary.simpleMessage("Arsipkan album"), "archiving": MessageLookupByLibrary.simpleMessage("Mengarsipkan..."), @@ -301,6 +314,8 @@ class MessageLookup extends MessageLookupByLibrary { "authToChangeEmailVerificationSetting": MessageLookupByLibrary.simpleMessage( "Harap autentikasi untuk mengatur verifikasi email"), + "authToChangeLockscreenSetting": MessageLookupByLibrary.simpleMessage( + "Lakukan autentikasi untuk mengubah pengaturan kunci layar"), "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( "Harap autentikasi untuk mengubah email kamu"), "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage( @@ -343,6 +358,10 @@ class MessageLookup extends MessageLookupByLibrary { "Cadangkan dengan data seluler"), "backupSettings": MessageLookupByLibrary.simpleMessage("Pengaturan pencadangan"), + "backupStatus": + MessageLookupByLibrary.simpleMessage("Status pencadangan"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Item yang sudah dicadangkan akan terlihat di sini"), "backupVideos": MessageLookupByLibrary.simpleMessage("Cadangkan video"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("Penawaran Black Friday"), @@ -352,9 +371,12 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Hanya dapat menghapus berkas yang dimiliki oleh mu"), "cancel": MessageLookupByLibrary.simpleMessage("Batal"), + "cancelOtherSubscription": m12, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Batalkan langganan"), "cannotAddMorePhotosAfterBecomingViewer": m13, + "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( + "Tidak dapat menghapus file berbagi"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( "Harap pastikan kamu berada pada jaringan yang sama dengan TV-nya."), "castIPMismatchTitle": @@ -371,8 +393,11 @@ class MessageLookup extends MessageLookupByLibrary { "changePermissions": MessageLookupByLibrary.simpleMessage("Ubah izin?"), "changeYourReferralCode": MessageLookupByLibrary.simpleMessage("Ganti kode rujukan kamu"), + "checkForUpdates": + MessageLookupByLibrary.simpleMessage("Periksa pembaruan"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Silakan periksa kotak masuk (serta kotak spam) untuk menyelesaikan verifikasi"), + "checkStatus": MessageLookupByLibrary.simpleMessage("Periksa status"), "checking": MessageLookupByLibrary.simpleMessage("Memeriksa..."), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Peroleh kuota gratis"), @@ -380,6 +405,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Peroleh lebih banyak!"), "claimed": MessageLookupByLibrary.simpleMessage("Diperoleh"), "claimedStorageSoFar": m14, + "clearIndexes": MessageLookupByLibrary.simpleMessage("Hapus indeks"), "click": MessageLookupByLibrary.simpleMessage("• Click"), "close": MessageLookupByLibrary.simpleMessage("Tutup"), "codeAppliedPageTitle": @@ -409,7 +435,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Konfirmasi Penghapusan Akun"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ya, saya ingin menghapus akun ini dan seluruh data yang terkait secara permanen."), + "Ya, saya ingin menghapus akun ini dan seluruh datanya secara permanen di semua aplikasi."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Konfirmasi sandi"), "confirmPlanChange": @@ -440,6 +466,8 @@ class MessageLookup extends MessageLookupByLibrary { "Kami tidak dapat mencadangkan data kamu.\nKami akan coba lagi nanti."), "couldNotFreeUpSpace": MessageLookupByLibrary.simpleMessage( "Tidak dapat membersihkan ruang"), + "couldNotUpdateSubscription": MessageLookupByLibrary.simpleMessage( + "Tidak dapat memperbarui langganan"), "count": MessageLookupByLibrary.simpleMessage("Jumlah"), "crashReporting": MessageLookupByLibrary.simpleMessage("Pelaporan crash"), @@ -519,6 +547,8 @@ class MessageLookup extends MessageLookupByLibrary { "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Masukkan kode"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( "File yang ditambahkan ke album perangkat ini akan diunggah ke Ente secara otomatis."), + "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( + "Nonaktfikan kunci layar perangkat saat Ente berada di latar depan dan ada pencadangan yang sedang berlangsung. Hal ini biasanya tidak diperlukan, namun dapat membantu unggahan dan import awal berkas berkas besar selesai lebih cepat."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Perangkat tidak ditemukan"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Tahukah kamu?"), @@ -732,6 +762,8 @@ class MessageLookup extends MessageLookupByLibrary { "Proses indeks dijeda, dan akan otomatis dilanjutkan saat perangkat siap."), "insecureDevice": MessageLookupByLibrary.simpleMessage("Perangkat tidak aman"), + "installManually": + MessageLookupByLibrary.simpleMessage("Instal secara manual"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Alamat email tidak sah"), "invalidEndpoint": @@ -802,8 +834,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Memuat fotomu..."), "loadingModel": MessageLookupByLibrary.simpleMessage("Mengunduh model..."), + "localGallery": MessageLookupByLibrary.simpleMessage("Galeri lokal"), "locationName": MessageLookupByLibrary.simpleMessage("Nama tempat"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Kunci"), + "lockscreen": MessageLookupByLibrary.simpleMessage("Kunci layar"), "logInLabel": MessageLookupByLibrary.simpleMessage("Masuk akun"), "loggingOut": MessageLookupByLibrary.simpleMessage("Mengeluarkan akun..."), @@ -837,6 +871,7 @@ class MessageLookup extends MessageLookupByLibrary { "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m0, + "merchandise": MessageLookupByLibrary.simpleMessage("Barang Dagangan"), "mlConsent": MessageLookupByLibrary.simpleMessage("Aktifkan pemelajaran mesin"), "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( @@ -868,6 +903,7 @@ class MessageLookup extends MessageLookupByLibrary { "Tidak dapat terhubung dengan Ente, harap periksa pengaturan jaringan kamu dan hubungi dukungan jika masalah berlanjut."), "never": MessageLookupByLibrary.simpleMessage("Tidak pernah"), "newAlbum": MessageLookupByLibrary.simpleMessage("Album baru"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Baru di Ente"), "no": MessageLookupByLibrary.simpleMessage("Tidak"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( "Belum ada album yang kamu bagikan"), @@ -884,6 +920,9 @@ class MessageLookup extends MessageLookupByLibrary { "Tidak ada foto atau video tersembunyi"), "noInternetConnection": MessageLookupByLibrary.simpleMessage("Tidak ada koneksi internet"), + "noPhotosAreBeingBackedUpRightNow": + MessageLookupByLibrary.simpleMessage( + "Tidak ada foto yang sedang dicadangkan sekarang"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Tidak ada foto di sini"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage( @@ -938,7 +977,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pembayaran gagal"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!"), + "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Item menunggu"), + "pendingSync": + MessageLookupByLibrary.simpleMessage("Sinkronisasi yang tertunda"), "people": MessageLookupByLibrary.simpleMessage("Orang"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( "Orang yang telah menggunakan kodemu"), @@ -959,6 +1001,8 @@ class MessageLookup extends MessageLookupByLibrary { "Foto yang telah kamu tambahkan akan dihapus dari album ini"), "playOnTv": MessageLookupByLibrary.simpleMessage("Putar album di TV"), "playStoreFreeTrialValidTill": m43, + "playstoreSubscription": + MessageLookupByLibrary.simpleMessage("Langganan PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": MessageLookupByLibrary.simpleMessage( "Silakan periksa koneksi internet kamu, lalu coba lagi."), @@ -1002,6 +1046,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Link publik aktif"), "radius": MessageLookupByLibrary.simpleMessage("Radius"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Nilai app ini"), + "rateUs": MessageLookupByLibrary.simpleMessage("Beri kami nilai"), "rateUsOnStore": m46, "recover": MessageLookupByLibrary.simpleMessage("Pulihkan"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Pulihkan akun"), @@ -1031,8 +1076,15 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ia perlu daftar ke paket berbayar"), "referralStep3": m47, + "referrals": MessageLookupByLibrary.simpleMessage("Referensi"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("Rujukan sedang dijeda"), + "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( + "Kosongkan juga “Baru Saja Dihapus” dari “Pengaturan” -> “Penyimpanan” untuk mengklaim ruang yang baru dikosongkan"), + "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( + "Kosongkan juga \"Sampah\" untuk mendapatkan ruang yang baru dikosongkan"), + "remoteThumbnails": + MessageLookupByLibrary.simpleMessage("Thumbnail jarak jauh"), "remove": MessageLookupByLibrary.simpleMessage("Hapus"), "removeDuplicates": MessageLookupByLibrary.simpleMessage("Hapus duplikat"), @@ -1124,6 +1176,8 @@ class MessageLookup extends MessageLookupByLibrary { "selectItemsToAdd": MessageLookupByLibrary.simpleMessage( "Pilih item untuk ditambahkan"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Pilih Bahasa"), + "selectMorePhotos": + MessageLookupByLibrary.simpleMessage("Pilih lebih banyak foto"), "selectReason": MessageLookupByLibrary.simpleMessage("Pilih alasan"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Pilih paket kamu"), @@ -1177,6 +1231,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dibagikan oleh kamu"), "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage("Foto terbagi baru"), + "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( + "Terima notifikasi apabila seseorang menambahkan foto ke album bersama yang kamu ikuti"), "sharedWith": m55, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Dibagikan dengan saya"), @@ -1275,6 +1331,8 @@ class MessageLookup extends MessageLookupByLibrary { "thankYou": MessageLookupByLibrary.simpleMessage("Terima kasih"), "thankYouForSubscribing": MessageLookupByLibrary.simpleMessage( "Terima kasih telah berlangganan!"), + "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( + "Unduhan tidak dapat diselesaikan"), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Kunci pemulihan yang kamu masukkan salah"), @@ -1385,6 +1443,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Lihat seluruh data EXIF"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("File berukuran besar"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "Tampilkan file yang banyak mengkonsumsi ruang penyimpanan."), "viewLogs": MessageLookupByLibrary.simpleMessage("Lihat log"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Lihat kunci pemulihan"), @@ -1395,6 +1455,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Menunggu verifikasi..."), "waitingForWifi": MessageLookupByLibrary.simpleMessage("Menunggu WiFi..."), + "weAreOpenSource": + MessageLookupByLibrary.simpleMessage("Kode kami sumber terbuka!"), "weHaveSendEmailTo": m69, "weakStrength": MessageLookupByLibrary.simpleMessage("Lemah"), "welcomeBack": @@ -1422,6 +1484,8 @@ class MessageLookup extends MessageLookupByLibrary { "youCanManageYourLinksInTheShareTab": MessageLookupByLibrary.simpleMessage( "Kamu bisa atur link yang telah kamu buat di tab berbagi."), + "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( + "Anda tidak dapat turun ke paket ini"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage( "Kamu tidak bisa berbagi dengan dirimu sendiri"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( @@ -1430,6 +1494,11 @@ class MessageLookup extends MessageLookupByLibrary { "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), + "yourPlanWasSuccessfullyDowngraded": + MessageLookupByLibrary.simpleMessage( + "Paket kamu berhasil di turunkan"), + "yourPlanWasSuccessfullyUpgraded": MessageLookupByLibrary.simpleMessage( + "Paket kamu berhasil ditingkatkan"), "yourPurchaseWasSuccessful": MessageLookupByLibrary.simpleMessage("Pembelianmu berhasil"), "yourStorageDetailsCouldNotBeFetched": @@ -1442,6 +1511,9 @@ class MessageLookup extends MessageLookupByLibrary { "Langgananmu telah berhasil diperbarui"), "yourVerificationCodeHasExpired": MessageLookupByLibrary.simpleMessage( "Kode verifikasi kamu telah kedaluwarsa"), + "youveNoDuplicateFilesThatCanBeCleared": + MessageLookupByLibrary.simpleMessage( + "Kamu tidak memiliki file duplikat yang dapat di hapus"), "zoomOutToSeePhotos": MessageLookupByLibrary.simpleMessage( "Perkecil peta untuk melihat foto lainnya") }; diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 782eb147c5..c464296721 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -20,9 +20,18 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'it'; + static String m3(count) => + "${Intl.plural(count, zero: 'Aggiungi collaboratore', one: 'Aggiungi collaboratore', other: 'Aggiungi collaboratori')}"; + static String m4(count) => "${Intl.plural(count, one: 'Aggiungi elemento', other: 'Aggiungi elementi')}"; + static String m5(storageAmount, endDate) => + "Il tuo spazio aggiuntivo di ${storageAmount} è valido fino al ${endDate}"; + + static String m6(count) => + "${Intl.plural(count, zero: 'Aggiungi visualizzatore', one: 'Aggiungi visualizzatore', other: 'Aggiungi visualizzatori')}"; + static String m7(emailOrName) => "Aggiunto da ${emailOrName}"; static String m8(albumName) => "Aggiunto con successo su ${albumName}"; @@ -32,6 +41,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m10(versionValue) => "Versione: ${versionValue}"; + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} liberi"; + static String m12(paymentProvider) => "Annulla prima il tuo abbonamento esistente da ${paymentProvider}"; @@ -74,6 +86,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m25(newEmail) => "Email cambiata in ${newEmail}"; + static String m26(email) => + "${email} non ha un account Ente.\n\nInvia un invito per condividere foto."; + static String m27(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; @@ -93,6 +108,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m33(count, formattedSize) => "${Intl.plural(count, one: 'Può essere cancellata per liberare ${formattedSize}', other: 'Possono essere cancellati per liberare ${formattedSize}')}"; + static String m34(currentlyProcessing, totalCount) => + "Elaborazione ${currentlyProcessing} / ${totalCount}"; + static String m35(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementi')}"; @@ -106,12 +124,18 @@ class MessageLookup extends MessageLookupByLibrary { static String m38(albumName) => "Spostato con successo su ${albumName}"; + static String m40(familyAdminEmail) => + "Per favore contatta ${familyAdminEmail} per cambiare il tuo codice."; + static String m41(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; static String m42(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; + static String m43(endDate) => + "Prova gratuita valida fino al ${endDate}.\nIn seguito potrai scegliere un piano a pagamento."; + static String m44(toEmail) => "Per favore invia un\'email a ${toEmail}"; static String m45(toEmail) => "Invia i log a \n${toEmail}"; @@ -126,6 +150,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m49(endDate) => "Si rinnova il ${endDate}"; + static String m50(count) => + "${Intl.plural(count, one: '${count} risultato trovato', other: '${count} risultati trovati')}"; + static String m1(count) => "${count} selezionati"; static String m51(count, yourCount) => @@ -137,6 +164,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m2(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; + static String m53(referralCode, referralStorageInGB) => + "Codice invito Ente: ${referralCode} \n\nInseriscilo in Impostazioni → Generali → Inviti per ottenere ${referralStorageInGB} GB gratis dopo la sottoscrizione a un piano a pagamento\n\nhttps://ente.io"; + static String m54(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; @@ -145,12 +175,20 @@ class MessageLookup extends MessageLookupByLibrary { static String m56(fileType) => "Questo ${fileType} verrà eliminato dal tuo dispositivo."; + static String m57(fileType) => + "Questo ${fileType} è sia su Ente che sul tuo dispositivo."; + + static String m58(fileType) => "Questo ${fileType} verrà eliminato da Ente."; + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; static String m60( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; + static String m61(id) => + "Il tuo ${id} è già collegato a un altro account Ente.\nSe desideri utilizzare il tuo ${id} con questo account, per favore contatta il nostro supporto\'\'"; + static String m62(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; static String m63(completed, total) => @@ -179,6 +217,8 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { + "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( + "Una nuova versione di Ente è disponibile."), "about": MessageLookupByLibrary.simpleMessage("Info"), "account": MessageLookupByLibrary.simpleMessage("Account"), "accountWelcomeBack": @@ -187,10 +227,12 @@ class MessageLookup extends MessageLookupByLibrary { "Comprendo che se perdo la password potrei perdere l\'accesso ai miei dati poiché sono criptati end-to-end."), "activeSessions": MessageLookupByLibrary.simpleMessage("Sessioni attive"), + "addAName": MessageLookupByLibrary.simpleMessage("Aggiungi un nome"), "addANewEmail": MessageLookupByLibrary.simpleMessage("Aggiungi una nuova email"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Aggiungi collaboratore"), + "addCollaborators": m3, "addFromDevice": MessageLookupByLibrary.simpleMessage("Aggiungi dal dispositivo"), "addItem": m4, @@ -200,16 +242,21 @@ class MessageLookup extends MessageLookupByLibrary { "addNew": MessageLookupByLibrary.simpleMessage("Aggiungi nuovo"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Dettagli dei componenti aggiuntivi"), + "addOnValidTill": m5, "addOns": MessageLookupByLibrary.simpleMessage("Componenti aggiuntivi"), "addPhotos": MessageLookupByLibrary.simpleMessage("Aggiungi foto"), "addSelected": MessageLookupByLibrary.simpleMessage("Aggiungi selezionate"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Aggiungi all\'album"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Aggiungi a Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Aggiungi ad album nascosto"), "addViewer": MessageLookupByLibrary.simpleMessage("Aggiungi in sola lettura"), + "addViewers": m6, + "addYourPhotosNow": + MessageLookupByLibrary.simpleMessage("Aggiungi le tue foto ora"), "addedAs": MessageLookupByLibrary.simpleMessage("Aggiunto come"), "addedBy": m7, "addedSuccessfullyTo": m8, @@ -322,7 +369,10 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticazione non riuscita, prova di nuovo"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Autenticazione riuscita!"), + "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( + "A causa di problemi tecnici, sei stato disconnesso. Ci scusiamo per l\'inconveniente."), "available": MessageLookupByLibrary.simpleMessage("Disponibile"), + "availableStorageSpace": m11, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Cartelle salvate"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -333,6 +383,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Impostazioni backup"), "backupVideos": MessageLookupByLibrary.simpleMessage("Backup dei video"), + "blackFridaySale": + MessageLookupByLibrary.simpleMessage("Offerta del Black Friday"), "blog": MessageLookupByLibrary.simpleMessage("Blog"), "cachedData": MessageLookupByLibrary.simpleMessage("Dati nella cache"), "calculating": MessageLookupByLibrary.simpleMessage("Calcolando..."), @@ -351,7 +403,10 @@ class MessageLookup extends MessageLookupByLibrary { "cannotAddMorePhotosAfterBecomingViewer": m13, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Impossibile eliminare i file condivisi"), + "castInstruction": MessageLookupByLibrary.simpleMessage( + "Visita cast.ente.io sul dispositivo che vuoi abbinare.\n\nInserisci il codice qui sotto per riprodurre l\'album sulla tua TV."), "centerPoint": MessageLookupByLibrary.simpleMessage("Punto centrale"), + "change": MessageLookupByLibrary.simpleMessage("Cambia"), "changeEmail": MessageLookupByLibrary.simpleMessage("Modifica email"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Cambiare la posizione degli elementi selezionati?"), @@ -361,10 +416,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Modifica password"), "changePermissions": MessageLookupByLibrary.simpleMessage("Cambio i permessi?"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("Cambia il tuo codice invito"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Controlla aggiornamenti"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Per favore, controlla la tua casella di posta (e lo spam) per completare la verifica"), + "checkStatus": MessageLookupByLibrary.simpleMessage("Verifica stato"), "checking": MessageLookupByLibrary.simpleMessage("Controllo in corso..."), "claimFreeStorage": @@ -384,10 +442,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Unisci per nome file"), "codeAppliedPageTitle": MessageLookupByLibrary.simpleMessage("Codice applicato"), + "codeChangeLimitReached": MessageLookupByLibrary.simpleMessage( + "Siamo spiacenti, hai raggiunto il limite di modifiche del codice."), "codeCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Codice copiato negli appunti"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Codice utilizzato da te"), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un\'applicazione o di un account Ente. Ottimo per raccogliere foto di un evento."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link collaborativo"), "collaborativeLinkCreatedFor": m15, @@ -409,7 +471,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "Conferma eliminazione account"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Sì, voglio eliminare definitivamente questo account e tutti i suoi dati."), + "Sì, voglio eliminare definitivamente questo account e i dati associati a esso su tutte le applicazioni."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Conferma password"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( @@ -423,6 +485,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Contatta il supporto"), "contactToManageSubscription": m17, "contacts": MessageLookupByLibrary.simpleMessage("Contatti"), + "contents": MessageLookupByLibrary.simpleMessage("Contenuti"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage("Continua la prova gratuita"), @@ -493,6 +556,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina da entrambi"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), + "deleteFromEnte": + MessageLookupByLibrary.simpleMessage("Elimina da Ente"), "deleteItemCount": m19, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), @@ -512,11 +577,22 @@ class MessageLookup extends MessageLookupByLibrary { "Eliminare l\'album condiviso?"), "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( "L\'album verrà eliminato per tutti\n\nPerderai l\'accesso alle foto condivise in questo album che sono di proprietà di altri"), + "descriptions": MessageLookupByLibrary.simpleMessage("Descrizioni"), "deselectAll": MessageLookupByLibrary.simpleMessage("Deseleziona tutti"), "designedToOutlive": MessageLookupByLibrary.simpleMessage("Progettato per sopravvivere"), "details": MessageLookupByLibrary.simpleMessage("Dettagli"), + "developerSettings": + MessageLookupByLibrary.simpleMessage("Impostazioni sviluppatore"), + "deviceCodeHint": + MessageLookupByLibrary.simpleMessage("Inserisci il codice"), + "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( + "I file aggiunti a questo album del dispositivo verranno automaticamente caricati su Ente."), + "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( + "Disabilita il blocco schermo del dispositivo quando Ente è in primo piano e c\'è un backup in corso. Questo normalmente non è necessario ma può aiutare a completare più velocemente grossi caricamenti e l\'importazione iniziale di grandi librerie."), + "deviceNotFound": + MessageLookupByLibrary.simpleMessage("Dispositivo non trovato"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Lo sapevi che?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage( "Disabilita blocco automatico"), @@ -560,6 +636,7 @@ class MessageLookup extends MessageLookupByLibrary { "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -577,6 +654,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Chiavi di crittografia"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage("Crittografia end-to-end"), + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": + MessageLookupByLibrary.simpleMessage( + "Ente può criptare e conservare i file solo se gliene concedi l\'accesso"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente necessita del permesso per preservare le tue foto"), + "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( + "Ente conserva i tuoi ricordi in modo che siano sempre a disposizione, anche se perdi il tuo dispositivo."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Aggiungi la tua famiglia al tuo piano."), "enterAlbumName": MessageLookupByLibrary.simpleMessage( @@ -614,6 +698,7 @@ class MessageLookup extends MessageLookupByLibrary { "Questo link è scaduto. Si prega di selezionare un nuovo orario di scadenza o disabilitare la scadenza del link."), "exportLogs": MessageLookupByLibrary.simpleMessage("Esporta log"), "exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"), + "faces": MessageLookupByLibrary.simpleMessage("Volti"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage( "Impossibile applicare il codice"), "failedToCancel": @@ -630,6 +715,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Rinnovo fallito"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Impossibile verificare lo stato del pagamento"), + "familyPlanOverview": MessageLookupByLibrary.simpleMessage( + "Aggiungi 5 membri della famiglia al tuo piano esistente senza pagare extra.\n\nOgni membro ottiene il proprio spazio privato e non può vedere i file dell\'altro a meno che non siano condivisi.\n\nI piani familiari sono disponibili per i clienti che hanno un abbonamento Ente a pagamento.\n\nIscriviti ora per iniziare!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Famiglia"), "familyPlans": MessageLookupByLibrary.simpleMessage("Piano famiglia"), @@ -643,9 +730,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aggiungi descrizione..."), "fileSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvato nella galleria"), + "fileTypes": MessageLookupByLibrary.simpleMessage("Tipi di file"), + "fileTypesAndNames": + MessageLookupByLibrary.simpleMessage("Tipi e nomi di file"), "filesBackedUpFromDevice": m27, "filesBackedUpInAlbum": m28, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), + "filesSavedToGallery": + MessageLookupByLibrary.simpleMessage("File salvati nella galleria"), + "findPeopleByName": MessageLookupByLibrary.simpleMessage( + "Trova rapidamente le persone per nome"), "flip": MessageLookupByLibrary.simpleMessage("Capovolgi"), "forYourMemories": MessageLookupByLibrary.simpleMessage("per i tuoi ricordi"), @@ -662,6 +756,8 @@ class MessageLookup extends MessageLookupByLibrary { "freeUpAmount": m32, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), + "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( + "Risparmia spazio sul tuo dispositivo cancellando i file che sono già stati salvati online."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), "freeUpSpaceSaving": m33, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( @@ -669,6 +765,7 @@ class MessageLookup extends MessageLookupByLibrary { "general": MessageLookupByLibrary.simpleMessage("Generali"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generazione delle chiavi di crittografia..."), + "genericProgress": m34, "goToSettings": MessageLookupByLibrary.simpleMessage("Vai alle impostazioni"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -682,6 +779,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non teniamo traccia del numero di installazioni dell\'app. Sarebbe utile se ci dicesse dove ci ha trovato!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( "Come hai sentito parlare di Ente? (opzionale)"), + "help": MessageLookupByLibrary.simpleMessage("Aiuto"), "hidden": MessageLookupByLibrary.simpleMessage("Nascosti"), "hide": MessageLookupByLibrary.simpleMessage("Nascondi"), "hiding": MessageLookupByLibrary.simpleMessage("Nascondendo..."), @@ -696,6 +794,8 @@ class MessageLookup extends MessageLookupByLibrary { "L\'autenticazione biometrica è disabilitata. Blocca e sblocca lo schermo per abilitarla."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignora"), + "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( + "Alcuni file in questo album vengono ignorati dal caricamento perché erano stati precedentemente eliminati da Ente."), "importing": MessageLookupByLibrary.simpleMessage("Importazione in corso...."), "incorrectCode": @@ -716,12 +816,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Installa manualmente"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Indirizzo email non valido"), + "invalidEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint invalido"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Spiacenti, l\'endpoint inserito non è valido. Inserisci un endpoint valido e riprova."), "invalidKey": MessageLookupByLibrary.simpleMessage("Chiave non valida"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "La chiave di recupero che hai inserito non è valida. Assicurati che contenga 24 parole e controlla l\'ortografia di ciascuna parola.\n\nSe hai inserito un vecchio codice di recupero, assicurati che sia lungo 64 caratteri e controlla ciascuno di essi."), "invite": MessageLookupByLibrary.simpleMessage("Invita"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("Invita su Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Invita i tuoi amici"), + "inviteYourFriendsToEnte": + MessageLookupByLibrary.simpleMessage("Invita i tuoi amici a Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), @@ -731,6 +838,8 @@ class MessageLookup extends MessageLookupByLibrary { "Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"), "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati saranno rimossi da questo album"), + "joinDiscord": + MessageLookupByLibrary.simpleMessage("Unisciti a Discord"), "keepPhotos": MessageLookupByLibrary.simpleMessage("Mantieni foto"), "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( @@ -782,17 +891,24 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Caricamento galleria..."), "loadingMessage": MessageLookupByLibrary.simpleMessage("Caricando le tue foto..."), + "loadingModel": + MessageLookupByLibrary.simpleMessage("Scaricamento modelli..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galleria locale"), "location": MessageLookupByLibrary.simpleMessage("Luogo"), "locationName": MessageLookupByLibrary.simpleMessage("Nome della località"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( "Un tag di localizzazione raggruppa tutte le foto scattate entro il raggio di una foto"), + "locations": MessageLookupByLibrary.simpleMessage("Luoghi"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Blocca"), "lockscreen": MessageLookupByLibrary.simpleMessage("Schermata di blocco"), "logInLabel": MessageLookupByLibrary.simpleMessage("Accedi"), "loggingOut": MessageLookupByLibrary.simpleMessage("Disconnessione..."), + "loginSessionExpired": + MessageLookupByLibrary.simpleMessage("Sessione scaduta"), + "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( + "La sessione è scaduta. Si prega di accedere nuovamente."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Cliccando sul pulsante Accedi, accetti i termini di servizio e la politica sulla privacy"), "logout": MessageLookupByLibrary.simpleMessage("Disconnetti"), @@ -818,9 +934,19 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Se abiliti il Machine Learning, Ente estrarrà informazioni come la geometria del volto dai file, inclusi quelli condivisi con te.\n\nQuesto accadrà sul tuo dispositivo, e qualsiasi informazione biometrica generata sarà crittografata end-to-end."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Clicca qui per maggiori dettagli su questa funzione nella nostra informativa sulla privacy"), + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "Si prega di notare che l\'attivazione dell\'apprendimento automatico si tradurrà in un maggior utilizzo della connessione e della batteria fino a quando tutti gli elementi non saranno indicizzati. Valuta di utilizzare l\'applicazione desktop per un\'indicizzazione più veloce, tutti i risultati verranno sincronizzati automaticamente."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Mediocre"), + "modifyYourQueryOrTrySearchingFor": + MessageLookupByLibrary.simpleMessage( + "Modifica la tua interrogazione o prova a cercare"), + "moments": MessageLookupByLibrary.simpleMessage("Momenti"), "monthly": MessageLookupByLibrary.simpleMessage("Mensile"), "moveItem": m37, "moveToAlbum": @@ -839,6 +965,8 @@ class MessageLookup extends MessageLookupByLibrary { "Impossibile connettersi a Ente, controlla le impostazioni di rete e contatta l\'assistenza se l\'errore persiste."), "never": MessageLookupByLibrary.simpleMessage("Mai"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nuovo album"), + "newToEnte": + MessageLookupByLibrary.simpleMessage("Prima volta con Ente"), "newest": MessageLookupByLibrary.simpleMessage("Più recenti"), "no": MessageLookupByLibrary.simpleMessage("No"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( @@ -876,6 +1004,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sul dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Su ente"), + "onlyFamilyAdminCanChangeCode": m40, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ops, impossibile salvare le modifiche"), @@ -891,6 +1020,12 @@ class MessageLookup extends MessageLookupByLibrary { "Facoltativo, breve quanto vuoi..."), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage( "Oppure scegline una esistente"), + "pair": MessageLookupByLibrary.simpleMessage("Abbina"), + "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( + "La verifica è ancora in corso"), + "passkey": MessageLookupByLibrary.simpleMessage("Passkey"), + "passkeyAuthTitle": + MessageLookupByLibrary.simpleMessage("Verifica della passkey"), "password": MessageLookupByLibrary.simpleMessage("Password"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Password modificata con successo"), @@ -903,11 +1038,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Dettagli di Pagamento"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "Purtroppo il tuo pagamento non è riuscito. Contatta l\'assistenza e ti aiuteremo!"), "paymentFailedTalkToProvider": m42, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementi in sospeso"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sincronizzazione in sospeso"), + "people": MessageLookupByLibrary.simpleMessage("Persone"), "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage( "Persone che hanno usato il tuo codice"), "permDeleteWarning": MessageLookupByLibrary.simpleMessage( @@ -916,15 +1054,21 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina definitivamente"), "permanentlyDeleteFromDevice": MessageLookupByLibrary.simpleMessage( "Eliminare definitivamente dal dispositivo?"), + "photoDescriptions": + MessageLookupByLibrary.simpleMessage("Descrizioni delle foto"), "photoGridSize": MessageLookupByLibrary.simpleMessage("Dimensione griglia foto"), "photoSmallCase": MessageLookupByLibrary.simpleMessage("foto"), + "photos": MessageLookupByLibrary.simpleMessage("Foto"), "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Le foto aggiunte da te verranno rimosse dall\'album"), "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Selezionare il punto centrale"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fissa l\'album"), + "playOnTv": + MessageLookupByLibrary.simpleMessage("Riproduci album sulla TV"), + "playStoreFreeTrialValidTill": m43, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1022,10 +1166,14 @@ class MessageLookup extends MessageLookupByLibrary { "remove": MessageLookupByLibrary.simpleMessage("Rimuovi"), "removeDuplicates": MessageLookupByLibrary.simpleMessage("Rimuovi i doppioni"), + "removeDuplicatesDesc": MessageLookupByLibrary.simpleMessage( + "Verifica e rimuovi i file che sono esattamente duplicati."), "removeFromAlbum": MessageLookupByLibrary.simpleMessage("Rimuovi dall\'album"), "removeFromAlbumTitle": MessageLookupByLibrary.simpleMessage("Rimuovi dall\'album?"), + "removeFromFavorite": + MessageLookupByLibrary.simpleMessage("Rimuovi dai preferiti"), "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), @@ -1058,6 +1206,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ripristina l\'album"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Ripristinando file..."), + "resumableUploads": + MessageLookupByLibrary.simpleMessage("Caricamenti riattivabili"), "retry": MessageLookupByLibrary.simpleMessage("Riprova"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Controlla ed elimina gli elementi che credi siano dei doppioni."), @@ -1083,8 +1233,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nome album"), "searchByExamples": MessageLookupByLibrary.simpleMessage( "• Nomi degli album (es. \"Camera\")\n• Tipi di file (es. \"Video\", \".gif\")\n• Anni e mesi (e.. \"2022\", \"gennaio\")\n• Vacanze (ad es. \"Natale\")\n• Descrizioni delle foto (ad es. “#mare”)"), + "searchCaptionEmptySection": MessageLookupByLibrary.simpleMessage( + "Aggiungi descrizioni come \"#viaggio\" nelle informazioni delle foto per trovarle rapidamente qui"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Ricerca per data, mese o anno"), + "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( + "Le persone saranno mostrate qui una volta completata l\'indicizzazione"), + "searchFileTypesAndNamesEmptySection": + MessageLookupByLibrary.simpleMessage("Tipi e nomi di file"), "searchHint3": MessageLookupByLibrary.simpleMessage("Album, nomi di file e tipi"), "searchHint4": MessageLookupByLibrary.simpleMessage("Luogo"), @@ -1092,6 +1248,7 @@ class MessageLookup extends MessageLookupByLibrary { "Raggruppa foto scattate entro un certo raggio da una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita persone e vedrai qui tutte le foto condivise da loro"), + "searchResultCount": m50, "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleziona un luogo"), @@ -1111,6 +1268,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Seleziona un motivo"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Seleziona un piano"), + "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( + "I file selezionati non sono su Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "Le cartelle selezionate verranno crittografate e salvate su ente"), @@ -1123,6 +1282,8 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), "sendLink": MessageLookupByLibrary.simpleMessage("Invia link"), + "serverEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint del server"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Sessione scaduta"), "setAPassword": @@ -1146,9 +1307,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), "shareTextConfirmOthersVerificationID": m2, + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "Scarica Ente in modo da poter facilmente condividere foto e video in qualità originale\n\nhttps://ente.io"), + "shareTextReferralCode": m53, + "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( + "Condividi con utenti che non hanno un account Ente"), "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), + "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( + "Crea album condivisi e collaborativi con altri utenti di Ente, inclusi gli utenti con piani gratuiti."), "sharedByMe": MessageLookupByLibrary.simpleMessage("Condiviso da me"), "sharedByYou": MessageLookupByLibrary.simpleMessage("Condivise da te"), "sharedPhotoNotifications": @@ -1174,8 +1342,13 @@ class MessageLookup extends MessageLookupByLibrary { "singleFileDeleteFromDevice": m56, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), + "someItemsAreInBothEnteAndYourDevice": + MessageLookupByLibrary.simpleMessage( + "Alcuni elementi sono sia su Ente che sul tuo dispositivo."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "Alcuni dei file che si sta tentando di eliminare sono disponibili solo sul dispositivo e non possono essere recuperati se cancellati"), @@ -1217,6 +1390,7 @@ class MessageLookup extends MessageLookupByLibrary { "Limite d\'archiviazione superato"), "storageUsageInfo": m60, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), + "subAlreadyLinkedErrMessage": m61, "subWillBeCancelledOn": m62, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( @@ -1298,6 +1472,8 @@ class MessageLookup extends MessageLookupByLibrary { "trash": MessageLookupByLibrary.simpleMessage("Cestino"), "trashDaysLeft": m66, "tryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), + "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( + "Attiva il backup per caricare automaticamente i file aggiunti a questa cartella del dispositivo su Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 mesi gratis sui piani annuali"), @@ -1319,6 +1495,8 @@ class MessageLookup extends MessageLookupByLibrary { "Rimuovi album dall\'archivio"), "unarchiving": MessageLookupByLibrary.simpleMessage("Togliendo dall\'archivio..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Siamo spiacenti, questo codice non è disponibile."), "uncategorized": MessageLookupByLibrary.simpleMessage("Senza categoria"), "unhide": MessageLookupByLibrary.simpleMessage("Mostra"), @@ -1343,6 +1521,9 @@ class MessageLookup extends MessageLookupByLibrary { "Caricamento dei file nell\'album..."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Lo spazio disponibile è limitato dal tuo piano corrente. L\'archiviazione in eccesso diventerà automaticamente utilizzabile quando aggiornerai il tuo piano."), + "usePublicLinksForPeopleNotOnEnte": + MessageLookupByLibrary.simpleMessage( + "Usa link pubblici per persone non registrate su Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage( "Utilizza un codice di recupero"), "useSelectedPhoto": @@ -1358,6 +1539,8 @@ class MessageLookup extends MessageLookupByLibrary { "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), "verifyEmailID": m68, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), + "verifyPasskey": + MessageLookupByLibrary.simpleMessage("Verifica passkey"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Verifica password"), "verifying": @@ -1365,6 +1548,7 @@ class MessageLookup extends MessageLookupByLibrary { "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Verifica della chiave di recupero..."), "videoSmallCase": MessageLookupByLibrary.simpleMessage("video"), + "videos": MessageLookupByLibrary.simpleMessage("Video"), "viewActiveSessions": MessageLookupByLibrary.simpleMessage("Visualizza sessioni attive"), "viewAddOnButton": MessageLookupByLibrary.simpleMessage( @@ -1372,12 +1556,18 @@ class MessageLookup extends MessageLookupByLibrary { "viewAll": MessageLookupByLibrary.simpleMessage("Visualizza tutte"), "viewAllExifData": MessageLookupByLibrary.simpleMessage("Mostra tutti i dati EXIF"), + "viewLargeFiles": + MessageLookupByLibrary.simpleMessage("File di grandi dimensioni"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "Visualizza i file che stanno occupando la maggior parte dello spazio di archiviazione."), "viewLogs": MessageLookupByLibrary.simpleMessage("Visualizza i log"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Visualizza chiave di recupero"), "viewer": MessageLookupByLibrary.simpleMessage("Sola lettura"), "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Visita web.ente.io per gestire il tuo abbonamento"), + "waitingForVerification": + MessageLookupByLibrary.simpleMessage("In attesa di verifica..."), "waitingForWifi": MessageLookupByLibrary.simpleMessage("In attesa del WiFi..."), "weAreOpenSource": @@ -1422,6 +1612,7 @@ class MessageLookup extends MessageLookupByLibrary { "youHaveSuccessfullyFreedUp": m71, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), + "yourMap": MessageLookupByLibrary.simpleMessage("La tua mappa"), "yourPlanWasSuccessfullyDowngraded": MessageLookupByLibrary.simpleMessage( "Il tuo piano è stato aggiornato con successo"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index a33e630355..e2a5cc4c5b 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -363,6 +363,8 @@ class MessageLookup extends MessageLookupByLibrary { "Graag verifiëren om tweestapsverificatie te configureren"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Gelieve te verifiëren om het verwijderen van je account te starten"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Verifieer uzelf om uw toegangssleutel te bekijken"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Graag verifiëren om uw actieve sessies te bekijken"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -401,6 +403,9 @@ class MessageLookup extends MessageLookupByLibrary { "Back-up maken via mobiele data"), "backupSettings": MessageLookupByLibrary.simpleMessage("Back-up instellingen"), + "backupStatus": MessageLookupByLibrary.simpleMessage("Back-upstatus"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Items die zijn geback-upt, worden hier getoond"), "backupVideos": MessageLookupByLibrary.simpleMessage("Back-up video\'s"), "blackFridaySale": @@ -515,7 +520,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "Account verwijderen bevestigen"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, ik wil permanent mijn account inclusief alle gegevens verwijderen."), + "Ja, ik wil mijn account en de bijbehorende gegevens verspreid over alle apps permanent verwijderen."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Wachtwoord bevestigen"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( @@ -1715,6 +1720,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bekijk alle EXIF gegevens"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Grote bestanden"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "Bekijk bestanden die de meeste opslagruimte verbruiken."), "viewLogs": MessageLookupByLibrary.simpleMessage("Logboeken bekijken"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Toon herstelsleutel"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index e5badae7f5..ff812646ff 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -21,7 +21,7 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'no'; static String m9(count) => - "${Intl.plural(count, zero: 'Ingen deltakere', one: '1 Deltaker', other: '${count} Deltakere')}"; + "${Intl.plural(count, zero: 'Ingen deltakere', one: '1 deltaker', other: '${count} deltakere')}"; static String m13(user) => "${user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem"; @@ -131,8 +131,6 @@ class MessageLookup extends MessageLookupByLibrary { "confirm": MessageLookupByLibrary.simpleMessage("Bekreft"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekreft sletting av konto"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, jeg ønsker å slette denne kontoen og all dataen dens permanent."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Bekreft passordet"), "confirmRecoveryKey": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index 8cb6018be4..7c2f1c7d5c 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -402,6 +402,10 @@ class MessageLookup extends MessageLookupByLibrary { "Kopia zapasowa przez dane mobilne"), "backupSettings": MessageLookupByLibrary.simpleMessage("Ustawienia kopii zapasowej"), + "backupStatus": + MessageLookupByLibrary.simpleMessage("Status kopii zapasowej"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Elementy, których kopia zapasowa została utworzona, zostaną wyświetlone w tym miejscu"), "backupVideos": MessageLookupByLibrary.simpleMessage("Utwórz kopię zapasową wideo"), "blackFridaySale": MessageLookupByLibrary.simpleMessage( @@ -516,7 +520,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Potwierdź usunięcie konta"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Tak, chcę trwale usunąć konto i wszystkie dane z nim powiązane."), + "Tak, chcę trwale usunąć to konto i jego dane ze wszystkich aplikacji."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Powtórz hasło"), "confirmPlanChange": diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 0472cbcbe0..cc57098dad 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -401,6 +401,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup usando dados móveis"), "backupSettings": MessageLookupByLibrary.simpleMessage("Configurações de backup"), + "backupStatus": + MessageLookupByLibrary.simpleMessage("Status do Backup"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Os itens que foram salvos no backup aparecerão aqui"), "backupVideos": MessageLookupByLibrary.simpleMessage("Backup de vídeos"), "blackFridaySale": @@ -513,7 +517,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Confirmar exclusão da conta"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Sim, desejo excluir permanentemente esta conta e todos os seus dados."), + "Sim, eu quero excluir permanentemente esta conta e seus dados em todos os aplicativos."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Confirme sua senha"), "confirmPlanChange": diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index e40aaf8ce5..d43a5f04c6 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -341,7 +341,7 @@ class MessageLookup extends MessageLookupByLibrary { "atAFalloutShelter": MessageLookupByLibrary.simpleMessage("в бункере"), "authToChangeEmailVerificationSetting": MessageLookupByLibrary.simpleMessage( - "Авторизуйтесь, чтобы изменить подтверждение электронной почты"), + "Пожалуйста, войдите, чтобы изменить настройку подтверждения электронной почты"), "authToChangeLockscreenSetting": MessageLookupByLibrary.simpleMessage( "Пожалуйста, авторизуйтесь, чтобы изменить настройки экрана блокировки"), "authToChangeYourEmail": MessageLookupByLibrary.simpleMessage( @@ -390,8 +390,8 @@ class MessageLookup extends MessageLookupByLibrary { "Ошибка резервного копирования"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Резервное копирование через мобильную сеть"), - "backupSettings": - MessageLookupByLibrary.simpleMessage("Резервная копия настроек"), + "backupSettings": MessageLookupByLibrary.simpleMessage( + "Настройки резервного копирования"), "backupVideos": MessageLookupByLibrary.simpleMessage("Резервное копирование видео"), "blackFridaySale": MessageLookupByLibrary.simpleMessage( @@ -499,7 +499,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "Подтвердить удаление учётной записи"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Да, я хочу навсегда удалить эту учётную запись и все её данные."), + "Да, я хочу навсегда удалить эту учётную запись и все её данные во всех приложениях Ente."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Подтвердите пароль"), "confirmPlanChange": @@ -676,13 +676,15 @@ class MessageLookup extends MessageLookupByLibrary { "email": MessageLookupByLibrary.simpleMessage("Электронная почта"), "emailChangedTo": m25, "emailNoEnteAccount": m26, - "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( - "Подтверждение электронной почты"), + "emailVerificationToggle": + MessageLookupByLibrary.simpleMessage("Вход с кодом на почту"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( "Отправить логи по электронной почте"), "empty": MessageLookupByLibrary.simpleMessage("Очистить"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Очистить корзину?"), "enable": MessageLookupByLibrary.simpleMessage("Включить"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente поддерживает машинное обучение на устройстве для распознавания лиц, умного поиска и других расширенных функций поиска"), "enableMaps": MessageLookupByLibrary.simpleMessage("Включить карты"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Ваши фотографии будут показаны на карте мира.\n\nЭта карта размещена на Open Street Map, и точное местоположение ваших фотографий никогда не разглашается.\n\nВы можете отключить эту функцию в любое время в настройках."), @@ -767,7 +769,7 @@ class MessageLookup extends MessageLookupByLibrary { "Добавьте 5 членов семьи к существующему плану без дополнительной оплаты.\n\nКаждый участник получает свое личное пространство и не может видеть файлы друг друга, если к ним не предоставлен общий доступ.\n\nСемейные планы доступны клиентам, имеющим платную подписку на Ente.\n\nПодпишитесь сейчас, чтобы начать!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Семья"), "familyPlans": MessageLookupByLibrary.simpleMessage("Семейные планы"), - "faq": MessageLookupByLibrary.simpleMessage("ЧаВо"), + "faq": MessageLookupByLibrary.simpleMessage("Ответы на ваши вопросы"), "faqs": MessageLookupByLibrary.simpleMessage("Часто задаваемые вопросы"), "favorite": MessageLookupByLibrary.simpleMessage("В избранное"), @@ -831,7 +833,7 @@ class MessageLookup extends MessageLookupByLibrary { "Будет полезно, если вы укажете, где нашли нас, так как мы не отслеживаем установки приложения!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( "Как вы узнали о Ente? (необязательно)"), - "help": MessageLookupByLibrary.simpleMessage("помощь"), + "help": MessageLookupByLibrary.simpleMessage("Помощь"), "hidden": MessageLookupByLibrary.simpleMessage("Скрыто"), "hide": MessageLookupByLibrary.simpleMessage("Скрыть"), "hideContent": @@ -987,6 +989,8 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Machine learning"), "magicSearch": MessageLookupByLibrary.simpleMessage("Волшебный поиск"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "Умный поиск позволяет искать фотографии по их содержимому, например, \'цветок\', \'красная машина\', \'паспорт\', \'документы\'"), "manage": MessageLookupByLibrary.simpleMessage("Управление"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Управление хранилищем устройства"), @@ -1005,6 +1009,18 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Товары"), + "mlConsent": + MessageLookupByLibrary.simpleMessage("Включить машинное обучение"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Я понимаю и хочу включить машинное обучение"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "Если вы включите машинное обучение, Ente будет извлекать информацию из файлов (например, геометрию лица), включая те, которыми с вами поделились.\n\nЭто будет происходить на вашем устройстве, и любая сгенерированная биометрическая информация будет зашифрована с использованием сквозного (End-to-End) шифрования между вашим устройством и сервером."), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "Пожалуйста, нажмите здесь, чтобы узнать больше об этой функции в нашей политике конфиденциальности"), + "mlConsentTitle": + MessageLookupByLibrary.simpleMessage("Включить машинное обучение?"), + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "Обратите внимание, что машинное обучение приведёт к повышенному потреблению трафика и батареи, пока все элементы не будут проиндексированы. Рекомендуем использовать ПК версию для более быстрого индексирования. Полученные результаты будут синхронизированы автоматически между устройствами."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Телефон, Web, ПК"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Средний"), @@ -1303,6 +1319,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Восстановить в альбоме"), "restoringFiles": MessageLookupByLibrary.simpleMessage("Восстановление файлов..."), + "resumableUploads": MessageLookupByLibrary.simpleMessage( + "Поддержка дозагрузки файл(а/ов) при разрыве связи"), "retry": MessageLookupByLibrary.simpleMessage("Повторить"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Пожалуйста, проверьте и удалите те элементы, которые вы считаете что это дубликаты."), @@ -1609,13 +1627,14 @@ class MessageLookup extends MessageLookupByLibrary { "twofactorAuthenticationSuccessfullyReset": MessageLookupByLibrary.simpleMessage( "Двухфакторная аутентификация успешно сброшена"), - "twofactorSetup": MessageLookupByLibrary.simpleMessage( - "Установка двуфакторной аутентификации"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage("Вход с 2FA"), "unarchive": MessageLookupByLibrary.simpleMessage("Разархивировать"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Разархивировать альбом"), "unarchiving": MessageLookupByLibrary.simpleMessage("Разархивирование..."), + "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( + "Извините, такого кода не существует."), "uncategorized": MessageLookupByLibrary.simpleMessage("Без категории"), "unhide": MessageLookupByLibrary.simpleMessage("Показать"), "unhideToAlbum": diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index 16f3eafe48..cd4bfa6c7d 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -167,8 +167,6 @@ class MessageLookup extends MessageLookupByLibrary { "confirm": MessageLookupByLibrary.simpleMessage("Bekräfta"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekräfta radering av konto"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, jag vill ta bort detta konto och all data permanent."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Bekräfta lösenord"), "confirmRecoveryKey": MessageLookupByLibrary.simpleMessage( @@ -272,6 +270,7 @@ class MessageLookup extends MessageLookupByLibrary { "goToSettings": MessageLookupByLibrary.simpleMessage("Gå till inställningar"), "guestView": MessageLookupByLibrary.simpleMessage("Gästvy"), + "help": MessageLookupByLibrary.simpleMessage("Hjälp"), "howItWorks": MessageLookupByLibrary.simpleMessage("Så här fungerar det"), "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_ta.dart b/mobile/lib/generated/intl/messages_ta.dart new file mode 100644 index 0000000000..30c00c6d72 --- /dev/null +++ b/mobile/lib/generated/intl/messages_ta.dart @@ -0,0 +1,53 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ta locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ta'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => { + "accountWelcomeBack": + MessageLookupByLibrary.simpleMessage("மீண்டும் வருக!"), + "askDeleteReason": MessageLookupByLibrary.simpleMessage( + "உங்கள் கணக்கை நீக்குவதற்கான முக்கிய காரணம் என்ன?"), + "cancel": MessageLookupByLibrary.simpleMessage("ரத்து செய்"), + "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( + "கணக்கு நீக்குதலை உறுதிப்படுத்தவும்"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "ஆம், எல்லா செயலிகளிலும் இந்தக் கணக்கையும் அதன் தரவையும் நிரந்தரமாக நீக்க விரும்புகிறேன்."), + "deleteAccount": MessageLookupByLibrary.simpleMessage("கணக்கை நீக்கு"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "நீங்கள் வெளியேறுவதை கண்டு வருந்துகிறோம். எங்களை மேம்படுத்த உதவ உங்கள் கருத்தைப் பகிரவும்."), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("கணக்கை நிரந்தரமாக நீக்கவும்"), + "deleteReason1": MessageLookupByLibrary.simpleMessage( + "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை"), + "email": MessageLookupByLibrary.simpleMessage("மின்னஞ்சல்"), + "enterValidEmail": MessageLookupByLibrary.simpleMessage( + "சரியான மின்னஞ்சல் முகவரியை உள்ளிடவும்."), + "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( + "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடவும்"), + "feedback": MessageLookupByLibrary.simpleMessage("பின்னூட்டம்"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("தவறான மின்னஞ்சல் முகவரி"), + "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( + "இந்த தகவலுடன் தயவுசெய்து எங்களுக்கு உதவுங்கள்"), + "verify": MessageLookupByLibrary.simpleMessage("சரிபார்க்கவும்") + }; +} diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index a1bc4df70a..1f16b0b2ab 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -99,8 +99,6 @@ class MessageLookup extends MessageLookupByLibrary { "confirm": MessageLookupByLibrary.simpleMessage("ยืนยัน"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("ยืนยันการลบบัญชี"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "ใช่ ฉันต้องการลบบัญชีนี้และข้อมูลที่เกี่ยวข้องทั้งหมดแบบถาวร"), "confirmPassword": MessageLookupByLibrary.simpleMessage("ยืนยันรหัสผ่าน"), "confirmRecoveryKey": diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index fd82236d0d..b5eb2a4e7e 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -432,8 +432,6 @@ class MessageLookup extends MessageLookupByLibrary { "İki adımlı kimlik doğrulamasını devre dışı bırakmak istediğinize emin misiniz?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Hesap silme işlemini onayla"), - "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Evet, bu hesabı ve tüm verileri kalıcı olarak silmek istiyorum."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Şifrenizi onaylayın"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 2a34fee561..acb22b6465 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -350,6 +350,9 @@ class MessageLookup extends MessageLookupByLibrary { "backupOverMobileData": MessageLookupByLibrary.simpleMessage("通过移动数据备份"), "backupSettings": MessageLookupByLibrary.simpleMessage("备份设置"), + "backupStatus": MessageLookupByLibrary.simpleMessage("备份状态"), + "backupStatusDescription": + MessageLookupByLibrary.simpleMessage("已备份的项目将显示在此处"), "backupVideos": MessageLookupByLibrary.simpleMessage("备份视频"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("黑色星期五特惠"), "blog": MessageLookupByLibrary.simpleMessage("博客"), @@ -439,7 +442,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("确认删除账户"), "confirmDeletePrompt": - MessageLookupByLibrary.simpleMessage("是的,我想永久删除此账户及其相关数据."), + MessageLookupByLibrary.simpleMessage("是的,我想永久删除此账户及其所有关联的应用程序的数据。"), "confirmPassword": MessageLookupByLibrary.simpleMessage("请确认密码"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage("确认更改计划"), "confirmRecoveryKey": MessageLookupByLibrary.simpleMessage("确认恢复密钥"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index e12296fb2c..c023f17710 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -6569,6 +6569,26 @@ class S { ); } + /// `Preserving {count} memories...` + String uploadingMultipleMemories(Object count) { + return Intl.message( + 'Preserving $count memories...', + name: 'uploadingMultipleMemories', + desc: '', + args: [count], + ); + } + + /// `Preserving 1 memory...` + String get uploadingSingleMemory { + return Intl.message( + 'Preserving 1 memory...', + name: 'uploadingSingleMemory', + desc: '', + args: [], + ); + } + /// `Archiving...` String get archiving { return Intl.message( @@ -9547,6 +9567,7 @@ class AppLocalizationDelegate extends LocalizationsDelegate { Locale.fromSubtags(languageCode: 'pt'), Locale.fromSubtags(languageCode: 'ru'), Locale.fromSubtags(languageCode: 'sv'), + Locale.fromSubtags(languageCode: 'ta'), Locale.fromSubtags(languageCode: 'te'), Locale.fromSubtags(languageCode: 'th'), Locale.fromSubtags(languageCode: 'ti'), diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index c252714447..7cc11a8f68 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -937,6 +937,8 @@ "encryptingBackup": "Encrypting backup...", "syncStopped": "Sync stopped", "syncProgress": "{completed}/{total} memories preserved", + "uploadingMultipleMemories" : "Preserving {count} memories...", + "uploadingSingleMemory": "Preserving 1 memory...", "@syncProgress": { "description": "Text to tell user how many memories have been preserved", "placeholders": { diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index 9342d8cf07..3e1960a83b 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -215,7 +215,8 @@ "after1Month": "אחרי חודש 1", "after1Year": "אחרי שנה 1", "manageParticipants": "נהל", - "albumParticipantsCount": "{count, plural, one {} two {{count} משתתפים} many {{count} משתתפים}=0 {אין משתתפים} =1 {1 משתתף} other {{count} משתתפים}}", + "albumParticipantsCount": "{count, plural, =0 {אין משתתפים} =1 {1 משתתף} two {2 משתתפים} other {{count} משתתפים}}", + "@albumParticipantsCount": { "placeholders": { "count": { @@ -236,7 +237,7 @@ "publicLinkEnabled": "לינק ציבורי אופשר", "shareALink": "שתף קישור", "sharedAlbumSectionDescription": "צור אלבומים הניתנים לשיתוף ושיתוף פעולה עם משתמשי ente אחרים, כולל משתמשים בתוכניות החינמיות.", - "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {} two {שותף עם {numberOfPeople} אנשים} many {שותף עם {numberOfPeople} אנשים}=0 {שתף עם אנשים ספציפיים} =1 {שותף עם איש 1} other {שותף עם {numberOfPeople} אנשים}}", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {שתף עם אנשים ספציפיים} =1 {שותף עם איש 1} two {שותף עם 2 אנשים} other {שותף עם {numberOfPeople} אנשים}}", "@shareWithPeopleSectionTitle": { "placeholders": { "numberOfPeople": { @@ -408,7 +409,7 @@ "skip": "דלג", "updatingFolderSelection": "מעדכן את בחירת התיקיות...", "itemCount": "{count, plural, one{{count} פריט} two {{count} פריטים} many {{count} פריטים} other{{count} פריטים}}", - "deleteItemCount": "{count, plural, one {} two {מחק {count} פריטים} many {מחק {count} פריטים}=1 {מחק {count} פריט} other {מחק {count} פריטים}}", + "deleteItemCount": "{count, plural, =1 {מחק {count} פריט} two {מחק {count} פריטים} other {מחק {count} פריטים}}", "duplicateItemsGroup": "{count} קבצים, כל אחד {formattedSize}", "@duplicateItemsGroup": { "description": "Display the number of duplicate files and their size", diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 1319dca79c..4a66be1e01 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -215,7 +215,7 @@ "after1Month": "Etter 1 måned", "after1Year": "Etter 1 år", "manageParticipants": "Administrer", - "albumParticipantsCount": "{count, plural, one {}=0 {Ingen deltakere} =1 {1 Deltaker} other {{count} Deltakere}}", + "albumParticipantsCount": "{count, plural, =0 {Ingen deltakere} =1 {1 deltaker} other {{count} deltakere}}", "@albumParticipantsCount": { "placeholders": { "count": { @@ -233,7 +233,8 @@ "linkHasExpired": "Lenken har utløpt", "publicLinkEnabled": "Offentlig lenke aktivert", "shareALink": "Del en lenke", - "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {}=0 {Del med bestemte personer} =1 {Delt med 1 person} other {Delt med {numberOfPeople} personer}}", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Del med bestemte personer} =1 {Delt med 1 person} other {Delt med {numberOfPeople} personer}}", + "@shareWithPeopleSectionTitle": { "placeholders": { "numberOfPeople": { diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index bfb0e0291a..4455c38fc5 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -236,7 +236,7 @@ "publicLinkEnabled": "Offentlig länk aktiverad", "shareALink": "Dela en länk", "sharedAlbumSectionDescription": "Skapa delade och samarbetande album med andra Ente användare, inklusive användare med gratisnivån.", - "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {}=0 {Dela med specifika personer} =1 {Delad med en person} other {Delad med {numberOfPeople} personer}}", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Dela med specifika personer} =1 {Delad med en person} other {Delad med {numberOfPeople} personer}}", "@shareWithPeopleSectionTitle": { "placeholders": { "numberOfPeople": { From 187a149716a4ee3c1c9e10eadb05f97d0d4e3f47 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:26:57 +0530 Subject: [PATCH 0881/1179] [mob] Show total memory count to upload --- mobile/lib/services/remote_sync_service.dart | 4 +++- mobile/lib/ui/home/status_bar_widget.dart | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/mobile/lib/services/remote_sync_service.dart b/mobile/lib/services/remote_sync_service.dart index eab8478a6c..c1348ba45f 100644 --- a/mobile/lib/services/remote_sync_service.dart +++ b/mobile/lib/services/remote_sync_service.dart @@ -581,7 +581,9 @@ class RemoteSyncService { _ignoredUploads = 0; final int toBeUploaded = filesToBeUploaded.length + updatedFileIDs.length; if (toBeUploaded > 0) { - Bus.instance.fire(SyncStatusUpdate(SyncStatus.preparingForUpload)); + Bus.instance.fire( + SyncStatusUpdate(SyncStatus.preparingForUpload, total: toBeUploaded), + ); await _uploader.verifyMediaLocationAccess(); await _uploader.checkNetworkForUpload(); // verify if files upload is allowed based on their subscription plan and diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index 461a92a1c9..d676a42945 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -231,6 +231,9 @@ class RefreshIndicatorWidget extends StatelessWidget { } String _getRefreshingText(BuildContext context) { + if (event == null) { + return S.of(context).loadingGallery; + } if (event!.status == SyncStatus.startedFirstGalleryImport || event!.status == SyncStatus.completedFirstGalleryImport) { return S.of(context).loadingGallery; @@ -239,7 +242,15 @@ class RefreshIndicatorWidget extends StatelessWidget { return S.of(context).syncing; } if (event!.status == SyncStatus.preparingForUpload) { - return S.of(context).encryptingBackup; + if (event!.total == null || event!.total! <= 0) { + return S.of(context).encryptingBackup; + } else if (event!.total == 1) { + return S.of(context).uploadingSingleMemory; + } else { + return S + .of(context) + .uploadingMultipleMemories(NumberFormat().format(event!.total!)); + } } if (event!.status == SyncStatus.inProgress) { final format = NumberFormat(); From 30d5fedb11d9ec49c246a257c45a7dcc1acf1d3a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 2 Sep 2024 15:19:44 +0530 Subject: [PATCH 0882/1179] sort by photo date --- .../new/photos/services/ml/cluster.ts | 41 ++++++++++++++++++- web/packages/new/photos/services/ml/index.ts | 13 +++--- web/packages/new/photos/services/ml/worker.ts | 6 ++- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster.ts b/web/packages/new/photos/services/ml/cluster.ts index 254988dea9..0b7de59b59 100644 --- a/web/packages/new/photos/services/ml/cluster.ts +++ b/web/packages/new/photos/services/ml/cluster.ts @@ -1,6 +1,8 @@ +import { assertionFailed } from "@/base/assert"; import { newNonSecureID } from "@/base/id-worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; +import type { EnteFile } from "../../types/file"; import { type EmbeddingCluster, clusterHdbscan } from "./cluster-hdb"; import type { Face, FaceIndex } from "./face"; import { dotProduct } from "./math"; @@ -175,6 +177,7 @@ export interface ClusterPreviewFace { */ export const clusterFaces = ( faceIndexes: FaceIndex[], + localFiles: EnteFile[], opts: ClusteringOpts, ) => { const { @@ -187,13 +190,33 @@ export const clusterFaces = ( } = opts; const t = Date.now(); + const localFileByID = new Map(localFiles.map((f) => [f.id, f])); + // A flattened array of faces. const allFaces = [...enumerateFaces(faceIndexes)]; - const faces = allFaces + const filteredFaces = allFaces .filter((f) => f.blur > minBlur) .filter((f) => f.score > minScore); // .slice(0, 2000); + const fileForFaceID = new Map( + filteredFaces.map(({ faceID }) => [ + faceID, + ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))), + ]), + ); + + const fileForFace = ({ faceID }: Face) => ensure(fileForFaceID.get(faceID)); + + // Sort faces so that photos taken temporally close together are close. + // + // This is a heuristic to help the clustering algorithm produce better results. + const faces = filteredFaces.sort( + (a, b) => + fileForFace(a).metadata.creationTime - + fileForFace(b).metadata.creationTime, + ); + // For fast reverse lookup - map from face ids to the face. const faceForFaceID = new Map(faces.map((f) => [f.faceID, f])); @@ -382,6 +405,7 @@ export const clusterFaces = ( filteredFaceCount, clusteredFaceCount, unclusteredFaceCount, + localFileByID, clusterPreviews, clusters: sortedClusters, cgroups, @@ -402,6 +426,21 @@ function* enumerateFaces(faceIndices: FaceIndex[]) { } } +/** + * Extract the fileID of the {@link EnteFile} to which the face belongs from its + * faceID. + * + * TODO-Cluster - duplicated with ml/index.ts + */ +const fileIDFromFaceID = (faceID: string) => { + const fileID = parseInt(faceID.split("_")[0] ?? ""); + if (isNaN(fileID)) { + assertionFailed(`Ignoring attempt to parse invalid faceID ${faceID}`); + return undefined; + } + return fileID; +}; + interface ClusterLinearResult { clusters: EmbeddingCluster[]; } diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 3bb6bb3eaf..37d961b165 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -16,7 +16,6 @@ import { ensure } from "@/utils/ensure"; import { throttled } from "@/utils/promise"; import { proxy, transfer } from "comlink"; import { isInternalUser } from "../feature-flags"; -import { getAllLocalFiles } from "../files"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import type { SearchPerson } from "../search/types"; import type { UploadItem } from "../upload/types"; @@ -381,11 +380,15 @@ export const wipClusterDebugPageContents = async ( _wip_searchPersons = undefined; triggerStatusUpdate(); - const { clusterPreviews, clusters, cgroups, unclusteredFaces, ...rest } = - await worker().then((w) => w.clusterFaces(opts)); + const { + localFileByID, + clusterPreviews, + clusters, + cgroups, + unclusteredFaces, + ...rest + } = await worker().then((w) => w.clusterFaces(opts)); - const localFiles = await getAllLocalFiles(); - const localFileByID = new Map(localFiles.map((f) => [f.id, f])); const fileForFace = ({ faceID }: Face) => ensure(localFileByID.get(ensure(fileIDFromFaceID(faceID)))); diff --git a/web/packages/new/photos/services/ml/worker.ts b/web/packages/new/photos/services/ml/worker.ts index c663abc2c9..391dc672f7 100644 --- a/web/packages/new/photos/services/ml/worker.ts +++ b/web/packages/new/photos/services/ml/worker.ts @@ -277,7 +277,11 @@ export class MLWorker { // TODO-Cluster async clusterFaces(opts: ClusteringOpts) { - return clusterFaces(await faceIndexes(), opts); + return clusterFaces( + await faceIndexes(), + await getAllLocalFiles(), + opts, + ); } } From ba083fff70b1664456f23bcb43ca9aba97209af6 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 2 Sep 2024 12:45:08 +0200 Subject: [PATCH 0883/1179] [mob][photos] exception handlign works in isolate --- mobile/lib/ui/settings/ml/ml_user_dev_screen.dart | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart index 1f75c95d5b..c50ede988f 100644 --- a/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart +++ b/mobile/lib/ui/settings/ml/ml_user_dev_screen.dart @@ -62,8 +62,17 @@ class MLUserDeveloperOptions extends StatelessWidget { buttonType: ButtonType.neutral, labelText: "Log something in isolate", onTap: () async { - final boolean = await MLComputer.instance.testLogging(); - showShortToast(context, "Done: $boolean"); + try { + final boolean = + await MLComputer.instance.testLogging(); + showShortToast(context, "Done: $boolean"); + } catch (e) { + // ignore: unawaited_futures + showGenericErrorDialog( + context: context, + error: e, + ); + } }, ), const SafeArea( From da316fdcfd38b9d9d94bc81380d2a2854266b1dd Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 2 Sep 2024 12:45:30 +0200 Subject: [PATCH 0884/1179] [mob][photos] refactor --- .../machine_learning/ml_computer.dart | 112 +++++++++--------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/mobile/lib/services/machine_learning/ml_computer.dart b/mobile/lib/services/machine_learning/ml_computer.dart index f0e01d4c7d..91f49925af 100644 --- a/mobile/lib/services/machine_learning/ml_computer.dart +++ b/mobile/lib/services/machine_learning/ml_computer.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import "dart:collection" show Queue; import "dart:io" show File; import 'dart:isolate'; import 'dart:typed_data' show Uint8List; @@ -75,56 +74,62 @@ class MLComputer { final args = message[1] as Map; final sendPort = message[2] as SendPort; + late final Object data; try { - switch (function) { - case MLComputerOperation.generateFaceThumbnails: - final imagePath = args['imagePath'] as String; - final Uint8List imageData = await File(imagePath).readAsBytes(); - final faceBoxesJson = - args['faceBoxesList'] as List>; - final List faceBoxes = - faceBoxesJson.map((json) => FaceBox.fromJson(json)).toList(); - final List results = - await generateFaceThumbnailsUsingCanvas( - imageData, - faceBoxes, - ); - sendPort.send(List.from(results)); - case MLComputerOperation.loadModel: - final modelName = args['modelName'] as String; - final modelPath = args['modelPath'] as String; - final int address = await MlModel.loadModel( - modelName, - modelPath, - ); - sendPort.send(address); - break; - case MLComputerOperation.initializeClipTokenizer: - final vocabPath = args["vocabPath"] as String; - await ClipTextTokenizer.instance.init(vocabPath); - sendPort.send(true); - break; - case MLComputerOperation.runClipText: - //TODO:lau check logging here - final textEmbedding = await ClipTextEncoder.predict(args); - sendPort.send(List.from(textEmbedding, growable: false)); - break; - case MLComputerOperation.testLogging: - final logger = Logger('XXX MLComputerTestLogging'); - logger.info("XXX logging from isolate is working!!!"); - final Queue logStrings = - isolateLogger.getLogStringsAndClear(); - final logs = List.from(logStrings); - sendPort.send({"data": true, "logs": logs}); - break; - } + data = await cases(function, args); } catch (e, stackTrace) { - sendPort - .send({'error': e.toString(), 'stackTrace': stackTrace.toString()}); + data = { + 'error': e.toString(), + 'stackTrace': stackTrace.toString(), + }; } + final logs = List.from(isolateLogger.getLogStringsAndClear()); + sendPort.send({"data": data, "logs": logs}); }); } + /// WARNING: Only return primitives: https://api.flutter.dev/flutter/dart-isolate/SendPort/send.html + static Future cases( + MLComputerOperation function, + Map args, + ) async { + switch (function) { + case MLComputerOperation.generateFaceThumbnails: + final imagePath = args['imagePath'] as String; + final Uint8List imageData = await File(imagePath).readAsBytes(); + final faceBoxesJson = + args['faceBoxesList'] as List>; + final List faceBoxes = + faceBoxesJson.map((json) => FaceBox.fromJson(json)).toList(); + final List results = await generateFaceThumbnailsUsingCanvas( + imageData, + faceBoxes, + ); + return List.from(results); + case MLComputerOperation.loadModel: + final modelName = args['modelName'] as String; + final modelPath = args['modelPath'] as String; + final int address = await MlModel.loadModel( + modelName, + modelPath, + ); + return address; + case MLComputerOperation.initializeClipTokenizer: + final vocabPath = args["vocabPath"] as String; + await ClipTextTokenizer.instance.init(vocabPath); + return true; + case MLComputerOperation.runClipText: + //TODO:lau check logging here + final textEmbedding = await ClipTextEncoder.predict(args); + return List.from(textEmbedding, growable: false); + case MLComputerOperation.testLogging: + final logger = Logger('XXX MLComputerTestLogging'); + logger.info("XXX logging from isolate is working!!!"); + throw Exception("XXX logging from isolate testing exception handling"); + return true; + } + } + /// The common method to run any operation in the isolate. It sends the [message] to [_isolateMain] and waits for the result. Future _runInIsolate( (MLComputerOperation, Map) message, @@ -137,15 +142,18 @@ class MLComputer { _mainSendPort.send([message.$1.index, message.$2, answerPort.sendPort]); answerPort.listen((receivedMessage) { - if (receivedMessage is Map && receivedMessage.containsKey('error')) { + final logs = receivedMessage['logs'] as List; + IsolateLogger.handLogStringsToMainLogger(logs); + final data = receivedMessage['data']; + if (data is Map && data.containsKey('error')) { // Handle the error - final errorMessage = receivedMessage['error']; - final errorStackTrace = receivedMessage['stackTrace']; + final errorMessage = data['error']; + final errorStackTrace = data['stackTrace']; final exception = Exception(errorMessage); final stackTrace = StackTrace.fromString(errorStackTrace); completer.completeError(exception, stackTrace); } else { - completer.complete(receivedMessage); + completer.complete(data); } }); @@ -240,10 +248,8 @@ class MLComputer { MLComputerOperation.testLogging, {}, ), - ) as Map; - final logs = result['logs'] as List; - IsolateLogger.handLogStringsToMainLogger(logs); - return result['data'] as bool; + ) as bool; + return result; } catch (e, s) { _logger.severe("XXX Could not test logging in isolate", e, s); rethrow; From 371dcf8ab9dfefca21555440703e7940d2b2b188 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 2 Sep 2024 16:47:49 +0530 Subject: [PATCH 0885/1179] More params --- web/apps/photos/src/pages/cluster-debug.tsx | 28 +++++++++- .../new/photos/services/ml/cluster.ts | 52 ++++++++----------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index d2f921b532..90c0f91c42 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -114,7 +114,9 @@ const OptionsForm: React.FC = ({ onCluster }) => { minScore: 0.8, minClusterSize: 2, joinThreshold: 0.7, - batchSize: 12500, + earlyExitThreshold: 0.2, + batchSize: 10000, + lookbackSize: 2500, }, onSubmit: (values) => onCluster({ @@ -123,7 +125,9 @@ const OptionsForm: React.FC = ({ onCluster }) => { minScore: toFloat(values.minScore), minClusterSize: toFloat(values.minClusterSize), joinThreshold: toFloat(values.joinThreshold), + earlyExitThreshold: toFloat(values.earlyExitThreshold), batchSize: toFloat(values.batchSize), + lookbackSize: toFloat(values.lookbackSize), }), }); @@ -171,6 +175,12 @@ const OptionsForm: React.FC = ({ onCluster }) => { size="small" onChange={handleChange} /> +
+ = ({ onCluster }) => { size="small" onChange={handleChange} /> + = ({ onCluster }) => { size="small" onChange={handleChange} /> + - +
), From 54290886eacbef8640cc9e3d1704ba7902060980 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:46:15 +0530 Subject: [PATCH 0960/1179] [mob] iOS build changes --- mobile/ios/Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 8ebcc2c8fe..c40e47d7ab 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -472,7 +472,7 @@ SPEC CHECKSUMS: image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43 image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 in_app_purchase_storekit: 0e4b3c2e43ba1e1281f4f46dd71b0593ce529892 - integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 local_auth_darwin: c7e464000a6a89e952235699e32b329457608d98 local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9 From f0bb00f97751872ce689174caf02053221274a8a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:47:29 +0530 Subject: [PATCH 0961/1179] [mob] Show backup status for internal users --- .../backup/backup_section_widget.dart | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/mobile/lib/ui/settings/backup/backup_section_widget.dart b/mobile/lib/ui/settings/backup/backup_section_widget.dart index 56ef0e02f7..15d885389c 100644 --- a/mobile/lib/ui/settings/backup/backup_section_widget.dart +++ b/mobile/lib/ui/settings/backup/backup_section_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/components/captioned_text_widget.dart"; import 'package:photos/ui/components/expandable_menu_item_widget.dart'; @@ -47,21 +48,22 @@ class BackupSectionWidgetState extends State { ); }, ), - sectionOptionSpacing, - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).backupStatus, + if (flagService.internalUser) sectionOptionSpacing, + if (flagService.internalUser) + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).backupStatus, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + await routeToPage( + context, + const BackupStatusScreen(), + ); + }, ), - pressedColor: getEnteColorScheme(context).fillFaint, - trailingIcon: Icons.chevron_right_outlined, - trailingIconIsMuted: true, - onTap: () async { - await routeToPage( - context, - const BackupStatusScreen(), - ); - }, - ), sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( From 67867cc127077e15abb6f70d14787e6d839229e6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:48:48 +0530 Subject: [PATCH 0962/1179] [mob] Remove noisy log --- mobile/lib/utils/network_util.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mobile/lib/utils/network_util.dart b/mobile/lib/utils/network_util.dart index a6e1fa0c44..de0cc0a2ba 100644 --- a/mobile/lib/utils/network_util.dart +++ b/mobile/lib/utils/network_util.dart @@ -1,5 +1,4 @@ import "package:connectivity_plus/connectivity_plus.dart"; -import "package:flutter/foundation.dart" show debugPrint; import "package:photos/core/configuration.dart"; Future canUseHighBandwidth() async { @@ -11,10 +10,6 @@ Future canUseHighBandwidth() async { if (!Configuration.instance.shouldBackupOverMobileData()) { if (connections.any((element) => element == ConnectivityResult.mobile)) { canUploadUnderCurrentNetworkConditions = false; - } else { - debugPrint( - "[canUseHighBandwidth] mobileBackupDisabled, backing up with connections: ${connections.map((e) => e.name).toString()}", - ); } } final canDownloadOverMobileData = From 006cddccd9125dbbf5e7f80862f1a2aba7cd624b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:25:34 +0530 Subject: [PATCH 0963/1179] [mob] Add change log --- mobile/lib/generated/intl/messages_de.dart | 14 ---- mobile/lib/generated/intl/messages_en.dart | 14 ---- mobile/lib/generated/intl/messages_fr.dart | 14 ---- mobile/lib/generated/intl/messages_nl.dart | 14 ---- mobile/lib/generated/intl/messages_pl.dart | 14 ---- mobile/lib/generated/intl/messages_pt.dart | 14 ---- mobile/lib/generated/intl/messages_ru.dart | 6 -- mobile/lib/generated/intl/messages_sv.dart | 3 - mobile/lib/generated/intl/messages_zh.dart | 12 ---- mobile/lib/generated/l10n.dart | 70 ------------------- mobile/lib/l10n/intl_en.arb | 7 -- mobile/lib/services/update_service.dart | 2 +- .../notification/update/change_log_page.dart | 17 +++-- 13 files changed, 11 insertions(+), 190 deletions(-) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 39cb25242a..9dda3f5b50 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -453,20 +453,6 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Status überprüfen"), "checking": MessageLookupByLibrary.simpleMessage("Wird geprüft..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Wähle Fotos aus und schau dir die \"Gastansicht\" an."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Du gibst dein Telefon aus der Hand, um Freunden Fotos zu zeigen? Keine Sorge, sie werden nicht zu weit blättern können. Die Gastansicht wird sie auf die von dir ausgewählten Fotos beschränken."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Gastansicht"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Wir haben Unterstützung für die Ansicht von Panoramafotos mit 360-Grad-Ansichten hinzugefügt. Dieses Erlebnis fesselt mit bewegungsbasierter Navigation!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Panoramabetrachter"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Einführung eines neuen Video-Players mit besserer Wiedergabesteuerung und Unterstützung für HDR-Videos."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Video-Player"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"), "claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 0ed936b2b2..f84dac22e9 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -441,20 +441,6 @@ class MessageLookup extends MessageLookupByLibrary { "Please check your inbox (and spam) to complete verification"), "checkStatus": MessageLookupByLibrary.simpleMessage("Check status"), "checking": MessageLookupByLibrary.simpleMessage("Checking..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Select photos and check out \"Guest view\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far. Guest view will lock them into the photos you select."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Guest View"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "We\'ve added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Panorama Viewer"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Introducing a fresh new video player, with better playback controls and support for HDR videos."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Video Player"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Claim free storage"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim more!"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 0bc74f251d..26521ad5dd 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -457,20 +457,6 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Vérifier le statut"), "checking": MessageLookupByLibrary.simpleMessage("Vérification..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Sélectionnez les photos et fixez les en \"Vue Invité\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Montrer des photos à un ami en les transmettant sur votre téléphone ? Ne vous inquiétez pas si vous les faites glisser trop loin.\nLa vue \"invité\" les verrouillera dans les photos que vous avez sélectionnées."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Vue invité"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Nous avons ajouté le support pour visionner des photos panoramiques avec des vues à 360 degrés. L\'expérience est immersive avec la navigation basée sur les mouvements !"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visionneuse en panorama"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Intégration d\'un nouveau lecteur vidéo, avec de meilleurs contrôles de lecture et la prise en charge des vidéos HDR."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Lecteur vidéo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Réclamer le stockage gratuit"), "claimMore": MessageLookupByLibrary.simpleMessage("Réclamez plus !"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 82cc94e1b9..714e272e20 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -454,20 +454,6 @@ class MessageLookup extends MessageLookupByLibrary { "checkStatus": MessageLookupByLibrary.simpleMessage("Status controleren"), "checking": MessageLookupByLibrary.simpleMessage("Controleren..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Selecteer foto\'s en bekijk \"Gastweergave\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Geeft u een vriend uw telefoon om foto\'s te laten zien? Maakt u zich geen zorgen dat ze te ver swipen. Gastweergave zal diegene beperken tot de foto\'s die u selecteert."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Gastweergave"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "We hebben ondersteuning toegevoegd voor het bekijken van panoramafoto\'s met 360 graden weergave. De ervaring is immersief met op beweging gebaseerde navigatie!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Panoramakijker"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Een verfrissende nieuwe videospeler, met betere afspeelknoppen en ondersteuning voor HDR-video\'s."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Videospeler"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("Claim gratis opslag"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim meer!"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index ab1cc44c6c..c0eb586303 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -454,20 +454,6 @@ class MessageLookup extends MessageLookupByLibrary { "Sprawdź swoją skrzynkę odbiorczą (i spam), aby zakończyć weryfikację"), "checkStatus": MessageLookupByLibrary.simpleMessage("Sprawdź stan"), "checking": MessageLookupByLibrary.simpleMessage("Sprawdzanie..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Wybierz zdjęcia i sprawdź \"Widok gościa\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Przekazujesz swój telefon, aby pokazać zdjęcia przyjacielowi? Nie martw się, że przesuną się zbyt daleko. Widok gościa zablokuje ich w wybranych przez Ciebie zdjęciach."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Widok Gościa"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Dodaliśmy wsparcie dla przeglądania zdjęć panoramy z widokami 360 stopni. Doświadczenie jest imersyjne z nawigacją opartą na ruchu!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Przeglądarka Panoramy"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Wprowadzamy nowy odtwarzacz wideo z lepszym sterowaniem odtwarzania i obsługą wideo HDR."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Odtwarzacz Wideo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Odbierz bezpłatną przestrzeń dyskową"), "claimMore": MessageLookupByLibrary.simpleMessage("Zdobądź więcej!"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 709d961ae5..d0eee7fff0 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -452,20 +452,6 @@ class MessageLookup extends MessageLookupByLibrary { "Verifique sua caixa de entrada (e spam) para concluir a verificação"), "checkStatus": MessageLookupByLibrary.simpleMessage("Verificar status"), "checking": MessageLookupByLibrary.simpleMessage("Verificando..."), - "cl_guest_view_call_to_action": MessageLookupByLibrary.simpleMessage( - "Selecione fotos e confira \"Visão de convidado\"."), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "Passar o telefone para mostrar fotos para um amigo? Não se preocupe com eles deslizando demais. A visualização de convidado irá bloqueá-los nas fotos que você selecionar."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Visão de Convidado"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "Adicionamos suporte para visualizar fotos panorama com visualização de 360 graus. A experiência é envolvida com a navegação baseada em movimentos!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Visualizador de Panoramas"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "Apresentando um novo reprodutor de vídeo, com melhores controles de reprodução e suporte para vídeos HDR."), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Reprodutor de Vídeo"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Reivindicar armazenamento gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Reivindique mais!"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index d7d9696a7f..35d3d88034 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -442,12 +442,6 @@ class MessageLookup extends MessageLookupByLibrary { "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения верификации"), "checkStatus": MessageLookupByLibrary.simpleMessage("Проверить статус"), "checking": MessageLookupByLibrary.simpleMessage("Проверка..."), - "cl_guest_view_title": - MessageLookupByLibrary.simpleMessage("Гостевой вид"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("Просмотр Панорамы"), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Видеоплеер"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( "Получить бесплатное хранилище"), "claimMore": MessageLookupByLibrary.simpleMessage("Получите больше!"), diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index ec7ce7da97..4fe95b6ae6 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -144,9 +144,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ändra behörighet?"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Kontrollera din inkorg (och skräppost) för att slutföra verifieringen"), - "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("Gästvy"), - "cl_video_player_title": - MessageLookupByLibrary.simpleMessage("Videospelare"), "claimed": MessageLookupByLibrary.simpleMessage("Nyttjad"), "close": MessageLookupByLibrary.simpleMessage("Stäng"), "codeAppliedPageTitle": diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 984cf363dd..0d998a8be7 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -392,18 +392,6 @@ class MessageLookup extends MessageLookupByLibrary { "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证"), "checkStatus": MessageLookupByLibrary.simpleMessage("检查状态"), "checking": MessageLookupByLibrary.simpleMessage("正在检查..."), - "cl_guest_view_call_to_action": - MessageLookupByLibrary.simpleMessage("选择照片并使用“访客视图”。"), - "cl_guest_view_description": MessageLookupByLibrary.simpleMessage( - "把手机交给朋友看照片?不用担心 Ta 们滑动屏幕乱看照片。访客视图会将 Ta 们锁定在您选择的照片中。"), - "cl_guest_view_title": MessageLookupByLibrary.simpleMessage("访客视图"), - "cl_panorama_viewer_description": MessageLookupByLibrary.simpleMessage( - "我们添加了对 360 度全景照片的支持。通过基于动作的导航,用户可获得身临其境的体验!"), - "cl_panorama_viewer_title": - MessageLookupByLibrary.simpleMessage("全景图查看器"), - "cl_video_player_description": MessageLookupByLibrary.simpleMessage( - "推出全新的视频播放器,提供更好的播放控制并添加了对 HDR 视频的支持。"), - "cl_video_player_title": MessageLookupByLibrary.simpleMessage("视频播放器"), "claimFreeStorage": MessageLookupByLibrary.simpleMessage("领取免费存储"), "claimMore": MessageLookupByLibrary.simpleMessage("领取更多!"), "claimed": MessageLookupByLibrary.simpleMessage("已领取"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index ac419440b5..2961014e90 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9435,76 +9435,6 @@ class S { ); } - /// `Guest View` - String get cl_guest_view_title { - return Intl.message( - 'Guest View', - name: 'cl_guest_view_title', - desc: '', - args: [], - ); - } - - /// `Handing over your phone to show photos to a friend? Don't worry about them swiping too far. Guest view will lock them into the photos you select.` - String get cl_guest_view_description { - return Intl.message( - 'Handing over your phone to show photos to a friend? Don\'t worry about them swiping too far. Guest view will lock them into the photos you select.', - name: 'cl_guest_view_description', - desc: '', - args: [], - ); - } - - /// `Select photos and check out "Guest view".` - String get cl_guest_view_call_to_action { - return Intl.message( - 'Select photos and check out "Guest view".', - name: 'cl_guest_view_call_to_action', - desc: '', - args: [], - ); - } - - /// `Panorama Viewer` - String get cl_panorama_viewer_title { - return Intl.message( - 'Panorama Viewer', - name: 'cl_panorama_viewer_title', - desc: '', - args: [], - ); - } - - /// `We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!` - String get cl_panorama_viewer_description { - return Intl.message( - 'We\'ve added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!', - name: 'cl_panorama_viewer_description', - desc: '', - args: [], - ); - } - - /// `Video Player` - String get cl_video_player_title { - return Intl.message( - 'Video Player', - name: 'cl_video_player_title', - desc: '', - args: [], - ); - } - - /// `Introducing a fresh new video player, with better playback controls and support for HDR videos.` - String get cl_video_player_description { - return Intl.message( - 'Introducing a fresh new video player, with better playback controls and support for HDR videos.', - name: 'cl_video_player_description', - desc: '', - args: [], - ); - } - /// `Choose between your device's default lock screen and a custom lock screen with a PIN or password.` String get appLockDescriptions { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index ce249f716f..8b029817b7 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1310,13 +1310,6 @@ "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "This will remove public links of all selected quick links.", "guestView": "Guest view", "guestViewEnablePreSteps": "To enable guest view, please setup device passcode or screen lock in your system settings.", - "cl_guest_view_title": "Guest View", - "cl_guest_view_description": "Handing over your phone to show photos to a friend? Don't worry about them swiping too far. Guest view will lock them into the photos you select.", - "cl_guest_view_call_to_action": "Select photos and check out \"Guest view\".", - "cl_panorama_viewer_title": "Panorama Viewer", - "cl_panorama_viewer_description": "We've added support for viewing panorama photos with 360 degree views. The experience is immersive with motion-based navigation!", - "cl_video_player_title": "Video Player", - "cl_video_player_description": "Introducing a fresh new video player, with better playback controls and support for HDR videos.", "appLockDescriptions": "Choose between your device's default lock screen and a custom lock screen with a PIN or password.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "authToViewPasskey": "Please authenticate to view your passkey", diff --git a/mobile/lib/services/update_service.dart b/mobile/lib/services/update_service.dart index e31d8c9e55..808d4d7774 100644 --- a/mobile/lib/services/update_service.dart +++ b/mobile/lib/services/update_service.dart @@ -16,7 +16,7 @@ class UpdateService { static final UpdateService instance = UpdateService._privateConstructor(); static const kUpdateAvailableShownTimeKey = "update_available_shown_time_key"; static const changeLogVersionKey = "update_change_log_key"; - static const currentChangeLogVersion = 22; + static const currentChangeLogVersion = 23; LatestVersionInfo? _latestVersion; final _logger = Logger("UpdateService"); diff --git a/mobile/lib/ui/notification/update/change_log_page.dart b/mobile/lib/ui/notification/update/change_log_page.dart index b20bb433f3..02ee66ff39 100644 --- a/mobile/lib/ui/notification/update/change_log_page.dart +++ b/mobile/lib/ui/notification/update/change_log_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; -import "package:photos/l10n/l10n.dart"; import 'package:photos/services/update_service.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; @@ -115,16 +114,20 @@ class _ChangeLogPageState extends State { final List items = []; items.addAll([ ChangeLogEntry( - ctx.l10n.cl_guest_view_title, - '${ctx.l10n.cl_guest_view_description}\n\n${ctx.l10n.cl_guest_view_call_to_action}', + 'Personal referral codes', + 'Claim your personal code to invite friends now. Earn 10GB free for every successful referral.', ), ChangeLogEntry( - ctx.l10n.cl_panorama_viewer_title, - ctx.l10n.cl_panorama_viewer_description, + 'Resumable uploads', + 'We\'ve added support for resuming uploads across app sessions. Please enable this from Backup settings.', ), ChangeLogEntry( - ctx.l10n.cl_video_player_title, - ctx.l10n.cl_video_player_description, + 'Quick links', + 'Created too many links to share? You can select and clear multiple in one go now.', + ), + ChangeLogEntry( + 'App lock', + 'We\'ve introduced an option to hide Ente from your app switcher. Check out Security > App lock.', ), ]); From a33cff7406f738ebc0644239b5e28b78cc573eea Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:34:24 +0530 Subject: [PATCH 0964/1179] [mob] Fix icon --- .../ui/notification/update/change_log_page.dart | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mobile/lib/ui/notification/update/change_log_page.dart b/mobile/lib/ui/notification/update/change_log_page.dart index 02ee66ff39..1c8c69a3d2 100644 --- a/mobile/lib/ui/notification/update/change_log_page.dart +++ b/mobile/lib/ui/notification/update/change_log_page.dart @@ -1,3 +1,5 @@ +import "dart:async"; + import 'package:flutter/material.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/update_service.dart'; @@ -6,7 +8,9 @@ import 'package:photos/ui/components/buttons/button_widget.dart'; import 'package:photos/ui/components/divider_widget.dart'; import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/components/title_bar_title_widget.dart'; +import "package:photos/ui/growth/referral_screen.dart"; import 'package:photos/ui/notification/update/change_log_entry.dart'; +import "package:photos/utils/navigation_util.dart"; class ChangeLogPage extends StatefulWidget { const ChangeLogPage({ @@ -91,11 +95,16 @@ class _ChangeLogPageState extends State { ButtonWidget( buttonType: ButtonType.trailingIconSecondary, buttonSize: ButtonSize.large, - labelText: S.of(context).rateTheApp, - icon: Icons.favorite_rounded, + labelText: 'Claim referral code', + icon: Icons.arrow_forward_outlined, iconColor: enteColorScheme.primary500, onTap: () async { - await UpdateService.instance.launchReviewUrl(); + unawaited( + routeToPage( + context, + const ReferralScreen(), + ), + ); }, ), const SizedBox(height: 8), From 85230b5123fe5b714d9b0b8412bac1c2629b0d5d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:34:46 +0530 Subject: [PATCH 0965/1179] [mob] Pop only when there's screen in stack --- mobile/lib/ui/growth/referral_screen.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/growth/referral_screen.dart b/mobile/lib/ui/growth/referral_screen.dart index d2897dd381..7e8cdef434 100644 --- a/mobile/lib/ui/growth/referral_screen.dart +++ b/mobile/lib/ui/growth/referral_screen.dart @@ -63,8 +63,12 @@ class _ReferralScreenState extends State { icon: Icons.close_outlined, iconButtonType: IconButtonType.secondary, onTap: () { - Navigator.pop(context); - Navigator.pop(context); + if (Navigator.canPop(context)) { + Navigator.pop(context); + } + if (Navigator.canPop(context)) { + Navigator.pop(context); + } }, ), ], From 0a1e062caf7c7a32971f2241aa6225aefdc40149 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:44:08 +0530 Subject: [PATCH 0966/1179] [mob] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 8be6413795..af3f6f460f 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.34+934 +version: 0.9.35+935 publish_to: none environment: From c416819f0a924bfa0b17d41c34c4f11bf3d6fbb8 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:18:06 +0530 Subject: [PATCH 0967/1179] [server] Increase duration of free trial --- server/ente/billing.go | 4 ++-- server/pkg/utils/billing/billing.go | 2 +- server/pkg/utils/time/time.go | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/server/ente/billing.go b/server/ente/billing.go index 111d0847e7..0aa8faf2c4 100644 --- a/server/ente/billing.go +++ b/server/ente/billing.go @@ -16,8 +16,8 @@ const ( FreePlanProductID = "free" // FreePlanTransactionID is the dummy transaction ID for the free plan FreePlanTransactionID = "none" - // TrialPeriodDuration is the duration of the free trial - TrialPeriodDuration = 365 + // TrialPeriodDuration is the duration (in years) of the free trial + TrialPeriodDuration = 100 // TrialPeriod is the unit for the duration of the free trial TrialPeriod = "days" diff --git a/server/pkg/utils/billing/billing.go b/server/pkg/utils/billing/billing.go index d5f5f57057..e6e0e6a718 100644 --- a/server/pkg/utils/billing/billing.go +++ b/server/pkg/utils/billing/billing.go @@ -108,7 +108,7 @@ func GetFreeSubscription(userID int64) ente.Subscription { ProductID: ente.FreePlanProductID, OriginalTransactionID: ente.FreePlanTransactionID, Storage: ente.FreePlanStorage, - ExpiryTime: time.NDaysFromNow(ente.TrialPeriodDuration), + ExpiryTime: time.NYearsFromNow(ente.TrialPeriodDuration), } } diff --git a/server/pkg/utils/time/time.go b/server/pkg/utils/time/time.go index a07df4b262..b4fda7f68b 100644 --- a/server/pkg/utils/time/time.go +++ b/server/pkg/utils/time/time.go @@ -48,6 +48,10 @@ func NDaysFromNow(n int) int64 { return time.Now().AddDate(0, 0, n).UnixNano() / 1000 } +func NYearsFromNow(n int) int64 { + return time.Now().AddDate(n, 0, 0).UnixNano() / 1000 +} + // NMinFromNow returns the time n min from now in micro seconds func NMinFromNow(n int64) int64 { return time.Now().Add(time.Minute*time.Duration(n)).UnixNano() / 1000 From 5395ca5caf21215d82913bd8557ac885b2416374 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Wed, 4 Sep 2024 12:18:55 +0530 Subject: [PATCH 0968/1179] UI 3 --- web/apps/photos/src/pages/cluster-debug.tsx | 15 ++++++++++----- web/packages/new/photos/services/ml/cluster.ts | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/web/apps/photos/src/pages/cluster-debug.tsx b/web/apps/photos/src/pages/cluster-debug.tsx index 75722d4a87..e5f8148fbc 100644 --- a/web/apps/photos/src/pages/cluster-debug.tsx +++ b/web/apps/photos/src/pages/cluster-debug.tsx @@ -74,7 +74,7 @@ export default function ClusterDebug() { earlyExitThreshold: 0.9, batchSize: 10000, offsetIncrement: 7500, - filterBadFaces: true, + badFaceHeuristics: true, }, onSubmit: (values) => cluster( @@ -86,7 +86,7 @@ export default function ClusterDebug() { earlyExitThreshold: toFloat(values.earlyExitThreshold), batchSize: toFloat(values.batchSize), offsetIncrement: toFloat(values.offsetIncrement), - filterBadFaces: values.filterBadFaces, + badFaceHeuristics: values.badFaceHeuristics, }, (progress: ClusteringProgress) => onProgressRef.current?.(progress), @@ -235,12 +235,17 @@ const MemoizedForm = memo( } - label="filterBadFaces" + label={ + + Bad face heuristics + + } /> - ); -}; diff --git a/web/apps/photos/src/components/pages/sharedAlbum/SelectedFileOptions.tsx b/web/apps/photos/src/components/pages/sharedAlbum/SelectedFileOptions.tsx deleted file mode 100644 index c8a369ba16..0000000000 --- a/web/apps/photos/src/components/pages/sharedAlbum/SelectedFileOptions.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { SelectionBar } from "@/base/components/Navbar"; -import { FluidContainer } from "@ente/shared/components/Container"; -import CloseIcon from "@mui/icons-material/Close"; -import DownloadIcon from "@mui/icons-material/Download"; -import { Box, IconButton, Stack, Tooltip } from "@mui/material"; -import { t } from "i18next"; -import { formatNumber } from "utils/number/format"; - -interface Props { - count: number; - clearSelection: () => void; - downloadFilesHelper: () => void; -} - -const SelectedFileOptions = ({ - downloadFilesHelper, - count, - clearSelection, -}: Props) => { - return ( - - - - - - - {formatNumber(count)} {t("SELECTED")}{" "} - - - - - - - - - - - ); -}; - -export default SelectedFileOptions; diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index 40ea624523..60d833205b 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -1,5 +1,6 @@ -import { SelectionBar } from "@/base/components/Navbar"; +import { NavbarBase, SelectionBar } from "@/base/components/Navbar"; import { sharedCryptoWorker } from "@/base/crypto"; +import { useIsTouchscreen } from "@/base/hooks"; import log from "@/base/log"; import downloadManager from "@/new/photos/services/download"; import { EnteFile } from "@/new/photos/types/file"; @@ -26,11 +27,12 @@ import CloseIcon from "@mui/icons-material/Close"; import DownloadIcon from "@mui/icons-material/Download"; import FileDownloadOutlinedIcon from "@mui/icons-material/FileDownloadOutlined"; import MoreHoriz from "@mui/icons-material/MoreHoriz"; -import { Box, IconButton, Stack, Tooltip } from "@mui/material"; +import { Box, Button, IconButton, Stack, Tooltip } from "@mui/material"; import Typography from "@mui/material/Typography"; import bs58 from "bs58"; import { CollectionInfo } from "components/Collections/CollectionInfo"; import { CollectionInfoBarWrapper } from "components/Collections/styledComponents"; +import { EnteLogo } from "components/EnteLogo"; import { FilesDownloadProgress, FilesDownloadProgressAttributes, @@ -42,7 +44,6 @@ import { ITEM_TYPE, TimeStampListItem } from "components/PhotoList"; import { UploadButton } from "components/Upload/UploadButton"; import Uploader from "components/Upload/Uploader"; import { UploadSelectorInputs } from "components/UploadSelectorInputs"; -import SharedAlbumNavbar from "components/pages/sharedAlbum/Navbar"; import { t } from "i18next"; import { useRouter } from "next/router"; import { AppContext } from "pages/_app"; @@ -609,6 +610,55 @@ export default function PublicCollectionGallery() { ); } +function SharedAlbumNavbar({ showUploadButton, openUploader }) { + return ( + + + + + {showUploadButton ? ( + } + text={t("ADD_PHOTOS")} + /> + ) : ( + + )} + + ); +} + +const EnteLinkLogo: React.FC = () => { + return ( + + ({ + ":hover": { + cursor: "pointer", + svg: { + fill: theme.colors.text.faint, + }, + }, + })} + > + + + + ); +}; + +const GoToEnte: React.FC = () => { + // Touchscreen devices are overwhemingly likely to be Android or iOS. + const isTouchscreen = useIsTouchscreen(); + + return ( + + ); +}; + interface SelectedFileOptionsProps { count: number; clearSelection: () => void; From 69ec80831c5be2bea369c0edcbac658a387bda91 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 9 Sep 2024 19:02:23 +0530 Subject: [PATCH 1137/1179] Dup --- web/apps/photos/src/pages/gallery.tsx | 78 +++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 6cde8ae753..3fb092f681 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -42,8 +42,15 @@ import { } from "@ente/shared/storage/sessionStorage"; import type { User } from "@ente/shared/user/types"; import ArrowBack from "@mui/icons-material/ArrowBack"; +import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import MenuIcon from "@mui/icons-material/Menu"; -import { IconButton, Typography, styled } from "@mui/material"; +import { + Button, + ButtonProps, + IconButton, + Typography, + styled, +} from "@mui/material"; import AuthenticateUserModal from "components/AuthenticateUserModal"; import Collections from "components/Collections"; import { CollectionInfo } from "components/Collections/CollectionInfo"; @@ -69,8 +76,7 @@ import PhotoFrame from "components/PhotoFrame"; import { ITEM_TYPE, TimeStampListItem } from "components/PhotoList"; import { SearchBar, type UpdateSearch } from "components/SearchBar"; import Sidebar from "components/Sidebar"; -import { UploadButton } from "components/Upload/UploadButton"; -import type { UploadTypeSelectorIntent } from "components/Upload/UploadTypeSelector"; +import { type UploadTypeSelectorIntent } from "components/Upload/UploadTypeSelector"; import Uploader from "components/Upload/Uploader"; import { UploadSelectorInputs } from "components/UploadSelectorInputs"; import PlanSelector from "components/pages/gallery/PlanSelector"; @@ -1299,6 +1305,72 @@ const NormalNavbarContents: React.FC = ({ ); }; +interface UploadButtonProps { + openUploader: (intent?: UploadTypeSelectorIntent) => void; + text?: string; + color?: ButtonProps["color"]; + disableShrink?: boolean; + icon?: JSX.Element; +} +export const UploadButton: React.FC = ({ + openUploader, + text, + color, + disableShrink, + icon, +}) => { + const onClickHandler = () => openUploader(); + + return ( + + + + + {icon ?? } + + + ); +}; + +const UploadButton_ = styled("div")<{ $disableShrink: boolean }>` + display: flex; + align-items: center; + justify-content: center; + transition: opacity 1s ease; + cursor: pointer; + & .mobile-button { + display: none; + } + ${({ $disableShrink }) => + !$disableShrink && + `@media (max-width: 624px) { + & .mobile-button { + display: inline-flex; + } + & .desktop-button { + display: none; + } + }`} +`; + interface HiddenSectionNavbarContentsProps { onBack: () => void; } From ff5826ec212fd575ed55dd81ec05ef30ce7b2046 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 9 Sep 2024 19:06:26 +0530 Subject: [PATCH 1138/1179] Bespoke --- web/apps/photos/src/pages/gallery.tsx | 53 +++++++++------------------ 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 3fb092f681..15988a23b7 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -44,13 +44,7 @@ import type { User } from "@ente/shared/user/types"; import ArrowBack from "@mui/icons-material/ArrowBack"; import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import MenuIcon from "@mui/icons-material/Menu"; -import { - Button, - ButtonProps, - IconButton, - Typography, - styled, -} from "@mui/material"; +import { Button, IconButton, Typography, styled } from "@mui/material"; import AuthenticateUserModal from "components/AuthenticateUserModal"; import Collections from "components/Collections"; import { CollectionInfo } from "components/Collections/CollectionInfo"; @@ -1300,57 +1294,46 @@ const NormalNavbarContents: React.FC = ({ files={files} updateSearch={updateSearch} /> - {!isInSearchMode && } + {!isInSearchMode && } ); }; interface UploadButtonProps { - openUploader: (intent?: UploadTypeSelectorIntent) => void; - text?: string; - color?: ButtonProps["color"]; - disableShrink?: boolean; - icon?: JSX.Element; + onClick: () => void; } -export const UploadButton: React.FC = ({ - openUploader, - text, - color, - disableShrink, - icon, -}) => { - const onClickHandler = () => openUploader(); +export const UploadButton: React.FC = ({ onClick }) => { + const disabled = !uploadManager.shouldAllowNewUpload(); return ( - {icon ?? } + {} ); }; -const UploadButton_ = styled("div")<{ $disableShrink: boolean }>` +const UploadButton_ = styled("div")` display: flex; align-items: center; justify-content: center; @@ -1359,16 +1342,14 @@ const UploadButton_ = styled("div")<{ $disableShrink: boolean }>` & .mobile-button { display: none; } - ${({ $disableShrink }) => - !$disableShrink && - `@media (max-width: 624px) { + @media (max-width: 624px) { & .mobile-button { display: inline-flex; } & .desktop-button { display: none; } - }`} + } `; interface HiddenSectionNavbarContentsProps { From 62cdfc9680786db49b4f8093d5aaadb80f721af6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 9 Sep 2024 19:12:48 +0530 Subject: [PATCH 1139/1179] Same breakpoint --- web/apps/photos/src/pages/gallery.tsx | 53 +++++++++------------------ 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 15988a23b7..10521db484 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -1,5 +1,6 @@ import { stashRedirect } from "@/accounts/services/redirect"; import { NavbarBase } from "@/base/components/Navbar"; +import { useIsMobileWidth } from "@/base/hooks"; import log from "@/base/log"; import { WhatsNew } from "@/new/photos/components/WhatsNew"; import { shouldShowWhatsNew } from "@/new/photos/services/changelog"; @@ -1304,31 +1305,24 @@ interface UploadButtonProps { } export const UploadButton: React.FC = ({ onClick }) => { const disabled = !uploadManager.shouldAllowNewUpload(); + const isMobileWidth = useIsMobileWidth(); return ( - - - - - {} - + + {isMobileWidth ? ( + + {} + + ) : ( + + )} ); }; @@ -1337,19 +1331,6 @@ const UploadButton_ = styled("div")` display: flex; align-items: center; justify-content: center; - transition: opacity 1s ease; - cursor: pointer; - & .mobile-button { - display: none; - } - @media (max-width: 624px) { - & .mobile-button { - display: inline-flex; - } - & .desktop-button { - display: none; - } - } `; interface HiddenSectionNavbarContentsProps { From c161d6272a2ecf50fb9feaf7d3b12fb8eb93a246 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 9 Sep 2024 19:24:33 +0530 Subject: [PATCH 1140/1179] Remove unnecessary wrapper --- web/apps/photos/src/pages/gallery.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 10521db484..f1feef4b8d 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -45,7 +45,7 @@ import type { User } from "@ente/shared/user/types"; import ArrowBack from "@mui/icons-material/ArrowBack"; import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import MenuIcon from "@mui/icons-material/Menu"; -import { Button, IconButton, Typography, styled } from "@mui/material"; +import { Box, Button, IconButton, Typography, styled } from "@mui/material"; import AuthenticateUserModal from "components/AuthenticateUserModal"; import Collections from "components/Collections"; import { CollectionInfo } from "components/Collections/CollectionInfo"; @@ -1308,7 +1308,7 @@ export const UploadButton: React.FC = ({ onClick }) => { const isMobileWidth = useIsMobileWidth(); return ( - + {isMobileWidth ? ( {} @@ -1323,16 +1323,10 @@ export const UploadButton: React.FC = ({ onClick }) => { {t("upload")} )} - + ); }; -const UploadButton_ = styled("div")` - display: flex; - align-items: center; - justify-content: center; -`; - interface HiddenSectionNavbarContentsProps { onBack: () => void; } From 6a76583e1ba3ea28f3a9013af866b3e43b7716df Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 9 Sep 2024 19:25:59 +0530 Subject: [PATCH 1141/1179] Rely on the button's behavior --- web/apps/photos/src/pages/gallery.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index f1feef4b8d..2a027888cf 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -1308,7 +1308,7 @@ export const UploadButton: React.FC = ({ onClick }) => { const isMobileWidth = useIsMobileWidth(); return ( - + {isMobileWidth ? ( {} From cc2b0a610f24013cb25a239ee2a69c80fd2be14d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:38:24 +0530 Subject: [PATCH 1142/1179] [mob] Add additional logs & error handling on permission grant screen --- .../lib/ui/home/grant_permissions_widget.dart | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/mobile/lib/ui/home/grant_permissions_widget.dart b/mobile/lib/ui/home/grant_permissions_widget.dart index 3139d27c1d..1543287ed9 100644 --- a/mobile/lib/ui/home/grant_permissions_widget.dart +++ b/mobile/lib/ui/home/grant_permissions_widget.dart @@ -2,11 +2,13 @@ import "dart:async"; import 'dart:io'; import 'package:flutter/material.dart'; +import "package:logging/logging.dart"; import 'package:photo_manager/photo_manager.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/sync_service.dart'; import "package:photos/theme/ente_theme.dart"; import "package:photos/utils/debouncer.dart"; +import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/email_util.dart"; import "package:photos/utils/photo_manager_util.dart"; import "package:styled_text/styled_text.dart"; @@ -20,6 +22,7 @@ class GrantPermissionsWidget extends StatefulWidget { class _GrantPermissionsWidgetState extends State { final _debouncer = Debouncer(const Duration(milliseconds: 500)); + final Logger _logger = Logger("_GrantPermissionsWidgetState"); @override void dispose() { @@ -124,42 +127,55 @@ class _GrantPermissionsWidgetState extends State { key: const ValueKey("grantPermissionButton"), child: Text(S.of(context).grantPermission), onPressed: () async { - final state = await requestPhotoMangerPermissions(); - if (state == PermissionState.authorized || - state == PermissionState.limited) { - await SyncService.instance.onPermissionGranted(state); - } else if (state == PermissionState.denied) { - final AlertDialog alert = AlertDialog( - title: Text(S.of(context).pleaseGrantPermissions), - content: Text( - S.of(context).enteCanEncryptAndPreserveFilesOnlyIfYouGrant, - ), - actions: [ - TextButton( - child: Text( - S.of(context).ok, - style: Theme.of(context).textTheme.titleMedium!.copyWith( - fontSize: 14, - fontWeight: FontWeight.w700, - ), - ), - onPressed: () { - Navigator.of(context, rootNavigator: true).pop('dialog'); - if (Platform.isIOS) { - PhotoManager.openSetting(); - } - }, + try { + final state = await requestPhotoMangerPermissions(); + _logger.info("Permission state: $state"); + if (state == PermissionState.authorized || + state == PermissionState.limited) { + await SyncService.instance.onPermissionGranted(state); + } else if (state == PermissionState.denied) { + final AlertDialog alert = AlertDialog( + title: Text(S.of(context).pleaseGrantPermissions), + content: Text( + S.of(context).enteCanEncryptAndPreserveFilesOnlyIfYouGrant, ), - ], - ); - // ignore: unawaited_futures - showDialog( - context: context, - builder: (BuildContext context) { - return alert; - }, - barrierColor: Colors.black12, + actions: [ + TextButton( + child: Text( + S.of(context).ok, + style: + Theme.of(context).textTheme.titleMedium!.copyWith( + fontSize: 14, + fontWeight: FontWeight.w700, + ), + ), + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + if (Platform.isIOS) { + PhotoManager.openSetting(); + } + }, + ), + ], + ); + // ignore: unawaited_futures + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + barrierColor: Colors.black12, + ); + } else { + throw Exception("Unknown permission state: $state"); + } + } catch (e) { + _logger.severe( + "Failed to request permission: ${e.toString()}", + e, ); + showGenericErrorDialog(context: context, error: e).ignore(); } }, ), From 7f0e2bcb9eab542ae6099ac84afcb23a1cbd687b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:39:22 +0530 Subject: [PATCH 1143/1179] [mob] Bump version v0.9.36 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index cfd99bfddc..5c0da1ab66 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.9.35+935 +version: 0.9.36+936 publish_to: none environment: From a84cc07aa23ca68357a673240c2b6acc4f2f09d0 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 9 Sep 2024 13:43:35 -0400 Subject: [PATCH 1144/1179] [desktop][photos] Use antialias with clip image --- web/packages/new/photos/services/ml/clip.ts | 4 ++ web/packages/new/photos/services/ml/image.ts | 75 ++++++++++++++++++-- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/web/packages/new/photos/services/ml/clip.ts b/web/packages/new/photos/services/ml/clip.ts index bd89f0a403..f1834bf23e 100644 --- a/web/packages/new/photos/services/ml/clip.ts +++ b/web/packages/new/photos/services/ml/clip.ts @@ -128,6 +128,9 @@ const convertToCLIPInput = (imageData: ImageData) => { // Maintain aspect ratio. const scale = Math.max(requiredWidth / width, requiredHeight / height); + // Perform antialiasing if downscaling + const useAntiAlias: boolean = scale < 0.8; + const scaledWidth = Math.round(width * scale); const scaledHeight = Math.round(height * scale); const widthOffset = Math.max(0, scaledWidth - requiredWidth) / 2; @@ -147,6 +150,7 @@ const convertToCLIPInput = (imageData: ImageData) => { pixelData, width, height, + useAntiAlias, ); clipInput[pi] = r / 255.0; clipInput[pi + cOffsetG] = g / 255.0; diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index dfea236561..5d0e4e5e7a 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -5,9 +5,17 @@ import { ensure } from "@/utils/ensure"; import { Matrix, inverse } from "ml-matrix"; import { clamp } from "./math"; +const gaussianKernelSize = 5; +const gaussianKernelRadius = Math.floor(gaussianKernelSize / 2); +const gaussianSigma = 10.0; +const gaussianKernel: number[][] = create2DGaussianKernel( + gaussianKernelSize, + gaussianSigma, +); + /** * Returns the pixel value (RGB) at the given coordinates ({@link fx}, - * {@link fy}) using bilinear interpolation. + * {@link fy}) using bilinear interpolation (optionally with antialias) */ export function pixelRGBBilinear( fx: number, @@ -15,6 +23,7 @@ export function pixelRGBBilinear( imageData: Uint8ClampedArray, imageWidth: number, imageHeight: number, + useAntiAlias = false, ) { // Clamp to image boundaries. fx = clamp(fx, 0, imageWidth - 1); @@ -31,10 +40,11 @@ export function pixelRGBBilinear( const dy1 = 1.0 - dy; // Get the original pixels. - const pixel1 = pixelRGBA(imageData, imageWidth, imageHeight, x0, y0); - const pixel2 = pixelRGBA(imageData, imageWidth, imageHeight, x1, y0); - const pixel3 = pixelRGBA(imageData, imageWidth, imageHeight, x0, y1); - const pixel4 = pixelRGBA(imageData, imageWidth, imageHeight, x1, y1); + const getPixelRGBA: Function = useAntiAlias ? pixelRGBABlurred : pixelRGBA; + const pixel1 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y0); + const pixel2 = getPixelRGBA(imageData, imageWidth, imageHeight, x1, y0); + const pixel3 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y1); + const pixel4 = getPixelRGBA(imageData, imageWidth, imageHeight, x1, y1); const bilinear = (val1: number, val2: number, val3: number, val4: number) => Math.round( @@ -60,7 +70,7 @@ const pixelRGBA = ( y: number, ) => { if (x < 0 || x >= width || y < 0 || y >= height) { - return { r: 0, g: 0, b: 0, a: 0 }; + return { r: 114, g: 114, b: 114, a: 0 }; } const index = (y * width + x) * 4; return { @@ -71,6 +81,32 @@ const pixelRGBA = ( }; }; +const pixelRGBABlurred = ( + imageData: Uint8ClampedArray, + width: number, + height: number, + x: number, + y: number, +) => { + let r = 0, + g = 0, + b = 0; + for (let ky = 0; ky < gaussianKernelSize; ky++) { + for (let kx = 0; kx < gaussianKernelSize; kx++) { + const px = x - gaussianKernelRadius + kx; + const py = y - gaussianKernelRadius + ky; + + const pixelRgbTuple = pixelRGBA(imageData, width, height, px, py); + const weight = gaussianKernel[ky][kx]; + + r += pixelRgbTuple.r * weight; + g += pixelRgbTuple.g * weight; + b += pixelRgbTuple.b * weight; + } + } + return { r: Math.round(r), g: Math.round(g), b: Math.round(b), a: 255 }; +}; + /** * Returns the pixel value (RGB) at the given coordinates ({@link fx}, * {@link fy}) using bicubic interpolation. @@ -287,3 +323,30 @@ export const grayscaleIntMatrixFromNormalized2List = ( }), ); }; + +function create2DGaussianKernel(size: number, sigma: number): number[][] { + const kernel: number[][] = Array(size).map(() => Array(size).fill(0)); + let sum = 0.0; + const center = Math.floor(size / 2); + + for (let y = 0; y < size; y++) { + for (let x = 0; x < size; x++) { + const dx = x - center; + const dy = y - center; + const g = + (1 / (2 * Math.PI * sigma * sigma)) * + Math.exp(-(dx * dx + dy * dy) / (2 * sigma * sigma)); + kernel[y][x] = g; + sum += g; + } + } + + // Normalize the kernel + for (let y = 0; y < size; y++) { + for (let x = 0; x < size; x++) { + kernel[y][x] /= sum; + } + } + + return kernel; +} From 608b078065965fb5db8de814653280d8e8219983 Mon Sep 17 00:00:00 2001 From: dnred <174188760+dnred@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:48:41 +0200 Subject: [PATCH 1145/1179] Fix typo --- docs/docs/auth/migration-guides/import.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/auth/migration-guides/import.md b/docs/docs/auth/migration-guides/import.md index 457c7ad0c8..027bdb5482 100644 --- a/docs/docs/auth/migration-guides/import.md +++ b/docs/docs/auth/migration-guides/import.md @@ -16,7 +16,7 @@ providers specifically listed in the documentation, the supported providers are: - Aegis Authenticator - Bitwarden - Google Authenticator -- Ravio OTP +- Raivo OTP - LastPass Details as to how codes may be imported from these providers may be found within From 86e2db388ea19a622ccc30e03b6ade422dbacec8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 07:20:45 +0530 Subject: [PATCH 1146/1179] [docs] Add more links to the self hosting docs To make them easier to find. --- server/README.md | 4 ++-- server/RUNNING.md | 13 ++++++++----- server/docs/docker.md | 23 ++++++++++++++--------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/server/README.md b/server/README.md index 10e1d98807..9406ab165d 100644 --- a/server/README.md +++ b/server/README.md @@ -123,8 +123,8 @@ documentation PRs around this too. > [!TIP] > -> You can find more guides and documentation around self-hosting at -> [help.ente.io/self-hosting](https://help.ente.io/self-hosting). +> For more documentation around self-hosting, see +> **[help.ente.io/self-hosting](https://help.ente.io/self-hosting)**. ## Thanks ❤️ diff --git a/server/RUNNING.md b/server/RUNNING.md index 9410650e03..5a45b46d1f 100644 --- a/server/RUNNING.md +++ b/server/RUNNING.md @@ -10,10 +10,14 @@ static go binary. This document describes these approaches, and also outlines configuration. -- [Run using Docker using a pre-built Docker image](docs/docker.md) -- [Run using Docker but build an image from source](#build-and-run-using-docker) -- [Running without Docker](#run-without-docker) -- [Configuration](#configuration) +- [Run using Docker using a pre-built Docker image](docs/docker.md) +- [Run using Docker but build an image from source](#build-and-run-using-docker) +- [Running without Docker](#run-without-docker) +- [Configuration](#configuration) + +If your mobile app is able to connect to your self hosted instance but is not +able to view or upload images, see +[help.ente.io/self-hosting/guides/configuring-s3](https://help.ente.io/self-hosting/guides/configuring-s3). ## Build and run using Docker @@ -105,7 +109,6 @@ brew install pkg-config > avoid surprises, but if you're using a newer Postgres that should work fine > too. - On M1 macs, we additionally need to link the postgres keg. ``` diff --git a/server/docs/docker.md b/server/docs/docker.md index a328d734bd..4b3c126cd8 100644 --- a/server/docs/docker.md +++ b/server/docs/docker.md @@ -48,21 +48,21 @@ require you to clone the repository or build any images. 4. Create an (empty) configuration file. You can later put your custom configuration in this if needed. - ```sh - touch museum.yaml - ``` + ```sh + touch museum.yaml + ``` 5. That is all. You can now start everything. - ```sh - docker compose up - ``` + ```sh + docker compose up + ``` This will start a cluster containing: -* Ente's own server -* PostgresQL (DB) -* MinIO (the S3 layer) +- Ente's own server +- PostgresQL (DB) +- MinIO (the S3 layer) For each of these, it'll use the latest published Docker image. @@ -81,3 +81,8 @@ and run the image from **`ghcr.io/ente-io/server`**. ```sh docker pull ghcr.io/ente-io/server ``` + +> [!TIP] +> +> For more documentation around self-hosting, see +> **[help.ente.io/self-hosting](https://help.ente.io/self-hosting)**. From 6776c497505754b0d75901bebd97e01cfbfd432c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 08:07:58 +0530 Subject: [PATCH 1147/1179] Fix some lint warnings (no functional changes) --- web/packages/new/photos/services/ml/clip.ts | 6 ++-- web/packages/new/photos/services/ml/face.ts | 1 + web/packages/new/photos/services/ml/image.ts | 35 ++++++++++---------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/web/packages/new/photos/services/ml/clip.ts b/web/packages/new/photos/services/ml/clip.ts index f1834bf23e..9679cbe615 100644 --- a/web/packages/new/photos/services/ml/clip.ts +++ b/web/packages/new/photos/services/ml/clip.ts @@ -128,8 +128,8 @@ const convertToCLIPInput = (imageData: ImageData) => { // Maintain aspect ratio. const scale = Math.max(requiredWidth / width, requiredHeight / height); - // Perform antialiasing if downscaling - const useAntiAlias: boolean = scale < 0.8; + // Perform antialiasing if downscaling. + const shouldAntiAlias = scale < 0.8; const scaledWidth = Math.round(width * scale); const scaledHeight = Math.round(height * scale); @@ -150,7 +150,7 @@ const convertToCLIPInput = (imageData: ImageData) => { pixelData, width, height, - useAntiAlias, + shouldAntiAlias, ); clipInput[pi] = r / 255.0; clipInput[pi + cOffsetG] = g / 255.0; diff --git a/web/packages/new/photos/services/ml/face.ts b/web/packages/new/photos/services/ml/face.ts index d8616b7426..80b11853c8 100644 --- a/web/packages/new/photos/services/ml/face.ts +++ b/web/packages/new/photos/services/ml/face.ts @@ -383,6 +383,7 @@ const convertToYOLOInputFloat32ChannelsFirst = (imageData: ImageData) => { pixelData, width, height, + false, ); yoloInput[pi] = r / 255.0; yoloInput[pi + channelOffsetGreen] = g / 255.0; diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index 5d0e4e5e7a..fbac2a154d 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -5,17 +5,9 @@ import { ensure } from "@/utils/ensure"; import { Matrix, inverse } from "ml-matrix"; import { clamp } from "./math"; -const gaussianKernelSize = 5; -const gaussianKernelRadius = Math.floor(gaussianKernelSize / 2); -const gaussianSigma = 10.0; -const gaussianKernel: number[][] = create2DGaussianKernel( - gaussianKernelSize, - gaussianSigma, -); - /** * Returns the pixel value (RGB) at the given coordinates ({@link fx}, - * {@link fy}) using bilinear interpolation (optionally with antialias) + * {@link fy}) using bilinear interpolation (optionally anti-aliased). */ export function pixelRGBBilinear( fx: number, @@ -23,7 +15,7 @@ export function pixelRGBBilinear( imageData: Uint8ClampedArray, imageWidth: number, imageHeight: number, - useAntiAlias = false, + antiAlias: boolean, ) { // Clamp to image boundaries. fx = clamp(fx, 0, imageWidth - 1); @@ -40,7 +32,7 @@ export function pixelRGBBilinear( const dy1 = 1.0 - dy; // Get the original pixels. - const getPixelRGBA: Function = useAntiAlias ? pixelRGBABlurred : pixelRGBA; + const getPixelRGBA = antiAlias ? pixelRGBABlurred : pixelRGBA; const pixel1 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y0); const pixel2 = getPixelRGBA(imageData, imageWidth, imageHeight, x1, y0); const pixel3 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y1); @@ -97,7 +89,7 @@ const pixelRGBABlurred = ( const py = y - gaussianKernelRadius + ky; const pixelRgbTuple = pixelRGBA(imageData, width, height, px, py); - const weight = gaussianKernel[ky][kx]; + const weight = gaussianKernel[ky]![kx]!; r += pixelRgbTuple.r * weight; g += pixelRgbTuple.g * weight; @@ -324,8 +316,12 @@ export const grayscaleIntMatrixFromNormalized2List = ( ); }; -function create2DGaussianKernel(size: number, sigma: number): number[][] { - const kernel: number[][] = Array(size).map(() => Array(size).fill(0)); +const gaussianKernelSize = 5; +const gaussianKernelRadius = Math.floor(gaussianKernelSize / 2); +const gaussianSigma = 10.0; + +const create2DGaussianKernel = (size: number, sigma: number): number[][] => { + const kernel = Array(size).map(() => Array(size).fill(0) as number[]); let sum = 0.0; const center = Math.floor(size / 2); @@ -336,7 +332,7 @@ function create2DGaussianKernel(size: number, sigma: number): number[][] { const g = (1 / (2 * Math.PI * sigma * sigma)) * Math.exp(-(dx * dx + dy * dy) / (2 * sigma * sigma)); - kernel[y][x] = g; + kernel[y]![x] = g; sum += g; } } @@ -344,9 +340,14 @@ function create2DGaussianKernel(size: number, sigma: number): number[][] { // Normalize the kernel for (let y = 0; y < size; y++) { for (let x = 0; x < size; x++) { - kernel[y][x] /= sum; + kernel[y]![x]! /= sum; } } return kernel; -} +}; + +const gaussianKernel: number[][] = create2DGaussianKernel( + gaussianKernelSize, + gaussianSigma, +); From 13565a0904c4d29eb359f23c8b923bbdfd630b02 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 08:51:37 +0530 Subject: [PATCH 1148/1179] Fix kernel construction .fill(0) was missing --- web/packages/new/photos/services/ml/clip.ts | 4 ++-- web/packages/new/photos/services/ml/image.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/web/packages/new/photos/services/ml/clip.ts b/web/packages/new/photos/services/ml/clip.ts index 9679cbe615..4c4d61456b 100644 --- a/web/packages/new/photos/services/ml/clip.ts +++ b/web/packages/new/photos/services/ml/clip.ts @@ -129,7 +129,7 @@ const convertToCLIPInput = (imageData: ImageData) => { const scale = Math.max(requiredWidth / width, requiredHeight / height); // Perform antialiasing if downscaling. - const shouldAntiAlias = scale < 0.8; + const antiAlias = scale < 0.8; const scaledWidth = Math.round(width * scale); const scaledHeight = Math.round(height * scale); @@ -150,7 +150,7 @@ const convertToCLIPInput = (imageData: ImageData) => { pixelData, width, height, - shouldAntiAlias, + antiAlias, ); clipInput[pi] = r / 255.0; clipInput[pi + cOffsetG] = g / 255.0; diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index fbac2a154d..376474e407 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -321,7 +321,10 @@ const gaussianKernelRadius = Math.floor(gaussianKernelSize / 2); const gaussianSigma = 10.0; const create2DGaussianKernel = (size: number, sigma: number): number[][] => { - const kernel = Array(size).map(() => Array(size).fill(0) as number[]); + const kernel = Array(size) + .fill(0) + .map(() => Array(size).fill(0) as number[]); + let sum = 0.0; const center = Math.floor(size / 2); @@ -337,7 +340,7 @@ const create2DGaussianKernel = (size: number, sigma: number): number[][] => { } } - // Normalize the kernel + // Normalize the kernel. for (let y = 0; y < size; y++) { for (let x = 0; x < size; x++) { kernel[y]![x]! /= sum; From 0bf3c64ceb030a191adad99766897ac942d923e5 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 09:06:53 +0530 Subject: [PATCH 1149/1179] 1 --- web/packages/new/photos/services/ml/clip.ts | 4 ++-- web/packages/new/photos/services/ml/image.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/packages/new/photos/services/ml/clip.ts b/web/packages/new/photos/services/ml/clip.ts index 4c4d61456b..bcea2dca7a 100644 --- a/web/packages/new/photos/services/ml/clip.ts +++ b/web/packages/new/photos/services/ml/clip.ts @@ -129,7 +129,7 @@ const convertToCLIPInput = (imageData: ImageData) => { const scale = Math.max(requiredWidth / width, requiredHeight / height); // Perform antialiasing if downscaling. - const antiAlias = scale < 0.8; + const antialias = scale < 0.8; const scaledWidth = Math.round(width * scale); const scaledHeight = Math.round(height * scale); @@ -150,7 +150,7 @@ const convertToCLIPInput = (imageData: ImageData) => { pixelData, width, height, - antiAlias, + antialias, ); clipInput[pi] = r / 255.0; clipInput[pi + cOffsetG] = g / 255.0; diff --git a/web/packages/new/photos/services/ml/image.ts b/web/packages/new/photos/services/ml/image.ts index 376474e407..14733b6604 100644 --- a/web/packages/new/photos/services/ml/image.ts +++ b/web/packages/new/photos/services/ml/image.ts @@ -15,7 +15,7 @@ export function pixelRGBBilinear( imageData: Uint8ClampedArray, imageWidth: number, imageHeight: number, - antiAlias: boolean, + antialias: boolean, ) { // Clamp to image boundaries. fx = clamp(fx, 0, imageWidth - 1); @@ -32,7 +32,7 @@ export function pixelRGBBilinear( const dy1 = 1.0 - dy; // Get the original pixels. - const getPixelRGBA = antiAlias ? pixelRGBABlurred : pixelRGBA; + const getPixelRGBA = antialias ? pixelRGBABlurred : pixelRGBA; const pixel1 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y0); const pixel2 = getPixelRGBA(imageData, imageWidth, imageHeight, x1, y0); const pixel3 = getPixelRGBA(imageData, imageWidth, imageHeight, x0, y1); From 26641a45842ac2a2285db749dd4b6af763bb08e4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 09:52:44 +0530 Subject: [PATCH 1150/1179] [cast] Fix cast continually getting reset --- web/apps/cast/src/services/render.ts | 21 ++++++++++--------- .../photos/src/utils/magicMetadata/index.ts | 11 +++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/web/apps/cast/src/services/render.ts b/web/apps/cast/src/services/render.ts index 1e654ebfbc..bfb840c5f0 100644 --- a/web/apps/cast/src/services/render.ts +++ b/web/apps/cast/src/services/render.ts @@ -214,22 +214,23 @@ const decryptEnteFile = async ( fileMagicMetadata = { ...encryptedFile.magicMetadata, // @ts-expect-error TODO: Need to use zod here. - data: await worker.decryptMetadata( - magicMetadata.data, - magicMetadata.header, - fileKey, - ), + data: await worker.decryptMetadataJSON({ + encryptedDataB64: magicMetadata.data, + decryptionHeaderB64: magicMetadata.header, + keyB64: fileKey, + }), + }; } if (pubMagicMetadata?.data) { filePubMagicMetadata = { ...pubMagicMetadata, // @ts-expect-error TODO: Need to use zod here. - data: await worker.decryptMetadata( - pubMagicMetadata.data, - pubMagicMetadata.header, - fileKey, - ), + data: await worker.decryptMetadataJSON({ + encryptedDataB64: pubMagicMetadata.data, + decryptionHeaderB64: pubMagicMetadata.header, + keyB64: fileKey, + }), }; } return mergeMetadata1({ diff --git a/web/apps/photos/src/utils/magicMetadata/index.ts b/web/apps/photos/src/utils/magicMetadata/index.ts index f07254b5df..3f2132f82d 100644 --- a/web/apps/photos/src/utils/magicMetadata/index.ts +++ b/web/apps/photos/src/utils/magicMetadata/index.ts @@ -53,12 +53,13 @@ export async function updateMagicMetadata( } if (typeof originalMagicMetadata?.data === "string") { + // TODO: Is this even used? // @ts-expect-error TODO: Need to use zod here. - originalMagicMetadata.data = await cryptoWorker.decryptMetadata( - originalMagicMetadata.data, - originalMagicMetadata.header, - decryptionKey, - ); + originalMagicMetadata.data = await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: originalMagicMetadata.data, + decryptionHeaderB64: originalMagicMetadata.header, + keyB64: decryptionKey, + }); } // copies the existing magic metadata properties of the files and updates the visibility value // The expected behavior while updating magic metadata is to let the existing property as it is and update/add the property you want From 1b95ce330a1792536a7e2ead5ceeda5e4ee6e9b6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 09:58:36 +0530 Subject: [PATCH 1151/1179] Fix lint --- web/apps/cast/src/services/render.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/web/apps/cast/src/services/render.ts b/web/apps/cast/src/services/render.ts index bfb840c5f0..b19e41bfe1 100644 --- a/web/apps/cast/src/services/render.ts +++ b/web/apps/cast/src/services/render.ts @@ -219,7 +219,6 @@ const decryptEnteFile = async ( decryptionHeaderB64: magicMetadata.header, keyB64: fileKey, }), - }; } if (pubMagicMetadata?.data) { From 99291c2576cb77b986b00c571aa95bd30953e71b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 10:07:21 +0530 Subject: [PATCH 1152/1179] [web] Fix build ReferenceError: Cannot access 'T' before initialization at Object.dP (/home/runner/work/ente/ente/web/apps/photos/.next/server/chunks/6368.js:218:1594) When accessing the GAP grid-column-gap: ${f.dP}px; --- .../components/Collections/styledComponents.ts | 6 +++++- .../src/components/PhotoList/constants.ts | 8 ++++++++ .../photos/src/components/PhotoList/dedupe.tsx | 2 +- .../photos/src/components/PhotoList/index.tsx | 18 ++++++++++-------- web/apps/photos/src/components/SearchBar.tsx | 5 ++++- .../components/pages/gallery/PreviewCard.tsx | 5 ++++- 6 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 web/apps/photos/src/components/PhotoList/constants.ts diff --git a/web/apps/photos/src/components/Collections/styledComponents.ts b/web/apps/photos/src/components/Collections/styledComponents.ts index 936fb61e68..d7bfcbde94 100644 --- a/web/apps/photos/src/components/Collections/styledComponents.ts +++ b/web/apps/photos/src/components/Collections/styledComponents.ts @@ -1,6 +1,10 @@ import { Overlay } from "@ente/shared/components/Container"; import { Box, styled } from "@mui/material"; -import { IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS } from "components/PhotoList"; +import { + IMAGE_CONTAINER_MAX_WIDTH, + MIN_COLUMNS, +} from "components/PhotoList/constants"; + export const CollectionListWrapper = styled(Box)` position: relative; overflow: hidden; diff --git a/web/apps/photos/src/components/PhotoList/constants.ts b/web/apps/photos/src/components/PhotoList/constants.ts new file mode 100644 index 0000000000..6f88be0d89 --- /dev/null +++ b/web/apps/photos/src/components/PhotoList/constants.ts @@ -0,0 +1,8 @@ +export const GAP_BTW_TILES = 4; +export const DATE_CONTAINER_HEIGHT = 48; +export const SIZE_AND_COUNT_CONTAINER_HEIGHT = 72; +export const IMAGE_CONTAINER_MAX_HEIGHT = 180; +export const IMAGE_CONTAINER_MAX_WIDTH = 180; +export const MIN_COLUMNS = 4; +export const SPACE_BTW_DATES = 44; +export const SPACE_BTW_DATES_TO_IMAGE_CONTAINER_WIDTH_RATIO = 0.244; diff --git a/web/apps/photos/src/components/PhotoList/dedupe.tsx b/web/apps/photos/src/components/PhotoList/dedupe.tsx index bd42aa6f1b..25b8f1e8f4 100644 --- a/web/apps/photos/src/components/PhotoList/dedupe.tsx +++ b/web/apps/photos/src/components/PhotoList/dedupe.tsx @@ -19,7 +19,7 @@ import { MIN_COLUMNS, SIZE_AND_COUNT_CONTAINER_HEIGHT, SPACE_BTW_DATES, -} from "."; +} from "./constants"; export enum ITEM_TYPE { TIME = "TIME", diff --git a/web/apps/photos/src/components/PhotoList/index.tsx b/web/apps/photos/src/components/PhotoList/index.tsx index b0172fb873..01eb5bb7e4 100644 --- a/web/apps/photos/src/components/PhotoList/index.tsx +++ b/web/apps/photos/src/components/PhotoList/index.tsx @@ -20,14 +20,16 @@ const FOOTER_HEIGHT = 90; const ALBUM_FOOTER_HEIGHT = 75; const ALBUM_FOOTER_HEIGHT_WITH_REFERRAL = 113; -export const GAP_BTW_TILES = 4; -export const DATE_CONTAINER_HEIGHT = 48; -export const SIZE_AND_COUNT_CONTAINER_HEIGHT = 72; -export const IMAGE_CONTAINER_MAX_HEIGHT = 180; -export const IMAGE_CONTAINER_MAX_WIDTH = 180; -export const MIN_COLUMNS = 4; -export const SPACE_BTW_DATES = 44; -export const SPACE_BTW_DATES_TO_IMAGE_CONTAINER_WIDTH_RATIO = 0.244; +import { + DATE_CONTAINER_HEIGHT, + GAP_BTW_TILES, + IMAGE_CONTAINER_MAX_HEIGHT, + IMAGE_CONTAINER_MAX_WIDTH, + MIN_COLUMNS, + SIZE_AND_COUNT_CONTAINER_HEIGHT, + SPACE_BTW_DATES, + SPACE_BTW_DATES_TO_IMAGE_CONTAINER_WIDTH_RATIO, +} from "./constants"; export enum ITEM_TYPE { TIME = "TIME", diff --git a/web/apps/photos/src/components/SearchBar.tsx b/web/apps/photos/src/components/SearchBar.tsx index 915c1993e6..20f18ec0f2 100644 --- a/web/apps/photos/src/components/SearchBar.tsx +++ b/web/apps/photos/src/components/SearchBar.tsx @@ -42,7 +42,10 @@ import { } from "@mui/material"; import CollectionCard from "components/Collections/CollectionCard"; import { ResultPreviewTile } from "components/Collections/styledComponents"; -import { IMAGE_CONTAINER_MAX_WIDTH, MIN_COLUMNS } from "components/PhotoList"; +import { + IMAGE_CONTAINER_MAX_WIDTH, + MIN_COLUMNS, +} from "components/PhotoList/constants"; import { t } from "i18next"; import memoize from "memoize-one"; import pDebounce from "p-debounce"; diff --git a/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx b/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx index 402dda4a65..deb212ef77 100644 --- a/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx +++ b/web/apps/photos/src/components/pages/gallery/PreviewCard.tsx @@ -8,7 +8,10 @@ import useLongPress from "@ente/shared/hooks/useLongPress"; import AlbumOutlined from "@mui/icons-material/AlbumOutlined"; import PlayCircleOutlineOutlinedIcon from "@mui/icons-material/PlayCircleOutlineOutlined"; import { Tooltip, styled } from "@mui/material"; -import { GAP_BTW_TILES, IMAGE_CONTAINER_MAX_WIDTH } from "components/PhotoList"; +import { + GAP_BTW_TILES, + IMAGE_CONTAINER_MAX_WIDTH, +} from "components/PhotoList/constants"; import { LoadingThumbnail, StaticThumbnail, From 71ee7ac019586952c34ac13fb11054a9a076653b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 10:56:15 +0530 Subject: [PATCH 1153/1179] [web] Directly import into the selected album on drag and drop Ref: https://github.com/ente-io/ente/discussions/2707#discussioncomment-10589669 --- desktop/CHANGELOG.md | 1 + web/apps/photos/src/components/Upload/Uploader.tsx | 2 ++ 2 files changed, 3 insertions(+) diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index c2c6b692c0..1426f035a4 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -2,6 +2,7 @@ ## v1.7.5 (Unreleased) +- Directly upload to selected album on drag and drop. - . ## v1.7.4 diff --git a/web/apps/photos/src/components/Upload/Uploader.tsx b/web/apps/photos/src/components/Upload/Uploader.tsx index d95f2215f9..fc1977e392 100644 --- a/web/apps/photos/src/components/Upload/Uploader.tsx +++ b/web/apps/photos/src/components/Upload/Uploader.tsx @@ -292,6 +292,7 @@ export default function Uploader({ } let files: File[]; + isDragAndDrop.current = false; switch (pickedUploadType.current) { case PICKED_UPLOAD_TYPE.FILES: @@ -307,6 +308,7 @@ export default function Uploader({ break; default: + isDragAndDrop.current = true; files = dragAndDropFiles; break; } From 00070d06b6cfef49effcb727639c8d27ef9e756e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 11:53:06 +0530 Subject: [PATCH 1154/1179] Props --- web/apps/photos/src/pages/gallery.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 2a027888cf..6cb8f0ddd1 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -45,6 +45,7 @@ import type { User } from "@ente/shared/user/types"; import ArrowBack from "@mui/icons-material/ArrowBack"; import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import MenuIcon from "@mui/icons-material/Menu"; +import type { ButtonProps, IconButtonProps } from "@mui/material"; import { Box, Button, IconButton, Typography, styled } from "@mui/material"; import AuthenticateUserModal from "components/AuthenticateUserModal"; import Collections from "components/Collections"; @@ -1300,22 +1301,21 @@ const NormalNavbarContents: React.FC = ({ ); }; -interface UploadButtonProps { - onClick: () => void; -} -export const UploadButton: React.FC = ({ onClick }) => { +export const UploadButton: React.FC = ( + props, +) => { const disabled = !uploadManager.shouldAllowNewUpload(); const isMobileWidth = useIsMobileWidth(); return ( {isMobileWidth ? ( - + {} ) : ( From 3fc66ce2020178e8a2c4a867182c81ce2fba47be Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 12:07:57 +0530 Subject: [PATCH 1156/1179] Bespoke --- web/apps/photos/src/pages/shared-albums.tsx | 105 +++++++++++++------- 1 file changed, 67 insertions(+), 38 deletions(-) diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index 60d833205b..e3f302a650 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -1,6 +1,6 @@ import { NavbarBase, SelectionBar } from "@/base/components/Navbar"; import { sharedCryptoWorker } from "@/base/crypto"; -import { useIsTouchscreen } from "@/base/hooks"; +import { useIsMobileWidth, useIsTouchscreen } from "@/base/hooks"; import log from "@/base/log"; import downloadManager from "@/new/photos/services/download"; import { EnteFile } from "@/new/photos/types/file"; @@ -27,6 +27,7 @@ import CloseIcon from "@mui/icons-material/Close"; import DownloadIcon from "@mui/icons-material/Download"; import FileDownloadOutlinedIcon from "@mui/icons-material/FileDownloadOutlined"; import MoreHoriz from "@mui/icons-material/MoreHoriz"; +import type { ButtonProps, IconButtonProps } from "@mui/material"; import { Box, Button, IconButton, Stack, Tooltip } from "@mui/material"; import Typography from "@mui/material/Typography"; import bs58 from "bs58"; @@ -62,6 +63,7 @@ import { syncPublicFiles, verifyPublicCollectionPassword, } from "services/publicCollectionService"; +import uploadManager from "services/upload/uploadManager"; import { Collection } from "types/collection"; import { SelectedState, @@ -170,9 +172,11 @@ export default function PublicCollectionGallery() { return updater; }; - const openUploader = () => { - setUploadTypeSelectorView(true); - }; + const onAddPhotos = useMemo(() => { + return publicCollection?.publicURLs?.[0]?.enableCollect + ? () => setUploadTypeSelectorView(true) + : undefined; + }, [publicCollection]); const closeUploadTypeSelectorView = () => { setUploadTypeSelectorView(false); @@ -331,26 +335,26 @@ export default function PublicCollectionGallery() { }, [publicCollection, publicFiles]); useEffect(() => { - if (publicCollection?.publicURLs?.[0]?.enableCollect) { - setPhotoListFooter({ - item: ( - - } - /> - - ), - itemType: ITEM_TYPE.FOOTER, - height: 104, - }); - } else { - setPhotoListFooter(null); - } - }, [publicCollection]); + setPhotoListFooter( + onAddPhotos + ? { + item: ( + + } + /> + + ), + itemType: ITEM_TYPE.FOOTER, + height: 104, + } + : null, + ); + }, [onAddPhotos]); const syncWithRemote = async () => { const collectionUID = getPublicCollectionUID(token.current); @@ -551,12 +555,7 @@ export default function PublicCollectionGallery() { getFolderSelectorInputProps, }} /> - + | undefined; +} +const SharedAlbumNavbar: React.FC = ({ + onAddPhotos, +}) => { return ( - {showUploadButton ? ( - } - text={t("ADD_PHOTOS")} - /> + {onAddPhotos ? ( + ) : ( )} ); -} +}; const EnteLinkLogo: React.FC = () => { return ( @@ -648,6 +651,32 @@ const EnteLinkLogo: React.FC = () => { ); }; +const AddPhotosButton: React.FC = (props) => { + const disabled = !uploadManager.shouldAllowNewUpload(); + const isMobileWidth = useIsMobileWidth(); + + const icon = ; + + return ( + + {isMobileWidth ? ( + + {icon} + + ) : ( + + )} + + ); +}; + const GoToEnte: React.FC = () => { // Touchscreen devices are overwhemingly likely to be Android or iOS. const isTouchscreen = useIsTouchscreen(); From 7e8344cd4ed43ce1b0009cfc66650b2d37ef869e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 12:18:04 +0530 Subject: [PATCH 1157/1179] Bespoke --- .../src/components/Upload/UploadButton.tsx | 71 ------------------- web/apps/photos/src/pages/shared-albums.tsx | 29 +++++--- 2 files changed, 21 insertions(+), 79 deletions(-) delete mode 100644 web/apps/photos/src/components/Upload/UploadButton.tsx diff --git a/web/apps/photos/src/components/Upload/UploadButton.tsx b/web/apps/photos/src/components/Upload/UploadButton.tsx deleted file mode 100644 index 4baae76bd0..0000000000 --- a/web/apps/photos/src/components/Upload/UploadButton.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; -import { Button, ButtonProps, IconButton, styled } from "@mui/material"; -import { type UploadTypeSelectorIntent } from "components/Upload/UploadTypeSelector"; -import { t } from "i18next"; -import uploadManager from "services/upload/uploadManager"; - -interface UploadButtonProps { - openUploader: (intent?: UploadTypeSelectorIntent) => void; - text?: string; - color?: ButtonProps["color"]; - disableShrink?: boolean; - icon?: JSX.Element; -} -export const UploadButton: React.FC = ({ - openUploader, - text, - color, - disableShrink, - icon, -}) => { - const onClickHandler = () => openUploader(); - - return ( - - - - - {icon ?? } - - - ); -}; - -const UploadButton_ = styled("div")<{ $disableShrink: boolean }>` - display: flex; - align-items: center; - justify-content: center; - transition: opacity 1s ease; - cursor: pointer; - & .mobile-button { - display: none; - } - ${({ $disableShrink }) => - !$disableShrink && - `@media (max-width: 624px) { - & .mobile-button { - display: inline-flex; - } - & .desktop-button { - display: none; - } - }`} -`; diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index e3f302a650..2c8958ebec 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -42,7 +42,6 @@ import FullScreenDropZone from "components/FullScreenDropZone"; import { LoadingOverlay } from "components/LoadingOverlay"; import PhotoFrame from "components/PhotoFrame"; import { ITEM_TYPE, TimeStampListItem } from "components/PhotoList"; -import { UploadButton } from "components/Upload/UploadButton"; import Uploader from "components/Upload/Uploader"; import { UploadSelectorInputs } from "components/UploadSelectorInputs"; import { t } from "i18next"; @@ -340,13 +339,7 @@ export default function PublicCollectionGallery() { ? { item: ( - } - /> + ), itemType: ITEM_TYPE.FOOTER, @@ -677,6 +670,26 @@ const AddPhotosButton: React.FC = (props) => { ); }; +/** + * A visually different variation of {@link AddPhotosButton}. It also does not + * shrink on mobile sized screens. + */ +const AddMorePhotosButton: React.FC = (props) => { + const disabled = !uploadManager.shouldAllowNewUpload(); + return ( + + + + ); +}; + const GoToEnte: React.FC = () => { // Touchscreen devices are overwhemingly likely to be Android or iOS. const isTouchscreen = useIsTouchscreen(); From ffe290d56dc257ae2c2e5356354c40807f820afe Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 12:34:12 +0530 Subject: [PATCH 1158/1179] Sym --- web/apps/photos/src/pages/gallery.tsx | 46 +++++++++++++-------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 37ad4a78f4..40cbe786c5 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -1085,9 +1085,9 @@ export default function Gallery() { ) : ( = ({ openSidebar, openUploader, isInSearchMode, + setIsInSearchMode, collections, files, updateSearch, - setIsInSearchMode, -}) => { - return ( - <> - {!isInSearchMode && ( - - - - )} - - {!isInSearchMode && } - - ); -}; +}) => ( + <> + {!isInSearchMode && } + + {!isInSearchMode && } + +); -export const UploadButton: React.FC = ( - props, -) => { +const SidebarButton: React.FC = (props) => ( + + + +); + +const UploadButton: React.FC = (props) => { const disabled = !uploadManager.shouldAllowNewUpload(); const isMobileWidth = useIsMobileWidth(); From 1cf28e0dd5206700b41124fe6e65770ddf01d293 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 12:47:40 +0530 Subject: [PATCH 1159/1179] [mob][photos] easy to find cta to send logs if app is stuck in local sync screen --- mobile/lib/ui/home/loading_photos_widget.dart | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/mobile/lib/ui/home/loading_photos_widget.dart b/mobile/lib/ui/home/loading_photos_widget.dart index fc9938c32a..10dabd61fe 100644 --- a/mobile/lib/ui/home/loading_photos_widget.dart +++ b/mobile/lib/ui/home/loading_photos_widget.dart @@ -10,6 +10,9 @@ import 'package:photos/events/sync_status_update_event.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/local_sync_service.dart'; import 'package:photos/ui/common/bottom_shadow.dart'; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/dialog_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart'; import "package:photos/utils/debouncer.dart"; import "package:photos/utils/email_util.dart"; @@ -33,10 +36,14 @@ class _LoadingPhotosWidgetState extends State { final List _messages = []; final _debouncer = Debouncer(const Duration(milliseconds: 500)); late final Timer _didYouKnowTimer; + final fortySecondsOnScreen = ValueNotifier(false); @override void initState() { super.initState(); + Future.delayed(const Duration(seconds: 40), () { + fortySecondsOnScreen.value = true; + }); _firstImportEvent = Bus.instance.on().listen((event) async { if (mounted && event.status == SyncStatus.completedFirstGalleryImport) { @@ -88,6 +95,7 @@ class _LoadingPhotosWidgetState extends State { _importProgressEvent.cancel(); _debouncer.cancelDebounceTimer(); _didYouKnowTimer.cancel(); + fortySecondsOnScreen.dispose(); super.dispose(); } @@ -198,6 +206,45 @@ class _LoadingPhotosWidgetState extends State { ), ), ), + appBar: AppBar( + actions: [ + ValueListenableBuilder( + valueListenable: fortySecondsOnScreen, + builder: (context, value, _) { + return value + ? IconButton( + icon: const Icon(Icons.help_outline_outlined), + onPressed: () { + showDialogWidget( + context: context, + title: S.of(context).oops, + icon: Icons.error_outline_outlined, + body: + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team", + isDismissible: true, + buttons: [ + ButtonWidget( + buttonType: ButtonType.primary, + labelText: S.of(context).contactSupport, + buttonAction: ButtonAction.second, + onTap: () async { + await sendLogs( + context, + S.of(context).contactSupport, + "support@ente.io", + postShare: () {}, + ); + }, + ), + ], + ); + }, + ) + : const SizedBox.shrink(); + }, + ), + ], + ), ); } From 5fceb9898f15dfc8c0b0aa40734ece2c3ad12cd2 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 12:52:11 +0530 Subject: [PATCH 1160/1179] [mob][photos] Remove gesture that triggered send logs from local sync screen --- mobile/lib/ui/home/loading_photos_widget.dart | 174 ++++++++---------- 1 file changed, 78 insertions(+), 96 deletions(-) diff --git a/mobile/lib/ui/home/loading_photos_widget.dart b/mobile/lib/ui/home/loading_photos_widget.dart index 10dabd61fe..40abc887bc 100644 --- a/mobile/lib/ui/home/loading_photos_widget.dart +++ b/mobile/lib/ui/home/loading_photos_widget.dart @@ -14,7 +14,6 @@ import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/dialog_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart'; -import "package:photos/utils/debouncer.dart"; import "package:photos/utils/email_util.dart"; import 'package:photos/utils/navigation_util.dart'; @@ -34,7 +33,6 @@ class _LoadingPhotosWidgetState extends State { initialPage: 0, ); final List _messages = []; - final _debouncer = Debouncer(const Duration(milliseconds: 500)); late final Timer _didYouKnowTimer; final fortySecondsOnScreen = ValueNotifier(false); @@ -93,7 +91,6 @@ class _LoadingPhotosWidgetState extends State { void dispose() { _firstImportEvent.cancel(); _importProgressEvent.cancel(); - _debouncer.cancelDebounceTimer(); _didYouKnowTimer.cancel(); fortySecondsOnScreen.dispose(); super.dispose(); @@ -106,102 +103,87 @@ class _LoadingPhotosWidgetState extends State { return Scaffold( body: SingleChildScrollView( child: Center( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onScaleEnd: (details) { - _debouncer.run(() async { - unawaited( - triggerSendLogs( - "support@ente.io", - "Stuck on loading local photos screen on ${Platform.operatingSystem}", - null, - ), - ); - }); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Stack( - alignment: Alignment.center, - children: [ - isLightMode - ? Image.asset( - 'assets/loading_photos_background.png', - color: Colors.white.withOpacity(0.5), - colorBlendMode: BlendMode.modulate, - ) - : Image.asset( - 'assets/loading_photos_background_dark.png', - color: Colors.white.withOpacity(0.25), - colorBlendMode: BlendMode.modulate, - ), - Column( - children: [ - const SizedBox(height: 24), - Lottie.asset( - 'assets/loadingGalleryLottie.json', - height: 400, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + isLightMode + ? Image.asset( + 'assets/loading_photos_background.png', + color: Colors.white.withOpacity(0.5), + colorBlendMode: BlendMode.modulate, + ) + : Image.asset( + 'assets/loading_photos_background_dark.png', + color: Colors.white.withOpacity(0.25), + colorBlendMode: BlendMode.modulate, ), - ], - ), - ], - ), - Text( - _loadingMessage, - style: TextStyle( - color: Theme.of(context).colorScheme.subTextColor, - ), - ), - const SizedBox(height: 54), - Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - S.of(context).didYouKnow, - style: Theme.of(context) - .textTheme - .titleLarge! - .copyWith( - color: - Theme.of(context).colorScheme.greenText, - ), - ), - ], - ), - const SizedBox( - height: 16, - ), - SizedBox( - height: 175, - child: Stack( - children: [ - PageView.builder( - scrollDirection: Axis.vertical, - controller: _pageController, - itemBuilder: (context, index) { - return _getMessage(_messages[index]); - }, - itemCount: _messages.length, - physics: const NeverScrollableScrollPhysics(), - ), - const Positioned( - bottom: 0, - left: 0, - right: 0, - child: BottomShadowWidget(), - ), - ], + Column( + children: [ + const SizedBox(height: 24), + Lottie.asset( + 'assets/loadingGalleryLottie.json', + height: 400, ), - ), - ], + ], + ), + ], + ), + Text( + _loadingMessage, + style: TextStyle( + color: Theme.of(context).colorScheme.subTextColor, ), - ], - ), + ), + const SizedBox(height: 54), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + S.of(context).didYouKnow, + style: Theme.of(context) + .textTheme + .titleLarge! + .copyWith( + color: Theme.of(context).colorScheme.greenText, + ), + ), + ], + ), + const SizedBox( + height: 16, + ), + SizedBox( + height: 175, + child: Stack( + children: [ + PageView.builder( + scrollDirection: Axis.vertical, + controller: _pageController, + itemBuilder: (context, index) { + return _getMessage(_messages[index]); + }, + itemCount: _messages.length, + physics: const NeverScrollableScrollPhysics(), + ), + const Positioned( + bottom: 0, + left: 0, + right: 0, + child: BottomShadowWidget(), + ), + ], + ), + ), + ], + ), + ], ), ), ), From ba270000b2a40e189d4da3c3d9d12ee1658dacca Mon Sep 17 00:00:00 2001 From: Aman Raj Singh Mourya Date: Tue, 10 Sep 2024 12:52:27 +0530 Subject: [PATCH 1161/1179] [auth] Fix logout action --- auth/lib/ui/tools/lock_screen.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/auth/lib/ui/tools/lock_screen.dart b/auth/lib/ui/tools/lock_screen.dart index a77ba6d155..139a7fcbd2 100644 --- a/auth/lib/ui/tools/lock_screen.dart +++ b/auth/lib/ui/tools/lock_screen.dart @@ -3,12 +3,14 @@ import 'dart:math'; import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/onboarding/view/onboarding_page.dart'; import 'package:ente_auth/services/user_service.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/tools/app_lock.dart'; import 'package:ente_auth/utils/auth_util.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/lock_screen_settings.dart'; +import 'package:ente_auth/utils/navigation_util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_animate/flutter_animate.dart'; @@ -206,6 +208,10 @@ class _LockScreenState extends State with WidgetsBindingObserver { isCritical: true, firstButtonOnTap: () async { await UserService.instance.logout(context); + await routeToPage( + context, + const OnboardingPage(), + ); }, ); } From a55c735d13480e9139b7213d7d0c06e0db0064b4 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 12:53:31 +0530 Subject: [PATCH 1162/1179] Fix mobile search bar --- web/apps/photos/src/components/SearchBar.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/components/SearchBar.tsx b/web/apps/photos/src/components/SearchBar.tsx index 20f18ec0f2..e5ad7ca466 100644 --- a/web/apps/photos/src/components/SearchBar.tsx +++ b/web/apps/photos/src/components/SearchBar.tsx @@ -81,14 +81,15 @@ export const SearchBar: React.FC = ({ isInSearchMode, ...props }) => { + console.log({ isInSearchMode }, props); const showSearchInput = () => setIsInSearchMode(true); const isMobileWidth = useIsMobileWidth(); return ( - {isMobileWidth ? ( + {isMobileWidth && !isInSearchMode ? ( ) : ( From c0c477a3b704718554ec4f71c97de9ef4d25d445 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 12:55:07 +0530 Subject: [PATCH 1163/1179] Remove debug log --- web/apps/photos/src/components/SearchBar.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/web/apps/photos/src/components/SearchBar.tsx b/web/apps/photos/src/components/SearchBar.tsx index e5ad7ca466..f03b192ac4 100644 --- a/web/apps/photos/src/components/SearchBar.tsx +++ b/web/apps/photos/src/components/SearchBar.tsx @@ -81,7 +81,6 @@ export const SearchBar: React.FC = ({ isInSearchMode, ...props }) => { - console.log({ isInSearchMode }, props); const showSearchInput = () => setIsInSearchMode(true); const isMobileWidth = useIsMobileWidth(); From bb0f31f8143a0c766be4eea0f764808dcd5f6e76 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 12:58:36 +0530 Subject: [PATCH 1164/1179] [mob][photos] Extract strings --- mobile/lib/generated/intl/messages_ar.dart | 4 +- mobile/lib/generated/intl/messages_bg.dart | 4 +- mobile/lib/generated/intl/messages_ca.dart | 4 +- mobile/lib/generated/intl/messages_cs.dart | 4 +- mobile/lib/generated/intl/messages_da.dart | 4 +- mobile/lib/generated/intl/messages_de.dart | 38 +- mobile/lib/generated/intl/messages_el.dart | 4 +- mobile/lib/generated/intl/messages_en.dart | 26 +- mobile/lib/generated/intl/messages_es.dart | 24 +- mobile/lib/generated/intl/messages_et.dart | 4 +- mobile/lib/generated/intl/messages_fa.dart | 12 +- mobile/lib/generated/intl/messages_fr.dart | 28 +- mobile/lib/generated/intl/messages_gu.dart | 4 +- mobile/lib/generated/intl/messages_he.dart | 20 +- mobile/lib/generated/intl/messages_hi.dart | 4 +- mobile/lib/generated/intl/messages_id.dart | 24 +- mobile/lib/generated/intl/messages_it.dart | 110 +- mobile/lib/generated/intl/messages_ja.dart | 1511 ++++++++++++++++- mobile/lib/generated/intl/messages_km.dart | 4 +- mobile/lib/generated/intl/messages_ko.dart | 4 +- mobile/lib/generated/intl/messages_nl.dart | 33 +- mobile/lib/generated/intl/messages_no.dart | 12 +- mobile/lib/generated/intl/messages_pl.dart | 34 +- mobile/lib/generated/intl/messages_pt.dart | 33 +- mobile/lib/generated/intl/messages_ru.dart | 24 +- mobile/lib/generated/intl/messages_sv.dart | 21 +- mobile/lib/generated/intl/messages_ta.dart | 2 + mobile/lib/generated/intl/messages_te.dart | 4 +- mobile/lib/generated/intl/messages_th.dart | 8 +- mobile/lib/generated/intl/messages_ti.dart | 4 +- mobile/lib/generated/intl/messages_tr.dart | 34 +- mobile/lib/generated/intl/messages_zh.dart | 32 +- mobile/lib/generated/l10n.dart | 10 + mobile/lib/l10n/intl_ar.arb | 3 +- mobile/lib/l10n/intl_bg.arb | 3 +- mobile/lib/l10n/intl_ca.arb | 3 +- mobile/lib/l10n/intl_cs.arb | 3 +- mobile/lib/l10n/intl_da.arb | 3 +- mobile/lib/l10n/intl_de.arb | 3 +- mobile/lib/l10n/intl_el.arb | 3 +- mobile/lib/l10n/intl_en.arb | 5 +- mobile/lib/l10n/intl_es.arb | 3 +- mobile/lib/l10n/intl_et.arb | 3 +- mobile/lib/l10n/intl_fa.arb | 3 +- mobile/lib/l10n/intl_fr.arb | 3 +- mobile/lib/l10n/intl_gu.arb | 3 +- mobile/lib/l10n/intl_he.arb | 3 +- mobile/lib/l10n/intl_hi.arb | 3 +- mobile/lib/l10n/intl_id.arb | 3 +- mobile/lib/l10n/intl_it.arb | 3 +- mobile/lib/l10n/intl_ja.arb | 3 +- mobile/lib/l10n/intl_km.arb | 3 +- mobile/lib/l10n/intl_ko.arb | 3 +- mobile/lib/l10n/intl_nl.arb | 3 +- mobile/lib/l10n/intl_no.arb | 3 +- mobile/lib/l10n/intl_pl.arb | 3 +- mobile/lib/l10n/intl_pt.arb | 3 +- mobile/lib/l10n/intl_ru.arb | 3 +- mobile/lib/l10n/intl_sv.arb | 3 +- mobile/lib/l10n/intl_ta.arb | 3 +- mobile/lib/l10n/intl_te.arb | 3 +- mobile/lib/l10n/intl_th.arb | 3 +- mobile/lib/l10n/intl_ti.arb | 3 +- mobile/lib/l10n/intl_tr.arb | 3 +- mobile/lib/l10n/intl_zh.arb | 3 +- mobile/lib/ui/home/loading_photos_widget.dart | 3 +- 66 files changed, 1945 insertions(+), 244 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index aea20b16df..08ce4b43f1 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -41,8 +41,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("مفتاح الاسترداد غير صحيح"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage( "عنوان البريد الإلكتروني غير صالح"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index 851852e93c..aef033bd98 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index 09442d5939..28389a382d 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index d356229fc0..34a5bccc3c 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index 3dc7a2b02b..9577d68b1a 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -94,12 +94,12 @@ class MessageLookup extends MessageLookupByLibrary { "invite": MessageLookupByLibrary.simpleMessage("Inviter"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "Hjælp os venligst med disse oplysninger"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "loggingOut": MessageLookupByLibrary.simpleMessage("Logger ud..."), "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen."), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manage": MessageLookupByLibrary.simpleMessage("Administrér"), "memoryCount": m0, "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 9dda3f5b50..0d9253971a 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -207,17 +207,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 Tag', other: '${count} Tage')}"; - static String m67(endDate) => "Gültig bis ${endDate}"; + static String m67(count) => "Sichere ${count} Erinnerungsstücke..."; - static String m68(email) => "Verifiziere ${email}"; + static String m68(endDate) => "Gültig bis ${endDate}"; - static String m69(email) => + static String m69(email) => "Verifiziere ${email}"; + + static String m70(email) => "Wir haben eine E-Mail an ${email} gesendet"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: 'vor einem Jahr', other: 'vor ${count} Jahren')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Du hast ${storageSaved} erfolgreich freigegeben!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -404,6 +406,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Über mobile Daten sichern"), "backupSettings": MessageLookupByLibrary.simpleMessage("Backup-Einstellungen"), + "backupStatus": + MessageLookupByLibrary.simpleMessage("Sicherungsstatus"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Gesicherte Elemente werden hier angezeigt"), "backupVideos": MessageLookupByLibrary.simpleMessage("Videos sichern"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("Black-Friday-Aktion"), @@ -972,6 +978,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Lade Modelle herunter..."), "localGallery": MessageLookupByLibrary.simpleMessage("Lokale Galerie"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Standort"), "locationName": MessageLookupByLibrary.simpleMessage("Standortname"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -995,8 +1003,9 @@ class MessageLookup extends MessageLookupByLibrary { "Lange auf eine E-Mail drücken, um die Ende-zu-Ende-Verschlüsselung zu überprüfen."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Drücken Sie lange auf ein Element, um es im Vollbildmodus anzuzeigen"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": + MessageLookupByLibrary.simpleMessage("Videoschleife aus"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("Videoschleife an"), "lostDevice": MessageLookupByLibrary.simpleMessage("Gerät verloren?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Maschinelles Lernen"), @@ -1665,6 +1674,9 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Dateien werden ins Album hochgeladen..."), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( + "Sichere ein Erinnerungsstück..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Bis zu 50% Rabatt bis zum 4. Dezember."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( @@ -1679,7 +1691,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ausgewähltes Foto verwenden"), "usedSpace": MessageLookupByLibrary.simpleMessage("Belegter Speicherplatz"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut"), @@ -1688,7 +1700,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse verifizieren"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Passkey verifizieren"), @@ -1709,6 +1721,8 @@ class MessageLookup extends MessageLookupByLibrary { "viewAllExifData": MessageLookupByLibrary.simpleMessage("Alle Exif-Daten anzeigen"), "viewLargeFiles": MessageLookupByLibrary.simpleMessage("Große Dateien"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "Dateien anzeigen, die den meisten Speicherplatz belegen."), "viewLogs": MessageLookupByLibrary.simpleMessage("Protokolle anzeigen"), "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungsschlüssel anzeigen"), @@ -1724,13 +1738,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Wir unterstützen keine Bearbeitung von Fotos und Alben, die du noch nicht besitzt"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Schwach"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Willkommen zurück!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Neue Funktionen"), "yearly": MessageLookupByLibrary.simpleMessage("Jährlich"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, kündigen"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1760,7 +1774,7 @@ class MessageLookup extends MessageLookupByLibrary { "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Du hast keine archivierten Elemente."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Dein Benutzerkonto wurde gelöscht"), "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index 806ebe1f80..226f5b7123 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -24,7 +24,7 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index f84dac22e9..4cb24bfebe 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -206,18 +206,18 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 day', other: '${count} days')}"; - static String m72(count) => "Preserving ${count} memories..."; + static String m67(count) => "Preserving ${count} memories..."; - static String m67(endDate) => "Valid till ${endDate}"; + static String m68(endDate) => "Valid till ${endDate}"; - static String m68(email) => "Verify ${email}"; + static String m69(email) => "Verify ${email}"; - static String m69(email) => "We have sent a mail to ${email}"; + static String m70(email) => "We have sent a mail to ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} year ago', other: '${count} years ago')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "You have successfully freed up ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -936,6 +936,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Downloading models..."), "localGallery": MessageLookupByLibrary.simpleMessage("Local gallery"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Location"), "locationName": MessageLookupByLibrary.simpleMessage("Location name"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -1597,7 +1599,7 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Uploading files to album..."), - "uploadingMultipleMemories": m72, + "uploadingMultipleMemories": m67, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preserving 1 memory..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1613,7 +1615,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Use selected photo"), "usedSpace": MessageLookupByLibrary.simpleMessage("Used space"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verification failed, please try again"), @@ -1621,7 +1623,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verification ID"), "verify": MessageLookupByLibrary.simpleMessage("Verify"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verify email"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verify"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verify passkey"), "verifyPassword": @@ -1656,12 +1658,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "We don\'t support editing photos and albums that you don\'t own yet"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Weak"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Welcome back!"), "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), "yearly": MessageLookupByLibrary.simpleMessage("Yearly"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Yes"), "yesCancel": MessageLookupByLibrary.simpleMessage("Yes, cancel"), "yesConvertToViewer": @@ -1691,7 +1693,7 @@ class MessageLookup extends MessageLookupByLibrary { "You cannot share with yourself"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "You don\'t have any archived items."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Your account has been deleted"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index a6c403c493..58886ea00e 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -207,17 +207,17 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 día', other: '${count} días')}"; - static String m67(endDate) => "Válido hasta ${endDate}"; + static String m68(endDate) => "Válido hasta ${endDate}"; - static String m68(email) => "Verificar ${email}"; + static String m69(email) => "Verificar ${email}"; - static String m69(email) => + static String m70(email) => "Hemos enviado un correo a ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} año atrás', other: '${count} años atrás')}"; - static String m71(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; + static String m72(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -958,6 +958,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Descargando modelos..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galería local"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Ubicación"), "locationName": MessageLookupByLibrary.simpleMessage("Nombre de la ubicación"), @@ -985,8 +987,6 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Manten presionado un elemento para ver en pantalla completa"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("¿Perdiste tu dispositivo?"), "machineLearning": @@ -1652,7 +1652,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usar foto seleccionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espacio usado"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificación fallida, por favor inténtalo de nuevo"), @@ -1661,7 +1661,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Verificar correo electrónico"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar clave de acceso"), @@ -1698,13 +1698,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "No admitimos la edición de fotos y álbumes que aún no son tuyos"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Poco segura"), "welcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Qué hay de nuevo"), "yearly": MessageLookupByLibrary.simpleMessage("Anualmente"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Sí"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sí, cancelar"), "yesConvertToViewer": @@ -1734,7 +1734,7 @@ class MessageLookup extends MessageLookupByLibrary { "No puedes compartir contigo mismo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "No tienes ningún elemento archivado."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Tu cuenta ha sido eliminada"), "yourMap": MessageLookupByLibrary.simpleMessage("Tu mapa"), diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index 064920dfe8..9c8f34b91a 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index f125ded544..f47c3b7bec 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -37,9 +37,9 @@ class MessageLookup extends MessageLookupByLibrary { usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} از ${totalAmount} ${totalStorageUnit} استفاده شده"; - static String m68(email) => "تایید ${email}"; + static String m69(email) => "تایید ${email}"; - static String m69(email) => + static String m70(email) => "ما یک ایمیل به ${email} ارسال کرده‌ایم"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -241,14 +241,14 @@ class MessageLookup extends MessageLookupByLibrary { "lightTheme": MessageLookupByLibrary.simpleMessage("روشن"), "loadMessage2": MessageLookupByLibrary.simpleMessage( "ما تا کنون بیش از ۳۰ میلیون خاطره را حفظ کرده‌ایم"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("قفل"), "logInLabel": MessageLookupByLibrary.simpleMessage("ورود"), "loggingOut": MessageLookupByLibrary.simpleMessage("در حال خروج..."), "loginTerms": MessageLookupByLibrary.simpleMessage( "با کلیک بر روی ورود به سیستم، من با شرایط خدمات و سیاست حفظ حریم خصوصی موافقم"), "logout": MessageLookupByLibrary.simpleMessage("خروج"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manage": MessageLookupByLibrary.simpleMessage("مدیریت"), "manageFamily": MessageLookupByLibrary.simpleMessage("مدیریت خانواده"), "manageLink": MessageLookupByLibrary.simpleMessage("مدیریت پیوند"), @@ -409,7 +409,7 @@ class MessageLookup extends MessageLookupByLibrary { "از کلید بازیابی استفاده کنید"), "verify": MessageLookupByLibrary.simpleMessage("تایید"), "verifyEmail": MessageLookupByLibrary.simpleMessage("تایید ایمیل"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("تایید"), "verifyPassword": MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), @@ -422,7 +422,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewer": MessageLookupByLibrary.simpleMessage("بیننده"), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("ما متن‌باز هستیم!"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("ضعیف"), "welcomeBack": MessageLookupByLibrary.simpleMessage("خوش آمدید!"), "whatsNew": MessageLookupByLibrary.simpleMessage("تغییرات جدید"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 26521ad5dd..9421f754f1 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -208,17 +208,17 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '0 jour', one: '1 jour', other: '${count} jours')}"; - static String m67(endDate) => "Valable jusqu\'au ${endDate}"; + static String m68(endDate) => "Valable jusqu\'au ${endDate}"; - static String m68(email) => "Vérifier ${email}"; + static String m69(email) => "Vérifier ${email}"; - static String m69(email) => + static String m70(email) => "Nous avons envoyé un e-mail à ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: 'il y a ${count} an', other: 'il y a ${count} ans')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Vous avez libéré ${storageSaved} avec succès !"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -988,6 +988,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage( "Téléchargement des modèles..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galerie locale"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Emplacement"), "locationName": MessageLookupByLibrary.simpleMessage("Nom du lieu"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -1013,8 +1015,10 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Appuyez longuement sur un élément pour le voir en plein écran"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": + MessageLookupByLibrary.simpleMessage("Vidéo en boucle désactivée"), + "loopVideoOn": + MessageLookupByLibrary.simpleMessage("Vidéo en boucle activée"), "lostDevice": MessageLookupByLibrary.simpleMessage("Appareil perdu ?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Apprentissage automatique"), @@ -1712,7 +1716,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( "Utiliser la photo sélectionnée"), "usedSpace": MessageLookupByLibrary.simpleMessage("Mémoire utilisée"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "La vérification a échouée, veuillez réessayer"), @@ -1721,7 +1725,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Vérifier le code d\'accès"), @@ -1761,12 +1765,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Nous ne prenons pas en charge l\'édition des photos et des albums que vous ne possédez pas encore"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Securité Faible"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bienvenue !"), "whatsNew": MessageLookupByLibrary.simpleMessage("Nouveautés"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Oui"), "yesCancel": MessageLookupByLibrary.simpleMessage("Oui, annuler"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1797,7 +1801,7 @@ class MessageLookup extends MessageLookupByLibrary { "Vous ne pouvez pas partager avec vous-même"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Vous n\'avez aucun élément archivé."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Votre compte a été supprimé"), "yourMap": MessageLookupByLibrary.simpleMessage("Votre carte"), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index fb3ab8be3b..a4f6078807 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index fc59d12855..cece07686f 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -119,14 +119,14 @@ class MessageLookup extends MessageLookupByLibrary { static String m65(email) => "זה מזהה האימות של ${email}"; - static String m68(email) => "אמת ${email}"; + static String m69(email) => "אמת ${email}"; - static String m69(email) => "שלחנו דוא\"ל ל${email}"; + static String m70(email) => "שלחנו דוא\"ל ל${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: 'לפני ${count} שנה', two: 'לפני ${count} שנים', many: 'לפני ${count} שנים', other: 'לפני ${count} שנים')}"; - static String m71(storageSaved) => "הצלחת לפנות ${storageSaved}!"; + static String m72(storageSaved) => "הצלחת לפנות ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -544,6 +544,8 @@ class MessageLookup extends MessageLookupByLibrary { "linkHasExpired": MessageLookupByLibrary.simpleMessage("הקישור פג תוקף"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("לעולם לא"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("מקום"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("נעל"), "lockscreen": MessageLookupByLibrary.simpleMessage("מסך נעילה"), @@ -555,8 +557,6 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("איבדת את המכשיר?"), "manage": MessageLookupByLibrary.simpleMessage("נהל"), "manageDeviceStorage": @@ -908,7 +908,7 @@ class MessageLookup extends MessageLookupByLibrary { "verificationId": MessageLookupByLibrary.simpleMessage("מזהה אימות"), "verify": MessageLookupByLibrary.simpleMessage("אמת"), "verifyEmail": MessageLookupByLibrary.simpleMessage("אימות דוא\"ל"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("אמת"), "verifyPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), "verifyingRecoveryKey": @@ -925,11 +925,11 @@ class MessageLookup extends MessageLookupByLibrary { "אנא בקר ב-web.ente.io על מנת לנהל את המנוי שלך"), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("הקוד שלנו פתוח!"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("חלשה"), "welcomeBack": MessageLookupByLibrary.simpleMessage("ברוך שובך!"), "yearly": MessageLookupByLibrary.simpleMessage("שנתי"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("כן"), "yesCancel": MessageLookupByLibrary.simpleMessage("כן, בטל"), "yesConvertToViewer": @@ -952,7 +952,7 @@ class MessageLookup extends MessageLookupByLibrary { "אתה לא יכול לשנמך לתוכנית הזו"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage("אתה לא יכול לשתף עם עצמך"), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("החשבון שלך נמחק"), "yourPlanWasSuccessfullyDowngraded": diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index 521b12f791..2dcb842e81 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -75,8 +75,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("अमान्य ईमेल ऐड्रेस"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "कृपया हमें इस जानकारी के लिए सहायता करें"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("रिकवरी कुंजी नहीं है?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 08464b5546..cb52231922 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -193,17 +193,17 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 hari', other: '${count} hari')}"; - static String m67(endDate) => "Berlaku hingga ${endDate}"; + static String m68(endDate) => "Berlaku hingga ${endDate}"; - static String m68(email) => "Verifikasi ${email}"; + static String m69(email) => "Verifikasi ${email}"; - static String m69(email) => + static String m70(email) => "Kami telah mengirimkan email ke ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, other: '${count} tahun lalu')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Kamu telah berhasil membersihkan ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -835,6 +835,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Mengunduh model..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galeri lokal"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "locationName": MessageLookupByLibrary.simpleMessage("Nama tempat"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Kunci"), "lockscreen": MessageLookupByLibrary.simpleMessage("Kunci layar"), @@ -851,8 +853,6 @@ class MessageLookup extends MessageLookupByLibrary { "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( "Tekan dan tahan email untuk membuktikan enkripsi ujung ke ujung."), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Perangkat hilang?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Pemelajaran mesin"), @@ -1422,14 +1422,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gunakan kunci pemulihan"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gunakan foto terpilih"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifikasi gagal, silakan coba lagi"), "verificationId": MessageLookupByLibrary.simpleMessage("ID Verifikasi"), "verify": MessageLookupByLibrary.simpleMessage("Verifikasi"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifikasi email"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), "verifyPassword": @@ -1459,13 +1459,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Menunggu WiFi..."), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("Kode kami sumber terbuka!"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Lemah"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Hal yang baru"), "yearly": MessageLookupByLibrary.simpleMessage("Tahunan"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Ya"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ya, batalkan"), "yesConvertToViewer": @@ -1492,7 +1492,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kamu tidak bisa berbagi dengan dirimu sendiri"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Kamu tidak memiliki item di arsip."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index d09dec6594..88d2095ae1 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -124,6 +124,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m38(albumName) => "Spostato con successo su ${albumName}"; + static String m39(name) => "Non sei ${name}?"; + static String m40(familyAdminEmail) => "Per favore contatta ${familyAdminEmail} per cambiare il tuo codice."; @@ -202,17 +204,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 giorno', other: '${count} giorni')}"; - static String m67(endDate) => "Valido fino al ${endDate}"; + static String m67(count) => "Conservando ${count} ricordi..."; - static String m68(email) => "Verifica ${email}"; + static String m68(endDate) => "Valido fino al ${endDate}"; - static String m69(email) => + static String m69(email) => "Verifica ${email}"; + + static String m70(email) => "Abbiamo inviato una mail a ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} anno fa', other: '${count} anni fa')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Hai liberato con successo ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -308,6 +312,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Android, iOS, Web, Desktop"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autenticazione necessaria"), + "appLock": MessageLookupByLibrary.simpleMessage("Blocco app"), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "Scegli tra la schermata di blocco predefinita del dispositivo e una schermata di blocco personalizzata con PIN o password."), "appVersion": m10, "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Applica"), @@ -354,6 +361,8 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticati per configurare l\'autenticazione a due fattori"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Autenticati per avviare l\'eliminazione dell\'account"), + "authToViewPasskey": MessageLookupByLibrary.simpleMessage( + "Autenticati per visualizzare le tue passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( "Autenticati per visualizzare le sessioni attive"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( @@ -369,6 +378,9 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticazione non riuscita, prova di nuovo"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Autenticazione riuscita!"), + "autoLock": MessageLookupByLibrary.simpleMessage("Blocco automatico"), + "autoLockFeatureDescription": MessageLookupByLibrary.simpleMessage( + "Tempo dopo il quale l\'applicazione si blocca dopo essere stata messa in background"), "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( "A causa di problemi tecnici, sei stato disconnesso. Ci scusiamo per l\'inconveniente."), "available": MessageLookupByLibrary.simpleMessage("Disponibile"), @@ -381,6 +393,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup su dati mobili"), "backupSettings": MessageLookupByLibrary.simpleMessage("Impostazioni backup"), + "backupStatus": MessageLookupByLibrary.simpleMessage("Stato backup"), + "backupStatusDescription": MessageLookupByLibrary.simpleMessage( + "Gli elementi che sono stati sottoposti a backup verranno mostrati qui"), "backupVideos": MessageLookupByLibrary.simpleMessage("Backup dei video"), "blackFridaySale": @@ -522,6 +537,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Creazione link..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( "Un aggiornamento importante è disponibile"), + "crop": MessageLookupByLibrary.simpleMessage("Ritaglia"), "currentUsageIs": MessageLookupByLibrary.simpleMessage( "Spazio attualmente utilizzato "), "custom": MessageLookupByLibrary.simpleMessage("Personalizza"), @@ -589,6 +605,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Inserisci il codice"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( "I file aggiunti a questo album del dispositivo verranno automaticamente caricati su Ente."), + "deviceLock": + MessageLookupByLibrary.simpleMessage("Blocco del dispositivo"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( "Disabilita il blocco schermo del dispositivo quando Ente è in primo piano e c\'è un backup in corso. Questo normalmente non è necessario ma può aiutare a completare più velocemente grossi caricamenti e l\'importazione iniziale di grandi librerie."), "deviceNotFound": @@ -644,9 +662,13 @@ class MessageLookup extends MessageLookupByLibrary { "empty": MessageLookupByLibrary.simpleMessage("Vuoto"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Vuoi svuotare il cestino?"), + "enable": MessageLookupByLibrary.simpleMessage("Abilita"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Ente supporta l\'apprendimento automatico eseguito sul dispositivo per il riconoscimento dei volti, la ricerca magica e altre funzioni di ricerca avanzata"), "enableMaps": MessageLookupByLibrary.simpleMessage("Abilita le Mappe"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Questo mostrerà le tue foto su una mappa del mondo.\n\nQuesta mappa è ospitata da Open Street Map e le posizioni esatte delle tue foto non sono mai condivise.\n\nPuoi disabilitare questa funzionalità in qualsiasi momento, dalle Impostazioni."), + "enabled": MessageLookupByLibrary.simpleMessage("Abilitato"), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Crittografando il backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Crittografia"), @@ -677,6 +699,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Inserisci password"), "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Inserisci una password per criptare i tuoi dati"), + "enterPin": MessageLookupByLibrary.simpleMessage("Inserisci PIN"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( "Inserisci il codice di invito"), "enterThe6digitCodeFromnyourAuthenticatorApp": @@ -775,6 +798,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Concedi il permesso"), "groupNearbyPhotos": MessageLookupByLibrary.simpleMessage( "Raggruppa foto nelle vicinanze"), + "guestView": MessageLookupByLibrary.simpleMessage("Vista ospite"), + "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( + "Per abilitare la vista ospite, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema."), "hearUsExplanation": MessageLookupByLibrary.simpleMessage( "Non teniamo traccia del numero di installazioni dell\'app. Sarebbe utile se ci dicesse dove ci ha trovato!"), "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( @@ -782,6 +808,12 @@ class MessageLookup extends MessageLookupByLibrary { "help": MessageLookupByLibrary.simpleMessage("Aiuto"), "hidden": MessageLookupByLibrary.simpleMessage("Nascosti"), "hide": MessageLookupByLibrary.simpleMessage("Nascondi"), + "hideContent": + MessageLookupByLibrary.simpleMessage("Nascondi il contenuto"), + "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( + "Nasconde il contenuto nel selettore delle app e disabilita gli screenshot"), + "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( + "Nasconde il contenuto nel selettore delle app"), "hiding": MessageLookupByLibrary.simpleMessage("Nascondendo..."), "hostedAtOsmFrance": MessageLookupByLibrary.simpleMessage("Ospitato presso OSM France"), @@ -796,6 +828,7 @@ class MessageLookup extends MessageLookupByLibrary { "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignora"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Alcuni file in questo album vengono ignorati dal caricamento perché erano stati precedentemente eliminati da Ente."), + "immediately": MessageLookupByLibrary.simpleMessage("Immediatamente"), "importing": MessageLookupByLibrary.simpleMessage("Importazione in corso...."), "incorrectCode": @@ -854,6 +887,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Abbandona il piano famiglia"), "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage( "Abbandonare l\'album condiviso?"), + "left": MessageLookupByLibrary.simpleMessage("Sinistra"), "light": MessageLookupByLibrary.simpleMessage("Chiaro"), "lightTheme": MessageLookupByLibrary.simpleMessage("Chiaro"), "linkCopiedToClipboard": @@ -894,6 +928,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Scaricamento modelli..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galleria locale"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Luogo"), "locationName": MessageLookupByLibrary.simpleMessage("Nome della località"), @@ -917,10 +953,11 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Premi a lungo su un elemento per visualizzarlo a schermo intero"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Dispositivo perso?"), + "machineLearning": MessageLookupByLibrary.simpleMessage( + "Apprendimento automatico (ML)"), + "magicSearch": MessageLookupByLibrary.simpleMessage("Ricerca magica"), "manage": MessageLookupByLibrary.simpleMessage("Gestisci"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( "Gestisci memoria dispositivo"), @@ -936,10 +973,16 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m0, "merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"), + "mlConsent": MessageLookupByLibrary.simpleMessage( + "Abilita l\'apprendimento automatico"), + "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( + "Comprendo e desidero abilitare l\'apprendimento automatico"), "mlConsentDescription": MessageLookupByLibrary.simpleMessage( "Se abiliti il Machine Learning, Ente estrarrà informazioni come la geometria del volto dai file, inclusi quelli condivisi con te.\n\nQuesto accadrà sul tuo dispositivo, e qualsiasi informazione biometrica generata sarà crittografata end-to-end."), "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( "Clicca qui per maggiori dettagli su questa funzione nella nostra informativa sulla privacy"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage( + "Abilita l\'apprendimento automatico?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( "Si prega di notare che l\'attivazione dell\'apprendimento automatico si tradurrà in un maggior utilizzo della connessione e della batteria fino a quando tutti gli elementi non saranno indicizzati. Valuta di utilizzare l\'applicazione desktop per un\'indicizzazione più veloce, tutti i risultati verranno sincronizzati automaticamente."), "mobileWebDesktop": @@ -950,6 +993,7 @@ class MessageLookup extends MessageLookupByLibrary { "Modifica la tua interrogazione o prova a cercare"), "moments": MessageLookupByLibrary.simpleMessage("Momenti"), "monthly": MessageLookupByLibrary.simpleMessage("Mensile"), + "moreDetails": MessageLookupByLibrary.simpleMessage("Più dettagli"), "moveItem": m37, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Sposta nell\'album"), @@ -990,6 +1034,8 @@ class MessageLookup extends MessageLookupByLibrary { "Il backup delle foto attualmente non viene eseguito"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("Nessuna foto trovata"), + "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( + "Nessun link rapido selezionato"), "noRecoveryKey": MessageLookupByLibrary.simpleMessage("Nessuna chiave di recupero?"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( @@ -997,6 +1043,9 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Nessun risultato"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nessun risultato trovato"), + "noSystemLockFound": MessageLookupByLibrary.simpleMessage( + "Nessun blocco di sistema trovato"), + "notPersonLabel": m39, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nulla di condiviso con te"), "nothingToSeeHere": @@ -1023,6 +1072,7 @@ class MessageLookup extends MessageLookupByLibrary { "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage( "Oppure scegline una esistente"), "pair": MessageLookupByLibrary.simpleMessage("Abbina"), + "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "La verifica è ancora in corso"), "passkey": MessageLookupByLibrary.simpleMessage("Passkey"), @@ -1034,6 +1084,8 @@ class MessageLookup extends MessageLookupByLibrary { "passwordLock": MessageLookupByLibrary.simpleMessage("Blocco con password"), "passwordStrength": m41, + "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( + "La sicurezza della password viene calcolata considerando la lunghezza della password, i caratteri usati e se la password appare o meno nelle prime 10.000 password più usate"), "passwordWarning": MessageLookupByLibrary.simpleMessage( "Noi non memorizziamo la tua password, quindi se te la dimentichi, non possiamo decriptare i tuoi dati"), "paymentDetails": @@ -1068,6 +1120,7 @@ class MessageLookup extends MessageLookupByLibrary { "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Selezionare il punto centrale"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fissa l\'album"), + "pinLock": MessageLookupByLibrary.simpleMessage("Blocco con PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Riproduci album sulla TV"), "playStoreFreeTrialValidTill": m43, @@ -1087,6 +1140,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), + "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( + "Si prega di selezionare i link rapidi da rimuovere"), "pleaseSendTheLogsTo": m45, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1147,6 +1202,10 @@ class MessageLookup extends MessageLookupByLibrary { "recreatePasswordTitle": MessageLookupByLibrary.simpleMessage("Reimposta password"), "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), + "reenterPassword": + MessageLookupByLibrary.simpleMessage("Reinserisci la password"), + "reenterPin": + MessageLookupByLibrary.simpleMessage("Reinserisci il PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( "Invita un amico e raddoppia il tuo spazio"), "referralStep1": MessageLookupByLibrary.simpleMessage( @@ -1182,6 +1241,8 @@ class MessageLookup extends MessageLookupByLibrary { "removeParticipantBody": m48, "removePublicLink": MessageLookupByLibrary.simpleMessage("Rimuovi link pubblico"), + "removePublicLinks": + MessageLookupByLibrary.simpleMessage("Rimuovi i link pubblici"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( "Alcuni degli elementi che stai rimuovendo sono stati aggiunti da altre persone e ne perderai l\'accesso"), "removeWithQuestionMark": @@ -1213,6 +1274,10 @@ class MessageLookup extends MessageLookupByLibrary { "retry": MessageLookupByLibrary.simpleMessage("Riprova"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Controlla ed elimina gli elementi che credi siano dei doppioni."), + "reviewSuggestions": + MessageLookupByLibrary.simpleMessage("Esamina i suggerimenti"), + "right": MessageLookupByLibrary.simpleMessage("Destra"), + "rotate": MessageLookupByLibrary.simpleMessage("Ruota"), "rotateLeft": MessageLookupByLibrary.simpleMessage("Ruota a sinistra"), "rotateRight": MessageLookupByLibrary.simpleMessage("Ruota a destra"), "safelyStored": @@ -1293,6 +1358,10 @@ class MessageLookup extends MessageLookupByLibrary { "setAs": MessageLookupByLibrary.simpleMessage("Imposta come"), "setCover": MessageLookupByLibrary.simpleMessage("Imposta copertina"), "setLabel": MessageLookupByLibrary.simpleMessage("Imposta"), + "setNewPassword": + MessageLookupByLibrary.simpleMessage("Imposta una nuova password"), + "setNewPin": + MessageLookupByLibrary.simpleMessage("Imposta un nuovo PIN"), "setPasswordTitle": MessageLookupByLibrary.simpleMessage("Imposta password"), "setRadius": MessageLookupByLibrary.simpleMessage("Imposta raggio"), @@ -1419,6 +1488,8 @@ class MessageLookup extends MessageLookupByLibrary { "tapToCopy": MessageLookupByLibrary.simpleMessage("tocca per copiare"), "tapToEnterCode": MessageLookupByLibrary.simpleMessage( "Tocca per inserire il codice"), + "tapToUnlock": + MessageLookupByLibrary.simpleMessage("Tocca per sbloccare"), "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), "terminate": MessageLookupByLibrary.simpleMessage("Terminata"), @@ -1464,11 +1535,19 @@ class MessageLookup extends MessageLookupByLibrary { "Verrai disconnesso dai seguenti dispositivi:"), "thisWillLogYouOutOfThisDevice": MessageLookupByLibrary.simpleMessage( "Verrai disconnesso dal tuo dispositivo!"), + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": + MessageLookupByLibrary.simpleMessage( + "Questo rimuoverà i link pubblici di tutti i link rapidi selezionati."), + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": + MessageLookupByLibrary.simpleMessage( + "Per abilitare il blocco dell\'app, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema."), "toHideAPhotoOrVideo": MessageLookupByLibrary.simpleMessage( "Per nascondere una foto o un video"), "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( "Per reimpostare la tua password, verifica prima la tua email."), "todaysLogs": MessageLookupByLibrary.simpleMessage("Log di oggi"), + "tooManyIncorrectAttempts": + MessageLookupByLibrary.simpleMessage("Troppi tentativi errati"), "total": MessageLookupByLibrary.simpleMessage("totale"), "totalSize": MessageLookupByLibrary.simpleMessage("Dimensioni totali"), "trash": MessageLookupByLibrary.simpleMessage("Cestino"), @@ -1521,8 +1600,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Acquista altro spazio"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Caricamento dei file nell\'album..."), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": + MessageLookupByLibrary.simpleMessage("Conservando 1 ricordo..."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "Lo spazio disponibile è limitato dal tuo piano corrente. L\'archiviazione in eccesso diventerà automaticamente utilizzabile quando aggiornerai il tuo piano."), + "useAsCover": + MessageLookupByLibrary.simpleMessage("Usa come copertina"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( "Usa link pubblici per persone non registrate su Ente"), @@ -1531,7 +1615,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usa la foto selezionata"), "usedSpace": MessageLookupByLibrary.simpleMessage("Spazio utilizzato"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifica fallita, per favore prova di nuovo"), @@ -1539,7 +1623,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID di verifica"), "verify": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifica passkey"), @@ -1549,6 +1633,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verifica in corso..."), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( "Verifica della chiave di recupero..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("Informazioni video"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("video"), "videos": MessageLookupByLibrary.simpleMessage("Video"), "viewActiveSessions": @@ -1577,11 +1662,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Non puoi modificare foto e album che non possiedi"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Debole"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bentornato/a!"), + "whatsNew": MessageLookupByLibrary.simpleMessage("Novità"), "yearly": MessageLookupByLibrary.simpleMessage("Annuale"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Si"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sì, cancella"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1611,7 +1697,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non puoi condividere con te stesso"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Non hai nulla di archiviato."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), "yourMap": MessageLookupByLibrary.simpleMessage("La tua mappa"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index 4f9b5f9d57..387b8c9919 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -20,9 +20,1516 @@ typedef String MessageIfAbsent(String messageStr, List args); class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ja'; + static String m3(count) => + "${Intl.plural(count, zero: '共同編集者を追加', one: '共同編集者を追加', other: '共同編集者を追加')}"; + + static String m4(count) => + "${Intl.plural(count, one: '項目を追加', other: '項目を追加')}"; + + static String m5(storageAmount, endDate) => + "あなたの ${storageAmount} アドオンは ${endDate} まで有効です"; + + static String m6(count) => + "${Intl.plural(count, zero: 'ビューアーを追加', one: 'ビューアーを追加', other: 'ビューアーを追加')}"; + + static String m7(emailOrName) => "${emailOrName} が追加"; + + static String m8(albumName) => "${albumName} に追加しました"; + + static String m9(count) => + "${Intl.plural(count, zero: '参加者なし', one: '1 参加者', other: '${count} 参加者')}"; + + static String m10(versionValue) => "バージョン: ${versionValue}"; + + static String m11(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} 無料"; + + static String m12(paymentProvider) => + "まず${paymentProvider} から既存のサブスクリプションをキャンセルしてください"; + + static String m13(user) => + "${user} は写真をアルバムに追加できなくなります\n\n※${user} が追加した写真は今後も${user} が削除できます"; + + static String m14(isFamilyMember, storageAmountInGb) => + "${Intl.select(isFamilyMember, { + 'true': '家族は ${storageAmountInGb} GB 受け取っています', + 'false': 'あなたは ${storageAmountInGb} GB 受け取っています', + 'other': 'あなたは ${storageAmountInGb} GB受け取っています', + })}"; + + static String m15(albumName) => "${albumName} のコラボレーションリンクを生成しました"; + + static String m16(familyAdminEmail) => + "サブスクリプションを管理するには、 ${familyAdminEmail} に連絡してください"; + + static String m17(provider) => + "${provider} サブスクリプションを管理するには、support@ente.io までご連絡ください。"; + + static String m18(endpoint) => "${endpoint} に接続しました"; + + static String m19(count) => + "${Intl.plural(count, one: '${count} 個の項目を削除', other: '${count} 個の項目を削除')}"; + + static String m20(currentlyDeleting, totalCount) => + "${currentlyDeleting} / ${totalCount} を削除中"; + + static String m21(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; + + static String m22(supportEmail) => + "あなたの登録したメールアドレスから${supportEmail} にメールを送ってください"; + + static String m23(count, storageSaved) => + "お掃除しました ${Intl.plural(count, one: '${count} 個の重複ファイル', other: '${count} 個の重複ファイル')}, (${storageSaved}が開放されます!)"; + + static String m24(count, formattedSize) => + "${count} 個のファイル、それぞれ${formattedSize}"; + + static String m25(newEmail) => "メールアドレスが ${newEmail} に変更されました"; + + static String m26(email) => + "${email} はEnteアカウントを持っていません。\n\n写真を共有するために「招待」を送信してください。"; + + static String m27(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; + + static String m28(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} ファイル')} が安全にバックアップされました"; + + static String m29(storageAmountInGB) => + "誰かが有料プランにサインアップしてコードを適用する度に ${storageAmountInGB} GB"; + + static String m30(endDate) => "無料トライアルは${endDate} までです"; + + static String m31(count) => + "あなたが有効なサブスクリプションを持っている限りEnte上の ${Intl.plural(count, other: 'それらに')} アクセスできます"; + + static String m32(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; + + static String m33(count, formattedSize) => + "${Intl.plural(count, other: 'デバイスから削除して${formattedSize} 解放することができます')}"; + + static String m34(currentlyProcessing, totalCount) => + "${currentlyProcessing} / ${totalCount} を処理中"; + + static String m35(count) => + "{count, plural, one{{${count} アイテム} other {${count} アイテム}}"; + + static String m36(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; + + static String m0(count, formattedCount) => + "${Intl.plural(count, zero: '思い出なし', one: '${formattedCount} 思い出', other: '${formattedCount} 思い出')}"; + + static String m37(count) => + "${Intl.plural(count, one: '項目を移動', other: '項目を移動')}"; + + static String m38(albumName) => "${albumName} に移動しました"; + + static String m39(name) => "${name} ではありませんか?"; + + static String m40(familyAdminEmail) => + "コードを変更するには、 ${familyAdminEmail} までご連絡ください。"; + + static String m41(passwordStrengthValue) => + "パスワードの長さ: ${passwordStrengthValue}"; + + static String m42(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; + + static String m43(endDate) => + "${endDate} まで無料トライアルが有効です。\nその後、有料プランを選択することができます。"; + + static String m44(toEmail) => "${toEmail} にメールでご連絡ください"; + + static String m45(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; + + static String m46(storeName) => "${storeName} で評価"; + + static String m47(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; + + static String m48(userEmail) => + "${userEmail} はこの共有アルバムから退出します\n\n${userEmail} が追加した写真もアルバムから削除されます"; + + static String m49(endDate) => "サブスクリプションは ${endDate} に更新します"; + + static String m50(count) => + "${Intl.plural(count, one: '${count} 個の結果', other: '${count} 個の結果')}"; + + static String m1(count) => "${count} 個を選択"; + + static String m51(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; + + static String m52(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; + + static String m2(verificationID) => + "これがあなたのente.io確認用IDであることを確認できますか? ${verificationID}"; + + static String m53(referralCode, referralStorageInGB) => + "リフェラルコード: ${referralCode}\n\n設定→一般→リフェラルで使うことで${referralStorageInGB}が無料になります(あなたが有料プランに加入したあと)。\n\nhttps://ente.io"; + + static String m54(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: '誰かと共有しましょう', one: '1人と共有されています', other: '${numberOfPeople} 人と共有されています')}"; + + static String m55(emailIDs) => "${emailIDs} と共有中"; + + static String m56(fileType) => "${fileType} はEnteから削除されます。"; + + static String m57(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + + static String m58(fileType) => "${fileType} はEnteから削除されます。"; + + static String m59(storageAmountInGB) => "${storageAmountInGB} GB"; + + static String m60( + usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => + "${usedAmount} ${usedStorageUnit} の ${totalAmount} ${totalStorageUnit} が使用されました"; + + static String m61(id) => + "あなたの ${id} はすでに別のEnteアカウントにリンクされています。\nこのアカウントであなたの ${id} を使用したい場合は、サポートにお問い合わせください。"; + + static String m62(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; + + static String m63(completed, total) => "${completed}/${total} のメモリが保存されました"; + + static String m64(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; + + static String m65(email) => "これは ${email} の確認用ID"; + + static String m66(count) => + "${Intl.plural(count, zero: '', one: '1日', other: '${count} 日')}"; + + static String m67(count) => "${count} メモリを保存しています..."; + + static String m68(endDate) => "${endDate} まで"; + + static String m69(email) => "${email} を確認"; + + static String m70(email) => "${email}にメールを送りました"; + + static String m71(count) => + "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; + + static String m72(storageSaved) => "${storageSaved} を解放しました"; + final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "aNewVersionOfEnteIsAvailable": + MessageLookupByLibrary.simpleMessage("Enteの新しいバージョンが利用可能です。"), + "about": MessageLookupByLibrary.simpleMessage("このアプリについて"), + "account": MessageLookupByLibrary.simpleMessage("アカウント"), + "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("おかえりなさい!"), + "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( + "もしパスワードを忘れたら、自身のデータを失うことを理解しました"), + "activeSessions": MessageLookupByLibrary.simpleMessage("アクティブなセッション"), + "addAName": MessageLookupByLibrary.simpleMessage("名前を追加"), + "addANewEmail": MessageLookupByLibrary.simpleMessage("新しいEメールアドレスを追加"), + "addCollaborator": MessageLookupByLibrary.simpleMessage("コラボレーターを追加"), + "addCollaborators": m3, + "addFromDevice": MessageLookupByLibrary.simpleMessage("デバイスから追加"), + "addItem": m4, + "addLocation": MessageLookupByLibrary.simpleMessage("位置情報を追加"), + "addLocationButton": MessageLookupByLibrary.simpleMessage("追加"), + "addMore": MessageLookupByLibrary.simpleMessage("さらに追加"), + "addNew": MessageLookupByLibrary.simpleMessage("新規追加"), + "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("アドオンの詳細"), + "addOnValidTill": m5, + "addOns": MessageLookupByLibrary.simpleMessage("アドオン"), + "addPhotos": MessageLookupByLibrary.simpleMessage("写真を追加"), + "addSelected": MessageLookupByLibrary.simpleMessage("追加選択"), + "addToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに追加"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Enteに追加"), + "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("非表示アルバムに追加"), + "addViewer": MessageLookupByLibrary.simpleMessage("ビューアーを追加"), + "addViewers": m6, + "addYourPhotosNow": MessageLookupByLibrary.simpleMessage("写真を今すぐ追加する"), + "addedAs": MessageLookupByLibrary.simpleMessage("追加:"), + "addedBy": m7, + "addedSuccessfullyTo": m8, + "addingToFavorites": + MessageLookupByLibrary.simpleMessage("お気に入りに追加しています..."), + "advanced": MessageLookupByLibrary.simpleMessage("詳細"), + "advancedSettings": MessageLookupByLibrary.simpleMessage("高度な設定"), + "after1Day": MessageLookupByLibrary.simpleMessage("1日後"), + "after1Hour": MessageLookupByLibrary.simpleMessage("1時間後"), + "after1Month": MessageLookupByLibrary.simpleMessage("1ヶ月後"), + "after1Week": MessageLookupByLibrary.simpleMessage("1週間後"), + "after1Year": MessageLookupByLibrary.simpleMessage("1年後"), + "albumOwner": MessageLookupByLibrary.simpleMessage("所有者"), + "albumParticipantsCount": m9, + "albumTitle": MessageLookupByLibrary.simpleMessage("アルバムタイトル"), + "albumUpdated": MessageLookupByLibrary.simpleMessage("アルバムが更新されました"), + "albums": MessageLookupByLibrary.simpleMessage("アルバム"), + "allClear": MessageLookupByLibrary.simpleMessage("✨ オールクリア"), + "allMemoriesPreserved": + MessageLookupByLibrary.simpleMessage("すべての思い出が保存されました"), + "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( + "リンクを持つ人が共有アルバムに写真を追加できるようにします。"), + "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("写真の追加を許可"), + "allowDownloads": MessageLookupByLibrary.simpleMessage("ダウンロードを許可"), + "allowPeopleToAddPhotos": + MessageLookupByLibrary.simpleMessage("写真の追加をメンバーに許可する"), + "androidBiometricHint": MessageLookupByLibrary.simpleMessage("本人確認を行う"), + "androidBiometricNotRecognized": + MessageLookupByLibrary.simpleMessage("認識できません。再試行してください。"), + "androidBiometricRequiredTitle": + MessageLookupByLibrary.simpleMessage("生体認証が必要です"), + "androidBiometricSuccess": MessageLookupByLibrary.simpleMessage("成功"), + "androidCancelButton": MessageLookupByLibrary.simpleMessage("キャンセル"), + "androidDeviceCredentialsRequiredTitle": + MessageLookupByLibrary.simpleMessage("デバイスの認証情報が必要です"), + "androidDeviceCredentialsSetupDescription": + MessageLookupByLibrary.simpleMessage("デバイスの認証情報が必要です"), + "androidGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( + "生体認証がデバイスで設定されていません。生体認証を追加するには、\"設定 > セキュリティ\"を開いてください。"), + "androidIosWebDesktop": + MessageLookupByLibrary.simpleMessage("Android、iOS、Web、Desktop"), + "androidSignInTitle": MessageLookupByLibrary.simpleMessage("認証が必要です"), + "appLock": MessageLookupByLibrary.simpleMessage("アプリのロック"), + "appLockDescriptions": MessageLookupByLibrary.simpleMessage( + "デバイスのデフォルトのロック画面と、カスタムロック画面を選択します。"), + "appVersion": m10, + "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), + "apply": MessageLookupByLibrary.simpleMessage("適用"), + "applyCodeTitle": MessageLookupByLibrary.simpleMessage("コードを適用"), + "appstoreSubscription": + MessageLookupByLibrary.simpleMessage("AppStore サブスクリプション"), + "archive": MessageLookupByLibrary.simpleMessage("アーカイブする"), + "archiveAlbum": MessageLookupByLibrary.simpleMessage("アルバムをアーカイブ"), + "archiving": MessageLookupByLibrary.simpleMessage("アーカイブ中です"), + "areYouSureThatYouWantToLeaveTheFamily": + MessageLookupByLibrary.simpleMessage("本当にファミリープランを退会しますか?"), + "areYouSureYouWantToCancel": + MessageLookupByLibrary.simpleMessage("キャンセルしてもよろしいですか?"), + "areYouSureYouWantToChangeYourPlan": + MessageLookupByLibrary.simpleMessage("プランを変更して良いですか?"), + "areYouSureYouWantToExit": + MessageLookupByLibrary.simpleMessage("本当に中止してよろしいですか?"), + "areYouSureYouWantToLogout": + MessageLookupByLibrary.simpleMessage("本当にログアウトしてよろしいですか?"), + "areYouSureYouWantToRenew": + MessageLookupByLibrary.simpleMessage("更新してもよろしいですか?"), + "askCancelReason": MessageLookupByLibrary.simpleMessage( + "サブスクリプションはキャンセルされました。理由を教えていただけますか?"), + "askDeleteReason": + MessageLookupByLibrary.simpleMessage("アカウントを削除する理由を教えて下さい"), + "askYourLovedOnesToShare": + MessageLookupByLibrary.simpleMessage("あなたの愛する人にシェアしてもらうように頼んでください"), + "atAFalloutShelter": MessageLookupByLibrary.simpleMessage("核シェルターで"), + "authToChangeEmailVerificationSetting": + MessageLookupByLibrary.simpleMessage("メール確認を変更するには認証してください"), + "authToChangeLockscreenSetting": + MessageLookupByLibrary.simpleMessage("画面のロックの設定を変更するためには認証が必要です"), + "authToChangeYourEmail": + MessageLookupByLibrary.simpleMessage("メールアドレスを変更するには認証してください"), + "authToChangeYourPassword": + MessageLookupByLibrary.simpleMessage("メールアドレスを変更するには認証してください"), + "authToConfigureTwofactorAuthentication": + MessageLookupByLibrary.simpleMessage("2段階認証を設定するには認証してください"), + "authToInitiateAccountDeletion": + MessageLookupByLibrary.simpleMessage("アカウントの削除をするためには認証が必要です"), + "authToViewPasskey": + MessageLookupByLibrary.simpleMessage("パスキーを表示するには認証してください"), + "authToViewYourActiveSessions": + MessageLookupByLibrary.simpleMessage("アクティブなセッションを表示するためには認証が必要です"), + "authToViewYourHiddenFiles": + MessageLookupByLibrary.simpleMessage("隠しファイルを表示するには認証してください"), + "authToViewYourMemories": + MessageLookupByLibrary.simpleMessage("思い出を閲覧するためには認証が必要です"), + "authToViewYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリーキーを表示するためには認証が必要です"), + "authenticating": MessageLookupByLibrary.simpleMessage("認証中..."), + "authenticationFailedPleaseTryAgain": + MessageLookupByLibrary.simpleMessage("認証が間違っています。もう一度お試しください"), + "authenticationSuccessful": + MessageLookupByLibrary.simpleMessage("認証に成功しました!"), + "autoCastDialogBody": + MessageLookupByLibrary.simpleMessage("利用可能なキャストデバイスが表示されます。"), + "autoCastiOSPermission": MessageLookupByLibrary.simpleMessage( + "ローカルネットワークへのアクセス許可がEnte Photosアプリに与えられているか確認してください"), + "autoLock": MessageLookupByLibrary.simpleMessage("自動ロック"), + "autoLockFeatureDescription": + MessageLookupByLibrary.simpleMessage("アプリがバックグラウンドでロックするまでの時間"), + "autoLogoutMessage": MessageLookupByLibrary.simpleMessage( + "技術的な不具合により、ログアウトしました。ご不便をおかけして申し訳ございません。"), + "autoPair": MessageLookupByLibrary.simpleMessage("オートペアリング"), + "autoPairDesc": MessageLookupByLibrary.simpleMessage( + "自動ペアリングは Chromecast に対応しているデバイスでのみ動作します。"), + "available": MessageLookupByLibrary.simpleMessage("ご利用可能"), + "availableStorageSpace": m11, + "backedUpFolders": + MessageLookupByLibrary.simpleMessage("バックアップされたフォルダ"), + "backup": MessageLookupByLibrary.simpleMessage("バックアップ"), + "backupFailed": MessageLookupByLibrary.simpleMessage("バックアップ失敗"), + "backupOverMobileData": + MessageLookupByLibrary.simpleMessage("モバイルデータを使ってバックアップ"), + "backupSettings": MessageLookupByLibrary.simpleMessage("バックアップ設定"), + "backupStatus": MessageLookupByLibrary.simpleMessage("バックアップの状態"), + "backupStatusDescription": + MessageLookupByLibrary.simpleMessage("バックアップされたアイテムがここに表示されます"), + "backupVideos": MessageLookupByLibrary.simpleMessage("動画をバックアップ"), + "blackFridaySale": MessageLookupByLibrary.simpleMessage("ブラックフライデーセール"), + "blog": MessageLookupByLibrary.simpleMessage("ブログ"), + "cachedData": MessageLookupByLibrary.simpleMessage("キャッシュデータ"), + "calculating": MessageLookupByLibrary.simpleMessage("計算中..."), + "canNotUploadToAlbumsOwnedByOthers": + MessageLookupByLibrary.simpleMessage("他の人が作ったアルバムにはアップロードできません"), + "canOnlyCreateLinkForFilesOwnedByYou": + MessageLookupByLibrary.simpleMessage("あなたが所有するファイルのみリンクを作成できます"), + "canOnlyRemoveFilesOwnedByYou": + MessageLookupByLibrary.simpleMessage("あなたが所有しているファイルのみを削除できます"), + "cancel": MessageLookupByLibrary.simpleMessage("キャンセル"), + "cancelOtherSubscription": m12, + "cancelSubscription": + MessageLookupByLibrary.simpleMessage("サブスクリプションをキャンセル"), + "cannotAddMorePhotosAfterBecomingViewer": m13, + "cannotDeleteSharedFiles": + MessageLookupByLibrary.simpleMessage("共有ファイルは削除できません"), + "castIPMismatchBody": + MessageLookupByLibrary.simpleMessage("TVと同じネットワーク上にいることを確認してください。"), + "castIPMismatchTitle": + MessageLookupByLibrary.simpleMessage("アルバムのキャストに失敗しました"), + "castInstruction": MessageLookupByLibrary.simpleMessage( + "ペアリングしたいデバイスでcast.ente.ioにアクセスしてください。\n\nテレビでアルバムを再生するには以下のコードを入力してください。"), + "centerPoint": MessageLookupByLibrary.simpleMessage("中心点"), + "change": MessageLookupByLibrary.simpleMessage("変更"), + "changeEmail": MessageLookupByLibrary.simpleMessage("Eメールを変更"), + "changeLocationOfSelectedItems": + MessageLookupByLibrary.simpleMessage("選択したアイテムの位置を変更しますか?"), + "changePassword": MessageLookupByLibrary.simpleMessage("パスワードを変更"), + "changePasswordTitle": MessageLookupByLibrary.simpleMessage("パスワードを変更"), + "changePermissions": MessageLookupByLibrary.simpleMessage("権限を変更する"), + "changeYourReferralCode": + MessageLookupByLibrary.simpleMessage("自分自身の紹介コードを変更する"), + "checkForUpdates": MessageLookupByLibrary.simpleMessage("アップデートを確認"), + "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( + "メールボックスを確認してEメールの所有を証明してください(見つからない場合は、スパムの中も確認してください)"), + "checkStatus": MessageLookupByLibrary.simpleMessage("ステータスの確認"), + "checking": MessageLookupByLibrary.simpleMessage("確認中…"), + "claimFreeStorage": + MessageLookupByLibrary.simpleMessage("無料のストレージを受け取る"), + "claimMore": MessageLookupByLibrary.simpleMessage("もっと!"), + "claimed": MessageLookupByLibrary.simpleMessage("受け取り済"), + "claimedStorageSoFar": m14, + "cleanUncategorized": + MessageLookupByLibrary.simpleMessage("未分類のクリーンアップ"), + "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( + "他のアルバムに存在する「未分類」からすべてのファイルを削除"), + "clearCaches": MessageLookupByLibrary.simpleMessage("キャッシュをクリア"), + "clearIndexes": MessageLookupByLibrary.simpleMessage("行った処理をクリアする"), + "click": MessageLookupByLibrary.simpleMessage("• クリック"), + "clickOnTheOverflowMenu": + MessageLookupByLibrary.simpleMessage("• 三点ドットをクリックしてください"), + "close": MessageLookupByLibrary.simpleMessage("閉じる"), + "clubByCaptureTime": MessageLookupByLibrary.simpleMessage("時間ごとにまとめる"), + "clubByFileName": MessageLookupByLibrary.simpleMessage("ファイル名ごとにまとめる"), + "clusteringProgress": + MessageLookupByLibrary.simpleMessage("クラスタリングの進行状況"), + "codeAppliedPageTitle": + MessageLookupByLibrary.simpleMessage("コードが適用されました。"), + "codeChangeLimitReached": + MessageLookupByLibrary.simpleMessage("コード変更の回数上限に達しました。"), + "codeCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("コードがクリップボードにコピーされました"), + "codeUsedByYou": MessageLookupByLibrary.simpleMessage("あなたが使用したコード"), + "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( + "Enteアプリやアカウントを必要とせずに、共有アルバムに写真を追加したり表示したりできるリンクを作成します。"), + "collaborativeLink": MessageLookupByLibrary.simpleMessage("共同作業リンク"), + "collaborativeLinkCreatedFor": m15, + "collaborator": MessageLookupByLibrary.simpleMessage("コラボレーター"), + "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": + MessageLookupByLibrary.simpleMessage( + "コラボレーターは共有アルバムに写真やビデオを追加できます。"), + "collageLayout": MessageLookupByLibrary.simpleMessage("レイアウト"), + "collageSaved": + MessageLookupByLibrary.simpleMessage("コラージュをギャラリーに保存しました"), + "collectEventPhotos": + MessageLookupByLibrary.simpleMessage("イベントの写真を収集する"), + "collectPhotos": MessageLookupByLibrary.simpleMessage("写真を集める"), + "color": MessageLookupByLibrary.simpleMessage("色"), + "confirm": MessageLookupByLibrary.simpleMessage("確認"), + "confirm2FADisable": + MessageLookupByLibrary.simpleMessage("2 要素認証を無効にしてよろしいですか。"), + "confirmAccountDeletion": + MessageLookupByLibrary.simpleMessage("アカウント削除の確認"), + "confirmDeletePrompt": + MessageLookupByLibrary.simpleMessage("はい、アカウントとすべてのアプリのデータを削除します"), + "confirmPassword": MessageLookupByLibrary.simpleMessage("パスワードを確認"), + "confirmPlanChange": MessageLookupByLibrary.simpleMessage("プランの変更を確認"), + "confirmRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリーキーを確認"), + "confirmYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリーキーを確認"), + "connectToDevice": MessageLookupByLibrary.simpleMessage("デバイスに接続"), + "contactFamilyAdmin": m16, + "contactSupport": MessageLookupByLibrary.simpleMessage("お問い合わせ"), + "contactToManageSubscription": m17, + "contacts": MessageLookupByLibrary.simpleMessage("連絡先"), + "contents": MessageLookupByLibrary.simpleMessage("内容"), + "continueLabel": MessageLookupByLibrary.simpleMessage("つづける"), + "continueOnFreeTrial": + MessageLookupByLibrary.simpleMessage("無料トライアルで続ける"), + "convertToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに変換"), + "copyEmailAddress": MessageLookupByLibrary.simpleMessage("メールアドレスをコピー"), + "copyLink": MessageLookupByLibrary.simpleMessage("リンクをコピー"), + "copypasteThisCodentoYourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage("認証アプリにこのコードをコピペしてください"), + "couldNotBackUpTryLater": MessageLookupByLibrary.simpleMessage( + "データをバックアップできませんでした。\n後で再試行します。"), + "couldNotFreeUpSpace": + MessageLookupByLibrary.simpleMessage("スペースを解放できませんでした"), + "couldNotUpdateSubscription": + MessageLookupByLibrary.simpleMessage("サブスクリプションを更新できませんでした"), + "count": MessageLookupByLibrary.simpleMessage("カウント"), + "crashReporting": MessageLookupByLibrary.simpleMessage("クラッシュを報告"), + "create": MessageLookupByLibrary.simpleMessage("作成"), + "createAccount": MessageLookupByLibrary.simpleMessage("アカウント作成"), + "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( + "長押しで写真を選択し、+をクリックしてアルバムを作成します"), + "createCollaborativeLink": + MessageLookupByLibrary.simpleMessage("共同作業用リンクを作成"), + "createCollage": MessageLookupByLibrary.simpleMessage("コラージュを作る"), + "createNewAccount": MessageLookupByLibrary.simpleMessage("新規アカウントを作成"), + "createOrSelectAlbum": + MessageLookupByLibrary.simpleMessage("アルバムを作成または選択"), + "createPublicLink": MessageLookupByLibrary.simpleMessage("公開リンクを作成"), + "creatingLink": MessageLookupByLibrary.simpleMessage("リンクを作成中..."), + "criticalUpdateAvailable": + MessageLookupByLibrary.simpleMessage("重要なアップデートがあります"), + "crop": MessageLookupByLibrary.simpleMessage("クロップ"), + "currentUsageIs": MessageLookupByLibrary.simpleMessage("現在の使用状況 "), + "custom": MessageLookupByLibrary.simpleMessage("カスタム"), + "customEndpoint": m18, + "darkTheme": MessageLookupByLibrary.simpleMessage("ダーク"), + "dayToday": MessageLookupByLibrary.simpleMessage("今日"), + "dayYesterday": MessageLookupByLibrary.simpleMessage("昨日"), + "decrypting": MessageLookupByLibrary.simpleMessage("復号しています"), + "decryptingVideo": MessageLookupByLibrary.simpleMessage("ビデオの復号化中..."), + "deduplicateFiles": MessageLookupByLibrary.simpleMessage("重複ファイル"), + "delete": MessageLookupByLibrary.simpleMessage("削除"), + "deleteAccount": MessageLookupByLibrary.simpleMessage("アカウントを削除"), + "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( + "今までご利用ありがとうございました。改善点があれば、フィードバックをお寄せください"), + "deleteAccountPermanentlyButton": + MessageLookupByLibrary.simpleMessage("アカウントの削除"), + "deleteAlbum": MessageLookupByLibrary.simpleMessage("アルバムの削除"), + "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( + "このアルバムに含まれている写真 (およびビデオ) を すべて 他のアルバムからも削除しますか?"), + "deleteAlbumsDialogBody": + MessageLookupByLibrary.simpleMessage("空のアルバムはすべて削除されます。"), + "deleteAll": MessageLookupByLibrary.simpleMessage("全て削除"), + "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( + "このアカウントは他のEnteアプリも使用している場合はそれらにも紐づけされています。\nすべてのEnteアプリでアップロードされたデータは削除され、アカウントは完全に削除されます。"), + "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( + "account-deletion@ente.ioにあなたの登録したメールアドレスからメールを送信してください"), + "deleteEmptyAlbums": MessageLookupByLibrary.simpleMessage("空のアルバムを削除"), + "deleteEmptyAlbumsWithQuestionMark": + MessageLookupByLibrary.simpleMessage("空のアルバムを削除しますか?"), + "deleteFromBoth": MessageLookupByLibrary.simpleMessage("Enteから削除"), + "deleteFromDevice": MessageLookupByLibrary.simpleMessage("デバイスから削除"), + "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Enteから削除"), + "deleteItemCount": m19, + "deleteLocation": MessageLookupByLibrary.simpleMessage("位置情報を削除"), + "deletePhotos": MessageLookupByLibrary.simpleMessage("写真を削除"), + "deleteProgress": m20, + "deleteReason1": MessageLookupByLibrary.simpleMessage("いちばん必要な機能がない"), + "deleteReason2": + MessageLookupByLibrary.simpleMessage("アプリや特定の機能が想定通りに動かない"), + "deleteReason3": MessageLookupByLibrary.simpleMessage("より良いサービスを見つけた"), + "deleteReason4": MessageLookupByLibrary.simpleMessage("該当する理由がない"), + "deleteRequestSLAText": + MessageLookupByLibrary.simpleMessage("リクエストは72時間以内に処理されます"), + "deleteSharedAlbum": + MessageLookupByLibrary.simpleMessage("共有アルバムを削除しますか?"), + "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( + "このアルバムは他の人からも削除されます\n\n他の人が共有してくれた写真も、あなたからは見れなくなります"), + "descriptions": MessageLookupByLibrary.simpleMessage("説明文"), + "deselectAll": MessageLookupByLibrary.simpleMessage("選択解除"), + "designedToOutlive": + MessageLookupByLibrary.simpleMessage("生き延びるためのデザイン"), + "details": MessageLookupByLibrary.simpleMessage("詳細"), + "developerSettings": MessageLookupByLibrary.simpleMessage("開発者向け設定"), + "developerSettingsWarning": + MessageLookupByLibrary.simpleMessage("開発者向け設定を変更してもよろしいですか?"), + "deviceCodeHint": MessageLookupByLibrary.simpleMessage("コードを入力する"), + "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( + "このデバイス上アルバムに追加されたファイルは自動的にEnteにアップロードされます。"), + "deviceLock": MessageLookupByLibrary.simpleMessage("デバイスロック"), + "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( + "進行中のバックアップ中、デバイスがスリープしないようにする。\n\n※容量の大きいアップロードに役立ちます。"), + "deviceNotFound": MessageLookupByLibrary.simpleMessage("デバイスが見つかりません"), + "didYouKnow": MessageLookupByLibrary.simpleMessage("ご存知ですか?"), + "disableAutoLock": MessageLookupByLibrary.simpleMessage("自動ロックを無効にする"), + "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( + "ビューアーはスクリーンショットを撮ったり、外部ツールを使用して写真のコピーを保存したりすることができます"), + "disableDownloadWarningTitle": + MessageLookupByLibrary.simpleMessage("ご注意ください"), + "disableLinkMessage": m21, + "disableTwofactor": MessageLookupByLibrary.simpleMessage("2段階認証を無効にする"), + "disablingTwofactorAuthentication": + MessageLookupByLibrary.simpleMessage("2要素認証を無効にしています..."), + "discord": MessageLookupByLibrary.simpleMessage("Discord"), + "dismiss": MessageLookupByLibrary.simpleMessage("閉じる"), + "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("km"), + "doNotSignOut": MessageLookupByLibrary.simpleMessage("サインアウトしない"), + "doThisLater": MessageLookupByLibrary.simpleMessage("あとで行う"), + "doYouWantToDiscardTheEditsYouHaveMade": + MessageLookupByLibrary.simpleMessage("編集を破棄しますか?"), + "done": MessageLookupByLibrary.simpleMessage("完了"), + "doubleYourStorage": + MessageLookupByLibrary.simpleMessage("ストレージを倍にしましょう"), + "download": MessageLookupByLibrary.simpleMessage("ダウンロード"), + "downloadFailed": MessageLookupByLibrary.simpleMessage("ダウンロード失敗"), + "downloading": MessageLookupByLibrary.simpleMessage("ダウンロード中…"), + "dropSupportEmail": m22, + "duplicateFileCountWithStorageSaved": m23, + "duplicateItemsGroup": m24, + "edit": MessageLookupByLibrary.simpleMessage("編集"), + "editLocation": MessageLookupByLibrary.simpleMessage("位置情報を編集"), + "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("位置情報を編集"), + "editsSaved": MessageLookupByLibrary.simpleMessage("編集が保存されました"), + "editsToLocationWillOnlyBeSeenWithinEnte": + MessageLookupByLibrary.simpleMessage("位置情報の編集はEnteでのみ表示されます"), + "eligible": MessageLookupByLibrary.simpleMessage("対象となる"), + "email": MessageLookupByLibrary.simpleMessage("Eメール"), + "emailChangedTo": m25, + "emailNoEnteAccount": m26, + "emailVerificationToggle": + MessageLookupByLibrary.simpleMessage("メール確認"), + "emailYourLogs": MessageLookupByLibrary.simpleMessage("ログをメールで送信"), + "empty": MessageLookupByLibrary.simpleMessage("空"), + "emptyTrash": MessageLookupByLibrary.simpleMessage("ゴミ箱を空にしますか?"), + "enable": MessageLookupByLibrary.simpleMessage("有効化"), + "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( + "Enteは顔認識、マジック検索、その他の高度な検索機能のため、あなたのデバイス上で機械学習をしています"), + "enableMaps": MessageLookupByLibrary.simpleMessage("マップを有効にする"), + "enableMapsDesc": MessageLookupByLibrary.simpleMessage( + "これは世界地図上にあなたの写真を表示します。\n\n地図はOpenStreetMapを利用しており、あなたの写真のいち情報が共有されることはありません。\n\nこの機能は設定から無効にすることができます"), + "enabled": MessageLookupByLibrary.simpleMessage("有効"), + "encryptingBackup": + MessageLookupByLibrary.simpleMessage("バックアップを暗号化中..."), + "encryption": MessageLookupByLibrary.simpleMessage("暗号化"), + "encryptionKeys": MessageLookupByLibrary.simpleMessage("暗号化の鍵"), + "endpointUpdatedMessage": + MessageLookupByLibrary.simpleMessage("エンドポイントの更新に成功しました"), + "endtoendEncryptedByDefault": + MessageLookupByLibrary.simpleMessage("デフォルトで端末間で暗号化されています"), + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": + MessageLookupByLibrary.simpleMessage( + "大切に保管します、Enteにファイルへのアクセスを許可してください"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "写真を大切にバックアップするために許可が必要です"), + "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( + "Enteはあなたの思い出を保存します。デバイスを紛失しても、オンラインでアクセス可能です"), + "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( + "あなたの家族もあなたの有料プランに参加することができます。"), + "enterAlbumName": MessageLookupByLibrary.simpleMessage("アルバム名を入力"), + "enterCode": MessageLookupByLibrary.simpleMessage("コードを入力"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "もらったコードを入力して、無料のストレージを入手してください"), + "enterEmail": MessageLookupByLibrary.simpleMessage("Eメールアドレスを入力してください"), + "enterFileName": MessageLookupByLibrary.simpleMessage("ファイル名を入力してください"), + "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "あなたのデータを暗号化するための新しいパスワードを入力してください"), + "enterPassword": MessageLookupByLibrary.simpleMessage("パスワードを入力"), + "enterPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( + "あなたのデータを暗号化するためのパスワードを入力してください"), + "enterPersonName": MessageLookupByLibrary.simpleMessage("人名を入力してください"), + "enterPin": MessageLookupByLibrary.simpleMessage("PINを入力してください"), + "enterReferralCode": + MessageLookupByLibrary.simpleMessage("紹介コードを入力してください"), + "enterThe6digitCodeFromnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage( + "認証アプリに表示された 6 桁のコードを入力してください"), + "enterValidEmail": + MessageLookupByLibrary.simpleMessage("有効なEメールアドレスを入力してください"), + "enterYourEmailAddress": + MessageLookupByLibrary.simpleMessage("Eメールアドレスを入力"), + "enterYourPassword": MessageLookupByLibrary.simpleMessage("パスワードを入力"), + "enterYourRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリーキーを入力してください"), + "error": MessageLookupByLibrary.simpleMessage("エラー"), + "everywhere": MessageLookupByLibrary.simpleMessage("どこでも"), + "exif": MessageLookupByLibrary.simpleMessage("EXIF"), + "existingUser": MessageLookupByLibrary.simpleMessage("既存のユーザー"), + "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( + "このリンクは期限切れです。新たな期限を設定するか、期限設定そのものを無くすか、選択してください"), + "exportLogs": MessageLookupByLibrary.simpleMessage("ログのエクスポート"), + "exportYourData": MessageLookupByLibrary.simpleMessage("データをエクスポート"), + "faceRecognition": MessageLookupByLibrary.simpleMessage("顔認識"), + "faces": MessageLookupByLibrary.simpleMessage("顔"), + "failedToApplyCode": + MessageLookupByLibrary.simpleMessage("コードを適用できませんでした"), + "failedToCancel": MessageLookupByLibrary.simpleMessage("キャンセルに失敗しました"), + "failedToDownloadVideo": + MessageLookupByLibrary.simpleMessage("ビデオをダウンロードできませんでした"), + "failedToFetchOriginalForEdit": + MessageLookupByLibrary.simpleMessage("編集前の状態の取得に失敗しました"), + "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( + "紹介の詳細を取得できません。後でもう一度お試しください。"), + "failedToLoadAlbums": + MessageLookupByLibrary.simpleMessage("アルバムの読み込みに失敗しました"), + "failedToRenew": MessageLookupByLibrary.simpleMessage("更新に失敗しました"), + "failedToVerifyPaymentStatus": + MessageLookupByLibrary.simpleMessage("支払ステータスの確認に失敗しました"), + "familyPlanOverview": MessageLookupByLibrary.simpleMessage( + "5人までの家族をファミリープランに追加しましょう(追加料金無し)\n\n一人ひとりがプライベートなストレージを持ち、共有されない限りお互いに見ることはありません。\n\nファミリープランはEnteサブスクリプションに登録した人が利用できます。\n\nさっそく登録しましょう!"), + "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("ファミリー"), + "familyPlans": MessageLookupByLibrary.simpleMessage("ファミリープラン"), + "faq": MessageLookupByLibrary.simpleMessage("よくある質問"), + "faqs": MessageLookupByLibrary.simpleMessage("よくある質問"), + "favorite": MessageLookupByLibrary.simpleMessage("お気に入り"), + "feedback": MessageLookupByLibrary.simpleMessage("フィードバック"), + "fileFailedToSaveToGallery": + MessageLookupByLibrary.simpleMessage("ギャラリーへの保存に失敗しました"), + "fileInfoAddDescHint": MessageLookupByLibrary.simpleMessage("説明を追加..."), + "fileSavedToGallery": + MessageLookupByLibrary.simpleMessage("ファイルをギャラリーに保存しました"), + "fileTypes": MessageLookupByLibrary.simpleMessage("ファイルの種類"), + "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("ファイルの種類と名前"), + "filesBackedUpFromDevice": m27, + "filesBackedUpInAlbum": m28, + "filesDeleted": MessageLookupByLibrary.simpleMessage("削除されたファイル"), + "filesSavedToGallery": + MessageLookupByLibrary.simpleMessage("ギャラリーに保存されたファイル"), + "findPeopleByName": MessageLookupByLibrary.simpleMessage("名前で人を探す"), + "flip": MessageLookupByLibrary.simpleMessage("反転"), + "forYourMemories": MessageLookupByLibrary.simpleMessage("思い出の為に"), + "forgotPassword": MessageLookupByLibrary.simpleMessage("パスワードを忘れた"), + "foundFaces": MessageLookupByLibrary.simpleMessage("見つかった顔"), + "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("空き容量を受け取る"), + "freeStorageOnReferralSuccess": m29, + "freeStorageUsable": + MessageLookupByLibrary.simpleMessage("無料のストレージが利用可能です"), + "freeTrial": MessageLookupByLibrary.simpleMessage("無料トライアル"), + "freeTrialValidTill": m30, + "freeUpAccessPostDelete": m31, + "freeUpAmount": m32, + "freeUpDeviceSpace": + MessageLookupByLibrary.simpleMessage("デバイスの空き領域を解放する"), + "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( + "すでにバックアップされているファイルを消去して、デバイスの容量を空けます。"), + "freeUpSpace": MessageLookupByLibrary.simpleMessage("スペースを解放する"), + "freeUpSpaceSaving": m33, + "galleryMemoryLimitInfo": + MessageLookupByLibrary.simpleMessage("ギャラリーに表示されるメモリは最大1000個までです"), + "general": MessageLookupByLibrary.simpleMessage("一般"), + "generatingEncryptionKeys": + MessageLookupByLibrary.simpleMessage("暗号化鍵を生成しています"), + "genericProgress": m34, + "goToSettings": MessageLookupByLibrary.simpleMessage("設定に移動"), + "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), + "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( + "設定アプリで、すべての写真へのアクセスを許可してください"), + "grantPermission": MessageLookupByLibrary.simpleMessage("許可する"), + "groupNearbyPhotos": + MessageLookupByLibrary.simpleMessage("近くの写真をグループ化"), + "guestView": MessageLookupByLibrary.simpleMessage("ゲストビュー"), + "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( + "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。"), + "hearUsExplanation": MessageLookupByLibrary.simpleMessage( + "私たちはアプリのインストールを追跡していませんが、もしよければ、Enteをお知りになった場所を教えてください!"), + "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( + "Ente についてどのようにお聞きになりましたか?(任意)"), + "help": MessageLookupByLibrary.simpleMessage("ヘルプ"), + "hidden": MessageLookupByLibrary.simpleMessage("非表示"), + "hide": MessageLookupByLibrary.simpleMessage("非表示"), + "hideContent": MessageLookupByLibrary.simpleMessage("内容を非表示"), + "hideContentDescriptionAndroid": MessageLookupByLibrary.simpleMessage( + "アプリ画面を非表示にし、スクリーンショットを無効にします"), + "hideContentDescriptionIos": + MessageLookupByLibrary.simpleMessage("アプリ切り替え時に、アプリの画面を非表示にします"), + "hiding": MessageLookupByLibrary.simpleMessage("非表示にしています"), + "hostedAtOsmFrance": + MessageLookupByLibrary.simpleMessage("OSM Franceでホスト"), + "howItWorks": MessageLookupByLibrary.simpleMessage("仕組み"), + "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( + "設定画面でメールアドレスを長押しし、両デバイスのIDが一致していることを確認してください。"), + "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( + "生体認証がデバイスで設定されていません。Touch ID もしくは Face ID を有効にしてください。"), + "iOSLockOut": MessageLookupByLibrary.simpleMessage( + "生体認証が無効化されています。画面をロック・ロック解除して生体認証を有効化してください。"), + "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("無視する"), + "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( + "このアルバムの一部のファイルは、以前にEnteから削除されたため、あえてアップロード時に無視されます"), + "immediately": MessageLookupByLibrary.simpleMessage("すぐに"), + "importing": MessageLookupByLibrary.simpleMessage("インポート中..."), + "incorrectCode": MessageLookupByLibrary.simpleMessage("誤ったコード"), + "incorrectPasswordTitle": + MessageLookupByLibrary.simpleMessage("パスワードが間違っています"), + "incorrectRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリーキーが正しくありません"), + "incorrectRecoveryKeyBody": + MessageLookupByLibrary.simpleMessage("リカバリーキーが間違っています"), + "incorrectRecoveryKeyTitle": + MessageLookupByLibrary.simpleMessage("リカバリーキーの誤り"), + "indexedItems": MessageLookupByLibrary.simpleMessage("処理済みの項目"), + "indexingIsPaused": MessageLookupByLibrary.simpleMessage( + "インデックス作成は一時停止されています。デバイスの準備ができたら自動的に再開します。"), + "insecureDevice": MessageLookupByLibrary.simpleMessage("安全でないデバイス"), + "installManually": MessageLookupByLibrary.simpleMessage("手動でインストール"), + "invalidEmailAddress": + MessageLookupByLibrary.simpleMessage("無効なEメールアドレス"), + "invalidEndpoint": MessageLookupByLibrary.simpleMessage("無効なエンドポイントです"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "入力されたエンドポイントは無効です。有効なエンドポイントを入力して再試行してください。"), + "invalidKey": MessageLookupByLibrary.simpleMessage("無効なキー"), + "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( + "入力されたリカバリーキーが無効です。24 単語が含まれていることを確認し、それぞれのスペルを確認してください。\n\n古い形式のリカバリーコードを入力した場合は、64 文字であることを確認して、それぞれを確認してください。"), + "invite": MessageLookupByLibrary.simpleMessage("招待"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("Enteに招待する"), + "inviteYourFriends": MessageLookupByLibrary.simpleMessage("友達を招待"), + "inviteYourFriendsToEnte": + MessageLookupByLibrary.simpleMessage("友達をEnteに招待する"), + "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": + MessageLookupByLibrary.simpleMessage( + "問題が発生したようです。しばらくしてから再試行してください。エラーが解決しない場合は、サポートチームにお問い合わせください。"), + "itemCount": m35, + "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": + MessageLookupByLibrary.simpleMessage("完全に削除されるまでの日数が項目に表示されます"), + "itemsWillBeRemovedFromAlbum": + MessageLookupByLibrary.simpleMessage("選択したアイテムはこのアルバムから削除されます"), + "joinDiscord": MessageLookupByLibrary.simpleMessage("Discordに参加"), + "keepPhotos": MessageLookupByLibrary.simpleMessage("写真を残す"), + "kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"), + "kindlyHelpUsWithThisInformation": + MessageLookupByLibrary.simpleMessage("よければ、情報をお寄せください"), + "language": MessageLookupByLibrary.simpleMessage("言語"), + "lastUpdated": MessageLookupByLibrary.simpleMessage("最終更新"), + "leave": MessageLookupByLibrary.simpleMessage("離脱"), + "leaveAlbum": MessageLookupByLibrary.simpleMessage("アルバムを抜ける"), + "leaveFamily": MessageLookupByLibrary.simpleMessage("ファミリープランから退会"), + "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage("共有アルバムを抜ける"), + "left": MessageLookupByLibrary.simpleMessage("左"), + "light": MessageLookupByLibrary.simpleMessage("ライト"), + "lightTheme": MessageLookupByLibrary.simpleMessage("ライト"), + "linkCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("リンクをクリップボードにコピーしました"), + "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("デバイスの制限"), + "linkEnabled": MessageLookupByLibrary.simpleMessage("有効"), + "linkExpired": MessageLookupByLibrary.simpleMessage("期限切れ"), + "linkExpiresOn": m36, + "linkExpiry": MessageLookupByLibrary.simpleMessage("リンクの期限切れ"), + "linkHasExpired": MessageLookupByLibrary.simpleMessage("リンクは期限切れです"), + "linkNeverExpires": MessageLookupByLibrary.simpleMessage("絶対になし"), + "livePhotos": MessageLookupByLibrary.simpleMessage("ライブフォト"), + "loadMessage1": + MessageLookupByLibrary.simpleMessage("サブスクリプションを家族と共有できます"), + "loadMessage2": MessageLookupByLibrary.simpleMessage( + "私たちはこれまでに3000万以上の思い出を保存してきました"), + "loadMessage3": MessageLookupByLibrary.simpleMessage( + "私たちはあなたのデータのコピーを3つ保管しています。1つは地下のシェルターにあります。"), + "loadMessage4": + MessageLookupByLibrary.simpleMessage("すべてのアプリはオープンソースです"), + "loadMessage5": + MessageLookupByLibrary.simpleMessage("当社のソースコードと暗号方式は外部から監査されています"), + "loadMessage6": + MessageLookupByLibrary.simpleMessage("アルバムへのリンクを共有できます"), + "loadMessage7": MessageLookupByLibrary.simpleMessage( + "当社のモバイルアプリはバックグラウンドで実行され、新しい写真を暗号化してバックアップします"), + "loadMessage8": + MessageLookupByLibrary.simpleMessage("web.ente.ioにはアップローダーがあります"), + "loadMessage9": MessageLookupByLibrary.simpleMessage( + "Xchacha20Poly1305を使用してデータを安全に暗号化します。"), + "loadingExifData": + MessageLookupByLibrary.simpleMessage("EXIF データを読み込み中..."), + "loadingGallery": + MessageLookupByLibrary.simpleMessage("ギャラリーを読み込み中..."), + "loadingMessage": + MessageLookupByLibrary.simpleMessage("あなたの写真を読み込み中..."), + "loadingModel": MessageLookupByLibrary.simpleMessage("モデルをダウンロード中"), + "localGallery": MessageLookupByLibrary.simpleMessage("デバイス上のギャラリー"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), + "location": MessageLookupByLibrary.simpleMessage("場所"), + "locationName": MessageLookupByLibrary.simpleMessage("場所名"), + "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( + "位置タグは、写真の半径内で撮影されたすべての写真をグループ化します"), + "locations": MessageLookupByLibrary.simpleMessage("場所"), + "lockButtonLabel": MessageLookupByLibrary.simpleMessage("ロック"), + "lockscreen": MessageLookupByLibrary.simpleMessage("画面のロック"), + "logInLabel": MessageLookupByLibrary.simpleMessage("ログイン"), + "loggingOut": MessageLookupByLibrary.simpleMessage("ログアウト中..."), + "loginSessionExpired": MessageLookupByLibrary.simpleMessage("セッション切れ"), + "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( + "セッションの有効期限が切れました。再度ログインしてください。"), + "loginTerms": MessageLookupByLibrary.simpleMessage( + "「ログイン」をクリックすることで、利用規約プライバシーポリシーに同意します"), + "logout": MessageLookupByLibrary.simpleMessage("ログアウト"), + "logsDialogBody": MessageLookupByLibrary.simpleMessage( + "これにより、問題のデバッグに役立つログが送信されます。 特定のファイルの問題を追跡するために、ファイル名が含まれることに注意してください。"), + "longPressAnEmailToVerifyEndToEndEncryption": + MessageLookupByLibrary.simpleMessage( + "表示されているEメールアドレスを長押しして、暗号化を確認します。"), + "longpressOnAnItemToViewInFullscreen": + MessageLookupByLibrary.simpleMessage("アイテムを長押しして全画面表示する"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("ビデオのループをオフ"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("ビデオのループをオン"), + "lostDevice": MessageLookupByLibrary.simpleMessage("デバイスを紛失しましたか?"), + "machineLearning": MessageLookupByLibrary.simpleMessage("機械学習"), + "magicSearch": MessageLookupByLibrary.simpleMessage("マジックサーチ"), + "magicSearchHint": MessageLookupByLibrary.simpleMessage( + "マジック検索では、「花」、「赤い車」、「本人確認書類」などの写真に写っているもので検索できます。"), + "manage": MessageLookupByLibrary.simpleMessage("管理"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("デバイスのストレージを管理"), + "manageFamily": MessageLookupByLibrary.simpleMessage("ファミリーの管理"), + "manageLink": MessageLookupByLibrary.simpleMessage("リンクを管理"), + "manageParticipants": MessageLookupByLibrary.simpleMessage("管理"), + "manageSubscription": + MessageLookupByLibrary.simpleMessage("サブスクリプションの管理"), + "manualPairDesc": MessageLookupByLibrary.simpleMessage( + "PINを使ってペアリングすると、どんなスクリーンで動作します。"), + "map": MessageLookupByLibrary.simpleMessage("地図"), + "maps": MessageLookupByLibrary.simpleMessage("地図"), + "mastodon": MessageLookupByLibrary.simpleMessage("Mastodon"), + "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), + "memoryCount": m0, + "merchandise": MessageLookupByLibrary.simpleMessage("グッズ"), + "mlConsent": MessageLookupByLibrary.simpleMessage("機械学習を有効にする"), + "mlConsentConfirmation": + MessageLookupByLibrary.simpleMessage("機械学習を可能にしたい"), + "mlConsentDescription": MessageLookupByLibrary.simpleMessage( + "機械学習を有効にすると、Enteは顔などの情報をファイルから抽出します。\n\nこれはお使いのデバイスで行われ、生成された生体情報は暗号化されます。"), + "mlConsentPrivacy": MessageLookupByLibrary.simpleMessage( + "この機能の詳細については、こちらをクリックしてください。"), + "mlConsentTitle": MessageLookupByLibrary.simpleMessage("機械学習を有効にしますか?"), + "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( + "すべての項目が処理されるまで、機械学習は帯域幅とバッテリー使用量が高くなりますのでご注意ください。 処理を高速で終わらせたい場合はデスクトップアプリを使用するのがおすすめです。結果は自動的に同期されます。"), + "mobileWebDesktop": + MessageLookupByLibrary.simpleMessage("モバイル、Web、デスクトップ"), + "moderateStrength": MessageLookupByLibrary.simpleMessage("普通のパスワード"), + "modifyYourQueryOrTrySearchingFor": + MessageLookupByLibrary.simpleMessage("クエリを変更するか、以下のように検索してみてください"), + "moments": MessageLookupByLibrary.simpleMessage("モーメント"), + "monthly": MessageLookupByLibrary.simpleMessage("月額"), + "moreDetails": MessageLookupByLibrary.simpleMessage("さらに詳細を表示"), + "moveItem": m37, + "moveToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに移動"), + "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("隠しアルバムに移動"), + "movedSuccessfullyTo": m38, + "movedToTrash": MessageLookupByLibrary.simpleMessage("ごみ箱へ移動"), + "movingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("アルバムにファイルを移動中"), + "name": MessageLookupByLibrary.simpleMessage("名前"), + "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( + "Enteに接続できませんでした。しばらくしてから再試行してください。エラーが解決しない場合は、サポートにお問い合わせください。"), + "networkHostLookUpErr": MessageLookupByLibrary.simpleMessage( + "Enteに接続できませんでした。ネットワーク設定を確認し、エラーが解決しない場合はサポートにお問い合わせください。"), + "never": MessageLookupByLibrary.simpleMessage("なし"), + "newAlbum": MessageLookupByLibrary.simpleMessage("新しいアルバム"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Enteを初めて使用する"), + "newest": MessageLookupByLibrary.simpleMessage("最新"), + "next": MessageLookupByLibrary.simpleMessage("次へ"), + "no": MessageLookupByLibrary.simpleMessage("いいえ"), + "noAlbumsSharedByYouYet": + MessageLookupByLibrary.simpleMessage("あなたが共有したアルバムはまだありません"), + "noDeviceFound": MessageLookupByLibrary.simpleMessage("デバイスが見つかりません"), + "noDeviceLimit": MessageLookupByLibrary.simpleMessage("なし"), + "noDeviceThatCanBeDeleted": + MessageLookupByLibrary.simpleMessage("削除できるファイルがありません"), + "noDuplicates": MessageLookupByLibrary.simpleMessage("✨ 重複なし"), + "noExifData": MessageLookupByLibrary.simpleMessage("EXIFデータはありません"), + "noHiddenPhotosOrVideos": + MessageLookupByLibrary.simpleMessage("非表示の写真やビデオはありません"), + "noImagesWithLocation": + MessageLookupByLibrary.simpleMessage("位置情報のある画像がありません"), + "noInternetConnection": + MessageLookupByLibrary.simpleMessage("インターネット接続なし"), + "noPhotosAreBeingBackedUpRightNow": + MessageLookupByLibrary.simpleMessage("現在バックアップされている写真はありません"), + "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage("写真が見つかりません"), + "noQuickLinksSelected": + MessageLookupByLibrary.simpleMessage("クイックリンクが選択されていません"), + "noRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーがないですか?"), + "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( + "あなたのデータはエンドツーエンド暗号化されており、パスワードかリカバリーキーがない場合、データを復号することはできません"), + "noResults": MessageLookupByLibrary.simpleMessage("該当なし"), + "noResultsFound": + MessageLookupByLibrary.simpleMessage("一致する結果が見つかりませんでした"), + "noSystemLockFound": + MessageLookupByLibrary.simpleMessage("システムロックが見つかりませんでした"), + "notPersonLabel": m39, + "nothingSharedWithYouYet": + MessageLookupByLibrary.simpleMessage("あなたと共有されたものはありません"), + "nothingToSeeHere": + MessageLookupByLibrary.simpleMessage("ここに表示されるものはありません! 👀"), + "notifications": MessageLookupByLibrary.simpleMessage("通知"), + "ok": MessageLookupByLibrary.simpleMessage("OK"), + "onDevice": MessageLookupByLibrary.simpleMessage("デバイス上"), + "onEnte": MessageLookupByLibrary.simpleMessage( + "Enteで保管"), + "onlyFamilyAdminCanChangeCode": m40, + "oops": MessageLookupByLibrary.simpleMessage("Oops"), + "oopsCouldNotSaveEdits": + MessageLookupByLibrary.simpleMessage("編集を保存できませんでした"), + "oopsSomethingWentWrong": + MessageLookupByLibrary.simpleMessage("問題が発生しました"), + "openSettings": MessageLookupByLibrary.simpleMessage("設定を開く"), + "openTheItem": MessageLookupByLibrary.simpleMessage("• アイテムを開く"), + "openstreetmapContributors": + MessageLookupByLibrary.simpleMessage("OpenStreetMap のコントリビューター"), + "optionalAsShortAsYouLike": + MessageLookupByLibrary.simpleMessage("省略可能、好きなだけお書きください..."), + "orPickAnExistingOne": + MessageLookupByLibrary.simpleMessage("または既存のものを選択"), + "pair": MessageLookupByLibrary.simpleMessage("ペアリング"), + "pairWithPin": MessageLookupByLibrary.simpleMessage("PINを使ってペアリングする"), + "pairingComplete": MessageLookupByLibrary.simpleMessage("ペアリング完了"), + "panorama": MessageLookupByLibrary.simpleMessage("パノラマ"), + "passKeyPendingVerification": + MessageLookupByLibrary.simpleMessage("検証はまだ保留中です"), + "passkey": MessageLookupByLibrary.simpleMessage("パスキー"), + "passkeyAuthTitle": MessageLookupByLibrary.simpleMessage("パスキーの検証"), + "password": MessageLookupByLibrary.simpleMessage("パスワード"), + "passwordChangedSuccessfully": + MessageLookupByLibrary.simpleMessage("パスワードの変更に成功しました"), + "passwordLock": MessageLookupByLibrary.simpleMessage("パスワード保護"), + "passwordStrength": m41, + "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( + "パスワードの長さ、使用される文字の種類を考慮してパスワードの強度は計算されます。"), + "passwordWarning": MessageLookupByLibrary.simpleMessage( + "このパスワードを忘れると、あなたのデータを復号することは私達にもできません"), + "paymentDetails": MessageLookupByLibrary.simpleMessage("お支払い情報"), + "paymentFailed": MessageLookupByLibrary.simpleMessage("支払いに失敗しました"), + "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( + "残念ながらお支払いに失敗しました。サポートにお問い合わせください。お手伝いします!"), + "paymentFailedTalkToProvider": m42, + "pendingItems": MessageLookupByLibrary.simpleMessage("処理待ちの項目"), + "pendingSync": MessageLookupByLibrary.simpleMessage("同期を保留中"), + "people": MessageLookupByLibrary.simpleMessage("人"), + "peopleUsingYourCode": + MessageLookupByLibrary.simpleMessage("あなたのコードを使っている人"), + "permDeleteWarning": + MessageLookupByLibrary.simpleMessage("ゴミ箱を空にしました\n\nこの操作はもとに戻せません"), + "permanentlyDelete": MessageLookupByLibrary.simpleMessage("完全に削除"), + "permanentlyDeleteFromDevice": + MessageLookupByLibrary.simpleMessage("デバイスから完全に削除しますか?"), + "photoDescriptions": MessageLookupByLibrary.simpleMessage("写真の説明"), + "photoGridSize": MessageLookupByLibrary.simpleMessage("写真のグリッドサイズ"), + "photoSmallCase": MessageLookupByLibrary.simpleMessage("写真"), + "photos": MessageLookupByLibrary.simpleMessage("写真"), + "photosAddedByYouWillBeRemovedFromTheAlbum": + MessageLookupByLibrary.simpleMessage("あなたの追加した写真はこのアルバムから削除されます"), + "pickCenterPoint": MessageLookupByLibrary.simpleMessage("中心点を選択"), + "pinAlbum": MessageLookupByLibrary.simpleMessage("アルバムをピンする"), + "pinLock": MessageLookupByLibrary.simpleMessage("PINロック"), + "playOnTv": MessageLookupByLibrary.simpleMessage("TVでアルバムを再生"), + "playStoreFreeTrialValidTill": m43, + "playstoreSubscription": + MessageLookupByLibrary.simpleMessage("PlayStoreサブスクリプション"), + "pleaseCheckYourInternetConnectionAndTryAgain": + MessageLookupByLibrary.simpleMessage("インターネット接続を確認して、再試行してください。"), + "pleaseContactSupportAndWeWillBeHappyToHelp": + MessageLookupByLibrary.simpleMessage( + "Support@ente.ioにお問い合わせください、お手伝いいたします。"), + "pleaseContactSupportIfTheProblemPersists": + MessageLookupByLibrary.simpleMessage("問題が解決しない場合はサポートにお問い合わせください"), + "pleaseEmailUsAt": m44, + "pleaseGrantPermissions": + MessageLookupByLibrary.simpleMessage("権限を付与してください"), + "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), + "pleaseSelectQuickLinksToRemove": + MessageLookupByLibrary.simpleMessage("削除するクイックリンクを選択してください"), + "pleaseSendTheLogsTo": m45, + "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), + "pleaseVerifyTheCodeYouHaveEntered": + MessageLookupByLibrary.simpleMessage("入力したコードを確認してください"), + "pleaseWait": MessageLookupByLibrary.simpleMessage("お待ち下さい"), + "pleaseWaitDeletingAlbum": + MessageLookupByLibrary.simpleMessage("お待ちください、アルバムを削除しています"), + "pleaseWaitForSometimeBeforeRetrying": + MessageLookupByLibrary.simpleMessage("再試行する前にしばらくお待ちください"), + "preparingLogs": MessageLookupByLibrary.simpleMessage("ログを準備中..."), + "preserveMore": MessageLookupByLibrary.simpleMessage("もっと保存する"), + "pressAndHoldToPlayVideo": + MessageLookupByLibrary.simpleMessage("長押しで動画を再生"), + "pressAndHoldToPlayVideoDetailed": + MessageLookupByLibrary.simpleMessage("画像の長押しで動画を再生"), + "privacy": MessageLookupByLibrary.simpleMessage("プライバシー"), + "privacyPolicyTitle": + MessageLookupByLibrary.simpleMessage("プライバシーポリシー"), + "privateBackups": MessageLookupByLibrary.simpleMessage("プライベートバックアップ"), + "privateSharing": MessageLookupByLibrary.simpleMessage("プライベート共有"), + "publicLinkCreated": + MessageLookupByLibrary.simpleMessage("公開リンクが作成されました"), + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("公開リンクを有効にしました"), + "quickLinks": MessageLookupByLibrary.simpleMessage("クイックリンク"), + "radius": MessageLookupByLibrary.simpleMessage("半径"), + "raiseTicket": MessageLookupByLibrary.simpleMessage("サポートを受ける"), + "rateTheApp": MessageLookupByLibrary.simpleMessage("アプリを評価"), + "rateUs": MessageLookupByLibrary.simpleMessage("評価して下さい"), + "rateUsOnStore": m46, + "recover": MessageLookupByLibrary.simpleMessage("復元"), + "recoverAccount": MessageLookupByLibrary.simpleMessage("アカウントを復元"), + "recoverButton": MessageLookupByLibrary.simpleMessage("復元"), + "recoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキー"), + "recoveryKeyCopiedToClipboard": + MessageLookupByLibrary.simpleMessage("リカバリーキーはクリップボードにコピーされました"), + "recoveryKeyOnForgotPassword": MessageLookupByLibrary.simpleMessage( + "パスワードを忘れてしまったら、このリカバリーキーが唯一あなたのデータを復元できます"), + "recoveryKeySaveDescription": MessageLookupByLibrary.simpleMessage( + "リカバリーキーは私達も保管しません。24語の単語たちを安全な場所に保管してください"), + "recoveryKeySuccessBody": MessageLookupByLibrary.simpleMessage( + "リカバリーキーは有効です。ご確認いただきありがとうございます。\n\nリカバリーキーは今後も安全にバックアップしておいてください。"), + "recoveryKeyVerified": + MessageLookupByLibrary.simpleMessage("リカバリキーが確認されました"), + "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( + "パスワードを忘れた場合、リカバリキーは写真を復元する唯一の方法です。 リカバリキーは、設定 > セキュリティ で見つけることができます。\n\nリカバリーキーをここに入力して、正しく保存したことを確認してください。"), + "recoverySuccessful": + MessageLookupByLibrary.simpleMessage("復元に成功しました!"), + "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( + "このデバイスではパスワードを確認する能力が足りません。\n\n恐れ入りますが、リカバリーキーを入力してパスワードを再生成する必要があります。"), + "recreatePasswordTitle": + MessageLookupByLibrary.simpleMessage("パスワードを再生成"), + "reddit": MessageLookupByLibrary.simpleMessage("Reddit"), + "reenterPassword": + MessageLookupByLibrary.simpleMessage("パスワードを再入力してください"), + "reenterPin": MessageLookupByLibrary.simpleMessage("PINを再入力してください"), + "referFriendsAnd2xYourPlan": + MessageLookupByLibrary.simpleMessage("友達に紹介してあなたのプランを2倍にしよう"), + "referralStep1": + MessageLookupByLibrary.simpleMessage("1. このコードを友達に贈りましょう"), + "referralStep2": MessageLookupByLibrary.simpleMessage("2. 友達が有料プランに登録"), + "referralStep3": m47, + "referrals": MessageLookupByLibrary.simpleMessage("リフェラル"), + "referralsAreCurrentlyPaused": + MessageLookupByLibrary.simpleMessage("リフェラルは現在一時停止しています"), + "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( + "また、空き領域を取得するには、「設定」→「ストレージ」から「最近削除した項目」を空にします"), + "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( + "「ゴミ箱」も空にするとアカウントのストレージが解放されます"), + "remoteImages": MessageLookupByLibrary.simpleMessage("デバイス上にない画像"), + "remoteThumbnails": + MessageLookupByLibrary.simpleMessage("リモートのサムネイル画像"), + "remoteVideos": MessageLookupByLibrary.simpleMessage("デバイス上にない動画"), + "remove": MessageLookupByLibrary.simpleMessage("削除"), + "removeDuplicates": MessageLookupByLibrary.simpleMessage("重複した項目を削除"), + "removeDuplicatesDesc": + MessageLookupByLibrary.simpleMessage("完全に重複しているファイルを確認し、削除します。"), + "removeFromAlbum": MessageLookupByLibrary.simpleMessage("アルバムから削除"), + "removeFromAlbumTitle": + MessageLookupByLibrary.simpleMessage("アルバムから削除しますか?"), + "removeFromFavorite": + MessageLookupByLibrary.simpleMessage("お気に入りリストから外す"), + "removeLink": MessageLookupByLibrary.simpleMessage("リンクを削除"), + "removeParticipant": MessageLookupByLibrary.simpleMessage("参加者を削除"), + "removeParticipantBody": m48, + "removePersonLabel": MessageLookupByLibrary.simpleMessage("人名を削除"), + "removePublicLink": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), + "removePublicLinks": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), + "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( + "削除したアイテムのいくつかは他の人によって追加されました。あなたはそれらへのアクセスを失います"), + "removeWithQuestionMark": + MessageLookupByLibrary.simpleMessage("削除しますか?"), + "removingFromFavorites": + MessageLookupByLibrary.simpleMessage("お気に入りから削除しています..."), + "rename": MessageLookupByLibrary.simpleMessage("名前変更"), + "renameAlbum": MessageLookupByLibrary.simpleMessage("アルバムの名前変更"), + "renameFile": MessageLookupByLibrary.simpleMessage("ファイル名を変更"), + "renewSubscription": + MessageLookupByLibrary.simpleMessage("サブスクリプションの更新"), + "renewsOn": m49, + "reportABug": MessageLookupByLibrary.simpleMessage("バグを報告"), + "reportBug": MessageLookupByLibrary.simpleMessage("バグを報告"), + "resendEmail": MessageLookupByLibrary.simpleMessage("メールを再送信"), + "resetIgnoredFiles": + MessageLookupByLibrary.simpleMessage("アップロード時に無視されるファイルをリセット"), + "resetPasswordTitle": + MessageLookupByLibrary.simpleMessage("パスワードをリセット"), + "resetToDefault": MessageLookupByLibrary.simpleMessage("初期設定にリセット"), + "restore": MessageLookupByLibrary.simpleMessage("復元"), + "restoreToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに戻す"), + "restoringFiles": MessageLookupByLibrary.simpleMessage("ファイルを復元中..."), + "resumableUploads": MessageLookupByLibrary.simpleMessage("再開可能なアップロード"), + "retry": MessageLookupByLibrary.simpleMessage("リトライ"), + "reviewDeduplicateItems": + MessageLookupByLibrary.simpleMessage("重複だと思うファイルを確認して削除してください"), + "reviewSuggestions": MessageLookupByLibrary.simpleMessage("提案を確認"), + "right": MessageLookupByLibrary.simpleMessage("右"), + "rotate": MessageLookupByLibrary.simpleMessage("回転"), + "rotateLeft": MessageLookupByLibrary.simpleMessage("左に回転"), + "rotateRight": MessageLookupByLibrary.simpleMessage("右に回転"), + "safelyStored": MessageLookupByLibrary.simpleMessage("保管されています"), + "save": MessageLookupByLibrary.simpleMessage("保存"), + "saveCollage": MessageLookupByLibrary.simpleMessage("コラージュを保存"), + "saveCopy": MessageLookupByLibrary.simpleMessage("コピーを保存"), + "saveKey": MessageLookupByLibrary.simpleMessage("キーを保存"), + "saveYourRecoveryKeyIfYouHaventAlready": + MessageLookupByLibrary.simpleMessage("リカバリーキーを保存してください"), + "saving": MessageLookupByLibrary.simpleMessage("保存中…"), + "savingEdits": MessageLookupByLibrary.simpleMessage("編集を保存中..."), + "scanCode": MessageLookupByLibrary.simpleMessage("コードをスキャン"), + "scanThisBarcodeWithnyourAuthenticatorApp": + MessageLookupByLibrary.simpleMessage("認証アプリでQRコードをスキャンして下さい。"), + "search": MessageLookupByLibrary.simpleMessage("検索"), + "searchAlbumsEmptySection": + MessageLookupByLibrary.simpleMessage("アルバム"), + "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("アルバム名"), + "searchByExamples": MessageLookupByLibrary.simpleMessage( + "• アルバム名 (e.g. \"Camera\")\n• ファイルの種類 (e.g. \"Videos\", \".gif\")\n• 年月日 (e.g. \"2022\", \"January\")\n• ホリデー (e.g. \"Christmas\")\n• 写真の説明文 (e.g. “#fun”)"), + "searchCaptionEmptySection": MessageLookupByLibrary.simpleMessage( + "写真情報に \"#trip\" のように説明を追加して、簡単に見つけられます"), + "searchDatesEmptySection": + MessageLookupByLibrary.simpleMessage("日付、月または年で検索"), + "searchFaceEmptySection": + MessageLookupByLibrary.simpleMessage("学習が完了すると、ここに人が表示されます"), + "searchFileTypesAndNamesEmptySection": + MessageLookupByLibrary.simpleMessage("ファイルの種類と名前"), + "searchHint1": MessageLookupByLibrary.simpleMessage("デバイス上で高速検索"), + "searchHint2": MessageLookupByLibrary.simpleMessage("写真の日付、説明"), + "searchHint3": MessageLookupByLibrary.simpleMessage("アルバム、ファイル名、種類"), + "searchHint4": MessageLookupByLibrary.simpleMessage("場所"), + "searchHint5": + MessageLookupByLibrary.simpleMessage("近日公開: フェイスとマジック検索 ✨"), + "searchLocationEmptySection": + MessageLookupByLibrary.simpleMessage("当時の直近で撮影された写真をグループ化"), + "searchPeopleEmptySection": + MessageLookupByLibrary.simpleMessage("友達を招待すると、共有される写真はここから閲覧できます"), + "searchResultCount": m50, + "security": MessageLookupByLibrary.simpleMessage("セキュリティ"), + "selectALocation": MessageLookupByLibrary.simpleMessage("場所を選択"), + "selectALocationFirst": + MessageLookupByLibrary.simpleMessage("先に場所を選択してください"), + "selectAlbum": MessageLookupByLibrary.simpleMessage("アルバムを選択"), + "selectAll": MessageLookupByLibrary.simpleMessage("全て選択"), + "selectFoldersForBackup": + MessageLookupByLibrary.simpleMessage("バックアップするフォルダを選択"), + "selectItemsToAdd": MessageLookupByLibrary.simpleMessage("追加するアイテムを選択"), + "selectLanguage": MessageLookupByLibrary.simpleMessage("言語を選ぶ"), + "selectMorePhotos": MessageLookupByLibrary.simpleMessage("さらに写真を選択"), + "selectReason": MessageLookupByLibrary.simpleMessage(""), + "selectYourPlan": MessageLookupByLibrary.simpleMessage("プランを選択してください"), + "selectedFilesAreNotOnEnte": + MessageLookupByLibrary.simpleMessage("選択したファイルはEnte上にありません"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage("選ばれたフォルダは暗号化されバックアップされます"), + "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": + MessageLookupByLibrary.simpleMessage( + "選択したアイテムはすべてのアルバムから削除され、ゴミ箱に移動されます。"), + "selectedPhotos": m1, + "selectedPhotosWithYours": m51, + "send": MessageLookupByLibrary.simpleMessage("送信"), + "sendEmail": MessageLookupByLibrary.simpleMessage("メールを送信する"), + "sendInvite": MessageLookupByLibrary.simpleMessage("招待を送る"), + "sendLink": MessageLookupByLibrary.simpleMessage("リンクを送信"), + "serverEndpoint": MessageLookupByLibrary.simpleMessage("サーバーエンドポイント"), + "sessionExpired": MessageLookupByLibrary.simpleMessage("セッション切れ"), + "setAPassword": MessageLookupByLibrary.simpleMessage("パスワードを設定"), + "setAs": MessageLookupByLibrary.simpleMessage("設定:"), + "setCover": MessageLookupByLibrary.simpleMessage("カバー画像をセット"), + "setLabel": MessageLookupByLibrary.simpleMessage("セット"), + "setNewPassword": MessageLookupByLibrary.simpleMessage("新しいパスワードを設定"), + "setNewPin": MessageLookupByLibrary.simpleMessage("新しいPINを設定"), + "setPasswordTitle": MessageLookupByLibrary.simpleMessage("パスワードを決定"), + "setRadius": MessageLookupByLibrary.simpleMessage("半径の設定"), + "setupComplete": MessageLookupByLibrary.simpleMessage("セットアップ完了"), + "share": MessageLookupByLibrary.simpleMessage("共有"), + "shareALink": MessageLookupByLibrary.simpleMessage("リンクをシェアする"), + "shareAlbumHint": + MessageLookupByLibrary.simpleMessage("アルバムを開いて右上のシェアボタンをタップ"), + "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("アルバムを共有"), + "shareLink": MessageLookupByLibrary.simpleMessage("リンクの共有"), + "shareMyVerificationID": m52, + "shareOnlyWithThePeopleYouWant": + MessageLookupByLibrary.simpleMessage("選んだ人と共有します"), + "shareTextConfirmOthersVerificationID": m2, + "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( + "Enteをダウンロードして、写真や動画の共有を簡単にしよう\n\nhttps://ente.io"), + "shareTextReferralCode": m53, + "shareWithNonenteUsers": + MessageLookupByLibrary.simpleMessage("Enteアカウントを持っていないユーザーと共有"), + "shareWithPeopleSectionTitle": m54, + "shareYourFirstAlbum": + MessageLookupByLibrary.simpleMessage("アルバムの共有をしてみましょう"), + "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( + "無料プランのユーザーを含む、他のEnteユーザーと共有および共同アルバムを作成します。"), + "sharedByMe": MessageLookupByLibrary.simpleMessage("あなたが共有しました"), + "sharedByYou": MessageLookupByLibrary.simpleMessage("あなたが共有しました"), + "sharedPhotoNotifications": + MessageLookupByLibrary.simpleMessage("新しい共有写真"), + "sharedPhotoNotificationsExplanation": + MessageLookupByLibrary.simpleMessage("誰かが写真を共有アルバムに追加した時に通知を受け取る"), + "sharedWith": m55, + "sharedWithMe": MessageLookupByLibrary.simpleMessage("あなたに共有されています"), + "sharedWithYou": MessageLookupByLibrary.simpleMessage("あなたと共有されています"), + "sharing": MessageLookupByLibrary.simpleMessage("共有中..."), + "showMemories": MessageLookupByLibrary.simpleMessage("思い出を表示"), + "signOutFromOtherDevices": + MessageLookupByLibrary.simpleMessage("他のデバイスからサインアウトする"), + "signOutOtherBody": MessageLookupByLibrary.simpleMessage( + "他の誰かがあなたのパスワードを知っている可能性があると判断した場合は、あなたのアカウントを使用している他のすべてのデバイスから強制的にサインアウトできます。"), + "signOutOtherDevices": + MessageLookupByLibrary.simpleMessage("他のデバイスからサインアウトする"), + "signUpTerms": MessageLookupByLibrary.simpleMessage( + "利用規約プライバシーポリシーに同意します"), + "singleFileDeleteFromDevice": m56, + "singleFileDeleteHighlight": + MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), + "singleFileInBothLocalAndRemote": m57, + "singleFileInRemoteOnly": m58, + "skip": MessageLookupByLibrary.simpleMessage("スキップ"), + "social": MessageLookupByLibrary.simpleMessage("SNS"), + "someItemsAreInBothEnteAndYourDevice": + MessageLookupByLibrary.simpleMessage( + "いくつかの項目は、Enteとお使いのデバイス上の両方にあります。"), + "someOfTheFilesYouAreTryingToDeleteAre": + MessageLookupByLibrary.simpleMessage( + "削除しようとしているファイルのいくつかは、お使いのデバイス上にのみあり、削除した場合は復元できません"), + "someoneSharingAlbumsWithYouShouldSeeTheSameId": + MessageLookupByLibrary.simpleMessage( + "アルバムを共有している人はデバイス上で同じIDを見ることができます。"), + "somethingWentWrong": + MessageLookupByLibrary.simpleMessage("エラーが発生しました"), + "somethingWentWrongPleaseTryAgain": + MessageLookupByLibrary.simpleMessage("問題が起きてしまいました、もう一度試してください"), + "sorry": MessageLookupByLibrary.simpleMessage("すみません"), + "sorryCouldNotAddToFavorites": + MessageLookupByLibrary.simpleMessage("お気に入りに追加できませんでした。"), + "sorryCouldNotRemoveFromFavorites": + MessageLookupByLibrary.simpleMessage("お気に入りから削除できませんでした"), + "sorryTheCodeYouveEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage("入力されたコードは正しくありません"), + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": + MessageLookupByLibrary.simpleMessage( + "このデバイスでは安全な鍵を生成することができませんでした。\n\n他のデバイスからサインアップを試みてください。"), + "sortAlbumsBy": MessageLookupByLibrary.simpleMessage("並び替え"), + "sortNewestFirst": MessageLookupByLibrary.simpleMessage("新しい順"), + "sortOldestFirst": MessageLookupByLibrary.simpleMessage("古い順"), + "sparkleSuccess": MessageLookupByLibrary.simpleMessage("成功✨"), + "startBackup": MessageLookupByLibrary.simpleMessage("バックアップを開始"), + "status": MessageLookupByLibrary.simpleMessage("ステータス"), + "stopCastingBody": MessageLookupByLibrary.simpleMessage("キャストを停止しますか?"), + "stopCastingTitle": MessageLookupByLibrary.simpleMessage("キャストを停止"), + "storage": MessageLookupByLibrary.simpleMessage("ストレージ"), + "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("ファミリー"), + "storageBreakupYou": MessageLookupByLibrary.simpleMessage("あなた"), + "storageInGB": m59, + "storageLimitExceeded": + MessageLookupByLibrary.simpleMessage("ストレージの上限を超えました"), + "storageUsageInfo": m60, + "strongStrength": MessageLookupByLibrary.simpleMessage("強いパスワード"), + "subAlreadyLinkedErrMessage": m61, + "subWillBeCancelledOn": m62, + "subscribe": MessageLookupByLibrary.simpleMessage("サブスクライブ"), + "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( + "サブスクリプションの有効期限が切れているようです。共有を有効にするにはサブスクリプションをご利用ください。"), + "subscription": MessageLookupByLibrary.simpleMessage("サブスクリプション"), + "success": MessageLookupByLibrary.simpleMessage("成功"), + "successfullyArchived": + MessageLookupByLibrary.simpleMessage("アーカイブしました"), + "successfullyHid": MessageLookupByLibrary.simpleMessage("非表示にしました"), + "successfullyUnarchived": + MessageLookupByLibrary.simpleMessage("アーカイブを解除しました"), + "successfullyUnhid": MessageLookupByLibrary.simpleMessage("非表示を解除しました"), + "suggestFeatures": MessageLookupByLibrary.simpleMessage("機能を提案"), + "support": MessageLookupByLibrary.simpleMessage("サポート"), + "syncProgress": m63, + "syncStopped": MessageLookupByLibrary.simpleMessage("同期が停止しました"), + "syncing": MessageLookupByLibrary.simpleMessage("同期中..."), + "systemTheme": MessageLookupByLibrary.simpleMessage("システム"), + "tapToCopy": MessageLookupByLibrary.simpleMessage("タップしてコピー"), + "tapToEnterCode": MessageLookupByLibrary.simpleMessage("タップしてコードを入力"), + "tapToUnlock": MessageLookupByLibrary.simpleMessage("タップして解除"), + "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( + "問題が発生したようです。しばらくしてから再試行してください。エラーが解決しない場合は、サポートチームにお問い合わせください。"), + "terminate": MessageLookupByLibrary.simpleMessage("終了させる"), + "terminateSession": MessageLookupByLibrary.simpleMessage("セッションを終了"), + "terms": MessageLookupByLibrary.simpleMessage("規約"), + "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("規約"), + "thankYou": MessageLookupByLibrary.simpleMessage("ありがとうございます"), + "thankYouForSubscribing": + MessageLookupByLibrary.simpleMessage("ありがとうございます!"), + "theDownloadCouldNotBeCompleted": + MessageLookupByLibrary.simpleMessage("ダウンロードを完了できませんでした"), + "theRecoveryKeyYouEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage("入力したリカバリーキーが間違っています"), + "theme": MessageLookupByLibrary.simpleMessage("テーマ"), + "theseItemsWillBeDeletedFromYourDevice": + MessageLookupByLibrary.simpleMessage("これらの項目はデバイスから削除されます。"), + "theyAlsoGetXGb": m64, + "theyWillBeDeletedFromAllAlbums": + MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), + "thisActionCannotBeUndone": + MessageLookupByLibrary.simpleMessage("この操作は元に戻せません"), + "thisAlbumAlreadyHDACollaborativeLink": + MessageLookupByLibrary.simpleMessage( + "このアルバムはすでにコラボレーションリンクが生成されています"), + "thisCanBeUsedToRecoverYourAccountIfYou": + MessageLookupByLibrary.simpleMessage( + "2段階認証を失った場合、アカウントを回復するために使用できます。"), + "thisDevice": MessageLookupByLibrary.simpleMessage("このデバイス"), + "thisEmailIsAlreadyInUse": + MessageLookupByLibrary.simpleMessage("このメールアドレスはすでに使用されています。"), + "thisImageHasNoExifData": + MessageLookupByLibrary.simpleMessage("この画像にEXIFデータはありません"), + "thisIsPersonVerificationId": m65, + "thisIsYourVerificationId": + MessageLookupByLibrary.simpleMessage("これはあなたの認証IDです"), + "thisWillLogYouOutOfTheFollowingDevice": + MessageLookupByLibrary.simpleMessage("以下のデバイスからログアウトします:"), + "thisWillLogYouOutOfThisDevice": + MessageLookupByLibrary.simpleMessage("ログアウトします"), + "thisWillRemovePublicLinksOfAllSelectedQuickLinks": + MessageLookupByLibrary.simpleMessage( + "選択したすべてのクイックリンクの公開リンクを削除します。"), + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": + MessageLookupByLibrary.simpleMessage( + "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。"), + "toHideAPhotoOrVideo": + MessageLookupByLibrary.simpleMessage("写真や動画を非表示にする"), + "toResetVerifyEmail": MessageLookupByLibrary.simpleMessage( + "パスワードのリセットをするには、まずEメールを確認してください"), + "todaysLogs": MessageLookupByLibrary.simpleMessage("今日のログ"), + "tooManyIncorrectAttempts": + MessageLookupByLibrary.simpleMessage("間違った回数が多すぎます"), + "total": MessageLookupByLibrary.simpleMessage("合計"), + "totalSize": MessageLookupByLibrary.simpleMessage("合計サイズ"), + "trash": MessageLookupByLibrary.simpleMessage("ゴミ箱"), + "trashDaysLeft": m66, + "trim": MessageLookupByLibrary.simpleMessage("トリミング"), + "tryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), + "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( + "バックアップをオンにすると、このデバイスフォルダに追加されたファイルは自動的にEnteにアップロードされます。"), + "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), + "twoMonthsFreeOnYearlyPlans": + MessageLookupByLibrary.simpleMessage("年次プランでは2ヶ月無料"), + "twofactor": MessageLookupByLibrary.simpleMessage("二段階認証"), + "twofactorAuthenticationHasBeenDisabled": + MessageLookupByLibrary.simpleMessage("二段階認証が無効になりました。"), + "twofactorAuthenticationPageTitle": + MessageLookupByLibrary.simpleMessage("2段階認証"), + "twofactorAuthenticationSuccessfullyReset": + MessageLookupByLibrary.simpleMessage("2段階認証をリセットしました"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage("2段階認証のセットアップ"), + "unarchive": MessageLookupByLibrary.simpleMessage("アーカイブ解除"), + "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("アルバムのアーカイブ解除"), + "unarchiving": MessageLookupByLibrary.simpleMessage("アーカイブを解除中..."), + "unavailableReferralCode": + MessageLookupByLibrary.simpleMessage("このコードは利用できません"), + "uncategorized": MessageLookupByLibrary.simpleMessage("カテゴリなし"), + "unhide": MessageLookupByLibrary.simpleMessage("再表示"), + "unhideToAlbum": MessageLookupByLibrary.simpleMessage("アルバムを再表示する"), + "unhiding": MessageLookupByLibrary.simpleMessage("非表示を解除しています"), + "unhidingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("アルバムにファイルを表示しない"), + "unlock": MessageLookupByLibrary.simpleMessage("ロック解除"), + "unpinAlbum": MessageLookupByLibrary.simpleMessage("アルバムのピン留めを解除"), + "unselectAll": MessageLookupByLibrary.simpleMessage("選択を解除"), + "update": MessageLookupByLibrary.simpleMessage("アップデート"), + "updateAvailable": MessageLookupByLibrary.simpleMessage("アップデートがあります"), + "updatingFolderSelection": + MessageLookupByLibrary.simpleMessage("フォルダの選択をアップデート中"), + "upgrade": MessageLookupByLibrary.simpleMessage("アップグレード"), + "uploadingFilesToAlbum": + MessageLookupByLibrary.simpleMessage("アルバムにファイルをアップロード中"), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": + MessageLookupByLibrary.simpleMessage("1メモリを保存しています..."), + "upto50OffUntil4thDec": + MessageLookupByLibrary.simpleMessage("12月4日まで、最大50%オフ。"), + "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( + "使用可能なストレージは現在のプランによって制限されています。プランをアップグレードすると、あなたが手に入れたストレージが自動的に使用可能になります。"), + "useAsCover": MessageLookupByLibrary.simpleMessage("カバー写真として使用"), + "usePublicLinksForPeopleNotOnEnte": + MessageLookupByLibrary.simpleMessage( + "公開リンクを使用する(Enteを利用しない人と共有できます)"), + "useRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを使用"), + "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("選択した写真を使用"), + "usedSpace": MessageLookupByLibrary.simpleMessage("使用済み領域"), + "validTill": m68, + "verificationFailedPleaseTryAgain": + MessageLookupByLibrary.simpleMessage("確認に失敗しました、再試行してください"), + "verificationId": MessageLookupByLibrary.simpleMessage("確認用ID"), + "verify": MessageLookupByLibrary.simpleMessage("確認"), + "verifyEmail": MessageLookupByLibrary.simpleMessage("Eメールの確認"), + "verifyEmailID": m69, + "verifyIDLabel": MessageLookupByLibrary.simpleMessage("確認"), + "verifyPasskey": MessageLookupByLibrary.simpleMessage("パスキーを確認"), + "verifyPassword": MessageLookupByLibrary.simpleMessage("パスワードの確認"), + "verifying": MessageLookupByLibrary.simpleMessage("確認中..."), + "verifyingRecoveryKey": + MessageLookupByLibrary.simpleMessage("リカバリキーを確認中..."), + "videoInfo": MessageLookupByLibrary.simpleMessage("ビデオ情報"), + "videoSmallCase": MessageLookupByLibrary.simpleMessage("ビデオ"), + "videos": MessageLookupByLibrary.simpleMessage("ビデオ"), + "viewActiveSessions": + MessageLookupByLibrary.simpleMessage("アクティブなセッションを表示"), + "viewAddOnButton": MessageLookupByLibrary.simpleMessage("アドオンを表示"), + "viewAll": MessageLookupByLibrary.simpleMessage("すべて表示"), + "viewAllExifData": + MessageLookupByLibrary.simpleMessage("全ての EXIF データを表示"), + "viewLargeFiles": MessageLookupByLibrary.simpleMessage("大きなファイル"), + "viewLargeFilesDesc": MessageLookupByLibrary.simpleMessage( + "最も多くのストレージを消費しているファイルを表示します。"), + "viewLogs": MessageLookupByLibrary.simpleMessage("ログを表示"), + "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリキーを表示"), + "viewer": MessageLookupByLibrary.simpleMessage("ビューアー"), + "visitWebToManage": MessageLookupByLibrary.simpleMessage( + "サブスクリプションを管理するにはweb.ente.ioをご覧ください"), + "waitingForVerification": + MessageLookupByLibrary.simpleMessage("確認を待っています..."), + "waitingForWifi": MessageLookupByLibrary.simpleMessage("WiFi を待っています"), + "weAreOpenSource": + MessageLookupByLibrary.simpleMessage("私たちはオープンソースです!"), + "weDontSupportEditingPhotosAndAlbumsThatYouDont": + MessageLookupByLibrary.simpleMessage( + "あなたが所有していない写真やアルバムの編集はサポートされていません"), + "weHaveSendEmailTo": m70, + "weakStrength": MessageLookupByLibrary.simpleMessage("弱いパスワード"), + "welcomeBack": MessageLookupByLibrary.simpleMessage("おかえりなさい!"), + "whatsNew": MessageLookupByLibrary.simpleMessage("最新情報"), + "yearly": MessageLookupByLibrary.simpleMessage("年額"), + "yearsAgo": m71, + "yes": MessageLookupByLibrary.simpleMessage("はい"), + "yesCancel": MessageLookupByLibrary.simpleMessage("キャンセル"), + "yesConvertToViewer": + MessageLookupByLibrary.simpleMessage("ビューアーに変換する"), + "yesDelete": MessageLookupByLibrary.simpleMessage("はい、削除"), + "yesDiscardChanges": + MessageLookupByLibrary.simpleMessage("はい、変更を破棄します。"), + "yesLogout": MessageLookupByLibrary.simpleMessage("はい、ログアウトします"), + "yesRemove": MessageLookupByLibrary.simpleMessage("削除"), + "yesRenew": MessageLookupByLibrary.simpleMessage("はい、更新する"), + "you": MessageLookupByLibrary.simpleMessage("あなた"), + "youAreOnAFamilyPlan": + MessageLookupByLibrary.simpleMessage("ファミリープランに入会しています!"), + "youAreOnTheLatestVersion": + MessageLookupByLibrary.simpleMessage("あなたは最新バージョンを使用しています"), + "youCanAtMaxDoubleYourStorage": + MessageLookupByLibrary.simpleMessage("* 最大2倍のストレージまで"), + "youCanManageYourLinksInTheShareTab": + MessageLookupByLibrary.simpleMessage("作ったリンクは共有タブで管理できます"), + "youCanTrySearchingForADifferentQuery": + MessageLookupByLibrary.simpleMessage("別の単語を検索してみてください。"), + "youCannotDowngradeToThisPlan": + MessageLookupByLibrary.simpleMessage("このプランにダウングレードはできません"), + "youCannotShareWithYourself": + MessageLookupByLibrary.simpleMessage("自分自身と共有することはできません"), + "youDontHaveAnyArchivedItems": + MessageLookupByLibrary.simpleMessage("アーカイブした項目はありません"), + "youHaveSuccessfullyFreedUp": m72, + "yourAccountHasBeenDeleted": + MessageLookupByLibrary.simpleMessage("アカウントは削除されました"), + "yourMap": MessageLookupByLibrary.simpleMessage("あなたの地図"), + "yourPlanWasSuccessfullyDowngraded": + MessageLookupByLibrary.simpleMessage("プランはダウングレードされました"), + "yourPlanWasSuccessfullyUpgraded": + MessageLookupByLibrary.simpleMessage("プランはアップグレードされました"), + "yourPurchaseWasSuccessful": + MessageLookupByLibrary.simpleMessage("決済に成功しました"), + "yourStorageDetailsCouldNotBeFetched": + MessageLookupByLibrary.simpleMessage("ストレージの詳細を取得できませんでした"), + "yourSubscriptionHasExpired": + MessageLookupByLibrary.simpleMessage("サブスクリプションの有効期限が終了しました"), + "yourSubscriptionWasUpdatedSuccessfully": + MessageLookupByLibrary.simpleMessage("サブスクリプションが更新されました"), + "yourVerificationCodeHasExpired": + MessageLookupByLibrary.simpleMessage("確認用コードが失効しました"), + "youveNoDuplicateFilesThatCanBeCleared": + MessageLookupByLibrary.simpleMessage("削除できる重複ファイルはありません"), + "youveNoFilesInThisAlbumThatCanBeDeleted": + MessageLookupByLibrary.simpleMessage("このアルバムには消すファイルがありません"), + "zoomOutToSeePhotos": + MessageLookupByLibrary.simpleMessage("ズームアウトして写真を表示") }; } diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index d034501147..cd9c498f8f 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 95f7a65da1..99cecbb6ba 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -40,8 +40,8 @@ class MessageLookup extends MessageLookupByLibrary { "feedback": MessageLookupByLibrary.simpleMessage("피드백"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 714e272e20..bbd5355bf6 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -209,17 +209,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagen')}"; - static String m67(endDate) => "Geldig tot ${endDate}"; + static String m67(count) => "${count} herinneringen veiligstellen..."; - static String m68(email) => "Verifieer ${email}"; + static String m68(endDate) => "Geldig tot ${endDate}"; - static String m69(email) => + static String m69(email) => "Verifieer ${email}"; + + static String m70(email) => "We hebben een e-mail gestuurd naar ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} jaar geleden', other: '${count} jaar geleden')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Je hebt ${storageSaved} succesvol vrijgemaakt!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -973,6 +975,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Modellen downloaden..."), "localGallery": MessageLookupByLibrary.simpleMessage("Lokale galerij"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Locatie"), "locationName": MessageLookupByLibrary.simpleMessage("Locatie naam"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -996,8 +1000,10 @@ class MessageLookup extends MessageLookupByLibrary { "Druk lang op een e-mail om de versleuteling te verifiëren."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Houd een bestand lang ingedrukt om te bekijken op volledig scherm"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": + MessageLookupByLibrary.simpleMessage("Video in lus afspelen uit"), + "loopVideoOn": + MessageLookupByLibrary.simpleMessage("Video in lus afspelen aan"), "lostDevice": MessageLookupByLibrary.simpleMessage("Apparaat verloren?"), "machineLearning": @@ -1666,6 +1672,9 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Upgraden"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Bestanden worden geüpload naar album..."), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( + "1 herinnering veiligstellen..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Tot 50% korting, tot 4 december."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( @@ -1679,7 +1688,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gebruik geselecteerde foto"), "usedSpace": MessageLookupByLibrary.simpleMessage("Gebruikte ruimte"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificatie mislukt, probeer het opnieuw"), @@ -1687,7 +1696,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie ID"), "verify": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bevestig e-mail"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Bevestig passkey"), @@ -1725,12 +1734,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "We ondersteunen het bewerken van foto\'s en albums waar je niet de eigenaar van bent nog niet"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Zwak"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Welkom terug!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Nieuw"), "yearly": MessageLookupByLibrary.simpleMessage("Jaarlijks"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, opzeggen"), "yesConvertToViewer": @@ -1760,7 +1769,7 @@ class MessageLookup extends MessageLookupByLibrary { "Je kunt niet met jezelf delen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "U heeft geen gearchiveerde bestanden."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Je account is verwijderd"), "yourMap": MessageLookupByLibrary.simpleMessage("Jouw kaart"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index b0a82ea125..0b896460e2 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -64,9 +64,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m65(email) => "Dette er ${email} sin verifiserings-ID"; - static String m68(email) => "Verifiser ${email}"; + static String m69(email) => "Verifiser ${email}"; - static String m69(email) => + static String m70(email) => "Vi har sendt en e-post til ${email}"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -257,12 +257,12 @@ class MessageLookup extends MessageLookupByLibrary { "linkHasExpired": MessageLookupByLibrary.simpleMessage("Lenken har utløpt"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldri"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"), "logInLabel": MessageLookupByLibrary.simpleMessage("Logg inn"), "loginTerms": MessageLookupByLibrary.simpleMessage( "Ved å klikke Logg inn, godtar jeg brukervilkårene og personvernreglene"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Mistet enhet?"), "machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søk"), @@ -438,7 +438,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Bekreft"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bekreft e-postadresse"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyPassword": MessageLookupByLibrary.simpleMessage("Bekreft passord"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( @@ -447,7 +447,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Vis gjenopprettingsnøkkel"), "viewer": MessageLookupByLibrary.simpleMessage("Seer"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Svakt"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Velkommen tilbake!"), diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index c0eb586303..3efda62f20 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -208,17 +208,20 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '${count} dzień', few: '${count} dni', other: '${count} dni')}"; - static String m67(endDate) => "Ważne do ${endDate}"; + static String m67(count) => + "${Intl.plural(count, one: 'Zachowywanie ${count} wspomnienia...', few: 'Zachowywanie ${count} wspomnienia...', many: 'Zachowywanie ${count} wspomnień...', other: 'Zachowywanie ${count} wspomnień...')}"; - static String m68(email) => "Zweryfikuj ${email}"; + static String m68(endDate) => "Ważne do ${endDate}"; - static String m69(email) => + static String m69(email) => "Zweryfikuj ${email}"; + + static String m70(email) => "Wysłaliśmy wiadomość na adres ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m71(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; + static String m72(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -965,6 +968,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Pobieranie modeli..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galeria lokalna"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Lokalizacja"), "locationName": MessageLookupByLibrary.simpleMessage("Nazwa lokalizacji"), @@ -990,8 +995,10 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Długo naciśnij element, aby wyświetlić go na pełnym ekranie"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": + MessageLookupByLibrary.simpleMessage("Pętla wideo wyłączona"), + "loopVideoOn": + MessageLookupByLibrary.simpleMessage("Pętla wideo włączona"), "lostDevice": MessageLookupByLibrary.simpleMessage("Utracono urządzenie?"), "machineLearning": @@ -1659,6 +1666,9 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Ulepsz"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Przesyłanie plików do albumu..."), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( + "Zachowywanie 1 wspomnienia..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Do 50% zniżki, do 4 grudnia."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( @@ -1672,7 +1682,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Weryfikacja nie powiodła się, spróbuj ponownie"), @@ -1681,7 +1691,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Zweryfikuj adres e-mail"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Zweryfikuj klucz dostępu"), @@ -1718,12 +1728,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Nie wspieramy edycji zdjęć i albumów, których jeszcze nie posiadasz"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Słabe"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Co nowego"), "yearly": MessageLookupByLibrary.simpleMessage("Rocznie"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), "yesConvertToViewer": @@ -1753,7 +1763,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nie możesz udostępnić samemu sobie"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych zarchiwizowanych elementów."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Twoje konto zostało usunięte"), "yourMap": MessageLookupByLibrary.simpleMessage("Twoja mapa"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index d0eee7fff0..490a93844b 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -207,16 +207,18 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 dia', other: '${count} dias')}"; - static String m67(endDate) => "Válido até ${endDate}"; + static String m67(count) => "Preservando ${count} memórias..."; - static String m68(email) => "Verificar ${email}"; + static String m68(endDate) => "Válido até ${endDate}"; - static String m69(email) => "Enviamos um e-mail à ${email}"; + static String m69(email) => "Verificar ${email}"; - static String m70(count) => + static String m70(email) => "Enviamos um e-mail à ${email}"; + + static String m71(count) => "${Intl.plural(count, one: '${count} anos atrás', other: '${count} anos atrás')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Você liberou ${storageSaved} com sucesso!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -965,6 +967,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage( "Fazendo download de modelos..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galeria local"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Local"), "locationName": MessageLookupByLibrary.simpleMessage("Nome do Local"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -989,8 +993,10 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Pressione e segure em um item para exibir em tela cheia"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": + MessageLookupByLibrary.simpleMessage("Repetir vídeo desligado"), + "loopVideoOn": + MessageLookupByLibrary.simpleMessage("Repetir vídeo ligado"), "lostDevice": MessageLookupByLibrary.simpleMessage("Dispositivo perdido?"), "machineLearning": @@ -1657,6 +1663,9 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("Aprimorar"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Enviando arquivos para o álbum..."), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": + MessageLookupByLibrary.simpleMessage("Preservando 1 memória..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Até 50% de desconto, até 4 de dezembro."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( @@ -1670,7 +1679,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Utilizar foto selecionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espaço em uso"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Falha na verificação, por favor, tente novamente"), @@ -1678,7 +1687,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID de Verificação"), "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verificar e-mail"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar chave de acesso"), @@ -1717,13 +1726,13 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Não suportamos a edição de fotos e álbuns que você ainda não possui"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Fraca"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Bem-vindo de volta!"), "whatsNew": MessageLookupByLibrary.simpleMessage("O que há de novo"), "yearly": MessageLookupByLibrary.simpleMessage("Anual"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Sim"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sim, cancelar"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1754,7 +1763,7 @@ class MessageLookup extends MessageLookupByLibrary { "Você não pode compartilhar consigo mesmo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Você não tem nenhum item arquivado."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Sua conta foi excluída"), "yourMap": MessageLookupByLibrary.simpleMessage("Seu mapa"), diff --git a/mobile/lib/generated/intl/messages_ru.dart b/mobile/lib/generated/intl/messages_ru.dart index 35d3d88034..ff3a5e7fb1 100644 --- a/mobile/lib/generated/intl/messages_ru.dart +++ b/mobile/lib/generated/intl/messages_ru.dart @@ -203,16 +203,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 день', other: '${count} дней')}"; - static String m67(endDate) => "Действителен по ${endDate}"; + static String m68(endDate) => "Действителен по ${endDate}"; - static String m68(email) => "Подтвердить ${email}"; + static String m69(email) => "Подтвердить ${email}"; - static String m69(email) => "Мы отправили письмо на ${email}"; + static String m70(email) => "Мы отправили письмо на ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} год назад', other: '${count} лет назад')}"; - static String m71(storageSaved) => "Вы успешно освободили ${storageSaved}!"; + static String m72(storageSaved) => "Вы успешно освободили ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -953,6 +953,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Загрузка моделей..."), "localGallery": MessageLookupByLibrary.simpleMessage("Локальная галерея"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Местоположение"), "locationName": MessageLookupByLibrary.simpleMessage("Название локации"), @@ -978,8 +980,6 @@ class MessageLookup extends MessageLookupByLibrary { "Длительное нажатие на email для подтверждения сквозного шифрования."), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Удерживайте нажатие на элемент для просмотра в полноэкранном режиме"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Потеряли свое устройство?"), "machineLearning": @@ -1663,7 +1663,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Использовать выбранное фото"), "usedSpace": MessageLookupByLibrary.simpleMessage("Использовано места"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Проверка не удалась, попробуйте еще раз"), @@ -1672,7 +1672,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Подтвердить"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Подтвердить электронную почту"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Подтверждение"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Подтвердить ключ"), @@ -1707,12 +1707,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Мы не можем поддержать редактирование фотографий и альбомов, которыми вы не владеете"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Слабый"), "welcomeBack": MessageLookupByLibrary.simpleMessage("С возвращением!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Что нового"), "yearly": MessageLookupByLibrary.simpleMessage("Ежегодно"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Да"), "yesCancel": MessageLookupByLibrary.simpleMessage("Да, отменить"), "yesConvertToViewer": @@ -1742,7 +1742,7 @@ class MessageLookup extends MessageLookupByLibrary { "Вы не можете поделиться с самим собой"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "У вас нет архивных элементов."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Ваша учетная запись была удалена"), "yourMap": MessageLookupByLibrary.simpleMessage("Ваша карта"), diff --git a/mobile/lib/generated/intl/messages_sv.dart b/mobile/lib/generated/intl/messages_sv.dart index 4fe95b6ae6..c592ead92a 100644 --- a/mobile/lib/generated/intl/messages_sv.dart +++ b/mobile/lib/generated/intl/messages_sv.dart @@ -77,12 +77,14 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagar')}"; - static String m68(email) => "Bekräfta ${email}"; + static String m67(count) => "Bevarar ${count} minnen..."; - static String m69(email) => + static String m69(email) => "Bekräfta ${email}"; + + static String m70(email) => "Vi har skickat ett e-postmeddelande till ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} år sedan', other: '${count} år sedan')}"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -307,6 +309,8 @@ class MessageLookup extends MessageLookupByLibrary { "linkHasExpired": MessageLookupByLibrary.simpleMessage("Länk har upphört att gälla"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Aldrig"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Lås"), "logInLabel": MessageLookupByLibrary.simpleMessage("Logga in"), "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( @@ -314,8 +318,6 @@ class MessageLookup extends MessageLookupByLibrary { "loginTerms": MessageLookupByLibrary.simpleMessage( "Genom att klicka på logga in godkänner jag användarvillkoren och våran integritetspolicy"), "logout": MessageLookupByLibrary.simpleMessage("Logga ut"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Förlorad enhet?"), "manage": MessageLookupByLibrary.simpleMessage("Hantera"), "manageLink": MessageLookupByLibrary.simpleMessage("Hantera länk"), @@ -506,6 +508,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tvåfaktorskonfiguration"), "update": MessageLookupByLibrary.simpleMessage("Uppdatera"), "upgrade": MessageLookupByLibrary.simpleMessage("Uppgradera"), + "uploadingMultipleMemories": m67, + "uploadingSingleMemory": + MessageLookupByLibrary.simpleMessage("Bevarar 1 minne..."), "useAsCover": MessageLookupByLibrary.simpleMessage("Använd som omslag"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Använd återställningsnyckel"), @@ -514,7 +519,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Bekräfta"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bekräfta e-postadress"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyPassword": MessageLookupByLibrary.simpleMessage("Bekräfta lösenord"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( @@ -526,12 +531,12 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Visa återställningsnyckel"), "viewer": MessageLookupByLibrary.simpleMessage("Bildvy"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Svagt"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Välkommen tillbaka!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Nyheter"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, avbryt"), "yesConvertToViewer": diff --git a/mobile/lib/generated/intl/messages_ta.dart b/mobile/lib/generated/intl/messages_ta.dart index 30c00c6d72..4721af1166 100644 --- a/mobile/lib/generated/intl/messages_ta.dart +++ b/mobile/lib/generated/intl/messages_ta.dart @@ -48,6 +48,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("தவறான மின்னஞ்சல் முகவரி"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "இந்த தகவலுடன் தயவுசெய்து எங்களுக்கு உதவுங்கள்"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "verify": MessageLookupByLibrary.simpleMessage("சரிபார்க்கவும்") }; } diff --git a/mobile/lib/generated/intl/messages_te.dart b/mobile/lib/generated/intl/messages_te.dart index 63ee905c5e..f81a07f319 100644 --- a/mobile/lib/generated/intl/messages_te.dart +++ b/mobile/lib/generated/intl/messages_te.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_th.dart b/mobile/lib/generated/intl/messages_th.dart index 4aa23c9dd7..cfffd8eca2 100644 --- a/mobile/lib/generated/intl/messages_th.dart +++ b/mobile/lib/generated/intl/messages_th.dart @@ -47,7 +47,7 @@ class MessageLookup extends MessageLookupByLibrary { usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "ใช้ไป ${usedAmount} ${usedStorageUnit} จาก ${totalAmount} ${totalStorageUnit}"; - static String m69(email) => "เราได้ส่งจดหมายไปยัง ${email}"; + static String m70(email) => "เราได้ส่งจดหมายไปยัง ${email}"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -206,11 +206,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ลิงก์หมดอายุแล้ว"), "loadMessage9": MessageLookupByLibrary.simpleMessage( "เราใช้ Xchacha20Poly1305 เพื่อเข้ารหัสข้อมูลของคุณอย่างปลอดภัย"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "logInLabel": MessageLookupByLibrary.simpleMessage("เข้าสู่ระบบ"), "loginTerms": MessageLookupByLibrary.simpleMessage( "โดยการคลิกเข้าสู่ระบบ ฉันยอมรับเงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "manageParticipants": MessageLookupByLibrary.simpleMessage("จัดการ"), "map": MessageLookupByLibrary.simpleMessage("แผนที่"), "maps": MessageLookupByLibrary.simpleMessage("แผนที่"), @@ -351,7 +351,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ดูคีย์การกู้คืน"), "waitingForWifi": MessageLookupByLibrary.simpleMessage("กำลังรอ WiFi..."), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("อ่อน"), "welcomeBack": MessageLookupByLibrary.simpleMessage("ยินดีต้อนรับกลับมา!"), diff --git a/mobile/lib/generated/intl/messages_ti.dart b/mobile/lib/generated/intl/messages_ti.dart index f366d5665f..9230d04a03 100644 --- a/mobile/lib/generated/intl/messages_ti.dart +++ b/mobile/lib/generated/intl/messages_ti.dart @@ -22,7 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on") + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team") }; } diff --git a/mobile/lib/generated/intl/messages_tr.dart b/mobile/lib/generated/intl/messages_tr.dart index bbf48e96b6..a61436b88e 100644 --- a/mobile/lib/generated/intl/messages_tr.dart +++ b/mobile/lib/generated/intl/messages_tr.dart @@ -85,6 +85,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m25(newEmail) => "E-posta ${newEmail} olarak değiştirildi"; + static String m26(email) => + "${email}, Ente hesabı bulunmamaktadır.\n\nOnlarla fotoğraf paylaşımı için bir davet gönder."; + static String m27(count, formattedNumber) => "Bu cihazdaki ${Intl.plural(count, one: '1 file', other: '${formattedNumber} dosya')} güvenli bir şekilde yedeklendi"; @@ -178,17 +181,17 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: 'gün', one: '1 gün', other: '${count} gün')}"; - static String m67(endDate) => "${endDate} tarihine kadar geçerli"; + static String m68(endDate) => "${endDate} tarihine kadar geçerli"; - static String m68(email) => "${email} doğrula"; + static String m69(email) => "${email} doğrula"; - static String m69(email) => + static String m70(email) => "E-postayı ${email} adresine gönderdik"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} yıl önce', other: '${count} yıl önce')}"; - static String m71(storageSaved) => + static String m72(storageSaved) => "Başarılı bir şekilde ${storageSaved} alanını boşalttınız!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -432,6 +435,8 @@ class MessageLookup extends MessageLookupByLibrary { "İki adımlı kimlik doğrulamasını devre dışı bırakmak istediğinize emin misiniz?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Hesap silme işlemini onayla"), + "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( + "Evet, bu hesabı ve verilerini tüm uygulamalardan kalıcı olarak silmek istiyorum."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Şifrenizi onaylayın"), "confirmPlanChange": MessageLookupByLibrary.simpleMessage( @@ -591,6 +596,7 @@ class MessageLookup extends MessageLookupByLibrary { "eligible": MessageLookupByLibrary.simpleMessage("uygun"), "email": MessageLookupByLibrary.simpleMessage("E-Posta"), "emailChangedTo": m25, + "emailNoEnteAccount": m26, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-posta doğrulama"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -611,6 +617,8 @@ class MessageLookup extends MessageLookupByLibrary { "Fatura başarıyla güncellendi"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "Varsayılan olarak uçtan uca şifrelenmiş"), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente fotoğrafları saklamak için iznine ihtiyaç duyuyor"), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Aileniz de planınıza eklenebilir."), "enterAlbumName": @@ -834,6 +842,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingModel": MessageLookupByLibrary.simpleMessage("Modeller indiriliyor..."), "localGallery": MessageLookupByLibrary.simpleMessage("Yerel galeri"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("Konum"), "locationName": MessageLookupByLibrary.simpleMessage("Konum Adı"), "locationTagFeatureDescription": MessageLookupByLibrary.simpleMessage( @@ -855,8 +865,6 @@ class MessageLookup extends MessageLookupByLibrary { "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage( "Tam ekranda görüntülemek için bir öğeye uzun basın"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), "lostDevice": MessageLookupByLibrary.simpleMessage("Cihazı kayıp mı ettiniz?"), "machineLearning": @@ -1229,6 +1237,8 @@ class MessageLookup extends MessageLookupByLibrary { "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Yalnızca istediğiniz kişilerle paylaşın"), "shareTextConfirmOthersVerificationID": m2, + "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( + "Ente kullanıcısı olmayanlar için paylaş"), "shareWithPeopleSectionTitle": m54, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("İlk albümünüzü paylaşın"), @@ -1425,7 +1435,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Seçilen fotoğrafı kullan"), "usedSpace": MessageLookupByLibrary.simpleMessage("Kullanılan alan"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Doğrulama başarısız oldu, lütfen tekrar deneyin"), @@ -1434,7 +1444,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Doğrula"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-posta adresini doğrulayın"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Doğrula"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Şifrenizi doğrulayın"), @@ -1467,12 +1477,12 @@ class MessageLookup extends MessageLookupByLibrary { "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage( "Henüz sahibi olmadığınız fotoğraf ve albümlerin düzenlenmesini desteklemiyoruz"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("Zayıf"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Tekrardan hoşgeldin!"), "yearly": MessageLookupByLibrary.simpleMessage("Yıllık"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("Evet"), "yesCancel": MessageLookupByLibrary.simpleMessage("Evet, iptal et"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1503,7 +1513,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Kendinizle paylaşamazsınız"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("Arşivlenmiş öğeniz yok."), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Hesabınız silindi"), "yourMap": MessageLookupByLibrary.simpleMessage("Haritalarınız"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 0d998a8be7..2a4e3b77d4 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -189,18 +189,18 @@ class MessageLookup extends MessageLookupByLibrary { static String m66(count) => "${Intl.plural(count, zero: '', one: '1天', other: '${count} 天')}"; - static String m72(count) => "正在保存 ${count} 个回忆..."; + static String m67(count) => "正在保存 ${count} 个回忆..."; - static String m67(endDate) => "有效期至 ${endDate}"; + static String m68(endDate) => "有效期至 ${endDate}"; - static String m68(email) => "验证 ${email}"; + static String m69(email) => "验证 ${email}"; - static String m69(email) => "我们已经发送邮件到 ${email}"; + static String m70(email) => "我们已经发送邮件到 ${email}"; - static String m70(count) => + static String m71(count) => "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; - static String m71(storageSaved) => "您已成功释放了 ${storageSaved}!"; + static String m72(storageSaved) => "您已成功释放了 ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -724,7 +724,7 @@ class MessageLookup extends MessageLookupByLibrary { "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage("您输入的恢复密钥不正确"), "incorrectRecoveryKeyTitle": - MessageLookupByLibrary.simpleMessage("不正确的恢复密钥"), + MessageLookupByLibrary.simpleMessage("恢复密钥不正确"), "indexedItems": MessageLookupByLibrary.simpleMessage("已索引项目"), "indexingIsPaused": MessageLookupByLibrary.simpleMessage("索引已暂停。当设备准备就绪时,它将自动恢复。"), @@ -797,6 +797,8 @@ class MessageLookup extends MessageLookupByLibrary { "loadingMessage": MessageLookupByLibrary.simpleMessage("正在加载您的照片..."), "loadingModel": MessageLookupByLibrary.simpleMessage("正在下载模型..."), "localGallery": MessageLookupByLibrary.simpleMessage("本地相册"), + "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( + "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team"), "location": MessageLookupByLibrary.simpleMessage("地理位置"), "locationName": MessageLookupByLibrary.simpleMessage("地点名称"), "locationTagFeatureDescription": @@ -818,8 +820,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("长按电子邮件以验证端到端加密。"), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage("长按一个项目来全屏查看"), - "loopVideoOff": MessageLookupByLibrary.simpleMessage("Loop video off"), - "loopVideoOn": MessageLookupByLibrary.simpleMessage("Loop video on"), + "loopVideoOff": MessageLookupByLibrary.simpleMessage("循环播放视频关闭"), + "loopVideoOn": MessageLookupByLibrary.simpleMessage("循环播放视频开启"), "lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"), "machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"), "magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"), @@ -1342,7 +1344,7 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("升级"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("正在将文件上传到相册..."), - "uploadingMultipleMemories": m72, + "uploadingMultipleMemories": m67, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("正在保存 1 个回忆..."), "upto50OffUntil4thDec": @@ -1355,13 +1357,13 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("使用恢复密钥"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("使用所选照片"), "usedSpace": MessageLookupByLibrary.simpleMessage("已用空间"), - "validTill": m67, + "validTill": m68, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage("验证失败,请重试"), "verificationId": MessageLookupByLibrary.simpleMessage("验证 ID"), "verify": MessageLookupByLibrary.simpleMessage("验证"), "verifyEmail": MessageLookupByLibrary.simpleMessage("验证电子邮件"), - "verifyEmailID": m68, + "verifyEmailID": m69, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("验证"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("验证通行密钥"), "verifyPassword": MessageLookupByLibrary.simpleMessage("验证密码"), @@ -1389,12 +1391,12 @@ class MessageLookup extends MessageLookupByLibrary { "weAreOpenSource": MessageLookupByLibrary.simpleMessage("我们是开源的 !"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": MessageLookupByLibrary.simpleMessage("我们不支持编辑您尚未拥有的照片和相册"), - "weHaveSendEmailTo": m69, + "weHaveSendEmailTo": m70, "weakStrength": MessageLookupByLibrary.simpleMessage("弱"), "welcomeBack": MessageLookupByLibrary.simpleMessage("欢迎回来!"), "whatsNew": MessageLookupByLibrary.simpleMessage("更新日志"), "yearly": MessageLookupByLibrary.simpleMessage("每年"), - "yearsAgo": m70, + "yearsAgo": m71, "yes": MessageLookupByLibrary.simpleMessage("是"), "yesCancel": MessageLookupByLibrary.simpleMessage("是的,取消"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage("是的,转换为查看者"), @@ -1420,7 +1422,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("莫开玩笑,您不能与自己分享"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("您没有任何存档的项目。"), - "youHaveSuccessfullyFreedUp": m71, + "youHaveSuccessfullyFreedUp": m72, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("您的账户已删除"), "yourMap": MessageLookupByLibrary.simpleMessage("您的地图"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 2961014e90..12b927ec1b 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -9484,6 +9484,16 @@ class S { args: [], ); } + + /// `Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team` + String get localSyncErrorMessage { + return Intl.message( + 'Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team', + name: 'localSyncErrorMessage', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_ar.arb b/mobile/lib/l10n/intl_ar.arb index 86273581a6..7d683953f6 100644 --- a/mobile/lib/l10n/intl_ar.arb +++ b/mobile/lib/l10n/intl_ar.arb @@ -23,5 +23,6 @@ "noRecoveryKeyNoDecryption": "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية", "verifyEmail": "التحقق من البريد الإلكتروني", "toResetVerifyEmail": "لإعادة تعيين كلمة المرور، يرجى التحقق من بريدك الإلكتروني أولاً.", - "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية." + "ackPasswordLostWarning": "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية.", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_bg.arb b/mobile/lib/l10n/intl_bg.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_bg.arb +++ b/mobile/lib/l10n/intl_bg.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ca.arb b/mobile/lib/l10n/intl_ca.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_ca.arb +++ b/mobile/lib/l10n/intl_ca.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_cs.arb b/mobile/lib/l10n/intl_cs.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_cs.arb +++ b/mobile/lib/l10n/intl_cs.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_da.arb b/mobile/lib/l10n/intl_da.arb index e4b2cc656b..ef16b73c18 100644 --- a/mobile/lib/l10n/intl_da.arb +++ b/mobile/lib/l10n/intl_da.arb @@ -84,5 +84,6 @@ "longPressAnEmailToVerifyEndToEndEncryption": "Langt tryk på en e-mail for at bekræfte slutningen af krypteringen.", "developerSettingsWarning": "Er du sikker på, at du vil ændre udviklerindstillingerne?", "next": "Næste", - "enterPin": "Indtast PIN" + "enterPin": "Indtast PIN", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 0f3228b66e..86526b1fd5 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Um die App-Sperre zu aktivieren, konfiguriere bitte den Gerätepasscode oder die Bildschirmsperre in den Systemeinstellungen.", "authToViewPasskey": "Bitte authentifizieren, um deinen Passkey zu sehen", "loopVideoOn": "Videoschleife an", - "loopVideoOff": "Videoschleife aus" + "loopVideoOff": "Videoschleife aus", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_el.arb b/mobile/lib/l10n/intl_el.arb index ce8b1a1a54..01d4d32316 100644 --- a/mobile/lib/l10n/intl_el.arb +++ b/mobile/lib/l10n/intl_el.arb @@ -1,4 +1,5 @@ { "@@locale ": "en", - "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας" + "enterYourEmailAddress": "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 8b029817b7..7b1a60ef36 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -937,7 +937,7 @@ "encryptingBackup": "Encrypting backup...", "syncStopped": "Sync stopped", "syncProgress": "{completed}/{total} memories preserved", - "uploadingMultipleMemories" : "Preserving {count} memories...", + "uploadingMultipleMemories": "Preserving {count} memories...", "uploadingSingleMemory": "Preserving 1 memory...", "@syncProgress": { "description": "Text to tell user how many memories have been preserved", @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", "authToViewPasskey": "Please authenticate to view your passkey", "loopVideoOn": "Loop video on", - "loopVideoOff": "Loop video off" + "loopVideoOff": "Loop video off", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 3131fb37eb..67072a18f1 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1286,5 +1286,6 @@ "removePublicLinks": "Eliminar enlaces públicos", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Esto eliminará los enlaces públicos de todos los enlaces rápidos seleccionados.", "guestView": "Vista de invitado", - "guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema." + "guestViewEnablePreSteps": "Para habilitar la vista de invitados, por favor configure el código de acceso del dispositivo o el bloqueo de pantalla en los ajustes de su sistema.", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_et.arb b/mobile/lib/l10n/intl_et.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_et.arb +++ b/mobile/lib/l10n/intl_et.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fa.arb b/mobile/lib/l10n/intl_fa.arb index 8d957cf574..757fecfc8b 100644 --- a/mobile/lib/l10n/intl_fa.arb +++ b/mobile/lib/l10n/intl_fa.arb @@ -307,5 +307,6 @@ "developerSettings": "تنظیمات توسعه‌دهنده", "search": "جستجو", "whatsNew": "تغییرات جدید", - "reviewSuggestions": "مرور پیشنهادها" + "reviewSuggestions": "مرور پیشنهادها", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 2f427a58a7..dfe8688fee 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1310,5 +1310,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Pour activer le verrouillage d'application, veuillez configurer le code d'accès de l'appareil ou le verrouillage de l'écran dans les paramètres de votre système.", "authToViewPasskey": "Veuillez vous authentifier pour afficher votre clé de récupération", "loopVideoOn": "Vidéo en boucle activée", - "loopVideoOff": "Vidéo en boucle désactivée" + "loopVideoOff": "Vidéo en boucle désactivée", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_gu.arb b/mobile/lib/l10n/intl_gu.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_gu.arb +++ b/mobile/lib/l10n/intl_gu.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_he.arb b/mobile/lib/l10n/intl_he.arb index e2a844a9a8..3715b565aa 100644 --- a/mobile/lib/l10n/intl_he.arb +++ b/mobile/lib/l10n/intl_he.arb @@ -818,5 +818,6 @@ "addPhotos": "הוסף תמונות", "create": "צור", "viewAll": "הצג הכל", - "hiding": "מחביא..." + "hiding": "מחביא...", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_hi.arb b/mobile/lib/l10n/intl_hi.arb index b79d9682f2..9778ab5446 100644 --- a/mobile/lib/l10n/intl_hi.arb +++ b/mobile/lib/l10n/intl_hi.arb @@ -48,5 +48,6 @@ "sorry": "क्षमा करें!", "noRecoveryKeyNoDecryption": "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है", "verifyEmail": "ईमेल सत्यापित करें", - "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।" + "toResetVerifyEmail": "अपना पासवर्ड रीसेट करने के लिए, कृपया पहले अपना ईमेल सत्यापित करें।", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index 2a5c73f456..a8ad653627 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1121,5 +1121,6 @@ "rotate": "Putar", "left": "Kiri", "right": "Kanan", - "whatsNew": "Hal yang baru" + "whatsNew": "Hal yang baru", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 09f8b13d51..f8b3ce27b5 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1275,5 +1275,6 @@ "guestViewEnablePreSteps": "Per abilitare la vista ospite, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema.", "appLockDescriptions": "Scegli tra la schermata di blocco predefinita del dispositivo e una schermata di blocco personalizzata con PIN o password.", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Per abilitare il blocco dell'app, configura il codice di accesso del dispositivo o il blocco schermo nelle impostazioni di sistema.", - "authToViewPasskey": "Autenticati per visualizzare le tue passkey" + "authToViewPasskey": "Autenticati per visualizzare le tue passkey", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index eabbed8c14..e51d3afd49 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "アプリのロックを有効にするには、システム設定でデバイスのパスコードまたは画面ロックを設定してください。", "authToViewPasskey": "パスキーを表示するには認証してください", "loopVideoOn": "ビデオのループをオン", - "loopVideoOff": "ビデオのループをオフ" + "loopVideoOff": "ビデオのループをオフ", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_km.arb b/mobile/lib/l10n/intl_km.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_km.arb +++ b/mobile/lib/l10n/intl_km.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ko.arb b/mobile/lib/l10n/intl_ko.arb index 06c81195f7..b340f0746a 100644 --- a/mobile/lib/l10n/intl_ko.arb +++ b/mobile/lib/l10n/intl_ko.arb @@ -12,5 +12,6 @@ "feedback": "피드백", "confirmAccountDeletion": "계정 삭제 확인", "deleteAccountPermanentlyButton": "계정을 영구적으로 삭제", - "yourAccountHasBeenDeleted": "계정이 삭제되었습니다." + "yourAccountHasBeenDeleted": "계정이 삭제되었습니다.", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index b1c04835b0..75c13733b7 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Om appvergrendeling in te schakelen, moet u een toegangscode of schermvergrendeling instellen in uw systeeminstellingen.", "authToViewPasskey": "Verifieer uzelf om uw toegangssleutel te bekijken", "loopVideoOn": "Video in lus afspelen aan", - "loopVideoOff": "Video in lus afspelen uit" + "loopVideoOff": "Video in lus afspelen uit", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_no.arb b/mobile/lib/l10n/intl_no.arb index 8a949cfec1..0bb6c5e7b1 100644 --- a/mobile/lib/l10n/intl_no.arb +++ b/mobile/lib/l10n/intl_no.arb @@ -372,5 +372,6 @@ "advanced": "Avansert", "general": "Generelt", "security": "Sikkerhet", - "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din" + "authToViewYourRecoveryKey": "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 0a4ac4c25b..ac0347dfff 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Aby włączyć blokadę aplikacji, należy skonfigurować hasło urządzenia lub blokadę ekranu w ustawieniach systemu.", "authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić swój klucz dostępu", "loopVideoOn": "Pętla wideo włączona", - "loopVideoOff": "Pętla wideo wyłączona" + "loopVideoOff": "Pętla wideo wyłączona", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 6939269f5e..0878fac316 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Para ativar o bloqueio do app, configure uma senha no dispositivo ou tela de bloqueio nas configurações do sistema.", "authToViewPasskey": "Por favor, autentique-se para ver sua chave de acesso", "loopVideoOn": "Repetir vídeo ligado", - "loopVideoOff": "Repetir vídeo desligado" + "loopVideoOff": "Repetir vídeo desligado", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index b9a2532e2d..430999af2d 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1302,5 +1302,6 @@ "removePublicLinks": "Удалить публичные ссылки", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Это удалит публичные ссылки на все выбранные быстрые ссылки.", "guestView": "Гостевой вид", - "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы." + "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_sv.arb b/mobile/lib/l10n/intl_sv.arb index 5e3023d303..e0c6f0fba9 100644 --- a/mobile/lib/l10n/intl_sv.arb +++ b/mobile/lib/l10n/intl_sv.arb @@ -423,5 +423,6 @@ } }, "next": "Nästa", - "guestView": "Gästvy" + "guestView": "Gästvy", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ta.arb b/mobile/lib/l10n/intl_ta.arb index d3d26e203c..d582bb944d 100644 --- a/mobile/lib/l10n/intl_ta.arb +++ b/mobile/lib/l10n/intl_ta.arb @@ -15,5 +15,6 @@ "confirmDeletePrompt": "ஆம், எல்லா செயலிகளிலும் இந்தக் கணக்கையும் அதன் தரவையும் நிரந்தரமாக நீக்க விரும்புகிறேன்.", "confirmAccountDeletion": "கணக்கு நீக்குதலை உறுதிப்படுத்தவும்", "deleteAccountPermanentlyButton": "கணக்கை நிரந்தரமாக நீக்கவும்", - "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை" + "deleteReason1": "எனக்கு தேவையான ஒரு முக்கிய அம்சம் இதில் இல்லை", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_te.arb b/mobile/lib/l10n/intl_te.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_te.arb +++ b/mobile/lib/l10n/intl_te.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_th.arb b/mobile/lib/l10n/intl_th.arb index 3cce924a17..05e317f7fe 100644 --- a/mobile/lib/l10n/intl_th.arb +++ b/mobile/lib/l10n/intl_th.arb @@ -296,5 +296,6 @@ "description": "Label for the map view" }, "maps": "แผนที่", - "enableMaps": "เปิดใช้งานแผนที่" + "enableMaps": "เปิดใช้งานแผนที่", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ti.arb b/mobile/lib/l10n/intl_ti.arb index c8494661c6..87b8ff36b4 100644 --- a/mobile/lib/l10n/intl_ti.arb +++ b/mobile/lib/l10n/intl_ti.arb @@ -1,3 +1,4 @@ { - "@@locale ": "en" + "@@locale ": "en", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 0aa4618c48..27e5326e23 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1171,5 +1171,6 @@ "invalidEndpoint": "Geçersiz uç nokta", "invalidEndpointMessage": "Üzgünüz, girdiğiniz uç nokta geçersiz. Lütfen geçerli bir uç nokta girin ve tekrar deneyin.", "endpointUpdatedMessage": "Fatura başarıyla güncellendi", - "customEndpoint": "{endpoint}'e bağlanıldı" + "customEndpoint": "{endpoint}'e bağlanıldı", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 59d21b1098..c1226b1730 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1314,5 +1314,6 @@ "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "要启用应用锁,请在系统设置中设置设备密码或屏幕锁。", "authToViewPasskey": "请验证身份以查看您的通行密钥", "loopVideoOn": "循环播放视频开启", - "loopVideoOff": "循环播放视频关闭" + "loopVideoOff": "循环播放视频关闭", + "localSyncErrorMessage": "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team" } \ No newline at end of file diff --git a/mobile/lib/ui/home/loading_photos_widget.dart b/mobile/lib/ui/home/loading_photos_widget.dart index 40abc887bc..847ffced7e 100644 --- a/mobile/lib/ui/home/loading_photos_widget.dart +++ b/mobile/lib/ui/home/loading_photos_widget.dart @@ -201,8 +201,7 @@ class _LoadingPhotosWidgetState extends State { context: context, title: S.of(context).oops, icon: Icons.error_outline_outlined, - body: - "Looks like something went wrong since local photos sync is taking more time than expected. Please reach out to our support team", + body: S.of(context).localSyncErrorMessage, isDismissible: true, buttons: [ ButtonWidget( From 70dada90b291321122b2352e472e0ea5f05c983f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:01:13 +0530 Subject: [PATCH 1165/1179] [web][meta] Ignore stale lint runs on PR push https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-concurrency-and-the-default-behavior --- .github/workflows/web-lint.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/web-lint.yml b/.github/workflows/web-lint.yml index c64463384c..6eb2454a98 100644 --- a/.github/workflows/web-lint.yml +++ b/.github/workflows/web-lint.yml @@ -7,6 +7,11 @@ on: - "web/**" - ".github/workflows/web-lint.yml" +# Cancel in-progress lint runs when a new commit is pushed. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: lint: runs-on: ubuntu-latest From b812070ae1727e0f555517a39a6a60f3f8f03814 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 10 Sep 2024 07:33:48 +0000 Subject: [PATCH 1166/1179] New Crowdin translations by GitHub Action --- .../base/locales/de-DE/translation.json | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index 8774f93929..1ecb2c9b40 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -41,7 +41,7 @@ "REFERRAL_CODE_HINT": "Wie hast du von Ente erfahren? (optional)", "REFERRAL_INFO": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", "PASSPHRASE_MATCH_ERROR": "Die Passwörter stimmen nicht überein", - "create_albums": "", + "create_albums": "Alben erstellen", "CREATE_COLLECTION": "Neues Album", "ENTER_ALBUM_NAME": "Albumname", "CLOSE_OPTION": "Schließen (Esc)", @@ -105,8 +105,8 @@ "SESSION_EXPIRED": "Sitzung abgelaufen", "PASSWORD_GENERATION_FAILED": "Dein Browser konnte keinen starken Schlüssel generieren, der den Verschlüsselungsstandards des Entes entspricht, bitte versuche die mobile App oder einen anderen Browser zu verwenden", "CHANGE_PASSWORD": "Passwort ändern", - "password_changed_elsewhere": "", - "password_changed_elsewhere_message": "", + "password_changed_elsewhere": "Passwort anderswo geändert", + "password_changed_elsewhere_message": "Bitte melde dich erneut auf diesem Gerät an, um dein neues Passwort zur Authentifizierung zu verwenden.", "GO_BACK": "Zurück", "RECOVERY_KEY": "Wiederherstellungsschlüssel", "SAVE_LATER": "Auf später verschieben", @@ -154,10 +154,10 @@ "CURRENT_USAGE": "Aktuelle Nutzung ist {{usage}}", "TWO_MONTHS_FREE": "Erhalte 2 Monate kostenlos bei Jahresabonnements", "POPULAR": "Beliebt", - "free_plan_option": "", - "free_plan_description": "", + "free_plan_option": "Mit dem kostenlosen Tarif fortfahren", + "free_plan_description": "{{storage}} für immer kostenlos", "active": "Aktiv", - "subscription_info_free": "", + "subscription_info_free": "Du bist im kostenlosen Tarif", "subscription_info_family": "Sie haben einen Familienplan verwaltet von", "subscription_info_expired": "Dein Abonnement ist abgelaufen, bitte erneuere es", "subscription_info_renewal_cancelled": "Ihr Abo endet am {{date, date}}", @@ -227,7 +227,7 @@ "people": "Personen", "indexing_scheduled": "Indizierung ist geplant...", "indexing_photos": "Indiziere Fotos ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", - "indexing_fetching": "", + "indexing_fetching": "Indizes abrufen ({{nSyncedFiles, number}} / {{nTotalFiles, number}})", "indexing_people": "Indiziere Personen in {{nSyncedFiles, number}} Fotos...", "indexing_done": "{{nSyncedFiles, number}} Fotos wurden indiziert", "UNIDENTIFIED_FACES": "Unidentifizierte Gesichter", @@ -260,7 +260,7 @@ "SCAN_QR_CODE": "QR‐Code stattdessen scannen", "ENABLE_TWO_FACTOR": "Zwei-Faktor-Authentifizierung aktivieren", "enable": "Aktivieren", - "enabled": "", + "enabled": "Aktiviert", "LOST_DEVICE": "Zwei-Faktor-Gerät verloren", "INCORRECT_CODE": "Falscher Code", "TWO_FACTOR_INFO": "Fügen Sie eine zusätzliche Sicherheitsebene hinzu, indem Sie mehr als Ihre E-Mail und Ihr Passwort benötigen, um sich mit Ihrem Account anzumelden", @@ -276,9 +276,9 @@ "TWO_FACTOR_DISABLE_FAILED": "Fehler beim Deaktivieren des zweiten Faktors, bitte versuchen Sie es erneut", "EXPORT_DATA": "Daten exportieren", "select_folder": "Ordner auswählen", - "select_zips": "", - "faq": "", - "takeout_hint": "", + "select_zips": "Zip-Dateien auswählen", + "faq": "FAQ", + "takeout_hint": "Entpacke alle Zip-Dateien in den gleichen Ordner und lade das hoch. Oder lade die Zip-Datei direkt hoch. Siehe FAQ für Details.", "DESTINATION": "Zielort", "START": "Start", "LAST_EXPORT_TIME": "Letztes Exportdatum", @@ -291,12 +291,12 @@ "LIVE_PHOTOS_DETECTED": "Die Foto- und Videodateien deiner Live-Fotos wurden in einer einzigen Datei zusammengeführt", "RETRY_FAILED": "Fehlgeschlagene Uploads erneut probieren", "FAILED_UPLOADS": "Fehlgeschlagene Uploads ", - "failed_uploads_hint": "", + "failed_uploads_hint": "Es wird eine Option geben, diese zu wiederholen, wenn der Upload beendet ist", "SKIPPED_FILES": "Ignorierte Uploads", "THUMBNAIL_GENERATION_FAILED_UPLOADS": "Das Vorschaubild konnte nicht erzeugt werden", "UNSUPPORTED_FILES": "Nicht unterstützte Dateien", "SUCCESSFUL_UPLOADS": "Erfolgreiche Uploads", - "SKIPPED_INFO": "", + "SKIPPED_INFO": "Diese wurden übersprungen, da es Dateien mit gleichem Namen und Inhalt im selben Album gibt", "UNSUPPORTED_INFO": "Ente unterstützt diese Dateiformate noch nicht", "BLOCKED_UPLOADS": "Blockierte Uploads", "INPROGRESS_METADATA_EXTRACTION": "In Bearbeitung", @@ -409,7 +409,7 @@ "DOWNLOAD_UPLOAD_LOGS": "Debug-Logs", "file": "Datei", "folder": "Ordner", - "google_takeout": "", + "google_takeout": "Google Takeout", "DEDUPLICATE_FILES": "Duplikate bereinigen", "NO_DUPLICATES_FOUND": "Du hast keine Duplikate, die gelöscht werden können", "FILES": "dateien", @@ -474,21 +474,21 @@ "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

Du hast sowohl Dateien als auch Ordner in das Ente-Fenster gezogen.

Bitte wähle entweder nur Dateien oder nur Ordner aus, wenn separate Alben erstellt werden sollen

", "CHOSE_THEME": "Design auswählen", "more_details": "Weitere Details", - "ml_search": "", - "ml_search_description": "", - "ml_search_footnote": "", - "indexing": "", - "processed": "", - "indexing_status_running": "", - "indexing_status_fetching": "", - "indexing_status_scheduled": "", - "indexing_status_done": "", - "ml_search_disable": "", - "ml_search_disable_confirm": "", - "ml_consent": "", - "ml_consent_title": "", - "ml_consent_description": "", - "ml_consent_confirmation": "", + "ml_search": "Maschinelles Lernen", + "ml_search_description": "Ente unterstützt geräteinternes maschinelles Lernen für Gesichtserkennung, magische Suche und andere erweiterte Suchfunktionen", + "ml_search_footnote": "Die magische Suche erlaubt es, Fotos nach ihrem Inhalt zu durchsuchen, z. B. \"Auto\", \"rotes Auto\", \"Ferrari\"", + "indexing": "Indiziere", + "processed": "Verarbeitet", + "indexing_status_running": "Läuft", + "indexing_status_fetching": "Abrufen", + "indexing_status_scheduled": "Geplant", + "indexing_status_done": "Fertig", + "ml_search_disable": "Maschinelles Lernen deaktivieren", + "ml_search_disable_confirm": "Möchtest du maschinelles Lernen auf allen deinen Geräten deaktivieren?", + "ml_consent": "Maschinelles Lernen aktivieren", + "ml_consent_title": "Maschinelles Lernen aktivieren?", + "ml_consent_description": "

Wenn du das maschinelle Lernen aktivierst, extrahiert Ente Informationen wie die Gesichtsgeometrie aus Dateien, auch aus denen, die mit dir geteilt wurden.

Dies geschieht auf deinem Gerät, und alle generierten biometrischen Informationen werden Ende-zu-Ende verschlüsselt.

Bitte klicke hier für weitere Details zu dieser Funktion in unserer Datenschutzerklärung

", + "ml_consent_confirmation": "Ich verstehe und möchte maschinelles Lernen aktivieren", "labs": "Experimente", "YOURS": "von dir", "passphrase_strength_weak": "Passwortstärke: Schwach", @@ -541,7 +541,7 @@ "not_listed": "Mein Grund ist nicht aufgeführt" }, "delete_account_feedback_label": "Wir bedauern sehr, dass uns verlässt. Bitte hilf uns besser zu werden, indem du uns sagst warum du gehst.", - "delete_account_feedback_placeholder": "", + "delete_account_feedback_placeholder": "Feedback", "delete_account_confirm_checkbox_label": "Ja, ich möchte dieses Konto und alle enthaltenen Daten endgültig und unwiderruflich löschen", "delete_account_confirm": "Kontolöschung bestätigen", "delete_account_confirm_message": "

Dieses Konto ist mit anderen Ente-Apps verknüpft, falls du welche verwendest.

Deine hochgeladenen Daten werden in allen Ente-Apps zur Löschung vorgemerkt und dein Konto wird endgültig gelöscht.

", @@ -628,22 +628,22 @@ "passkey_add_failed": "Ein Passkey konnte nicht hinzugefügt werden", "passkey_login_failed": "Passkey-Anmeldung fehlgeschlagen", "passkey_login_invalid_url": "Die Anmelde-URL ist ungültig.", - "passkey_login_already_claimed_session": "", + "passkey_login_already_claimed_session": "Diese Sitzung wurde bereits verifiziert.", "passkey_login_generic_error": "Ein Fehler trat auf beim Anmelden mit dem Passkey auf.", - "passkey_login_credential_hint": "", + "passkey_login_credential_hint": "Wenn sich deine Passkeys auf einem anderen Gerät befinden, kannst du diese Seite auf diesem Gerät öffnen, um sie zu verifizieren.", "passkeys_not_supported": "Passkeys werden in diesem Browser nicht unterstützt", "try_again": "Erneut versuchen", "check_status": "Status überprüfen", "passkey_login_instructions": "Folge den Schritten in deinem Browser, um mit dem Anmelden fortzufahren.", "passkey_login": "Mit Passkey anmelden", "passkey": "Passkey", - "passkey_verify_description": "", + "passkey_verify_description": "Überprüfe deinen Passkey, um dich in dein Konto einzuloggen.", "waiting_for_verification": "Warte auf Bestätigung...", "verification_still_pending": "Verifizierung steht noch aus", "passkey_verified": "Passwort verifiziert", "redirecting_back_to_app": "Sie werden zurück zur App weitergeleitet...", "redirect_close_instructions": "Sie werden zurück zur App weitergeleitet.", - "redirect_again": "", + "redirect_again": "Erneut weiterleiten", "autogenerated_first_album_name": "Mein erstes Album", "autogenerated_default_album_name": "Neues Album", "developer_settings": "Entwicklereinstellungen", From 2d4dc568fbeb78d321cb42131b1b5995d423954d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:07:34 +0530 Subject: [PATCH 1167/1179] [web] Translation cleanup --- web/apps/photos/src/pages/shared-albums.tsx | 6 +++--- web/packages/base/locales/ar-SA/translation.json | 4 ++-- web/packages/base/locales/bg-BG/translation.json | 4 ++-- web/packages/base/locales/ca-ES/translation.json | 4 ++-- web/packages/base/locales/de-DE/translation.json | 4 ++-- web/packages/base/locales/el-GR/translation.json | 4 ++-- web/packages/base/locales/en-US/translation.json | 4 ++-- web/packages/base/locales/es-ES/translation.json | 4 ++-- web/packages/base/locales/et-EE/translation.json | 4 ++-- web/packages/base/locales/fa-IR/translation.json | 4 ++-- web/packages/base/locales/fi-FI/translation.json | 4 ++-- web/packages/base/locales/fr-FR/translation.json | 4 ++-- web/packages/base/locales/gu-IN/translation.json | 4 ++-- web/packages/base/locales/hi-IN/translation.json | 4 ++-- web/packages/base/locales/id-ID/translation.json | 4 ++-- web/packages/base/locales/is-IS/translation.json | 4 ++-- web/packages/base/locales/it-IT/translation.json | 4 ++-- web/packages/base/locales/ja-JP/translation.json | 4 ++-- web/packages/base/locales/km-KH/translation.json | 4 ++-- web/packages/base/locales/ko-KR/translation.json | 4 ++-- web/packages/base/locales/nl-NL/translation.json | 4 ++-- web/packages/base/locales/pl-PL/translation.json | 4 ++-- web/packages/base/locales/pt-BR/translation.json | 4 ++-- web/packages/base/locales/pt-PT/translation.json | 4 ++-- web/packages/base/locales/ru-RU/translation.json | 4 ++-- web/packages/base/locales/sv-SE/translation.json | 4 ++-- web/packages/base/locales/ta-IN/translation.json | 4 ++-- web/packages/base/locales/te-IN/translation.json | 4 ++-- web/packages/base/locales/th-TH/translation.json | 4 ++-- web/packages/base/locales/ti-ER/translation.json | 4 ++-- web/packages/base/locales/tr-TR/translation.json | 4 ++-- web/packages/base/locales/zh-CN/translation.json | 4 ++-- 32 files changed, 65 insertions(+), 65 deletions(-) diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index 2c8958ebec..771a972b67 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -663,7 +663,7 @@ const AddPhotosButton: React.FC = (props) => { color={"secondary"} startIcon={icon} > - {t("ADD_PHOTOS")} + {t("add_photos")} )}
@@ -684,7 +684,7 @@ const AddMorePhotosButton: React.FC = (props) => { color={"accent"} startIcon={} > - {t("ADD_MORE_PHOTOS")} + {t("add_more_photos")}
); @@ -696,7 +696,7 @@ const GoToEnte: React.FC = () => { return ( ); }; diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 0230820aa4..df96f3773b 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "لا شيء يمكن رؤيته هنا بعد 👀", "upload": "تحميل", "import": "استيراد", - "ADD_PHOTOS": "إضافة صور", - "ADD_MORE_PHOTOS": "إضافة المزيد من الصور", + "add_photos": "إضافة صور", + "add_more_photos": "إضافة المزيد من الصور", "add_photos_count_one": "إضافة 1 عنصر", "add_photos_count": "إضافة {{count, number}} عناصر", "select_photos": "تحديد الصور", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index ef127cc6da..feb667596e 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index 1ecb2c9b40..60b1066540 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Hier gibt es noch nichts zu sehen 👀", "upload": "Hochladen", "import": "Importieren", - "ADD_PHOTOS": "Fotos hinzufügen", - "ADD_MORE_PHOTOS": "Mehr Fotos hinzufügen", + "add_photos": "Fotos hinzufügen", + "add_more_photos": "Mehr Fotos hinzufügen", "add_photos_count_one": "Eine Datei hinzufügen", "add_photos_count": "{{count, number}} Dateien hinzufügen", "select_photos": "Foto auswählen", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 91ea346272..6dbe455054 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Τίποτα για να δείτε εδώ ακόμα 👀", "upload": "Μεταφόρτωση", "import": "Εισαγωγή", - "ADD_PHOTOS": "Προσθήκη φωτογραφιών", - "ADD_MORE_PHOTOS": "Προσθήκη περισσότερων φωτογραφιών", + "add_photos": "Προσθήκη φωτογραφιών", + "add_more_photos": "Προσθήκη περισσότερων φωτογραφιών", "add_photos_count_one": "Προσθήκη 1 αντικειμένου", "add_photos_count": "Προσθήκη {{count, number}} αντικειμένων", "select_photos": "Επιλογή φωτογραφιών", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index ee4e3742af..dd82bca340 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nothing to see here yet 👀", "upload": "Upload", "import": "Import", - "ADD_PHOTOS": "Add photos", - "ADD_MORE_PHOTOS": "Add more photos", + "add_photos": "Add photos", + "add_more_photos": "Add more photos", "add_photos_count_one": "Add 1 item", "add_photos_count": "Add {{count, number}} items", "select_photos": "Select photos", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index eb3a1cff4a..de40fd522d 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nada para ver aquí aún 👀", "upload": "Cargar", "import": "Importar", - "ADD_PHOTOS": "Añadir fotos", - "ADD_MORE_PHOTOS": "Añadir más fotos", + "add_photos": "Añadir fotos", + "add_more_photos": "Añadir más fotos", "add_photos_count_one": "Añadir 1 foto", "add_photos_count": "Añadir {{count, number}} fotos", "select_photos": "Seleccionar fotos", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 6c1a95669c..a071c03555 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index 43819cd4fd..be851dd576 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Tässä ei mitään nähtävää vielä 👀", "upload": "Lataa", "import": "Tuo", - "ADD_PHOTOS": "Lisää kuvia", - "ADD_MORE_PHOTOS": "Lisää enemmän kuvia", + "add_photos": "Lisää kuvia", + "add_more_photos": "Lisää enemmän kuvia", "add_photos_count_one": "Lisää yksi kohde", "add_photos_count": "Lisää {{count, number}} kohdetta", "select_photos": "Valitse kuvat", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index eb091e9cee..c53dd8fd23 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Il n'y a encore rien à voir ici 👀", "upload": "Charger", "import": "Importer", - "ADD_PHOTOS": "Ajouter des photos", - "ADD_MORE_PHOTOS": "Ajouter plus de photos", + "add_photos": "Ajouter des photos", + "add_more_photos": "Ajouter plus de photos", "add_photos_count_one": "Ajouter 1 élément", "add_photos_count": "Ajouter {{count, number}} éléments", "select_photos": "Sélectionner des photos", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index bc8aadc1c0..0180705e49 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Belum ada apa-apa di sini 👀", "upload": "Unggah", "import": "Impor", - "ADD_PHOTOS": "Tambahkan foto", - "ADD_MORE_PHOTOS": "Tambahkan lebih banyak foto", + "add_photos": "Tambahkan foto", + "add_more_photos": "Tambahkan lebih banyak foto", "add_photos_count_one": "Tambahkan item", "add_photos_count": "Tambahkan {{count, number}} item", "select_photos": "Pilih foto", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 1ee975f25b..93107546bf 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Ekkert að sjá hér ennþá 👀", "upload": "Hlaða upp", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index 3e75517826..5ce2d622f6 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nulla da vedere qui! 👀", "upload": "Carica", "import": "Importa", - "ADD_PHOTOS": "Aggiungi foto", - "ADD_MORE_PHOTOS": "Aggiungi altre foto", + "add_photos": "Aggiungi foto", + "add_more_photos": "Aggiungi altre foto", "add_photos_count_one": "Aggiungi elemento", "add_photos_count": "Aggiungi {{count, number}} elementi", "select_photos": "Seleziona foto", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index bf069b6585..3050c74d99 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "아직 볼 수 있는 것이 없어요 👀", "upload": "업로드", "import": "가져오기", - "ADD_PHOTOS": "사진 추가", - "ADD_MORE_PHOTOS": "사진 더 추가하기", + "add_photos": "사진 추가", + "add_more_photos": "사진 더 추가하기", "add_photos_count_one": "아이템 하나 추가", "add_photos_count": "아이템 {{count, number}} 개 추가하기", "select_photos": "사진 선택하기", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index f55bc92f16..83529d879b 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nog niets te zien hier 👀", "upload": "Uploaden", "import": "Importeren", - "ADD_PHOTOS": "Foto's toevoegen", - "ADD_MORE_PHOTOS": "Meer foto's toevoegen", + "add_photos": "Foto's toevoegen", + "add_more_photos": "Meer foto's toevoegen", "add_photos_count_one": "1 foto toevoegen", "add_photos_count": "{{count, number}} foto's toevoegen", "select_photos": "Selecteer foto's", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 04d0e500b5..4d949a0988 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nie ma tutaj jeszcze nic do zobaczenia! 👀", "upload": "Prześlij", "import": "Importuj", - "ADD_PHOTOS": "Dodaj zdjęcia", - "ADD_MORE_PHOTOS": "Dodaj więcej zdjęć", + "add_photos": "Dodaj zdjęcia", + "add_more_photos": "Dodaj więcej zdjęć", "add_photos_count_one": "Dodaj 1 element", "add_photos_count": "Dodaj {{count, number}} elementów", "select_photos": "Wybierz zdjęcia", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index f414af0924..7d3d10b4ff 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Nada para ver aqui ainda 👀", "upload": "Enviar", "import": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", + "add_photos": "Adicionar fotos", + "add_more_photos": "Adicionar mais fotos", "add_photos_count_one": "Adicionar item", "add_photos_count": "Adicionar {{count, number}} itens", "select_photos": "Selecionar fotos", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index a8dfb45d90..0040426f36 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "Importar", - "ADD_PHOTOS": "Adicionar fotos", - "ADD_MORE_PHOTOS": "Adicionar mais fotos", + "add_photos": "Adicionar fotos", + "add_more_photos": "Adicionar mais fotos", "add_photos_count_one": "Adicionar item", "add_photos_count": "Adicionar {{count, number}} itens", "select_photos": "Selecionar fotos", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index 5a3048d310..d4fbc90dbd 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Здесь нечего смотреть! 👀", "upload": "Загрузить", "import": "Импорт", - "ADD_PHOTOS": "Добавить фотографии", - "ADD_MORE_PHOTOS": "Добавить больше фото", + "add_photos": "Добавить фотографии", + "add_more_photos": "Добавить больше фото", "add_photos_count_one": "Добавить 1 элемент", "add_photos_count": "Добавить {{count, number}} элементов", "select_photos": "Выбрать фотографии", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index ccfb734d04..0569acfbc5 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Inget att se här ännu 👀", "upload": "Ladda upp", "import": "Importera", - "ADD_PHOTOS": "Lägg till bilder", - "ADD_MORE_PHOTOS": "Lägg till fler bilder", + "add_photos": "Lägg till bilder", + "add_more_photos": "Lägg till fler bilder", "add_photos_count_one": "Lägg till ett (1) objekt", "add_photos_count": "Lägg till {{count, number}} objekt", "select_photos": "Välj bilder", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 6e5a19bdec..f557203887 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index fb8f431a8c..1df49bad4e 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "Burada görülecek bir şey yok! 👀", "upload": "", "import": "", - "ADD_PHOTOS": "", - "ADD_MORE_PHOTOS": "", + "add_photos": "", + "add_more_photos": "", "add_photos_count_one": "", "add_photos_count": "", "select_photos": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index f228b49b6a..a4ea7b64ee 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -51,8 +51,8 @@ "NOTHING_HERE": "这里空空如也 👀", "upload": "上传", "import": "导入", - "ADD_PHOTOS": "添加照片", - "ADD_MORE_PHOTOS": "添加更多的照片", + "add_photos": "添加照片", + "add_more_photos": "添加更多的照片", "add_photos_count_one": "添加1个项目", "add_photos_count": "添加 {{count, number}} 个项目", "select_photos": "选择照片", From 7f1e7615cf946b84f9cbba9d1a58b6c2dc072662 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:11:50 +0530 Subject: [PATCH 1168/1179] Rename --- web/apps/photos/src/components/AuthenticateUserModal.tsx | 2 +- web/apps/photos/src/pages/shared-albums.tsx | 4 ++-- web/apps/photos/src/utils/ui/index.tsx | 2 +- web/packages/accounts/components/Login.tsx | 4 ++-- web/packages/accounts/components/SignUp.tsx | 2 +- web/packages/base/locales/ar-SA/translation.json | 6 +++--- web/packages/base/locales/bg-BG/translation.json | 6 +++--- web/packages/base/locales/ca-ES/translation.json | 6 +++--- web/packages/base/locales/de-DE/translation.json | 6 +++--- web/packages/base/locales/el-GR/translation.json | 6 +++--- web/packages/base/locales/en-US/translation.json | 6 +++--- web/packages/base/locales/es-ES/translation.json | 6 +++--- web/packages/base/locales/et-EE/translation.json | 6 +++--- web/packages/base/locales/fa-IR/translation.json | 6 +++--- web/packages/base/locales/fi-FI/translation.json | 6 +++--- web/packages/base/locales/fr-FR/translation.json | 6 +++--- web/packages/base/locales/gu-IN/translation.json | 6 +++--- web/packages/base/locales/hi-IN/translation.json | 6 +++--- web/packages/base/locales/id-ID/translation.json | 6 +++--- web/packages/base/locales/is-IS/translation.json | 6 +++--- web/packages/base/locales/it-IT/translation.json | 6 +++--- web/packages/base/locales/ja-JP/translation.json | 6 +++--- web/packages/base/locales/km-KH/translation.json | 6 +++--- web/packages/base/locales/ko-KR/translation.json | 6 +++--- web/packages/base/locales/nl-NL/translation.json | 6 +++--- web/packages/base/locales/pl-PL/translation.json | 6 +++--- web/packages/base/locales/pt-BR/translation.json | 6 +++--- web/packages/base/locales/pt-PT/translation.json | 6 +++--- web/packages/base/locales/ru-RU/translation.json | 6 +++--- web/packages/base/locales/sv-SE/translation.json | 6 +++--- web/packages/base/locales/ta-IN/translation.json | 6 +++--- web/packages/base/locales/te-IN/translation.json | 6 +++--- web/packages/base/locales/th-TH/translation.json | 6 +++--- web/packages/base/locales/ti-ER/translation.json | 6 +++--- web/packages/base/locales/tr-TR/translation.json | 6 +++--- web/packages/base/locales/zh-CN/translation.json | 6 +++--- web/packages/shared/components/LoginComponents.tsx | 2 +- 37 files changed, 101 insertions(+), 101 deletions(-) diff --git a/web/apps/photos/src/components/AuthenticateUserModal.tsx b/web/apps/photos/src/components/AuthenticateUserModal.tsx index d4abd8a5d8..a322760ac5 100644 --- a/web/apps/photos/src/components/AuthenticateUserModal.tsx +++ b/web/apps/photos/src/components/AuthenticateUserModal.tsx @@ -128,7 +128,7 @@ const passwordChangedElsewhereDialogAttributes = ( title: t("password_changed_elsewhere"), content: t("password_changed_elsewhere_message"), proceed: { - text: t("LOGIN"), + text: t("login"), action: onLogin, variant: "accent", }, diff --git a/web/apps/photos/src/pages/shared-albums.tsx b/web/apps/photos/src/pages/shared-albums.tsx index 771a972b67..c11e49fd80 100644 --- a/web/apps/photos/src/pages/shared-albums.tsx +++ b/web/apps/photos/src/pages/shared-albums.tsx @@ -188,7 +188,7 @@ export default function PublicCollectionGallery() { nonClosable: true, proceed: { - text: t("LOGIN"), + text: t("login"), action: () => router.push("/"), variant: "accent", }, @@ -696,7 +696,7 @@ const GoToEnte: React.FC = () => { return ( ); }; diff --git a/web/apps/photos/src/utils/ui/index.tsx b/web/apps/photos/src/utils/ui/index.tsx index 33bb2b5d60..ff404ad32e 100644 --- a/web/apps/photos/src/utils/ui/index.tsx +++ b/web/apps/photos/src/utils/ui/index.tsx @@ -128,7 +128,7 @@ export const getSessionExpiredMessage = ( nonClosable: true, proceed: { - text: t("LOGIN"), + text: t("login"), action, variant: "accent", }, diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index 380ebf66f1..6236552cb4 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -50,12 +50,12 @@ export const Login: React.FC = ({ signUp, host }) => { return ( <> - {t("LOGIN")} + {t("login")} diff --git a/web/packages/accounts/components/SignUp.tsx b/web/packages/accounts/components/SignUp.tsx index 19c1bbc33b..e69a08497d 100644 --- a/web/packages/accounts/components/SignUp.tsx +++ b/web/packages/accounts/components/SignUp.tsx @@ -120,7 +120,7 @@ export const SignUp: React.FC = ({ router, login, host }) => { return ( <> - {t("SIGN_UP")} + {t("sign_up")} initialValues={{ email: "", diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index df96f3773b..749656114c 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "مصممة لتدوم", "HERO_SLIDE_3_TITLE": "
متاح
في كل مكان
", "HERO_SLIDE_3": "أندرويد، آي أو إس، ويب، سطح المكتب", - "LOGIN": "تسجيل الدخول", - "SIGN_UP": "تسجيل", + "login": "تسجيل الدخول", + "sign_up": "تسجيل", "NEW_USER": "جديد في Ente", "EXISTING_USER": "مستخدم موجود", "ENTER_NAME": "أدخل الاسم", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index feb667596e..80dce917c9 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index 60b1066540..fb4e92d36b 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Entwickelt, um zu überleben", "HERO_SLIDE_3_TITLE": "
Überall
verfügbar
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Anmelden", - "SIGN_UP": "Registrieren", + "login": "Anmelden", + "sign_up": "Registrieren", "NEW_USER": "Neu bei Ente", "EXISTING_USER": "Existierender Benutzer", "ENTER_NAME": "Name eingeben", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Benutzerdefinierte Zeit", "REOPEN_PLAN_SELECTOR_MODAL": "Aboauswahl erneut öffnen", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Fehler beim Öffnen der Pläne", - "INSTALL": "Installieren", + "install": "Installieren", "SHARING_DETAILS": "Details teilen", "MODIFY_SHARING": "Freigabe ändern", "ADD_COLLABORATORS": "Bearbeiter hinzufügen", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 6dbe455054..31f9576509 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Σχεδιάστηκε για να επιζήσει", "HERO_SLIDE_3_TITLE": "
Διαθέσιμο
παντού
", "HERO_SLIDE_3": "", - "LOGIN": "Σύνδεση", - "SIGN_UP": "Εγγραφή", + "login": "Σύνδεση", + "sign_up": "Εγγραφή", "NEW_USER": "Νέος/α στο Ente", "EXISTING_USER": "Υπάρχων χρήστης", "ENTER_NAME": "Εισάγετε όνομα", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index dd82bca340..1af87037d9 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Designed to outlive", "HERO_SLIDE_3_TITLE": "
Available
everywhere
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Login", - "SIGN_UP": "Signup", + "login": "Login", + "sign_up": "Signup", "NEW_USER": "New to Ente", "EXISTING_USER": "Existing user", "ENTER_NAME": "Enter name", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Custom time", "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "INSTALL": "Install", + "install": "Install", "SHARING_DETAILS": "Sharing details", "MODIFY_SHARING": "Modify sharing", "ADD_COLLABORATORS": "Add collaborators", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index de40fd522d..e6de724516 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Diseñado para superar", "HERO_SLIDE_3_TITLE": "
Disponible
en todas partes
", "HERO_SLIDE_3": "Android, iOS, web, computadora", - "LOGIN": "Conectar", - "SIGN_UP": "Registro", + "login": "Conectar", + "sign_up": "Registro", "NEW_USER": "Nuevo en Ente", "EXISTING_USER": "Usuario existente", "ENTER_NAME": "Introducir nombre", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Hora personalizada", "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planes", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Error al abrir los planes", - "INSTALL": "Instalar", + "install": "Instalar", "SHARING_DETAILS": "Compartir detalles", "MODIFY_SHARING": "Modificar compartir", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index a071c03555..2008b8652b 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index be851dd576..0400c7f281 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "
Saatavilla
kaikkialla
", "HERO_SLIDE_3": "Android, iOS, Web, Tietokone", - "LOGIN": "Kirjaudu sisään", - "SIGN_UP": "Rekisteröidy", + "login": "Kirjaudu sisään", + "sign_up": "Rekisteröidy", "NEW_USER": "Uusi Ente-käyttäjä", "EXISTING_USER": "Jo valmiiksi olemassaoleva käyttäjä", "ENTER_NAME": "Lisää nimi", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index c53dd8fd23..d59c87c2d3 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Conçu pour survivre", "HERO_SLIDE_3_TITLE": "
Disponible
en tout lieu
", "HERO_SLIDE_3": "Android, iOS, Web, Ordinateur", - "LOGIN": "Connexion", - "SIGN_UP": "Inscription", + "login": "Connexion", + "sign_up": "Inscription", "NEW_USER": "Nouveau sur Ente", "EXISTING_USER": "Utilisateur existant", "ENTER_NAME": "Saisir un nom", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Heure personnalisée", "REOPEN_PLAN_SELECTOR_MODAL": "Rouvrir les plans", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Échec pour rouvrir les plans", - "INSTALL": "Installer", + "install": "Installer", "SHARING_DETAILS": "Détails du partage", "MODIFY_SHARING": "Modifier le partage", "ADD_COLLABORATORS": "Ajouter des collaborateurs", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index 0180705e49..9ab5ee16e0 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Dibuat untuk melestarikan", "HERO_SLIDE_3_TITLE": "
Tersedia
di mana saja
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Masuk", - "SIGN_UP": "Daftar", + "login": "Masuk", + "sign_up": "Daftar", "NEW_USER": "Baru di Ente", "EXISTING_USER": "Pengguna yang sudah ada", "ENTER_NAME": "Masukkan nama", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "Instal", + "install": "Instal", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "Tambah kolaborator", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 93107546bf..fc76f202f9 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index 5ce2d622f6..72e9a9cfc1 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Progettato per sopravvivere", "HERO_SLIDE_3_TITLE": "
Disponibile
ovunque
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Accedi", - "SIGN_UP": "Registrati", + "login": "Accedi", + "sign_up": "Registrati", "NEW_USER": "Prima volta con Ente", "EXISTING_USER": "Accedi", "ENTER_NAME": "Inserisci il nome", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "Installa", + "install": "Installa", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index 3050c74d99..bb649008b0 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "장기 보존을 위해 설계되었습니다", "HERO_SLIDE_3_TITLE": "
모든 기기에서
사용 가능
", "HERO_SLIDE_3": "안드로이드, iOS, 웹, 데스크탑", - "LOGIN": "로그인", - "SIGN_UP": "회원가입", + "login": "로그인", + "sign_up": "회원가입", "NEW_USER": "Ente 의 새소식", "EXISTING_USER": "기존 회원 로그인", "ENTER_NAME": "이름 입력", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 83529d879b..6f50478897 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Ontworpen om levenslang mee te gaan", "HERO_SLIDE_3_TITLE": "
Overal
beschikbaar
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Inloggen", - "SIGN_UP": "Registreren", + "login": "Inloggen", + "sign_up": "Registreren", "NEW_USER": "Nieuw bij Ente", "EXISTING_USER": "Bestaande gebruiker", "ENTER_NAME": "Naam invoeren", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Aangepaste tijd", "REOPEN_PLAN_SELECTOR_MODAL": "Abonnementen heropenen", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Kon abonnementen niet openen", - "INSTALL": "Installeren", + "install": "Installeren", "SHARING_DETAILS": "Delen van informatie", "MODIFY_SHARING": "Delen wijzigen", "ADD_COLLABORATORS": "Samenwerker toevoegen", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 4d949a0988..9876c7d3af 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Zaprojektowane do przetrwania", "HERO_SLIDE_3_TITLE": "
Dostępne
wszędzie
", "HERO_SLIDE_3": "Android, iOS, Strona Internetowa, Aplikacja Komputerowa", - "LOGIN": "Zaloguj się", - "SIGN_UP": "Zarejestruj się", + "login": "Zaloguj się", + "sign_up": "Zarejestruj się", "NEW_USER": "Nowy/a do Ente", "EXISTING_USER": "Istniejący użytkownik", "ENTER_NAME": "Wprowadź nazwę", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Niestandardowy czas", "REOPEN_PLAN_SELECTOR_MODAL": "Otwórz ponownie plany", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Nie udało się otworzyć planów", - "INSTALL": "Zainstaluj", + "install": "Zainstaluj", "SHARING_DETAILS": "Udostępnianie szczegółów", "MODIFY_SHARING": "Modyfikuj udostępnianie", "ADD_COLLABORATORS": "Dodaj współuczestników", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 7d3d10b4ff..71fd0a1c8c 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Feito para ter longevidade", "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registrar", + "login": "Entrar", + "sign_up": "Registrar", "NEW_USER": "Novo no Ente", "EXISTING_USER": "Usuário existente", "ENTER_NAME": "Insira o nome", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Tempo personalizado", "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planos", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Falha ao abrir planos", - "INSTALL": "Instalar", + "install": "Instalar", "SHARING_DETAILS": "Detalhes de compartilhamento", "MODIFY_SHARING": "Modificar compartilhamento", "ADD_COLLABORATORS": "Adicionar colaboradores", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 0040426f36..80b7d1c7fd 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "
Disponível
em qualquer lugar
", "HERO_SLIDE_3": "Android, iOS, Web, Desktop", - "LOGIN": "Entrar", - "SIGN_UP": "Registar", + "login": "Entrar", + "sign_up": "Registar", "NEW_USER": "Novo no Ente", "EXISTING_USER": "Utilizador existente", "ENTER_NAME": "Insira o nome", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index d4fbc90dbd..ad010267a7 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Созданный для того, чтобы пережить", "HERO_SLIDE_3_TITLE": "
Доступно
везде
", "HERO_SLIDE_3": "Android, iOS, Веб, ПК", - "LOGIN": "Войти", - "SIGN_UP": "Регистрация", + "login": "Войти", + "sign_up": "Регистрация", "NEW_USER": "Новенький в Ente", "EXISTING_USER": "Существующий пользователь", "ENTER_NAME": "Введите имя", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "Пользовательское время", "REOPEN_PLAN_SELECTOR_MODAL": "Повторно открывайте планы", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Не удалось раскрыть планы", - "INSTALL": "Устанавливать", + "install": "Устанавливать", "SHARING_DETAILS": "Обмен подробностями", "MODIFY_SHARING": "Изменить общий доступ", "ADD_COLLABORATORS": "Добавление соавторов", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 0569acfbc5..48c987bdff 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "Utformad för att överleva", "HERO_SLIDE_3_TITLE": "
Tillgänglig
överallt
", "HERO_SLIDE_3": "Android, iOS, webb, skrivbord", - "LOGIN": "Logga in", - "SIGN_UP": "Registrera", + "login": "Logga in", + "sign_up": "Registrera", "NEW_USER": "Ny hos Ente", "EXISTING_USER": "Befintlig användare", "ENTER_NAME": "Ange namn", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index f557203887..5efe39acb7 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "", - "SIGN_UP": "", + "login": "", + "sign_up": "", "NEW_USER": "", "EXISTING_USER": "", "ENTER_NAME": "", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 1df49bad4e..0050b6662f 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "", "HERO_SLIDE_3_TITLE": "", "HERO_SLIDE_3": "", - "LOGIN": "Giriş yap", - "SIGN_UP": "Hesap aç", + "login": "Giriş yap", + "sign_up": "Hesap aç", "NEW_USER": "Yeni ente kullanıcısı", "EXISTING_USER": "Mevcut kullanıcı", "ENTER_NAME": "İsim gir", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "INSTALL": "", + "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index a4ea7b64ee..cd31884dde 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -5,8 +5,8 @@ "HERO_SLIDE_2": "经久耐用", "HERO_SLIDE_3_TITLE": "
可用于
各处
", "HERO_SLIDE_3": "安卓, iOS, 网页端, 桌面端", - "LOGIN": "登录", - "SIGN_UP": "注册", + "login": "登录", + "sign_up": "注册", "NEW_USER": "初来 Ente", "EXISTING_USER": "现有用户", "ENTER_NAME": "输入名字", @@ -356,7 +356,7 @@ "CUSTOM_TIME": "自定义时间", "REOPEN_PLAN_SELECTOR_MODAL": "重新启动计划", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "未能打开计划", - "INSTALL": "安装", + "install": "安装", "SHARING_DETAILS": "共享的详细信息", "MODIFY_SHARING": "更改共享", "ADD_COLLABORATORS": "添加协作者", diff --git a/web/packages/shared/components/LoginComponents.tsx b/web/packages/shared/components/LoginComponents.tsx index aee15ec011..cbe828cba7 100644 --- a/web/packages/shared/components/LoginComponents.tsx +++ b/web/packages/shared/components/LoginComponents.tsx @@ -213,7 +213,7 @@ export const sessionExpiredDialogAttributes = ( content: t("SESSION_EXPIRED_MESSAGE"), nonClosable: true, proceed: { - text: t("LOGIN"), + text: t("login"), action: onLogin, variant: "accent", }, From 4ed769271d61d12dd8e204b476c40fddcac18d58 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:13:47 +0530 Subject: [PATCH 1169/1179] Rename --- web/apps/photos/src/components/PhotoList/index.tsx | 2 +- web/packages/base/locales/ar-SA/translation.json | 2 +- web/packages/base/locales/bg-BG/translation.json | 2 +- web/packages/base/locales/ca-ES/translation.json | 2 +- web/packages/base/locales/de-DE/translation.json | 2 +- web/packages/base/locales/el-GR/translation.json | 2 +- web/packages/base/locales/en-US/translation.json | 2 +- web/packages/base/locales/es-ES/translation.json | 2 +- web/packages/base/locales/et-EE/translation.json | 2 +- web/packages/base/locales/fa-IR/translation.json | 2 +- web/packages/base/locales/fi-FI/translation.json | 2 +- web/packages/base/locales/fr-FR/translation.json | 2 +- web/packages/base/locales/gu-IN/translation.json | 2 +- web/packages/base/locales/hi-IN/translation.json | 2 +- web/packages/base/locales/id-ID/translation.json | 2 +- web/packages/base/locales/is-IS/translation.json | 2 +- web/packages/base/locales/it-IT/translation.json | 2 +- web/packages/base/locales/ja-JP/translation.json | 2 +- web/packages/base/locales/km-KH/translation.json | 2 +- web/packages/base/locales/ko-KR/translation.json | 2 +- web/packages/base/locales/nl-NL/translation.json | 2 +- web/packages/base/locales/pl-PL/translation.json | 2 +- web/packages/base/locales/pt-BR/translation.json | 2 +- web/packages/base/locales/pt-PT/translation.json | 2 +- web/packages/base/locales/ru-RU/translation.json | 2 +- web/packages/base/locales/sv-SE/translation.json | 2 +- web/packages/base/locales/ta-IN/translation.json | 2 +- web/packages/base/locales/te-IN/translation.json | 2 +- web/packages/base/locales/th-TH/translation.json | 2 +- web/packages/base/locales/ti-ER/translation.json | 2 +- web/packages/base/locales/tr-TR/translation.json | 2 +- web/packages/base/locales/zh-CN/translation.json | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/web/apps/photos/src/components/PhotoList/index.tsx b/web/apps/photos/src/components/PhotoList/index.tsx index 01eb5bb7e4..b983723c02 100644 --- a/web/apps/photos/src/components/PhotoList/index.tsx +++ b/web/apps/photos/src/components/PhotoList/index.tsx @@ -545,7 +545,7 @@ export function PhotoList({ Android oder iOS App, um automatisch alle deine Fotos zu sichern", + "install_mobile_app": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", "DOWNLOAD_APP": "Desktopanwendung herunterladen", "EXPORT": "Daten exportieren", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 31f9576509..636c99d306 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -138,7 +138,7 @@ "ERROR": "Σφάλμα", "MESSAGE": "Μήνυμα", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "Λήψη εφαρμογής για υπολογιστές", "EXPORT": "Εξαγωγή Δεδομένων", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 1af87037d9..6e7f7c1d83 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -138,7 +138,7 @@ "ERROR": "Error", "MESSAGE": "Message", "OFFLINE_MSG": "You are offline, cached memories are being shown", - "INSTALL_MOBILE_APP": "Install our Android or iOS app to automatically backup all your photos", + "install_mobile_app": "Install our Android or iOS app to automatically backup all your photos", "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", "DOWNLOAD_APP": "Download desktop app", "EXPORT": "Export Data", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index e6de724516..b62c2a2f8c 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -138,7 +138,7 @@ "ERROR": "Error", "MESSAGE": "Mensaje", "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", - "INSTALL_MOBILE_APP": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", + "install_mobile_app": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", "DOWNLOAD_APP": "Descargar aplicación de computadora", "EXPORT": "Exportar datos", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 2008b8652b..3b7da7dfea 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index 0400c7f281..a6c66414a7 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index d59c87c2d3..84e2656078 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -138,7 +138,7 @@ "ERROR": "Erreur", "MESSAGE": "Message", "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", - "INSTALL_MOBILE_APP": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", + "install_mobile_app": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", "EXPORT": "Exporter des données", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index 9ab5ee16e0..5e6e65b8da 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -138,7 +138,7 @@ "ERROR": "Kesalahan", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "Instal app Android atau iOS kami untuk mencadangkan seluruh foto kamu secara otomatis", + "install_mobile_app": "Instal app Android atau iOS kami untuk mencadangkan seluruh foto kamu secara otomatis", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "Unduh app desktop", "EXPORT": "Ekspor Data", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index fc76f202f9..b40f6de61a 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -138,7 +138,7 @@ "ERROR": "Villa", "MESSAGE": "Skilaboð", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index 72e9a9cfc1..a5b1d03682 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -138,7 +138,7 @@ "ERROR": "Errore", "MESSAGE": "Messaggio", "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", - "INSTALL_MOBILE_APP": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", + "install_mobile_app": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", "DOWNLOAD_APP": "Scarica l'app per desktop", "EXPORT": "Esporta Dati", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index bb649008b0..fa6c351603 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 6f50478897..ce026d846e 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -138,7 +138,7 @@ "ERROR": "Foutmelding", "MESSAGE": "Melding", "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", - "INSTALL_MOBILE_APP": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", + "install_mobile_app": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", "DOWNLOAD_APP": "Download de desktop app", "EXPORT": "Data exporteren", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 9876c7d3af..ca4c4ee70d 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -138,7 +138,7 @@ "ERROR": "Błąd", "MESSAGE": "Wiadomość", "OFFLINE_MSG": "Jesteś offline, wyświetlane są wspomnienia z pamięci podręcznej", - "INSTALL_MOBILE_APP": "Zainstaluj naszą aplikację na system Android lub iOS, aby automatycznie wykonać kopię zapasową wszystkich zdjęć", + "install_mobile_app": "Zainstaluj naszą aplikację na system Android lub iOS, aby automatycznie wykonać kopię zapasową wszystkich zdjęć", "DOWNLOAD_APP_MESSAGE": "Przepraszamy, ta operacja jest obecnie obsługiwana tylko w naszej aplikacji komputerowej", "DOWNLOAD_APP": "Pobierz aplikację komputerową", "EXPORT": "Eksportuj Dane", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 71fd0a1c8c..8b94dbcbb9 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -138,7 +138,7 @@ "ERROR": "Erro", "MESSAGE": "Mensagem", "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", - "INSTALL_MOBILE_APP": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", + "install_mobile_app": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", "DOWNLOAD_APP": "Baixar aplicativo para computador", "EXPORT": "Exportar dados", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 80b7d1c7fd..4a6ce76ecc 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index ad010267a7..1a49a54993 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -138,7 +138,7 @@ "ERROR": "Ошибка", "MESSAGE": "Сообщение", "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", - "INSTALL_MOBILE_APP": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", + "install_mobile_app": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", "DOWNLOAD_APP_MESSAGE": "К сожалению, в настоящее время эта операция поддерживается только в нашем настольном приложении", "DOWNLOAD_APP": "Загрузить приложение для компьютера", "EXPORT": "Экспортировать данные", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 48c987bdff..22eb901533 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "Meddelande", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "Installera vår Android eller iOS-app för att automatiskt säkerhetskopiera alla dina foton", + "install_mobile_app": "Installera vår Android eller iOS-app för att automatiskt säkerhetskopiera alla dina foton", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "Exportera data", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 5efe39acb7..974d7a3510 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -138,7 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", - "INSTALL_MOBILE_APP": "", + "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", "EXPORT": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 0050b6662f..5455ba631d 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -138,7 +138,7 @@ "ERROR": "Hata", "MESSAGE": "Mesaj", "OFFLINE_MSG": "Çevrimdışısın, önbelleğe alınmış anılar gösteriliyor", - "INSTALL_MOBILE_APP": "Tüm fotoğraflarını otomatik olarak yedeklemek için Android veya iOS uygulamamızı yükle", + "install_mobile_app": "Tüm fotoğraflarını otomatik olarak yedeklemek için Android veya iOS uygulamamızı yükle", "DOWNLOAD_APP_MESSAGE": "Üzgünüz, bu işlem şu anda yalnızca masaüstü uygulamamızda destekleniyor", "DOWNLOAD_APP": "Masaüstü uygulamasını indir", "EXPORT": "Verileri Dışarı Aktar", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index cd31884dde..93d1fc5a39 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -138,7 +138,7 @@ "ERROR": "错误", "MESSAGE": "消息", "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", - "INSTALL_MOBILE_APP": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", + "install_mobile_app": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", "DOWNLOAD_APP": "下载桌面应用程序", "EXPORT": "导出数据", From fa290752c950144909aa2ec077730b59ad0d1294 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:18:28 +0530 Subject: [PATCH 1170/1179] Reorder --- web/packages/base/locales/ar-SA/translation.json | 2 +- web/packages/base/locales/bg-BG/translation.json | 2 +- web/packages/base/locales/ca-ES/translation.json | 2 +- web/packages/base/locales/de-DE/translation.json | 2 +- web/packages/base/locales/el-GR/translation.json | 2 +- web/packages/base/locales/en-US/translation.json | 2 +- web/packages/base/locales/es-ES/translation.json | 2 +- web/packages/base/locales/et-EE/translation.json | 2 +- web/packages/base/locales/fa-IR/translation.json | 2 +- web/packages/base/locales/fi-FI/translation.json | 2 +- web/packages/base/locales/fr-FR/translation.json | 2 +- web/packages/base/locales/gu-IN/translation.json | 2 +- web/packages/base/locales/hi-IN/translation.json | 2 +- web/packages/base/locales/id-ID/translation.json | 2 +- web/packages/base/locales/is-IS/translation.json | 2 +- web/packages/base/locales/it-IT/translation.json | 2 +- web/packages/base/locales/ja-JP/translation.json | 2 +- web/packages/base/locales/km-KH/translation.json | 2 +- web/packages/base/locales/ko-KR/translation.json | 2 +- web/packages/base/locales/nl-NL/translation.json | 2 +- web/packages/base/locales/pl-PL/translation.json | 2 +- web/packages/base/locales/pt-BR/translation.json | 2 +- web/packages/base/locales/pt-PT/translation.json | 2 +- web/packages/base/locales/ru-RU/translation.json | 2 +- web/packages/base/locales/sv-SE/translation.json | 2 +- web/packages/base/locales/ta-IN/translation.json | 2 +- web/packages/base/locales/te-IN/translation.json | 2 +- web/packages/base/locales/th-TH/translation.json | 2 +- web/packages/base/locales/ti-ER/translation.json | 2 +- web/packages/base/locales/tr-TR/translation.json | 2 +- web/packages/base/locales/zh-CN/translation.json | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 9a345c0f7e..67e603cf39 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -138,6 +138,7 @@ "ERROR": "خطأ", "MESSAGE": "رسالة", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "تنزيل تطبيق سطح المكتب", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index 333fb000bc..1a51f08671 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index b35953b9ed..f0625636f2 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -138,6 +138,7 @@ "ERROR": "Fehler", "MESSAGE": "Nachricht", "OFFLINE_MSG": "Du bist offline, gecachte Erinnerungen werden angezeigt", + "install": "Installieren", "install_mobile_app": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", "DOWNLOAD_APP": "Desktopanwendung herunterladen", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Benutzerdefinierte Zeit", "REOPEN_PLAN_SELECTOR_MODAL": "Aboauswahl erneut öffnen", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Fehler beim Öffnen der Pläne", - "install": "Installieren", "SHARING_DETAILS": "Details teilen", "MODIFY_SHARING": "Freigabe ändern", "ADD_COLLABORATORS": "Bearbeiter hinzufügen", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index 636c99d306..e20992cab1 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -138,6 +138,7 @@ "ERROR": "Σφάλμα", "MESSAGE": "Μήνυμα", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "Λήψη εφαρμογής για υπολογιστές", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 6e7f7c1d83..e29b5c38c7 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -138,6 +138,7 @@ "ERROR": "Error", "MESSAGE": "Message", "OFFLINE_MSG": "You are offline, cached memories are being shown", + "install": "Install", "install_mobile_app": "Install our Android or iOS app to automatically backup all your photos", "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", "DOWNLOAD_APP": "Download desktop app", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Custom time", "REOPEN_PLAN_SELECTOR_MODAL": "Re-open plans", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Failed to open plans", - "install": "Install", "SHARING_DETAILS": "Sharing details", "MODIFY_SHARING": "Modify sharing", "ADD_COLLABORATORS": "Add collaborators", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index b62c2a2f8c..56bbd07029 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -138,6 +138,7 @@ "ERROR": "Error", "MESSAGE": "Mensaje", "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", + "install": "Instalar", "install_mobile_app": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", "DOWNLOAD_APP": "Descargar aplicación de computadora", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Hora personalizada", "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planes", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Error al abrir los planes", - "install": "Instalar", "SHARING_DETAILS": "Compartir detalles", "MODIFY_SHARING": "Modificar compartir", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 3b7da7dfea..ccbecf0814 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index a6c66414a7..ed0e7f95bb 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 84e2656078..7f6337af09 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -138,6 +138,7 @@ "ERROR": "Erreur", "MESSAGE": "Message", "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", + "install": "Installer", "install_mobile_app": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Heure personnalisée", "REOPEN_PLAN_SELECTOR_MODAL": "Rouvrir les plans", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Échec pour rouvrir les plans", - "install": "Installer", "SHARING_DETAILS": "Détails du partage", "MODIFY_SHARING": "Modifier le partage", "ADD_COLLABORATORS": "Ajouter des collaborateurs", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index 5e6e65b8da..fb134d746d 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -138,6 +138,7 @@ "ERROR": "Kesalahan", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "Instal", "install_mobile_app": "Instal app Android atau iOS kami untuk mencadangkan seluruh foto kamu secara otomatis", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "Unduh app desktop", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "Instal", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "Tambah kolaborator", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index b40f6de61a..5605ea4a3c 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -138,6 +138,7 @@ "ERROR": "Villa", "MESSAGE": "Skilaboð", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index a5b1d03682..8a860b2f76 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -138,6 +138,7 @@ "ERROR": "Errore", "MESSAGE": "Messaggio", "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", + "install": "Installa", "install_mobile_app": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", "DOWNLOAD_APP": "Scarica l'app per desktop", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "Installa", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index fa6c351603..f500947fbb 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index ce026d846e..5dbd01c1b5 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -138,6 +138,7 @@ "ERROR": "Foutmelding", "MESSAGE": "Melding", "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", + "install": "Installeren", "install_mobile_app": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", "DOWNLOAD_APP": "Download de desktop app", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Aangepaste tijd", "REOPEN_PLAN_SELECTOR_MODAL": "Abonnementen heropenen", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Kon abonnementen niet openen", - "install": "Installeren", "SHARING_DETAILS": "Delen van informatie", "MODIFY_SHARING": "Delen wijzigen", "ADD_COLLABORATORS": "Samenwerker toevoegen", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index ca4c4ee70d..ba6c19b3a2 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -138,6 +138,7 @@ "ERROR": "Błąd", "MESSAGE": "Wiadomość", "OFFLINE_MSG": "Jesteś offline, wyświetlane są wspomnienia z pamięci podręcznej", + "install": "Zainstaluj", "install_mobile_app": "Zainstaluj naszą aplikację na system Android lub iOS, aby automatycznie wykonać kopię zapasową wszystkich zdjęć", "DOWNLOAD_APP_MESSAGE": "Przepraszamy, ta operacja jest obecnie obsługiwana tylko w naszej aplikacji komputerowej", "DOWNLOAD_APP": "Pobierz aplikację komputerową", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Niestandardowy czas", "REOPEN_PLAN_SELECTOR_MODAL": "Otwórz ponownie plany", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Nie udało się otworzyć planów", - "install": "Zainstaluj", "SHARING_DETAILS": "Udostępnianie szczegółów", "MODIFY_SHARING": "Modyfikuj udostępnianie", "ADD_COLLABORATORS": "Dodaj współuczestników", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 8b94dbcbb9..9f8e862faa 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -138,6 +138,7 @@ "ERROR": "Erro", "MESSAGE": "Mensagem", "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", + "install": "Instalar", "install_mobile_app": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", "DOWNLOAD_APP": "Baixar aplicativo para computador", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Tempo personalizado", "REOPEN_PLAN_SELECTOR_MODAL": "Reabrir planos", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Falha ao abrir planos", - "install": "Instalar", "SHARING_DETAILS": "Detalhes de compartilhamento", "MODIFY_SHARING": "Modificar compartilhamento", "ADD_COLLABORATORS": "Adicionar colaboradores", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 4a6ce76ecc..a5d2cb4692 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index 1a49a54993..d174fade71 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -138,6 +138,7 @@ "ERROR": "Ошибка", "MESSAGE": "Сообщение", "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", + "install": "Устанавливать", "install_mobile_app": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", "DOWNLOAD_APP_MESSAGE": "К сожалению, в настоящее время эта операция поддерживается только в нашем настольном приложении", "DOWNLOAD_APP": "Загрузить приложение для компьютера", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "Пользовательское время", "REOPEN_PLAN_SELECTOR_MODAL": "Повторно открывайте планы", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "Не удалось раскрыть планы", - "install": "Устанавливать", "SHARING_DETAILS": "Обмен подробностями", "MODIFY_SHARING": "Изменить общий доступ", "ADD_COLLABORATORS": "Добавление соавторов", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 22eb901533..73827f13bf 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "Meddelande", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "Installera vår Android eller iOS-app för att automatiskt säkerhetskopiera alla dina foton", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 974d7a3510..afe7979431 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -138,6 +138,7 @@ "ERROR": "", "MESSAGE": "", "OFFLINE_MSG": "", + "install": "", "install_mobile_app": "", "DOWNLOAD_APP_MESSAGE": "", "DOWNLOAD_APP": "", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 5455ba631d..d686d94c90 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -138,6 +138,7 @@ "ERROR": "Hata", "MESSAGE": "Mesaj", "OFFLINE_MSG": "Çevrimdışısın, önbelleğe alınmış anılar gösteriliyor", + "install": "", "install_mobile_app": "Tüm fotoğraflarını otomatik olarak yedeklemek için Android veya iOS uygulamamızı yükle", "DOWNLOAD_APP_MESSAGE": "Üzgünüz, bu işlem şu anda yalnızca masaüstü uygulamamızda destekleniyor", "DOWNLOAD_APP": "Masaüstü uygulamasını indir", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "", "REOPEN_PLAN_SELECTOR_MODAL": "", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "", - "install": "", "SHARING_DETAILS": "", "MODIFY_SHARING": "", "ADD_COLLABORATORS": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 93d1fc5a39..a163f356cf 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -138,6 +138,7 @@ "ERROR": "错误", "MESSAGE": "消息", "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", + "install": "安装", "install_mobile_app": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", "DOWNLOAD_APP": "下载桌面应用程序", @@ -356,7 +357,6 @@ "CUSTOM_TIME": "自定义时间", "REOPEN_PLAN_SELECTOR_MODAL": "重新启动计划", "OPEN_PLAN_SELECTOR_MODAL_FAILED": "未能打开计划", - "install": "安装", "SHARING_DETAILS": "共享的详细信息", "MODIFY_SHARING": "更改共享", "ADD_COLLABORATORS": "添加协作者", From 01fba0b722f82baf7602faba90071b8b695b5c9b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:19:20 +0530 Subject: [PATCH 1171/1179] Reorder and rename --- web/apps/photos/src/utils/ui/index.tsx | 4 ++-- web/packages/base/locales/ar-SA/translation.json | 4 ++-- web/packages/base/locales/bg-BG/translation.json | 4 ++-- web/packages/base/locales/ca-ES/translation.json | 4 ++-- web/packages/base/locales/de-DE/translation.json | 4 ++-- web/packages/base/locales/el-GR/translation.json | 4 ++-- web/packages/base/locales/en-US/translation.json | 4 ++-- web/packages/base/locales/es-ES/translation.json | 4 ++-- web/packages/base/locales/et-EE/translation.json | 4 ++-- web/packages/base/locales/fa-IR/translation.json | 4 ++-- web/packages/base/locales/fi-FI/translation.json | 4 ++-- web/packages/base/locales/fr-FR/translation.json | 4 ++-- web/packages/base/locales/gu-IN/translation.json | 4 ++-- web/packages/base/locales/hi-IN/translation.json | 4 ++-- web/packages/base/locales/id-ID/translation.json | 4 ++-- web/packages/base/locales/is-IS/translation.json | 4 ++-- web/packages/base/locales/it-IT/translation.json | 4 ++-- web/packages/base/locales/ja-JP/translation.json | 4 ++-- web/packages/base/locales/km-KH/translation.json | 4 ++-- web/packages/base/locales/ko-KR/translation.json | 4 ++-- web/packages/base/locales/nl-NL/translation.json | 4 ++-- web/packages/base/locales/pl-PL/translation.json | 4 ++-- web/packages/base/locales/pt-BR/translation.json | 4 ++-- web/packages/base/locales/pt-PT/translation.json | 4 ++-- web/packages/base/locales/ru-RU/translation.json | 4 ++-- web/packages/base/locales/sv-SE/translation.json | 4 ++-- web/packages/base/locales/ta-IN/translation.json | 4 ++-- web/packages/base/locales/te-IN/translation.json | 4 ++-- web/packages/base/locales/th-TH/translation.json | 4 ++-- web/packages/base/locales/ti-ER/translation.json | 4 ++-- web/packages/base/locales/tr-TR/translation.json | 4 ++-- web/packages/base/locales/zh-CN/translation.json | 4 ++-- 32 files changed, 64 insertions(+), 64 deletions(-) diff --git a/web/apps/photos/src/utils/ui/index.tsx b/web/apps/photos/src/utils/ui/index.tsx index ff404ad32e..0c33bc7dbe 100644 --- a/web/apps/photos/src/utils/ui/index.tsx +++ b/web/apps/photos/src/utils/ui/index.tsx @@ -11,8 +11,8 @@ import { Subscription } from "types/billing"; export const getDownloadAppMessage = (): DialogBoxAttributes => { return { - title: t("DOWNLOAD_APP"), - content: t("DOWNLOAD_APP_MESSAGE"), + title: t("download_app"), + content: t("download_app_message"), proceed: { text: t("DOWNLOAD"), diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 67e603cf39..b0a3e74d69 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "تنزيل تطبيق سطح المكتب", + "download_app": "تنزيل تطبيق سطح المكتب", + "download_app_message": "", "EXPORT": "تصدير البيانات", "SUBSCRIPTION": "اشتراك", "SUBSCRIBE": "اشترك", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index 1a51f08671..f5420082b2 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index f0625636f2..e261dbb096 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Du bist offline, gecachte Erinnerungen werden angezeigt", "install": "Installieren", "install_mobile_app": "Installiere unsere Android oder iOS App, um automatisch alle deine Fotos zu sichern", - "DOWNLOAD_APP_MESSAGE": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", - "DOWNLOAD_APP": "Desktopanwendung herunterladen", + "download_app": "Desktopanwendung herunterladen", + "download_app_message": "Entschuldigung, dieser Vorgang wird derzeit nur von unserer Desktop-App unterstützt", "EXPORT": "Daten exportieren", "SUBSCRIPTION": "Abonnement", "SUBSCRIBE": "Abonnieren", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index e20992cab1..f73f5da0f1 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Λήψη εφαρμογής για υπολογιστές", + "download_app": "Λήψη εφαρμογής για υπολογιστές", + "download_app_message": "", "EXPORT": "Εξαγωγή Δεδομένων", "SUBSCRIPTION": "Συνδρομή", "SUBSCRIBE": "Εγγραφείτε", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index e29b5c38c7..29b85530f3 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "You are offline, cached memories are being shown", "install": "Install", "install_mobile_app": "Install our Android or iOS app to automatically backup all your photos", - "DOWNLOAD_APP_MESSAGE": "Sorry, this operation is currently only supported on our desktop app", - "DOWNLOAD_APP": "Download desktop app", + "download_app": "Download desktop app", + "download_app_message": "Sorry, this operation is currently only supported on our desktop app", "EXPORT": "Export Data", "SUBSCRIPTION": "Subscription", "SUBSCRIBE": "Subscribe", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index 56bbd07029..d40b017856 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Estás desconectado, se están mostrando recuerdos en caché", "install": "Instalar", "install_mobile_app": "Instala nuestra aplicación Android o iOS para hacer una copia de seguridad automática de todas usted fotos", - "DOWNLOAD_APP_MESSAGE": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", - "DOWNLOAD_APP": "Descargar aplicación de computadora", + "download_app": "Descargar aplicación de computadora", + "download_app_message": "Lo sentimos, esta operación sólo es compatible con nuestra aplicación de computadora", "EXPORT": "Exportar datos", "SUBSCRIPTION": "Suscripción", "SUBSCRIBE": "Suscribir", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index ccbecf0814..019498ed9b 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index ed0e7f95bb..541768f994 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 7f6337af09..43b78dddb4 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Vous êtes hors-ligne, les mémoires cache sont affichées", "install": "Installer", "install_mobile_app": "Installez notre application Android or iOS pour sauvegarder automatiquement toutes vos photos", - "DOWNLOAD_APP_MESSAGE": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", - "DOWNLOAD_APP": "Télécharger l'appli pour ordinateur", + "download_app": "Télécharger l'appli pour ordinateur", + "download_app_message": "Désolé, cette opération est actuellement supportée uniquement sur notre appli pour ordinateur", "EXPORT": "Exporter des données", "SUBSCRIPTION": "Abonnement", "SUBSCRIBE": "S'abonner", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index fb134d746d..aedb9049f5 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "Instal", "install_mobile_app": "Instal app Android atau iOS kami untuk mencadangkan seluruh foto kamu secara otomatis", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "Unduh app desktop", + "download_app": "Unduh app desktop", + "download_app_message": "", "EXPORT": "Ekspor Data", "SUBSCRIPTION": "Langganan", "SUBSCRIBE": "Berlangganan", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 5605ea4a3c..0a352d3a5d 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "Áskrift", "SUBSCRIBE": "Gerast áskrifandi", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index 8a860b2f76..c1110f3451 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Sei offline, i ricordi memorizzati nella cache vengono mostrati", "install": "Installa", "install_mobile_app": "Installa la nostra app Android o iOS per eseguire il backup automatico di tutte le tue foto", - "DOWNLOAD_APP_MESSAGE": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", - "DOWNLOAD_APP": "Scarica l'app per desktop", + "download_app": "Scarica l'app per desktop", + "download_app_message": "Siamo spiacenti, questa operazione è attualmente supportata solo sulla nostra app desktop", "EXPORT": "Esporta Dati", "SUBSCRIPTION": "Abbonamento", "SUBSCRIBE": "Iscriviti", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index f500947fbb..d6a15fbc22 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 5dbd01c1b5..83b3e83ace 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Je bent offline, lokaal opgeslagen herinneringen worden getoond", "install": "Installeren", "install_mobile_app": "Installeer onze Android of iOS app om automatisch een back-up te maken van al uw foto's", - "DOWNLOAD_APP_MESSAGE": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", - "DOWNLOAD_APP": "Download de desktop app", + "download_app": "Download de desktop app", + "download_app_message": "Sorry, deze bewerking wordt momenteel alleen ondersteund op onze desktop app", "EXPORT": "Data exporteren", "SUBSCRIPTION": "Abonnement", "SUBSCRIBE": "Abonneren", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index ba6c19b3a2..79046d45ac 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Jesteś offline, wyświetlane są wspomnienia z pamięci podręcznej", "install": "Zainstaluj", "install_mobile_app": "Zainstaluj naszą aplikację na system Android lub iOS, aby automatycznie wykonać kopię zapasową wszystkich zdjęć", - "DOWNLOAD_APP_MESSAGE": "Przepraszamy, ta operacja jest obecnie obsługiwana tylko w naszej aplikacji komputerowej", - "DOWNLOAD_APP": "Pobierz aplikację komputerową", + "download_app": "Pobierz aplikację komputerową", + "download_app_message": "Przepraszamy, ta operacja jest obecnie obsługiwana tylko w naszej aplikacji komputerowej", "EXPORT": "Eksportuj Dane", "SUBSCRIPTION": "Subskrypcja", "SUBSCRIBE": "Subskrybuj", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 9f8e862faa..46407acf5d 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Você está offline, memórias em cache estão sendo mostradas", "install": "Instalar", "install_mobile_app": "Instale nosso aplicativo Android ou iOS para fazer backup automático de todas as suas fotos", - "DOWNLOAD_APP_MESSAGE": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", - "DOWNLOAD_APP": "Baixar aplicativo para computador", + "download_app": "Baixar aplicativo para computador", + "download_app_message": "Desculpe, esta operação só é suportada em nosso aplicativo para computador", "EXPORT": "Exportar dados", "SUBSCRIPTION": "Assinatura", "SUBSCRIBE": "Assinar", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index a5d2cb4692..4fccbee595 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index d174fade71..d6bf959427 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Вы не в сети, кэшированные воспоминания отображаются", "install": "Устанавливать", "install_mobile_app": "Установите наше приложение Android или iOS для автоматического резервного копирования всех ваших фотографий", - "DOWNLOAD_APP_MESSAGE": "К сожалению, в настоящее время эта операция поддерживается только в нашем настольном приложении", - "DOWNLOAD_APP": "Загрузить приложение для компьютера", + "download_app": "Загрузить приложение для компьютера", + "download_app_message": "К сожалению, в настоящее время эта операция поддерживается только в нашем настольном приложении", "EXPORT": "Экспортировать данные", "SUBSCRIPTION": "Подписка", "SUBSCRIBE": "Подписаться", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index 73827f13bf..f24f0071ed 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "Installera vår Android eller iOS-app för att automatiskt säkerhetskopiera alla dina foton", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "Exportera data", "SUBSCRIPTION": "Prenumeration", "SUBSCRIBE": "Prenumerera", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index afe7979431..2d2fca8372 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "", "install": "", "install_mobile_app": "", - "DOWNLOAD_APP_MESSAGE": "", - "DOWNLOAD_APP": "", + "download_app": "", + "download_app_message": "", "EXPORT": "", "SUBSCRIPTION": "", "SUBSCRIBE": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index d686d94c90..f85bef11d1 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "Çevrimdışısın, önbelleğe alınmış anılar gösteriliyor", "install": "", "install_mobile_app": "Tüm fotoğraflarını otomatik olarak yedeklemek için Android veya iOS uygulamamızı yükle", - "DOWNLOAD_APP_MESSAGE": "Üzgünüz, bu işlem şu anda yalnızca masaüstü uygulamamızda destekleniyor", - "DOWNLOAD_APP": "Masaüstü uygulamasını indir", + "download_app": "Masaüstü uygulamasını indir", + "download_app_message": "Üzgünüz, bu işlem şu anda yalnızca masaüstü uygulamamızda destekleniyor", "EXPORT": "Verileri Dışarı Aktar", "SUBSCRIPTION": "Abonelik", "SUBSCRIBE": "Abone ol", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index a163f356cf..fdb4f5d854 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -140,8 +140,8 @@ "OFFLINE_MSG": "您处于离线状态,正在显示已缓存的回忆", "install": "安装", "install_mobile_app": "安装我们的 AndroidiOS 应用程序来自动备份您的所有照片", - "DOWNLOAD_APP_MESSAGE": "抱歉,目前只有我们的桌面应用程序支持此操作", - "DOWNLOAD_APP": "下载桌面应用程序", + "download_app": "下载桌面应用程序", + "download_app_message": "抱歉,目前只有我们的桌面应用程序支持此操作", "EXPORT": "导出数据", "SUBSCRIPTION": "订阅", "SUBSCRIBE": "订阅", From 74b3b00ea56e44b4c772cd2d6d3a048e35b0e69a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 13:24:37 +0530 Subject: [PATCH 1172/1179] Reorder and rename --- web/apps/photos/src/components/Sidebar/index.tsx | 2 +- web/packages/base/locales/ar-SA/translation.json | 2 +- web/packages/base/locales/bg-BG/translation.json | 2 +- web/packages/base/locales/ca-ES/translation.json | 2 +- web/packages/base/locales/de-DE/translation.json | 2 +- web/packages/base/locales/el-GR/translation.json | 2 +- web/packages/base/locales/en-US/translation.json | 2 +- web/packages/base/locales/es-ES/translation.json | 2 +- web/packages/base/locales/et-EE/translation.json | 2 +- web/packages/base/locales/fa-IR/translation.json | 2 +- web/packages/base/locales/fi-FI/translation.json | 2 +- web/packages/base/locales/fr-FR/translation.json | 2 +- web/packages/base/locales/gu-IN/translation.json | 2 +- web/packages/base/locales/hi-IN/translation.json | 2 +- web/packages/base/locales/id-ID/translation.json | 2 +- web/packages/base/locales/is-IS/translation.json | 2 +- web/packages/base/locales/it-IT/translation.json | 2 +- web/packages/base/locales/ja-JP/translation.json | 2 +- web/packages/base/locales/km-KH/translation.json | 2 +- web/packages/base/locales/ko-KR/translation.json | 2 +- web/packages/base/locales/nl-NL/translation.json | 2 +- web/packages/base/locales/pl-PL/translation.json | 2 +- web/packages/base/locales/pt-BR/translation.json | 2 +- web/packages/base/locales/pt-PT/translation.json | 2 +- web/packages/base/locales/ru-RU/translation.json | 2 +- web/packages/base/locales/sv-SE/translation.json | 2 +- web/packages/base/locales/ta-IN/translation.json | 2 +- web/packages/base/locales/te-IN/translation.json | 2 +- web/packages/base/locales/th-TH/translation.json | 2 +- web/packages/base/locales/ti-ER/translation.json | 2 +- web/packages/base/locales/tr-TR/translation.json | 2 +- web/packages/base/locales/zh-CN/translation.json | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/web/apps/photos/src/components/Sidebar/index.tsx b/web/apps/photos/src/components/Sidebar/index.tsx index 88bfdbf75b..8827dd22e9 100644 --- a/web/apps/photos/src/components/Sidebar/index.tsx +++ b/web/apps/photos/src/components/Sidebar/index.tsx @@ -710,7 +710,7 @@ const DebugSection: React.FC = () => { {appVersion && ( diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index b0a3e74d69..cf87d932aa 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index f5420082b2..5fbbdf1ef4 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index e261dbb096..7aa6b16181 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Sind Sie sicher, dass Sie die Passwort-Sperre deaktivieren möchten?", "PASSWORD_LOCK": "Passwort Sperre", "LOCK": "Sperren", - "DOWNLOAD_UPLOAD_LOGS": "Debug-Logs", "file": "Datei", "folder": "Ordner", "google_takeout": "Google Takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Ja, Stopp", "CHANGE_FOLDER": "Ordner ändern", "FAMILY_PLAN": "Familientarif", + "debug_logs": "Debug-Logs", "DOWNLOAD_LOGS": "Logs herunterladen", "DOWNLOAD_LOGS_MESSAGE": "

Hier kannst du Debug-Logs herunterladen, die du uns zur Fehleranalyse zusenden kannst.

Beachte bitte, dass die Logs Dateinamen enthalten, um Probleme mit bestimmten Dateien nachvollziehen zu können.

", "WEAK_DEVICE": "Dein Browser ist nicht leistungsstark genug, um deine Bilder zu verschlüsseln. Versuche, dich an einem Computer bei Ente anzumelden, oder lade dir die Ente-App für dein Gerät (Handy oder Desktop) herunter.", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index f73f5da0f1..afadb8f1e8 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Είστε σίγουροι ότι θέλετε να απενεργοποιήσετε το κλείδωμα κωδικού πρόσβασης;", "PASSWORD_LOCK": "Κλείδωμα κωδικού πρόσβασης", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "Αρχείο", "folder": "Φάκελος", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 29b85530f3..e6a4be1012 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Are you sure that you want to disable the password lock?", "PASSWORD_LOCK": "Password lock", "LOCK": "Lock", - "DOWNLOAD_UPLOAD_LOGS": "Debug logs", "file": "File", "folder": "Folder", "google_takeout": "Google takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Yes, stop", "CHANGE_FOLDER": "Change Folder", "FAMILY_PLAN": "Family plan", + "debug_logs": "Debug logs", "DOWNLOAD_LOGS": "Download logs", "DOWNLOAD_LOGS_MESSAGE": "

This will download debug logs, which you can email to us to help debug your issue.

Please note that file names will be included to help track issues with specific files.

", "WEAK_DEVICE": "The web browser you're using is not powerful enough to encrypt your photos. Please try to log in to Ente on your computer, or download the Ente mobile/desktop app.", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index d40b017856..880d81dc71 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Seguro que quieres cambiar la contrasena?", "PASSWORD_LOCK": "Contraseña bloqueada", "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuración", "file": "Archivo", "folder": "Carpeta", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "Sí, detener", "CHANGE_FOLDER": "Cambiar carpeta", "FAMILY_PLAN": "Plan familiar", + "debug_logs": "Logs de depuración", "DOWNLOAD_LOGS": "Descargar logs", "DOWNLOAD_LOGS_MESSAGE": "

Esto descargará los registros de depuración, que puede enviarnos por correo electrónico para ayudarnos a depurar su problema.

Tenga en cuenta que los nombres de los archivos se incluirán para ayudar al seguimiento de problemas con archivos específicos.

", "WEAK_DEVICE": "El navegador web que está utilizando no es lo suficientemente poderoso para cifrar sus fotos. Por favor, intente iniciar sesión en ente en su computadora, o descargue la aplicación ente para móvil/escritorio.", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 019498ed9b..d95eb2cf81 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index 541768f994..630baad6dc 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 43b78dddb4..f66dc037d9 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Êtes-vous certains de vouloir désactiver le verrouillage par mot de passe ?", "PASSWORD_LOCK": "Mot de passe verrou", "LOCK": "Verrouiller", - "DOWNLOAD_UPLOAD_LOGS": "Journaux de débugs", "file": "Fichier", "folder": "Dossier", "google_takeout": "Google Takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Oui, arrêter", "CHANGE_FOLDER": "Modifier le dossier", "FAMILY_PLAN": "Plan famille", + "debug_logs": "Journaux de débugs", "DOWNLOAD_LOGS": "Télécharger les logs", "DOWNLOAD_LOGS_MESSAGE": "

Cela va télécharger les journaux de débug, que vous pourrez nosu envoyer par e-mail pour nous aider à résoudre votre problàme .

Veuillez noter que les noms de fichiers seront inclus .

", "WEAK_DEVICE": "Le navigateur que vous utilisez n'est pas assez puissant pour chiffrer vos photos. Veuillez essayer de vous connecter à Ente sur votre ordinateur, ou télécharger l'appli Ente mobile/ordinateur.", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index aedb9049f5..f9a848f285 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "Kunci dengan sandi", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "Log debug", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "Ubah Folder", "FAMILY_PLAN": "Paket keluarga", + "debug_logs": "Log debug", "DOWNLOAD_LOGS": "Unduh log", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "Browser yang saat ini kamu gunakan tidak cukup kuat untuk mengenkripsi fotomu. Silakan coba gunakan Ente di komputer lain, atau unduh app seluler/desktop Ente.", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 0a352d3a5d..384a8f4a65 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index c1110f3451..496fcbbecf 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "Cartella", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "Cambia Cartella", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index d6a15fbc22..5226b40c7f 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index 83b3e83ace..9d0bc35214 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Weet u zeker dat u de cijfercode vergrendeling wilt uitschakelen?", "PASSWORD_LOCK": "Cijfercode vergrendeling", "LOCK": "Vergrendeling", - "DOWNLOAD_UPLOAD_LOGS": "Logboeken voor foutmeldingen", "file": "Bestand", "folder": "Map", "google_takeout": "Google takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Ja, stop", "CHANGE_FOLDER": "Map wijzigen", "FAMILY_PLAN": "Familie abonnement", + "debug_logs": "Logboeken voor foutmeldingen", "DOWNLOAD_LOGS": "Logboek downloaden", "DOWNLOAD_LOGS_MESSAGE": "

Dit zal logboeken downloaden, die u ons kunt e-mailen om te helpen bij het debuggen van uw probleem.

Houd er rekening mee dat bestandsnamen worden opgenomen om problemen met specifieke bestanden bij te houden.

", "WEAK_DEVICE": "De webbrowser die u gebruikt is niet krachtig genoeg om uw foto's te versleutelen. Probeer in te loggen op uw computer, of download de Ente mobiel/desktop app.", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index 79046d45ac..d33cce532c 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Czy na pewno chcesz wyłączyć blokadę hasłem?", "PASSWORD_LOCK": "Blokada hasłem", "LOCK": "Zablokuj", - "DOWNLOAD_UPLOAD_LOGS": "Logi debugowania", "file": "Plik", "folder": "Folder", "google_takeout": "Google Takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Tak, zatrzymaj", "CHANGE_FOLDER": "Zmień Folder", "FAMILY_PLAN": "Plan rodzinny", + "debug_logs": "Logi debugowania", "DOWNLOAD_LOGS": "Pobierz logi", "DOWNLOAD_LOGS_MESSAGE": "

Spowoduje to pobranie logów debugowania, które możesz wysłać do nas na e-maila, aby pomóc w debugowaniu Twojego problemu.

Należy pamiętać, że nazwy plików będą dołączone, aby pomóc w śledzeniu problemów z konkretnymi plikami.

", "WEAK_DEVICE": "Przeglądarka, której używasz nie jest wystarczająco silna, aby zaszyfrować Twoje zdjęcia. Prosimy zalogować się do Ente na Twoim komputerze lub pobierz aplikacje mobilną/komputerową Ente.", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 46407acf5d..1404dddb9e 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Tem certeza que deseja desativar o bloqueio por senha?", "PASSWORD_LOCK": "Bloqueio de senha", "LOCK": "Bloquear", - "DOWNLOAD_UPLOAD_LOGS": "Logs de depuração", "file": "Arquivo", "folder": "Pasta", "google_takeout": "Google Takeout", @@ -452,6 +451,7 @@ "YES_STOP": "Sim, parar", "CHANGE_FOLDER": "Alterar pasta", "FAMILY_PLAN": "Plano familiar", + "debug_logs": "Logs de depuração", "DOWNLOAD_LOGS": "Baixar logs", "DOWNLOAD_LOGS_MESSAGE": "

Isto irá baixar os logs de depuração, que você pode enviar para nós para ajudar a depurar seu problema.

Por favor, note que os nomes de arquivos serão incluídos para ajudar a rastrear problemas com arquivos específicos.

", "WEAK_DEVICE": "O navegador da web que você está usando não é poderoso o suficiente para criptografar suas fotos. Por favor, tente entrar para o ente no computador ou baixe o aplicativo móvel.", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 4fccbee595..060965a8c2 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index d6bf959427..b77ba1f97e 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "Вы уверены, что хотите отключить блокировку паролем?", "PASSWORD_LOCK": "Блокировка паролем", "LOCK": "Замок", - "DOWNLOAD_UPLOAD_LOGS": "Журналы отладки", "file": "Файл", "folder": "Папка", "google_takeout": "Еда на вынос из Google", @@ -452,6 +451,7 @@ "YES_STOP": "Да, остановись", "CHANGE_FOLDER": "Изменить папку", "FAMILY_PLAN": "Семейный план", + "debug_logs": "Журналы отладки", "DOWNLOAD_LOGS": "Загрузка журналов", "DOWNLOAD_LOGS_MESSAGE": "

При этом будут загружены журналы отладки, которые вы можете отправить нам по электронной почте, чтобы помочь в устранении вашей проблемы.

Пожалуйста, обратите внимание, что будут указаны имена файлов, которые помогут отслеживать проблемы с конкретными файлами.

", "WEAK_DEVICE": "Используемый вами веб-браузер недостаточно мощный, чтобы зашифровать ваши фотографии. Пожалуйста, попробуйте войти в Ente на своем компьютере или загрузить мобильное/настольное приложение Ente.", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index f24f0071ed..f3182259db 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "Lösenordslås", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "Fil", "folder": "Mapp", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index 2d2fca8372..2cd07bab1c 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index f85bef11d1..dc4d3162a0 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "", "PASSWORD_LOCK": "", "LOCK": "", - "DOWNLOAD_UPLOAD_LOGS": "", "file": "", "folder": "", "google_takeout": "", @@ -452,6 +451,7 @@ "YES_STOP": "", "CHANGE_FOLDER": "", "FAMILY_PLAN": "", + "debug_logs": "", "DOWNLOAD_LOGS": "", "DOWNLOAD_LOGS_MESSAGE": "", "WEAK_DEVICE": "", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index fdb4f5d854..234d874d79 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -406,7 +406,6 @@ "DISABLE_PASSWORD_MESSAGE": "您确定要禁用密码锁吗?", "PASSWORD_LOCK": "密码锁", "LOCK": "锁定", - "DOWNLOAD_UPLOAD_LOGS": "调试日志", "file": "文件", "folder": "文件夹", "google_takeout": "Google takeout", @@ -452,6 +451,7 @@ "YES_STOP": "是的,停止", "CHANGE_FOLDER": "更改文件夹", "FAMILY_PLAN": "家庭计划", + "debug_logs": "调试日志", "DOWNLOAD_LOGS": "下载日志", "DOWNLOAD_LOGS_MESSAGE": "

这将下载调试日志,您可以发送电子邮件给我们来帮助调试您的问题。

请注意文件名将被包含,以帮助跟踪特定文件中的问题。

", "WEAK_DEVICE": "您使用的网络浏览器功能不够强大,无法加密您的照片。 请尝试在电脑上登录Ente,或下载Ente移动/桌面应用程序。", From e70bf6a379686efc52217161bae04569b4bf06fe Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:21:53 +0530 Subject: [PATCH 1173/1179] [cli] Add check for deviceKey size --- cli/pkg/secrets/key_holder.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cli/pkg/secrets/key_holder.go b/cli/pkg/secrets/key_holder.go index 37133606b7..f399b41367 100644 --- a/cli/pkg/secrets/key_holder.go +++ b/cli/pkg/secrets/key_holder.go @@ -18,6 +18,9 @@ type KeyHolder struct { } func NewKeyHolder(deviceKey []byte) *KeyHolder { + if len(deviceKey) != 32 { + panic(fmt.Sprintf("device key must be 32 bytes, found: %d bytes", len(deviceKey))) + } return &KeyHolder{ AccountSecrets: make(map[string]*model.AccSecretInfo), CollectionKeys: make(map[string][]byte), From 9e068bdc90bec8a8d53505bdd98e721c38a61f6b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:46:35 +0530 Subject: [PATCH 1174/1179] [cli] Base64 encode CLI secrets --- cli/pkg/secrets/secret.go | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/cli/pkg/secrets/secret.go b/cli/pkg/secrets/secret.go index 82df5c7ea1..155c114d57 100644 --- a/cli/pkg/secrets/secret.go +++ b/cli/pkg/secrets/secret.go @@ -2,6 +2,7 @@ package secrets import ( "crypto/rand" + "encoding/base64" "errors" "fmt" "github.com/ente-io/cli/utils/constants" @@ -44,14 +45,34 @@ func GetOrCreateClISecret() []byte { if err != nil { log.Fatal(fmt.Errorf("error generating key: %w", err)) } - secret = string(key) - keySetErr := keyring.Set(secretService, secretUser, string(secret)) + // Store the key as a base64 encoded string + secret = base64.StdEncoding.EncodeToString(key) + keySetErr := keyring.Set(secretService, secretUser, secret) if keySetErr != nil { log.Fatal(fmt.Errorf("error setting password in keyring: %w", keySetErr)) } - } - return []byte(secret) + // Try to decode the secret as base64 + decodedSecret, err := base64.StdEncoding.DecodeString(secret) + if err == nil && len(decodedSecret) == 32 { + // If successful and the length is correct, return the decoded secret + return decodedSecret + } + // If decoding fails or the length is incorrect, treat it as a legacy key + legacySecret := []byte(secret) + if len(legacySecret) != 32 { + // See https://github.com/ente-io/ente/issues/1510#issuecomment-2331676096 for more information + log.Println("Warning: Existing key is not 32 bytes. Deleting it") + delErr := keyring.Delete(secretService, secretUser) + if delErr != nil { + log.Fatal(fmt.Errorf("error deleting legacy key: %w", delErr)) + } else { + log.Println("Warning: Trying to create a new key") + return GetOrCreateClISecret() + } + } + // If it's a 32-byte legacy key, return it as-is + return legacySecret } // GetSecretFromSecretText reads the scecret from the secret text file. From 821edd00f70acaab3a258eb3774e7753933ffbe2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:16:36 +0530 Subject: [PATCH 1175/1179] [cli] Check for secret key length while reading from file --- cli/pkg/secrets/secret.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cli/pkg/secrets/secret.go b/cli/pkg/secrets/secret.go index 155c114d57..003755ca76 100644 --- a/cli/pkg/secrets/secret.go +++ b/cli/pkg/secrets/secret.go @@ -22,6 +22,7 @@ func IsRunningInContainer() bool { const ( secretService = "ente" secretUser = "ente-cli-user" + keyLength = 32 ) func GetOrCreateClISecret() []byte { @@ -30,7 +31,6 @@ func GetOrCreateClISecret() []byte { if err != nil { if !errors.Is(err, keyring.ErrNotFound) { - if secretsFile := os.Getenv("ENTE_CLI_SECRETS_PATH"); secretsFile != "" { return GetSecretFromSecretText(secretsFile) } @@ -40,7 +40,7 @@ func GetOrCreateClISecret() []byte { log.Fatal(fmt.Errorf("error getting password from keyring: %w", err)) } } - key := make([]byte, 32) + key := make([]byte, keyLength) _, err = rand.Read(key) if err != nil { log.Fatal(fmt.Errorf("error generating key: %w", err)) @@ -54,13 +54,13 @@ func GetOrCreateClISecret() []byte { } // Try to decode the secret as base64 decodedSecret, err := base64.StdEncoding.DecodeString(secret) - if err == nil && len(decodedSecret) == 32 { + if err == nil && len(decodedSecret) == keyLength { // If successful and the length is correct, return the decoded secret return decodedSecret } // If decoding fails or the length is incorrect, treat it as a legacy key legacySecret := []byte(secret) - if len(legacySecret) != 32 { + if len(legacySecret) != keyLength { // See https://github.com/ente-io/ente/issues/1510#issuecomment-2331676096 for more information log.Println("Warning: Existing key is not 32 bytes. Deleting it") delErr := keyring.Delete(secretService, secretUser) @@ -71,12 +71,12 @@ func GetOrCreateClISecret() []byte { return GetOrCreateClISecret() } } - // If it's a 32-byte legacy key, return it as-is + // If it's a keyLength-byte legacy key, return it as-is return legacySecret } // GetSecretFromSecretText reads the scecret from the secret text file. -// If the file does not exist, it will be created and write random 32 byte secret to it. +// If the file does not exist, it will be created and write random keyLength bytes secret to it. func GetSecretFromSecretText(secretFilePath string) []byte { // Check if file exists @@ -86,7 +86,7 @@ func GetSecretFromSecretText(secretFilePath string) []byte { log.Fatal(fmt.Errorf("error checking secret file: %w", err)) } // File does not exist; create and write a random 32-byte secret - key := make([]byte, 32) + key := make([]byte, keyLength) _, err := rand.Read(key) if err != nil { log.Fatal(fmt.Errorf("error generating key: %w", err)) @@ -102,5 +102,8 @@ func GetSecretFromSecretText(secretFilePath string) []byte { if err != nil { log.Fatal(fmt.Errorf("error reading from secret file: %w", err)) } + if len(secret) != keyLength { + log.Fatal(fmt.Errorf("error reading from secret file: expected %d bytes, got %d", keyLength, len(secret))) + } return secret } From dd4dca44738885a3b41c9d52939f48005e646fb6 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 10 Sep 2024 14:24:21 +0530 Subject: [PATCH 1176/1179] [docs] Remove fixed ffmpeg workaround 1.7.4 has been released a week ago with this fixed --- .../docs/photos/troubleshooting/thumbnails.md | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/docs/docs/photos/troubleshooting/thumbnails.md b/docs/docs/photos/troubleshooting/thumbnails.md index b4627f648b..8c05d4522b 100644 --- a/docs/docs/photos/troubleshooting/thumbnails.md +++ b/docs/docs/photos/troubleshooting/thumbnails.md @@ -20,40 +20,6 @@ that setting works. Similar issues may arise if you are using an extension that blocks access to the canvas. -## Desktop - -> [!NOTE] -> -> This issue has been fixed in the latest beta releases, and the fix will be -> also out in the next release, 1.7.4. - -The only known case where thumbnails might be missing on desktop is when -uploading **videos** during a Google Takeout or watched folder sync on **Intel -macOS** machines. This is because the bundled ffmpeg that we use does not work -on Intel machines. - -For images, we are able to fallback to other mechanisms for generating the -thumbnails, but for videos because of their potentially huge size, the app -doesn't try the fallback to avoid running out of memory. - -In such cases, you will need to use the following workaround: - -1. Obtain a copy of `ffmpeg` binary that works on your Intel macOS. For - example, you can install it via `brew`. If you already have `ffmpeg` - installed you can copying it from `/usr/local/bin` (or whereever it was - installed). - -2. Copy or symlink it to - `/Applications/ente.app/Contents/Resources/app.asar.unpacked/node_modules/ffmpeg-static/ffmpeg`. - -Alternatively, you can drag and drop the videos. Even without the above -workaround, thumbnail generation during video uploads via the normal folder -selection or drag and drop will work fine, since in those case we have access to -the video's data directly without reading it from a zip and can thus use the -fallback. - -## Regenerating thumbnails - There is currently no functionality to regenerate thumbnails in the above cases. You will need to upload the affected files again. From acdd38743cbf922104c43e7331662792d2249ed0 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 14:54:00 +0530 Subject: [PATCH 1177/1179] [mob][photos] Kill app so that the app starts afresh after logging out from the lockscreen --- auth/lib/ui/tools/lock_screen.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/auth/lib/ui/tools/lock_screen.dart b/auth/lib/ui/tools/lock_screen.dart index 3fcb76a38a..b66472f5af 100644 --- a/auth/lib/ui/tools/lock_screen.dart +++ b/auth/lib/ui/tools/lock_screen.dart @@ -1,15 +1,14 @@ +import 'dart:io'; import 'dart:math'; import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/l10n/l10n.dart'; -import 'package:ente_auth/onboarding/view/onboarding_page.dart'; import 'package:ente_auth/services/user_service.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/tools/app_lock.dart'; import 'package:ente_auth/utils/auth_util.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/lock_screen_settings.dart'; -import 'package:ente_auth/utils/navigation_util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_animate/flutter_animate.dart'; @@ -195,10 +194,7 @@ class _LockScreenState extends State with WidgetsBindingObserver { isCritical: true, firstButtonOnTap: () async { await UserService.instance.logout(context); - await routeToPage( - context, - const OnboardingPage(), - ); + Process.killPid(pid, ProcessSignal.sigkill); }, ); } From b2e9b242ad3e4aef03960927d03aa006764481b6 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 15:00:55 +0530 Subject: [PATCH 1178/1179] [mob][photos] Add comment --- auth/lib/ui/tools/lock_screen.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/auth/lib/ui/tools/lock_screen.dart b/auth/lib/ui/tools/lock_screen.dart index b66472f5af..3793230798 100644 --- a/auth/lib/ui/tools/lock_screen.dart +++ b/auth/lib/ui/tools/lock_screen.dart @@ -194,6 +194,7 @@ class _LockScreenState extends State with WidgetsBindingObserver { isCritical: true, firstButtonOnTap: () async { await UserService.instance.logout(context); + // To start the app afresh, resetting all state. Process.killPid(pid, ProcessSignal.sigkill); }, ); From 4a21d0bfacf8262355395742a990ec65c155fc57 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 10 Sep 2024 15:04:58 +0530 Subject: [PATCH 1179/1179] [mob][photos] Fix build failing --- mobile/lib/l10n/intl_ja.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index e51d3afd49..051a829a86 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -433,7 +433,7 @@ "selectAll": "全て選択", "skip": "スキップ", "updatingFolderSelection": "フォルダの選択をアップデート中", - "itemCount": "{count, plural, one{{{count} アイテム} other {{count} アイテム}}", + "itemCount": "{count, plural, one{{count} アイテム} other {{count} アイテム}}", "deleteItemCount": "{count, plural,=1 {{count} 個の項目を削除} other {{count} 個の項目を削除}}", "duplicateItemsGroup": "{count} 個のファイル、それぞれ{formattedSize}", "@duplicateItemsGroup": {